a
    zec                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z z(d dlmZ d dlmZ d dlmZ W n ey   dZdZdZY n0 dd ZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZG dd dejZedkre  dS )    N)hashlib_helper)_compare_digest)HMAC)hmac_new)compare_digestc                    s   t   fdd}|S )Nc                     sH   t  , t jdtd  | i |W  d    S 1 s:0    Y  d S )Nignore)category)warningscatch_warningsfilterwarningsDeprecationWarning)argskwargsfunc $/usr/lib/python3.9/test/test_hmac.pywrapper   s
    
zignore_warning.<locals>.wrapper)	functoolswraps)r   r   r   r   r   ignore_warning   s    r   c                   @   s   e Zd Zdd Zejddddd Zejdddd	d
 Zdd Zejddddd Z	ejddddd Z
ejddddd Zejddddd Zeddd Zdd ZdS )TestVectorsTestCasec           
      C   sx  t j|||d}| |  |  | | t| | |jd|  | |j	| | |j
| t j|||d}| |  |  | | t| | |jd|  | |j	| | |j
| t j||d}| }	|	d || | |  |  t j|||d}| |  |  | | t| | |jd|  | |j	| | |j
| t j|d |d}|| | |  |  t j||d}|| | |  |  t j|||d}| |  |  | t j|||dt| | t j|||dt| tjdi L | t j|||dt| | t j|||dt| W d    n1 s0    Y  td urtt|||d}| |  |  | | t| | |jd|  | |j	| | |j
| t||d}| }	|	d || | |  |  d S )N	digestmodzhmac-s   test update)digestzhmac._openssl_md_meths)hmacr   assertEqual	hexdigestupperr   binasciiZ	unhexlifynamedigest_size
block_sizecopyupdatenewunittestZmockZpatch
c_hmac_new)
selfkeydatar   hashfunchashnamer!   r"   hh2r   r   r   asssert_hmac#   sx    



$


z TestVectorsTestCase.asssert_hmacmd5T)Zopensslc                    sn    fdd}|ddd |ddd |d	d
d |t tdddd |ddd |ddd |ddd d S )Nc              	      s    j | ||tjdddd d S )Nr0      @   r+   r,   r!   r"   )r/   hashlibr0   r)   r*   r   r(   r   r   md5testp   s    z5TestVectorsTestCase.test_md5_vectors.<locals>.md5test      Hi ThereZ 9294727A3638BB1C13F48EF8158BFC9D   Jefe   what do ya want for nothing?Z 750c783e6ab0b503eaa86e310a5db738s   2   Z 56be34521d144c88dbb8c733f0e8b3f6      2   Z 697eaf0aca3a3aea3a75164746ffaa79s      Test With TruncationZ 56461ef2342edc00f9bab995690efd4cP   6   Test Using Larger Than Block-Size Key - Hash Key FirstZ 6b1ab7fe4bd7bf8f0b62e6ce61b9d0cdI   Test Using Larger Than Block-Size Key and Larger Than One Block-Size DataZ 6f630fad67cda0ee1fb1f562db3aa53ebytesrange)r(   r7   r   r6   r   test_md5_vectorsl   s:    	z$TestVectorsTestCase.test_md5_vectorssha1c                    sn    fdd}|ddd |ddd |d	d
d |t tdddd |ddd |ddd |ddd d S )Nc              	      s    j | ||tjdddd d S )NrH      r2   r3   )r/   r4   rH   r5   r6   r   r   shatest   s    z5TestVectorsTestCase.test_sha_vectors.<locals>.shatest   r9   Z(b617318655057264e28bc0b6fb378c8ef146be00r:   r;   Z(effcdf6ae5eb2fa2d27416d5f184df9c259a7c79   r<   Z(125d7342b9ac11cd91a39af48aa17b4f63f175d3r=   r>   r?   Z(4c9007f4026250c6bc8414f9bf50c86c2d7235das   r@   Z(4c1a03424b55e07fe7f27be1d58bb9324a9a5a04rA   rB   Z(aa4ae5e15272d00e95705637ce8a3b55ed402112rC   Z(e8e99d0f45237d786d6bbaa7965c7808bbff1a91rD   )r(   rJ   r   r6   r   test_sha_vectors   s:    	z$TestVectorsTestCase.test_sha_vectorsc                    s   fdd}|ddt jdt jdt jdt jdid	 |d
dt jdt jdt jdt jdid	 |ddt jdt jdt jdt jdid	 |tdd tddD dt jdt jdt jdt jdid	 |dd t jd!t jd"t jd#t jd$id	 |dd%t jd&t jd't jd(t jd)id	 d S )*Nc              	      s$   | }j | || d d S )Nr3   )r/   )r)   r*   
hexdigestsr   r"   r!   	hash_namer+   r(   r   r   hmactest   s    z9TestVectorsTestCase._rfc4231_test_cases.<locals>.hmactestrK   r9   Z8896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22Z@b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7Z`afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6Z87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854)r)   r*   rN   r:   r;   Z8a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44Z@5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843Z`af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649Z164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737rL   r<   Z87fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333eaZ@773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565feZ`88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b2a5ab39dc13814b94e3ab6e101a34f27Zfa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fbc                 s   s   | ]
}|V  qd S Nr   ).0xr   r   r   	<genexpr>       z:TestVectorsTestCase._rfc4231_test_cases.<locals>.<genexpr>r=   r>   r?   Z86c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5aZ@82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665bZ`3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e6801dd23c4a7d679ccf8a386c674cffbZb0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dds   rB   Z895e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870eZ@60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54Z`4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c60c2ef6ab4030fe8296248df163f44952Z80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598s   This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.Z83a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1Z@9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2Z`6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5a678cc31e799176d3860e6110c46523eZe37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58)r4   sha224sha256sha384sha512rE   rF   )r(   r+   rP   r!   r"   rQ   r   rO   r   _rfc4231_test_cases   sb    z'TestVectorsTestCase._rfc4231_test_casesrW   c                 C   s   |  tjddd d S )NrW      r2   )r[   r4   rW   r6   r   r   r   test_sha224_rfc42315  s    z'TestVectorsTestCase.test_sha224_rfc4231rX   c                 C   s   |  tjddd d S )NrX       r2   )r[   r4   rX   r6   r   r   r   test_sha256_rfc42319  s    z'TestVectorsTestCase.test_sha256_rfc4231rY   c                 C   s   |  tjddd d S )NrY   0      )r[   r4   rY   r6   r   r   r   test_sha384_rfc4231=  s    z'TestVectorsTestCase.test_sha384_rfc4231rZ   c                 C   s   |  tjddd d S )NrZ   r2   ra   )r[   r4   rZ   r6   r   r   r   test_sha512_rfc4231A  s    z'TestVectorsTestCase.test_sha512_rfc4231c              	   C   s   G dd dt }t  tdt | t* tjdd|d | d W d    n1 s`0    Y  d|_	| t* tjdd|d | d	 W d    n1 s0    Y  W d    n1 s0    Y  d S )
Nc                   @   s$   e Zd Zdd Zdd Zdd ZdS )zJTestVectorsTestCase.test_legacy_block_size_warnings.<locals>.MockCrazyHashc                 W   s   t j| | _| jj| _d S rR   )r4   rX   _xr!   )r(   r   r   r   r   __init__I  s    zSTestVectorsTestCase.test_legacy_block_size_warnings.<locals>.MockCrazyHash.__init__c                 S   s   | j | d S rR   )rd   r$   )r(   vr   r   r   r$   L  s    zQTestVectorsTestCase.test_legacy_block_size_warnings.<locals>.MockCrazyHash.updatec                 S   s
   | j  S rR   )rd   r   r6   r   r   r   r   N  s    zQTestVectorsTestCase.test_legacy_block_size_warnings.<locals>.MockCrazyHash.digestN)__name__
__module____qualname__re   r$   r   r   r   r   r   MockCrazyHashG  s   rj   error   a   br   z)Expected warning about missing block_sizer=   z'Expected warning about small block_size)
objectr	   r
   simplefilterRuntimeWarningassertRaisesr   r   failr"   )r(   rj   r   r   r   test_legacy_block_size_warningsE  s    

(z3TestVectorsTestCase.test_legacy_block_size_warningsc                 C   s   |  td( d}d}tj||d d W d    n1 s:0    Y  |  td t|| W d    n1 sr0    Y  |  td  tj||dd W d    n1 s0    Y  d S )Nzrequired.*digestmodr8   r9   r    )msgr   )assertRaisesRegex	TypeErrorr   r   r%   )r(   r)   r*   r   r   r   test_with_digestmod_no_default\  s    .*z2TestVectorsTestCase.test_with_digestmod_no_defaultN)rg   rh   ri   r/   r   requires_hashdigestrG   rM   r[   r]   r_   rb   rc   rs   rx   r   r   r   r   r   !   s"   I
)
'w




r   c                   @   s   e Zd ZdZeddd Zeddd Zeddd Zedd	d
 Z	eddd Z
eddd Zeddd Zeeduddd ZdS )ConstructorTestCaseZ@6c845b47f52b3b47f6590c502db7825aad757bf4fadc8fa972f7cd2e76a5bdebrX   c                 C   s4   zt jddd W n ty.   | d Y n0 d S )N   keyrX   r   z+Standard constructor call raised exception.)r   r   	Exceptionrr   r6   r   r   r   test_normaln  s    zConstructorTestCase.test_normalc                 C   s<   |  t tjddd}W d    n1 s.0    Y  d S Nr)   rX   r   )rq   rw   r   r   r(   r-   r   r   r   test_with_str_keyv  s    z%ConstructorTestCase.test_with_str_keyc                 C   s<   |  t tjddd}W d    n1 s.0    Y  d S r~   )rq   rw   r   r%   r   r   r   r   test_dot_new_with_str_key}  s    z-ConstructorTestCase.test_dot_new_with_str_keyc                 C   sH   zt jdddd}W n ty0   | d Y n0 | | | j d S )Nr{   
   hash this!rX   r   z5Constructor call with text argument raised exception.)r   r   r|   rr   r   r   expectedr   r   r   r   test_withtext  s
    z!ConstructorTestCase.test_withtextc                 C   sP   zt jtdtddd}W n ty8   | d Y n0 | | | j d S )Nr{   r   rX   r   z;Constructor call with bytearray arguments raised exception.)r   r   	bytearrayr|   rr   r   r   r   r   r   r   r   test_with_bytearray  s    
z'ConstructorTestCase.test_with_bytearrayc                 C   sL   zt jdtddd}W n ty4   | d Y n0 | | | j d S )Nr{   r   rX   r   z6Constructor call with memoryview msg raised exception.)r   r   
memoryviewr|   rr   r   r   r   r   r   r   r   test_with_memoryview_msg  s
    z,ConstructorTestCase.test_with_memoryview_msgc                 C   s6   zt ddtj}W n ty0   | d Y n0 d S )Nr{   rV   z6Constructor call with hashlib.sha256 raised exception.)r   r   r4   rX   r|   rr   r   r   r   r   test_withmodule  s    z#ConstructorTestCase.test_withmoduleNzneed _hashlibc                 C   s6   |  td t  W d    n1 s(0    Y  d S )Nzcannot create 'HMAC' instance)rv   rw   C_HMACr6   r   r   r   test_internal_types  s    z'ConstructorTestCase.test_internal_types)rg   rh   ri   r   r   ry   r}   r   r   r   r   r   r   r&   Z
skipUnlessr   r   r   r   r   r   rz   h  s$   






rz   c                   @   s   e Zd Zeddd ZdS )SanityTestCaserX   c                 C   sV   z4t jddd}|d |  |  |  W n tyP   | d Y n0 d S )Ns   my secret keyrX   r   s   compute the hash of this text!z3Exception raised during normal usage of HMAC class.)r   r   r$   r   r   r#   r|   rr   r   r   r   r   test_exercise_all_methods  s    
z(SanityTestCase.test_exercise_all_methodsN)rg   rh   ri   r   ry   r   r   r   r   r   r     s   r   c                   @   sf   e Zd Zeddd Zeddd Zeddd Zeddd	 Zedd
d Z	dS )CopyTestCaserX   c                 C   sb   t jddd}| }| |j|jkd | t|jt|jd | t|jt|jd d S )Nr{   rX   r   z digest constructors don't match.zTypes of inner don't match.zTypes of outer don't match.)	r   r   r#   
assertTrue_digest_consr   type_inner_outerr(   h1r.   r   r   r   test_attributes  s    zCopyTestCase.test_attributesc                 C   s   t jddd}| }| t|t|kd | t|jt|jkd | t|jt|jkd | |j|j | |j|j	 | |j
|j d S )Nr{   rX   r   "No real copy of the HMAC instance.z&No real copy of the attribute 'inner'.z&No real copy of the attribute 'outer'.)r   r   r#   r   idr   r   r   innerouterr   digest_consr   r   r   r   test_realcopy  s    zCopyTestCase.test_realcopyc                 C   sB   t jddd}| |j|j | |j|j | |j|j d S )Nr{   rX   r   )	r   r   r   r   r   r   r   r   r   )r(   r   r   r   r   test_properties  s    zCopyTestCase.test_propertiesc                 C   sP   t jddd}|d | }| | | d | | | d d S )Nr{   rX   r      some random text-Digest of copy doesn't match original digest.3Hexdigest of copy doesn't match original hexdigest.)r   r   r$   r#   r   r   r   r   r   r   r   test_equality  s    
zCopyTestCase.test_equalityc                 C   sh   t jddd}|d | }| t|t|kd | | | d | | | d d S )Nr{   rX   r   r   r   r   r   )	r   r%   r$   r#   r   r   r   r   r   r   r   r   r   test_equality_new  s    
zCopyTestCase.test_equality_newN)
rg   rh   ri   r   ry   r   r   r   r   r   r   r   r   r   r     s   




r   c                   @   s<   e Zd Zdd Zdd Zeedu ddd Zd	d
 Z	dS )CompareDigestTestCasec                 C   s6   |  tj td ur$| tjt n| tjt d S rR   )_test_compare_digestr   r   openssl_compare_digestZassertIsoperator_compare_digestr6   r   r   r   test_hmac_compare_digest   s    z.CompareDigestTestCase.test_hmac_compare_digestc                 C   s   |  t d S rR   )r   r   r6   r   r   r   test_operator_compare_digest  s    z2CompareDigestTestCase.test_operator_compare_digestNztest requires _hashlibc                 C   s   |  t d S rR   )r   r   r6   r   r   r   test_openssl_compare_digest
  s    z1CompareDigestTestCase.test_openssl_compare_digestc                 C   s  d\}}|  t||| d\}}|  t||| d\}}|  t||| d\}}|  t||| d\}}|  t||| d\}}| ||| d\}}| ||| d\}}| ||| d	\}}| ||| d
\}}| ||| d\}}| ||| tdtd }}| ||| tdtd }}| ||| tdtd }}| ||| tdd }}| ||| | ||| tdd }}| ||| | ||| tdd }}| ||| | ||| d\}}| ||| d\}}| ||| d\}}| ||| d\}}|  t||| d\}}|  t||| d\}}|  t||| d\}}|  t||| d\}}|  t||| G dd dt}|d|d }}| ||| |dd }}| ||| |d|d }}| ||| G dd dt}|d|d }}| ||| |dd }}| ||| |d|d }}| ||| d S )N)d      )r      foobar)r   r   )foobarr   )r   r   )r      foo)   ޭs   ޭ)r      foobaz)r   s   )r   r   )r   r   r   r   r   )r   r   )Zfoor   )r   foobaz)r   r=   )   fooär   c                   @   s   e Zd Zdd ZdS )z9CompareDigestTestCase._test_compare_digest.<locals>.mystrc                 S   s   dS NFr   r(   otherr   r   r   __eq__b  s    z@CompareDigestTestCase._test_compare_digest.<locals>.mystr.__eq__Nrg   rh   ri   r   r   r   r   r   mystra  s   r   r   r   c                   @   s   e Zd Zdd ZdS )z;CompareDigestTestCase._test_compare_digest.<locals>.mybytesc                 S   s   dS r   r   r   r   r   r   r   m  s    zBCompareDigestTestCase._test_compare_digest.<locals>.mybytes.__eq__Nr   r   r   r   r   mybytesl  s   r   )rq   rw   ZassertFalser   r   strrE   )r(   r   abr   r   r   r   r   r     s    z*CompareDigestTestCase._test_compare_digest)
rg   rh   ri   r   r   r&   ZskipIfr   r   r   r   r   r   r   r     s
   
r   __main__)r   r   r   r4   r&   Zunittest.mockr	   Ztest.supportr   	_operatorr   r   Z_hashlibr   r   r   r'   r   r   ImportErrorr   ZTestCaser   rz   r   r   r   rg   mainr   r   r   r   <module>   s4   

  IG?z
