
    ei8                         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 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 d dlmZ  G d de          Z G d de          Z G d d          Z G d d          ZdS )    N   )ecdsa)der)rfc6979)NIST192p
find_curve)RSZeroError)string_to_numbernumber_to_string	randrange)sigencode_stringsigdecode_string)oid_ecPublicKeyencoded_oid_ecPublicKey)sha1c                       e Zd ZdS )BadSignatureErrorN__name__
__module____qualname__     a/var/www/html/volatility/venv/lib/python3.11/site-packages/ccxt/static_dependencies/ecdsa/keys.pyr   r              Dr   r   c                       e Zd ZdS )BadDigestErrorNr   r   r   r   r   r      r   r   r   c                       e Zd ZddZeeefd            Zeeedfd            Zed             Z	ed             Z
eeefd            Zeeefd	            Zd
 Zd ZddZd Zd ZdefdZefdZdS )VerifyingKeyNc                 (    |st          d          d S )Nz2Please use VerifyingKey.generate() to construct me	TypeErrorself_error__please_use_generates     r   __init__zVerifyingKey.__init__   s+    * 	, + , , ,	, 	,r   c                      | d          }||_         ||_        t          j        |j        |          |_        |j        |j        _        |S )NTr%   )curvedefault_hashfuncr   
Public_key	generatorpubkeyorder)klasspointr)   hashfuncr$   s        r   from_public_pointzVerifyingKey.from_public_point   sJ    u666
 (&u>>!Kr   Tc                 ~   |j         }t          |          |j        k    sJ t          |          |j        f            |d |j                 }||j        d          }t          |          |j        k    sJ t          |          |j        f            t          |          |j        k    sJ t          |          |j        f            t	          |          }t	          |          }	|rt          j        |j        ||	          sJ ddlm	}
 |

                    |j        ||	|          }|                     |||          S )Nr   )ellipticcurve)r.   lenverifying_key_lengthbaselenr
   r   point_is_validr,    r4   Pointr)   r2   )r/   stringr)   r1   validate_pointr.   xsysxyr4   r0   s               r   from_stringzVerifyingKey.from_string%   s>    Fu9999FU78 :99NU]N#EMNN#2ww%-'''#b''5=)A'''2ww%-'''#b''5=)A'''R  R   	?'A>>>>>########EKAu==&&ueX>>>r   c                 P    |                      t          j        |                    S N)from_derr   unpem)r/   r;   s     r   from_pemzVerifyingKey.from_pem7   s    ~~ci//000r   c                    t          j        |          \  }}|dk    r)t          j        dt          j        |          z            t          j        |          \  }}t          j        |          \  }}t          j        |          \  }}|dk    r)t          j        dt          j        |          z            |t          k    sJ |t          f            t          |          }	t          j        |          \  }
}|dk    r)t          j        dt          j        |          z            |
	                    d          sJ | 
                    |
dd          |	          S )Nr   z"trailing junk after DER pubkey: %sz*trailing junk after DER pubkey objects: %sz*trailing junk after pubkey pointstring: %s       )r   remove_sequenceUnexpectedDERbinasciihexlifyremove_objectr   r   remove_bitstring
startswithrA   )r/   r;   s1emptys2point_str_bitstringoid_pkrest	oid_curver)   	point_strs              r   rD   zVerifyingKey.from_der;   sl    '//	EC<<#$H$,$4U$;$;%< = = ="%"5b"9"9(,,,T22	5C<<#$P$,$4U$;$;%< = = =(((6?*C(((9%%/0CDD	5C<<#$P$,$4U$;$;%< = = =##K00000  122666r   c                 z     ||                                           }|                     |||t          |          S )N)r1   	sigdecode)digest$from_public_key_recovery_with_digestr   )r/   	signaturedatar)   r1   rZ   r[   s          r   from_public_key_recoveryz%VerifyingKey.from_public_key_recoveryR   s>    
 $&&((99)VU]amv9wwwr   c                      j         } |||                                          \  }}t          j        ||          }	t	          |          }
|	                    |
|          } fd|D             }|S )Nc                 H    g | ]}                     |j                  S r   )r2   r0   ).0pkr)   r1   r/   s     r   
<listcomp>zEVerifyingKey.from_public_key_recovery_with_digest.<locals>.<listcomp>g   s.    [[[QS%11"(E8LL[[[r   )r,   r.   r   	Signaturer
   recover_public_keys)r/   r]   r[   r)   r1   rZ   r,   rssigdigest_as_numberpksverifying_keyss   `  ``        r   r\   z1VerifyingKey.from_public_key_recovery_with_digestZ   s    
 O	yIOO$5$5661oa##+F33%%&6	BB \[[[[[WZ[[[r   c                     | j         j        }t          | j         j                                        |          }t          | j         j                                        |          }||z   S )z.Convert the point to the :term:`raw encoding`.r-   r.   r   r0   r?   r@   )r$   r.   x_stry_strs       r   _raw_encodezVerifyingKey._raw_encodej   sV    ! !2!4!4!6!6>> !2!4!4!6!6>>u}r   c                     | j         j        }t          | j         j                                        |          }| j         j                                        dz  rd|z   S d|z   S )z*Encode the point into the compressed form.r         rn   )r$   r.   ro   s      r   _compressed_encodezVerifyingKey._compressed_encodeq   s^    ! !2!4!4!6!6>>;  1$ 	#U?"r   uncompressedc                 ^    |dk    r|                                  S |                                 S )N
compressed)ru   rq   )r$   encodings     r   	to_stringzVerifyingKey.to_stringy   s1    |##**,,,!!!r   c                 P    t          j        |                                 d          S )Nz
PUBLIC KEYr   topemto_derr$   s    r   to_pemzVerifyingKey.to_pem~   s    y555r   c                 l   | j         j        }t          | j         j                                        |          }t          | j         j                                        |          }d|z   |z   }t          j        t          j        t          | j	        j
                  t          j        |                    S )NrH   )r-   r.   r   r0   r?   r@   r   encode_sequencer   r)   encoded_oidencode_bitstring)r$   r.   ro   rp   rX   s        r   r~   zVerifyingKey.to_der   s    ! !2!4!4!6!6>> !2!4!4!6!6>>%'%/	"3#67N7;z7M$O $O#&#7	#B#BD D 	Dr   c                 |    |p| j         } ||                                          }|                     |||          S rC   )r*   r[   verify_digest)r$   r]   r^   r1   rZ   r[   s         r   verifyzVerifyingKey.verify   s@    4t4$&&((!!)VY???r   c                 Z   t          |          | j        j        k    r.t          d| j        j        dt          |          z  fz            t          |          } ||| j        j                  \  }}t          j	        ||          }| j        
                    ||          rdS t          )N1this curve (%s) is too short for your digest (%d)   T)r5   r)   r7   r   namer
   r-   r.   r   re   verifiesr   )r$   r]   r[   rZ   numberrg   rh   ri   s           r   r   zVerifyingKey.verify_digest   s    v;;+++  "8;?:?;<s6{{?;L"L M M M "&))yDK$5661oa##;,, 	4r   rC   )rv   )r   r   r   r&   classmethodr   r   r2   rA   rF   rD   r   r_   r\   rq   ru   rz   r   r~   r   r   r   r   r   r   r      s       , , , ,
 .6    [ )1D#'? ? ? [?" 1 1 [1 7 7 [7, IMYi x x x [x W[gw    [    " " " "
6 6 6D D D 04?O @ @ @ @
 :J 
  
  
  
  
  
 r   r   c                       e Zd ZddZeedefd            Zeeefd            Zeeefd            Z	eefd            Z
eefd            Zd Zd	 Zd
 Zd ZdedfdZdedfdZddedfdZdedfdZddZdS )
SigningKeyNc                 (    |st          d          d S )Nz0Please use SigningKey.generate() to construct mer!   r#   s     r   r&   zSigningKey.__init__   s&    * 	PNOOO	P 	Pr   c                 Z    t          |j        |          }|                     |||          S rC   )r   r.   from_secret_exponent)r/   r)   entropyr1   secexps        r   generatezSigningKey.generate   s+    5;00))&%BBBr   c                 f    | d          }||_         ||_        |j        |_        |j        }d|cxk    r|k     sn J |j        |z  }t          j        |j        |          }||_        t                              |||          |_	        t          j
        ||          |_        ||j        _        |S )NTr(   r   )r)   r*   r7   r.   r,   r   r+   r   r2   verifying_keyPrivate_keyprivkey)r/   r   r)   r1   r$   npubkey_pointr-   s           r   r   zSigningKey.from_secret_exponent   s    u666
 (}KFQ/!%/<@@);;L%<DF F(88r   c                     t          |          |j        k    sJ t          |          |j        f            t          |          }|                     |||          S rC   )r5   r7   r
   r   )r/   r;   r)   r1   r   s        r   rA   zSigningKey.from_string   sU    6{{em+++c&kk5=-I+++!&))))&%BBBr   c                     t          |t                    r|                                }||                    d          d          }|                     t          j        |          |          S )Ns   -----BEGIN EC PRIVATE KEY-----)
isinstancestrencodeindexrD   r   rE   )r/   r;   r1   privkey_pems       r   rF   zSigningKey.from_pem   s^     fc"" 	%]]__FV\\*KLLMMN~~ci44h???r   c                    t          j        |          \  }}|dk    r)t          j        dt          j        |          z            t          j        |          \  }}|dk    rt          j        d|z            t          j        |          \  }}t          j        |          \  }}}|dk    rt          j        d|z            t          j        |          \  }	}|dk    r)t          j        dt          j        |          z            t          |	          }
t          |          |
j        k     rd|
j        t          |          z
  z  |z   }|                     ||
|          S )	Nr   z#trailing junk after DER privkey: %sr   z,expected '1' at start of DER privkey, got %dr   z%expected tag 0 in DER privkey, got %dz-trailing junk after DER privkey curve_oid: %s    )r   rJ   rK   rL   rM   remove_integerremove_octet_stringremove_constructedrN   r   r5   r7   rA   )r/   r;   r1   rh   rR   oneprivkey_strtagcurve_oid_str	curve_oidr)   s              r   rD   zSigningKey.from_der   s    &v..5C<<#$I$,$4U$;$;%< = = =#A&&Q!88# %.03%4 5 5 5033Q # 6q 9 9]A!88# %.03%4 5 5 5,];;	5C<<# %46>6Fu6M6M%N O O O9%% {em++!U]S5E5E%EFTK  eX>>>r   c                 R    | j         j        }t          || j         j                  }|S rC   )r   secret_multiplierr   r.   )r$   r   rh   s      r   rz   zSigningKey.to_string   s%    /VT\%788r   c                 P    t          j        |                                 d          S )NzEC PRIVATE KEYr|   r   s    r   r   zSigningKey.to_pem   s    y(8999r   c                 r   d|                                                                  z   }t          j        t          j        d          t          j        |                                           t          j        d| j        j                  t          j        dt          j	        |                              S )NrH   r   r   )
get_verifying_keyrz   r   r   encode_integerencode_octet_stringencode_constructedr)   r   r   )r$   
encoded_vks     r   r~   zSigningKey.to_der   s     !4#9#9#;#;#E#E#G#GG
"3#5a#8#8#&#:4>>;K;K#L#L#&#9!TZ=S#T#T#&#9!S=QR\=]=]#^#^% % 	%r   c                     | j         S rC   )r   r   s    r   r   zSigningKey.get_verifying_key  s    !!r   r   c                     |p| j         } ||                                          }|                     ||||          S )N)r1   	sigencodeextra_entropy)r*   r[   sign_digest_deterministic)r$   r^   r1   r   r   r[   s         r   sign_deterministiczSigningKey.sign_deterministic  sQ     4t4$&&((--X' . ) ) 	)r   c                    | j         j        }d }d}	 t          j        | j        j                                        |||||          }	 |                     |||          \  }	}
}}n# t          $ r |dz  }Y nw xY wk ||	|
||          S )z
        Calculates 'k' from data itself, removing the need for strong
        random generator and producing deterministic (reproducible) signatures.
        See RFC 6979 for more details.
        c                     | |||fS rC   r   )rg   rh   r.   vs       r   
simple_r_sz8SigningKey.sign_digest_deterministic.<locals>.simple_r_s  s    a>!r   r   T)	retry_genr   )r   kr   )	r   r   r   
generate_kr)   r,   r.   sign_digestr	   )r$   r[   r1   r   r   r   r   r   r   rg   rh   r.   r   s                r   r   z$SigningKey.sign_digest_deterministic  s     /	" 	" 	" 		"
$**,,fh#=B B BA!%!1!1&JRS!1!T!T1eQ   Q				 yAua(((s   
A( (A:9A:c                 ~    |p| j         } ||                                          }|                     ||||          S )a@  
        hashfunc= should behave like hashlib.sha1 . The output length of the
        hash (in bytes) must not be longer than the length of the curve order
        (rounded up to the nearest byte), so using SHA256 with nist256p is
        ok, but SHA256 with nist192p is not. (In the 2**-96ish unlikely event
        of a hash output larger than the curve order, the hash will
        effectively be wrapped mod n).

        Use hashfunc=hashlib.sha1 to match openssl's -ecdsa-with-SHA1 mode,
        or hashfunc=hashlib.sha256 for openssl-1.0.0's -ecdsa-with-SHA256.
        )r*   r[   r   )r$   r^   r   r1   r   r   hs          r   signzSigningKey.sign,  sD     4t4HTNN!!##7Iq999r   c                    t          |          | j        j        k    r.t          d| j        j        dt          |          z  fz            t          |          }|                     |||          \  }}} |||| j        j        |          S )Nr   r   )	r5   r)   r7   r   r   r
   sign_numberr   r.   )	r$   r[   r   r   r   r   rg   rh   r   s	            r   r   zSigningKey.sign_digest=  s    v;;+++  "8;?:?;<s6{{?;L"L M M M "&))""67A661ayAt|11555r   c                     | j         j        }||}nt          ||          }d|cxk    r|k     sn J | j                             ||          }|j        |j        |j        fS )Nr   )r   r.   r   r   rg   rh   recovery_param)r$   r   r   r   r.   _kri   s          r   r   zSigningKey.sign_numberF  so    " =BB5'**BBl++uceS///r   rC   )NN)r   r   r   r&   r   r   r   r   r   rA   rF   rD   rz   r   r~   r   r   r   r   r   r   r   r   r   r   r   r      s       P P P P &t C C C [C 2:T    [  )1D C C C [C
 )- @ @ @ [@ )- $? $? $? [$?L  
: : :% % %" " " 15%5),) ) ) ) :>,<03) ) ) )4 "&@PTX : : : :" +/:Jd 6 6 6 60 0 0 0 0 0r   r   )rL   r9   r   r   r   curvesr   r   r	   utilr
   r   r   r   r   r   r   hashlibr   	Exceptionr   r   r   r   r   r   r   <module>r      s                      ( ( ( ( ( ( ( (       ? ? ? ? ? ? ? ? ? ? 4 4 4 4 4 4 4 4 : : : : : : : :      	 	 	 	 		 	 	 		 	 	 	 	Y 	 	 	C  C  C  C  C  C  C  C L{0 {0 {0 {0 {0 {0 {0 {0 {0 {0r   