3 L]eF@sLddlmZmZmZddlZddlmZddlmZm Z m Z ddl m Z m Z mZddlmZddlmZmZmZddlmZmZmZmZmZmZdd lmZmZd d Zd d Z ddZ!ddZ"ddZ#ddZ$ddZ%ddZ&ej'eGddde(Z)ej'eGddde(Z*ej'eGddde(Z+ej'eGd d!d!e(Z,dS)")absolute_importdivisionprint_functionN)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashes)AsymmetricSignatureContextAsymmetricVerificationContextrsa)AsymmetricPaddingMGF1OAEPPKCS1v15PSScalculate_max_pss_salt_length)RSAPrivateKeyWithSerializationRSAPublicKeyWithSerializationcCs,|j}|tjks|tjkr$t||S|SdS)N)Z _salt_lengthrZ MAX_LENGTHrr)ZpsskeyZhash_algorithmZsaltrR/tmp/pip-install-wfra5znf/cryptography/cryptography/hazmat/backends/openssl/rsa.py_get_rsa_pss_salt_lengths rcCst|tstdt|tr&|jj}nVt|trh|jj}t|jt sPt dt j |j |s|t dt jnt dj|jt jt|||||S)Nz1Padding must be an instance of AsymmetricPadding.z'Only MGF1 is supported by this backend.zPThis combination of padding and hash algorithm is not supported by this backend.z${} is not supported by this backend.) isinstancer TypeErrorr_libRSA_PKCS1_PADDINGrZRSA_PKCS1_OAEP_PADDING_mgfrrrUNSUPPORTED_MGFZrsa_padding_supportedUNSUPPORTED_PADDINGformatname_enc_dec_rsa_pkey_ctx)backendrdatapadding padding_enumrrr _enc_dec_rsa&s&       r*cCst|tr|jj}|jj}n|jj}|jj}|jj|j|j j }|j ||j j k|j j ||jj }||}|j |dk|jj||}|j |dk|jj|j} |j | dkt|to|jjr|j|jj} |jj|| }|j |dk|j|j} |jj|| }|j |dkt|tr|jdk rt|jdkr|jjt|j} |j | |j j k|j j| |jt|j|jj|| t|j}|j |dk|j jd| } |j jd| }|||| |t|}|dkrt|||j j|d| dS)Nrzsize_t *zunsigned char[])r _RSAPublicKeyrZEVP_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_mallocmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelnew_handle_rsa_enc_dec_errorbuffer)r&rr'r)r(initZcryptpkey_ctxresbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufrrrr%GsP          r%cCs|j}|j||j|dj|jjkt|trV|j|dj|jjkt dnN|jj |jj |jj |jj g}|jjr|j|jj|j|dj|kt ddS)NrzGData too long for key size. Encrypt less data or use a larger key size.zDecryption failed.)_consume_errorsr1libr ERR_LIB_RSArr,reason!RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE ValueErrorZRSA_R_BLOCK_TYPE_IS_NOT_01ZRSA_R_BLOCK_TYPE_IS_NOT_02ZRSA_R_OAEP_DECODING_ERRORZ RSA_R_DATA_TOO_LARGE_FOR_MODULUSZ*Cryptography_HAS_RSA_R_PKCS_DECODING_ERRORappendZRSA_R_PKCS_DECODING_ERROR)r&rerrorsZdecoding_errorsrrrr<s    r<cCst|tstd|jj|j}|j|dkt|trB|jj}nZt|t rt|j t sdt dt j||jddkr~td|jj}nt dj|jt j|S)Nz'Expected provider of AsymmetricPadding.rz'Only MGF1 is supported by this backend.zDDigest too large for key size. Use a larger key or different digest.z${} is not supported by this backend.)rrrrr5r.r1rrrr rrrr! digest_sizerIZRSA_PKCS1_PSS_PADDINGr#r$r")r&rr( algorithmZ pkey_sizer)rrr_rsa_sig_determine_paddings$       rOc Cst||||}|j|}|jj|j|jj}|j||jjk|jj||jj }||} |j| dk|jj ||} | dkr|j t dj |jtj|jj||} |j| dkt|tr|jj|t|||} |j| dk|j|jj} |jj|| } |j| dk|S)Nr+rz4{} is not supported by this backend for RSA signing.)rOr6rr-r.r/r0r1r2r3ZEVP_PKEY_CTX_set_signature_mdrDrr#r$rZUNSUPPORTED_HASHr4rrZ EVP_PKEY_CTX_set_rsa_pss_saltlenrr r7r8) r&r(rNrr'Z init_funcr)Zevp_mdr?r@rBrrr_rsa_sig_setups2   rPc Cst||||||jj}|jjd}|jj||jj||t|}|j|dk|jjd|d}|jj||||t|}|dkr|j } |j| dj |jj k| dj |jj krd} n|j| dj |jjkd} t| |jj|ddS)Nzsize_t *r+zunsigned char[]rz@Salt length too long for key size. Try using MAX_LENGTH instead.z0Digest too large for key size. Use a larger key.)rPrZEVP_PKEY_sign_initr/r;Z EVP_PKEY_signr0r9r1rDrErFrGrHZ RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYrIr=) r&r(rN private_keyr'r?buflenr@rCrKrGrrr _rsa_sig_signs4      rScCsXt||||||jj}|jj||t||t|}|j|dk|dkrT|jtdS)Nr)rPrZEVP_PKEY_verify_initZEVP_PKEY_verifyr9r1rDr)r&r(rN public_key signaturer'r?r@rrr_rsa_sig_verifys  rVc@s$eZdZddZddZddZdS)_RSASignatureContextcCs<||_||_t||||||_||_tj|j|j|_dS)N)_backend _private_keyrO_paddingr7r Hash _hash_ctx)selfr&rQr(rNrrr__init__s z_RSASignatureContext.__init__cCs|jj|dS)N)r\update)r]r'rrrr_!sz_RSASignatureContext.updatecCst|j|j|j|j|jjS)N)rSrXrZr7rYr\finalize)r]rrrr`$s z_RSASignatureContext.finalizeN)__name__ __module__ __qualname__r^r_r`rrrrrWs rWc@s$eZdZddZddZddZdS)_RSAVerificationContextcCsF||_||_||_||_t|||||}||_tj|j|j|_dS)N) rX _public_key _signaturerZrOr7r r[r\)r]r&rTrUr(rNrrrr^0sz _RSAVerificationContext.__init__cCs|jj|dS)N)r\r_)r]r'rrrr_>sz_RSAVerificationContext.updatecCs"t|j|j|j|j|j|jjS)N)rVrXrZr7rerfr\r`)r]rrrverifyAsz_RSAVerificationContext.verifyN)rarbrcr^r_rgrrrrrd.srdc@sNeZdZddZejdZddZddZdd Z d d Z d d Z ddZ dS)_RSAPrivateKeycCst||_||_||_|jjjd}|jjj|j||jjj|jjj|jj|d|jjjk|jjj |d|_ dS)Nz BIGNUM **r) rX _rsa_cdatar.r/r;r RSA_get0_keyr0r1 BN_num_bits _key_size)r]r& rsa_cdataevp_pkeynrrrr^Ns z_RSAPrivateKey.__init__rlcCstt|t|j|||S)N)r r rWrX)r]r(rNrrrsigner]sz_RSAPrivateKey.signercCs8ttj|jd}|t|kr(tdt|j|||S)Ng @z,Ciphertext length must be equal to key size.)intmathceilkey_sizer9rIr*rX)r]Z ciphertextr(Zkey_size_bytesrrrdecryptbs z_RSAPrivateKey.decryptcCs||jjj|j}|jj||jjjk|jjj||jjj}|jjj ||jjj}|jj|dk|jj |}t |j||S)Nr+) rXrZRSAPublicKey_duprir1r/r0r2ZRSA_freeZRSA_blinding_onZ_rsa_cdata_to_evp_pkeyr,)r]ctxr@rnrrrrTis z_RSAPrivateKey.public_keyc Cs|jjjd}|jjjd}|jjjd}|jjjd}|jjjd}|jjjd}|jjjd}|jjjd}|jjj|j||||jj|d|jjjk|jj|d|jjjk|jj|d|jjjk|jjj|j|||jj|d|jjjk|jj|d|jjjk|jjj |j||||jj|d|jjjk|jj|d|jjjk|jj|d|jjjkt j |jj |d|jj |d|jj |d|jj |d|jj |d|jj |dt j |jj |d|jj |dddS)Nz BIGNUM **r)ero)pqddmp1dmq1iqmppublic_numbers)rXr/r;rrjrir1r0ZRSA_get0_factorsZRSA_get0_crt_paramsrZRSAPrivateNumbers _bn_to_intRSAPublicNumbers) r]rorwrzrxryr{r|r}rrrprivate_numbersrs<z_RSAPrivateKey.private_numberscCs|jj||||j|jS)N)rXZ_private_key_bytesr.ri)r]encodingr#Zencryption_algorithmrrr private_bytess z_RSAPrivateKey.private_bytescCs$t|j||\}}t|j||||S)N)r rXrS)r]r'r(rNrrrsignsz_RSAPrivateKey.signN) rarbrcr^rread_only_propertyrtrprurTrrrrrrrrhLs  # rhc@sFeZdZddZejdZddZddZdd Z d d Z d d Z dS)r,cCst||_||_||_|jjjd}|jjj|j||jjj|jjj|jj|d|jjjk|jjj |d|_ dS)Nz BIGNUM **r) rXrir.r/r;rrjr0r1rkrl)r]r&rmrnrorrrr^s z_RSAPublicKey.__init__rlcCs,ttjd|t|t|j||||S)NrU)r r _check_bytesr rdrX)r]rUr(rNrrrverifiers  z_RSAPublicKey.verifiercCst|j|||S)N)r*rX)r] plaintextr(rrrencryptsz_RSAPublicKey.encryptcCs|jjjd}|jjjd}|jjj|j|||jjj|jj|d|jjjk|jj|d|jjjktj |jj |d|jj |ddS)Nz BIGNUM **r)rwro) rXr/r;rrjrir0r1rrr)r]rorwrrrr~sz_RSAPublicKey.public_numberscCs|jj||||j|jS)N)rXZ_public_key_bytesr.ri)r]rr#rrr public_bytess z_RSAPublicKey.public_bytescCs&t|j||\}}t|j|||||S)N)r rXrV)r]rUr'r(rNrrrrgsz_RSAPublicKey.verifyN) rarbrcr^rrrtrrr~rrgrrrrr,s    r,)- __future__rrrrrZ cryptographyrZcryptography.exceptionsrrrZ*cryptography.hazmat.backends.openssl.utilsr r r Zcryptography.hazmat.primitivesr Z)cryptography.hazmat.primitives.asymmetricr rrZ1cryptography.hazmat.primitives.asymmetric.paddingrrrrrrZ-cryptography.hazmat.primitives.asymmetric.rsarrrr*r%r<rOrPrSrVZregister_interfaceobjectrWrdrhr,rrrrs0    !8 !%X