o
    c:,                     @   s  d dl Z 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 G dd de jdZeZG d	d
 d
e jdZeZ	d1dededejdefddZdededdfddZdededededededededdfddZdededdfddZded edefd!d"Zdededefd#d$Zdededefd%d&Zdededefd'd(Zd)Zdeded*edejeef fd+d,ZG d-d. d.ZG d/d0 d0ZdS )2    N)gcd)_serializationhashes)AsymmetricPadding)utilsc                	   @   s   e Zd ZejdededefddZejde	fddZ
ejdd	d
Zejdededejejejf defddZejdddZejdejdejdejdefddZdS )RSAPrivateKey
ciphertextpaddingreturnc                 C      dS )z3
        Decrypts the provided ciphertext.
        N )selfr   r	   r   r   Qusr/lib/python3.10/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.pydecrypt       zRSAPrivateKey.decryptc                 C   r   z7
        The bit length of the public modulus.
        Nr   r   r   r   r   key_size   r   zRSAPrivateKey.key_sizeRSAPublicKeyc                 C   r   )zD
        The RSAPublicKey associated with this private key.
        Nr   r   r   r   r   
public_key   r   zRSAPrivateKey.public_keydata	algorithmc                 C   r   )z!
        Signs the data.
        Nr   )r   r   r	   r   r   r   r   sign$   r   zRSAPrivateKey.signRSAPrivateNumbersc                 C   r   )z/
        Returns an RSAPrivateNumbers.
        Nr   r   r   r   r   private_numbers/   r   zRSAPrivateKey.private_numbersencodingformatencryption_algorithmc                 C   r   z6
        Returns the key serialized as bytes.
        Nr   )r   r   r   r   r   r   r   private_bytes5   r   zRSAPrivateKey.private_bytesN)r
   r   )r
   r   )__name__
__module____qualname__abcabstractmethodbytesr   r   abstractpropertyintr   r   typingUnion
asym_utils	Prehashedr   HashAlgorithmr   r   r   EncodingZPrivateFormatZKeySerializationEncryptionr   r   r   r   r   r      s:    
r   )	metaclassc                   @   s   e Zd ZejdededefddZejde	fddZ
ejdd	d
ZejdejdejdefddZejdedededejejejf ddf
ddZejdededejej defddZdS )r   	plaintextr	   r
   c                 C   r   )z/
        Encrypts the given plaintext.
        Nr   )r   r/   r	   r   r   r   encryptE   r   zRSAPublicKey.encryptc                 C   r   r   r   r   r   r   r   r   K   r   zRSAPublicKey.key_sizeRSAPublicNumbersc                 C   r   )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   public_numbersQ   r   zRSAPublicKey.public_numbersr   r   c                 C   r   r   r   )r   r   r   r   r   r   public_bytesW   r   zRSAPublicKey.public_bytes	signaturer   r   Nc                 C   r   )z5
        Verifies the signature of the data.
        Nr   )r   r4   r   r	   r   r   r   r   verifya   r   zRSAPublicKey.verifyc                 C   r   )z@
        Recovers the original data from the signature.
        Nr   )r   r4   r	   r   r   r   r   recover_data_from_signaturem   r   z(RSAPublicKey.recover_data_from_signaturer
   r1   )r    r!   r"   r#   r$   r%   r   r0   r&   r'   r   r2   r   r-   ZPublicFormatr3   r(   r)   r*   r+   r   r,   r5   Optionalr6   r   r   r   r   r   D   sJ    	
r   public_exponentr   backendr
   c                 C   s"   ddl m} t| | || |S Nr   )r:   ),cryptography.hazmat.backends.openssl.backendr:   _verify_rsa_parametersZgenerate_rsa_private_key)r9   r   r:   osslr   r   r   generate_private_key|   s   
r?   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)r9   r   r   r   r   r=      s   r=   pqprivate_exponentdmp1dmq1iqmpmodulusc                 C   s   |dk rt d| |krt d||krt d||kr t d||kr(t d||kr0t d||kr8t d|dk s@||krDt d	|d
@ dkrNt d|d
@ dkrXt d|d
@ dkrbt d| | |krlt dd S )Nr@   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.rA   )rC   rD   rE   rF   rG   rH   r9   rI   r   r   r   _check_private_key_components   s2   
rK   enc                 C   s@   |dk rt d| dk s| |krt d| d@ dkrt dd S )Nr@   zn must be >= 3.ze must be >= 3 and < n.rJ   r   ze must be odd.rA   )rL   rM   r   r   r   _check_public_key_components   s   rN   mc           	      C   sX   d\}}| |}}|dkr(t ||\}}|||  }||||f\}}}}|dks|| S )zO
    Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
    )rJ   r   r   )divmod)	rL   rO   x1Zx2abrD   rZxnr   r   r   _modinv   s   
rU   c                 C   s
   t || S )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    )rU   )rC   rD   r   r   r   rsa_crt_iqmp   s   
rV   c                 C      | |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    rJ   r   )rE   rC   r   r   r   rsa_crt_dmp1      rX   c                 C   rW   )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    rJ   r   )rE   rD   r   r   r   rsa_crt_dmq1   rY   rZ   i  dc                 C   s   || d }|}|d dkr|d }|d dksd}d}|s\|t k r\|}||k rRt||| }|dkrJ|| d krJt|d| dkrJt|d | }	d}n|d9 }||k s(|d7 }|s\|t k s"|sbtdt| |	\}
}|dksoJ 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.
    rJ      r   FTz2Unable to compute factors p and q from exponent d.)reverse)_MAX_RECOVERY_ATTEMPTSpowr   rB   rP   sorted)rM   rL   r[   ZktottZspottedrR   kcandrC   rD   rT   r   r   r   rsa_recover_prime_factors   s2   $rd   c                   @   s   e Zd Zdededededededdfd	d
ZedefddZedefddZedefddZedefddZ	edefddZ
edefddZed#ddZd$dejdefddZdedefdd Zdefd!d"ZdS )%r   rC   rD   r[   rF   rG   rH   r2   r1   c                 C   s   t |trt |trt |trt |trt |trt |ts"tdt |ts+td|| _|| _|| _|| _|| _|| _	|| _
d S )NzNRSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must all be an integers.zFRSAPrivateNumbers public_numbers must be an RSAPublicNumbers instance.)
isinstancer'   	TypeErrorr1   _p_q_d_dmp1_dmq1_iqmp_public_numbers)r   rC   rD   r[   rF   rG   rH   r2   r   r   r   __init__$  s4   

zRSAPrivateNumbers.__init__r
   c                 C      | j S N)rg   r   r   r   r   rC   I     zRSAPrivateNumbers.pc                 C   ro   rp   )rh   r   r   r   r   rD   M  rq   zRSAPrivateNumbers.qc                 C   ro   rp   )ri   r   r   r   r   r[   Q  rq   zRSAPrivateNumbers.dc                 C   ro   rp   )rj   r   r   r   r   rF   U  rq   zRSAPrivateNumbers.dmp1c                 C   ro   rp   )rk   r   r   r   r   rG   Y  rq   zRSAPrivateNumbers.dmq1c                 C   ro   rp   )rl   r   r   r   r   rH   ]  rq   zRSAPrivateNumbers.iqmpc                 C   ro   rp   )rm   r   r   r   r   r2   a  rq   z RSAPrivateNumbers.public_numbersNr:   c                 C      ddl m} || S r;   )r<   r:   Zload_rsa_private_numbersr   r:   r>   r   r   r   private_keye     
zRSAPrivateNumbers.private_keyotherc                 C   sb   t |tstS | j|jko0| j|jko0| j|jko0| j|jko0| j|jko0| j|jko0| j	|j	kS rp   )
re   r   NotImplementedrC   rD   r[   rF   rG   rH   r2   r   rv   r   r   r   __eq__l  s   






zRSAPrivateNumbers.__eq__c                 C   s$   t | j| j| j| j| j| j| jfS rp   )hashrC   rD   r[   rF   rG   rH   r2   r   r   r   r   __hash__z  s   zRSAPrivateNumbers.__hash__r7   rp   )r    r!   r"   r'   rn   propertyrC   rD   r[   rF   rG   rH   r2   r(   Anyr   rt   objectboolry   r{   r   r   r   r   r   #  sB    
%r   c                   @   s   e Zd ZdedefddZedefddZedefdd	Zddej	de
fddZdefddZdedefddZdefddZd
S )r1   rL   rM   c                 C   s,   t |tr
t |tstd|| _|| _d S )Nz,RSAPublicNumbers arguments must be integers.)re   r'   rf   _e_n)r   rL   rM   r   r   r   rn     s   
zRSAPublicNumbers.__init__r
   c                 C   ro   rp   )r   r   r   r   r   rL     rq   zRSAPublicNumbers.ec                 C   ro   rp   )r   r   r   r   r   rM     rq   zRSAPublicNumbers.nNr:   c                 C   rr   r;   )r<   r:   Zload_rsa_public_numbersrs   r   r   r   r     ru   zRSAPublicNumbers.public_keyc                 C   s
   d | S )Nz$<RSAPublicNumbers(e={0.e}, n={0.n})>)r   r   r   r   r   __repr__  s   
zRSAPublicNumbers.__repr__rv   c                 C   s&   t |tstS | j|jko| j|jkS rp   )re   r1   rw   rL   rM   rx   r   r   r   ry     s   
zRSAPublicNumbers.__eq__c                 C   s   t | j| jfS rp   )rz   rL   rM   r   r   r   r   r{     s   zRSAPublicNumbers.__hash__rp   )r    r!   r"   r'   rn   r|   rL   rM   r(   r}   r   r   strr   r~   r   ry   r{   r   r   r   r   r1     s    r1   rp   ) r#   r(   mathr   Zcryptography.hazmat.primitivesr   r   Z*cryptography.hazmat.primitives._asymmetricr   Z)cryptography.hazmat.primitives.asymmetricr   r*   ABCMetar   ZRSAPrivateKeyWithSerializationr   ZRSAPublicKeyWithSerializationr'   r}   r?   r=   rK   rN   rU   rV   rX   rZ   r^   Tuplerd   r   r1   r   r   r   r   <module>   sr   05
	
/
-e