
    Ii                         S SK Jr  S SKJr  S SKJrJr  S SKJrJ	r	  S SK
JrJrJrJrJr  S SKJrJrJrJrJr   " S S5      rS	rS
rSrSrg)   )Math)Point)	secp256k1getByOid)getPemContent	createPem)
hexFromIntparseDerFieldTypeencodeConstructedencodePrimitive)hexFromByteStringbyteStringFromHex
intFromHexbase64FromByteStringbyteStringFromBase64c                       \ rS rSrS rSS jrS rS rS r\	S 5       r
\	S 5       r\	\S	4S
 j5       r\	\4S j5       rSrg)	PublicKey	   c                     Xl         X l        g )Npointcurve)selfr   r   s      =/venv/lib/python3.13/site-packages/ellipticcurve/publicKey.py__init__PublicKey.__init__   s    

    c                    SU R                   R                  5       -  n[        U R                  R                  5      R                  U5      n[        U R                  R                  5      R                  U5      nX4-   nU(       a  SU-   $ U$ )N   0004)r   lengthr	   r   xzfilly)r   encoded
baseLengthxHexyHexstrings         r   toStringPublicKey.toString   sl    **,,
$**,,'--j9$**,,'--j9F?"r   c                     SU R                   R                  5       -  nU R                  R                  S-  S:X  a  [        O[
        n[        U R                  R                  5      R                  U5      nX#-   $ )Nr        )	r   r"   r   r%   _evenTag_oddTagr	   r#   r$   )r   r'   	parityTagr(   s       r   toCompressedPublicKey.toCompressed   sZ    **,,
 $

q 0A 5H7	$**,,'--j9r   c           
         [        [        [        [        R                  [        5      [        [        R                  U R
                  R                  5      5      [        [        R                  U R                  SS95      5      n[        U5      $ )NT)r&   )
r   r   r   object_ecdsaPublicKeyOidr   oid	bitStringr+   r   )r   hexadecimals     r   toDerPublicKey.toDer   sg    ' 3 35GH 3 3TZZ^^D L22DMM$M4OP
 !--r   c                 P    U R                  5       n[        [        U5      [        S9$ )N)contenttemplate)r:   r   r   _pemTemplate)r   ders     r   toPemPublicKey.toPem(   s     jjl!5c!:\RRr   c                 R    [        U[        S9nU R                  [        U5      5      $ )N)pemr>   )r   r?   fromDerr   )clsr*   publicKeyPems      r   fromPemPublicKey.fromPem,   s#    $,G{{/=>>r   c                     [        U5      n[        U5      S   u  p4Uu  pVU[        :w  a  [        SR	                  [        US95      e[        U5      nU R                  XGS9$ )Nr.   zgThe Public Key Object Identifier (OID) should be {ecdsaPublicKeyOid}, but {actualOid} was found instead)ecdsaPublicKeyOid	actualOid)r*   r   )r   r
   r6   	Exceptionformatr   
fromString)rF   r*   r9   	curveDatapointStringpublicKeyOidcurveOidr   s           r   rE   PublicKey.fromDer1   s|    '/!&{!3A!6	!*--  F  M  M"4& M    "~~[~>>r   Tc                    SUR                  5       -  n[        U5      SU-  :  a  US S S:X  a  USS  nUS U nXS  n[        [        U5      [        U5      S9n[	        XrS9nU(       d  U$ UR                  5       (       a  [        S5      eUR                  U5      (       d8  [        SR                  UR                  UR                  UR                  S95      e[        R                  " XrR                  UR                  UR                  UR                   S	9R                  5       (       d8  [        S
R                  UR                  UR                  UR                  S95      eU$ )Nr       r!   )r#   r%   r   zPublic Key point is at infinityz-Point ({x},{y}) is not valid for curve {name})r#   r%   name)pnNAPz-Point ({x},{y}) * {name}.N is not at infinity)r"   lenr   r   r   isAtInfinityrM   containsrN   r#   r%   rW   r   multiplyrZ   r[   r\   )	rF   r*   r   validatePointr'   xsysrX   	publicKeys	            r   rO   PublicKey.fromString>   s?   '
v;Z'F2AJ&,@ABZFKZ K nn
 A3	>>=>>~~a  KRRUVUXUX\]\_\_fkfpfpRqrr}}qGGuww%''UWWMZZ\\KRRUVUXUX\]\_\_fkfpfpRqrrr   c                     US S USS  pCU[         [        4;  a  [        S5      e[        U5      nUR	                  XS[         :H  S9nU " [        XV5      US9$ )Nr    z,Compressed string should start with 02 or 03)isEvenr   )r/   r0   rM   r   r%   r   )rF   r*   r   r1   r(   r#   r%   s          r   fromCompressedPublicKey.fromCompressedV   s^     !*fQRj4Xw//JKKtGGA83G4qE22r   )r   r   N)F)__name__
__module____qualname____firstlineno__r   r+   r2   r:   rA   classmethodrH   rE   r   rO   rh   __static_attributes__ r   r   r   r   	   st     .S ? ? 
? 
? &/t  . *3 3 3r   r   0203)r   r    iH  i='  r    r   z?
-----BEGIN PUBLIC KEY-----
{content}
-----END PUBLIC KEY-----
N)mathr   r   r   r   r   r   	utils.pemr   r   	utils.derr	   r
   r   r   r   utils.binaryr   r   r   r   r   r   r/   r0   r6   r?   rp   r   r   <module>rw      sE      & / Z Z v vT3 T3n 
 . r   