o
    )%aQ                  
   @   sn  d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZ d dlmZmZmZmZ d	ed
e jeef dejde fddZ!d
e jd de"dede"fddZ#d
e jd de"de dede"f
ddZ$dd Z%dd Z&dd Z'dd Z(dd  Z)G d!d" d"eZ*G d#d$ d$eZ+G d%d& d&eZ,G d'd( d(eZ-dS ))    N)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextr   )AsymmetricPaddingMGF1OAEPPKCS1v15PSScalculate_max_pss_salt_length)RSAPrivateKeyRSAPrivateNumbersRSAPublicKeyRSAPublicNumberspsskeyhash_algorithmreturnc                 C   s(   | j }|tju s|tju rt||S |S N)_salt_lengthr   
MAX_LENGTHr   r   )r   r   r   salt r   J/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py_get_rsa_pss_salt_length)   s   
r!   )_RSAPrivateKey_RSAPublicKeydatapaddingc                 C   s   t |ts	tdt |tr| jj}n+t |tr4| jj}t |jt	s(t
dtj| |s3t
dtjn
t
d|jtjt| ||||S )Nz1Padding must be an instance of AsymmetricPadding.'Only MGF1 is supported by this backend.zPThis combination of padding and hash algorithm is not supported by this backend.${} is not supported by this backend.)
isinstancer   	TypeErrorr   _libRSA_PKCS1_PADDINGr   RSA_PKCS1_OAEP_PADDING_mgfr   r   r   UNSUPPORTED_MGFrsa_padding_supportedUNSUPPORTED_PADDINGformatname_enc_dec_rsa_pkey_ctx)backendr   r$   r%   padding_enumr   r   r    _enc_dec_rsa6   s,   





r6   r5   c                 C   s  t |tr| jj}| jj}n| jj}| jj}| j|j| j	j
}| || j	j
k | j	|| jj}||}| |dk | j||}| |dk | j|j}	| |	dk t |tr| jjr| |jj}
| j||
}| |dk | |j}| j||}| |dk t |tr|jd urt|jdkr| jt|j}| || j	j
k | j	||jt|j | j||t|j}| |dk | j	d|	}| j	d|	}|||||t|}| j	|d |d  }| j  |dkrtd|S )N   r   size_t *unsigned char[]zEncryption/decryption failed.) r(   r#   r*   EVP_PKEY_encrypt_initEVP_PKEY_encryptEVP_PKEY_decrypt_initEVP_PKEY_decryptEVP_PKEY_CTX_new	_evp_pkey_ffiNULLopenssl_assertgcEVP_PKEY_CTX_freeEVP_PKEY_CTX_set_rsa_paddingEVP_PKEY_sizer   Cryptography_HAS_RSA_OAEP_MD_evp_md_non_null_from_algorithmr-   
_algorithmEVP_PKEY_CTX_set_rsa_mgf1_mdEVP_PKEY_CTX_set_rsa_oaep_md_labellenOPENSSL_mallocmemmove EVP_PKEY_CTX_set0_rsa_oaep_labelnewbufferERR_clear_error
ValueError)r4   r   r$   r5   r%   initcryptpkey_ctxresbuf_sizemgf1_mdoaep_mdlabelptroutlenbufresbufr   r   r    r3   Z   sT   



r3   c                 C   s   t |ts	td| j|j}| |dk t |tr"| jj}|S t |t	rPt |j
ts3tdtjt |tjs=td||j d dk rJtd| jj}|S td|jtj)Nz'Expected provider of AsymmetricPadding.r   r&   z*Expected instance of hashes.HashAlgorithm.   zDDigest too large for key size. Use a larger key or different digest.r'   )r(   r   r)   r*   rF   r?   rB   r   r+   r   r-   r   r   r   r.   r	   HashAlgorithmdigest_sizerT   RSA_PKCS1_PSS_PADDINGr1   r2   r0   )r4   r   r%   	algorithm	pkey_sizer5   r   r   r    _rsa_sig_determine_padding   s2   



rf   c           
      C   s.  t | |||}| j|j| jj}| || jjk | j|| jj}||}| |dk |d urP| 	|}| j
||}|dkrP|   td|jtj| j||}|dkri|   td|jtjt|tr| j|t|||}| |dk | 	|jj}	| j||	}| |dk |S )Nr7   r   z4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rf   r*   r>   r?   r@   rA   rB   rC   rD   rH   EVP_PKEY_CTX_set_signature_md_consume_errorsr   r1   r2   r   UNSUPPORTED_HASHrE   r0   r(   r    EVP_PKEY_CTX_set_rsa_pss_saltlenr!   r-   rI   rJ   )
r4   r%   rd   r   	init_funcr5   rW   rX   evp_mdrZ   r   r   r    _rsa_sig_setup   sJ   

rm   c           
      C   s   t | |||| jj}| jd}| j|| jj||t|}| |dk | jd|d }| j||||t|}|dkrG| 	 }	t
d|	| j|d d  S )Nr8   r7   r9   r   zuDigest or salt length too long for key size. Use a larger key or shorter salt length if you are specifying a PSS salt)rm   r*   EVP_PKEY_sign_initr@   rQ   EVP_PKEY_signrA   rM   rB   _consume_errors_with_textrT   rR   )
r4   r%   rd   private_keyr$   rW   buflenrX   r^   errorsr   r   r    _rsa_sig_sign   s*   rt   c                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkr)|   td S )Nr   )rm   r*   EVP_PKEY_verify_initEVP_PKEY_verifyrM   rB   rh   r   )r4   r%   rd   
public_key	signaturer$   rW   rX   r   r   r    _rsa_sig_verify
  s   ry   c                 C   s   t | |||| jj}| j|j}| |dk | jd|}| jd|}| j||||t	|}	| j
|d |d  }
| j  |	dkrIt|
S )Nr   r9   r8   r7   )rm   r*   EVP_PKEY_verify_recover_initrF   r?   rB   r@   rQ   EVP_PKEY_verify_recoverrM   rR   rS   r   )r4   r%   rd   rw   rx   rW   maxlenr^   rr   rX   r_   r   r   r    _rsa_sig_recover  s&   
r}   c                   @   sD   e Zd ZdededejfddZdeddfd	d
Z	defddZ
dS )_RSASignatureContextrq   r%   rd   c                 C   s<   || _ || _t|||| || _|| _t| j| j | _d S r   )_backend_private_keyrf   _paddingrI   r	   Hash	_hash_ctx)selfr4   rq   r%   rd   r   r   r    __init__=  s   z_RSASignatureContext.__init__r$   r   Nc                 C      | j | d S r   r   updater   r$   r   r   r    r   O     z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j S r   )rt   r   r   rI   r   r   finalizer   r   r   r    r   R  s   z_RSASignatureContext.finalize)__name__
__module____qualname__r   r   r	   ra   r   bytesr   r   r   r   r   r    r~   <  s    
r~   c                   @   sD   e Zd ZdedededejfddZdedd	fd
dZ	dddZ
d	S )_RSAVerificationContextrw   rx   r%   rd   c                 C   sF   || _ || _|| _|| _t|||| |}|| _t| j| j | _d S r   )	r   _public_key
_signaturer   rf   rI   r	   r   r   )r   r4   rw   rx   r%   rd   r   r   r    r   ]  s   z _RSAVerificationContext.__init__r$   r   Nc                 C   r   r   r   r   r   r   r    r   r  r   z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j S r   )ry   r   r   rI   r   r   r   r   r   r   r   r    verifyu  s   z_RSAVerificationContext.verify)r   N)r   r   r   r   r   r   r	   ra   r   r   r   r   r   r   r    r   \  s    
r   c                   @   s   e Zd Zdd ZedZdedej	de
fddZd	ededefd
dZdefddZdefddZdejdejdejdefddZdededejejej	f defddZdS )r"   c                 C   s   |j |}|dkr| }td||j ||jj}||dk || _|| _	|| _
| jjd}| jj | j	|| jjj| jjj | j|d | jjjk | jj |d | _d S )Nr7   zInvalid private key	BIGNUM **r   )r*   RSA_check_keyrp   rT   RSA_blinding_onr@   rA   rB   r   
_rsa_cdatar?   rQ   RSA_get0_keyBN_num_bits	_key_size)r   r4   	rsa_cdataevp_pkeyrX   rs   nr   r   r    r     s$   
z_RSAPrivateKey.__init__r   r%   rd   r   c                 C   s   t   t| t| j| ||S r   )r   r   r~   r   )r   r%   rd   r   r   r    signer  s   z_RSAPrivateKey.signer
ciphertextc                 C   s2   | j d d }|t|krtdt| j| ||S )N      z,Ciphertext length must be equal to key size.)key_sizerM   rT   r6   r   )r   r   r%   key_size_bytesr   r   r    decrypt  s   z_RSAPrivateKey.decryptc                 C   sV   | j j| j}| j || j jjk | j j|| j jj}| j 	|}t
| j ||S r   )r   r*   RSAPublicKey_dupr   rB   r@   rA   rC   RSA_free_rsa_cdata_to_evp_pkeyr#   )r   ctxr   r   r   r    rw     s
   z_RSAPrivateKey.public_keyc           	      C   s  | j jd}| j jd}| j jd}| j jd}| j jd}| j jd}| j jd}| j jd}| j j| j||| | j |d | j jjk | j |d | j jjk | j |d | j jjk | j j| j|| | j |d | j jjk | j |d | j jjk | j j	| j||| | j |d | j jjk | j |d | j jjk | j |d | j jjk t
| j |d | j |d | j |d | j |d | j |d | j |d t| j |d | j |d ddS )Nr   r   er   )pqddmp1dmq1iqmppublic_numbers)r   r@   rQ   r*   r   r   rB   rA   RSA_get0_factorsRSA_get0_crt_paramsr   
_bn_to_intr   )	r   r   r   r   r   r   r   r   r   r   r   r    private_numbers  sB   
z_RSAPrivateKey.private_numbersencodingr1   encryption_algorithmc                 C   s   | j |||| | j| jS r   )r   _private_key_bytesr?   r   )r   r   r1   r   r   r   r    private_bytes  s   z_RSAPrivateKey.private_bytesr$   c                 C   s$   t | j||\}}t| j||| |S r   )r   r   rt   )r   r$   r%   rd   r   r   r    sign  s   z_RSAPrivateKey.signN)r   r   r   r   r   read_only_propertyr   r   r	   ra   r   r   r   r   r   rw   r   r   r
   EncodingPrivateFormatKeySerializationEncryptionr   typingUnion
asym_utils	Prehashedr   r   r   r   r    r"     s>    

#
r"   c                
   @   s   e Zd Zdd ZedZdedede	j
defdd	Zd
ededefddZdefddZdejdejdefddZdedededejeje	j
f ddf
ddZdededeje	j
 defddZdS )r#   c                 C   st   || _ || _|| _| j jd}| j j| j|| j jj| j jj | j |d | j jjk | j j	|d | _
d S )Nr   r   )r   r   r?   r@   rQ   r*   r   rA   rB   r   r   )r   r4   r   r   r   r   r   r    r     s   z_RSAPublicKey.__init__r   rx   r%   rd   r   c                 C   s,   t   td| t| t| j| |||S )Nrx   )r   r   _check_bytesr   r   r   r   rx   r%   rd   r   r   r    verifier  s   z_RSAPublicKey.verifier	plaintextc                 C   s   t | j| ||S r   )r6   r   )r   r   r%   r   r   r    encrypt  r   z_RSAPublicKey.encryptc                 C   s   | j jd}| j jd}| j j| j||| j jj | j |d | j jjk | j |d | j jjk t| j 	|d | j 	|d dS )Nr   r   r   )
r   r@   rQ   r*   r   r   rA   rB   r   r   )r   r   r   r   r   r    r     s   z_RSAPublicKey.public_numbersr   r1   c                 C   s   | j ||| | j| jS r   )r   _public_key_bytesr?   r   )r   r   r1   r   r   r    public_bytes  s   z_RSAPublicKey.public_bytesr$   Nc                 C   s&   t | j||\}}t| j||| ||S r   )r   r   ry   )r   rx   r$   r%   rd   r   r   r    r   (  s   z_RSAPublicKey.verifyc                 C   s   t | t| j||| |S r   )r   r}   r   r   r   r   r    recover_data_from_signature6  s   z)_RSAPublicKey.recover_data_from_signature)r   r   r   r   r   r   r   r   r   r	   ra   r   r   r   r   r   r
   r   PublicFormatr   r   r   r   r   r   Optionalr   r   r   r   r    r#     sR    


	

r#   ).r   cryptographyr   cryptography.exceptionsr   r   r   *cryptography.hazmat.backends.openssl.utilsr   r   r   cryptography.hazmat.primitivesr	   r
   )cryptography.hazmat.primitives.asymmetricr   r   r   1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r   r   r   -cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   ra   intr!   r   r6   r3   rf   rm   rt   ry   r}   r~   r   r"   r#   r   r   r   r    <module>   s\    

$
A+* $o