o
    e<?                     @   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pg Z!e"e!D ]z\Z#Z$e%e$e&rqe'e$dre$j(Z)qe'e$drqe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re;e d(e# e8 qe;e d)e# e9 qG d*d+ d+e jZ<G d,d- d-e jZ=edd.d/d0d1d ip!g Z>e>edd2d3d0d4d ip0g 7 Z>e"e>D ]m\Z#Z$e%e$e&rBq6e'e$drMe$j(Z)q6e'e$d5rde0d6d  e)e$j1e$j?fD Z@q6ee$j*+ Z,e,-e$j.Z/e$j3ed!kree$j3Z4ej-e@e5e$j3e4d"ZAnej-e@d d#ZAe/eAe$j7fd7d8ZBe;e=d9e# eB q6G 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 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Crypto.Hash.new)
__import__globalslocals)	hash_name r   RD:\Projects\ConvertPro\env\Lib\site-packages\Crypto/SelfTest/Signature/test_pss.pyload_hash_by_name/   s   r   c                   @      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/   r0   r1   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_bytesr4   r8   r   r   r   test_negative_2R   s
   
zPSS_Tests.test_negative_2N)	r&   r'   r(   r+   r,   r.   r2   r9   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      dS )NzFIPS PKCS1 Tests (Verify)r   r!   r   r   r   shortDescription\      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_keysalt	signatureprnghashedr1   r   r   r   verify_positive_   s   
z'FIPS_PKCS1_Verify_Tests.verify_positivec           	      C   s<   t |}||}tj|t||d}| t|j|| d S rB   )r   r   r   rD   r6   r7   r-   rE   r   r   r   verify_negativee   s   
z'FIPS_PKCS1_Verify_Tests.verify_negativec                 C   s,   t d }t|}| | d d S )N   F)r   generaterG   r   r   assertEqualcan_sign)r!   Ztest_public_keyr1   r   r   r   test_can_signk   s   
z%FIPS_PKCS1_Verify_Tests.test_can_signN)r&   r'   r(   r@   rL   rM   rR   r   r   r   r   r=   Z   s
    r=   c                   @      e Zd ZdS )FIPS_PKCS1_Verify_Tests_KATNr&   r'   r(   r   r   r   r   rT   q       rT   )	Signaturez	PKCS1-PSSzSigVerPSS_186-3.rspzSignature Verification 186-3c                 C      | S r#   r   xr   r   r   <lambda>x       r[   c                 C   rX   r#   r   rY   r   r   r   r[   y   r\   )shaalgr$   npc                 C      g | ]}t |qS r   r   .0rZ   r   r   r   
<listcomp>       rc    rC   r:   c                 C   s   | || d S r#   )r-   r!   hash_objr1   rI   r   r   r   positive_test   s   rh   c                 C   s   |  t|j|| d S r#   )r6   r7   r-   rf   r   r   r   negative_test   s   ri   ztest_positive_%dztest_negative_%dc                   @   r   )FIPS_PKCS1_Sign_Testsc                 C   r>   )NzFIPS PKCS1 Tests (Sign)r   r?   r   r   r   r@      rA   z&FIPS_PKCS1_Sign_Tests.shortDescriptionc                 C   s(   t d}t|}| | d d S )NrN   T)r   rO   r   r   rP   rQ   )r!   Ztest_private_keysignerr   r   r   rR      s   

z#FIPS_PKCS1_Sign_Tests.test_can_signN)r&   r'   r(   r@   rR   r   r   r   r   rj          rj   c                   @   rS   )FIPS_PKCS1_Sign_Tests_KATNrU   r   r   r   r   rm      rV   rm   zSigGenPSS_186-2.txtzSignature Generation 186-2r]   c                 C   rX   r#   r   rY   r   r   r   r[      r\   zSigGenPSS_186-3.txtzSignature Generation 186-3c                 C   rX   r#   r   rY   r   r   r   r[      r\   ec                 C   r`   r   r   ra   r   r   r   rc      rd   c                 C   s   | |}| || d S r#   )signrP   )r!   rg   rk   r$   rI   r   r   r   new_test   s   
rp   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 Crypto.Signature.PKCS1_PSS
    behaves as expected. The only difference is that the verify()
    method returns True/False and does not raise exceptions.c                 C   r>   )Nz&Test legacy Crypto.Signature.PKCS1_PSSr   r?   r   r   r   r@      rA   z*PKCS1_Legacy_Module_Tests.shortDescriptionc                 C   sx   t d}ttd}t||}t| }| |	||d t
|tdt| }| |	||d d S )NrN   TestT   F)r   rO   r
   r   r   r   ro   rG   rP   r-   r   r   rD   )r!   r/   rK   Zgood_signaturer1   Zbad_signaturer   r   r   runTest   s   
z!PKCS1_Legacy_Module_Tests.runTestN)r&   r'   r(   __doc__r@   rt   r   r   r   r   rq      s    rq   c                   @   r   )PKCS1_All_Hashes_Testsc                 C   r>   )Nz8Test PKCS#1 PSS signature in combination with all hashesr   r?   r   r   r   r@      rA   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}	||	 q)dD ]}|j|tdd}
||
 q<d S )	Ni   )ZMD2ZMD4MD5Z	RIPEMD160r
   r   r   r   r   ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512rr   r   )BLAKE2bBLAKE2s)       0   @   )Zdigest_bytesdata)   rz      r{   )
r   rO   r   r   r   r   ro   Crypto.Hashrx   ry   )r!   r/   rk   Z
hash_namesnamerK   rx   ry   Z	hash_sizeZhashed_bZhashed_sr   r   r   rt      s   

zPKCS1_All_Hashes_Tests.runTestN)r&   r'   r(   r@   rt   r   r   r   r   rv      rl   rv   c                 C   s   | dkrt }|S | dkrt jdd}|S | dkr t jdd}|S | dkr(t}|S | dkr0t}|S | d	kr8t}|S | d
kr@t}|S td|  )NzSHA-512zSHA-512/224Z224)truncatezSHA-512/256256zSHA-384zSHA-256zSHA-224zSHA-1zUnknown hash algorithm: )r   r   r   r   r   r
   r7   )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     z6TestVectorsPSSWycheproof.add_tests.<locals>.filter_shac                 S   s    | d }|dvrt d| d S )Ntype)ZRsassaPssVerifyzUnknown type name )r7   )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vrt d| t| d }|fdd}|S )Nmgfr   zUnknown MGF ZmgfShac                 S   s   t | ||S r#   r   )rZ   ymhr   r   r   r   ,  r   zCTestVectorsPSSWycheproof.add_tests.<locals>.filter_mgf.<locals>.mgf)r7   r   )r   r   Z	mgf1_hashr   r   r   
filter_mgf&  s   z6TestVectorsPSSWycheproof.add_tests.<locals>.filter_mgf)rW   Z
wycheproofzWycheproof PSS signature (%s))r/   r   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   s6   |j r| jrdd l}|d| j|jf  d S d S 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yF } z|jr6W Y d }~d S |jr;J W Y d }~d S d }~ww |jsLJ | | d S )Nz Wycheproof RSA PSS Test #%d (%s))Z	mask_funcr;   )idr   r   r   r   r,   r   r/   r   r   r-   sigr7   r   Zvalidr   )r!   r   Z
hashed_msgrk   rI   rn   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   rt   ^  s   
z TestVectorsPSSWycheproof.runTestN)
r&   r'   r(   r"   r   r   r@   r   r   rt   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r6|tt7 }|tt7 }|t	|g7 }|S )Nr   Z
slow_tests)
getr   r)   r=   rj   rq   rv   rT   rm   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  r   r   )ZdefaultTest)Kr   ZCrypto.Util.py3compatr   r   ZCrypto.Util.numberr   ZCrypto.Util.strxorr   ZCrypto.SelfTest.st_commonr   ZCrypto.SelfTest.loaderr   r	   r   r
   r   r   r   r   ZCrypto.PublicKeyr   ZCrypto.Signaturer   r   ZCrypto.Signature.pssr   r   objectr   r   r)   r=   rT   Ztest_vectors_verify	enumeratecountr   
isinstancestrhasattrr^   modulusr]   upperr   r   r,   rg   	constructrn   rG   ZsaltvalrJ   rD   r1   srh   ri   r$   setattrrj   rm   Ztest_vectors_signdZprivate_keyrk   rp   rq   rv   r   r   r   r&   r   mainr   r   r   r   <module>   s   







T
