3 lá˜_âCã@s<ddlmZmZmZddlmZddlmZmZm Z ddl m Z m Z m Z ddlmZddlmZmZmZddlmZmZmZmZmZmZddlmZmZd d „Zd d „Zd d„Z dd„Z!dd„Z"dd„Z#dd„Z$ej%eƒGdd„de&ƒƒZ'ej%eƒGdd„de&ƒƒZ(ej%eƒGdd„de&ƒƒZ)ej%eƒGdd„de&ƒƒZ*dS) é)Úabsolute_importÚdivisionÚprint_function)Úutils)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithmÚ_check_not_prehashedÚ_warn_sign_verify_deprecated)Úhashes)ÚAsymmetricSignatureContextÚAsymmetricVerificationContextÚrsa)ÚAsymmetricPaddingÚMGF1ÚOAEPÚPKCS1v15ÚPSSÚcalculate_max_pss_salt_length)ÚRSAPrivateKeyWithSerializationÚRSAPublicKeyWithSerializationcCs,|j}|tjks|tjkr$t||ƒS|SdS)N)Z _salt_lengthrZ MAX_LENGTHrr)ZpssÚkeyZhash_algorithmZsalt©rú/usr/lib64/python3.6/rsa.pyÚ_get_rsa_pss_salt_length&s rcCsŒt|tƒstdƒ‚t|tƒr&|jj}nVt|tƒrh|jj}t|jt ƒsPt dt j ƒ‚|j |ƒs|t dt jƒ‚nt dj|jƒt jƒ‚t|||||ƒ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Ú_libÚRSA_PKCS1_PADDINGrZRSA_PKCS1_OAEP_PADDINGÚ_mgfrrrÚUNSUPPORTED_MGFZrsa_padding_supportedÚUNSUPPORTED_PADDINGÚformatÚnameÚ_enc_dec_rsa_pkey_ctx)ÚbackendrÚdataÚpaddingÚ padding_enumrrrÚ _enc_dec_rsa/s$        r*cCst|tƒr|jj}|jj}n|jj}|jj}|jj|j|j j ƒ}|j ||j j kƒ|j j ||jj ƒ}||ƒ}|j |dkƒ|jj||ƒ}|j |dkƒ|jj|jƒ} |j | dkƒt|tƒoÂ|jj�r|j|jjƒ} |jj|| ƒ}|j |dkƒ|j|jƒ} |jj|| ƒ}|j |dkƒt|tƒ�r |jdk �r t|jƒdk�r |jjt|jƒƒ} |j | |j j kƒ|j j| |jt|jƒƒ|jj|| t|jƒƒ}|j |dkƒ|j jd| ƒ} |j jd| ƒ}|||| |t|ƒƒ}|j j|ƒd| d…}|jjƒ|dk�rtdƒ‚|S)Nérzsize_t *zunsigned char[]zEncryption/decryption failed.) rÚ _RSAPublicKeyrZEVP_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_sizerZCryptography_HAS_RSA_OAEP_MDÚ_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ÚbufferZERR_clear_errorÚ ValueError)r&rr'r)r(ZinitZcryptÚpkey_ctxÚresZbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufZresbufrrrr%NsN        r%cCs t|tƒstdƒ‚|jj|jƒ}|j|dkƒt|tƒrB|jj}nZt|t ƒrˆt|j t ƒsdt dt jƒ‚||jddkr~tdƒ‚|jj}nt dj|jƒt 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!Z digest_sizer<ZRSA_PKCS1_PSS_PADDINGr#r$r")r&rr(Ú algorithmZ pkey_sizer)rrrÚ_rsa_sig_determine_padding‰s&       rCc Cst||||ƒ}|j|ƒ}|jj|j|jjƒ}|j||jjkƒ|jj||jj ƒ}||ƒ} |j| dkƒ|jj ||ƒ} | dkr˜|j ƒt dj |jƒtjƒ‚|jj||ƒ} |j| dkƒt|tƒ�r|jj|t|||ƒƒ} |j| dkƒ|j|jjƒ} |jj|| ƒ} |j| dkƒ|S)Nr+rz4{} is not supported by this backend for RSA signing.)rCr6rr-r.r/r0r1r2r3ZEVP_PKEY_CTX_set_signature_mdÚ_consume_errorsrr#r$rZUNSUPPORTED_HASHr4rrZ EVP_PKEY_CTX_set_rsa_pss_saltlenrr r7r8) r&r(rBrr'Z init_funcr)Zevp_mdr=r>r?rrrÚ_rsa_sig_setup«s2   rEc Cs¤t||||||jjƒ}|jjdƒ}|jj||jj||t|ƒƒ}|j|dkƒ|jjd|dƒ}|jj||||t|ƒƒ}|dkr�|j ƒ} t d| ƒ‚|jj |ƒdd…S)Nzsize_t *r+zunsigned char[]rzuDigest or salt length too long for key size. Use a larger key or shorter salt length if you are specifying a PSS salt) rErZEVP_PKEY_sign_initr/r:Z EVP_PKEY_signr0r9r1Ú_consume_errors_with_textr<r;) r&r(rBÚ private_keyr'r=Zbuflenr>r@ÚerrorsrrrÚ _rsa_sig_signÍs&  rIcCsXt||||||jjƒ}|jj||t|ƒ|t|ƒƒ}|j|dkƒ|dkrT|jƒt‚dS)Nr)rErZEVP_PKEY_verify_initZEVP_PKEY_verifyr9r1rDr)r&r(rBÚ public_keyÚ signaturer'r=r>rrrÚ_rsa_sig_verifyès rLc@s$eZdZdd„Zdd„Zdd„ZdS)Ú_RSASignatureContextcCs<||_||_t||||ƒ||_||_tj|j|jƒ|_dS)N)Ú_backendÚ _private_keyrCÚ_paddingr7r ÚHashÚ _hash_ctx)Úselfr&rGr(rBrrrÚ__init__ÿs z_RSASignatureContext.__init__cCs|jj|ƒdS)N)rRÚupdate)rSr'rrrrU sz_RSASignatureContext.updatecCst|j|j|j|j|jjƒƒS)N)rIrNrPr7rOrRÚfinalize)rSrrrrVs z_RSASignatureContext.finalizeN)Ú__name__Ú __module__Ú __qualname__rTrUrVrrrrrMýs rMc@s$eZdZdd„Zdd„Zdd„ZdS)Ú_RSAVerificationContextcCsF||_||_||_||_t||||ƒ|}||_tj|j|jƒ|_dS)N) rNÚ _public_keyÚ _signaturerPrCr7r rQrR)rSr&rJrKr(rBrrrrTsz _RSAVerificationContext.__init__cCs|jj|ƒdS)N)rRrU)rSr'rrrrU(sz_RSAVerificationContext.updatecCs"t|j|j|j|j|j|jjƒƒS)N)rLrNrPr7r[r\rRrV)rSrrrÚverify+sz_RSAVerificationContext.verifyN)rWrXrYrTrUr]rrrrrZsrZc@sNeZdZdd„ZejdƒZdd„Zdd„Zdd „Z d d „Z d d „Z dd„Z dS)Ú_RSAPrivateKeycCsº|jj|ƒ}|dkr&|jƒ}td|ƒ‚|jj||jjƒ}|j|dkƒ||_||_ ||_ |jjj dƒ}|jjj |j ||jjj|jjjƒ|jj|d|jjjkƒ|jjj |dƒ|_dS)Nr+zInvalid private keyz BIGNUM **r)rZ RSA_check_keyrFr<ZRSA_blinding_onr/r0r1rNÚ _rsa_cdatar.r:Ú RSA_get0_keyÚ BN_num_bitsÚ _key_size)rSr&Ú rsa_cdataÚevp_pkeyr>rHÚnrrrrT8s"   z_RSAPrivateKey.__init__rbcCstƒt|ƒt|j|||ƒS)N)r r rMrN)rSr(rBrrrÚsignerSsz_RSAPrivateKey.signercCs2|jdd}|t|ƒkr"tdƒ‚t|j|||ƒS)Nééz,Ciphertext length must be equal to key size.)Úkey_sizer9r<r*rN)rSZ ciphertextr(Zkey_size_bytesrrrÚdecryptXs z_RSAPrivateKey.decryptcCsV|jjj|jƒ}|jj||jjjkƒ|jjj||jjjƒ}|jj |ƒ}t |j||ƒS)N) rNrZRSAPublicKey_dupr_r1r/r0r2ZRSA_freeZ_rsa_cdata_to_evp_pkeyr,)rSZctxrdrrrrJ_s  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|jjjkƒt j |jj |dƒ|jj |dƒ|jj |dƒ|jj |dƒ|jj |dƒ|jj |dƒt j |jj |dƒ|jj |dƒd�d�S)Nz BIGNUM **r)Úere)ÚpÚqÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)rNr/r:rr`r_r1r0ZRSA_get0_factorsZRSA_get0_crt_paramsrZRSAPrivateNumbersÚ _bn_to_intÚRSAPublicNumbers) rSrerkrnrlrmrorprqrrrÚprivate_numbersfs<z_RSAPrivateKey.private_numberscCs|jj|||||j|jƒS)N)rNZ_private_key_bytesr.r_)rSÚencodingr#Zencryption_algorithmrrrÚ private_bytes‰sz_RSAPrivateKey.private_bytescCs$t|j||ƒ\}}t|j||||ƒS)N)r rNrI)rSr'r(rBrrrÚsign“sz_RSAPrivateKey.signN) rWrXrYrTrÚread_only_propertyrirfrjrJrurwrxrrrrr^6s # r^c@sFeZdZdd„ZejdƒZdd„Zdd„Zdd „Z d d „Z d d „Z dS)r,cCst||_||_||_|jjjdƒ}|jjj|j||jjj|jjjƒ|jj|d|jjjkƒ|jjj |dƒ|_ dS)Nz BIGNUM **r) rNr_r.r/r:rr`r0r1rarb)rSr&rcrdrerrrrTœs z_RSAPublicKey.__init__rbcCs,tƒtjd|ƒt|ƒt|j||||ƒS)NrK)r rÚ _check_bytesr rZrN)rSrKr(rBrrrÚverifier­s  z_RSAPublicKey.verifiercCst|j|||ƒS)N)r*rN)rSZ plaintextr(rrrÚencrypt¶sz_RSAPublicKey.encryptcCs’|jjjdƒ}|jjjdƒ}|jjj|j|||jjjƒ|jj|d|jjjkƒ|jj|d|jjjkƒtj |jj |dƒ|jj |dƒd�S)Nz BIGNUM **r)rkre) rNr/r:rr`r_r0r1rrtrs)rSrerkrrrrr¹sz_RSAPublicKey.public_numberscCs|jj||||j|jƒS)N)rNZ_public_key_bytesr.r_)rSrvr#rrrÚ public_bytesÆsz_RSAPublicKey.public_bytescCs&t|j||ƒ\}}t|j|||||ƒS)N)r rNrL)rSrKr'r(rBrrrr]Ësz_RSAPublicKey.verifyN) rWrXrYrTrryrir{r|rrr}r]rrrrr,šs   r,N)+Z __future__rrrZ 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%rCrErIrLZregister_interfaceÚobjectrMrZr^r,rrrrÚs,    ;""c