U
    g!5                     @   sf  d dl Z d dlZd dlmZ d dl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mZmZmZmZmZmZmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm	Z	 dd Z G dd dej!Z"G dd dej!Z#eddddd dd dd dpg Z$e%e$D ]\Z&Z'e(e'e)r8q e*e'drNe'j+Z,q e e'j-. Z/e/0e'j1Z2e3dd e,e'j4fD Z5e0e5Z6e2e6e'j7fddZ8e2e6e'j7fd d!Z9e'j:d"kre;e#d#e& e9 ne;e#d$e& e8 q G d%d& d&ej!Z<G d'd( d(ej!Z=edd)d*d+d,d ip g Z>e>edd-d.d+d/d ip>g 7 Z>e%e>D ]\Z&Z'e(e'e)rbqJe*e'drxe'j+Z,qJe*e'd0re3d1d e,e'j4e'j?fD Z@e0e@ZAqJe e'j-. Z/e/0e'j1Z2e2eAe'j7fd2d3ZBe;e=d4e& eB qJG d5d6 d6ej!ZCG d7d8 d8ej!ZDG d9d: d:ej!ZEG d;d< d<ej!ZFi fd=d>ZGeHd?krbd@d ZIejJdAdB dS )C    N)	unhexlify)bchrbytes_to_long)strxor)list_test_cases)load_test_vectorsload_test_vectors_wycheproof)	SHA1SHA224SHA256SHA384SHA512SHA3_384SHA3_224SHA3_256SHA3_512)RSA)pkcs1_15)
PKCS1_v1_5)pycryptodome_filenamec                 C   s   t d|  t t dgS )NzCryptodome.Hash.new)
__import__globalslocals)	hash_name r   O/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/SelfTest/Signature/test_pkcs1_15.pyload_hash_by_name3   s    r   c                   @   s   e Zd Zdd Zdd ZdS )FIPS_PKCS1_Verify_Testsc                 C   s   dS )NzFIPS PKCS1 Tests (Verify)r   selfr   r   r   shortDescription9   s    z(FIPS_PKCS1_Verify_Tests.shortDescriptionc                 C   s,   t d }t|}| | d d S )N   F)r   generate
public_keyr   r   assertEqualcan_sign)r!   Ztest_public_keyverifierr   r   r   test_can_sign<   s    
z%FIPS_PKCS1_Verify_Tests.test_can_signN__name__
__module____qualname__r"   r)   r   r   r   r   r   7   s   r   c                   @   s   e Zd ZdS )FIPS_PKCS1_Verify_Tests_KATNr+   r,   r-   r   r   r   r   r.   B   s   r.   )	Signaturez
PKCS1-v1.5zSigVer15_186-3.rspzSignature Verification 186-3c                 C   s   | S Nr   xr   r   r   <lambda>I       r4   c                 C   s   t | S r1   )intr2   r   r   r   r4   J   r5   c                 C   s   | S r1   r   r2   r   r   r   r4   K   r5   )shaalgdresultnc                 C   s   g | ]}t |qS r   r   .0r3   r   r   r   
<listcomp>W   s     r=   c                 C   s   | || d S r1   )verifyr!   hash_objr(   	signaturer   r   r   positive_testZ   s    rB   c                 C   s   |  t|j|| d S r1   )assertRaises
ValueErrorr>   r?   r   r   r   negative_test]   s    rE   fztest_negative_%dztest_positive_%dc                   @   s   e Zd Zdd Zdd ZdS )FIPS_PKCS1_Sign_Testsc                 C   s   dS )NzFIPS PKCS1 Tests (Sign)r   r    r   r   r   r"   h   s    z&FIPS_PKCS1_Sign_Tests.shortDescriptionc                 C   s(   t d}t|}| | d d S )Nr#   T)r   r$   r   r   r&   r'   )r!   Ztest_private_keysignerr   r   r   r)   k   s    

z#FIPS_PKCS1_Sign_Tests.test_can_signNr*   r   r   r   r   rG   f   s   rG   c                   @   s   e Zd ZdS )FIPS_PKCS1_Sign_Tests_KATNr/   r   r   r   r   rI   q   s   rI   zSigGen15_186-2.txtzSignature Generation 186-2r7   c                 C   s   | S r1   r   r2   r   r   r   r4   x   r5   zSigGen15_186-3.txtzSignature Generation 186-3c                 C   s   | S r1   r   r2   r   r   r   r4   }   r5   ec                 C   s   g | ]}t |qS r   r   r;   r   r   r   r=      s     c                 C   s   | |}| || d S r1   )signr&   )r!   r@   rH   r9   rA   r   r   r   new_test   s    
rL   ztest_%dc                   @   s,   e Zd ZdZdZdZdZeeZdd Z	dS )PKCS1_15_NoParamszVerify that PKCS#1 v1.5 signatures pass even without NULL parameters in
    the algorithm identifier (PyCrypto/LP bug #1119552).aP  -----BEGIN RSA PRIVATE KEY-----
            MIIBOwIBAAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+TLr7UkvEtFrRhDDKMtuII
            q19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQJACUSDEp8RTe32ftq8IwG8
            Wojl5mAd1wFiIOrZ/Uv8b963WJOJiuQcVN29vxU5+My9GPZ7RA3hrDBEAoHUDPrI
            OQIhAPIPLz4dphiD9imAkivY31Rc5AfHJiQRA7XixTcjEkojAiEAyh/pJHks/Mlr
            +rdPNEpotBjfV4M4BkgGAA/ipcmaAjcCIQCHvhwwKVBLzzTscT2HeUdEeBMoiXXK
            JACAr3sJQJGxIQIgarRp+m1WSKV1MciwMaTOnbU7wxFs9DP1pva76lYBzgUCIQC9
            n0CnZCJ6IZYqSt0H5N7+Q+2Ro64nuwV/OSQfM6sBwQ==
            -----END RSA PRIVATE KEY-----s   This is a test
Za287a13517f716e72fb14eea8e33a8db4a4643314607e7ca3e3e281893db74013dda8b855fd99f6fecedcb25fcb7a434f35cd0a101f8b19348e0bd7b6f152dfcc                 C   s0   t t| j}t| j}||| j d S r1   )	r   r   r   	importKeyrsakeyr
   msgr>   rA   )r!   r(   hashedr   r   r   runTest   s    zPKCS1_15_NoParams.runTestN)
r+   r,   r-   __doc__rO   rP   Zsig_strr   rA   rR   r   r   r   r   rM      s   
rM   c                   @   s    e Zd ZdZdd Zdd ZdS )PKCS1_Legacy_Module_TestszVerify that the legacy module Cryptodome.Signature.PKCS1_v1_5
    behaves as expected. The only difference is that the verify()
    method returns True/False and does not raise exceptions.c                 C   s   dS )Nz+Test legacy Cryptodome.Signature.PKCS1_v1_5r   r    r   r   r   r"      s    z*PKCS1_Legacy_Module_Tests.shortDescriptionc                 C   sv   t tj}td}t||}t| }| 	|
||d t|tdt| }| 	|
||d d S )N   TestT   F)r   rN   rM   rO   r
   r   r   rK   r%   r&   r>   r   r   len)r!   keyrQ   Zgood_signaturer(   Zbad_signaturer   r   r   rR      s    
z!PKCS1_Legacy_Module_Tests.runTestN)r+   r,   r-   rS   r"   rR   r   r   r   r   rT      s   rT   c                   @   s   e Zd Zdd Zdd ZdS )PKCS1_All_Hashes_Testsc                 C   s   dS )Nz8Test PKCS#1v1.5 signature in combination with all hashesr   r    r   r   r   r"      s    z'PKCS1_All_Hashes_Tests.shortDescriptionc                 C   s   t d}t|}d}|D ]}t|d}|| qddlm}m} dD ]}|j|dd}	||	 qNdD ]}|j|dd}
||
 qpd S )	Nr#   )ZMD2ZMD4MD5Z	RIPEMD160r
   r   r   r   r   r   r   r   r   rU   r   )BLAKE2bBLAKE2s)       0   @   )Zdigest_bytesdata)   r]      r^   )	r   r$   r   r   r   rK   Cryptodome.Hashr[   r\   )r!   rX   rH   Z
hash_namesnamerQ   r[   r\   Z	hash_sizeZhashed_bZhashed_sr   r   r   rR      s    

zPKCS1_All_Hashes_Tests.runTestN)r+   r,   r-   r"   rR   r   r   r   r   rY      s   rY   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TestCase__init___wycheproof_warnings_id)r!   wycheproof_warningsr   r   r   rj      s    zTestVectorsWycheproof.__init__c                 C   s   g | _ | d | d | d | d | d | d | d | d | d	 | d
 | d | d | d | d | d | d | d | d | d | d | d | d d S )Nzrsa_sig_gen_misc_test.jsonz#rsa_signature_2048_sha224_test.jsonz#rsa_signature_2048_sha256_test.jsonz#rsa_signature_2048_sha384_test.jsonz%rsa_signature_2048_sha3_224_test.jsonz%rsa_signature_2048_sha3_256_test.jsonz%rsa_signature_2048_sha3_384_test.jsonz%rsa_signature_2048_sha3_512_test.jsonz#rsa_signature_2048_sha512_test.jsonz'rsa_signature_2048_sha512_224_test.jsonz'rsa_signature_2048_sha512_256_test.jsonz#rsa_signature_3072_sha256_test.jsonz#rsa_signature_3072_sha384_test.jsonz%rsa_signature_3072_sha3_256_test.jsonz%rsa_signature_3072_sha3_384_test.jsonz%rsa_signature_3072_sha3_512_test.jsonz#rsa_signature_3072_sha512_test.jsonz'rsa_signature_3072_sha512_256_test.jsonz#rsa_signature_4096_sha384_test.jsonz#rsa_signature_4096_sha512_test.jsonz'rsa_signature_4096_sha512_256_test.jsonzrsa_signature_test.json)tv	add_testsr    r   r   r   setUp   s.    




















zTestVectorsWycheproof.setUpc                 C   s8   dd }dd }dd }t d|d| |||d	d
}|S )Nc                 S   s   t | d S )NZkeyPem)r   Z
import_key)groupr   r   r   
filter_rsa  s    z3TestVectorsWycheproof.add_tests.<locals>.filter_rsac                 S   s   | d }|dkrt S |dkr(t jddS |dkr<t jddS |dkrHtS |d	krTtS |d
kr`tS |dkrltS |dkrxtS |dkrtS |dkrtS |dkrt	S t
d| d S )NshazSHA-512zSHA-512/224Z224)truncatezSHA-512/256Z256zSHA3-512zSHA-384zSHA3-384zSHA-256zSHA3-256zSHA-224zSHA3-224zSHA-1zUnknown hash algorithm: )r   r   r   r   r   r   r   r   r   r
   rD   )rq   r   r   r   r   
filter_sha  s0    z3TestVectorsWycheproof.add_tests.<locals>.filter_shac                 S   s    | d }|dkrt d| d S )Ntype)ZRsassaPkcs1VerifyZRsassaPkcs1GeneratezUnknown type name )rD   )rq   	type_namer   r   r   filter_type   s    z4TestVectorsWycheproof.add_tests.<locals>.filter_type)r0   Z
wycheproofz$Wycheproof PKCS#1v1.5 signature (%s))Zrsa_keyZhash_modrv   )Z	group_tag)r	   )r!   filenamerr   ru   rx   r9   r   r   r   ro      s    zTestVectorsWycheproof.add_testsc                 C   s   | j S r1   )rl   r    r   r   r   r"   -  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))warningrk   warningswarnrl   comment)r!   rn   r{   r   r   r   r|   0  s    zTestVectorsWycheproof.warnc              
   C   s   dt |j | _|j|j}t|j}z|||j	}W n< t
k
rx } z|jr^W Y d S |jrhtW 5 d }~X Y nX |jst| | d S )NzWycheproof RSA PKCS$#1 Test #)stridrl   hash_moduler   rP   r   rX   r>   sigrD   rz   ZvalidAssertionErrorr|   )r!   rn   Z
hashed_msgrH   rA   rJ   r   r   r   test_verify5  s    

z!TestVectorsWycheproof.test_verifyc                 C   s   | j D ]}| | qd S r1   )rn   r   )r!   rn   r   r   r   rR   D  s    
zTestVectorsWycheproof.runTestN)
r+   r,   r-   rj   rp   ro   r"   r|   r   rR   r   r   r   r   rf      s   -rf   c                 C   s~   |  d}g }|tt7 }|tt7 }|tt7 }|tt7 }|tt7 }|t|g7 }|  drz|tt7 }|tt	7 }|S )Nrm   Z
slow_tests)
getr   r   rG   rM   rT   rY   rf   r.   rI   )configrm   testsr   r   r   	get_testsI  s    

r   __main__c                   C   s   t t S r1   )rh   Z	TestSuiter   r   r   r   r   r4   [  r5   suite)ZdefaultTest)Kjsonrh   binasciir   ZCryptodome.Util.py3compatr   ZCryptodome.Util.numberr   ZCryptodome.Util.strxorr   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   r	   rd   r
   r   r   r   r   r   r   r   r   ZCryptodome.PublicKeyr   ZCryptodome.Signaturer   r   ZCryptodome.Util._file_systemr   r   ri   r   r.   Ztest_vectors_verify	enumeratecountrn   
isinstancer~   hasattrr:   modulusr7   upperr   r   rP   r@   Z	constructrJ   r%   r(   srB   rE   r9   setattrrG   rI   Ztest_vectors_signr8   Zprivate_keyrH   rL   rM   rT   rY   rf   r   r+   r   mainr   r   r   r   <module>   s   ,



i
