U
    g*                     @   s   d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d d	lmZ d
d Zdd ZG dd dejZG dd dejZi fddZedkrdd Zejdd dS )    )print_functionN)RSA)list_test_casesa2b_hex)Random)
PKCS1_v1_5)b)bytes_to_longlong_to_bytesload_test_vectors_wycheproofc                 C   s   dD ]}|  |d} q| S )z6Remove white spaces, tabs, and new lines from a string)
	  )replace)tc r   L/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/SelfTest/Cipher/test_pkcs1_15.pyrws$   s    r   c                 C   s,   t t| }t|d dkr$tdt|S )z=Convert a text string with bytes in hex form to a byte string      z"Even number of characters expected)r   r   len
ValueErrorr   )r   cleanr   r   r   t2b+   s    r   c                   @   s`   e Zd Zdd ZdZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )PKCS1_15_Testsc                 C   s    t  j| _td| j| _d S )Ni   )r   newreadrngr   generatekey1024selfr   r   r   setUp5   s    zPKCS1_15_Tests.setUp))av  -----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDAiAnvIAOvqVwJTaYzsKnefZftgtXGE2hPJppGsWl78yz9jeXY
W/FxX/gTPURArNhdnhP6n3p2ZaDIBrO2zizbgIXs0IsljTTcr4vnI8fMXzyNUOjA
zP3nzMqZDZK6757XQAobOssMkBFqRWwilT/3DsBhRpl3iMUhF+wvpTSHewIDAQAB
AoGAC4HV/inOrpgTvSab8Wj0riyZgQOZ3U3ZpSlsfR8ra9Ib9Uee3jCYnKscu6Gk
y6zI/cdt8EPJ4PuwAWSNJzbpbVaDvUq25OD+CX8/uRT08yBS4J8TzBitZJTD4lS7
atdTnKT0Wmwk+u8tDbhvMKwnUHdJLcuIsycts9rwJVapUtkCQQDvDpx2JMun0YKG
uUttjmL8oJ3U0m3ZvMdVwBecA0eebZb1l2J5PvI3EJD97eKe91Nsw8T3lwpoN40k
IocSVDklAkEAzi1HLHE6EzVPOe5+Y0kGvrIYRRhncOb72vCvBZvD6wLZpQgqo6c4
d3XHFBBQWA6xcvQb5w+VVEJZzw64y25sHwJBAMYReRl6SzL0qA0wIYrYWrOt8JeQ
8mthulcWHXmqTgC6FEXP9Es5GD7/fuKl4wqLKZgIbH4nqvvGay7xXLCXD/ECQH9a
1JYNMtRen5unSAbIOxRcKkWz92F0LKpm9ZW/S9vFHO+mBcClMGoKJHiuQxLBsLbT
NtEZfSJZAeS2sUtn3/0CQDb2M2zNBTF8LlM0nxmh0k9VGm5TVIyBEMcipmvOgqIs
HKukWBcq9f/UOmS0oEhai/6g+Uf7VHJdWaeO5LzuvwU=
-----END RSA PRIVATE KEY-----zTHIS IS PLAINTEXT
a  3f dc fd 3c cd 5c 9b 12  af 65 32 e3 f7 d0 da 36
                8f 8f d9 e3 13 1c 7f c8  b3 f9 c1 08 e4 eb 79 9c
                91 89 1f 96 3b 94 77 61  99 a4 b1 ee 5d e6 17 c9
                5d 0a b5 63 52 0a eb 00  45 38 2a fb b0 71 3d 11
                f7 a1 9e a7 69 b3 af 61  c0 bb 04 5b 5d 4b 27 44
                1f 5b 97 89 ba 6a 08 95  ee 4f a2 eb 56 64 e5 0f
                da 7c f9 9a 61 61 06 62  ed a0 bc 5f aa 6c 31 78
                70 28 1a bb 98 3c e3 6a  60 3c d1 0b 0f 5a f4 75a  eb d7 7d 86 a4 35 23 a3 54 7e 02 0b 42 1d
                61 6c af 67 b8 4e 17 56 80 66 36 04 64 34 26 8a
                47 dd 44 b3 1a b2 17 60 f4 91 2e e2 b5 95 64 cc
                f9 da c8 70 94 54 86 4c ef 5b 08 7d 18 c4 ab 8d
                04 06 33 8f ca 15 5f 52 60 8a a1 0c f5 08 b5 4c
                bb 99 b8 94 25 04 9c e6 01 75 e6 f9 63 7a 65 61
                13 8a a7 47 77 81 ae 0d b8 2c 4d 50 a5c                 C   sl   | j D ]`}t|d }G dd d}tj||t|d d}|t|d }| |t|d  qd S )Nr   c                   @   s   e Zd Zdd Zdd ZdS )z,PKCS1_15_Tests.testEncrypt1.<locals>.randGenc                 S   s   || _ d| _d S )Nr   dataidx)r$   r'   r   r   r   __init__s   s    z5PKCS1_15_Tests.testEncrypt1.<locals>.randGen.__init__c                 S   s(   | j | j| j|  }|  j|7  _|S Nr&   )r$   Nrr   r   r   __call__v   s    z5PKCS1_15_Tests.testEncrypt1.<locals>.randGen.__call__N)__name__
__module____qualname__r)   r-   r   r   r   r   randGenr   s   r1      )Zrandfuncr   r   )		_testDatar   	importKeyPKCSr   r   encryptr   assertEqual)r$   testkeyr1   cipherctr   r   r   testEncrypt1l   s    
	zPKCS1_15_Tests.testEncrypt1c                 C   s$   d}t | j}| t|j| d S )Nzv                                                                                                                      )r5   r   r"   assertRaisesr   r6   )r$   ptr:   r   r   r   testEncrypt2   s    zPKCS1_15_Tests.testEncrypt2c                 C   sx   | j D ]l}t|d }t|d }t|d }t|}||d }| || ||dt	| }| || qd S )Nr   r   r      )
r3   r   r4   r   r   r5   r   decryptr7   r   )r$   r8   r9   Zexpected_ptr;   r:   r>   r   r   r   testVerify1   s    

zPKCS1_15_Tests.testVerify1c                 C   sn   t | j}| t|jdd | t|jdd td}t|}| j|}t	|d}| 
d||d d S )Nz                                                                                                                               z---z                                                                                                                                 u    ÿÿÿÿÿÿÿ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE   s   ---)r5   r   r"   r=   r   rA   r   r	   Z_encryptr
   r7   )r$   r:   r>   Zpt_intZct_intr;   r   r   r   testVerify2   s    
zPKCS1_15_Tests.testVerify2c                 C   sP   t ddD ]@}| |}t| j}||}||d| }| || q
d S )Nr   v      )ranger    r5   r   r"   r6   rA   r7   )r$   Zpt_lenr>   r:   r;   pt2r   r   r   testEncryptVerify1   s    

z!PKCS1_15_Tests.testEncryptVerify1c                 C   sp   t | j}d}||}d}|||d}| || |||d}| || |||d}| || d S )Ns   5555555555555555s            )r5   r   r"   r6   rA   r7   )r$   r:   r>   r;   sentinelZpt_AZpt_BZpt_Cr   r   r   test_encrypt_verify_exp_pt_len   s    
z-PKCS1_15_Tests.test_encrypt_verify_exp_pt_lenc                 C   sF   d}t | j}|t|}|t|dt| }| || d S )N   XER   ÿ)r5   r   r"   r6   	bytearrayrA   r   r7   r$   r>   r:   r;   rH   r   r   r   testByteArray   s
    zPKCS1_15_Tests.testByteArrayc                 C   sN   d}t | j}|tt|}|tt|dt| }| || d S )NrO   r@   )	r5   r   r"   r6   
memoryviewrQ   rA   r   r7   rR   r   r   r   testMemoryview   s
    zPKCS1_15_Tests.testMemoryviewc                 C   sJ   d}t | j}||}| t|t ||d}| t|t d S )Ns   XYZs   )r5   r   r"   r6   
assertTrue
isinstancebytesrA   rR   r   r   r   test_return_type   s    
zPKCS1_15_Tests.test_return_typeN)r.   r/   r0   r%   r3   r<   r?   rB   rD   rI   rN   rS   rU   rY   r   r   r   r   r   3   s   ,
r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestVectorsWycheproofc                 C   s"   t j|  || _|| _d| _d S )NNone)unittestTestCaser)   _wycheproof_warnings_skip_slow_tests_id)r$   wycheproof_warningsskip_slow_testsr   r   r   r)      s    zTestVectorsWycheproof.__init__c                 C   s$   dd }t d|d| d|id}|S )Nc                 S   s   t | d S )NZprivateKeyPem)r   Z
import_key)groupr   r   r   
filter_rsa   s    z4TestVectorsWycheproof.load_tests.<locals>.filter_rsa)ZCipherZ
wycheproofzWycheproof PKCS#1v1.5 (%s)rsa_key)Z	group_tagr   )r$   filenamerd   resultr   r   r   
load_tests   s    z TestVectorsWycheproof.load_testsc                 C   sF   g | _ | j | d | jsB| j | d | j | d d S )Nzrsa_pkcs1_2048_test.jsonzrsa_pkcs1_3072_test.jsonzrsa_pkcs1_4096_test.json)tvextendrh   r_   r#   r   r   r   r%      s
    zTestVectorsWycheproof.setUpc                 C   s   | j S r*   )r`   r#   r   r   r   shortDescription   s    z&TestVectorsWycheproof.shortDescriptionc                 C   s.   |j r*| jr*dd l}|d| j|jf  d S )Nr   zWycheproof warning: %s (%s))warningr^   warningswarnr`   comment)r$   ri   rm   r   r   r   rn      s    zTestVectorsWycheproof.warnc                 C   s   d|j  | _dtdt|j }t|j}z|j|j	|d}W n t
k
r^   |jrZtY n8X ||krt|jrtn"|js~t| ||j | | d S )Nz&Wycheproof Decrypt PKCS#1v1.5 Test #%srF   r2   )rM   )idr`   maxr   msgr5   r   re   rA   r;   r   ZvalidAssertionErrorr7   rn   )r$   ri   rM   r:   r>   r   r   r   test_decrypt   s    
z"TestVectorsWycheproof.test_decryptc                 C   s   | j D ]}| | qd S r*   )ri   rt   )r$   ri   r   r   r   runTest  s    
zTestVectorsWycheproof.runTestN)
r.   r/   r0   r)   rh   r%   rk   rn   rt   ru   r   r   r   r   rZ      s   rZ   c                 C   s:   |  d }|  d}g }|tt7 }|t||g7 }|S )NZ
slow_testsra   )getr   r   rZ   )configrb   ra   testsr   r   r   	get_tests  s    
ry   __main__c                   C   s   t t S r*   )r\   Z	TestSuitery   r   r   r   r   suite  s    r{   )ZdefaultTest)
__future__r   r\   ZCryptodome.PublicKeyr   ZCryptodome.SelfTest.st_commonr   r   Z
Cryptodomer   ZCryptodome.Cipherr   r5   ZCryptodome.Util.py3compatr   ZCryptodome.Util.numberr	   r
   ZCryptodome.SelfTest.loaderr   r   r   r]   r   rZ   ry   r.   r{   mainr   r   r   r   <module>   s"    !9
