a
     `)                     @   sR  d dl mZmZmZ d dlZzd dlmZ W n eyJ   d dlmZ Y n0 d dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZ e	ejG dd	 d	eZe	ejG d
d deZe	ejG dd deZeZd%ddZdd Zdd Zdd Zdd Zdd Zdd Z dd Z!dZ"dd  Z#G d!d" d"eZ$G d#d$ d$eZ%dS )&    )absolute_importdivisionprint_functionN)gcd)utils)UnsupportedAlgorithm_Reasons)_get_backend)
RSABackendc                   @   sR   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
dS )RSAPrivateKeyc                 C   s   dS )zN
        Returns an AsymmetricSignatureContext used for signing data.
        N )selfpadding	algorithmr   r   O/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/asymmetric/rsa.pysigner   s    zRSAPrivateKey.signerc                 C   s   dS )z3
        Decrypts the provided ciphertext.
        Nr   )r   Z
ciphertextr   r   r   r   decrypt   s    zRSAPrivateKey.decryptc                 C   s   dS z7
        The bit length of the public modulus.
        Nr   r   r   r   r   key_size%   s    zRSAPrivateKey.key_sizec                 C   s   dS )zD
        The RSAPublicKey associated with this private key.
        Nr   r   r   r   r   
public_key+   s    zRSAPrivateKey.public_keyc                 C   s   dS )z!
        Signs the data.
        Nr   )r   datar   r   r   r   r   sign1   s    zRSAPrivateKey.signN)__name__
__module____qualname__abcabstractmethodr   r   abstractpropertyr   r   r   r   r   r   r   r      s   



r   c                   @   s(   e Zd Zejdd Zejdd ZdS )RSAPrivateKeyWithSerializationc                 C   s   dS )z/
        Returns an RSAPrivateNumbers.
        Nr   r   r   r   r   private_numbers:   s    z.RSAPrivateKeyWithSerialization.private_numbersc                 C   s   dS z6
        Returns the key serialized as bytes.
        Nr   )r   encodingformatZencryption_algorithmr   r   r   private_bytes@   s    z,RSAPrivateKeyWithSerialization.private_bytesN)r   r   r   r   r   r    r$   r   r   r   r   r   8   s   
r   c                   @   sn   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
ejdd Zejdd ZdS )RSAPublicKeyc                 C   s   dS )zY
        Returns an AsymmetricVerificationContext used for verifying signatures.
        Nr   r   	signaturer   r   r   r   r   verifierI   s    zRSAPublicKey.verifierc                 C   s   dS )z/
        Encrypts the given plaintext.
        Nr   )r   Z	plaintextr   r   r   r   encryptO   s    zRSAPublicKey.encryptc                 C   s   dS r   r   r   r   r   r   r   U   s    zRSAPublicKey.key_sizec                 C   s   dS )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   public_numbers[   s    zRSAPublicKey.public_numbersc                 C   s   dS r!   r   )r   r"   r#   r   r   r   public_bytesa   s    zRSAPublicKey.public_bytesc                 C   s   dS )z5
        Verifies the signature of the data.
        Nr   )r   r'   r   r   r   r   r   r   verifyg   s    zRSAPublicKey.verifyc                 C   s   dS )z@
        Recovers the original data from the signature.
        Nr   r&   r   r   r   recover_data_from_signaturem   s    z(RSAPublicKey.recover_data_from_signatureN)r   r   r   r   r   r(   r)   r   r   r*   r+   r,   r-   r   r   r   r   r%   G   s   





r%   c                 C   s4   t |}t|tstdtjt| | || |S )Nz-Backend object does not implement RSABackend.)r	   
isinstancer
   r   r   ZBACKEND_MISSING_INTERFACE_verify_rsa_parametersZgenerate_rsa_private_key)public_exponentr   backendr   r   r   generate_private_keyw   s    

r2   c                 C   s$   | dvrt d|dk r t dd S )N)   i  zopublic_exponent must be either 3 (for legacy compatibility) or 65537. Almost everyone should choose 65537 here!i   z#key_size must be at least 512-bits.
ValueError)r0   r   r   r   r   r/      s    r/   c                 C   s   |dk rt d| |kr t d||kr0t d||kr@t d||krPt d||kr`t d||krpt d|dk s||krt d	|d
@ dkrt d|d
@ dkrt d|d
@ dkrt d| | |krt dd S )Nr3   zmodulus must be >= 3.zp must be < modulus.zq must be < modulus.zdmp1 must be < modulus.zdmq1 must be < modulus.ziqmp must be < modulus.z#private_exponent must be < modulus.z+public_exponent must be >= 3 and < modulus.   r   zpublic_exponent must be odd.zdmp1 must be odd.zdmq1 must be odd.zp*q must equal modulus.r4   )pqprivate_exponentdmp1dmq1iqmpr0   modulusr   r   r   _check_private_key_components   s0    r>   c                 C   s@   |dk rt d| dk s | |kr(t d| d@ dkr<t dd S )Nr3   zn must be >= 3.ze must be >= 3 and < n.r6   r   ze must be odd.r4   )enr   r   r   _check_public_key_components   s    rA   c           	      C   sR   d\}}| | }}|dkrJt ||\}}|||  }||||f\}}}}q|| S )zO
    Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
    )r6   r   r   )divmod)	r?   mZx1Zx2abr8   rZxnr   r   r   _modinv   s    
rG   c                 C   s
   t || S )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    )rG   )r7   r8   r   r   r   rsa_crt_iqmp   s    rH   c                 C   s   | |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    r6   r   )r9   r7   r   r   r   rsa_crt_dmp1   s    rI   c                 C   s   | |d  S )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    r6   r   )r9   r8   r   r   r   rsa_crt_dmq1   s    rJ   i  c                 C   s   || d }|}|d dkr&|d }qd}d}|s|t k r|}||k rt||| }|dkr|| d krt|d| dkrt|d | }	d}q|d9 }q>|d7 }q.|stdt| |	\}
}|dksJ t|	|
fdd\}	}
|	|
fS )z
    Compute factors p and q from the private exponent d. We assume that n has
    no more than two factors. This function is adapted from code in PyCrypto.
    r6      r   FTz2Unable to compute factors p and q from exponent d.)reverse)_MAX_RECOVERY_ATTEMPTSpowr   r5   rB   sorted)r@   r?   dZktottZspottedrD   kZcandr7   r8   rF   r   r   r   rsa_recover_prime_factors   s,    
$

rS   c                   @   s|   e Zd Zdd ZedZedZedZedZ	edZ
edZed	ZdddZdd Zdd Zdd Zd
S )RSAPrivateNumbersc                 C   s   t |tjrHt |tjrHt |tjrHt |tjrHt |tjrHt |tjsPtdt |tsbtd|| _|| _|| _|| _|| _	|| _
|| _d S )NzNRSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must all be an integers.zFRSAPrivateNumbers public_numbers must be an RSAPublicNumbers instance.)r.   sixinteger_types	TypeErrorRSAPublicNumbers_p_q_d_dmp1_dmq1_iqmp_public_numbers)r   r7   r8   rP   r:   r;   r<   r*   r   r   r   __init__  s4    






zRSAPrivateNumbers.__init__rY   rZ   r[   r\   r]   r^   r_   Nc                 C   s   t |}|| S N)r	   Zload_rsa_private_numbersr   r1   r   r   r   private_key;  s    zRSAPrivateNumbers.private_keyc                 C   sb   t |tstS | j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j	|j	kS ra   )
r.   rT   NotImplementedr7   r8   rP   r:   r;   r<   r*   r   otherr   r   r   __eq__?  s    






zRSAPrivateNumbers.__eq__c                 C   s
   | |k S ra   r   re   r   r   r   __ne__M  s    zRSAPrivateNumbers.__ne__c                 C   s$   t | j| j| j| j| j| j| jfS ra   )hashr7   r8   rP   r:   r;   r<   r*   r   r   r   r   __hash__P  s    zRSAPrivateNumbers.__hash__)N)r   r   r   r`   r   read_only_propertyr7   r8   rP   r:   r;   r<   r*   rc   rg   rh   rj   r   r   r   r   rT     s   







rT   c                   @   sR   e Zd Zdd ZedZedZdddZdd	 Z	d
d Z
dd Zdd ZdS )rX   c                 C   s0   t |tjrt |tjs td|| _|| _d S )Nz,RSAPublicNumbers arguments must be integers.)r.   rU   rV   rW   _e_n)r   r?   r@   r   r   r   r`   _  s    zRSAPublicNumbers.__init__rl   rm   Nc                 C   s   t |}|| S ra   )r	   Zload_rsa_public_numbersrb   r   r   r   r   k  s    zRSAPublicNumbers.public_keyc                 C   s
   d | S )Nz$<RSAPublicNumbers(e={0.e}, n={0.n})>)r#   r   r   r   r   __repr__o  s    zRSAPublicNumbers.__repr__c                 C   s&   t |tstS | j|jko$| j|jkS ra   )r.   rX   rd   r?   r@   re   r   r   r   rg   r  s    
zRSAPublicNumbers.__eq__c                 C   s
   | |k S ra   r   re   r   r   r   rh   x  s    zRSAPublicNumbers.__ne__c                 C   s   t | j| jfS ra   )ri   r?   r@   r   r   r   r   rj   {  s    zRSAPublicNumbers.__hash__)N)r   r   r   r`   r   rk   r?   r@   r   rn   rg   rh   rj   r   r   r   r   rX   ^  s   	


rX   )N)&Z
__future__r   r   r   r   Zmathr   ImportErrorZ	fractionsrU   Zcryptographyr   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr	   Z'cryptography.hazmat.backends.interfacesr
   Zadd_metaclassABCMetaobjectr   r   r%   ZRSAPublicKeyWithSerializationr2   r/   r>   rA   rG   rH   rI   rJ   rM   rS   rT   rX   r   r   r   r   <module>   s:   
 

,
(+H