a ‚oeAUã@sŒddlmZddlZddlZddlmZmZmZddlm Z ddl m Z m Z ddl mZddlmZmZmZmZmZmZmZmZmZddlmZmZmZmZejr®dd l m!Z!d d d d ddœdd„Z"d dddddœdd„Z#d ddddddœdd„Z$d dddddœdd„Z%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$eƒZ*Gd1d(„d(eƒZ+dS)2é)Ú annotationsN)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithm)ÚhashesÚ serialization)Úutils) ÚMGF1ÚOAEPÚPSSÚAsymmetricPaddingÚPKCS1v15Ú_AutoÚ _DigestLengthÚ _MaxLengthÚcalculate_max_pss_salt_length)Ú RSAPrivateKeyÚRSAPrivateNumbersÚ RSAPublicKeyÚRSAPublicNumbers)ÚBackendrr z)typing.Union[RSAPrivateKey, RSAPublicKey]zhashes.HashAlgorithmÚint)ÚbackendÚpssÚkeyÚhash_algorithmÚreturncCsV|j}t|tƒrt||ƒSt|tƒr*|jSt|tƒrNt|tƒrFtdƒ‚|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)rrrrZsalt©r"úIC:\Program Files\Certbot\pkgs\cryptography\hazmat\backends\openssl\rsa.pyÚ_get_rsa_pss_salt_length*s     ÿr$z+typing.Union[_RSAPrivateKey, _RSAPublicKey]Úbytesr )rrÚdataÚpaddingrcCsŒt|tƒstdƒ‚t|tƒr&|jj}nVt|tƒrh|jj}t|jt ƒsPt dt j ƒ‚|  |¡s|t dt jƒ‚nt |j›d�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.)rr Ú TypeErrorrr!ÚRSA_PKCS1_PADDINGr ZRSA_PKCS1_OAEP_PADDINGÚ_mgfr rrÚUNSUPPORTED_MGFZrsa_padding_supportedÚUNSUPPORTED_PADDINGÚnameÚ_enc_dec_rsa_pkey_ctx)rrr&r'Ú padding_enumr"r"r#Ú _enc_dec_rsa@s*     þ ý þr2)rrr&r1r'rcCst|tƒr|jj}|jj}n|jj}|jj}|j |j|j j ¡}|  ||j j k¡|j   ||jj ¡}||ƒ}|  |dk¡|j ||¡}|  |dk¡|j |j¡} |  | dk¡t|tƒ�r| |jj¡} |j || ¡}|  |dk¡| |j¡} |j || ¡}|  |dk¡t|tƒ�r˜|jdu�r˜t|jƒdk�r˜|j t|jƒ¡} |  | |j j k¡|j  | |jt|jƒ¡|j || t|jƒ¡}|  |dk¡|j  d| ¡} |j  d| ¡}|||| |t|ƒƒ}|j  |¡d| d…}|j ¡|dk�rütdƒ‚|S)Nérúsize_t *úunsigned char[]zEncryption/decryption failed.)rÚ _RSAPublicKeyr!ZEVP_PKEY_encrypt_initZEVP_PKEY_encryptZEVP_PKEY_decrypt_initZEVP_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 Ú_evp_md_non_null_from_algorithmr,Ú _algorithmÚEVP_PKEY_CTX_set_rsa_mgf1_mdZEVP_PKEY_CTX_set_rsa_oaep_mdZ_labelÚlenZOPENSSL_mallocZmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelÚnewÚbufferÚERR_clear_errorr )rrr&r1r'ÚinitZcryptÚpkey_ctxÚresZbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufÚresbufr"r"r#r0dsX   ÿ ÿþ ý ÿ  r0ú%typing.Optional[hashes.HashAlgorithm])rrr'Ú algorithmrcCs´t|tƒstdƒ‚|j |j¡}| |dk¡t|tƒrB|jj}nnt|t ƒrœt|j t ƒsdt dt jƒ‚t|tjƒsxtdƒ‚||jddkr’tdƒ‚|jj}nt |j›d�t 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_padding§s0     þ ÿ  þ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 |j¡tjƒ‚|j ||¡}|dkrÞ|  ¡t d |j¡tjƒ‚t|tƒ�rJt|tjƒsúJ‚|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_mdrÚformatr/rZUNSUPPORTED_HASHr>r.rr rrPZ EVP_PKEY_CTX_set_rsa_pss_saltlenr$r,rArB) rr'rNrrRr1rHrIÚerrorsZevp_mdrJr"r"r#Ú_rsa_sig_setup×sR  ÿüÿü  þÿrVÚ_RSAPrivateKey)rr'rNÚ private_keyr&rc Cs¢t|||||jjƒ}|j d¡}|j ||jj||t|ƒ¡}| |dk¡|j d|d¡}|j ||||t|ƒ¡}|dkrŽ|  ¡} t d| ƒ‚|j  |¡dd…S)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&rHÚbuflenrIrKrUr"r"r#Ú _rsa_sig_sign s*û ÿýrZr6ÚNone)rr'rNÚ public_keyÚ signaturer&rcCsVt|||||jjƒ}|j ||t|ƒ|t|ƒ¡}| |dk¡|dkrR| ¡t‚dS)Nr)rVr!ZEVP_PKEY_verify_initZEVP_PKEY_verifyrCr;rSr)rr'rNr\r]r&rHrIr"r"r#Ú_rsa_sig_verify,sûÿr^)rr'rNr\r]rc Cs–t|||||jjƒ}|j |j¡}| |dk¡|j d|¡}|j d|¡}|j ||||t |ƒ¡} |j  |¡d|d…} |j  ¡| dkr’t ‚| S)Nrr5r4r3) rVr!ZEVP_PKEY_verify_recover_initr?r8r;r9rDZEVP_PKEY_verify_recoverrCrErFr) rr'rNr\r]rHÚmaxlenrKrYrIrLr"r"r#Ú_rsa_sig_recoverGs&û ÿ r`c@sºeZdZUded<ded<ded<dddœd d „Zd d œd d„Zd d œdd„Zedd œdd„ƒZddddœdd„Z dd œdd„Z dd œdd„Z ddd dd!œd"d#„Z ddd$dd%œd&d'„Z d(S))rWÚobjectr8Ú _rsa_cdatarÚ _key_sizerÚbool)rÚunsafe_skip_rsa_key_validationc CsD|sÀ|j |¡}|dkr*| ¡}td|ƒ‚|j d¡}|j d¡}|j |||¡| |d|jjk¡| |d|jjk¡|j  |d¡} |j  |d¡} | dks®| dkrÀ| ¡}td|ƒ‚||_ ||_ ||_ d|_ t ¡|_|j j d¡} |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 r9rDÚRSA_get0_factorsr;r:Z BN_is_oddÚ_backendrbr8Ú_blindedÚ threadingÚLockÚ_blinding_lockÚ RSA_get0_keyÚ BN_num_bitsrc) ÚselfrÚ rsa_cdataÚevp_pkeyrerIrUÚpÚqZp_oddZq_oddÚnr"r"r#Ú__init__ps:      üz_RSAPrivateKey.__init__r[©rcCs8|js4|j�| ¡Wdƒn1s*0YdS©N)rirlÚ_non_threadsafe_enable_blinding©ror"r"r#Ú_enable_blinding¡sz_RSAPrivateKey._enable_blindingcCs8|js4|jj |j|jjj¡}|j |dk¡d|_dS)Nr3T)rirhr!ZRSA_blinding_onrbr9r:r;)rorIr"r"r#rx¨s  ÿz._RSAPrivateKey._non_threadsafe_enable_blindingcCs|jSrw©rcryr"r"r#Úkey_size´sz_RSAPrivateKey.key_sizer%r )Ú ciphertextr'rcCs:| ¡|jdd}|t|ƒkr*tdƒ‚t|j|||ƒS)Nééz,Ciphertext length must be equal to key size.)rzr|rCr r2rh)ror}r'Zkey_size_bytesr"r"r#Údecrypt¸s  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)roÚctxrqr"r"r#r\Às  z_RSAPrivateKey.public_keyrc Csþ|jj d¡}|jj d¡}|jj d¡}|jj d¡}|jj d¡}|jj d¡}|jj d¡}|jj d¡}|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|jjjk¡t |j  |d¡|j  |d¡|j  |d¡|j  |d¡|j  |d¡|j  |d¡t |j  |d¡|j  |d¡d�d�S)Nrfr©Úert)rrrsÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers) rhr9rDr!rmrbr;r:rgZRSA_get0_crt_paramsrÚ _bn_to_intr) rortrƒr„rrrsr…r†r‡r"r"r#Úprivate_numbersÇsB ÿþùz_RSAPrivateKey.private_numbersúserialization.Encodingzserialization.PrivateFormatz(serialization.KeySerializationEncryption)ÚencodingrTÚencryption_algorithmrcCs|j |||||j|j¡Srw)rhZ_private_key_bytesr8rb)rorŒrTr�r"r"r#Ú private_bytesêsúz_RSAPrivateKey.private_bytesú8typing.Union[asym_utils.Prehashed, hashes.HashAlgorithm])r&r'rNrcCs(| ¡t||ƒ\}}t|j||||ƒSrw)rzrrZrh)ror&r'rNr"r"r#Úsignùsz_RSAPrivateKey.signN)Ú__name__Ú __module__Ú __qualname__Ú__annotations__rurzrxÚpropertyr|r€r\rŠrŽr�r"r"r"r#rWks 1 #c@s²eZdZUded<ded<ded<ddœdd „Zedd œd d „ƒZdd dœdd„Zddddœdd„Zdd œdd„Z ddddœdd„Z dddddd œd!d"„Z ddd#dd$œd%d&„Z d'S)(r6rar8rbrrcr)rcCst||_||_||_|jj d¡}|jj |j||jjj|jjj¡|j |d|jjjk¡|jj  |d¡|_ dS)Nrfr) rhrbr8r9rDr!rmr:r;rnrc)rorrprqrtr"r"r#ru süz_RSAPublicKey.__init__rvcCs|jSrwr{ryr"r"r#r|sz_RSAPublicKey.key_sizerd)ÚotherrcCs&t|tƒstS|jj |j|j¡dkS)Nr3)rr6ÚNotImplementedrhr!Z EVP_PKEY_cmpr8)ror–r"r"r#Ú__eq__s  ÿÿz_RSAPublicKey.__eq__r%r )Ú plaintextr'rcCst|j|||ƒSrw)r2rh)ror™r'r"r"r#Úencrypt%sz_RSAPublicKey.encryptrcCs�|jj d¡}|jj d¡}|jj |j|||jjj¡|j |d|jjjk¡|j |d|jjjk¡t|j  |d¡|j  |d¡d�S)Nrfrr‚) rhr9rDr!rmrbr:r;rr‰)rortrƒr"r"r#rˆ(sÿþz_RSAPublicKey.public_numbersr‹zserialization.PublicFormat)rŒrTrcCs|j ||||j|j¡Srw)rhZ_public_key_bytesr8rb)rorŒrTr"r"r#Ú public_bytes5sÿz_RSAPublicKey.public_bytesr�r[)r]r&r'rNrcCs&t||ƒ\}}t|j|||||ƒdSrw)rr^rh)ror]r&r'rNr"r"r#Úverify>sÿz_RSAPublicKey.verifyrM)r]r'rNrcCs&t|tjƒrtdƒ‚t|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) r‘r’r“r”rur•r|r˜ršrˆr›rœržr"r"r"r#r6s     ),Z __future__rrjÚtypingZcryptography.exceptionsrrrZ*cryptography.hazmat.backends.openssl.utilsrZcryptography.hazmat.primitivesrrZ)cryptography.hazmat.primitives.asymmetricr r�Z1cryptography.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 $