
    9iG@                         S SK r S SKJrJr  S SKJrJrJrJrJ	r	J
r
  S SKJr  S SKJr   " S S\5      r " S S	\5      r\" 5       r " S
 S\5      r " S S\5      rg)    N)bytes_to_longlong_to_bytes)VoidPointernull_pointerSmartPointerc_size_tc_uint8_ptrc_ulonglong)Integer)getrandbitsc                   8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)CurveID                           	    N)__name__
__module____qualname____firstlineno__P192P224P256P384P521ED25519ED448
CURVE25519CURVE448__static_attributes__r       W/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/Crypto/PublicKey/_point.pyr   r      s/    DDDDDGEJHr(   r   c                       \ rS rSr0 r\R                  " 5       r/ SQr/ SQr	/ SQr
/ SQr/ SQrSS/rS	S
/r/ SQr/ SQr\\	-   \
-   \-   \-   \-   \-   \-   \-   rS rS rS rS rS rSrg)_Curves   )p192z
NIST P-192zP-192
prime192v1	secp192r1nistp192)p224z
NIST P-224zP-224
prime224v1	secp224r1nistp224)p256z
NIST P-256zP-256
prime256v1	secp256r1nistp256)p384z
NIST P-384zP-384
prime384v1	secp384r1nistp384)p521z
NIST P-521zP-521
prime521v1	secp521r1nistp521ed25519Ed25519ed448Ed448)
curve25519
Curve25519X25519)curve448Curve448X448c                     XR                   ;   $ N	all_names)selfitems     r)   __contains___Curves.__contains__1   s    ~~%%r(   c                     U R                   $ rL   rM   rO   s    r)   __dir___Curves.__dir__4   s    ~~r(   c                 p   XR                   ;   af  SSKJn  UR                  5       n[        R
                  Ul        U R                  R                  [        R                  U R                   U5      5        GOXR                  ;   af  SSKJn  UR                  5       n[        R                  Ul        U R                  R                  [        R                  U R                  U5      5        GO>XR                  ;   af  SSKJn  UR                  5       n[        R                   Ul        U R                  R                  [        R                  U R                  U5      5        GOXR"                  ;   af  SSKJn  UR%                  5       n[        R&                  Ul        U R                  R                  [        R                  U R"                  U5      5        GOTXR(                  ;   af  SSKJn  UR+                  5       n[        R,                  Ul        U R                  R                  [        R                  U R(                  U5      5        GOXR.                  ;   af  SSKJn  UR3                  5       n	[        R4                  U	l        U R                  R                  [        R                  U R.                  U	5      5        GOjXR6                  ;   ae  SSKJn  UR9                  5       n
[        R:                  U
l        U R                  R                  [        R                  U R6                  U
5      5        OXR<                  ;   ae  SSKJn  URA                  5       n[        RB                  Ul        U R                  R                  [        R                  U R<                  U5      5        OXRD                  ;   ae  SSKJn  URG                  5       n[        RH                  Ul        U R                  R                  [        R                  U RD                  U5      5        O[K        SU-  5      eU R                  U   $ )Nr   )	_nist_ecc)_edwards)_montgomeryzUnsupported curve '%s')&
p192_names rX   
p192_curver   r   idcurvesupdatedictfromkeys
p224_names
p224_curver   
p256_names
p256_curver    
p384_names
p384_curver!   
p521_names
p521_curver"   ed25519_namesrY   ed25519_curver#   ed448_namesed448_curver$   curve25519_namesrZ   curve25519_curver%   curve448_namescurve448_curver&   
ValueError)rO   namerX   r-   r1   r5   r9   r=   rY   rA   rC   rZ   rE   rH   s                 r)   load_Curves.load7   s   ??"#'')DllDGKKt}}T__dCD__$#'')DllDGKKt}}T__dCD__$#'')DllDGKKt}}T__dCD__$#'')DllDGKKt}}T__dCD__$#'')DllDGKKt}}T__dCD'''",,.G GJKKt}}T-?-?IJ%%%"((*E}}EHKKt}}T-=-=uEF***%$557J#..JMKKt}}T-B-BJOP(((%"113H!**HKKKt}}T-@-@(KL5<=={{4  r(   c                    U R                      U R                  R                  U5      nUc  U R                  U5      nXR                  ;   d  XR
                  ;   a  [        UR                  U5      Ul        O&[        UR                  UR                  U5      Ul        UR                  [        R                  [        R                  4;   Ul        UR                  [        R                   [        R"                  4;   Ul        UR                  =(       d    UR$                  (       + Ul        S S S 5        U$ ! , (       d  f       W$ = frL   )curves_lockr_   getru   ro   rq   	EccXPointGxGEccPointGyr^   r   r#   r$   
is_edwardsr%   r&   is_montgomeryis_weierstrass)rO   rt   curves      r)   __getitem___Curves.__getitem__i   s    KKOOD)E}		$000D<O<O4O'$7EG&uxx4@EG#(88/O#O &+hh73E3E3:3C3C3E 'E#,1,<,< -@,1,?,?(A$    s   DD44
Ec                 d    U R                    H  nX   nM	     U R                  R                  5       $ rL   )rN   r_   items)rO   rt   _s      r)   r   _Curves.itemsy   s*    NND
A #{{  ""r(   r   N)r   r   r   r   r_   	threadingRLockrx   r[   rc   re   rg   ri   rk   rm   ro   rq   rN   rQ   rU   ru   r   r   r'   r   r(   r)   r+   r+      s    F//#KJJJJJ	*MG$K=5NZ'*4zAJN#$&679GHI&0!d #r(   r+   c                       \ rS rSrSrSS jrS rS rS rS r	S r
S	 rS
 r\S 5       r\S 5       r\S 5       rS rS rS rS rS rS rS rS rSrg)r}      a  A class to model a point on an Elliptic Curve.

The class supports operators for:

* Adding two points: ``R = S + T``
* In-place addition: ``S += T``
* Negating a point: ``R = -T``
* Comparing two points: ``if S == T: ...`` or ``if S != T: ...``
* Multiplying a point by a scalar: ``R = S*k``
* In-place multiplication by a scalar: ``T *= k``

:ivar curve: The **canonical** name of the curve as defined in the `ECC table`_.
:vartype curve: string

:ivar x: The affine X-coordinate of the ECC point
:vartype x: integer

:ivar y: The affine Y-coordinate of the ECC point
:vartype y: integer

:ivar xy: The tuple with affine X- and Y- coordinates
c                     [         U   U l        U R                  R
                  U l        U R                  R                  [        R                  :X  a  [        S5      eU R                  5       n[        X5      n[        X$5      n[        U5      U:w  d  [        U5      U:w  a  [        S5      eU R                  R                  R                  nU R                  R                  R                  n[!        5       U l         U R                  R$                  R'                  5       n	U" U R"                  R-                  5       [/        U5      [/        U5      [1        U5      U	5      n
U
(       a  U
S:X  a  [        S5      e[        SU
-  5      e[3        U R"                  R'                  5       U5      U l        g ! [         a    [        S[	        U5      -  5      ef = f! [(         a	    [*        n	 Nf = f)NUnknown curve name %sz)EccPoint cannot be created for Curve25519Incorrect coordinate length   )The EC point does not belong to the curve(Error %d while instantiating an EC point)_curves_curveKeyErrorrs   str	canonicalr   r^   r   r%   size_in_bytesr   lenrawlib	new_point
free_pointr   _pointcontextry   AttributeErrorr   
address_ofr	   r   r   )rO   xyr   modulus_bytesxbybr   	free_funcr   results              r)   __init__EccPoint.__init__   s   	C!%.DK [[**
;;>>W///HII**,1,1,r7m#s2w-'?:;;KK&&00	KK&&11	!m	#kk))--/G 4;;113&r?&r?#M2"	$ | !LMMG&PQQ #4;;??#4i@G  	C4s5zABB	C(  	#"G	#s   F0 =$G 0"GG('G(c                    U R                   R                  R                  nU R                   R                  R                  n[	        5       U l        U" U R
                  R                  5       UR
                  R                  5       5      nU(       a  [        SU-  5      e[        U R
                  R                  5       U5      U l        U $ Nz"Error %d while cloning an EC point
r   r   cloner   r   r   r   ry   rs   r   rO   pointr   r   r   s        r)   setEccPoint.set   s    ""((KK&&11	!mt{{--/||'')+ AFJKK"4;;??#4i@r(   c                     [        U[        5      (       d  gU R                  R                  R                  nSU" U R
                  R                  5       UR
                  R                  5       5      :H  $ NFr   )
isinstancer}   r   r   cmpr   ry   )rO   r   cmp_funcs      r)   __eq__EccPoint.__eq__   sQ    %**;;%%))HT[[__.0@0@0BCCCr(   c                     X:X  + $ rL   r   )rO   r   s     r)   __ne__EccPoint.__ne__   s      r(   c                     U R                   R                  R                  nU R                  5       nU" UR                  R                  5       5      nU(       a  [        SU-  5      eU$ )Nz$Error %d while inverting an EC point)r   r   negcopyr   ry   rs   )rO   neg_funcnpr   s       r)   __neg__EccPoint.__neg__   sO    ;;%%))YY["))--/*CfLMM	r(   c                 N    U R                   u  p[        XU R                  5      nU$ zReturn a copy of this point.)xyr}   r   )rO   r   r   r   s       r)   r   EccPoint.copy   s"    wwaDJJ'	r(   c                 t    U R                   R                  (       a  U R                  S:H  $ U R                  S:H  $ ),``True`` if this is the *point-at-infinity*.r   )r   r   )r   r   r   r   rT   s    r)   is_point_at_infinityEccPoint.is_point_at_infinity   s.     ;;!!66Q;77f$$r(   c                     U R                   R                  (       a  [        SSU R                  5      $ [        SSU R                  5      $ )-Return the *point-at-infinity* for the curve.r   r   )r   r   r}   r   rT   s    r)   point_at_infinityEccPoint.point_at_infinity   s7     ;;!!Aq$**--Aq$**--r(   c                      U R                   S   $ )Nr   r   rT   s    r)   r   
EccPoint.x       wwqzr(   c                      U R                   S   $ )Nr   r   rT   s    r)   r   
EccPoint.y   r   r(   c                    U R                  5       n[        U5      n[        U5      nU R                  R                  R                  nU" [        U5      [        U5      [        U5      U R                  R                  5       5      nU(       a  [        SU-  5      e[        [        U5      5      [        [        U5      5      4$ )Nz#Error %d while encoding an EC point)r   	bytearrayr   r   get_xyr	   r   r   ry   rs   r   r   )rO   r   r   r   r   r   s         r)   r   EccPoint.xy  s    **,}%}%##**B#B /)+ BVKLLb)*GM"4E,FGGr(   c                 .    U R                  5       S-   S-  $ z"Size of each coordinate, in bytes.r   r   size_in_bitsrT   s    r)   r   EccPoint.size_in_bytes      !!#a'A--r(   c                 .    U R                   R                  $ z!Size of each coordinate, in bits.r   modulus_bitsrT   s    r)   r   EccPoint.size_in_bits      {{'''r(   c                     U R                   R                  R                  nU" U R                  R	                  5       5      nU(       a  [        SU-  5      eU $ )z]Double this point (in-place operation).

Returns:
    This same object (to enable chaining).
z#Error %d while doubling an EC point)r   r   doubler   ry   rs   )rO   double_funcr   s      r)   r   EccPoint.double  sG     kk((//T[[__./BVKLLr(   c                    U R                   R                  R                  nU" U R                  R	                  5       UR                  R	                  5       5      nU(       a  US:X  a  [        S5      e[        SU-  5      eU $ )zAdd a second point to this one   z#EC points are not on the same curvez#Error %d while adding two EC points)r   r   addr   ry   rs   )rO   r   add_funcr   s       r)   __iadd__EccPoint.__iadd__'  si     ;;%%))$++//+U\\-=-=-?@| !FGGBVKLLr(   c                 .    U R                  5       nX!-  nU$ )z8Return a new point, the addition of this one and anotherr   )rO   r   r   s      r)   __add__EccPoint.__add__2  s     YY[
	r(   c           
      H   U R                   R                  R                  nUS:  a  [        S5      e[	        U5      nU" U R
                  R                  5       [        U5      [        [        U5      5      [        [        S5      5      5      nU(       a  [        SU-  5      eU $ zMultiply this point by a scalarr   z?Scalar multiplication is only defined for non-negative integers@   z%Error %d during scalar multiplicationr   r   scalarrs   r   r   ry   r	   r   r   r
   r   rO   r   scalar_funcsbr   s        r)   __imul__EccPoint.__imul__9       kk((//A:^__6"T[[__.(_%c"g.(R9; DvMNNr(   c                 .    U R                  5       nX!-  nU$ z2Return a new point, the scalar product of this oner   rO   r   r   s      r)   __mul__EccPoint.__mul__H       YY[
	r(   c                 $    U R                  U5      $ rL   r  rO   	left_hands     r)   __rmul__EccPoint.__rmul__O      ||I&&r(   r   r   r   N)r5   )r   r   r   r   __doc__r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r  r  r'   r   r(   r)   r}   r}      s    .'ARD!%.     H H.(	'r(   r}   c                   j    \ rS rSrSrS rS rS rS rS r	S r
\S	 5       rS
 rS rS rS rS rSrg)rz   iS  a  A class to model a point on an Elliptic Curve,
where only the X-coordinate is exposed.

The class supports operators for:

* Multiplying a point by a scalar: ``R = S*k``
* In-place multiplication by a scalar: ``T *= k``

:ivar curve: The **canonical** name of the curve as defined in the `ECC table`_.
:vartype curve: string

:ivar x: The affine X-coordinate of the ECC point
:vartype x: integer
c                     [         U   U l        U R                  R
                  U l        U R                  R                  [        R                  [        R                  4;  a  [        S5      eU R                  R                  R                  nU R                  R                  R                  n[        5       U l         U R                  R                   R#                  5       nU R)                  5       nUc  [&        nO.[+        [-        X5      5      n[/        U5      U:w  a  [        S5      e[        5       U l        U" U R                  R1                  5       U[3        U5      U5      nUS:X  a  [        S5      eU(       a  [        SU-  5      e[5        U R                  R#                  5       U5      U l        g ! [         a    [        S[	        U5      -  5      ef = f! [$         a
    [&        n GNf = f)Nr   z5EccXPoint can only be created for Curve25519/Curve448r   r   r   r   )r   r   r   rs   r   r   r   r^   r   r%   r&   r   r   r   r   r   r   ry   r   r   r   r	   r   r   r   r   r   )	rO   r   r   r   r   r   r   r   r   s	            r)   r   EccXPoint.__init__c  s   
	C!%.DK [[**
;;>>'"4"4g6F6F!GGTUUKK&&00	KK&&11	!m	#kk))--/G **,9B]1<=B2w-' !>??!m4;;113#M2"$
 R<HIIG&PQQ #4;;??#4i@M  	C4s5zABB	C  	#"G	#s   F5 >$G 5"GG.-G.c                    U R                   R                  R                  nU R                   R                  R                  n[	        5       U l        U" U R
                  R                  5       UR
                  R                  5       5      nU(       a  [        SU-  5      e[        U R
                  R                  5       U5      U l        U $ r   r   r   s        r)   r   EccXPoint.set  s    ""((KK&&11	!mt{{--/||'')+AFJKK"4;;??#4i@r(   c                     [        U[        5      (       d  gU R                  R                  R                  nU R
                  R                  5       nUR
                  R                  5       nU" X45      nSU:H  $ r   )r   rz   r   r   r   r   ry   )rO   r   r   p1p2ress         r)   r   EccXPoint.__eq__  s\    %++;;%%))[[__\\rCxr(   c                      U R                   n[        XR                  5      $ ! [         a    U R                  5       s $ f = fr   )r   rs   r   rz   r   )rO   r   s     r)   r   EccXPoint.copy  sA    	,A JJ''  	,))++	,s   # A A c                 >     U R                   ng! [         a     gf = f)r   TF)r   rs   )rO   r   s     r)   r   EccXPoint.is_point_at_infinity  s)    	A   		s    
c                 .    [        SU R                  5      $ )r   N)rz   r   rT   s    r)   r   EccXPoint.point_at_infinity  s     tzz**r(   c                 T   U R                  5       n[        U5      nU R                  R                  R                  nU" [        U5      [        U5      U R                  R                  5       5      nUS:X  a  [        S5      eU(       a  [        SU-  5      e[        [        U5      5      $ )N   z)No X coordinate for the point at infinityz'Error %d while getting X of an EC point)r   r   r   r   get_xr	   r   r   ry   rs   r   r   )rO   r   r   r   r   s        r)   r   EccXPoint.x  s    **,}%""(({2.{{(* R<HIIFOPP}R())r(   c                 .    U R                  5       S-   S-  $ r   r   rT   s    r)   r   EccXPoint.size_in_bytes  r   r(   c                 .    U R                   R                  $ r   r   rT   s    r)   r   EccXPoint.size_in_bits  r   r(   c           
      H   U R                   R                  R                  nUS:  a  [        S5      e[	        U5      nU" U R
                  R                  5       [        U5      [        [        U5      5      [        [        S5      5      5      nU(       a  [        SU-  5      eU $ r   r   r   s        r)   r   EccXPoint.__imul__  r   r(   c                 .    U R                  5       nX!-  nU$ r   r   r   s      r)   r  EccXPoint.__mul__  r  r(   c                 $    U R                  U5      $ rL   r  r  s     r)   r  EccXPoint.__rmul__  r
  r(   r  N)r   r   r   r   r  r   r   r   r   r   r   r  r   r   r   r   r  r  r'   r   r(   r)   rz   rz   S  sT    -A^(+
 * *.('r(   rz   )r   Crypto.Util.numberr   r   Crypto.Util._raw_apir   r   r   r   r	   r
   Crypto.Math.Numbersr   Crypto.Random.randomr   objectr   r+   r   r}   rz   r   r(   r)   <module>r1     s`     ;/ / ( ,	f 	c#f c#L )M'v M'`Z' Z'r(   