a oeAU@sddlmZddlZddlZddlmZmZmZddlm Z ddl m Z m Z ddl mZddlmZmZmZmZmZmZmZmZmZddlmZmZmZmZejrdd l m!Z!d d d d ddddZ"d dddddddZ#d ddddddddZ$d dddddddZ%d dddd d!d"d#Z&d dd d$ddd%d&d'Z'd dd d(ddd)d*d+d,Z(d ddd(ddd-d.d/Z)Gd0d$d$eZ*Gd1d(d(eZ+dS)2) annotationsN)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm)hashes serialization)utils) MGF1OAEPPSSAsymmetricPaddingPKCS1v15_Auto _DigestLength _MaxLengthcalculate_max_pss_salt_length) RSAPrivateKeyRSAPrivateNumbers RSAPublicKeyRSAPublicNumbers)Backendrr z)typing.Union[RSAPrivateKey, RSAPublicKey]zhashes.HashAlgorithmint)backendpsskeyhash_algorithmreturncCsV|j}t|trt||St|tr*|jSt|trNt|trFtd|j j S|SdS)Nz6PSS salt length can only be set to AUTO when verifying) Z _salt_length isinstancerrr digest_sizerr ValueError_libZRSA_PSS_SALTLEN_AUTO)rrrrZsaltr"IC:\Program Files\Certbot\pkgs\cryptography\hazmat\backends\openssl\rsa.py_get_rsa_pss_salt_length*s     r$z+typing.Union[_RSAPrivateKey, _RSAPublicKey]bytesr )rrdatapaddingrcCst|tstdt|tr&|jj}nVt|trh|jj}t|jt sPt dt j | |s|t dt jnt |jdt jt|||||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.)rr TypeErrorrr!RSA_PKCS1_PADDINGr ZRSA_PKCS1_OAEP_PADDING_mgfr rrUNSUPPORTED_MGFZrsa_padding_supportedUNSUPPORTED_PADDINGname_enc_dec_rsa_pkey_ctx)rrr&r' padding_enumr"r"r# _enc_dec_rsa@s*       r2)rrr&r1r'rcCst|tr|jj}|jj}n|jj}|jj}|j|j|j j }| ||j j k|j ||jj }||}| |dk|j||}| |dk|j|j} | | dkt|tr||jj} |j|| }| |dk||j} |j|| }| |dkt|tr|jdurt|jdkr|jt|j} | | |j j k|j | |jt|j|j|| t|j}| |dk|j d| } |j d| }|||| |t|}|j |d| d}|j|dkrtd|S)Nrsize_t *unsigned char[]zEncryption/decryption failed.)r _RSAPublicKeyr!ZEVP_PKEY_encrypt_initZEVP_PKEY_encryptZEVP_PKEY_decrypt_initZEVP_PKEY_decryptEVP_PKEY_CTX_new _evp_pkey_ffiNULLopenssl_assertgcEVP_PKEY_CTX_freeEVP_PKEY_CTX_set_rsa_padding EVP_PKEY_sizer _evp_md_non_null_from_algorithmr, _algorithmEVP_PKEY_CTX_set_rsa_mgf1_mdZEVP_PKEY_CTX_set_rsa_oaep_mdZ_labellenZOPENSSL_mallocZmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelnewbufferERR_clear_errorr )rrr&r1r'initZcryptpkey_ctxresZbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufresbufr"r"r#r0dsX        r0%typing.Optional[hashes.HashAlgorithm])rrr' algorithmrcCst|tstd|j|j}||dkt|trB|jj}nnt|t rt|j t sdt dt jt|tjsxtd||jddkrtd|jj}nt |jdt j|S)Nz'Expected provider of AsymmetricPadding.rr(z*Expected instance of hashes.HashAlgorithm.zDDigest too large for key size. Use a larger key or different digest.r))rr r*r!r?r8r;rr+r r,r rrr-r HashAlgorithmrr ZRSA_PKCS1_PSS_PADDINGr/r.)rrr'rNZ pkey_sizer1r"r"r#_rsa_sig_determine_paddings0        rQz+typing.Union[_RSAPublicKey, _RSAPrivateKey]z"typing.Callable[[typing.Any], int])rr'rNr init_funcc CsNt||||}|j|j|jj}|||jjk|j||jj}||}|dkrh| }t d||dur| |} |j || }|dkr| t d|jtj|j||}|dkr| t d|jtjt|trJt|tjsJ|j|t||||}||dk| |jj} |j|| }||dk|S)Nr3z#Unable to sign/verify with this keyrz4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rQr!r7r8r9r:r;r<r=_consume_errorsr r@ZEVP_PKEY_CTX_set_signature_mdrformatr/rZUNSUPPORTED_HASHr>r.rr rrPZ EVP_PKEY_CTX_set_rsa_pss_saltlenr$r,rArB) rr'rNrrRr1rHrIerrorsZevp_mdrJr"r"r#_rsa_sig_setupsR    rV_RSAPrivateKey)rr'rN private_keyr&rc Cst|||||jj}|jd}|j||jj||t|}||dk|jd|d}|j||||t|}|dkr| } t d| |j |ddS)Nr4r3r5rzuDigest or salt length too long for key size. Use a larger key or shorter salt length if you are specifying a PSS salt) rVr!ZEVP_PKEY_sign_initr9rDZ EVP_PKEY_signr:rCr;rSr rE) rr'rNrXr&rHbuflenrIrKrUr"r"r# _rsa_sig_sign s* rZr6None)rr'rN public_key signaturer&rcCsVt|||||jj}|j||t||t|}||dk|dkrR|tdS)Nr)rVr!ZEVP_PKEY_verify_initZEVP_PKEY_verifyrCr;rSr)rr'rNr\r]r&rHrIr"r"r#_rsa_sig_verify,sr^)rr'rNr\r]rc Cst|||||jj}|j|j}||dk|jd|}|jd|}|j||||t |} |j |d|d} |j | dkrt | S)Nrr5r4r3) rVr!ZEVP_PKEY_verify_recover_initr?r8r;r9rDZEVP_PKEY_verify_recoverrCrErFr) rr'rNr\r]rHmaxlenrKrYrIrLr"r"r#_rsa_sig_recoverGs&  r`c@seZdZUded<ded<ded<dddd d Zd d d dZd d ddZedd ddZddddddZ dd ddZ dd ddZ ddd dd!d"d#Z ddd$dd%d&d'Z d(S))rWobjectr8 _rsa_cdatar _key_sizerbool)runsafe_skip_rsa_key_validationc CsD|s|j|}|dkr*|}td||jd}|jd}|j|||||d|jjk||d|jjk|j |d} |j |d} | dks| dkr|}td|||_ ||_ ||_ d|_ t|_|j jd} |j j|j | |j jj|j jj|j | d|j jjk|j j| d|_dS)Nr3zInvalid private key BIGNUM **rF)r!Z RSA_check_keyrSr r9rDRSA_get0_factorsr;r:Z BN_is_odd_backendrbr8_blinded threadingLock_blinding_lock RSA_get0_key BN_num_bitsrc) selfr rsa_cdataevp_pkeyrerIrUpqZp_oddZq_oddnr"r"r#__init__ps:      z_RSAPrivateKey.__init__r[rcCs8|js4|j|Wdn1s*0YdSN)rirl_non_threadsafe_enable_blindingror"r"r#_enable_blindingsz_RSAPrivateKey._enable_blindingcCs8|js4|jj|j|jjj}|j|dkd|_dS)Nr3T)rirhr!ZRSA_blinding_onrbr9r:r;)rorIr"r"r#rxs  z._RSAPrivateKey._non_threadsafe_enable_blindingcCs|jSrwrcryr"r"r#key_sizesz_RSAPrivateKey.key_sizer%r ) ciphertextr'rcCs:||jdd}|t|kr*tdt|j|||S)Nz,Ciphertext length must be equal to key size.)rzr|rCr r2rh)ror}r'Zkey_size_bytesr"r"r#decrypts  z_RSAPrivateKey.decryptrcCsV|jj|j}|j||jjjk|jj||jjj}|j |}t |j||Srw) rhr!ZRSAPublicKey_duprbr;r9r:r<ZRSA_freeZ_rsa_cdata_to_evp_pkeyr6)roctxrqr"r"r#r\s  z_RSAPrivateKey.public_keyrc Cs|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jj|j||||j|d|jjjk|j|d|jjjk|j|d|jjjk|jj|j|||j|d|jjjk|j|d|jjjk|jj |j||||j|d|jjjk|j|d|jjjk|j|d|jjjkt |j |d|j |d|j |d|j |d|j |d|j |dt |j |d|j |dddS)Nrfrert)rrrsddmp1dmq1iqmppublic_numbers) rhr9rDr!rmrbr;r:rgZRSA_get0_crt_paramsr _bn_to_intr) rortrrrrrsrrrr"r"r#private_numberssB z_RSAPrivateKey.private_numbersserialization.Encodingzserialization.PrivateFormatz(serialization.KeySerializationEncryption)encodingrTencryption_algorithmrcCs|j|||||j|jSrw)rhZ_private_key_bytesr8rb)rorrTrr"r"r# private_bytessz_RSAPrivateKey.private_bytes8typing.Union[asym_utils.Prehashed, hashes.HashAlgorithm])r&r'rNrcCs(|t||\}}t|j||||Srw)rzrrZrh)ror&r'rNr"r"r#signsz_RSAPrivateKey.signN)__name__ __module__ __qualname____annotations__rurzrxpropertyr|rr\rrrr"r"r"r#rWks 1 #c@seZdZUded<ded<ded<dddd Zedd d d Zdd dddZddddddZdd ddZ ddddddZ dddddd d!d"Z ddd#dd$d%d&Z d'S)(r6rar8rbrrcr)rcCst||_||_||_|jjd}|jj|j||jjj|jjj|j|d|jjjk|jj |d|_ dS)Nrfr) rhrbr8r9rDr!rmr:r;rnrc)rorrprqrtr"r"r#ru sz_RSAPublicKey.__init__rvcCs|jSrwr{ryr"r"r#r|sz_RSAPublicKey.key_sizerd)otherrcCs&t|tstS|jj|j|jdkS)Nr3)rr6NotImplementedrhr!Z EVP_PKEY_cmpr8)rorr"r"r#__eq__s  z_RSAPublicKey.__eq__r%r ) plaintextr'rcCst|j|||Srw)r2rh)rorr'r"r"r#encrypt%sz_RSAPublicKey.encryptrcCs|jjd}|jjd}|jj|j|||jjj|j|d|jjjk|j|d|jjjkt|j |d|j |ddS)Nrfrr) rhr9rDr!rmrbr:r;rr)rortrr"r"r#r(sz_RSAPublicKey.public_numbersrzserialization.PublicFormat)rrTrcCs|j||||j|jSrw)rhZ_public_key_bytesr8rb)rorrTr"r"r# public_bytes5sz_RSAPublicKey.public_bytesrr[)r]r&r'rNrcCs&t||\}}t|j|||||dSrw)rr^rh)ror]r&r'rNr"r"r#verify>sz_RSAPublicKey.verifyrM)r]r'rNrcCs&t|tjrtdt|j||||S)NzoPrehashed is only supported in the sign and verify methods. It cannot be used with recover_data_from_signature.)r asym_utilsZ Prehashedr*r`rh)ror]r'rNr"r"r#recover_data_from_signatureJs  z)_RSAPublicKey.recover_data_from_signatureN) rrrrrurr|rrrrrrr"r"r"r#r6s     ),Z __future__rrjtypingZcryptography.exceptionsrrrZ*cryptography.hazmat.backends.openssl.utilsrZcryptography.hazmat.primitivesrrZ)cryptography.hazmat.primitives.asymmetricr rZ1cryptography.hazmat.primitives.asymmetric.paddingr r r r rrrrrZ-cryptography.hazmat.primitives.asymmetric.rsarrrr TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendrr$r2r0rQrVrZr^r`rWr6r"r"r"r#s*   ,  $C05 $