3 l�_�(� @sTddlmZmZmZddlZyddlmZWn ek rLddlmZYnXddl Z ddl m Z ddl m Z mZddlmZddlmZe jej�Gdd �d e��Ze jej�Gd d �d e��Ze jej�Gd d �d e��ZeZd%dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Z dd�Z!dZ"dd �Z#Gd!d"�d"e�Z$Gd#d$�d$e�Z%dS)&�)�absolute_import�division�print_functionN)�gcd)�utils)�UnsupportedAlgorithm�_Reasons)� _get_backend)� RSABackendc@sReZdZejdd��Zejdd��Zejdd��Zejdd��Z ejd d ��Z d S) � RSAPrivateKeycCsdS)zN Returns an AsymmetricSignatureContext used for signing data. N�)�self�padding� algorithmr r �/usr/lib64/python3.6/rsa.py�signerszRSAPrivateKey.signercCsdS)z3 Decrypts the provided ciphertext. Nr )r Z ciphertextrr r r�decryptszRSAPrivateKey.decryptcCsdS)z7 The bit length of the public modulus. Nr )r r r r�key_size%szRSAPrivateKey.key_sizecCsdS)zD The RSAPublicKey associated with this private key. Nr )r r r r� public_key+szRSAPrivateKey.public_keycCsdS)z! Signs the data. Nr )r �datarrr r r�sign1szRSAPrivateKey.signN) �__name__� __module__� __qualname__�abc�abstractmethodrr�abstractpropertyrrrr r r rr s r c@s(eZdZejdd��Zejdd��ZdS)�RSAPrivateKeyWithSerializationcCsdS)z/ Returns an RSAPrivateNumbers. Nr )r r r r�private_numbers:sz.RSAPrivateKeyWithSerialization.private_numberscCsdS)z6 Returns the key serialized as bytes. Nr )r �encoding�formatZencryption_algorithmr r r� private_bytes@sz,RSAPrivateKeyWithSerialization.private_bytesN)rrrrrrr!r r r rr8src@s`eZdZejdd��Zejdd��Zejdd��Zejdd��Z ejd d ��Z ejd d ��Z d S)� RSAPublicKeycCsdS)zY Returns an AsymmetricVerificationContext used for verifying signatures. Nr )r � signaturerrr r r�verifierIszRSAPublicKey.verifiercCsdS)z/ Encrypts the given plaintext. Nr )r Z plaintextrr r r�encryptOszRSAPublicKey.encryptcCsdS)z7 The bit length of the public modulus. Nr )r r r rrUszRSAPublicKey.key_sizecCsdS)z- Returns an RSAPublicNumbers Nr )r r r r�public_numbers[szRSAPublicKey.public_numberscCsdS)z6 Returns the key serialized as bytes. Nr )r rr r r r� public_bytesaszRSAPublicKey.public_bytescCsdS)z5 Verifies the signature of the data. Nr )r r#rrrr r r�verifygszRSAPublicKey.verifyN) rrrrrr$r%rrr&r'r(r r r rr"Gs r"cCs4t|�}t|t�stdtj��t||�|j||�S)Nz-Backend object does not implement RSABackend.)r � isinstancer rrZBACKEND_MISSING_INTERFACE�_verify_rsa_parametersZgenerate_rsa_private_key)�public_exponentr�backendr r r�generate_private_keyqs  r-cCs$|dkrtd��|dkr td��dS)N��zopublic_exponent must be either 3 (for legacy compatibility) or 65537. Almost everyone should choose 65537 here!iz#key_size must be at least 512-bits.)r.r/)� ValueError)r+rr r rr*}s r*cCs�|dkrtd��||kr td��||kr0td��||kr@td��||krPtd��||kr`td��||krptd��|dks�||kr�td ��|d @d kr�td ��|d @d kr�td ��|d @d kr�td��|||kr�td��dS)Nr.zmodulus must be >= 3.zp must be < modulus.zq must be < modulus.zdmp1 must be < modulus.zdmq1 must be < modulus.ziqmp must be < modulus.z#private_exponent must be < modulus.z+public_exponent must be >= 3 and < modulus.�rzpublic_exponent must be odd.zdmp1 must be odd.zdmq1 must be odd.zp*q must equal modulus.)r0)�p�q�private_exponent�dmp1�dmq1�iqmpr+�modulusr r r�_check_private_key_components�s0    r9cCs@|dkrtd��|dks ||kr(td��|d@dkr= 3.ze must be >= 3 and < n.r1rze must be odd.)r0)�e�nr r r�_check_public_key_components�s  r<c CsVd\}}||}}x:|dkrLt||�\}}|||}||||f\}}}}qW||S)zO Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1 r1r)r1r)�divmod) r:�mZx1Zx2�a�br3�rZxnr r r�_modinv�s   rBcCs t||�S)zF Compute the CRT (q ** -1) % p value from RSA primes p and q. )rB)r2r3r r r� rsa_crt_iqmp�srCcCs ||dS)zg Compute the CRT private_exponent % (p - 1) value from the RSA private_exponent (d) and p. r1r )r4r2r r r� rsa_crt_dmp1�srDcCs ||dS)zg Compute the CRT private_exponent % (q - 1) value from the RSA private_exponent (d) and q. r1r )r4r3r r r� rsa_crt_dmq1�srEi�c Cs�||d}|}x|ddkr(|d}qWd}d}xx| r�|tkr�|}xX||kr�t|||�}|dkr�||dkr�t|d|�dkr�t|d|�} d}P|d9}qHW|d7}q4W|s�td��t|| �\} } t| | fdd�\} } | | fS)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. r1�rFTz2Unable to compute factors p and q from exponent d.)�reverse)�_MAX_RECOVERY_ATTEMPTS�powrr0r=�sorted) r;r:�dZktot�tZspottedr?�kZcandr2r3rAr r r�rsa_recover_prime_factors�s*    $  rNc@s|eZdZdd�Zejd�Zejd�Zejd�Zejd�Z ejd�Z ejd�Z ejd �Z dd d �Z d d�Zdd�Zdd�Zd S)�RSAPrivateNumberscCs�t|tj� sTt|tj� sTt|tj� sTt|tj� sTt|tj� sTt|tj� r\td��t|t�sntd��||_||_||_||_||_ ||_ ||_ dS)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 r2r3rKr5r6r7r&r r r�__init__s$ zRSAPrivateNumbers.__init__rTrUrVrWrXrYrZNcCst|�}|j|�S)N)r Zload_rsa_private_numbers)r r,r r r� private_key5szRSAPrivateNumbers.private_keycCsbt|t�stS|j|jko`|j|jko`|j|jko`|j|jko`|j|jko`|j|jko`|j |j kS)N) r)rO�NotImplementedr2r3rKr5r6r7r&)r �otherr r r�__eq__9s       zRSAPrivateNumbers.__eq__cCs ||k S)Nr )r r^r r r�__ne__GszRSAPrivateNumbers.__ne__cCs$t|j|j|j|j|j|j|jf�S)N)�hashr2r3rKr5r6r7r&)r r r r�__hash__JszRSAPrivateNumbers.__hash__)N)rrrr[r�read_only_propertyr2r3rKr5r6r7r&r\r_r`rbr r r rrOs        rOc@sReZdZdd�Zejd�Zejd�Zddd�Zdd �Z d d �Z d d �Z dd�Z dS)rScCs4t|tj� st|tj� r$td��||_||_dS)Nz,RSAPublicNumbers arguments must be integers.)r)rPrQrR�_e�_n)r r:r;r r rr[Ys  zRSAPublicNumbers.__init__rdreNcCst|�}|j|�S)N)r Zload_rsa_public_numbers)r r,r r rreszRSAPublicNumbers.public_keycCs dj|�S)Nz$)r )r r r r�__repr__iszRSAPublicNumbers.__repr__cCs&t|t�stS|j|jko$|j|jkS)N)r)rSr]r:r;)r r^r r rr_ls zRSAPublicNumbers.__eq__cCs ||k S)Nr )r r^r r rr`rszRSAPublicNumbers.__ne__cCst|j|jf�S)N)rar:r;)r r r rrbuszRSAPublicNumbers.__hash__)N) rrrr[rrcr:r;rrfr_r`rbr r r rrSXs   rS)N)&Z __future__rrrrZmathr� ImportErrorZ fractionsrPZ cryptographyrZcryptography.exceptionsrrZcryptography.hazmat.backendsr Z'cryptography.hazmat.backends.interfacesr Z add_metaclass�ABCMeta�objectr rr"ZRSAPublicKeyWithSerializationr-r*r9r<rBrCrDrErHrNrOrSr r r r�s:    &  (   +H