a hS@sZddlZddlmZddlmZmZmZddlmZm Z m Z ddl m Z m Z ddlmZmZmZddlmZmZmZmZmZmZddlmZmZmZmZeejeefe je d d d Z!ejd e"ee"d ddZ#ejd e"e ee"dddZ$ddZ%ddZ&ddZ'ddZ(ddZ)GdddeZ*Gdd d eZ+Gd!d"d"eZ,Gd#d$d$eZ-dS)%N)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashes serialization)AsymmetricSignatureContextAsymmetricVerificationContextr)AsymmetricPaddingMGF1OAEPPKCS1v15PSScalculate_max_pss_salt_length) RSAPrivateKeyRSAPrivateNumbers RSAPublicKeyRSAPublicNumbers)psskeyhash_algorithmreturncCs,|j}|tjus|tjur$t||S|SdSN)Z _salt_lengthrZ MAX_LENGTHrr)rrrZsaltrN/usr/lib64/python3.9/site-packages/cryptography/hazmat/backends/openssl/rsa.py_get_rsa_pss_salt_length)s r)_RSAPrivateKey _RSAPublicKey)rdatapaddingrcCst|tstdt|tr&|jj}nVt|trh|jj}t|jt sPt dt j | |s|t dt jnt d|jt 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.) isinstancer TypeErrorr_libRSA_PKCS1_PADDINGrZRSA_PKCS1_OAEP_PADDING_mgfrrrUNSUPPORTED_MGFZrsa_padding_supportedUNSUPPORTED_PADDINGformatname_enc_dec_rsa_pkey_ctx)backendrr!r" padding_enumrrr _enc_dec_rsa6s*       r1)rr!r0r"rcCs t|tr|jj}|jj}n|jj}|jj}|j|j|j j }| ||j j k|j ||jj }||}| |dk|j||}| |dk|j|j} | | dkt|tr|jjr||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%r r'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_sizerZCryptography_HAS_RSA_OAEP_MD_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_error ValueError)r/rr!r0r"initZcryptpkey_ctxresZbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufresbufrrrr.ZsX       r.cCst|tstd|j|j}||dkt|trB|jj}nnt|t rt|j t sdt dt jt|tjsxtd||jddkrtd|jj}nt d|jt 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$)r%r r&r'r=r6r9rr(rr)rrrr*r HashAlgorithmZ digest_sizerEZRSA_PKCS1_PSS_PADDINGr,r-r+)r/rr" algorithmZ pkey_sizer0rrr_rsa_sig_determine_paddings0        rOc Cs<t||||}|j|j|jj}|||jjk|j||jj}||}|dkrh| }t d||dur| |} |j || }|dkr| t d|jtj|j||}|dkr| t d|jtjt|tr8|j|t|||}||dk| |jj} |j|| }||dk|S)Nr2z#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.)rOr'r5r6r7r8r9r:r;_consume_errorsrEr>ZEVP_PKEY_CTX_set_signature_mdrr,r-rZUNSUPPORTED_HASHr<r+r%rZ EVP_PKEY_CTX_set_rsa_pss_saltlenrr)r?r@) r/r"rNrZ init_funcr0rGrHerrorsZevp_mdrIrrr_rsa_sig_setupsN    rRc Cst|||||jj}|jd}|j||jj||t|}||dk|jd|d}|j||||t|}|dkr| } t d| |j |ddS)Nr3r2r4rzuDigest or salt length too long for key size. Use a larger key or shorter salt length if you are specifying a PSS salt) rRr'ZEVP_PKEY_sign_initr7rBZ EVP_PKEY_signr8rAr9_consume_errors_with_textrErC) r/r"rN private_keyr!rGbuflenrHrJrQrrr _rsa_sig_signs* rVcCsVt|||||jj}|j||t||t|}||dk|dkrR|tdS)Nr)rRr'ZEVP_PKEY_verify_initZEVP_PKEY_verifyrAr9rPr)r/r"rN public_key signaturer!rGrHrrr_rsa_sig_verify srYc Cst|||||jj}|j|j}||dk|jd|}|jd|}|j||||t |} |j |d|d} |j | dkrt | S)Nrr4r3r2) rRr'ZEVP_PKEY_verify_recover_initr=r6r9r7rBZEVP_PKEY_verify_recoverrArCrDr) r/r"rNrWrXrGmaxlenrJrUrHrKrrr_rsa_sig_recover!s&  r[c@s>eZdZeeejdddZeddddZ edd d Z dS) _RSASignatureContext)rTr"rNcCs<||_||_t||||||_||_t|j|j|_dSr)_backend _private_keyrO_paddingr?r Hash _hash_ctx)selfr/rTr"rNrrr__init__@s z_RSASignatureContext.__init__Nr!rcCs|j|dSrraupdaterbr!rrrrfRsz_RSASignatureContext.updatercCst|j|j|j|j|jSr)rVr]r_r?r^rafinalizerbrrrriUsz_RSASignatureContext.finalize) __name__ __module__ __qualname__rr r rMrcbytesrfrirrrrr\?s  r\c@s@eZdZeeeejdddZeddddZ ddd d Z dS) _RSAVerificationContext)rWrXr"rNcCsF||_||_||_||_t|||||}||_t|j|j|_dSr) r] _public_key _signaturer_rOr?r r`ra)rbr/rWrXr"rNrrrrc`sz _RSAVerificationContext.__init__NrdcCs|j|dSrrergrrrrfusz_RSAVerificationContext.updaterhcCs"t|j|j|j|j|j|jSr)rYr]r_r?rprqrarirjrrrverifyxsz_RSAVerificationContext.verify) rkrlrmrrnr r rMrcrfrrrrrrro_s roc@seZdZddZedZeej e dddZ e ee ddd Z ed d d Zed d dZejejeje dddZe eejejej fe dddZdS)rcCs|s*|j|}|dkr*|}td||j||jj}||dk||_||_ ||_ |jj d}|jj |j ||jjj|jjj|j|d|jjjk|jj |d|_dS)Nr2zInvalid private key BIGNUM **r)r'Z RSA_check_keyrSrEZRSA_blinding_onr7r8r9r] _rsa_cdatar6rB RSA_get0_key BN_num_bits _key_size)rbr/ rsa_cdataevp_pkeyZ_skip_check_keyrHrQnrrrrcs&  z_RSAPrivateKey.__init__rw)r"rNrcCstt|t|j|||Sr)rrr\r])rbr"rNrrrsignersz_RSAPrivateKey.signer) ciphertextr"rcCs2|jdd}|t|kr"tdt|j|||S)Nz,Ciphertext length must be equal to key size.)key_sizerArEr1r])rbr|r"Zkey_size_bytesrrrdecrypts z_RSAPrivateKey.decryptrhcCsV|jj|j}|j||jjjk|jj||jjj}|j |}t |j||Sr) r]r'ZRSAPublicKey_duprtr9r7r8r:ZRSA_freeZ_rsa_cdata_to_evp_pkeyr )rbctxryrrrrWs  z_RSAPrivateKey.public_keyc 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)Nrsrerz)pqddmp1dmq1iqmppublic_numbers) r]r7rBr'rurtr9r8ZRSA_get0_factorsZRSA_get0_crt_paramsr _bn_to_intr) rbrzrrrrrrrrrrprivate_numberssB z_RSAPrivateKey.private_numbers)encodingr,encryption_algorithmrcCs|j|||||j|jSr)r]Z_private_key_bytesr6rt)rbrr,rrrr private_bytessz_RSAPrivateKey.private_bytes)r!r"rNrcCs$t|j||\}}t|j||||Sr)rr]rV)rbr!r"rNrrrsignsz_RSAPrivateKey.signN)rkrlrmrcrread_only_propertyrr r rMr r{rnrrrWrrr EncodingZ PrivateFormatZKeySerializationEncryptionrtypingUnion asym_utils Prehashedrrrrrrs$  % rc@seZdZddZedZeee j e dddZ eeeddd Z ed d d Zejejed ddZeeeejeje j fddddZeeeje j edddZdS)r cCst||_||_||_|jjd}|jj|j||jjj|jjj|j|d|jjjk|jj |d|_ dS)Nrsr) r]rtr6r7rBr'rur8r9rvrw)rbr/rxryrzrrrrcsz_RSAPublicKey.__init__rw)rXr"rNrcCs,ttd|t|t|j||||S)NrX)rr _check_bytesrror]rbrXr"rNrrrverifier s   z_RSAPublicKey.verifier) plaintextr"rcCst|j|||Sr)r1r])rbrr"rrrencryptsz_RSAPublicKey.encryptrhcCs|jjd}|jjd}|jj|j|||jjj|j|d|jjjk|j|d|jjjkt|j |d|j |ddS)Nrsrr) r]r7rBr'rurtr8r9rr)rbrzrrrrrsz_RSAPublicKey.public_numbers)rr,rcCs|j||||j|jSr)r]Z_public_key_bytesr6rt)rbrr,rrr public_bytes(sz_RSAPublicKey.public_bytesN)rXr!r"rNrcCs&t|j||\}}t|j|||||Sr)rr]rY)rbrXr!r"rNrrrrr1s z_RSAPublicKey.verifycCst|t|j||||Sr)rr[r]rrrrrecover_data_from_signature?s z)_RSAPublicKey.recover_data_from_signature)rkrlrmrcrrrrnr r rMr rrrrr rZ PublicFormatrrrrrrrOptionalrrrrrr s0     r ).rZ cryptographyrZcryptography.exceptionsrrrZ*cryptography.hazmat.backends.openssl.utilsrrrZcryptography.hazmat.primitivesr r Z)cryptography.hazmat.primitives.asymmetricr r rZ1cryptography.hazmat.primitives.asymmetric.paddingr rrrrrZ-cryptography.hazmat.primitives.asymmetric.rsarrrrrrMintrrnr1r.rOrRrVrYr[r\rorr rrrrs@      & A+- $u