U
    ÈZjG@  ã                   @   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"   úZ/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/PublicKey/_point.pyr      s   r   c                   @   sØ   e Zd Zi Ze ¡ ZddddddgZddd	d
ddgZddddddgZ	ddddddgZ
ddddddgZdd gZd!d"gZd#d$d%gZd&d'd(gZee e	 e
 e e e e e Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3S )4Ú_CurvesÚp192z
NIST P-192zP-192Z
prime192v1Z	secp192r1Znistp192Úp224z
NIST P-224zP-224Z
prime224v1Z	secp224r1Znistp224Úp256z
NIST P-256zP-256Z
prime256v1Z	secp256r1Znistp256Úp384z
NIST P-384zP-384Z
prime384v1Z	secp384r1Znistp384Úp521z
NIST P-521zP-521Z
prime521v1Z	secp521r1Znistp521Úed25519ZEd25519Úed448ZEd448Ú
curve25519Z
Curve25519ZX25519Úcurve448ZCurve448ZX448c                 C   s
   || j kS ©N©Ú	all_names)ÚselfÚitemr"   r"   r#   Ú__contains__1   s    z_Curves.__contains__c                 C   s   | j S r.   r/   ©r1   r"   r"   r#   Ú__dir__4   s    z_Curves.__dir__c                 C   sZ  || j kr@ddlm} | ¡ }tj|_| j t	 
| j |¡¡ �n|| jkr€ddlm} | ¡ }tj|_| j t	 
| j|¡¡ �nÐ|| jkrÀddlm} | ¡ }tj|_| j t	 
| j|¡¡ �n�|| jk�rddlm} | ¡ }tj|_| j t	 
| j|¡¡ �nN|| jk�rDddlm} | ¡ }tj|_| j t	 
| j|¡¡ �n|| jk�r„ddlm} | ¡ }	tj|	_| j t	 
| j|	¡¡ nÌ|| jk�rÄddlm} | ¡ }
tj|
_| j t	 
| j|
¡¡ nŒ|| jk�rddlm} |  ¡ }tj!|_| j t	 
| j|¡¡ nL|| j"k�rDddlm} | #¡ }tj$|_| j t	 
| j"|¡¡ nt%d| ƒ‚| j| S )Nr   )Ú	_nist_ecc)Ú_edwards)Ú_montgomeryzUnsupported curve '%s')&Ú
p192_namesÚ r6   Z
p192_curver   r   ÚidÚcurvesÚupdateÚdictÚfromkeysÚ
p224_namesZ
p224_curver   Ú
p256_namesZ
p256_curver   Ú
p384_namesZ
p384_curver   Ú
p521_namesZ
p521_curver   Úed25519_namesr7   Zed25519_curver   Úed448_namesZed448_curver   Úcurve25519_namesr8   Zcurve25519_curver    Úcurve448_namesZcurve448_curver!   Ú
ValueError)r1   Únamer6   r%   r&   r'   r(   r)   r7   r*   r+   r8   r,   r-   r"   r"   r#   Úload7   s^    


z_Curves.loadc              	   C   s¢   | j �’ | j |¡}|d kr”|  |¡}|| jks:|| jkrJt|j|ƒ|_nt	|j|j
|ƒ|_|jtjtjfk|_|jtjtjfk|_|jpŽ|j |_W 5 Q R X |S r.   )Úcurves_lockr<   ÚgetrJ   rF   rG   Ú	EccXPointZGxÚGÚEccPointZGyr;   r   r   r   Ú
is_edwardsr    r!   Zis_montgomeryZis_weierstrass)r1   rI   Úcurver"   r"   r#   Ú__getitem__i   s    
ÿÿz_Curves.__getitem__c                 C   s   | j D ]}| | }q| j ¡ S r.   )r0   r<   Úitems)r1   rI   Ú_r"   r"   r#   rS   y   s    

z_Curves.itemsN)r   r   r   r<   Ú	threadingÚRLockrK   r9   r@   rA   rB   rC   rD   rE   rF   rG   r0   r3   r5   rJ   rR   rS   r"   r"   r"   r#   r$      sF   
ÿ
ÿ
ÿ
ÿ
ÿ

ÿÿÿÿ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   s2  zt | | _W n$ tk
r2   tdt|ƒ ƒ‚Y nX | jj| _| jjtj	krTtdƒ‚|  
¡ }t||ƒ}t||ƒ}t|ƒ|ksˆt|ƒ|kr�tdƒ‚| jjj}| jjj}tƒ | _z| jj ¡ }	W n tk
rÔ   t}	Y nX || 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ÚKeyErrorrH   ÚstrÚ	canonicalrQ   r;   r   r    Úsize_in_bytesr   ÚlenÚrawlibÚ	new_pointÚ
free_pointr   Ú_pointÚcontextrL   ÚAttributeErrorr   Ú
address_ofr   r   r   )r1   ÚxÚyrQ   Úmodulus_bytesÚxbÚybrd   Ú	free_funcrg   Úresultr"   r"   r#   Ú__init__›   s<    






ü
zEccPoint.__init__c                 C   sX   | j jj}| j jj}tƒ | _|| j ¡ |j ¡ ƒ}|rBtd| ƒ‚t	| j ¡ |ƒ| _| S ©Nz"Error %d while cloning an EC point©
r]   rc   Úclonere   r   rf   ri   rL   rH   r   ©r1   Úpointrt   ro   rp   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]   rc   Úcmprf   rL   )r1   rv   Úcmp_funcr"   r"   r#   Ú__eq__Ò   s    

zEccPoint.__eq__c                 C   s
   | |k S r.   r"   )r1   rv   r"   r"   r#   Ú__ne__Ú   s    zEccPoint.__ne__c                 C   s4   | j jj}|  ¡ }||j ¡ ƒ}|r0td| ƒ‚|S )Nz$Error %d while inverting an EC point)r]   rc   ÚnegÚcopyrf   rL   rH   )r1   Zneg_funcÚnprp   r"   r"   r#   Ú__neg__Ý   s    
zEccPoint.__neg__c                 C   s   | j \}}t||| jƒ}|S ©zReturn a copy of this point.)ÚxyrO   rQ   )r1   rj   rk   r€   r"   r"   r#   r   å   s    
zEccPoint.copyc                 C   s    | j jr| jdkS | jdkS dS )ú,``True`` if this is the *point-at-infinity*.r   )r   r   N)r]   rP   rj   rƒ   r4   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 dS )ú-Return the *point-at-infinity* for the curve.r   r   N)r]   rP   rO   rQ   r4   r"   r"   r#   Úpoint_at_infinityó   s    zEccPoint.point_at_infinityc                 C   s
   | j d S )Nr   ©rƒ   r4   r"   r"   r#   rj   û   s    z
EccPoint.xc                 C   s
   | j d S )Nr   rˆ   r4   r"   r"   r#   rk   ÿ   s    z
EccPoint.yc                 C   sj   |   ¡ }t|ƒ}t|ƒ}| jjj}|t|ƒt|ƒt|ƒ| j ¡ ƒ}|rRt	d| ƒ‚t
t|ƒƒt
t|ƒƒfS )Nz#Error %d while encoding an EC point)ra   Ú	bytearrayr]   rc   Úget_xyr   r   rf   rL   rH   r
   r   )r1   rl   rm   rn   rŠ   rp   r"   r"   r#   rƒ     s    
ýzEccPoint.xyc                 C   s   |   ¡ d d S ©z"Size of each coordinate, in bytes.r   r   ©Úsize_in_bitsr4   r"   r"   r#   ra     s    zEccPoint.size_in_bytesc                 C   s   | j jS ©z!Size of each coordinate, in bits.©r]   Zmodulus_bitsr4   r"   r"   r#   r�     s    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]   rc   Údoublerf   rL   rH   )r1   Zdouble_funcrp   r"   r"   r#   r�     s
    
zEccPoint.doublec                 C   sD   | j jj}|| j ¡ |j ¡ ƒ}|r@|dkr4t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]   rc   Úaddrf   rL   rH   )r1   rv   Zadd_funcrp   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   )r1   rv   r€   r"   r"   r#   Ú__add__2  s    zEccPoint.__add__c                 C   s^   | j jj}|dk rtdƒ‚t|ƒ}|| j ¡ t|ƒtt	|ƒƒt
tdƒƒƒ}|rZt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]   rc   ÚscalarrH   r   rf   rL   r   r   rb   r	   r   ©r1   r™   Zscalar_funcÚsbrp   r"   r"   r#   Ú__imul__9  s    



ýzEccPoint.__imul__c                 C   s   |   ¡ }||9 }|S ©z2Return a new point, the scalar product of this oner”   ©r1   r™   r€   r"   r"   r#   Ú__mul__H  s    zEccPoint.__mul__c                 C   s
   |   |¡S r.   ©rŸ   ©r1   Z	left_handr"   r"   r#   Ú__rmul__O  s    zEccPoint.__rmul__N)r'   )r   r   r   Ú__doc__rq   rw   r|   r}   r�   r   r…   r‡   Úpropertyrj   rk   rƒ   ra   r�   r�   r“   r•   rœ   rŸ   r¢   r"   r"   r"   r#   rO   ƒ   s.   
)


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 )rM   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   s2  zt | | _W n$ tk
r2   tdt|ƒ ƒ‚Y nX | jj| _| jjtj	tj
fkrZtdƒ‚| jjj}| jjj}tƒ | _z| jj ¡ }W n tk
rž   t}Y nX |  ¡ }|d kr¶t}n"tt||ƒƒ}t|ƒ|krØtdƒ‚tƒ | _|| j ¡ |t|ƒ|ƒ}|dk�r
tdƒ‚|�rtd| ƒ‚t| j ¡ |ƒ| _d S )NrW   z5EccXPoint can only be created for Curve25519/Curve448rX   rY   rZ   r[   )r\   r]   r^   rH   r_   r`   rQ   r;   r   r    r!   rc   rd   re   r   rf   rg   rL   rh   r   ra   r   r   rb   ri   r   r   )	r1   rj   rQ   rd   ro   rg   rl   rm   rp   r"   r"   r#   rq   c  s>    




ý
zEccXPoint.__init__c                 C   sX   | j jj}| j jj}tƒ | _|| j ¡ |j ¡ ƒ}|rBtd| ƒ‚t	| j ¡ |ƒ| _| S rr   rs   ru   r"   r"   r#   rw   ’  s    


ÿzEccXPoint.setc                 C   s>   t |tƒsdS | jjj}| j ¡ }|j ¡ }|||ƒ}d|kS rx   )ry   rM   r]   rc   rz   rf   rL   )r1   rv   r{   Úp1Zp2Úresr"   r"   r#   r|   Ÿ  s    




zEccXPoint.__eq__c                 C   s4   z
| j }W n tk
r&   |  ¡  Y S X t|| jƒS r‚   )rj   rH   r‡   rM   rQ   )r1   rj   r"   r"   r#   r   ©  s
    
zEccXPoint.copyc                 C   s&   z
| j }W n tk
r    Y dS X dS )r„   TF)rj   rH   )r1   rT   r"   r"   r#   r…   ²  s
    
zEccXPoint.is_point_at_infinityc                 C   s   t d| jƒS )r†   N)rM   rQ   r4   r"   r"   r#   r‡   »  s    zEccXPoint.point_at_infinityc                 C   s`   |   ¡ }t|ƒ}| jjj}|t|ƒt|ƒ| j ¡ ƒ}|dkrDt	dƒ‚|rTt	d| ƒ‚t
t|ƒƒS )Né   z)No X coordinate for the point at infinityz'Error %d while getting X of an EC point)ra   r‰   r]   rc   Úget_xr   r   rf   rL   rH   r
   r   )r1   rl   rm   r¨   rp   r"   r"   r#   rj   À  s    
þzEccXPoint.xc                 C   s   |   ¡ d d S r‹   rŒ   r4   r"   r"   r#   ra   Î  s    zEccXPoint.size_in_bytesc                 C   s   | j jS rŽ   r�   r4   r"   r"   r#   r�   Ò  s    zEccXPoint.size_in_bitsc                 C   s^   | j jj}|dk rtdƒ‚t|ƒ}|| j ¡ t|ƒtt	|ƒƒt
tdƒƒƒ}|rZtd| ƒ‚| S r–   r˜   rš   r"   r"   r#   rœ   Ö  s    



ýzEccXPoint.__imul__c                 C   s   |   ¡ }||9 }|S r�   r”   rž   r"   r"   r#   rŸ   å  s    zEccXPoint.__mul__c                 C   s
   |   |¡S r.   r    r¡   r"   r"   r#   r¢   ì  s    zEccXPoint.__rmul__N)r   r   r   r£   rq   rw   r|   r   r…   r‡   r¤   rj   ra   r�   rœ   rŸ   r¢   r"   r"   r"   r#   rM   S  s   /
		
rM   )rU   ZCrypto.Util.numberr   r   ZCrypto.Util._raw_apir   r   r   r   r   r	   ZCrypto.Math.Numbersr
   ZCrypto.Random.randomr   Úobjectr   r$   r\   rO   rM   r"   r"   r"   r#   Ú<module>   s    f Q