3Tf_>fddlmZddlZddlmZej r(ddlmZddlm Z m Z m Z m Z m Z eje e e e e fZ ddZddZ ddZ d dd Z d dd Z d dd Zd d Z dd Z ddZdZdZd!dZd"dZ ddZ d#dZd$dZ d%dZ d&dZ! d'dZ"d(dZ# d ddZ$ d ddZ%y))) annotationsN) InvalidTag)BackendAESCCMAESGCMAESOCB3AESSIVChaCha20Poly1305cVddlm}|jjxr t ||S)zz Checks whether the given cipher is supported through EVP_AEAD rather than the normal OpenSSL EVP_CIPHER API. rr )+cryptography.hazmat.primitives.ciphers.aeadr _libCryptography_HAS_EVP_AEAD isinstancebackendcipherr s K/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/aead.py_is_evp_aead_supported_cipherrs,M << 1 1 j 7c t||ryt|}|jr||jvry|j dr|j j dk(S|j j||jjk7S)NTF-siv) r_evp_cipher_cipher_name _fips_enabled _fips_aeadendswithr#CRYPTOGRAPHY_OPENSSL_300_OR_GREATEREVP_get_cipherbyname_ffiNULL)rr cipher_names r_aead_cipher_supportedr$(s$Wf5-f5  [8J8J%J    (<<CCqH H 11+><<$$% rcNt||r t|||St|||SN)r_evp_aead_create_ctx_evp_cipher_create_ctx)rrkeys r_aead_create_ctxr*;s, %Wf5#GVS99%gvs;;rc ^t||rt|||||||St|||||||Sr&)r_evp_aead_encrypt_evp_cipher_encryptrrnoncedataassociated_data tag_lengthctxs r_encryptr4FH%Wf5 VUD/:s  # VUD/:s  rc ^t||rt|||||||St|||||||Sr&)r_evp_aead_decrypt_evp_cipher_decryptr.s r_decryptr9Yr5rct||}|J|jj|}||jjn|}|jj ||t ||}|j||jjk7|jj||jj}|Sr&) _evp_aead_get_cipherr! from_bufferrEVP_AEAD_DEFAULT_TAG_LENGTHCryptography_EVP_AEAD_CTX_newlenopenssl_assertr"gcEVP_AEAD_CTX_free)rrr)tag_len aead_cipherkey_ptrr3s rr'r'ls 'w7K  "" "ll&&s+G ?  00  ,, 4 4Wc#h C 3',,"3"334 ,,//#w||== >C Jrc^ddlm}t||sJ|jj S)Nrr )rr rrEVP_aead_chacha20_poly1305rs rr;r;s- f. // / << 2 2 44rc|Jt||}|J|jjd}t||jj |z} |jjd| } |jj |} |jj |} dj|} |jj | }|jj|| || | t|| t||t|  }|j|dk(|jj| |ddd}|S)Nsize_t * uint8_t[]rrr) r;r!newr?rEVP_AEAD_max_overheadr<joinEVP_AEAD_CTX_sealr@buffer)rrr/r0r1r2r3rDout_len max_out_lenout_bufdata_ptr nonce_ptraadaad_ptrresencrypted_datas rr,r,s0 ??&w7K  "" "llz*Gd)gll@@MMKll{K8G||''-H ((/I ((? #Cll&&s+G ,, ( (  E  D  C C 3!8$\\(('!*=a@N rcvt||krt|J|jjd}t|}|jjd|} |jj |} |jj |} dj |} |jj | } |j j|| ||| t|| t|| t|  }|dk(r|jt|jj| |ddd}|S)NrIrJrr) r?rr!rKr<rMrEVP_AEAD_CTX_open_consume_errorsrO)rrr/r0r1r2r3rPrQrRrSrTrUrVrWdecrypted_datas rr7r7s 4y: ??llz*Gd)Kll{K8G||''-H ((/I ((? #Cll&&s+G ,, ( (  E  D  C C ax!\\(('!*=a@N rrcddlm}m}m}m}m}t ||ryt ||r+dt|jdzdjdSt ||r+dt|jdzdjdSt ||r.dt|jdzd zd jdSt ||sJdt|jdzd jdS) Nrrschacha20-poly1305zaes-z-ccmasciiz-ocbz-sivz-gcm) rrrr r r rr?_keyencode)rrrr r r s rrrs&*+# FF #c&++&*+4077@@ FG $c&++&*+4077@@ FF #c&++&*a/05<->>?\\__Z1M1MN \\66{C zW\\->->>? rc|jj}|j||jjk7|jj ||jj }t|}t||}|jj|}|jj|||jj||jjd}|j|dk7|SNr) rEVP_CIPHER_CTX_newr@r!r"rAEVP_CIPHER_CTX_freerrgr<EVP_CipherInit_ex)rrr)r3r#rfrErWs rr(r( s ,, ) ) +C 3',,"3"334 ,,//#w||?? @C)&1K['2Jll&&s+G ,, ( (     C 3!8$ Jrc t||}|jj}|jj ||jj }|jj |||jj|jj|jjt|tk(} |j| dk7|jj||jjt||jj} |j| dk7|tk(r|Jt|||nk|j!drZ|jj||jj"||jj} |j| dk7|jj%|} |jj%|} |jj ||jj|jj| | t|tk(} |j| dk7|S)Nrs-ccm)rgrrjr!rArkrlr"int_ENCRYPTr@EVP_CIPHER_CTX_ctrlEVP_CTRL_AEAD_SET_IVLENr?_DECRYPT_evp_cipher_set_tagrEVP_CTRL_AEAD_SET_TAGr<) rr#r)r/tagrC operationrfr3rWrTrEs r_evp_cipher_aead_setuprw"s['2J ,, ) ) +C ,,//#w||?? @C ,, ( (     I !"  C 3!8$ ,, * *  ,, E    C  3!8$HGS#.   g &ll..  LL . .  LL     sax( ((/Ill&&s+G ,, ( (    I !"  C 3!8$ Jrc|jj|}|jj||jjt ||}|j |dk7yri)r!r<rrprtr?r@)rr3rutag_ptrrWs rrsrsYsUll&&s+G ,, * * W\\ / /S7 C 3!8$rc :|jj|}|jj||jj|jj|jj|t |t k(}|j|dk7yri)r!r<rrlr"rnror@)rr3r/rvrTrWs r_evp_cipher_set_nonce_operationr{asz ((/I ,, ( (     I !"  C 3!8$rc|jjd}|jj||jj||jj|}|j |dk7yNint *r)r!rKrEVP_CipherUpdater"r@)rr3data_lenintptrrWs r_evp_cipher_set_lengthrps] \\  g &F ,, ' ' W\\   (9(98 C 3!8$rc |jjd}|jj|}|jj ||jj ||t |}|j|dk7yr})r!rKr<rrr"r?r@)rr3r1outlen a_data_ptrrWs r_evp_cipher_process_aadrxsn\\  g &F))/:J ,, ' ' W\\   C4H C 3!8$rc |jjd}|jjdt|}|jj|}|jj ||||t|}|dk(r|j t|jj||dddS)Nr~unsigned char[]r) r!rKr?r<rrr[rrO)rr3r0rbufrSrWs r_evp_cipher_process_datars \\  g &F ,,  ,c$i 8C||''-H ,, ' 'S&(CI NC ax! <<  sF1I .q 11rc ddlm}m}|+t|} t || |j |d|t }nt|||t t||rt||t||D]} t||| t|||} |jjd} |jjdd} |jj!|| | }|j#|dk7| |jj%| | dddz } |jjd|}|jj'||jj(||}|j#|dk7|jj%|dd}t||r"|j#t|dk(|| zS| |zS)Nrrr r~r)rrr rrwraror{rrr?rrr!rKrEVP_CipherFinal_exr@rOrpEVP_CTRL_AEAD_GET_TAG)rrr/r0r1r2r3rr r#adprocessed_datarrrWtag_bufrus rr-r-sK {-f5 $   KK      (eXF &&!wSY72b12-gsDAN \\  g &F ,,  ,b 1C ,, ) )#sF ;C 3!8$gll))#vay9!<rs # . D)99J   (   &< < < <$        (        4        (        .%)    " ,5& & & &  & ( &  & & &R) ) ) )  ) ( )  ) ) )X  A,     .4 44 4  4 4  44n% % %+. %  %%% %,1% % 2&8$ 8$ 8$ 8$  8$ ( 8$  8$ 8$ 8$DE E E E  E ( E  E E Er