o
    ˷e:,                     @   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   d/var/www/ideatree/venv/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   EncodingPrivateFormat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   r1   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   r6   r   r	   r   r   r   r   verifya   r   zRSAPublicKey.verifyc                 C   r   )z@
        Recovers the original data from the signature.
        Nr   )r   r6   r	   r   r   r   r   recover_data_from_signaturem   r   z(RSAPublicKey.recover_data_from_signaturer
   r3   )r    r!   r"   r#   r$   r%   r   r2   r&   r'   r   r4   r   r-   PublicFormatr5   r(   r)   r*   r+   r   r,   r7   Optionalr8   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_parametersgenerate_rsa_private_key)r<   r   r=   osslr   r   r   generate_private_key|   s   
rC   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)r<   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 )NrD   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.rE   )rG   rH   rI   rJ   rK   rL   r<   rM   r   r   r   _check_private_key_components   s2   
rO   enc                 C   s@   |dk rt d| dk s| |krt d| d@ dkrt dd S )NrD   zn must be >= 3.ze must be >= 3 and < n.rN   r   ze must be odd.rE   )rP   rQ   r   r   r   _check_public_key_components   s   rR   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
    )rN   r   r   )divmod)	rP   rS   x1x2abrH   rxnr   r   r   _modinv   s   
r[   c                 C   s
   t || S )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    )r[   )rG   rH   r   r   r   rsa_crt_iqmp   s   
r\   c                 C      | |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    rN   r   )rI   rG   r   r   r   rsa_crt_dmp1      r^   c                 C   r]   )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    rN   r   )rI   rH   r   r   r   rsa_crt_dmq1   r_   r`   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.
    rN      r   FTz2Unable to compute factors p and q from exponent d.)reverse)_MAX_RECOVERY_ATTEMPTSpowr   rF   rT   sorted)rQ   rP   ra   ktottspottedrW   kcandrG   rH   rY   r   r   r   rsa_recover_prime_factors   s2   $rl   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   rG   rH   ra   rJ   rK   rL   r4   r3   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'   	TypeErrorr3   _p_q_d_dmp1_dmq1_iqmp_public_numbers)r   rG   rH   ra   rJ   rK   rL   r4   r   r   r   __init__$  s4   

zRSAPrivateNumbers.__init__r
   c                 C      | j S N)ro   r   r   r   r   rG   I     zRSAPrivateNumbers.pc                 C   rw   rx   )rp   r   r   r   r   rH   M  ry   zRSAPrivateNumbers.qc                 C   rw   rx   )rq   r   r   r   r   ra   Q  ry   zRSAPrivateNumbers.dc                 C   rw   rx   )rr   r   r   r   r   rJ   U  ry   zRSAPrivateNumbers.dmp1c                 C   rw   rx   )rs   r   r   r   r   rK   Y  ry   zRSAPrivateNumbers.dmq1c                 C   rw   rx   )rt   r   r   r   r   rL   ]  ry   zRSAPrivateNumbers.iqmpc                 C   rw   rx   )ru   r   r   r   r   r4   a  ry   z RSAPrivateNumbers.public_numbersNr=   c                 C      ddl m} || S r>   )r?   r=   load_rsa_private_numbersr   r=   rB   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 rx   )
rm   r   NotImplementedrG   rH   ra   rJ   rK   rL   r4   r   r   r   r   r   __eq__l  s   






zRSAPrivateNumbers.__eq__c                 C   s$   t | j| j| j| j| j| j| jfS rx   )hashrG   rH   ra   rJ   rK   rL   r4   r   r   r   r   __hash__z  s   zRSAPrivateNumbers.__hash__r9   rx   )r    r!   r"   r'   rv   propertyrG   rH   ra   rJ   rK   rL   r4   r(   Anyr   r}   objectboolr   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 )r3   rP   rQ   c                 C   s,   t |tr
t |tstd|| _|| _d S )Nz,RSAPublicNumbers arguments must be integers.)rm   r'   rn   _e_n)r   rP   rQ   r   r   r   rv     s   
zRSAPublicNumbers.__init__r
   c                 C   rw   rx   )r   r   r   r   r   rP     ry   zRSAPublicNumbers.ec                 C   rw   rx   )r   r   r   r   r   rQ     ry   zRSAPublicNumbers.nNr=   c                 C   rz   r>   )r?   r=   load_rsa_public_numbersr|   r   r   r   r     r~   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__r   c                 C   s&   t |tstS | j|jko| j|jkS rx   )rm   r3   r   rP   rQ   r   r   r   r   r     s   
zRSAPublicNumbers.__eq__c                 C   s   t | j| jfS rx   )r   rP   rQ   r   r   r   r   r     s   zRSAPublicNumbers.__hash__rx   )r    r!   r"   r'   rv   r   rP   rQ   r(   r   r   r   strr   r   r   r   r   r   r   r   r   r3     s    r3   rx   ) r#   r(   mathr   cryptography.hazmat.primitivesr   r   *cryptography.hazmat.primitives._asymmetricr   )cryptography.hazmat.primitives.asymmetricr   r*   ABCMetar   RSAPrivateKeyWithSerializationr   RSAPublicKeyWithSerializationr'   r   rC   r@   rO   rR   r[   r\   r^   r`   rd   Tuplerl   r   r3   r   r   r   r   <module>   sr   05
	
/
-e