
    E#i8                         S SK r SSKJr  SSKJr  SSKJr  SSKJrJr  SSKJr  SSK	J
r
JrJr  SS	K	JrJr  SS
K	JrJr  S SKJr   " S S\5      r " S S\5      r " S S5      r " S S5      rg)    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                       \ rS rSrSrg)BadSignatureError    N__name__
__module____qualname____firstlineno____static_attributes__r       ]/home/james-whalen/.local/lib/python3.13/site-packages/ccxt/static_dependencies/ecdsa/keys.pyr   r          r   r   c                       \ rS rSrSrg)BadDigestError   r   Nr   r   r   r   r    r       r   r   r    c                       \ rS rSrSS jr\\\4S j5       r\\\S4S j5       r	\S 5       r
\S 5       r\\\4S	 j5       r\\\4S
 j5       rS rS rSS jrS rS rS\4S jr\4S jrSrg)VerifyingKey   Nc                 (    U(       d  [        S5      eg )Nz2Please use VerifyingKey.generate() to construct me	TypeErrorself_error__please_use_generates     r   __init__VerifyingKey.__init__   s    * + , , +r   c                     U " SS9nX$l         X4l        [        R                  " UR                  U5      Ul        UR                  UR
                  l        U$ )NTr*   )curvedefault_hashfuncr   
Public_key	generatorpubkeyorder)klasspointr/   hashfuncr)   s        r   from_public_pointVerifyingKey.from_public_point   sD    6
 (&&u>!KKr   Tc                    UR                   n[        U5      UR                  :X  d   [        U5      UR                  45       eUS UR                   nXR                  S  n[        U5      UR                  :X  d   [        U5      UR                  45       e[        U5      UR                  :X  d   [        U5      UR                  45       e[	        U5      n[	        U5      n	U(       a(  [
        R                  " UR                  X5      (       d   eSSKJ	n
  U
R                  UR                  XU5      nU R                  XU5      $ )Nr   )ellipticcurve)r4   lenverifying_key_lengthbaselenr
   r   point_is_validr2    r;   Pointr/   r8   )r5   stringr/   r7   validate_pointr4   xsysxyr;   r6   s               r   from_stringVerifyingKey.from_string%   s    Fu999 	9FU778	99NU]]#MMN#2w%--'A#b'5==)AA'2w%--'A#b'5==)AA'R R ''>>>>###EKKu=&&uX>>r   c                 L    U R                  [        R                  " U5      5      $ N)from_derr   unpem)r5   rB   s     r   from_pemVerifyingKey.from_pem7   s    ~~cii/00r   c                    [         R                  " U5      u  p#US:w  a-  [         R                  " S[        R                  " U5      -  5      e[         R                  " U5      u  pE[         R
                  " U5      u  pg[         R
                  " U5      u  pUS:w  a-  [         R                  " S[        R                  " U5      -  5      eU[        :X  d   U[        45       e[        U5      n	[         R                  " U5      u  pUS:w  a-  [         R                  " S[        R                  " U5      -  5      eU
R                  S5      (       d   eU R                  U
SS  U	5      $ )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
startswithrH   )r5   rB   s1emptys2point_str_bitstringoid_pkrest	oid_curver/   	point_strs              r   rL   VerifyingKey.from_der;   sD    ''/	C<##$H$,$4$4U$;%< = ="%"5"5b"9((,,,T2	C<##$P$,$4$4U$;%< = =(C6?*CC(9%//0CD	C<##$P$,$4$4U$;%< = =##K0000  1266r   c                 Z    U" U5      R                  5       nU R                  XU[        US9$ )N)r7   	sigdecode)digest$from_public_key_recovery_with_digestr   )r5   	signaturedatar/   r7   rd   re   s          r   from_public_key_recovery%VerifyingKey.from_public_key_recoveryR   s2    
 $&&(99)U]amv9wwr   c                    UR                   nU" XR                  5       5      u  px[        R                  " Xx5      n	[	        U5      n
U	R                  X5      nU Vs/ s H  oR                  UR                  X45      PM      nnU$ s  snf rK   )r2   r4   r   	Signaturer
   recover_public_keysr8   r6   )r5   rg   re   r/   r7   rd   r2   rssigdigest_as_numberpkspkverifying_keyss                 r   rf   1VerifyingKey.from_public_key_recovery_with_digestZ   s    
 OO	OO$56ooa#+F3%%&6B X[[WZQS11"((ELWZ[ \s   %Bc                     U R                   R                  n[        U R                   R                  R	                  5       U5      n[        U R                   R                  R                  5       U5      nX#-   $ )z.Convert the point to the :term:`raw encoding`.r3   r4   r   r6   rF   rG   )r)   r4   x_stry_strs       r   _raw_encodeVerifyingKey._raw_encodej   sW    !! !2!2!4!4!6> !2!2!4!4!6>}r   c                     U R                   R                  n[        U R                   R                  R	                  5       U5      nU R                   R                  R                  5       S-  (       a  SU-   $ SU-   $ )z*Encode the point into the compressed form.r         rw   )r)   r4   rx   s      r   _compressed_encodeVerifyingKey._compressed_encodeq   s_    !! !2!2!4!4!6>;; 1$U?"r   c                 N    US:X  a  U R                  5       $ U R                  5       $ )N
compressed)r   rz   )r)   encodings     r   	to_stringVerifyingKey.to_stringy   s(    |#**,,!!r   c                 L    [         R                  " U R                  5       S5      $ )Nz
PUBLIC KEYr   topemto_derr)   s    r   to_pemVerifyingKey.to_pem~   s    yy55r   c                    U R                   R                  n[        U R                   R                  R	                  5       U5      n[        U R                   R                  R                  5       U5      nSU-   U-   n[        R                  " [        R                  " [        U R                  R                  5      [        R                  " U5      5      $ )NrQ   )r3   r4   r   r6   rF   rG   r   encode_sequencer   r/   encoded_oidencode_bitstring)r)   r4   rx   ry   ra   s        r   r   VerifyingKey.to_der   s    !! !2!2!4!4!6> !2!2!4!4!6>%'%/	""3#6#67N7;zz7M7M$O#&#7#7	#BD 	Dr   c                 |    U=(       d    U R                   nU" U5      R                  5       nU R                  XU5      $ rK   )r0   re   verify_digest)r)   rg   rh   r7   rd   re   s         r   verifyVerifyingKey.verify   s7    4t44$&&(!!)Y??r   c                 t   [        U5      U R                  R                  :  a0  [        SU R                  R                  S[        U5      -  4-  5      e[        U5      nU" XR                  R                  5      u  pV[        R                  " XV5      nU R                  R                  XG5      (       a  g[        e)N1this curve (%s) is too short for your digest (%d)   T)r<   r/   r>   r    namer
   r3   r4   r   rl   verifiesr   )r)   rg   re   rd   numberrn   ro   rp   s           r   r   VerifyingKey.verify_digest   s    v;+++  "8;?::??;<s6{?;L"L M M "&)KK$5$56ooa#;;,,r   )r/   r0   r3   rK   )uncompressed)r   r   r   r   r+   classmethodr   r   r8   rH   rN   rL   r   ri   rf   rz   r   r   r   r   r   r   r   r   r   r   r#   r#      s    ,
 .6   )1D#'? ?" 1 1 7 7, IMYi x x W[gw  "
6D 04?O @
 :J 
 r   r#   c                       \ rS rSrSS jr\\S\4S j5       r\\\4S j5       r	\\\4S j5       r
\\4S j5       r\\4S j5       rS	 rS
 rS rS rS\S4S jrS\S4S jrSS\S4S jrS\S4S jrSS jrSrg)
SigningKey   Nc                 (    U(       d  [        S5      eg )Nz0Please use SigningKey.generate() to construct mer&   r(   s     r   r+   SigningKey.__init__   s    *NOO +r   c                 R    [        UR                  U5      nU R                  XAU5      $ rK   )r   r4   from_secret_exponent)r5   r/   entropyr7   secexps        r   generateSigningKey.generate   s%    5;;0))&BBr   c                    U " SS9nX$l         X4l        UR                  Ul        UR                  nSUs=::  a  U:  d   e   eUR                  U-  n[
        R                  " UR                  U5      nXWl        [        R                  XbU5      Ul	        [
        R                  " Xq5      Ul        XTR                  l        U$ )NTr.   r   )r/   r0   r>   r4   r2   r   r1   r#   r8   verifying_keyPrivate_keyprivkey)r5   r   r/   r7   r)   npubkey_pointr3   s           r   r   SigningKey.from_secret_exponent   s    6
 (}}KKFQ/!!%//<@);;L<DF((8r   c                     [        U5      UR                  :X  d   [        U5      UR                  45       e[        U5      nU R                  XBU5      $ rK   )r<   r>   r
   r   )r5   rB   r/   r7   r   s        r   rH   SigningKey.from_string   sG    6{emm+Ic&k5==-II+!&)))&BBr   c                     [        U[        5      (       a  UR                  5       nXR                  S5      S  nU R	                  [
        R                  " U5      U5      $ )Ns   -----BEGIN EC PRIVATE KEY-----)
isinstancestrencodeindexrL   r   rM   )r5   rB   r7   privkey_pems       r   rN   SigningKey.from_pem   sK     fc""]]_F\\*KLMN~~cii4h??r   c                    [         R                  " U5      u  p4US:w  a-  [         R                  " S[        R                  " U5      -  5      e[         R
                  " U5      u  pSUS:w  a  [         R                  " SU-  5      e[         R                  " U5      u  pc[         R                  " U5      u  pxnUS:w  a  [         R                  " SU-  5      e[         R                  " U5      u  pUS:w  a-  [         R                  " S[        R                  " U5      -  5      e[        U	5      n
[        U5      U
R                  :  a  SU
R                  [        U5      -
  -  U-   nU R                  XjU5      $ )	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   rS   rT   rU   rV   remove_integerremove_octet_stringremove_constructedrW   r   r<   r>   rH   )r5   rB   r7   ro   r[   oneprivkey_strtagcurve_oid_str	curve_oidr/   s              r   rL   SigningKey.from_der   sb    &&v.C<##$I$,$4$4U$;%< = =##A&!8## %.03%4 5 5003 # 6 6q 9A!8## %.03%4 5 5,,];	C<## %46>6F6Fu6M%N O O9% {emm+!U]]S5E%EFTK  X>>r   c                 p    U R                   R                  n[        XR                   R                  5      nU$ rK   )r   secret_multiplierr   r4   )r)   r   ro   s      r   r   SigningKey.to_string   s*    //V\\%7%78r   c                 L    [         R                  " U R                  5       S5      $ )NzEC PRIVATE KEYr   r   s    r   r   SigningKey.to_pem   s    yy(899r   c                    SU R                  5       R                  5       -   n[        R                  " [        R                  " S5      [        R
                  " U R                  5       5      [        R                  " SU R                  R                  5      [        R                  " S[        R                  " U5      5      5      $ )NrQ   r   r   )
get_verifying_keyr   r   r   encode_integerencode_octet_stringencode_constructedr/   r   r   )r)   
encoded_vks     r   r   SigningKey.to_der   s     !4#9#9#;#E#E#GG
""3#5#5a#8#&#:#:4>>;K#L#&#9#9!TZZ=S=S#T#&#9#9!S=Q=QR\=]#^% 	%r   c                     U R                   $ rK   )r   r   s    r   r   SigningKey.get_verifying_key  s    !!!r   r   c                 z    U=(       d    U R                   nU" U5      R                  5       nU R                  XRUUS9$ )N)r7   	sigencodeextra_entropy)r0   re   sign_digest_deterministic)r)   rh   r7   r   r   re   s         r   sign_deterministicSigningKey.sign_deterministic  sF     4t44$&&(--' . ) 	)r   c           	         U R                   R                  nS nSn [        R                  " U R                  R
                  R                  5       XRUXtS9n U R                  XUS9u  pp U" XX5      $ ! [         a    US-  n Of = fMn  )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                 
    XX#4$ rK   r   )rn   ro   r4   vs       r   
simple_r_s8SigningKey.sign_digest_deterministic.<locals>.simple_r_s  s    >!r   r   )	retry_genr   )r   kr   )	r   r   r   
generate_kr/   r2   r4   sign_digestr	   )r)   re   r7   r   r   r   r   r   r   rn   ro   r4   r   s                r   r   $SigningKey.sign_digest_deterministic  s     //	" 	""

$$**,f#BA!%!1!1&RS!1!Te u((  Q	 s   A4 4BBc                 |    U=(       d    U R                   nU" U5      R                  5       nU R                  XbXE5      $ )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.
)r0   re   r   )r)   rh   r   r7   r   r   hs          r   signSigningKey.sign,  s9     4t44TN!!#I99r   c                 $   [        U5      U R                  R                  :  a0  [        SU R                  R                  S[        U5      -  4-  5      e[        U5      nU R                  XRU5      u  pgnU" XgU R                  R                  U5      $ )Nr   r   )	r<   r/   r>   r    r   r
   sign_numberr   r4   )	r)   re   r   r   r   r   rn   ro   r   s	            r   r   SigningKey.sign_digest=  s    v;+++  "8;?::??;<s6{?;L"L M M "&)""6A6at||11155r   c                     U R                   R                  nUb  UnO[        XB5      nSUs=::  a  U:  d   e   eU R                   R                  X5      nUR                  UR
                  UR                  4$ )Nr   )r   r4   r   r   rn   ro   recovery_param)r)   r   r   r   r4   _krp   s          r   r   SigningKey.sign_numberF  sk    "" =B5*BBll+uuceeS////r   )r>   r/   r0   r   r   rK   )NN)r   r   r   r   r+   r   r   r   r   r   rH   rN   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    P &t C C 2:T    )1D C C
 )- @ @ )- $? $?L
:%" 15%5),) :>,<03)4 "&@PTX :" +/:Jd 60r   r   )rU   r@   r   r   r   curvesr   r   r	   utilr
   r   r   r   r   r   r   hashlibr   	Exceptionr   r    r#   r   r   r   r   <module>r      sW        (  ? ? 4 : 		 		Y 	C  C L{0 {0r   