
    xh                         d dl 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mZmZ d dlmZmZmZmZmZ  G d d          Zd	Zd
ZdZdZdS )   )Math)Point)	secp256k1getByOid)getPemContent	createPem)
hexFromIntparseDerFieldTypeencodeConstructedencodePrimitive)hexFromByteStringbyteStringFromHex
intFromHexbase64FromByteStringbyteStringFromBase64c                       e Zd Zd ZddZd Zd Zd Zed             Z	ed             Z
eed	fd
            Zeefd            ZdS )	PublicKeyc                 "    || _         || _        d S )Npointcurve)selfr   r   s      J/var/www/html/what/lib/python3.11/site-packages/ellipticcurve/publicKey.py__init__zPublicKey.__init__   s    



    Fc                    d| j                                         z  }t          | j        j                                      |          }t          | j        j                                      |          }||z   }|rd|z   S |S )N   0004)r   lengthr	   r   xzfilly)r   encoded
baseLengthxHexyHexstrings         r   toStringzPublicKey.toString   sx    **,,,
$*,''--j99$*,''--j99 	#F?"r   c                     d| j                                         z  }| j        j        dz  dk    rt          nt
          }t          | j        j                                      |          }||z   S )Nr       )	r   r    r   r#   _evenTag_oddTagr	   r!   r"   )r   r%   	parityTagr&   s       r   toCompressedzPublicKey.toCompressed   s`    **,,,
 $
q 0A 5 5HH7	$*,''--j994r   c           	      2   t          t          t          t          j        t                    t          t          j        | j        j                            t          t          j        |                     d                              }t          |          S )NT)r$   )
r   r   r   object_ecdsaPublicKeyOidr   oid	bitStringr)   r   )r   hexadecimals     r   toDerzPublicKey.toDer   ss    ' 35GHH 3TZ^DD  L2DMM$M4O4OPP
 
 !---r   c                 p    |                                  }t          t          |          t                    S )N)contenttemplate)r6   r   r   _pemTemplate)r   ders     r   toPemzPublicKey.toPem(   s+    jjll!5c!:!:\RRRRr   c                 r    t          |t                    }|                     t          |                    S )N)pemr9   )r   r:   fromDerr   )clsr(   publicKeyPems      r   fromPemzPublicKey.fromPem,   s/    $,GGG{{/==>>>r   c                    t          |          }t          |          d         \  }}|\  }}|t          k    r)t          d                    t          |                    t          |          }|                     ||          S )Nr+   zgThe Public Key Object Identifier (OID) should be {ecdsaPublicKeyOid}, but {actualOid} was found instead)ecdsaPublicKeyOid	actualOid)r(   r   )r   r
   r2   	Exceptionformatr   
fromString)r@   r(   r5   	curveDatapointStringpublicKeyOidcurveOidr   s           r   r?   zPublicKey.fromDer1   s    '//!&{!3!3A!6	;!*h---  F  M  M"4& M      ""~~[~>>>r   Tc                    d|                                 z  }t          |          d|z  k    r|d d         dk    r
|dd          }|d |         }||d          }t          t          |          t          |                    }t	          ||          }|s|S |                                rt          d          |                    |          s4t          d                    |j	        |j
        |j                            t          j        ||j        |j        |j        |j        	                                          s4t          d
                    |j	        |j
        |j                            |S )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   isAtInfinityrF   containsrG   r!   r#   rO   r   multiplyrR   rS   rT   )	r@   r(   r   validatePointr%   xsysrP   	publicKeys	            r   rH   zPublicKey.fromString>   sz   '
v;;Z''F2A2J&,@,@ABBZFKZK JKK nnnn
 
 
 AU333	 	>> 	?=>>>~~a   	sKRRUVUX\]\_fkfpRqqrrr}qEGuw%'UWMMMZZ\\ 	sKRRUVUX\]\_fkfpRqqrrrr   c                     |d d         |dd          }}|t           t          fvrt          d          t          |          }|                    ||t           k              } | t          ||          |          S )Nr   z,Compressed string should start with 02 or 03)isEvenr   )r,   r-   rF   r   r#   r   )r@   r(   r   r.   r&   r!   r#   s          r   fromCompressedzPublicKey.fromCompressedV   s~     !*fQRRj4	Xw///JKKKtGGAi83G44sq!E2222r   N)F)__name__
__module____qualname__r   r)   r/   r6   r<   classmethodrB   r?   r   rH   r_    r   r   r   r   	   s                  . . .S S S ? ? [? 
? 
? [
? &/t    [. *3 3 3 3 [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,   r-   r2   r:   rd   r   r   <module>rk      s                & & & & & & & & / / / / / / / / Z Z Z Z Z Z Z Z Z Z Z Z Z Z v v v v v v v v v v v v v vT3 T3 T3 T3 T3 T3 T3 T3n 
 . r   