o
    Þý°jW@  ã                   @   sš   d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ G dd„ deƒZG dd	„ d	eƒZeƒ ZG d
d„ deƒZG dd„ deƒZdS )é    N)Úbytes_to_longÚlong_to_bytes)ÚVoidPointerÚnull_pointerÚSmartPointerÚc_size_tÚc_uint8_ptrÚc_ulonglong)ÚInteger)Úgetrandbitsc                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚCurveIDé   é   é   é   é   é   é   é   é	   N)Ú__name__Ú
__module__Ú__qualname__ÚP192ÚP224ÚP256ÚP384ÚP521ÚED25519ÚED448Ú
CURVE25519ÚCURVE448© r"   r"   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/PublicKey/_point.pyr      s    r   c                   @   s¬   e Zd Zi Ze ¡ Zg d¢Zg d¢Zg d¢Z	g d¢Z
g d¢ZddgZdd	gZg d
¢Zg d¢Zee e	 e
 e e e e e Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú_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                 C   s
   || j v S ©N©Ú	all_names)ÚselfÚitemr"   r"   r#   Ú__contains__1   ó   
z_Curves.__contains__c                 C   s   | j S rC   rD   ©rF   r"   r"   r#   Ú__dir__4   s   z_Curves.__dir__c                 C   sF  || j v rddlm} | ¡ }tj|_| j t	 
| j |¡¡ nÿ|| jv r>ddlm} | ¡ }tj|_| j t	 
| j|¡¡ nà|| jv r]ddlm} | ¡ }tj|_| j t	 
| j|¡¡ nÁ|| jv r|ddlm} | ¡ }tj|_| j t	 
| j|¡¡ n¢|| jv r›ddlm} | ¡ }tj|_| j t	 
| j|¡¡ nƒ|| jv rºddlm} | ¡ }	tj|	_| j t	 
| j|	¡¡ nd|| jv rÙddlm} | ¡ }
tj|
_| j t	 
| j|
¡¡ nE|| jv røddlm} |  ¡ }tj!|_| j t	 
| j|¡¡ n&|| j"v �rddlm} | #¡ }tj$|_| j t	 
| j"|¡¡ nt%d| ƒ‚| j| S )Nr   )Ú	_nist_ecc)Ú_edwards)Ú_montgomeryzUnsupported curve '%s')&Ú
p192_namesÚ rL   Ú
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_namesrM   Úed25519_curver   Úed448_namesÚed448_curver   Úcurve25519_namesrN   Úcurve25519_curver    Úcurve448_namesÚcurve448_curver!   Ú
ValueError)rF   ÚnamerL   r%   r)   r-   r1   r5   rM   r9   r;   rN   r=   r@   r"   r"   r#   Úload7   s^   








z_Curves.loadc                 C   sÈ   | j �W | j |¡}|d u rR|  |¡}|| jv s|| jv r%t|j|ƒ|_n	t	|j|j
|ƒ|_|jtjtjfv |_|jtjtjfv |_|jpG|j |_W d   ƒ |S W d   ƒ |S 1 s]w   Y  |S rC   )Úcurves_lockrS   Úgetri   rc   re   Ú	EccXPointÚGxÚGÚEccPointÚGyrR   r   r   r   Ú
is_edwardsr    r!   Úis_montgomeryÚis_weierstrass)rF   rh   Úcurver"   r"   r#   Ú__getitem__i   s*   
ÿÿ
õõ
þóz_Curves.__getitem__c                 C   s   | j D ]}| | }q| j ¡ S rC   )rE   rS   Úitems)rF   rh   Ú_r"   r"   r#   rv   y   s   


z_Curves.itemsN)r   r   r   rS   Ú	threadingÚRLockrj   rO   rW   rY   r[   r]   r_   ra   rc   re   rE   rH   rK   ri   ru   rv   r"   r"   r"   r#   r$      s4    ÿÿÿÿ2r$   c                   @   s¶   e Zd ZdZd*dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)S )+ro   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
    r-   c                 C   s&  zt | | _W n ty   tdt|ƒ ƒ‚w | jj| _| jjtj	kr'tdƒ‚|  
¡ }t||ƒ}t||ƒ}t|ƒ|ksAt|ƒ|krEtdƒ‚| jjj}| jjj}tƒ | _z| jj ¡ }	W n tyf   t}	Y nw || j ¡ t|ƒt|ƒt|ƒ|	ƒ}
|
rˆ|
dkr‚tdƒ‚td|
 ƒ‚t| j ¡ |ƒ| _d S )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ÚKeyErrorrg   ÚstrÚ	canonicalrt   rR   r   r    Úsize_in_bytesr   ÚlenÚrawlibÚ	new_pointÚ
free_pointr   Ú_pointÚcontextrk   ÚAttributeErrorr   Ú
address_ofr   r   r   )rF   ÚxÚyrt   Úmodulus_bytesÚxbÚybr‡   Ú	free_funcrŠ   Úresultr"   r"   r#   Ú__init__›   s@   ÿ




ÿ
üzEccPoint.__init__c                 C   óX   | j jj}| j jj}tƒ | _|| j ¡ |j ¡ ƒ}|r!td| ƒ‚t	| j ¡ |ƒ| _| S ©Nz"Error %d while cloning an EC point©
r€   r†   Úclonerˆ   r   r‰   rŒ   rk   rg   r   ©rF   Úpointr˜   r’   r“   r"   r"   r#   ÚsetÄ   s   


ÿzEccPoint.setc                 C   s2   t |tƒsdS | jjj}d|| j ¡ |j ¡ ƒkS ©NFr   )Ú
isinstancero   r€   r†   Úcmpr‰   rk   )rF   rš   Úcmp_funcr"   r"   r#   Ú__eq__Ò   s   

zEccPoint.__eq__c                 C   s
   | |k S rC   r"   )rF   rš   r"   r"   r#   Ú__ne__Ú   rI   zEccPoint.__ne__c                 C   s4   | j jj}|  ¡ }||j ¡ ƒ}|rtd| ƒ‚|S )Nz$Error %d while inverting an EC point)r€   r†   ÚnegÚcopyr‰   rk   rg   )rF   Úneg_funcÚnpr“   r"   r"   r#   Ú__neg__Ý   s   
zEccPoint.__neg__c                 C   s   | j \}}t||| jƒ}|S ©zReturn a copy of this point.)Úxyro   rt   )rF   r�   rŽ   r¥   r"   r"   r#   r£   å   s   
zEccPoint.copyc                 C   s   | j jr	| jdkS | jdkS )ú,``True`` if this is the *point-at-infinity*.r   )r   r   )r€   rq   r�   r¨   rJ   r"   r"   r#   Úis_point_at_infinityë   s   

zEccPoint.is_point_at_infinityc                 C   s$   | j jrtdd| jƒS tdd| jƒS )ú-Return the *point-at-infinity* for the curve.r   r   )r€   rq   ro   rt   rJ   r"   r"   r#   Úpoint_at_infinityó   s   zEccPoint.point_at_infinityc                 C   ó
   | j d S )Nr   ©r¨   rJ   r"   r"   r#   r�   û   ó   
z
EccPoint.xc                 C   r­   )Nr   r®   rJ   r"   r"   r#   rŽ   ÿ   r¯   z
EccPoint.yc                 C   sj   |   ¡ }t|ƒ}t|ƒ}| jjj}|t|ƒt|ƒt|ƒ| j ¡ ƒ}|r)t	d| ƒ‚t
t|ƒƒt
t|ƒƒfS )Nz#Error %d while encoding an EC point)r„   Ú	bytearrayr€   r†   Úget_xyr   r   r‰   rk   rg   r
   r   )rF   r�   r�   r‘   r±   r“   r"   r"   r#   r¨     s   
ýzEccPoint.xyc                 C   ó   |   ¡ d d S ©z"Size of each coordinate, in bytes.r   r   ©Úsize_in_bitsrJ   r"   r"   r#   r„     ó   zEccPoint.size_in_bytesc                 C   ó   | j jS ©z!Size of each coordinate, in bits.©r€   Úmodulus_bitsrJ   r"   r"   r#   rµ     ó   zEccPoint.size_in_bitsc                 C   s,   | j jj}|| j ¡ ƒ}|rtd| ƒ‚| S )zuDouble this point (in-place operation).

        Returns:
            This same object (to enable chaining).
        z#Error %d while doubling an EC point)r€   r†   Údoubler‰   rk   rg   )rF   Údouble_funcr“   r"   r"   r#   r¼     s
   
zEccPoint.doublec                 C   sD   | j jj}|| j ¡ |j ¡ ƒ}|r |dkrtdƒ‚td| ƒ‚| S )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‰   rk   rg   )rF   rš   Úadd_funcr“   r"   r"   r#   Ú__iadd__'  s   
zEccPoint.__iadd__c                 C   s   |   ¡ }||7 }|S )z8Return a new point, the addition of this one and another©r£   )rF   rš   r¥   r"   r"   r#   Ú__add__2  ó   zEccPoint.__add__c                 C   ó^   | j jj}|dk rtdƒ‚t|ƒ}|| j ¡ t|ƒtt	|ƒƒt
tdƒƒƒ}|r-td| ƒ‚| S ©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†   Úscalarrg   r   r‰   rk   r   r   r…   r	   r   ©rF   rÉ   Úscalar_funcÚsbr“   r"   r"   r#   Ú__imul__9  ó   



ýzEccPoint.__imul__c                 C   ó   |   ¡ }||9 }|S ©z2Return a new point, the scalar product of this onerÂ   ©rF   rÉ   r¥   r"   r"   r#   Ú__mul__H  rÄ   zEccPoint.__mul__c                 C   ó
   |   |¡S rC   ©rÒ   ©rF   Ú	left_handr"   r"   r#   Ú__rmul__O  rI   zEccPoint.__rmul__N)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#   ro   ƒ   s0    
)


ro   c                   @   st   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )rl   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           	      C   s&  zt | | _W n ty   tdt|ƒ ƒ‚w | jj| _| jjtj	tj
fvr*tdƒ‚| jjj}| jjj}tƒ | _z| jj ¡ }W n tyK   t}Y nw |  ¡ }|d u rWt}ntt||ƒƒ}t|ƒ|krhtdƒ‚tƒ | _|| j ¡ |t|ƒ|ƒ}|dkr€tdƒ‚|rˆtd| ƒ‚t| j ¡ |ƒ| _d S )Nrz   z5EccXPoint can only be created for Curve25519/Curve448r{   r|   r}   r~   )r   r€   r�   rg   r‚   rƒ   rt   rR   r   r    r!   r†   r‡   rˆ   r   r‰   rŠ   rk   r‹   r   r„   r   r   r…   rŒ   r   r   )	rF   r�   rt   r‡   r’   rŠ   r�   r�   r“   r"   r"   r#   r”   c  sB   ÿ


ÿ
ýzEccXPoint.__init__c                 C   r•   r–   r—   r™   r"   r"   r#   r›   ’  s   


ÿzEccXPoint.setc                 C   s>   t |tƒsdS | jjj}| j ¡ }|j ¡ }|||ƒ}d|kS rœ   )r�   rl   r€   r†   rž   r‰   rk   )rF   rš   rŸ   Úp1Úp2Úresr"   r"   r#   r    Ÿ  s   




zEccXPoint.__eq__c                 C   s2   z| j }W n ty   |  ¡  Y S w t|| jƒS r§   )r�   rg   r¬   rl   rt   )rF   r�   r"   r"   r#   r£   ©  s   
ÿzEccXPoint.copyc                 C   s"   z| j }W dS  ty   Y dS w )r©   TF)r�   rg   )rF   rw   r"   r"   r#   rª   ²  s   þÿzEccXPoint.is_point_at_infinityc                 C   s   t d| jƒS )r«   N)rl   rt   rJ   r"   r"   r#   r¬   »  s   zEccXPoint.point_at_infinityc                 C   s`   |   ¡ }t|ƒ}| jjj}|t|ƒt|ƒ| j ¡ ƒ}|dkr"t	dƒ‚|r*t	d| ƒ‚t
t|ƒƒS )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‰   rk   rg   r
   r   )rF   r�   r�   rÞ   r“   r"   r"   r#   r�   À  s   
þzEccXPoint.xc                 C   r²   r³   r´   rJ   r"   r"   r#   r„   Î  r¶   zEccXPoint.size_in_bytesc                 C   r·   r¸   r¹   rJ   r"   r"   r#   rµ   Ò  r»   zEccXPoint.size_in_bitsc                 C   rÅ   rÆ   rÈ   rÊ   r"   r"   r#   rÍ   Ö  rÎ   zEccXPoint.__imul__c                 C   rÏ   rÐ   rÂ   rÑ   r"   r"   r#   rÒ   å  rÄ   zEccXPoint.__mul__c                 C   rÓ   rC   rÔ   rÕ   r"   r"   r#   r×   ì  rI   zEccXPoint.__rmul__N)r   r   r   rØ   r”   r›   r    r£   rª   r¬   rÙ   r�   r„   rµ   rÍ   rÒ   r×   r"   r"   r"   r#   rl   S  s    /
		
rl   )rx   ÚCryptodome.Util.numberr   r   ÚCryptodome.Util._raw_apir   r   r   r   r   r	   ÚCryptodome.Math.Numbersr
   ÚCryptodome.Random.randomr   Úobjectr   r$   r   ro   rl   r"   r"   r"   r#   Ú<module>   s    f Q