U
    ˆjÀ!  ã                   @  s`  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ	 d dl
mZmZ d dlmZ d dlmZ G dd	„ d	ejd
�ZeZe e	jj¡ G dd„ dejd
�ZeZe e	jj¡ e	jjZe	jjZd*dddd	dœdd„Zddddœdd„Zddddœdd„Zddddœdd„Zddddœdd„Zddddœd d!„Z ddddd"œd#d$„Z!d%Z"dddd&d'œd(d)„Z#dS )+é    )ÚannotationsN)Úgcd)Úopenssl)Ú_serializationÚhashes)ÚAsymmetricPadding)Úutilsc                   @  sÂ   e Zd Zejddddœdd„ƒZeejddœdd	„ƒƒZejd
dœdd„ƒZejdddddœdd„ƒZ	ejddœdd„ƒZ
ejdddddœdd„ƒZejd dœdd„ƒZejdd dœdd„ƒZd S )!ÚRSAPrivateKeyÚbytesr   )Ú
ciphertextÚpaddingÚreturnc                 C  s   dS )z3
        Decrypts the provided ciphertext.
        N© )Úselfr   r   r   r   úQ/tmp/pip-unpacked-wheel-cr19813o/cryptography/hazmat/primitives/asymmetric/rsa.pyÚdecrypt   s    zRSAPrivateKey.decryptÚint©r   c                 C  s   dS ©z7
        The bit length of the public modulus.
        Nr   ©r   r   r   r   Úkey_size   s    zRSAPrivateKey.key_sizeÚRSAPublicKeyc                 C  s   dS )zD
        The RSAPublicKey associated with this private key.
        Nr   r   r   r   r   Ú
public_key    s    zRSAPrivateKey.public_keyzEasym_utils.Prehashed | hashes.HashAlgorithm | asym_utils.NoDigestInfo)Údatar   Ú	algorithmr   c                 C  s   dS )z!
        Signs the data.
        Nr   )r   r   r   r   r   r   r   Úsign&   s    	zRSAPrivateKey.signÚRSAPrivateNumbersc                 C  s   dS )z/
        Returns an RSAPrivateNumbers.
        Nr   r   r   r   r   Úprivate_numbers3   s    zRSAPrivateKey.private_numbersú_serialization.Encodingz_serialization.PrivateFormatz)_serialization.KeySerializationEncryption)ÚencodingÚformatÚencryption_algorithmr   c                 C  s   dS ©z6
        Returns the key serialized as bytes.
        Nr   )r   r   r    r!   r   r   r   Úprivate_bytes9   s    zRSAPrivateKey.private_bytesc                 C  s   dS ©z!
        Returns a copy.
        Nr   r   r   r   r   Ú__copy__D   s    zRSAPrivateKey.__copy__Údict©Úmemor   c                 C  s   dS ©z&
        Returns a deep copy.
        Nr   ©r   r(   r   r   r   Ú__deepcopy__J   s    zRSAPrivateKey.__deepcopy__N)Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractmethodr   Úpropertyr   r   r   r   r#   r%   r+   r   r   r   r   r	      s"   
r	   )Ú	metaclassc                   @  sÞ   e Zd Zejddddœdd„ƒZeejddœdd	„ƒƒZejd
dœdd„ƒZejddddœdd„ƒZ	ejddddddœdd„ƒZ
ejdddddœdd„ƒZejdddœdd„ƒZejd dœd d!„ƒZejd"d d#œd$d%„ƒZd&S )'r   r
   r   )Ú	plaintextr   r   c                 C  s   dS )z/
        Encrypts the given plaintext.
        Nr   )r   r3   r   r   r   r   ÚencryptV   s    zRSAPublicKey.encryptr   r   c                 C  s   dS r   r   r   r   r   r   r   \   s    zRSAPublicKey.key_sizeÚRSAPublicNumbersc                 C  s   dS )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   Úpublic_numbersc   s    zRSAPublicKey.public_numbersr   z_serialization.PublicFormat)r   r    r   c                 C  s   dS r"   r   )r   r   r    r   r   r   Úpublic_bytesi   s    zRSAPublicKey.public_bytesz+asym_utils.Prehashed | hashes.HashAlgorithmÚNone)Ú	signaturer   r   r   r   c                 C  s   dS )z5
        Verifies the signature of the data.
        Nr   )r   r9   r   r   r   r   r   r   Úverifys   s    zRSAPublicKey.verifyz5hashes.HashAlgorithm | asym_utils.NoDigestInfo | None)r9   r   r   r   c                 C  s   dS )z@
        Recovers the original data from the signature.
        Nr   )r   r9   r   r   r   r   r   Úrecover_data_from_signature   s    z(RSAPublicKey.recover_data_from_signatureÚobjectÚbool)Úotherr   c                 C  s   dS )z"
        Checks equality.
        Nr   )r   r>   r   r   r   Ú__eq__Š   s    zRSAPublicKey.__eq__c                 C  s   dS r$   r   r   r   r   r   r%   �   s    zRSAPublicKey.__copy__r&   r'   c                 C  s   dS r)   r   r*   r   r   r   r+   –   s    zRSAPublicKey.__deepcopy__N)r,   r-   r.   r/   r0   r4   r1   r   r6   r7   r:   r;   r?   r%   r+   r   r   r   r   r   U   s&   	
r   r   z
typing.Any)Úpublic_exponentr   Úbackendr   c                 C  s   t | |ƒ tj | |¡S )N)Ú_verify_rsa_parametersÚrust_opensslÚrsaÚgenerate_private_key)r@   r   rA   r   r   r   rE   ¤   s    
rE   r8   )r@   r   r   c                 C  s$   | dk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 1024-bits.©Ú
ValueError)r@   r   r   r   r   rB   ­   s    ÿrB   )ÚeÚmr   c           	      C  sR   d\}}| | }}|dkrJt ||ƒ\}}|||  }||||f\}}}}q|| S )zO
    Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
    )é   r   r   )Údivmod)	rI   rJ   Úx1Zx2ÚaÚbÚqÚrZxnr   r   r   Ú_modinv¸   s    
rR   )ÚprP   r   c                 C  s"   | dks|dkrt dƒ‚t|| ƒS )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    rK   úValues can't be <= 1)rH   rR   )rS   rP   r   r   r   Úrsa_crt_iqmpÅ   s    rU   )Úprivate_exponentrS   r   c                 C  s$   | dks|dkrt dƒ‚| |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    rK   rT   rG   )rV   rS   r   r   r   Úrsa_crt_dmp1Î   s    rW   )rV   rP   r   c                 C  s$   | dks|dkrt dƒ‚| |d  S )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    rK   rT   rG   )rV   rP   r   r   r   Úrsa_crt_dmq1Ø   s    rX   )rI   rS   rP   r   c                 C  sL   | dks|dks|dkr t dƒ‚|d |d  t|d |d ƒ }t| |ƒS )zè
    Compute the RSA private_exponent (d) given the public exponent (e)
    and the RSA primes p and q.

    This uses the Carmichael totient function to generate the
    smallest possible working value of the private exponent.
    rK   rT   )rH   r   rR   )rI   rS   rP   Zlambda_nr   r   r   Úrsa_recover_private_exponentâ   s    "rY   iô  ztuple[int, int])ÚnrI   Údr   c                 C  s&  |dks|dkrt dƒ‚dtd|| | ƒkr4t dƒ‚|| d }|}|d dkrZ|d }qDd}d}|sâ|tk rât d| d ¡}|d7 }|}||k rbt||| ƒ}	|	dkrÖ|	| d krÖt|	d| ƒdkrÖt|	d | ƒ}
d}qb|d9 }qŠqb|sît d	ƒ‚t| |
ƒ\}}|dk�s
t‚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.
    rK   zd, e can't be <= 1é   zn, d, e don't matché   r   FTz2Unable to compute factors p and q from exponent d.)Úreverse)	rH   ÚpowÚ_MAX_RECOVERY_ATTEMPTSÚrandomÚrandintr   rL   ÚAssertionErrorÚsorted)rZ   rI   r[   ZktotÚtZspottedÚtriesrN   ÚkZcandrS   rP   rQ   r   r   r   Úrsa_recover_prime_factorsþ   s6    
$rh   )N)$Ú
__future__r   r/   ra   ÚtypingÚmathr   Z"cryptography.hazmat.bindings._rustr   rC   Zcryptography.hazmat.primitivesr   r   Z*cryptography.hazmat.primitives._asymmetricr   Z)cryptography.hazmat.primitives.asymmetricr   Z
asym_utilsÚABCMetar	   ZRSAPrivateKeyWithSerializationÚregisterrD   r   ZRSAPublicKeyWithSerializationr   r5   rE   rB   rR   rU   rW   rX   rY   r`   rh   r   r   r   r   Ú<module>   s4   ?H ý		

