U
    Mf=                     @   s  d dl 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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 ZG dd deZG dd de jZG dd de jZG dd de jZ eddddd dd dpg Z!e"e!D ]\Z#Z$e%e$e&r*qe'e$dr@e$j(Z)qe'e$drPqee$j*+ Z,e,-e$j.Z/e0dd  e)e$j1fD Z2e$j3ed!kree$j3Z4ej-e2e5e$j3e4d"Z6nej-e2d d#Z6e/e6e$j7fd$d%Z8e/e6e$j7fd&d'Z9e$j:dkre;e d(e# e8 ne;e d)e# e9 qG d*d+ d+e jZ<G d,d- d-e jZ=edd.d/d0d1d ipXg Z>e>edd2d3d0d4d ipvg 7 Z>e"e>D ]\Z#Z$e%e$e&rqe'e$dre$j(Z)qe'e$d5re0d6d  e)e$j1e$j?fD Z@qee$j*+ Z,e,-e$j.Z/e$j3ed!kr*ee$j3Z4ej-e@e5e$j3e4d"ZAnej-e@d d#ZAe/eAe$j7fd7d8ZBe;e=d9e# eB qG d:d; d;e jZCG d<d= d=e jZDd>d? ZEG d@dA dAe jZFi fdBdCZGeHdDkrdEdF ZIe jJdFdG dS )H    N)bbchrbytes_to_long)strxor)list_test_cases)load_test_vectorsload_test_vectors_wycheproof)SHA1SHA224SHA256SHA384SHA512)RSA)pss)	PKCS1_PSSMGF1c                 C   s   t d|  t t dgS )NzCryptodome.Hash.new)
__import__globalslocals)	hash_name r   J/tmp/pip-unpacked-wheel-l_0d1exj/Cryptodome/SelfTest/Signature/test_pss.pyload_hash_by_name/   s    r   c                   @   s   e Zd Zdd Zdd ZdS )PRNGc                 C   s   || _ d| _d S )Nr   streamidx)selfr   r   r   r   __init__5   s    zPRNG.__init__c                 C   s(   | j | j| j|  }|  j|7  _|S Nr   )r    Zrnd_sizeresultr   r   r   __call__9   s    zPRNG.__call__N)__name__
__module____qualname__r!   r$   r   r   r   r   r   3   s   r   c                   @   s0   e Zd ZdZdZdZdd Zdd Zdd	 Zd
S )	PSS_Testss  -----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsvI34FgiTK8+txBvmooNGpNwk23YTU51dwNZi5yha3W4lA/Q
vcZrDalkmD7ekWQwnduxVKa6pRSI13KBgeUOIqJoGXSWhntEtY3FEwvWOHW5AE7Q
jUzTzCiYT6TVaCcpa/7YLai+p6ai2g5f5Zfh4jSawa9uYeuggFygQq4IVW796MgV
yqxYMM/arEj+/sKz3Viua9Rp9fFosertCYCX4DUTgW0mX9bwEnEOgjSI3pLOPXz1
8vx+DRZS5wMCmwCUa0sKonLn3cAUPq+sGix7+eo7T0Z12MU8ud7IYVX/75r3cXiF
PaYE2q8Le0kgOApIXbb+x74x0rNgyIh1yGygkwIDAQABAoIBABz4t1A0pLT6qHI2
EIOaNz3mwhK0dZEqkz0GB1Dhtoax5ATgvKCFB98J3lYB08IBURe1snOsnMpOVUtg
aBRSM+QqnCUG6bnzKjAkuFP5liDE+oNQv1YpKp9CsUovuzdmI8Au3ewihl+ZTIN2
UVNYMEOR1b5m+z2SSwWNOYsiJwpBrT7zkpdlDyjat7FiiPhMMIMXjhQFVxURMIcB
jUBtPzGvV/PG90cVDWi1wRGeeP1dDqti/jsnvykQ15KW1MqGrpeNKRmDdTy/Ucl1
WIoYklKw3U456lgZ/rDTDB818+Tlnk35z4yF7d5ANPM8CKfqOPcnO1BCKVFzf4eq
54wvUtkCgYEA1Zv2lp06l7rXMsvNtyYQjbFChezRDRnPwZmN4NCdRtTgGG1G0Ryd
Yz6WWoPGqZp0b4LAaaHd3W2GTcpXF8WXMKfMX1W+tMAxMozfsXRKMcHoypwuS5wT
fJRXJCG4pvd57AB0iVUEJW2we+uGKU5Zxcx//id2nXGCpoRyViIplQsCgYEA1nVC
eHupHChht0Fh4N09cGqZHZzuwXjOUMzR3Vsfz+4WzVS3NvIgN4g5YgmQFOeKwo5y
iRq5yvubcNdFvf85eHWClg0zPAyxJCVUWigCrrOanGEhJo6re4idJvNVzu4Ucg0v
6B3SJ1HsCda+ZSNz24bSyqRep8A+RoAaoVSFx5kCgYEAn3RvXPs9s+obnqWYiPF3
Re5etE6Vt2vfNKwFxx6zaR6bsmBQjuUHcABWiHb6I71S0bMPI0tbrWGG8ibrYKl1
NTLtUvVVCOS3VP7oNTWT9RTFTAnOXU7DFSo+6o/poWn3r36ff6zhDXeWWMr2OXtt
dEQ1/2lCGEGVv+v61eVmmQUCgYABFHITPTwqwiFL1O5zPWnzyPWgaovhOYSAb6eW
38CXQXGn8wdBJZL39J2lWrr4//l45VK6UgIhfYbY2JynSkO10ZGow8RARygVMILu
OUlaK9lZdDvAf/NpGdUAvzTtZ9F+iYZ2OsA2JnlzyzsGM1l//3vMPWukmJk3ral0
qoJJ8QKBgGRG3eVHnIegBbFVuMDp2NTcfuSuDVUQ1fGAwtPiFa8u81IodJnMk2pq
iXu2+0ytNA/M+SVrAnE2AgIzcaJbtr0p2srkuVM7KMWnG1vWFNjtXN8fAhf/joOv
D+NmPL/N4uE57e40tbiU/H7KdyZaDt+5QiTmdhuyAe6CBjKsF2jy
-----END RSA PRIVATE KEY-----s   AAAs    [c5ذ!Dݹ`P>X5ݎŉP+ɯPL5k{=_R}b5Y~}l1-Vlk/o5Q$	=ABPG"~<p5 +c,\)voʆ95neQ@xɛUCT/ǕhCb1>jqkbsbm(`F.)/_Sv/DT:s</c                 C   s4   t | j}t| j}t|}||| j d S r"   )	r   
import_keyrsa_keyr   r   msgr   verifytag)r    keyhverifierr   r   r   test_positive_1E   s    
zPSS_Tests.test_positive_1c                 C   sF   t | j}t| jd }t|}t| j}| 	t
|j|| d S )N   Ar   r)   r*   r   r   r+   r   	bytearrayr-   assertRaises
ValueErrorr,   r    r.   r/   r0   r-   r   r   r   test_negative_1K   s
    

zPSS_Tests.test_negative_1c                 C   sF   t | j}t| j}tj|dd}t| j}| 	t
|j|| d S )Ni  
salt_bytesr3   r7   r   r   r   test_negative_2R   s
    
zPSS_Tests.test_negative_2N)	r%   r&   r'   r*   r+   r-   r1   r8   r;   r   r   r   r   r(   ?   s   r(   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FIPS_PKCS1_Verify_Testsc                 C   s   dS )NzFIPS PKCS1 Tests (Verify)r   r    r   r   r   shortDescription\   s    z(FIPS_PKCS1_Verify_Tests.shortDescriptionc           	      C   s6   t |}||}tj|t||d}||| d S Nr:   Z	rand_func)r   r   r   lenr,   	r    Zhashmodmessage
public_keyZsalt	signatureprnghashedr0   r   r   r   verify_positive_   s    
z'FIPS_PKCS1_Verify_Tests.verify_positivec           	      C   s<   t |}||}tj|t||d}| t|j|| d S r?   )r   r   r   rA   r5   r6   r,   rB   r   r   r   verify_negativee   s    
z'FIPS_PKCS1_Verify_Tests.verify_negativec                 C   s,   t d }t|}| | d d S )N   F)r   generaterD   r   r   assertEqualcan_sign)r    Ztest_public_keyr0   r   r   r   test_can_signk   s    
z%FIPS_PKCS1_Verify_Tests.test_can_signN)r%   r&   r'   r>   rH   rI   rN   r   r   r   r   r<   Z   s   r<   c                   @   s   e Zd ZdS )FIPS_PKCS1_Verify_Tests_KATNr%   r&   r'   r   r   r   r   rO   q   s   rO   )	Signaturez	PKCS1-PSSzSigVerPSS_186-3.rspzSignature Verification 186-3c                 C   s   | S r"   r   xr   r   r   <lambda>x       rT   c                 C   s   | S r"   r   rR   r   r   r   rT   y   rU   )shaalgr#   npc                 C   s   g | ]}t |qS r   r   .0rS   r   r   r   
<listcomp>   s     r[    r@   r9   c                 C   s   | || d S r"   )r,   r    hash_objr0   rE   r   r   r   positive_test   s    r_   c                 C   s   |  t|j|| d S r"   )r5   r6   r,   r]   r   r   r   negative_test   s    r`   ztest_positive_%dztest_negative_%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>      s    z&FIPS_PKCS1_Sign_Tests.shortDescriptionc                 C   s(   t d}t|}| | d d S )NrJ   T)r   rK   r   r   rL   rM   )r    Ztest_private_keysignerr   r   r   rN      s    

z#FIPS_PKCS1_Sign_Tests.test_can_signN)r%   r&   r'   r>   rN   r   r   r   r   ra      s   ra   c                   @   s   e Zd ZdS )FIPS_PKCS1_Sign_Tests_KATNrP   r   r   r   r   rc      s   rc   zSigGenPSS_186-2.txtzSignature Generation 186-2rV   c                 C   s   | S r"   r   rR   r   r   r   rT      rU   zSigGenPSS_186-3.txtzSignature Generation 186-3c                 C   s   | S r"   r   rR   r   r   r   rT      rU   ec                 C   s   g | ]}t |qS r   r   rY   r   r   r   r[      s     c                 C   s   | |}| || d S r"   )signrL   )r    r^   rb   r#   rE   r   r   r   new_test   s    
rf   ztest_%dc                   @   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_PSS
    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_PSSr   r=   r   r   r   r>      s    z*PKCS1_Legacy_Module_Tests.shortDescriptionc                 C   sx   t d}ttd}t||}t| }| |	||d t
|tdt| }| |	||d d S )NrJ   TestT   F)r   rK   r
   r   r   r   re   rD   rL   r,   r   r   rA   )r    r.   rG   Zgood_signaturer0   Zbad_signaturer   r   r   runTest   s    
z!PKCS1_Legacy_Module_Tests.runTestN)r%   r&   r'   __doc__r>   rj   r   r   r   r   rg      s   rg   c                   @   s   e Zd Zdd Zdd ZdS )PKCS1_All_Hashes_Testsc                 C   s   dS )Nz8Test PKCS#1 PSS 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|td}|| qddlm}m	} dD ] }|j|tdd}	||	 qRdD ] }|j|tdd}
||
 qxd S )	Ni   )ZMD2ZMD4MD5Z	RIPEMD160r
   r   r   r   r   ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512rh   r   )BLAKE2bBLAKE2s)       0   @   )Zdigest_bytesdata)   rp      rq   )
r   rK   r   r   r   r   re   Cryptodome.Hashrn   ro   )r    r.   rb   Z
hash_namesnamerG   rn   ro   Z	hash_sizeZhashed_bZhashed_sr   r   r   rj      s    

zPKCS1_All_Hashes_Tests.runTestN)r%   r&   r'   r>   rj   r   r   r   r   rl      s   rl   c                 C   s   | dkrt }np| dkr$t jdd}nZ| dkr:t jdd}nD| dkrHt}n6| dkrVt}n(| d	krdt}n| d
krrt}ntd|  |S )NzSHA-512zSHA-512/224Z224)truncatezSHA-512/256Z256zSHA-384zSHA-256zSHA-224zSHA-1zUnknown hash algorithm: )r   r   r   r   r   r
   r6   )r   hash_moduler   r   r   get_hash_module   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 )TestVectorsPSSWycheproofc                 C   s   t j|  || _d| _d S )NNone)unittestTestCaser!   _wycheproof_warnings_id)r    wycheproof_warningsr   r   r   r!     s    z!TestVectorsPSSWycheproof.__init__c              
   C   sL   dd }dd }dd }dd }d	d
 }t d|d| |||||dd}|S )Nc                 S   s   t | d S )NZkeyPem)r   r)   groupr   r   r   
filter_rsa  s    z6TestVectorsPSSWycheproof.add_tests.<locals>.filter_rsac                 S   s   t | d S )Nsha)r{   r   r   r   r   
filter_sha  s    z6TestVectorsPSSWycheproof.add_tests.<locals>.filter_shac                 S   s    | d }|dkrt d| d S )Ntype)ZRsassaPssVerifyzUnknown type name )r6   )r   	type_namer   r   r   filter_type  s    z7TestVectorsPSSWycheproof.add_tests.<locals>.filter_typec                 S   s   | d S )NsLenr   r   r   r   r   filter_slen#  s    z7TestVectorsPSSWycheproof.add_tests.<locals>.filter_slenc                 S   s8   | d }|dkrt d| t| d }|fdd}|S )Nmgfr   zUnknown MGF ZmgfShac                 S   s   t | ||S r"   r   )rS   yZmhr   r   r   r   ,  s    zCTestVectorsPSSWycheproof.add_tests.<locals>.filter_mgf.<locals>.mgf)r6   r{   )r   r   Z	mgf1_hashr   r   r   
filter_mgf&  s    z6TestVectorsPSSWycheproof.add_tests.<locals>.filter_mgf)rQ   Z
wycheproofzWycheproof PSS signature (%s))r.   rz   r   r   r   )Z	group_tag)r	   )r    filenamer   r   r   r   r   r#   r   r   r   	add_tests  s     z"TestVectorsPSSWycheproof.add_testsc                 C   sd   g | _ | d | d | d | d | d | d | d | d | d	 d S )
Nz#rsa_pss_2048_sha1_mgf1_20_test.jsonz$rsa_pss_2048_sha256_mgf1_0_test.jsonz%rsa_pss_2048_sha256_mgf1_32_test.jsonz)rsa_pss_2048_sha512_256_mgf1_28_test.jsonz)rsa_pss_2048_sha512_256_mgf1_32_test.jsonz%rsa_pss_3072_sha256_mgf1_32_test.jsonz%rsa_pss_4096_sha256_mgf1_32_test.jsonz%rsa_pss_4096_sha512_mgf1_32_test.jsonzrsa_pss_misc_test.json)tvr   r=   r   r   r   setUp;  s    







zTestVectorsPSSWycheproof.setUpc                 C   s   | j S r"   )r   r=   r   r   r   r>   G  s    z)TestVectorsPSSWycheproof.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    r   r   r   r   r   r   J  s    zTestVectorsPSSWycheproof.warnc              
   C   s   d|j |jf | _|j|j}tj|j|j|j	d}z|
||j}W n< tk
r } z|jrjW Y d S |jrttW 5 d }~X Y nX |jst| | d S )Nz Wycheproof RSA PSS Test #%d (%s))Z	mask_funcr:   )idr   r   rz   r   r+   r   r.   r   r   r,   sigr6   r   ZvalidAssertionErrorr   )r    r   Z
hashed_msgrb   rE   rd   r   r   r   test_verifyO  s    

z$TestVectorsPSSWycheproof.test_verifyc                 C   s   | j D ]}| | qd S r"   )r   r   )r    r   r   r   r   rj   ^  s    
z TestVectorsPSSWycheproof.runTestN)
r%   r&   r'   r!   r   r   r>   r   r   rj   r   r   r   r   r|     s   %r|   c                 C   s~   |  d}g }|tt7 }|tt7 }|tt7 }|tt7 }|tt7 }|  drl|tt7 }|tt7 }|t	|g7 }|S )Nr   Z
slow_tests)
getr   r(   r<   ra   rg   rl   rO   rc   r|   )configr   testsr   r   r   	get_testsc  s    

r   __main__c                   C   s   t t S r"   )r~   Z	TestSuiter   r   r   r   r   suitew  s    r   )ZdefaultTest)Kr~   ZCryptodome.Util.py3compatr   r   ZCryptodome.Util.numberr   ZCryptodome.Util.strxorr   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   r	   rw   r
   r   r   r   r   ZCryptodome.PublicKeyr   ZCryptodome.Signaturer   r   ZCryptodome.Signature.pssr   r   objectr   r   r(   r<   rO   Ztest_vectors_verify	enumeratecountr   
isinstancestrhasattrrW   modulusrV   upperrz   r   r+   r^   Z	constructrd   rD   ZsaltvalrF   rA   r0   sr_   r`   r#   setattrra   rc   Ztest_vectors_signdZprivate_keyrb   rf   rg   rl   r{   r|   r   r%   r   mainr   r   r   r   <module>   s   



T
