U
    ʹho                      @  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dS )RSAPrivateKeybytesr   )
ciphertextpaddingreturnc                 C  s   dS )z3
        Decrypts the provided ciphertext.
        N )selfr   r   r   r   S./venv/lib/python3.8/site-packages/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_key+asym_utils.Prehashed | hashes.HashAlgorithm)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_numbers1   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_bytes7   s    zRSAPrivateKey.private_bytesc                 C  s   dS z!
        Returns a copy.
        Nr   r   r   r   r   __copy__B   s    zRSAPrivateKey.__copy__N)__name__
__module____qualname__abcabstractmethodr   propertyr   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d"S )#r   r
   r   )	plaintextr   r   c                 C  s   dS )z/
        Encrypts the given plaintext.
        Nr   )r   r.   r   r   r   r   encryptN   s    zRSAPublicKey.encryptr   r   c                 C  s   dS r   r   r   r   r   r   r   T   s    zRSAPublicKey.key_sizeRSAPublicNumbersc                 C  s   dS )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   public_numbers[   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_bytesa   s    zRSAPublicKey.public_bytesr   None)	signaturer   r   r   r   c                 C  s   dS )z5
        Verifies the signature of the data.
        Nr   )r   r4   r   r   r   r   r   r   verifyk   s    zRSAPublicKey.verifyzhashes.HashAlgorithm | None)r4   r   r   r   c                 C  s   dS )z@
        Recovers the original data from the signature.
        Nr   )r   r4   r   r   r   r   r   recover_data_from_signaturew   s    z(RSAPublicKey.recover_data_from_signatureobjectbool)otherr   c                 C  s   dS )z"
        Checks equality.
        Nr   )r   r9   r   r   r   __eq__   s    zRSAPublicKey.__eq__c                 C  s   dS r%   r   r   r   r   r   r&      s    zRSAPublicKey.__copy__N)r'   r(   r)   r*   r+   r/   r,   r   r1   r2   r5   r6   r:   r&   r   r   r   r   r   M   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   r<   r   r   r   r@      s    
r@   r3   )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   r=      s    r=   )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)	rD   rE   Zx1Zx2abqrZxnr   r   r   _modinv   s    
rL   )prJ   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.
    rF   Values can't be <= 1)rC   rL   )rM   rJ   r   r   r   rsa_crt_iqmp   s    rO   )private_exponentrM   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.
    rF   rN   rB   )rP   rM   r   r   r   rsa_crt_dmp1   s    rQ   )rP   rJ   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.
    rF   rN   rB   )rP   rJ   r   r   r   rsa_crt_dmq1   s    rR   )rD   rM   rJ   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.
    rF   rN   )rC   r   rL   )rD   rM   rJ   Zlambda_nr   r   r   rsa_recover_private_exponent   s    "rS   i  ztuple[int, int])nrD   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 rtd| d }|d7 }|}||k rbt||| }	|	dkr|	| d krt|	d| dkrt|	d | }
d}qb|d9 }qqb|st 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.
    rF   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)	rC   pow_MAX_RECOVERY_ATTEMPTSrandomZrandintr   rG   AssertionErrorsorted)rT   rD   rU   ZktottZspottedZtriesrH   kZcandrM   rJ   rK   r   r   r   rsa_recover_prime_factors   s6    
$r`   )N)$Z
__future__r   r*   r[   typingZmathr   Z"cryptography.hazmat.bindings._rustr   r>   Zcryptography.hazmat.primitivesr   r   Z*cryptography.hazmat.primitives._asymmetricr   Z)cryptography.hazmat.primitives.asymmetricr   Z
asym_utilsABCMetar	   ZRSAPrivateKeyWithSerializationregisterr?   r   ZRSAPublicKeyWithSerializationr   r0   r@   r=   rL   rO   rQ   rR   rS   rZ   r`   r   r   r   r   <module>   s4   7B 		

