a
    db5                    @   sn  d dl mZmZ zd dlZW n ey6   d dlZY n0 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mZ d dlmZmZmZm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mZmZ dd	lmZm Z  dd
lm!Z!m"Z"m#Z# ddl$m%Z% ddl%m&Z&m'Z' ddl%m(Z(m)Z) ddl%m*Z*m+Z+m,Z, ddl-m.Z.m/Z/ ddl-m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@m-Z- ddlAmBZBmCZCmDZDmEZE ddlFmGZG ddl$mHZH ddl$mIZI ddl$mAZA G dd deJZKdd ZLG dd dejMZNe
jOPddd eQdD d d! ZRg ZSe-D ]2ZTd"D ]&ZUeSVe
jWeTeUd#XeTjYeUd$ q2q*e
jOPd%eSd&d' ZZG d(d) d)ejMZ[G d*d+ d+ejMZ\G d,d- d-ejMZ]G d.d/ d/ejMZ^G d0d1 d1ejMZ_G d2d3 d3ejMZ`G d4d5 d5e`ZaG d6d7 d7e`Zbe
jOPd8e
jWd9d:d;d<d=ed>d?e6d@d$
e
jWdAdBdCdDd=edEdFe7dGd$
e
jWdHdIdJdKd=edLdMe8dNd$
gdOdP ZcdS )Q    )with_statementdivisionN)hexlify	unhexlify)sha1sha256sha384sha512)partial)given)bprint_binary_type   )
SigningKeyVerifyingKey)BadSignatureErrorMalformedPointErrorBadDigestError)util)sigencode_dersigencode_strings)sigdecode_dersigdecode_strings)number_to_stringencoded_oid_ecPublicKeyMalformedSignature)CurveUnknownCurveError)	SECP112r1	SECP112r2	SECP128r1	SECP160r1NIST192pNIST224pNIST256pNIST384pNIST521p	SECP256k1BRAINPOOLP160r1BRAINPOOLP192r1BRAINPOOLP224r1BRAINPOOLP256r1BRAINPOOLP320r1BRAINPOOLP384r1BRAINPOOLP512r1curves)curve_brainpoolp224r1curve_brainpoolp256r1curve_brainpoolp384r1curve_brainpoolp512r1)Point)der)rfc6979)ecdsac                   @   s   e Zd ZdS )SubprocessErrorN)__name__
__module____qualname__ r=   r=   c/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python3.9/site-packages/ecdsa/test_pyecdsa.pyr9   <   s   r9   c                 C   sV   d}t j|g|   t jt jd}| \}}|jdkrNtd|| |j|f | S )NZopenssl)stdoutstderrr   z,cmd '%s %s' failed: rc=%s, stdout/err was %s)	
subprocessPopensplitPIPESTDOUTcommunicate
returncoder9   decode)cmdZOPENSSLpr?   Zignoredr=   r=   r>   run_openssl@   s    
rK   c                   @   s  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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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9dodp Z:dqdr Z;dsS )tECDSAc                 C   sr   t  }| }td}||}| ||| | t|j||td  t	
| }| ||| d S )Nblahblahbad)r   generateget_verifying_keyr   sign
assertTrueverifyassertRaisesr   r   from_string	to_string)selfprivpubdatasigpub2r=   r=   r>   
test_basicQ   s    
zECDSA.test_basicc           	      C   s   t d}tdd}t|tt}| }ttj	
 |tt| }|j||d}| ||| |j||d}| ||| ||t}| ||| | || | || d S )NrM    9d0219792467d7d37b4d43298a7d0c05   )k)r   intr   from_secret_exponentr(   r   rP   r7   
generate_k	generatororderdigestrQ   rR   rS   Zsign_deterministicassertEqual)	rW   rZ   secexprX   rY   r`   sig1sig2Zsig3r=   r=   r>   test_deterministic^   s    
zECDSA.test_deterministicc                 C   s   |  tt |  tt d S N)rT   	TypeErrorr   r   rW   r=   r=   r>   test_bad_usageu   s    zECDSA.test_bad_usagec                 C   s   t }t }| }| t| |j |t	d}| t||j
 t tttttttttttfD ]r}tj|d}| }t| |}| | |  | t| |j |t	d}| t||j
 qfd S )NrZ   curve)r#   r   rO   rP   rg   lenrV   verifying_key_lengthrQ   r   signature_lengthr$   r%   r&   r'   r)   r*   r+   r,   r-   r.   r/   r   rU   )rW   defaultrX   rY   r[   rq   pub1r\   r=   r=   r>   test_lengthsz   s4    zECDSA.test_lengthsc                 C   s  t d}t}t||j}t||j}| || t||}t||}| t|	 t|	  | |
 |
  | }| }t d}	||	}
||	}| ||
|	 | ||
|	 | |||	 | |||	 | t|	 t|	  d S )NsecretrZ   )r   r#   r    randrange_from_seed__trytryagainre   rg   r   rb   r   rV   to_pemrP   rQ   rR   rS   )rW   seedrq   Zsecexp1Zsecexp2priv1priv2rv   r\   rZ   ri   rj   r=   r=   r>   test_serialize   s*    

zECDSA.test_serializec                    s   t d  fdd}tj|d}tj|d}| t|  t|   |jt d|d}|jt d|d}| t|t| d S )N=all the entropy in the entire world, compressed into one linec                    s    d |  S rl   r=   numbytessr=   r>   not_much_entropy   s    z.ECDSA.test_nonrandom.<locals>.not_much_entropyentropyrZ   )r   r   rO   rg   r   rP   rV   rQ   )rW   r   r|   r}   ri   rj   r=   r   r>   test_nonrandom   s    zECDSA.test_nonrandomc                 C   s0   |  |jj|jj |  |jjj|jjj d S rl   )rg   privkeysecret_multiplierZ
public_keyrd   )rW   r|   r}   r=   r=   r>   assertTruePrivkeysEqual   s    zECDSA.assertTruePrivkeysEqualc                    s   t d  fdd}t }| |jtj tjtd}| |jtj tj|d}| |jtj tj|d}| |jtj | || tjdd}| |jtj tjdd}| || tjdtd	}| |jtj d S )
Nr   c                    s    d |  S rl   r=   r   r   r=   r>   r      s    z5ECDSA.test_privkey_creation.<locals>.not_much_entropyrp   r      )rh      )rh   rq   )	r   r   rO   rg   baselenr#   r$   r   rb   )rW   r   r|   r}   r=   r   r>   test_privkey_creation   s"    zECDSA.test_privkey_creationc                 C   sh  t  }| }| t|t | t|tj t 	|}| 
|| | }| t|t | |td | | td t |}| 
|| | }| t|t t |}| 
|| t jtd}| }| t|t | |td | | td t |}| 
|| | }| t|t t |}| 
|| d S )N-----BEGIN EC PRIVATE KEY----------END EC PRIVATE KEY-----rp   )r   rO   rV   rg   typer   rr   r#   r   rU   r   rz   rR   
startswithr   stripendswithfrom_pemto_derfrom_derr%   rW   r|   s1r}   r=   r=   r>   test_privkey_strings   s6    




zECDSA.test_privkey_stringsc                 C   s   t jtd}| }| t|t | |t	d | |
 t	d t |}| || | }| t|t t |}| || d S )Nrp   r   r   )r   rO   r/   rz   rg   r   r   rR   r   r   r   r   r   r   r   r   r   r=   r=   r>   test_privkey_strings_brainpool  s    

z$ECDSA.test_privkey_strings_brainpoolc                 C   s<   |  |jj|jj |  |jj|jj |  |j|j d S rl   )rg   pubkeypointrd   rq   )rW   rv   r\   r=   r=   r>   assertTruePubkeysEqual  s    zECDSA.assertTruePubkeysEqualc                 C   s  t  }| }| }| t|t | t|tj	 t
|}| || t jtd}| }| }| t|t | t|tj	 t
j|td}| || | }| t|t t
|}| || | tjt
j|td  t
|}G dd d}G dd d}td| | dd }	|	|_| }
| tt
j|
 | }| t|t | |td	| | | td
| t
|}| || d S )Nrp   junkc                   @   s   e Zd Zdd ZdS )z0ECDSA.test_pubkey_strings.<locals>.FakeGeneratorc                 S   s   dS )N[r=   rn   r=   r=   r>   re   6  s    z6ECDSA.test_pubkey_strings.<locals>.FakeGenerator.orderN)r:   r;   r<   re   r=   r=   r=   r>   FakeGenerator5  s   r   c                   @   s   e Zd Zdd ZdS )z.ECDSA.test_pubkey_strings.<locals>.FakeCurveFpc                 S   s   t dS )NZM65255345290392407050209505469627313404541085228058844382513856749047873406763)ra   rn   r=   r=   r>   rJ   :  s    z0ECDSA.test_pubkey_strings.<locals>.FakeCurveFp.pN)r:   r;   r<   rJ   r=   r=   r=   r>   FakeCurveFp9  s   r   unknown)r      r   r         z-----BEGIN PUBLIC KEY-----z-----END PUBLIC KEY-----)r   rO   rP   rV   rg   r   r   rr   r#   rs   r   rU   r   r%   r   r   rT   r6   UnexpectedDERr   r   rq   r   rz   rR   r   r   r   r   )rW   r|   rv   r   r\   pub1_derZbadpubr   r   ZbadcurveZbadderZpemr=   r=   r>   test_pubkey_strings  sL    



zECDSA.test_pubkey_stringsc                 C   s   t jtd}| }| }| t|t | t|tj	 t
j|td}| || | }| t|t t
|}| || d S Nrp   )r   rO   r/   rP   rV   rg   r   r   rr   rs   r   rU   r   r   r   )rW   r|   rv   r   r\   r   r=   r=   r>   test_pubkey_strings_brainpoolP  s    
z#ECDSA.test_pubkey_strings_brainpoolc                 C   sF   t  }|j}| t |d W d    n1 s80    Y  d S Nraw)r   rO   verifying_keyrT   
ValueErrorr   rW   skvkr=   r=   r>   *test_vk_to_der_with_invalid_point_encoding^  s    z0ECDSA.test_vk_to_der_with_invalid_point_encodingc                 C   s@   t  }| t |d W d    n1 s20    Y  d S r   )r   rO   rT   r   r   rW   r   r=   r=   r>   *test_sk_to_der_with_invalid_point_encodinge  s    z0ECDSA.test_sk_to_der_with_invalid_point_encodingc                 C   st   t }tjd td }t||}tdd }t||}| tj t	| W d    n1 sf0    Y  d S )Nr   r   H  ='  r   r   r   garbage    )
r   r6   
encode_oidr   encode_sequenceencode_bitstringrT   r   r   r   rW   Ztype_oid_dercurve_oid_derZenc_type_derZ	point_der	to_decoder=   r=   r>   (test_vk_from_der_garbage_after_curve_oidk  s    
z.ECDSA.test_vk_from_der_garbage_after_curve_oidc                 C   sr   t jd }t jd }t ||}t dd }t ||}| t j t| W d    n1 sd0    Y  d S )Nr   r   r   r   r   )r6   r   r   r   rT   r   r   r   r   r=   r=   r>   !test_vk_from_der_invalid_key_typew  s    

z'ECDSA.test_vk_from_der_invalid_key_typec                 C   st   t }tjd }t||}tdd td }t||}| tj t	| W d    n1 sf0    Y  d S )Nr   r   r   )
r   r6   r   r   r   r   rT   r   r   r   r   r=   r=   r>   +test_vk_from_der_garbage_after_point_string  s    
z1ECDSA.test_vk_from_der_garbage_after_point_stringc                 C   sl   t }tjd }t||}tdd }t||}| tj t| W d    n1 s^0    Y  d S )Nr   s   	r   r6   r   r   r   rT   r   r   r   r   r=   r=   r>   "test_vk_from_der_invalid_bitstring  s    
z(ECDSA.test_vk_from_der_invalid_bitstringc                 C   sj   t }tjd }t||}tdd}t||}| t t| W d    n1 s\0    Y  d S )Nr   s@   r   )	r   r6   r   r   r   rT   r   r   r   r   r=   r=   r>   0test_vk_from_der_with_invalid_length_of_encoding  s    
z6ECDSA.test_vk_from_der_with_invalid_length_of_encodingc                 C   sl   t }tjd }t||}tdd}t||}| tj t| W d    n1 s^0    Y  d S )Nr   s0   r   r   r   r=   r=   r>   "test_vk_from_der_with_raw_encoding  s    
z(ECDSA.test_vk_from_der_with_raw_encodingc                 C   s&  t  }| }td}||}| t|t | t|t	j
 | ||| |j|td}| t|t | t|d | t|d t | t|d t | t|d t	j | t|d t	j | |j||td |j|td}| t|t | |j||td d S )NrZ   )	sigencoder   r   r   )	sigdecode)r   rO   rP   r   rQ   rg   r   r   rr   r#   rt   rR   rS   r   tupler   r   r   r   )rW   r|   rv   rZ   r[   sig_derr=   r=   r>   test_signature_strings  s$    
zECDSA.test_signature_stringsc                 C   sJ   |  t, ttdtdtdgd W d    n1 s<0    Y  d S )NonetwoZthree   rT   r   r   r   rn   r=   r=   r>   *test_sig_decode_strings_with_invalid_count  s    z0ECDSA.test_sig_decode_strings_with_invalid_countc                 C   sD   |  t& ttdtdgd W d    n1 s60    Y  d S )Nr   r   r   r   rn   r=   r=   r>   (test_sig_decode_strings_with_wrong_r_len  s    z.ECDSA.test_sig_decode_strings_with_wrong_r_lenc                 C   sD   |  t& ttdtdgd W d    n1 s60    Y  d S )N    u   °ÿr   r   rn   r=   r=   r>   (test_sig_decode_strings_with_wrong_s_len  s    z.ECDSA.test_sig_decode_strings_with_wrong_s_lenc                 C   sP   t  }|j}| t$ |d tdd  W d    n1 sB0    Y  d S )N    )r   rO   r   rT   r   Zverify_digestr   r   r=   r=   r>   test_verify_with_too_long_input  s    z%ECDSA.test_verify_with_too_long_inputc                 C   s8   |  t td W d    n1 s*0    Y  d S Nr   )rT   r   r   rb   rn   r=   r=   r>   4test_sk_from_secret_exponent_with_wrong_sec_exponent  s    z:ECDSA.test_sk_from_secret_exponent_with_wrong_sec_exponentc                 C   s<   |  t ttd W d    n1 s.0    Y  d S )N)rT   r   r   rU   r   rn   r=   r=   r>   )test_sk_from_string_with_wrong_len_string  s    z/ECDSA.test_sk_from_string_with_wrong_len_stringc                 C   sV   t d}t |td }| t j t| W d    n1 sH0    Y  d S )Nr   r   )r6   encode_integerr   r   rT   r   r   r   rW   ver_derr   r=   r=   r>   )test_sk_from_der_with_junk_after_sequence  s    
z/ECDSA.test_sk_from_der_with_junk_after_sequencec                 C   sN   t d}t |}| t j t| W d    n1 s@0    Y  d S r   )r6   r   r   rT   r   r   r   r   r=   r=   r>   #test_sk_from_der_with_wrong_version  s    

z)ECDSA.test_sk_from_der_with_wrong_versionc                 C   sx   t d}t td}t jd }t d|}t ||||}| t j t	
| W d    n1 sj0    Y  d S )Nr       ÿr   r6   r   encode_octet_stringr   r   encode_constructedr   rT   r   r   r   rW   r   privkey_derr   	const_derr   r=   r=   r>   "test_sk_from_der_invalid_const_tag  s    

z(ECDSA.test_sk_from_der_invalid_const_tagc                 C   s   t d}t td}t jd td }t d|}t ||||}| t j t	
| W d    n1 sr0    Y  d S )Nr   r   r   r   r   r   r   r=   r=   r>   *test_sk_from_der_garbage_after_privkey_oid  s    
z0ECDSA.test_sk_from_der_garbage_after_privkey_oidc                 C   s\   t d}t td}t jd }t d|}t ||||}t|}| 	|j
jd d S )Nr   r   r   r   r   )r6   r   r   r   r   r   r   r   r   rg   r   r   )rW   r   r   r   r   r   r   r=   r=   r>   #test_sk_from_der_with_short_privkey  s    


z)ECDSA.test_sk_from_der_with_short_privkeyc                 C   s   t d}t t ddddddt ddddddd}t t t dt d}t |||}| t j t| W d    n1 s0    Y  d S )Nr   r   r   r   r   r   	r6   r   r   r   r   rT   r   r   r   rW   r   Zalgorithm_derr   r   r=   r=   r>   &test_sk_from_p8_der_with_wrong_version  s    
z,ECDSA.test_sk_from_p8_der_with_wrong_versionc                 C   s   t d}t t dddt ddddddd}t t t dt d}t |||}| t j t| W d    n1 s0    Y  d S )Nr   r   r   r   r   r   r   r   r=   r=   r>   (test_sk_from_p8_der_with_wrong_algorithm  s    
 z.ECDSA.test_sk_from_p8_der_with_wrong_algorithmc                 C   s   t d}t t ddddddt dddddddt d}t t t dt d}t |||}| t j t| W d    n1 s0    Y  d S )Nr   r   r   r   r      junkr   r   r   r=   r=   r>   6test_sk_from_p8_der_with_trailing_junk_after_algorithm,  s    
z<ECDSA.test_sk_from_p8_der_with_trailing_junk_after_algorithmc                 C   s   t d}t t ddddddt ddddddd}t t t dt dt d }t |||t d}| t j t| W d    n1 s0    Y  d S )	Nr   r   r   r   r   r   i  r   r   r   r=   r=   r>   0test_sk_from_p8_der_with_trailing_junk_after_key=  s(    
z6ECDSA.test_sk_from_p8_der_with_trailing_junk_after_keyc                 C   sJ   t d}| t" |tdd  W d    n1 s<0    Y  d S )N      ÿ@   )r   rb   rT   r   Zsign_digestr   r   r=   r=   r>   test_sign_with_too_long_hashS  s    
z"ECDSA.test_sign_with_too_long_hashc           	      C   s   t jttd}td}||}tj| 	 ttd}| 
||| t jtd}|j|td}tj| 	 ttd}| 
||| tj| 	 td}| 
|j||td d S )Nrq   hashfunczsecurity level is 128 bitsrp   r   )r   rO   r%   r   r   rQ   r   rU   rP   rV   rR   rS   )	rW   r   rZ   r[   r   Zsk2rj   Zvk2Zvk3r=   r=   r>   test_hashfuncY  s&    

zECDSA.test_hashfuncc                 C   s   t }tj|d}| }td}||}t|||}|D ]6}| |	|| | 
|j|j | 
|j|j q<| |jjdd |D  d S )Nrp   rM   c                 S   s   g | ]}|j jqS r=   r   r   .0recovered_vkr=   r=   r>   
<listcomp>      z2ECDSA.test_public_key_recovery.<locals>.<listcomp>)r)   r   rO   rP   r   rQ   r   from_public_key_recoveryrR   rS   rg   rq   default_hashfuncassertInr   r   rW   rq   r   r   rZ   	signatureZrecovered_vksr   r=   r=   r>   test_public_key_recoveryp  s$    
zECDSA.test_public_key_recoveryc                 C   s   t }tj|td}| }td}||}tj|||tdd}|D ]4}| 	|
|| | |j|j | t|j qD| |jjdd |D  d S )Nr   rM   T)r   allow_truncatec                 S   s   g | ]}|j jqS r=   r   r   r=   r=   r>   r     r   zCECDSA.test_public_key_recovery_with_custom_hash.<locals>.<listcomp>)r)   r   rO   r   rP   r   rQ   r   r  rR   rS   rg   rq   r  r  r   r   r  r=   r=   r>   )test_public_key_recovery_with_custom_hash  s     

z/ECDSA.test_public_key_recovery_with_custom_hashc                 C   s   t d}|j}td}| | | | |d| | |dtd|  | |dtd|d d   | |d	td
|  d S )Nr   L   ààdSÀK¨x !ÕÂÃýÈ cÿû¹Ä)¤z#µìO¶ HQ*r   uncompressed
compressed   hybrid)r   rb   r   r   rg   rV   )rW   r   r   expr=   r=   r>   test_encoding  s    
"zECDSA.test_encodingc                 C   s   t d}|j}td}t|}| |jj|jj ttd| }| |jj|jj ttd|d d  }| |jj|jj ttd| }| |jj|jj d S )Nr   r	  r  r  r  r  )	r   rb   r   r   r   rU   rg   r   r   )rW   r   r   encZfrom_rawZfrom_uncompressedZfrom_compressedr=   r=   r>   test_decoding  s    

zECDSA.test_decodingc                 C   s2   t d}tj|dd}td}| ||j d S )NM   ààdSÀK¨x !ÕÂÃýÈ cÿû¹Ä)¤z#µìO¶ HQ*r
  Zvalid_encodingsr   )r   r   rU   r   rb   rg   r   )rW   r  r   r   r=   r=   r>   )test_uncompressed_decoding_as_only_alowed  s    
z/ECDSA.test_uncompressed_decoding_as_only_alowedc                 C   sV   t d}| t}tj|dd W d    n1 s60    Y  | dt|j d S )Nr	  r  r  r  r   rT   r   r   rU   r  str	exceptionrW   r  r  r=   r=   r>   %test_raw_decoding_with_blocked_format  s    ,z+ECDSA.test_raw_decoding_with_blocked_formatc                 C   sN   |  t}tjddd W d    n1 s.0    Y  | dt|j d S )Nr   )r   Zfoobarr  zOnly uncompressed, compressed)rT   r   r   rU   r  r  r  )rW   er=   r=   r>   !test_decoding_with_unknown_format  s    ,z'ECDSA.test_decoding_with_unknown_formatc                 C   sV   t d}| t}tj|dd W d    n1 s60    Y  | dt|j d S )Nr  r  r  Invalid X9.62 encodingr  r  r=   r=   r>   .test_uncompressed_decoding_with_blocked_format  s    ,z4ECDSA.test_uncompressed_decoding_with_blocked_formatc                 C   sV   t d}| t}tj|dd W d    n1 s60    Y  | dt|j d S )NuM   ààdSÀK¨x !ÕÂÃýÈ cÿû¹Ä)¤z#µìO¶ HQ*r  r  r!  r  r  r=   r=   r>   (test_hybrid_decoding_with_blocked_format  s    ,z.ECDSA.test_hybrid_decoding_with_blocked_formatc                 C   s^   t dd d }| t}tj|dd W d    n1 s>0    Y  | dt|j d S )NuM   ààdSÀK¨x !ÕÂÃýÈ cÿû¹Ä)¤z#µìO¶ HQ*   )r  r   r  z(hybrid, raw)r  r  r=   r=   r>   ,test_compressed_decoding_with_blocked_format
  s    ,z2ECDSA.test_compressed_decoding_with_blocked_formatc                 C   sH   t d}| t" tt d|  W d    n1 s:0    Y  d S )Nr	  r  r   rT   r   r   rU   rW   r  r=   r=   r>   )test_decoding_with_malformed_uncompressed  s
    z/ECDSA.test_decoding_with_malformed_uncompressedc                 C   sP   t d}| t* tt d|d d   W d    n1 sB0    Y  d S )Nr	  r   r  r&  r'  r=   r=   r>   'test_decoding_with_malformed_compressed   s
    z-ECDSA.test_decoding_with_malformed_compressedc                 C   sH   t d}| t" tt d|  W d    n1 s:0    Y  d S )Nr	  r&  r'  r=   r=   r>   &test_decoding_with_inconsistent_hybrid*  s
    z,ECDSA.test_decoding_with_inconsistent_hybridc                 C   sP   t d}| t* t|d d t d  W d    n1 sB0    Y  d S )Nr	  /   r   r&  r'  r=   r=   r>   %test_decoding_with_point_not_on_curve4  s
    z+ECDSA.test_decoding_with_point_not_on_curvec                 C   s<   |  t ttd W d    n1 s.0    Y  d S )Nr   )rT   r   r   rU   r   rn   r=   r=   r>   $test_decoding_with_point_at_infinity>  s    z*ECDSA.test_decoding_with_point_at_infinityc                 C   sZ   t tj tj d }| t" ttd|  W d    n1 sL0    Y  d S )Nr   r  )	r   r#   rq   rJ   rT   r   r   rU   r   r'  r=   r=   r>   test_not_lying_on_curveC  s    zECDSA.test_not_lying_on_curvec                 C   s`   t dtjtjd}d|_d|_| t$ t	t
dd | W d    n1 sR0    Y  d S )Ntestr   r   r_       r   r   r8   Z	curve_192Zgenerator_192rs   r   rT   r   r   rU   r   rW   rq   r=   r=   r>   9test_from_string_with_invalid_curve_too_short_ver_key_lenI  s
    z?ECDSA.test_from_string_with_invalid_curve_too_short_ver_key_lenc                 C   s`   t dtjtjd}d|_d|_| t$ t	t
dd | W d    n1 sR0    Y  d S )Nr0  r1  r_   r   r3  r4  r=   r=   r>   8test_from_string_with_invalid_curve_too_long_ver_key_lenT  s
    z>ECDSA.test_from_string_with_invalid_curve_too_long_ver_key_lenN)<r:   r;   r<   r]   rk   ro   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r"  r#  r%  r(  r)  r+  r-  r.  r/  r5  r6  r=   r=   r=   r>   rL   P   sr   	!6




!



rL   zval,evenc                 C   s   g | ]}d D ]}||fqqS ))TFr=   )r   ijr=   r=   r>   r   a  r   r      c                 C   sf   t | tj}|rtd| }ntd| }zt|}t|tsDJ W n ty`   ds\J Y n0 d S )Nr  T)r   r#   re   r   r   rU   
isinstancer   )valZevenr  r   r=   r=   r>   *test_VerifyingKey_decode_with_small_values`  s    
r=  )r   r
  r  r  z{0}-{1})idzcurve,encodingc                 C   sB   t j| d}|j}||}tj|| d}|jj|jjks>J d S r   )r   rO   r   rV   r   rU   r   r   )rq   encodingr   r   encodedZfrom_encr=   r=   r>   test_VerifyingKey_encode_decode|  s
    
rA  c                   @   s  e Zd Zedd eddD Zdd Zej	j
devdd	d
d Zej	j
devdd	dd Zej	j
devdd	dd Zej	j
devdd	dd Zej	j
devdd	dd Zej	j
devdd	dd Zej	j
devdd	d d! Zej	j
d"evd#d	d$d% Zej	j
d"evd#d	d&d' Zej	j
d"evd#d	d(d) Zej	j
d*evd+d	d,d- Zej	j
d.evd/d	d0d1 Zej	j
d2evd3d	d4d5 Zej	j
d6evd7d	d8d9 Zej	j
d:evd;d	d<d= Zej	j
d>evd?d	d@dA Zej	j
dBevdCd	dDdE Zej	j
dFevdGd	dHdI Zej	j
dJevdKd	dLdM Zej	j
dNevdOd	dPdQ ZddSdTZej	j
devdd	dUdV Z ej	j
devdd	dWdX Z!ej	j
devdd	dYdZ Z"ej	j
devdd	d[d\ Z#ej	j
devdd	d]d^ Z$ej	j
devdd	d_d` Z%ej	j
devdd	dadb Z&ej	j
d"evd#d	dcdd Z'ej	j
d"evd#d	dedf Z(ej	j
d"evd#d	dgdh Z)ej	j
d*evd+d	didj Z*ej	j
d.evd/d	dkdl Z+ej	j
d2evd3d	dmdn Z,ej	j
d6evd7d	dodp Z-ej	j
d:evd;d	dqdr Z.ej	j
d>evd?d	dsdt Z/ej	j
dBevdCd	dudv Z0ej	j
dFevdGd	dwdx Z1ej	j
dJevdKd	dydz Z2ej	j
dNevdOd	d{d| Z3dd}d~Z4dS )OpenSSLc                 c   s    | ]}| d d  V  qdS :r   NrC   r   r   cr=   r=   r>   	<genexpr>  s   zOpenSSL.<genexpr>ecparam -list_curves
c                 C   s>   t d}| d d}|g dkr0d|S d|S d S )Nversionr   .)10rN  z-{0}z-ecdsa-with-{0})rK   rC   format)rW   	hash_namevvsr=   r=   r>   get_openssl_messagedigest_arg  s
    
z%OpenSSL.get_openssl_messagedigest_argZ	secp112r1z)system openssl does not support secp112r1reasonc                 C   s
   |  tS rl   )do_test_from_opensslr   rn   r=   r=   r>   test_from_openssl_secp112r1  s    z#OpenSSL.test_from_openssl_secp112r1Z	secp112r2z)system openssl does not support secp112r2c                 C   s
   |  tS rl   )rV  r    rn   r=   r=   r>   test_from_openssl_secp112r2  s    z#OpenSSL.test_from_openssl_secp112r2Z	secp128r1z)system openssl does not support secp128r1c                 C   s
   |  tS rl   )rV  r!   rn   r=   r=   r>   test_from_openssl_secp128r1  s    z#OpenSSL.test_from_openssl_secp128r1Z	secp160r1z)system openssl does not support secp160r1c                 C   s
   |  tS rl   )rV  r"   rn   r=   r=   r>   test_from_openssl_secp160r1  s    z#OpenSSL.test_from_openssl_secp160r1
prime192v1*system openssl does not support prime192v1c                 C   s
   |  tS rl   rV  r#   rn   r=   r=   r>   test_from_openssl_nist192p  s    z"OpenSSL.test_from_openssl_nist192pc                 C   s   |  tdS NSHA256r]  rn   r=   r=   r>   !test_from_openssl_nist192p_sha256  s    z)OpenSSL.test_from_openssl_nist192p_sha256Z	secp224r1z)system openssl does not support secp224r1c                 C   s
   |  tS rl   )rV  r$   rn   r=   r=   r>   test_from_openssl_nist224p  s    z"OpenSSL.test_from_openssl_nist224pZ
prime256v1z*system openssl does not support prime256v1c                 C   s
   |  tS rl   rV  r%   rn   r=   r=   r>   test_from_openssl_nist256p  s    z"OpenSSL.test_from_openssl_nist256pc                 C   s   |  tdS NSHA384rc  rn   r=   r=   r>   !test_from_openssl_nist256p_sha384  s    z)OpenSSL.test_from_openssl_nist256p_sha384c                 C   s   |  tdS NSHA512rc  rn   r=   r=   r>   !test_from_openssl_nist256p_sha512  s    z)OpenSSL.test_from_openssl_nist256p_sha512Z	secp384r1z)system openssl does not support secp384r1c                 C   s
   |  tS rl   )rV  r&   rn   r=   r=   r>   test_from_openssl_nist384p  s    z"OpenSSL.test_from_openssl_nist384pZ	secp521r1z)system openssl does not support secp521r1c                 C   s
   |  tS rl   )rV  r'   rn   r=   r=   r>   test_from_openssl_nist521p  s    z"OpenSSL.test_from_openssl_nist521pZ	secp256k1z)system openssl does not support secp256k1c                 C   s
   |  tS rl   )rV  r(   rn   r=   r=   r>   test_from_openssl_secp256k1   s    z#OpenSSL.test_from_openssl_secp256k1ZbrainpoolP160r1z/system openssl does not support brainpoolP160r1c                 C   s
   |  tS rl   )rV  r)   rn   r=   r=   r>   !test_from_openssl_brainpoolp160r1  s    z)OpenSSL.test_from_openssl_brainpoolp160r1ZbrainpoolP192r1z/system openssl does not support brainpoolP192r1c                 C   s
   |  tS rl   )rV  r*   rn   r=   r=   r>   !test_from_openssl_brainpoolp192r1  s    z)OpenSSL.test_from_openssl_brainpoolp192r1ZbrainpoolP224r1z/system openssl does not support brainpoolP224r1c                 C   s
   |  tS rl   )rV  r+   rn   r=   r=   r>   !test_from_openssl_brainpoolp224r1  s    z)OpenSSL.test_from_openssl_brainpoolp224r1ZbrainpoolP256r1z/system openssl does not support brainpoolP256r1c                 C   s
   |  tS rl   )rV  r,   rn   r=   r=   r>   !test_from_openssl_brainpoolp256r1  s    z)OpenSSL.test_from_openssl_brainpoolp256r1ZbrainpoolP320r1z/system openssl does not support brainpoolP320r1c                 C   s
   |  tS rl   )rV  r-   rn   r=   r=   r>   !test_from_openssl_brainpoolp320r1#  s    z)OpenSSL.test_from_openssl_brainpoolp320r1ZbrainpoolP384r1z/system openssl does not support brainpoolP384r1c                 C   s
   |  tS rl   )rV  r.   rn   r=   r=   r>   !test_from_openssl_brainpoolp384r1*  s    z)OpenSSL.test_from_openssl_brainpoolp384r1ZbrainpoolP512r1z/system openssl does not support brainpoolP512r1c                 C   s
   |  tS rl   )rV  r/   rn   r=   r=   r>   !test_from_openssl_brainpoolp512r11  s    z)OpenSSL.test_from_openssl_brainpoolp512r1SHA1c                 C   s  |j }|sJ | |}tjdr.td td td|  td t	d}t
dd}|| W d    n1 s~0    Y  td|  td|  t
d	d
}| }W d    n1 s0    Y  t|}t
dd
}| }	W d    n1 s0    Y  | |j|	|ttj|td t
d}| }
W d    n1 sX0    Y  t|
}|j|ttj|d}| |j||ttj|d td t
dd
}| }W d    n1 s0    Y  t|}| || d S )Ntz+ecparam -name %s -genkey -out t/privkey.pemz.ec -in t/privkey.pem -pubout -out t/pubkey.pemrZ   
t/data.txtwbz6dgst %s -sign t/privkey.pem -out t/data.sig t/data.txtz=dgst %s -verify t/pubkey.pem -signature t/data.sig t/data.txtt/pubkey.pemrb
t/data.sig)r   r   t/privkey.pemr   zJpkcs8 -topk8 -nocrypt -in t/privkey.pem -outform pem -out t/privkey-p8.pemt/privkey-p8.pem)openssl_namerS  ospathisdirshutilrmtreemkdirrK   r   openwritereadr   r   rR   rS   r
   hashlibnewr   r   rQ   rg   )rW   rq   rP  	curvenamemdargrZ   r  Z
pubkey_pemr   r   fpr   r[   Zprivkey_p8_pemZ
sk_from_p8r=   r=   r>   rV  8  s\    


(&
(
	
(
(
zOpenSSL.do_test_from_opensslc                 C   s   |  t d S rl   )do_test_to_opensslr   rn   r=   r=   r>   test_to_openssl_secp112r1l  s    z!OpenSSL.test_to_openssl_secp112r1c                 C   s   |  t d S rl   )r  r    rn   r=   r=   r>   test_to_openssl_secp112r2s  s    z!OpenSSL.test_to_openssl_secp112r2c                 C   s   |  t d S rl   )r  r!   rn   r=   r=   r>   test_to_openssl_secp128r1z  s    z!OpenSSL.test_to_openssl_secp128r1c                 C   s   |  t d S rl   )r  r"   rn   r=   r=   r>   test_to_openssl_secp160r1  s    z!OpenSSL.test_to_openssl_secp160r1c                 C   s   |  t d S rl   r  r#   rn   r=   r=   r>   test_to_openssl_nist192p  s    z OpenSSL.test_to_openssl_nist192pc                 C   s   |  td d S r_  r  rn   r=   r=   r>   test_to_openssl_nist192p_sha256  s    z'OpenSSL.test_to_openssl_nist192p_sha256c                 C   s   |  t d S rl   )r  r$   rn   r=   r=   r>   test_to_openssl_nist224p  s    z OpenSSL.test_to_openssl_nist224pc                 C   s   |  t d S rl   r  r%   rn   r=   r=   r>   test_to_openssl_nist256p  s    z OpenSSL.test_to_openssl_nist256pc                 C   s   |  td d S re  r  rn   r=   r=   r>   test_to_openssl_nist256p_sha384  s    z'OpenSSL.test_to_openssl_nist256p_sha384c                 C   s   |  td d S rh  r  rn   r=   r=   r>   test_to_openssl_nist256p_sha512  s    z'OpenSSL.test_to_openssl_nist256p_sha512c                 C   s   |  t d S rl   )r  r&   rn   r=   r=   r>   test_to_openssl_nist384p  s    z OpenSSL.test_to_openssl_nist384pc                 C   s   |  t d S rl   )r  r'   rn   r=   r=   r>   test_to_openssl_nist521p  s    z OpenSSL.test_to_openssl_nist521pc                 C   s   |  t d S rl   )r  r(   rn   r=   r=   r>   test_to_openssl_secp256k1  s    z!OpenSSL.test_to_openssl_secp256k1c                 C   s   |  t d S rl   )r  r)   rn   r=   r=   r>   test_to_openssl_brainpoolp160r1  s    z'OpenSSL.test_to_openssl_brainpoolp160r1c                 C   s   |  t d S rl   )r  r*   rn   r=   r=   r>   test_to_openssl_brainpoolp192r1  s    z'OpenSSL.test_to_openssl_brainpoolp192r1c                 C   s   |  t d S rl   )r  r+   rn   r=   r=   r>   test_to_openssl_brainpoolp224r1  s    z'OpenSSL.test_to_openssl_brainpoolp224r1c                 C   s   |  t d S rl   )r  r,   rn   r=   r=   r>   test_to_openssl_brainpoolp256r1  s    z'OpenSSL.test_to_openssl_brainpoolp256r1c                 C   s   |  t d S rl   )r  r-   rn   r=   r=   r>   test_to_openssl_brainpoolp320r1  s    z'OpenSSL.test_to_openssl_brainpoolp320r1c                 C   s   |  t d S rl   )r  r.   rn   r=   r=   r>   test_to_openssl_brainpoolp384r1  s    z'OpenSSL.test_to_openssl_brainpoolp384r1c                 C   s   |  t d S rl   )r  r/   rn   r=   r=   r>   test_to_openssl_brainpoolp512r1  s    z'OpenSSL.test_to_openssl_brainpoolp512r1c           
      C   s  |j }|sJ | |}tjdr.td td tj	|d}|
 }td}tdd}||  W d    n1 s0    Y  tdd}||  W d    n1 s0    Y  |j|ttj|td}	tdd}||	 W d    n1 s0    Y  td	d}|| W d    n1 s>0    Y  td
d"}||td  W d    n1 s|0    Y  | ttd|  td|  tdd}||  W d    n1 s0    Y  td|  td|  tdd"}||jdd W d    n1 s*0    Y  td|  td|  tdd"}||jdd W d    n1 s0    Y  td|  td|  tdd$}||jddd W d    n1 s0    Y  td|  td|  d S )Nrv  rp   rZ   zt/pubkey.derrx  ry  )r   r   r{  rw  zt/baddata.txtZcorruptzMdgst %s -verify t/pubkey.der -keyform DER -signature t/data.sig t/baddata.txtzJdgst %s -verify t/pubkey.der -keyform DER -signature t/data.sig t/data.txtr|  z7dgst %s -sign t/privkey.pem -out t/data.sig2 t/data.txtz>dgst %s -verify t/pubkey.pem -signature t/data.sig2 t/data.txtzt/privkey-explicit.pemexplicit)curve_parameters_encodingz@dgst %s -sign t/privkey-explicit.pem -out t/data.sig2 t/data.txtr}  Zpkcs8)rO  z:dgst %s -sign t/privkey-p8.pem -out t/data.sig3 t/data.txtz>dgst %s -verify t/pubkey.pem -signature t/data.sig3 t/data.txtzt/privkey-p8-explicit.pem)rO  r  zCdgst %s -sign t/privkey-p8-explicit.pem -out t/data.sig3 t/data.txt)r~  rS  r  r  r  r  r  r  r   rO   rP   r   r  r  r   rz   rQ   r
   r  r  r   rT   r9   rK   )
rW   rq   rP  r  r  r   r   rZ   r  r   r=   r=   r>   r    s    


,,
**2.22$zOpenSSL.do_test_to_opensslN)ru  )ru  )5r:   r;   r<   setrK   rC   OPENSSL_SUPPORTED_CURVESrS  pytestmarkskipifrW  rX  rY  rZ  r^  ra  rb  rd  rg  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  rV  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=   r=   r=   r>   rB    s  




















4



















rB  c                   @   s`   e Zd Zedd eddD Zejj	devdddd	 Z
ejj	devddd
d ZdS )TooSmallCurvec                 c   s    | ]}| d d  V  qdS rC  rE  rF  r=   r=   r>   rH  O  s   zTooSmallCurve.<genexpr>rI  rJ  r[  r\  rT  c                 C   s\   t jtd}td}| t* |j|ttj	dt
dd W d    n1 sN0    Y  d S )Nrp   rZ   r`  Fr   r   r  )r   rO   r#   r   rT   r   rQ   r
   r  r  r   )rW   r   rZ   r=   r=   r>   4test_sign_too_small_curve_dont_allow_truncate_raisesT  s    
zBTooSmallCurve.test_sign_too_small_curve_dont_allow_truncate_raisesc                 C   s   t jtd}| }td}|j|ttjdt	dd}| 
t, |j||ttjdtdd W d    n1 sr0    Y  d S )Nrp   rZ   r`  Tr  F)r   r   r  )r   rO   r#   rP   r   rQ   r
   r  r  r   rT   r   rS   r   )rW   r   r   rZ   r   r=   r=   r>   6test_verify_too_small_curve_dont_allow_truncate_raisesc  s"    

zDTooSmallCurve.test_verify_too_small_curve_dont_allow_truncate_raisesN)r:   r;   r<   r  rK   rC   r  r  r  r  r  r  r=   r=   r=   r>   r  N  s   
r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )DERc                 C   s
  |  tdtd |  tdtd |  tdtd |  tdtd |  td	td
 dd }|  |ddtdf |  |ddtdf |  |ddtdf |  |ddtdf |  |d	d	tdf |  |ddtdf d S )Nr   z r   z   zr   u    r9  z c                 S   s   t t | td S )Nr   )r6   Zremove_integerr   r   )nr=   r=   r>   r     s    zDER.test_integer.<locals>.sr   l	   
~[~e;~pd)rg   r6   r   r   )rW   r   r=   r=   r>   test_integer|  s    
zDER.test_integerc                 C   s   |  tdtd |  tdtd |  tdtd |  tdtd d	D ]H}t|td
 }t|\}}|  || |  ||d  td
 q\d S )Nr   r   r  r   u      u   )r   r   r   r  r   r  r   r   more)rg   r6   Zencode_numberr   Zread_numberrW   r  xZn1Zllenr=   r=   r>   test_number  s    zDER.test_numberc                 C   s
  |  tdtd |  tdtd |  tdtd |  tdtd |  td	td
 |  tdtd |  ttdtd d |  tdtd dD ]H}t|td }t|\}}|  || |  ||d  td qd S )Nr   r   r  r  r   u   r   u   ÿr9  u      u   u   r  )   r   r  )	r   r   r   r  r   r   r9  r  r  )rg   r6   Zencode_lengthr   Zread_lengthr  r=   r=   r>   test_length  s    zDER.test_lengthc                 C   s^   t tdtdtd }| |td t |\}}| |td | |td d S )NABCZDEFZGHIz0ABCDEFGHIZABCDEF)r6   r   r   rg   Zremove_sequence)rW   r  x1restr=   r=   r>   test_sequence  s
    zDER.test_sequencec                 C   s^   t dtj}| t|tdtd  t dttd}| t|tdtd  d S )Nr   Za007Z06052b81040021r   Z0102030a0b0cZa106)r6   r   r$   Zencoded_oidrg   r   r   r   )rW   r  r=   r=   r>   test_constructed  s    zDER.test_constructedN)r:   r;   r<   r  r  r  r  r  r=   r=   r=   r>   r  {  s
   r  c                   @   sB   e Zd Zdd Zdd Zeejddd dd	d
 Zdd Z	dS )Utilc                 C   sz   t j}tdD ]F}d| }dD ]4}|||}| d|  koB|k n  d||f qq| d|dtj  td d S )Ni  seed-%d)   r   r9  i  i      r   z%xr{   Z86fa59d73bf0446ae8743cf748fc5ac11d5585a90356417e97155c3bc)	r   ry   rangerR   rg   r$   re   encoder   )rW   ttar7  r{   re   r  r=   r=   r>   test_trytryagain  s    	
*zUtil.test_trytryagainc                 C   s@   t j}d}d}|||}tjdk r0| |d n| |d d S )Nr  s   text)r   r         )r   ry   sysversion_inforg   )rW   r  re   r{   r  r=   r=   r>   test_trytryagain_single  s    

zUtil.test_trytryagain_singler   
      )Z	min_valueZ	max_valuec                 C   sP   t d| }dD ]8}t j||d}| d|  ko:|k n  d||f qd S )Nr  )r  r   r9  r  r  r   r   )r   ZPRNG	randrangerR   )rW   r7  r   re   r  r=   r=   r>   test_randrange  s    zUtil.test_randrangec                 C   s   d}t dd td|D }d|vs(J ||vs4J tdD ](}d| }t||}||  d7  < q<| ||d   td|D ] }td|d	|| d
  f  qd S )Nr  c                 S   s   g | ]}|d fqS )r   r=   )r   r7  r=   r=   r>   r     r   z2Util.OFF_test_prove_uniformity.<locals>.<listcomp>r   r   i@B r  z%3d: %s*d   )dictr  r   ry   rR   r   )rW   re   countsr7  r{   r  r=   r=   r>   OFF_test_prove_uniformity  s    zUtil.OFF_test_prove_uniformityN)
r:   r;   r<   r  r  r   stZintegersr  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	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d Zdd  Zd!d" Zd#S )$RFC6979c                 C   s$   t | |||}| || d S rl   )r7   rc   re   rg   )rW   rd   rh   hsh	hash_funcexpectedactualr=   r=   r>   _do  s    zRFC6979._doc                 C   s2   | j tjtddttd ttddd dS )zRFC doesn't contain test vectors for SECP256k1 used in bitcoin.
        This vector has been computed by Golang reference implementation instead.r^   r_   sampleZ@8fa1f95d514760e498f28957b824ee6ec39ed64826ff4fecc2b5739ec45b91cdrd   rh   r  r  r  Nr  r(   rd   ra   r   r   rf   rn   r=   r=   r>   test_SECP256k1  s    zRFC6979.test_SECP256k1c                 C   s2   | j tjtddttd ttddd d S )NZ@cca9fbcc1b41e5a95d369eaa6ddcff73b61a4efaa279cfc6567e8daa39cbaf50r_   r  Z@2df40ca70e639d89528a6b670d9d48d9165fdc0febc0974056bdce192b8e16a3r  r  rn   r=   r=   r>   test_SECP256k1_2  s    zRFC6979.test_SECP256k1_2c                 C   s&   | j tjdttd tdd d S )Nr   Satoshi Nakamotol   ]iHsiNPIz$Nkxke} r  r  r(   rd   r   r   rf   rn   r=   r=   r>   test_SECP256k1_3  s    zRFC6979.test_SECP256k1_3c                 C   s&   | j tjdttd tdd d S )Nr   zJAll those moments will be lost in time, like tears in rain. Time to die...l   V1ujcCXxi
nH0G<VHk8r  r  rn   r=   r=   r>   test_SECP256k1_4'  s    zRFC6979.test_SECP256k1_4c                 C   s&   | j tjdttd tdd d S )Nl   @Al 3z~i9nW~ r  l   oTP*(9LM$dhW5Dv8M3r  r  rn   r=   r=   r>   test_SECP256k1_54  s    zRFC6979.test_SECP256k1_5c                 C   s&   | j tjdttd tdd d S )Nl   A hb+Jn p.(d0^y8Wx zAlan Turingl   }:Anq`0=	39pC[AZRr  r  rn   r=   r=   r>   test_SECP256k1_6=  s    zRFC6979.test_SECP256k1_6c                 C   s<   | j td ddtddtddttdttddd d S )Nr   Z)4000000000000000000020108A2E0CC0D99F8A5EFr_   Z)09A4D6792295A7F730FC3F2B49CBC0F62E862272FZ@AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BFZ)23AF4074C90A02B3FE61D286D5C87F425E6BDD81Br  )r  r5   ra   r   r   r   rn   r=   r=   r>   test_1F  s     zRFC6979.test_1c                 C   s2   | j tjtddttd ttddd d S )N06FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4r_   r  Z037D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021r  r  r#   rd   ra   r   r   rf   rn   r=   r=   r>   test_2Y  s    zRFC6979.test_2c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r  Z032B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496r  r  r#   rd   ra   r   r   rf   rn   r=   r=   r>   test_3d  s    zRFC6979.test_3c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r  Z0A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1r  r  r#   rd   ra   r	   r   rf   rn   r=   r=   r>   test_4o  s    zRFC6979.test_4c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r0  Z0D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25r  r  rn   r=   r=   r>   test_5z  s    zRFC6979.test_5c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r0  Z05C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6Cr  r  rn   r=   r=   r>   test_6  s    zRFC6979.test_6c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r0  Z00758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527r  r  rn   r=   r=   r>   test_7  s    zRFC6979.test_7c                 C   s2   | j tjtddttd ttddd d S )Nڃ0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538r_   r  Z089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9r  )r  r'   rd   ra   r   r   rf   rn   r=   r=   r>   test_8  s    zRFC6979.test_8c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r  Z0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0r  )r  r'   rd   ra   r   r   rf   rn   r=   r=   r>   test_9  s    zRFC6979.test_9c                 C   s2   | j tjtddttd ttddd d S )Nr  r_   r0  Z16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56Dr  )r  r'   rd   ra   r	   r   rf   rn   r=   r=   r>   test_10  s    zRFC6979.test_10N)r:   r;   r<   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=   r=   r=   r>   r    s"   			r  c                   @   s   e Zd Zdd ZdS )ECDHc                 C   s   || }|| }|| }|  t|||| |  t|||| | || || |   kox|| |   kox|| kn   |  t||	|
| d S rl   )rg   r5   rR   )rW   rq   rd   dAx_qAy_qAdBx_qBy_qBx_Zy_ZZqAZqBZr=   r=   r>   r    s    

zECDH._doN)r:   r;   r<   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 )
RFC6932c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ87C4B7A2C8A4BAD1FBB7D79CC0955DB7C6A4660CA64CC4778159B495Er_   Z8B104A67A6F6E85E14EC1825E1539E8ECDBBF584922367DD88C6BDCF2Z846D782E7FDB5F60CD8404301AC5949C58EDB26BC68BA07695B750A94Z863976D4AAE6CD0F6DD18DEFEF55D96569D0507C03E74D6486FFA28FBZ82A97089A9296147B71B21A4B574E1278245B536F14D8C2B9D07A874EZ89B900D7C77A709A797276B8CA1BA61BB95B546FC29F862E44D59D25BZ8312DFD98783F9FB77B9704945A73BEB6DCCBE3B65D0F967DCAB574EBZ86F800811D64114B1C48C621AB3357CF93F496E4238696A2A012B3C98
rq   rd   r  r  r  r  r  r  r   r  )r  r1   r+   rd   ra   rn   r=   r=   r>   test_brainpoolP224r1  s8    zRFC6932.test_brainpoolP224r1c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ@041EB8B1E2BC681BCE8E39963B2E9FC415B05283313DD1A8BCC055F11AE49699r_   Z@78028496B5ECAAB3C8B6C12E45DB1E02C9E4D26B4113BC4F015F60C5CCC0D206Z@A2AE1762A3831C1D20F03F8D1E3C0C39AFE6F09B4D44BBE80CD100987B05F92BZ@06F5240EACDB9837BC96D48274C8AA834B6C87BA9CC3EEDD81F99A16B8D804D3Z@8E07E219BA588916C5B06AA30A2F464C2F2ACFC1610A3BE2FB240B635341F0DBZ@148EA1D7D1E7E54B9555B6C9AC90629C18B63BEE5D7AA6949EBBF47B24FDE40DZ@05E940915549E9F6A4A75693716E37466ABA79B4BF2919877A16DD2CC2E23708Z@6BC23B6702BC5A019438CEEA107DAAD8B94232FFBBC350F3B137628FE6FD134Cr  r  r2   r,   rd   ra   rn   r=   r=   r>   test_brainpoolP256r1  sH    zRFC6932.test_brainpoolP256r1c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ`014EC0755B78594BA47FB0A56F6173045B4331E74BA1A6F47322E70D79D828D97E095884CA72B73FDABD5910DF0FA76Ar_   Z`45CB26E4384DAF6FB776885307B9A38B7AD1B5C692E0C32F0125332778F3B8D3F50CA358099B30DEB5EE69A95C058B4EZ`8173A1C54AFFA7E781D0E1E1D12C0DC2B74F4DF58E4A4E3AF7026C5D32DC530A2CD89C859BB4B4B768497F49AB8CC859Z`6B461CB79BD0EA519A87D6828815D8CE7CD9B3CAA0B5A8262CBCD550A015C90095B976F3529957506E1224A861711D54Z`01BF92A92EE4BE8DED1A911125C209B03F99E3161CFCC986DC7711383FC30AF9CE28CA3386D59E2C8D72CE1E7B4666E8Z`3289C4A3A4FEE035E39BDB885D509D224A142FF9FBCC5CFE5CCBB30268EE47487ED8044858D31D848F7A95C635A347ACZ`04CC4FF3DCCCB07AF24E0ACC529955B36D7C807772B92FCBE48F3AFE9A2F370A1F98D3FA73FD0C0747C632E12F1423ECZ`7F465F90BD69AFB8F828A214EB9716D66ABC59F17AF7C75EE7F1DE22AB5D05085F5A01A9382D05BF72D96698FE3FF64Er  r  r3   r.   rd   ra   rn   r=   r=   r>   test_brainpoolP384r1(  sH    zRFC6932.test_brainpoolP384r1c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ636B6BE0482A6C1C41AA7AE7B245E983392DB94CECEA2660A379CFE159559E357581825391175FC195D28BAC0CF03A7841A383B95C262B983782874CCE6FE333r_   Z0562E68B9AF7CBFD5565C6B16883B777FF11C199161ECC427A39D17EC2166499389571D6A994977C56AD8252658BA8A1B72AE42F4FB7532151AFC3EF0971CCDAZA7CA2D8191E21776A89860AFBC1F582FAA308D551C1DC6133AF9F9C3CAD59998D70079548140B90B1F311AFB378AA81F51B275B2BE6B7DEE978EFC7343EA642EZ0AF4E7F6D52EDD52907BB8DBAB3992A0BB696EC10DF11892FF205B66D381ECE72314E6A6EA079CEA06961DBA5AE6422EF2E9EE803A1F236FB96A1799B86E5C8BZ5A7954E32663DFF11AE24712D87419F26B708AC2B92877D6BFEE2BFC43714D89BBDB6D24D807BBD3AEB7F0C325F862E8BADE4F74636B97EAACE739E11720D323Z96D14621A9283A1BED84DE8DD64836B2C0758B11441179DC0C54C0D49A47C03807D171DD544B72CAAEF7B7CE01C7753E2CAD1A861ECA55A71954EE1BA35E04BEZ1EE8321A4BBF93B9CF8921AB209850EC9B7066D1984EF08C2BB723236208AC8F1A483E79461A00E0D5F6921CE9D360502F85C812BEDEE23AC5B210E5811B191EZ2632095B7B936174B41FD2FAF369B1D18DCADEED7E410A7E251F0831097C50D02CFED02607B6A2D5ADB4C0006008562208631875B58B54ECDA5A4F9FE9EAABA6r  r  r4   r/   rd   ra   rn   r=   r=   r>   test_brainpoolP512r1V  sH    zRFC6932.test_brainpoolP512r1N)r:   r;   r<   r  r  r	  r  r=   r=   r=   r>   r    s   ..r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )RFC7027c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ@81DB1EE100150FF2EA338D708271BE38300CB54241D79950F77B063039804F1Dr_   Z@44106E913F92BC02A1705D9953A8414DB95E1AAA49E81D9E85F929A8E3100BE5Z@8AB4846F11CACCB73CE49CBDD120F5A900A69FD32C272223F789EF10EB089BDCZ@55E40BC41E37E3E2AD25C3C6654511FFA8474A91A0032087593852D3E7D76BD3Z@8D2D688C6CF93E1160AD04CC4429117DC2C41825E1E9FCA0ADDD34E6F1B39F7BZ@990C57520812BE512641E47034832106BC7D3E8DD0E4C7F1136D7006547CEC6AZ@89AFC39D41D3B327814B80940B042590F96556EC91E6AE7939BCE31F3A18BF2BZ@49C27868F4ECA2179BFD7D59B1E3BF34C1DBDE61AE12931648F43E59632504DEr  r  rn   r=   r=   r>   r    sH    zRFC7027.test_brainpoolP256r1c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ`1E20F5E048A5886F1F157C74E91BDE2B98C8B52D58E5003D57053FC4B0BD65D6F15EB5D1EE1610DF870795143627D042r_   Z`68B665DD91C195800650CDD363C625F4E742E8134667B767B1B476793588F885AB698C852D4A6E77A252D6380FCAF068Z`55BC91A39C9EC01DEE36017B7D673A931236D2F1F5C83942D049E3FA20607493E0D038FF2FD30C2AB67D15C85F7FAA59Z`032640BC6003C59260F7250C3DB58CE647F98E1260ACCE4ACDA3DD869F74E01F8BA5E0324309DB6A9831497ABAC96670Z`4D44326F269A597A5B58BBA565DA5556ED7FD9A8A9EB76C25F46DB69D19DC8CE6AD18E404B15738B2086DF37E71D1EB4Z`62D692136DE56CBE93BF5FA3188EF58BC8A3A0EC6C1E151A21038A42E9185329B5B275903D192F8D4E1F32FE9CC78C48Z`0BD9D3A7EA0B3D519D09D8E48D0785FB744A6B355E6304BC51C229FBBCE239BBADF6403715C35D4FB2A5444F575D4F42Z`0DF213417EBE4D8E40A5F76F66C56470C489A3478D146DECF6DF0D94BAE9E598157290F8756066975F1DB34B2324B7BDr  r  rn   r=   r=   r>   r	    sH    zRFC7027.test_brainpoolP384r1c                 C   sT   | j ttjtddtddtddtddtddtddtddtd	dd

 d S )NZ16302FF0DBBB5A8D733DAB7141C1B45ACBC8715939677F6A56850A38BD87BD59B09E80279609FF333EB9D4C061231FB26F92EEB04982A5F1D1764CAD57665422r_   Z0A420517E406AAC0ACDCE90FCD71487718D3B953EFD7FBEC5F7F27E28C6149999397E91E029E06457DB2D3E640668B392C2A7E737A7F0BF04436D11640FD09FDZ72E6882E8DB28AAD36237CD25D580DB23783961C8DC52DFA2EC138AD472A0FCEF3887CF62B623B2A87DE5C588301EA3E5FC269B373B60724F5E82A6AD147FDE7Z230E18E1BCC88A362FA54E4EA3902009292F7F8033624FD471B5D8ACE49D12CFABBC19963DAB8E2F1EBA00BFFB29E4D72D13F2224562F405CB80503666B25429Z9D45F66DE5D67E2E6DB6E93A59CE0BB48106097FF78A081DE781CDB31FCE8CCBAAEA8DD4320C4119F1E9CD437A2EAB3731FA9668AB268D871DEDA55A5473199FZ2FDC313095BCDD5FB3A91636F07A959C8E86B5636A1E930E8396049CB481961D365CC11453A06C719835475B12CB52FC3C383BCE35E27EF194512B71876285FAZA7927098655F1F9976FA50A9D566865DC530331846381C87256BAF3226244B76D36403C024D7BBF0AA0803EAFF405D3D24F11A9B5C0BEF679FE1454B21C4CD1FZ7DB71C3DEF63212841C463E881BDCF055523BD368240E6C3143BD8DEF8B3B3223B95E0F53082FF5E412F4222537A43DF1C6D25729DDB51620A832BE6A26680A2r  r
  rn   r=   r=   r>   r    sH    zRFC7027.test_brainpoolP512r1N)r:   r;   r<   r  r	  r  r=   r=   r=   r>   r    s   ..r  z$w, gwx, gwy, k, msg, md, r, s, curveZ@DC51D3866A15BACDE33D96F992FCA99DA7E6EF0934E7097559C27F1614C88A7FZ@2442A5CC0ECD015FA3CA31DC8E2BBC70BF42D60CBCA20085E0822CB04235E970Z@6FC98BD7E50211A4A27102FA3549DF79EBCB4BF246B80945CDDFE7D509BBFD7DZ@9E56F509196784D963D1C0A401510EE7ADA3DCC5DEE04B154BF61AF1D5A6DECEs   abcZ@CB28E0999B9C7715FD0A80D8E47A77079716CBBF917DD72E97566EA1C066957CZ@86FA3BB4E26CAD5BF90B7F81899256CE7594BB1EA0C89212748BFF3B3D5B0315z	ECDSA-256Z`0BEB646634BA87735D77AE4809A0EBEA865535DE4C1E1DCB692E84708E81A5AF62E528C38B2A81B35309668D73524D9FZ`96281BF8DD5E0525CA049C048D345D3082968D10FEDF5C5ACA0C64E6465A97EA5CE10C9DFEC21797415710721F437922Z`447688BA94708EB6E2E4D59F6AB6D7EDFF9301D249FE49C33096655F5D502FAD3D383B91C5E7EDAA2B714CC99D5743CAZ`B4B74E44D71A13D568003D7489908D564C7761E229C58CBFA18950096EB7463B854D7FA992F934D927376285E63414FAZ`FB017B914E29149432D8BAC29A514640B46F53DDAB2C69948084E2930F1C8F7E08E07C9C63F2D21A07DCB56A6AF56EB3Z`B263A1305E057F984D38726A1B46874109F417BCA112674C528262A40A629AF1CBB9F516CE0FA7D2FF630863A00E8B9Fz	ECDSA-384Z0065FDA3409451DCAB0A0EAD45495112A3D813C17BFD34BDF8C1209D7DF5849120597779060A7FF9D704ADF78B570FFAD6F062E95C7E0C5D5481C5B153B48B375FA1Z0151518F1AF0F563517EDD5485190DF95A4BF57B5CBA4CF2A9A3F6474725A35F7AFE0A6DDEB8BEDBCD6A197E592D40188901CECD650699C9B5E456AEA5ADD19052A8Z006F3B142EA1BFFF7E2837AD44C9E4FF6D2D34C73184BBAD90026DD5E6E85317D9DF45CAD7803C6C20035B2F3FF63AFF4E1BA64D1C077577DA3F4286C58F0AEAE643Z00C1C2B305419F5A41344D7E4359933D734096F556197A9B244342B8B62F46F9373778F9DE6B6497B1EF825FF24F42F9B4A4BD7382CFC3378A540B1B7F0C1B956C2FZ0154FD3836AF92D0DCA57DD5341D3053988534FDE8318FC6AAAAB68E2E6F4339B19F2F281A7E0B22C269D93CF8794A9278880ED7DBB8D9362CAEACEE544320552251Z017705A7030290D1CEB605A9A1BB03FF9CDD521E87A696EC926C8C10C8362DF4975367101F67D1CF9BCCBF2F3D239534FA509E70AAC851AE01AAC68D62F866472660z	ECDSA-521c	                 C   sz   t t| |}	tt|| |}
|	j|
ks2J |	j||tt|dd}|t|t|fksbJ |
|||t	svJ d S )Nr_   )r   r   r`   )
r   rU   r   r   r   rQ   r   ra   rS   r   )wZgwxZgwyr`   msgZmdrr   rq   r   r   r[   r=   r=   r>   test_RFC4754_vectors$  s    <r  )d
__future__r   r   Z	unittest2ZunittestImportErrorr  r  r  rA   r  binasciir   r   r  r   r   r   r	   	functoolsr
   Z
hypothesisr   Zhypothesis.strategies
strategiesr  sixr   r   r   keysr   r   r   r   r    r   r   r   r   r   r   r   r   r0   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r8   r1   r2   r3   r4   Zellipticcurver5   r6   r7   	Exceptionr9   rK   ZTestCaserL   r  Zparametrizer  r=  paramsrq   r  appendparamrO  namerA  rB  r  r  r  r  r  r  r  r  r=   r=   r=   r>   <module>   s   P      

   I-@@ O 5 ;