o
    Ç `°)  ã                   @   sR  d dl mZmZmZ d dlZzd dlmZ W n ey%   d dlmZ Y nw 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 e	 ej¡G dd	„ d	eƒƒZe	 ej¡G d
d„ deƒƒZe	 ej¡G dd„ deƒƒZeZd%dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dZ"dd „ Z#G d!d"„ d"eƒZ$G d#d$„ d$eƒZ%dS )&é    )Úabsolute_importÚdivisionÚprint_functionN)Úgcd)Úutils)ÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)Ú
RSABackendc                   @   sR   e Zd Zejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZ	ejd	d
„ ƒZ
dS )ÚRSAPrivateKeyc                 C   ó   dS )zN
        Returns an AsymmetricSignatureContext used for signing data.
        N© )ÚselfÚpaddingÚ	algorithmr   r   úƒhome/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.pyÚsigner   ó    zRSAPrivateKey.signerc                 C   r   )z3
        Decrypts the provided ciphertext.
        Nr   )r   Z
ciphertextr   r   r   r   Údecrypt   r   zRSAPrivateKey.decryptc                 C   r   ©z7
        The bit length of the public modulus.
        Nr   ©r   r   r   r   Úkey_size%   r   zRSAPrivateKey.key_sizec                 C   r   )zD
        The RSAPublicKey associated with this private key.
        Nr   r   r   r   r   Ú
public_key+   r   zRSAPrivateKey.public_keyc                 C   r   )z!
        Signs the data.
        Nr   )r   Údatar   r   r   r   r   Úsign1   r   zRSAPrivateKey.signN)Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractmethodr   r   Úabstractpropertyr   r   r   r   r   r   r   r      s    



r   c                   @   s(   e Zd Zejdd„ ƒZejdd„ ƒZdS )ÚRSAPrivateKeyWithSerializationc                 C   r   )z/
        Returns an RSAPrivateNumbers.
        Nr   r   r   r   r   Úprivate_numbers:   r   z.RSAPrivateKeyWithSerialization.private_numbersc                 C   r   ©z6
        Returns the key serialized as bytes.
        Nr   )r   ÚencodingÚformatZencryption_algorithmr   r   r   Úprivate_bytes@   r   z,RSAPrivateKeyWithSerialization.private_bytesN)r   r   r   r   r   r"   r&   r   r   r   r   r!   8   s
    
r!   c                   @   sn   e Zd Zejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZ	ejd	d
„ ƒZ
ejdd„ ƒZejdd„ ƒZdS )ÚRSAPublicKeyc                 C   r   )zY
        Returns an AsymmetricVerificationContext used for verifying signatures.
        Nr   ©r   Ú	signaturer   r   r   r   r   ÚverifierI   r   zRSAPublicKey.verifierc                 C   r   )z/
        Encrypts the given plaintext.
        Nr   )r   Z	plaintextr   r   r   r   ÚencryptO   r   zRSAPublicKey.encryptc                 C   r   r   r   r   r   r   r   r   U   r   zRSAPublicKey.key_sizec                 C   r   )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   Úpublic_numbers[   r   zRSAPublicKey.public_numbersc                 C   r   r#   r   )r   r$   r%   r   r   r   Úpublic_bytesa   r   zRSAPublicKey.public_bytesc                 C   r   )z5
        Verifies the signature of the data.
        Nr   )r   r)   r   r   r   r   r   r   Úverifyg   r   zRSAPublicKey.verifyc                 C   r   )z@
        Recovers the original data from the signature.
        Nr   r(   r   r   r   Úrecover_data_from_signaturem   r   z(RSAPublicKey.recover_data_from_signatureN)r   r   r   r   r   r*   r+   r    r   r,   r-   r.   r/   r   r   r   r   r'   G   s    





r'   c                 C   s4   t |ƒ}t|tƒstdtjƒ‚t| |ƒ | | |¡S )Nz-Backend object does not implement RSABackend.)r	   Ú
isinstancer
   r   r   ZBACKEND_MISSING_INTERFACEÚ_verify_rsa_parametersZgenerate_rsa_private_key)Úpublic_exponentr   Úbackendr   r   r   Úgenerate_private_keyw   s   
þ
r4   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)r2   r   r   r   r   r1   ƒ   s   ÿÿr1   c                 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 )Nr5   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.r6   )ÚpÚqÚprivate_exponentÚdmp1Údmq1Úiqmpr2   Úmodulusr   r   r   Ú_check_private_key_componentsŽ   s2   ÿr@   c                 C   s@   |dk rt dƒ‚| dk s| |krt dƒ‚| d@ dkrt dƒ‚d S )Nr5   zn must be >= 3.ze must be >= 3 and < n.r8   r   ze must be odd.r6   )ÚeÚnr   r   r   Ú_check_public_key_components¶   s   ÿrC   c           	      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
    )r8   r   r   )Údivmod)	rA   ÚmÚx1Zx2ÚaÚbr:   ÚrZxnr   r   r   Ú_modinvÁ   s   
ýrJ   c                 C   s
   t || ƒS )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    )rJ   )r9   r:   r   r   r   Úrsa_crt_iqmpÎ   s   
rK   c                 C   ó   | |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    r8   r   )r;   r9   r   r   r   Úrsa_crt_dmp1Õ   ó   rM   c                 C   rL   )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    r8   r   )r;   r:   r   r   r   Úrsa_crt_dmq1Ý   rN   rO   iè  c                 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.
    r8   é   r   FTz2Unable to compute factors p and q from exponent d.)Úreverse)Ú_MAX_RECOVERY_ATTEMPTSÚpowr   r7   rD   Úsorted)rB   rA   ÚdZktotÚtZspottedrG   ÚkÚcandr9   r:   rI   r   r   r   Úrsa_recover_prime_factorsë   s2   ÿ$÷òrY   c                   @   s|   e Zd Zdd„ Ze d¡Ze d¡Ze d¡Ze d¡Z	e d¡Z
e d¡Ze d	¡Zddd„Zdd„ Zdd„ Zdd„ Zd
S )ÚRSAPrivateNumbersc                 C   s   t |tjƒr$t |tjƒr$t |tjƒr$t |tjƒr$t |tjƒr$t |tjƒs(tdƒ‚t |tƒs1tdƒ‚|| _|| _|| _|| _|| _	|| _
|| _d S )NzNRSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must all be an integers.zFRSAPrivateNumbers public_numbers must be an RSAPublicNumbers instance.)r0   ÚsixÚinteger_typesÚ	TypeErrorÚRSAPublicNumbersÚ_pÚ_qÚ_dÚ_dmp1Ú_dmq1Ú_iqmpÚ_public_numbers)r   r9   r:   rU   r<   r=   r>   r,   r   r   r   Ú__init__  s4   
ÿ
þ
ý
ü
û
úÿ
ÿ
zRSAPrivateNumbers.__init__r_   r`   ra   rb   rc   rd   re   Nc                 C   ó   t |ƒ}| | ¡S ©N)r	   Zload_rsa_private_numbers©r   r3   r   r   r   Úprivate_key;  ó   
zRSAPrivateNumbers.private_keyc                 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 rh   )
r0   rZ   ÚNotImplementedr9   r:   rU   r<   r=   r>   r,   ©r   Úotherr   r   r   Ú__eq__?  s   

ÿ
þ
ý
ü
û
ùzRSAPrivateNumbers.__eq__c                 C   ó
   | |k S rh   r   rm   r   r   r   Ú__ne__M  ó   
zRSAPrivateNumbers.__ne__c                 C   s$   t | j| j| j| j| j| j| jfƒS rh   )Úhashr9   r:   rU   r<   r=   r>   r,   r   r   r   r   Ú__hash__P  s   ùÿzRSAPrivateNumbers.__hash__rh   )r   r   r   rf   r   Úread_only_propertyr9   r:   rU   r<   r=   r>   r,   rj   ro   rq   rt   r   r   r   r   rZ     s    







rZ   c                   @   sR   e Zd Zdd„ Ze d¡Ze d¡Zddd„Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )r^   c                 C   s0   t |tjƒrt |tjƒstdƒ‚|| _|| _d S )Nz,RSAPublicNumbers arguments must be integers.)r0   r[   r\   r]   Ú_eÚ_n)r   rA   rB   r   r   r   rf   _  s   ÿ
zRSAPublicNumbers.__init__rv   rw   Nc                 C   rg   rh   )r	   Zload_rsa_public_numbersri   r   r   r   r   k  rk   zRSAPublicNumbers.public_keyc                 C   s
   d  | ¡S )Nz$<RSAPublicNumbers(e={0.e}, n={0.n})>)r%   r   r   r   r   Ú__repr__o  rr   zRSAPublicNumbers.__repr__c                 C   s&   t |tƒstS | j|jko| j|jkS rh   )r0   r^   rl   rA   rB   rm   r   r   r   ro   r  s   
zRSAPublicNumbers.__eq__c                 C   rp   rh   r   rm   r   r   r   rq   x  rr   zRSAPublicNumbers.__ne__c                 C   s   t | j| jfƒS rh   )rs   rA   rB   r   r   r   r   rt   {  s   zRSAPublicNumbers.__hash__rh   )r   r   r   rf   r   ru   rA   rB   r   rx   ro   rq   rt   r   r   r   r   r^   ^  s    
	

r^   rh   )&Ú
__future__r   r   r   r   Úmathr   ÚImportErrorZ	fractionsr[   Úcryptographyr   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr	   Z'cryptography.hazmat.backends.interfacesr
   Zadd_metaclassÚABCMetaÚobjectr   r!   r'   ZRSAPublicKeyWithSerializationr4   r1   r@   rC   rJ   rK   rM   rO   rR   rY   rZ   r^   r   r   r   r   Ú<module>   s>   ÿ

 
,
(+H