§
    8·tcÿ£  ã                   ó  — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZmZmZmZ d dlmZ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%  edd¦  «        Z& edd¦  «        Z'i Z(g d¢a)d„ Z* e*¦   «          [*g d¢a+d„ Z, e,¦   «          [,g d¢a-d„ Z. e.¦   «          [. G d„ de/¦  «        Z0 G d„ de1¦  «        Z2 e2e(d         j3        e(d         j4        d¦  «        Z5e(d          6                    e5¬¦  «        Z7e( 8                    e9 :                    tR          e7¦  «        ¦  «         [5[7b) e2e(d         j3        e(d         j4        d¦  «        Z;e(d          6                    e;¬¦  «        Z<e( 8                    e9 :                    tV          e<¦  «        ¦  «         [;[<b+ e2e(d         j3        e(d         j4        d¦  «        Z=e(d          6                    e=¬¦  «        Z>e( 8                    e9 :                    tZ          e>¦  «        ¦  «         [=[>b- G d„ de1¦  «        Z?d „ Z@d!„ ZAd"„ ZBd#„ ZCd2d$„ZDd%„ ZEd&„ ZFd'„ ZGd(„ ZHd)„ ZId2d*„ZJeKd+k    r³d dlLZLd,ZMe(d         jN         O                    ¦   «         ZPd-ZQ eLjL        ¦   «         ZR eSeQ¦  «        D ]ZTePeMz  ZUŒ eVd. eLjL        ¦   «         eRz
  eQz  d/z  d0¦  «          eLjL        ¦   «         ZR eSeQ¦  «        D ]ZTeUeMz  ZUŒ eVd1 eLjL        ¦   «         eRz
  eQz  d/z  d0¦  «         dS dS )3é    )Úprint_functionN)Ú
namedtuple)ÚbordÚtobytesÚtostrÚbchrÚ	is_string)Úbytes_to_longÚlong_to_bytes)ÚInteger)ÚDerObjectIdÚDerOctetStringÚDerSequenceÚDerBitString)Ú_expand_subject_public_key_infoÚ_create_subject_public_key_infoÚ _extract_subject_public_key_info)Úload_pycryptodome_raw_libÚVoidPointerÚSmartPointerÚc_size_tÚc_uint8_ptrÚc_ulonglong)Úget_random_bytes)ÚgetrandbitszCryptodome.PublicKey._ec_wsav  
typedef void EcContext;
typedef void EcPoint;
int ec_ws_new_context(EcContext **pec_ctx,
                      const uint8_t *modulus,
                      const uint8_t *b,
                      const uint8_t *order,
                      size_t len,
                      uint64_t seed);
void ec_free_context(EcContext *ec_ctx);
int ec_ws_new_point(EcPoint **pecp,
                    const uint8_t *x,
                    const uint8_t *y,
                    size_t len,
                    const EcContext *ec_ctx);
void ec_free_point(EcPoint *ecp);
int ec_ws_get_xy(uint8_t *x,
                 uint8_t *y,
                 size_t len,
                 const EcPoint *ecp);
int ec_ws_double(EcPoint *p);
int ec_ws_add(EcPoint *ecpa, EcPoint *ecpb);
int ec_ws_scalar(EcPoint *ecp,
                 const uint8_t *k,
                 size_t len,
                 uint64_t seed);
int ec_ws_clone(EcPoint **pecp2, const EcPoint *ecp);
int ec_ws_copy(EcPoint *ecp1, const EcPoint *ecp2);
int ec_ws_cmp(const EcPoint *ecp1, const EcPoint *ecp2);
int ec_ws_neg(EcPoint *p);
int ec_ws_normalize(EcPoint *ecp);
int ec_ws_is_pai(EcPoint *ecp);
Ú_Curvez7p b order Gx Gy G modulus_bits oid context desc openssh)Úp256ú
NIST P-256zP-256Ú
prime256v1Ú	secp256r1Únistp256c                  óR  — d} d}d}d}d}t          | d¦  «        }t          |d¦  «        }t          |d¦  «        }t          ¦   «         }t                               |                     ¦   «         t          |¦  «        t          |¦  «        t          |¦  «        t          t          |¦  «        ¦  «        t          t          d¦  «        ¦  «        ¦  «        }	|	rt          d|	z  ¦  «        ‚t          |                     ¦   «         t          j        ¦  «        }
t          t          | ¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        d d	d
|
dd¦  «        }t                                t$                               t(          |¦  «        ¦  «         d S )Nl   ÿÿÿÿÿÿ?               @ÿÿ l   K`¤Oøpq^cv
3,ƒe<1ÚUê]>{|RŽ*ìÆZl   Q%Æx+ÎOhóbi+}s¼ÿÿÿÿ   @ÿÿ l   –B11e	%:f=K`¾wr�HŽ7g‹HK8ùhkl   õQ~o ²]ìl+fÚUg+<ð)Z?î8óO†?q!ãOé    é@   z#Error %d initializing P-256 contexté   z1.2.840.10045.3.1.7r   zecdsa-sha2-nistp256)r   r   Ú_ec_libÚec_ws_new_contextÚ
address_ofr   r   Úlenr   r   ÚImportErrorr   ÚgetÚec_free_contextr   r   Ú_curvesÚupdateÚdictÚfromkeysÚ
p256_names)ÚpÚbÚorderÚGxÚGyÚp256_modulusÚp256_bÚ
p256_orderÚec_p256_contextÚresultÚcontextr   s               ú:/usr/lib/python3/dist-packages/Cryptodome/PublicKey/ECC.pyÚ	init_p256r>   c   sk  € ØJ€AØJ€AØN€EØ	K€BØ	K€Bå   BÑ'Ô'€LÝ˜1˜bÑ!Ô!€FÝ˜u bÑ)Ô)€Jå!‘m”m€OÝ×&Ò& ×'AÒ'AÑ'CÔ'CÝ'2°<Ñ'@Ô'@Ý'2°6Ñ':Ô':Ý'2°:Ñ'>Ô'>Ý'/µ°LÑ0AÔ0AÑ'BÔ'BÝ'2µ;¸r±?´?Ñ'CÔ'Cñ)ô )€Fð ð JÝÐ?À&ÑHÑIÔIÐIå˜?×.Ò.Ñ0Ô0µ'Ô2IÑJÔJ€GÝ•'˜!‘*”*Ý˜!‘*”*Ý˜%‘.”.Ý˜"‘+”+Ý˜"‘+”+ØØØ'ØØØ'ñ
)ô 
)€Dõ ‡N‚N•4—=’=¥¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ð3ó    )Úp384ú
NIST P-384zP-384Ú
prime384v1Ú	secp384r1Únistp384c                  óR  — d} d}d}d}d}t          | d¦  «        }t          |d¦  «        }t          |d¦  «        }t          ¦   «         }t                               |                     ¦   «         t          |¦  «        t          |¦  «        t          |¦  «        t          t          |¦  «        ¦  «        t          t          d¦  «        ¦  «        ¦  «        }	|	rt          d|	z  ¦  «        ‚t          |                     ¦   «         t          j        ¦  «        }
t          t          | ¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        d d	d
|
dd¦  «        }t                                t$                               t(          |¦  «        ¦  «         d S )Nl   ÿÿ       Àÿÿ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl   ï*Ø'·#.TÒÚEbc+ÆZ'@=D 1 "( ?7N2Zà_+à“|¹ñS/1fl   s)Š«e`g®w’lX_[nÐlv|ÿÿÿÿÿÿÿÿÿÿÿÿÿl   ·
ìdáx¢RÃ¥joyU8T(	:Ÿssé"±nèZ‚L÷8kñ&Á"_ÊUl   _Ô!òuR×Ð/‡sX0
@qa×NˆQ�N�B&JÞôxS8KJüEéYë‹	K%Þl é0   r$   z#Error %d initializing P-384 contexti€  z1.3.132.0.34rA   zecdsa-sha2-nistp384)r   r   r&   r'   r(   r   r   r)   r   r   r*   r   r+   r,   r   r   r-   r.   r/   r0   Ú
p384_names)r2   r3   r4   r5   r6   Úp384_modulusÚp384_bÚ
p384_orderÚec_p384_contextr;   r<   r@   s               r=   Ú	init_p384rL   ‘   sk  € Øj€AØj€AØn€EØ	k€BØ	k€Bå   BÑ'Ô'€LÝ˜1˜bÑ!Ô!€FÝ˜u bÑ)Ô)€Jå!‘m”m€OÝ×&Ò& ×'AÒ'AÑ'CÔ'CÝ'2°<Ñ'@Ô'@Ý'2°6Ñ':Ô':Ý'2°:Ñ'>Ô'>Ý'/µ°LÑ0AÔ0AÑ'BÔ'BÝ'2µ;¸r±?´?Ñ'CÔ'Cñ)ô )€Fð ð JÝÐ?À&ÑHÑIÔIÐIå˜?×.Ò.Ñ0Ô0µ'Ô2IÑJÔJ€GÝ•'˜!‘*”*Ý˜!‘*”*Ý˜%‘.”.Ý˜"‘+”+Ý˜"‘+”+ØØØ ØØØ'ñ
)ô 
)€Dõ ‡N‚N•4—=’=¥¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ð3r?   )Úp521ú
NIST P-521zP-521Ú
prime521v1Ú	secp521r1Únistp521c                  óR  — d} d}d}d}d}t          | d¦  «        }t          |d¦  «        }t          |d¦  «        }t          ¦   «         }t                               |                     ¦   «         t          |¦  «        t          |¦  «        t          |¦  «        t          t          |¦  «        ¦  «        t          t          d¦  «        ¦  «        ¦  «        }	|	rt          d|	z  ¦  «        ‚t          |                     ¦   «         t          j        ¦  «        }
t          t          | ¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        d d	d
|
dd¦  «        }t                                t$                               t(          |¦  «        ¦  «         d S )Nl#   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl#    ? VQ(zO†%bï95~cîte1oR{¨VÂÄ;ŒLHw>ÅlÌ-rZE]´"Sr‡&Ga9}*Fl#   	dp"z\}[ëzˆ3"näZ;PKÜ#
`ü7ÍrËoÁC†Qôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl#   f=ËÇxóK¿)H-apY$3^Q‹	ná%kù{;/K!u{4-{Š?$íO‚�d8ÑV1¶lÇ3s:·l#   Pf¢?ÚQôE$XN¨!85aZþÈUÈ½WL9îYLù¹hûzÑf«$Du13otc!û%‘pMxjRr`éB   r$   z#Error %d initializing P-521 contexti	  z1.3.132.0.35rN   zecdsa-sha2-nistp521)r   r   r&   r'   r(   r   r   r)   r   r   r*   r   r+   r,   r   r   r-   r.   r/   r0   Ú
p521_names)r2   r3   r4   r5   r6   Úp521_modulusÚp521_bÚ
p521_orderÚec_p521_contextr;   r<   rM   s               r=   Ú	init_p521rY   ¿   sz  € ð 	S€Að 	S€Að W€Eð 
T€Bð 
T€Bå   BÑ'Ô'€LÝ˜1˜bÑ!Ô!€FÝ˜u bÑ)Ô)€Jå!‘m”m€OÝ×&Ò& ×'AÒ'AÑ'CÔ'CÝ'2°<Ñ'@Ô'@Ý'2°6Ñ':Ô':Ý'2°:Ñ'>Ô'>Ý'/µ°LÑ0AÔ0AÑ'BÔ'BÝ'2µ;¸r±?´?Ñ'CÔ'Cñ)ô )€Fð ð JÝÐ?À&ÑHÑIÔIÐIå˜?×.Ò.Ñ0Ô0µ'Ô2IÑJÔJ€GÝ•'˜!‘*”*Ý˜!‘*”*Ý˜%‘.”.Ý˜"‘+”+Ý˜"‘+”+ØØØ ØØØ'ñ
)ô 
)€Dõ ‡N‚N•4—=’=¥¨TÑ2Ô2Ñ3Ô3Ð3Ð3Ð3r?   c                   ó   — e Zd ZdS )ÚUnsupportedEccFeatureN)Ú__name__Ú
__module__Ú__qualname__© r?   r=   r[   r[   é   s   € € € € € Ø€Dr?   r[   c                   ó°   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
ed
„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚEccPointa=  A class to abstract a point over an Elliptic Curve.

    The class support special methods for:

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

    :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 X- and Y- coordinates
    r   c                 ó@  — 	 t           |         | _        n-# t          $ r  t          dt	          |¦  «        z  ¦  «        ‚w xY w|| _        |                      ¦   «         }| j        j        }t          ||¦  «        }t          ||¦  «        }t          |¦  «        |k    st          |¦  «        |k    rt          d¦  «        ‚t          ¦   «         | _        t                               | j                             ¦   «         t          |¦  «        t          |¦  «        t!          |¦  «        |                     ¦   «         ¦  «        }|r'|dk    rt          d¦  «        ‚t          d|z  ¦  «        ‚t%          | j                             ¦   «         t          j        ¦  «        | _        d S )NzUnknown curve name %szIncorrect coordinate lengthé   z)The EC point does not belong to the curvez(Error %d while instantiating an EC point)r-   Ú_curveÚKeyErrorÚ
ValueErrorÚstrÚ_curve_nameÚsize_in_bytesr<   r   r)   r   Ú_pointr&   Úec_ws_new_pointr(   r   r   r+   r   Úec_free_point)	ÚselfÚxÚyÚcurveÚmodulus_bytesr<   ÚxbÚybr;   s	            r=   Ú__init__zEccPoint.__init__  sy  € ð	CÝ! %œ.ˆDŒKˆKøÝð 	Cð 	Cð 	CÝÐ4µs¸5±z´zÑAÑBÔBÐBð	Cøøøà ˆÔà×*Ò*Ñ,Ô,ˆØ”+Ô%ˆå˜1˜mÑ,Ô,ˆÝ˜1˜mÑ,Ô,ˆÝˆr‰7Œ7�mÒ#Ð#¥s¨2¡w¤w°-Ò'?Ð'?ÝÐ:Ñ;Ô;Ð;å!‘m”mˆŒÝ×(Ò(¨¬×)?Ò)?Ñ)AÔ)AÝ)4°R©¬Ý)4°R©¬Ý)1°-Ñ)@Ô)@Ø)0¯ª©¬ñ	8ô 8ˆð
 ð 	RØ˜Š|ˆ|Ý Ð!LÑMÔMÐMÝÐGÈ&ÑPÑQÔQÐQõ # 4¤;§?¢?Ñ#4Ô#4Ý#*Ô#8ñ:ô :ˆŒˆˆs   ‚ •*?c                 óR  — t          ¦   «         | _        t                               | j                             ¦   «         |j                             ¦   «         ¦  «        }|rt          d|z  ¦  «        ‚t          | j                             ¦   «         t          j        ¦  «        | _        | S )Nz"Error %d while cloning an EC point)	r   rj   r&   Úec_ws_cloner(   r+   rf   r   rl   ©rm   Úpointr;   s      r=   ÚsetzEccPoint.set"  sŠ   € Ý!‘m”mˆŒÝ×$Ò$ T¤[×%;Ò%;Ñ%=Ô%=Ø%*¤\×%5Ò%5Ñ%7Ô%7ñ9ô 9ˆàð 	LÝÐAÀFÑJÑKÔKÐKå" 4¤;§?¢?Ñ#4Ô#4Ý#*Ô#8ñ:ô :ˆŒàˆr?   c                 óœ   — dt                                | j                             ¦   «         |j                             ¦   «         ¦  «        k    S ©Nr   )r&   Ú	ec_ws_cmprj   r+   )rm   rx   s     r=   Ú__eq__zEccPoint.__eq__-  s7   € Ø•G×%Ò% d¤k§o¢oÑ&7Ô&7¸¼×9IÒ9IÑ9KÔ9KÑLÔLÒLÐLr?   c                 ó¸   — |                       ¦   «         }t                               |j                             ¦   «         ¦  «        }|rt          d|z  ¦  «        ‚|S )Nz$Error %d while inverting an EC point)Úcopyr&   Ú	ec_ws_negrj   r+   rf   )rm   Únpr;   s      r=   Ú__neg__zEccPoint.__neg__0  sN   € Ø�YŠY‰[Œ[ˆÝ×"Ò" 2¤9§=¢=¡?¤?Ñ3Ô3ˆØð 	NÝÐCÀfÑLÑMÔMÐMØˆ	r?   c                 óF   — | j         \  }}t          ||| j        ¦  «        }|S )zReturn a copy of this point.)Úxyra   rh   )rm   rn   ro   r�   s       r=   r   zEccPoint.copy7  s&   € àŒw‰ˆˆ1Ý�a˜˜DÔ,Ñ-Ô-ˆØˆ	r?   c                 ó   — | j         dk    S )z*``True`` if this is the point-at-infinity.)r   r   ©r„   ©rm   s    r=   Úis_point_at_infinityzEccPoint.is_point_at_infinity=  s   € àŒw˜&Ò Ð r?   c                 ó.   — t          dd| j        ¦  «        S )z<Return the point-at-infinity for the curve this point is on.r   )ra   rh   r‡   s    r=   Úpoint_at_infinityzEccPoint.point_at_infinityA  s   € å˜˜1˜dÔ.Ñ/Ô/Ð/r?   c                 ó   — | j         d         S r{   r†   r‡   s    r=   rn   z
EccPoint.xE  ó   € àŒw�qŒzÐr?   c                 ó   — | j         d         S )Né   r†   r‡   s    r=   ro   z
EccPoint.yI  rŒ   r?   c                 ó´  — |                       ¦   «         }t          |¦  «        }t          |¦  «        }t                               t	          |¦  «        t	          |¦  «        t          |¦  «        | j                             ¦   «         ¦  «        }|rt          d|z  ¦  «        ‚t          t          |¦  «        ¦  «        t          t          |¦  «        ¦  «        fS )Nz#Error %d while encoding an EC point)ri   Ú	bytearrayr&   Úec_ws_get_xyr   r   rj   r+   rf   r   r
   )rm   rq   rr   rs   r;   s        r=   r„   zEccPoint.xyM  s·   € à×*Ò*Ñ,Ô,ˆÝ�}Ñ%Ô%ˆÝ�}Ñ%Ô%ˆÝ×%Ò%¥k°"¡o¤oÝ&1°"¡o¤oÝ&.¨}Ñ&=Ô&=Ø&*¤k§o¢oÑ&7Ô&7ñ9ô 9ˆð ð 	MÝÐBÀVÑKÑLÔLÐLå� bÑ)Ô)Ñ*Ô*­GµMÀ"Ñ4EÔ4EÑ,FÔ,FÐGÐGr?   c                 ó6   — |                       ¦   «         dz   dz  S )z"Size of each coordinate, in bytes.é   é   )Úsize_in_bitsr‡   s    r=   ri   zEccPoint.size_in_bytes[  s   € à×!Ò!Ñ#Ô# aÑ'¨AÑ-Ð-r?   c                 ó   — | j         j        S )z!Size of each coordinate, in bits.)rd   Úmodulus_bitsr‡   s    r=   r•   zEccPoint.size_in_bits_  s   € àŒ{Ô'Ð'r?   c                 ó�   — t                                | j                             ¦   «         ¦  «        }|rt	          d|z  ¦  «        ‚| S )zˆDouble this point (in-place operation).

        :Return:
            :class:`EccPoint` : this same object (to enable chaining)
        z#Error %d while doubling an EC point)r&   Úec_ws_doublerj   r+   rf   )rm   r;   s     r=   ÚdoublezEccPoint.doublec  sE   € õ ×%Ò% d¤k§o¢oÑ&7Ô&7Ñ8Ô8ˆØð 	MÝÐBÀVÑKÑLÔLÐLØˆr?   c                 óê   — t                                | j                             ¦   «         |j                             ¦   «         ¦  «        }|r'|dk    rt	          d¦  «        ‚t	          d|z  ¦  «        ‚| 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&   Ú	ec_ws_addrj   r+   rf   rw   s      r=   Ú__iadd__zEccPoint.__iadd__o  sm   € õ ×"Ò" 4¤;§?¢?Ñ#4Ô#4°e´l×6FÒ6FÑ6HÔ6HÑIÔIˆØð 	MØ˜Š|ˆ|Ý Ð!FÑGÔGÐGÝÐBÀVÑKÑLÔLÐLØˆr?   c                 ó8   — |                       ¦   «         }||z  }|S )z8Return a new point, the addition of this one and another©r   )rm   rx   r�   s      r=   Ú__add__zEccPoint.__add__y  s   € ð �YŠY‰[Œ[ˆØ
ˆe‰ˆØˆ	r?   c           
      ó`  — |dk     rt          d¦  «        ‚t          |¦  «        }t                               | j                             ¦   «         t          |¦  «        t          t          |¦  «        ¦  «        t          t          d¦  «        ¦  «        ¦  «        }|rt          d|z  ¦  «        ‚| S )zMultiply this point by a scalarr   z?Scalar multiplication is only defined for non-negative integersr$   z%Error %d during scalar multiplication)rf   r   r&   Úec_ws_scalarrj   r+   r   r   r)   r   r   )rm   ÚscalarÚsbr;   s       r=   Ú__imul__zEccPoint.__imul__€  s�   € ð �AŠ:ˆ:ÝÐ^Ñ_Ô_Ð_Ý˜6Ñ"Ô"ˆÝ×%Ò% d¤k§o¢oÑ&7Ô&7Ý&1°"¡o¤oÝ&.­s°2©w¬wÑ&7Ô&7Ý&1µ+¸b±/´/Ñ&BÔ&BñDô Dˆð ð 	OÝÐDÀvÑMÑNÔNÐNØˆr?   c                 ó8   — |                       ¦   «         }||z  }|S )z2Return a new point, the scalar product of this oner    )rm   r¤   r�   s      r=   Ú__mul__zEccPoint.__mul__Ž  s   € ð �YŠY‰[Œ[ˆØ
ˆf‰ˆØˆ	r?   c                 ó,   — |                       |¦  «        S ©N)r¨   )rm   Ú	left_hands     r=   Ú__rmul__zEccPoint.__rmul__•  s   € Ø�|Š|˜IÑ&Ô&Ð&r?   N)r   )r\   r]   r^   Ú__doc__rt   ry   r}   r‚   r   rˆ   rŠ   Úpropertyrn   ro   r„   ri   r•   rš   rž   r¡   r¦   r¨   r¬   r_   r?   r=   ra   ra   í   s\  € € € € € ðð ð(:ð :ð :ð :ð@	ð 	ð 	ðMð Mð Mðð ð ðð ð ð!ð !ð !ð0ð 0ð 0ð ðð ñ „Xðð ðð ñ „Xðð ðHð Hñ „XðHð.ð .ð .ð(ð (ð (ð
ð 
ð 
ðð ð ðð ð ðð ð ðð ð ð'ð 'ð 'ð 'ð 'r?   ra   r   )ÚGr@   rM   c                   ó    — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	e
d„ ¦   «         Ze
d	„ ¦   «         Zd
„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚEccKeya°  Class defining an ECC key.
    Do not instantiate directly.
    Use :func:`generate`, :func:`construct` or :func:`import_key` instead.

    :ivar curve: The name of the ECC as defined in :numref:`curve_names`.
    :vartype curve: string

    :ivar pointQ: an ECC point representating the public component
    :vartype pointQ: :class:`EccPoint`

    :ivar d: A scalar representating the private component
    :vartype d: integer
    c                 ó>  — t          |¦  «        }|                     dd¦  «        }|                     dd¦  «        | _        |                     dd¦  «        | _        |rt	          dt          |¦  «        z   ¦  «        ‚|t          vrt          d|¦  «        ‚t          |         | _        | j        €| j        €t          d¦  «        ‚nFt          | j        ¦  «        | _        d| j        cxk    r| j        j
        k     sn t          d	¦  «        ‚| j        j        | _        dS )
a¤  Create a new ECC key

        Keywords:
          curve : string
            It must be *"p256"*, *"P-256"*, *"prime256v1"* or *"secp256r1"*.
          d : integer
            Only for a private key. It must be in the range ``[1..order-1]``.
          point : EccPoint
            Mandatory for a public key. If provided for a private key,
            the implementation will NOT check whether it matches ``d``.
        rp   NÚdrx   úUnknown parameters: zUnsupported curve (%s)zBEither private or public ECC component must be specified, not bothrŽ   zInvalid ECC private component)r/   ÚpopÚ_drj   Ú	TypeErrorrg   r-   rf   rd   r   r4   Údescrp   )rm   ÚkwargsÚkwargs_Ú
curve_names       r=   rt   zEccKey.__init__¹  s  € õ �v‘,”,ˆØ—[’[ ¨$Ñ/Ô/ˆ
Ø—+’+˜c 4Ñ(Ô(ˆŒØ—k’k '¨4Ñ0Ô0ˆŒØð 	CÝÐ2µS¸±\´\ÑAÑBÔBÐBà�WÐ$Ð$ÝÐ5°zÑBÔBÐBÝ˜jÔ)ˆŒàŒ7ˆ?ØŒ{Ð"Ý Ð!eÑfÔfÐfð #õ ˜dœgÑ&Ô&ˆDŒGØ˜œÐ3Ð3Ò3Ð3 $¤+Ô"3Ò3Ð3Ð3Ð3Ý Ð!@ÑAÔAÐAà”[Ô%ˆŒ
ˆ
ˆ
r?   c                 óz   — |                      ¦   «         |                       ¦   «         k    rdS |j        | j        k    S )NF)Úhas_privateÚpointQ)rm   Úothers     r=   r}   zEccKey.__eq__Û  s9   € Ø×ÒÑÔ $×"2Ò"2Ñ"4Ô"4Ò4Ð4Ø�5àŒ|˜tœ{Ò*Ð*r?   c                 ó¢   — |                       ¦   «         rdt          | j        ¦  «        z  }nd}| j        j        \  }}d| j        j        |||fz  S )Nz, d=%dÚ z,EccKey(curve='%s', point_x=%d, point_y=%d%s))r½   Úintr¶   r¾   r„   rd   r¸   )rm   Úextrarn   ro   s       r=   Ú__repr__zEccKey.__repr__á  sX   € Ø×ÒÑÔð 	Ø�s 4¤7™|œ|Ñ+ˆEˆEàˆEØŒ{Œ~‰ˆˆ1Ø=ÀÄÔAQÐSTÐVWÐY^Ð@_Ñ_Ð_r?   c                 ó   — | j         duS )zJ``True`` if this key can be used for making signatures or decrypting data.N)r¶   r‡   s    r=   r½   zEccKey.has_privateé  s   € ð Œw˜dÐ"Ð"r?   c                 ó  — d|cxk     r| j         j        k     sn J ‚| j         j        }t          j        d|¬¦  «        }| j        |z  }||z                       |¦  «        }| j         j        |z  j        |z  }|||z  ||z  z   z  |z  }||fS )Nr   rŽ   )Úmin_inclusiveÚmax_exclusive)rd   r4   r   Úrandom_ranger¶   Úinverser¯   rn   )	rm   ÚzÚkr4   ÚblindÚblind_dÚinv_blind_kÚrÚss	            r=   Ú_signzEccKey._signî  s±   € Ø�1Ð(Ð(Ò(Ð(�t”{Ô(Ò(Ð(Ð(Ð(Ð(Ð(à”Ô!ˆÝÔ$°1Ø38ð:ñ :ô :ˆð ”'˜E‘/ˆØ˜q‘y×)Ò)¨%Ñ0Ô0ˆàŒ[Œ]˜QÑÔ! EÑ)ˆØ˜5 1™9 w°¡{Ñ2Ñ3°eÑ;ˆØ�1ˆvˆr?   c                 óÎ   — | j         j        }|d                              |¦  «        }| j         j        ||z  |z  z  }| j        ||d         z  |z  z  }||z   j        |d         k    S )NrŽ   r   )rd   r4   rÊ   r¯   r¾   rn   )rm   rË   Úrsr4   ÚsinvÚpoint1Úpoint2s          r=   Ú_verifyzEccKey._verifyü  sg   € Ø”Ô!ˆØ�!Œu�}Š}˜UÑ#Ô#ˆØ”” 4¨!¡8¨uÑ"4Ñ5ˆØ” ¨¨1¬¡°Ñ 6Ñ7ˆØ˜‘Ô" b¨¤eÒ+Ð+r?   c                 óV   — |                       ¦   «         st          d¦  «        ‚| j        S )NzThis is not a private ECC key)r½   rf   r¶   r‡   s    r=   r³   zEccKey.d  s,   € à×ÒÑ!Ô!ð 	>ÝÐ<Ñ=Ô=Ð=ØŒwˆr?   c                 óP   — | j         €| j        j        | j        z  | _         | j         S rª   )rj   rd   r¯   r¶   r‡   s    r=   r¾   zEccKey.pointQ	  s$   € àŒ;ÐØœ+œ-¨$¬'Ñ1ˆDŒKØŒ{Ðr?   c                 óB   — t          | j        j        | j        ¬¦  «        S )z^A matching ECC public key.

        Returns:
            a new :class:`EccKey` object
        )rp   rx   )r±   rd   r¸   r¾   r‡   s    r=   Ú
public_keyzEccKey.public_key  s   € õ ˜DœKÔ,°D´KÐ@Ñ@Ô@Ð@r?   c                 ó²  — | j                              ¦   «         }|rQd| j         j                             ¦   «         z   }t	          |¦  «        | j         j                             |¦  «        z   }nBd| j         j                             |¦  «        z   | j         j                             |¦  «        z   }d}t          ||t          | j	        j
        ¦  «        ¦  «        S )Né   ó   ú1.2.840.10045.2.1)r¾   ri   ro   Úis_oddr   rn   Úto_bytesr   r   rd   Úoid)rm   Úcompressrq   Ú
first_byterÜ   Úunrestricted_oids         r=   Ú_export_subjectPublicKeyInfoz#EccKey._export_subjectPublicKeyInfo  sÓ   € ð œ×1Ò1Ñ3Ô3ˆàð 	AØ˜Tœ[œ]×1Ò1Ñ3Ô3Ñ3ˆJÝ˜zÑ*Ô*Øœ+œ-×0Ò0°Ñ?Ô?ñ@ˆJˆJð "Øœ+œ-×0Ò0°Ñ?Ô?ñ@àœ+œ-×0Ò0°Ñ?Ô?ñ@ˆJð /ÐÝ.Ð/?Ø/9Ý/:¸4¼;¼?Ñ/KÔ/KñMô Mð 	Mr?   Tc                 óÖ  — |                       ¦   «         sJ ‚| j                             ¦   «         }d| j        j                             |¦  «        z   | j        j                             |¦  «        z   }dt          | j                             |¦  «        ¦  «        t          | j	        j
        d¬¦  «        t          |d¬¦  «        g}|s|d= t          |¦  «                             ¦   «         S )Nrß   rŽ   r   ©ÚexplicitrÞ   )r½   r¾   ri   rn   râ   ro   r   r³   r   rd   rã   r   r   Úencode)rm   Úinclude_ec_paramsrq   rÜ   Úseqs        r=   Ú_export_private_derzEccKey._export_private_der2  sÜ   € à×ÒÑ!Ô!Ð!Ð!Ð!ð œ×1Ò1Ñ3Ô3ˆØØ”k”m×,Ò,¨]Ñ;Ô;ñ<à”k”m×,Ò,¨]Ñ;Ô;ñ<ˆ
ð Ý˜dœfŸošo¨mÑ<Ô<Ñ=Ô=Ý˜4œ;œ?°QÐ7Ñ7Ô7Ý˜J°Ð3Ñ3Ô3ð5ˆð
 !ð 	Ø�A�å˜3ÑÔ×&Ò&Ñ(Ô(Ð(r?   c                 óä   — ddl m} |                     dd ¦  «        �d|vrt          d¦  «        ‚d}|                      d¬¦  «        } |j        ||fd	t          | j        j        ¦  «        i|¤Ž}|S )
Nr   ©ÚPKCS8Ú
passphraseÚ
protectionú5At least the 'protection' parameter should be presentrà   F)rì   Ú
key_params)	ÚCryptodome.IOrñ   r+   rf   rî   Úwrapr   rd   rã   )rm   r¹   rñ   ræ   Úprivate_keyr;   s         r=   Ú_export_pkcs8zEccKey._export_pkcs8M  sŸ   € Ø'Ð'Ð'Ð'Ð'Ð'à�:Š:�l DÑ)Ô)Ð5¸,ÈfÐ:TÐ:TÝÐTÑUÔUÐUà.ÐØ×.Ò.ÀÐ.ÑGÔGˆØ�”˜KØ,ð&ð &å'2°4´;´?Ñ'CÔ'Cð&ð %ð&ð &ˆð ˆr?   c                 ód   — ddl m} |                      |¦  «        }|                     |d¦  «        S )Nr   ©ÚPEMz
PUBLIC KEY)rö   rü   rç   rë   )rm   rä   rü   Úencoded_ders       r=   Ú_export_public_pemzEccKey._export_public_pem[  s;   € Ø%Ð%Ð%Ð%Ð%Ð%à×7Ò7¸ÑAÔAˆØ�zŠz˜+ |Ñ4Ô4Ð4r?   c                 óV   — ddl m} |                      ¦   «         } |j        |d|fi |¤ŽS )Nr   rû   zEC PRIVATE KEY)rö   rü   rî   rë   ©rm   rò   r¹   rü   rý   s        r=   Ú_export_private_pemzEccKey._export_private_pema  sD   € Ø%Ð%Ð%Ð%Ð%Ð%à×.Ò.Ñ0Ô0ˆØˆsŒz˜+Ð'7¸ÐNÐNÀvÐNÐNÐNr?   c                 ób   — ddl m} |                      ¦   «         }|                     |d¦  «        S )Nr   rû   zPRIVATE KEY)rö   rü   rù   rë   )rm   rü   rý   s      r=   Ú(_export_private_clear_pkcs8_in_clear_pemz/EccKey._export_private_clear_pkcs8_in_clear_pemg  s9   € Ø%Ð%Ð%Ð%Ð%Ð%à×(Ò(Ñ*Ô*ˆØ�zŠz˜+ }Ñ5Ô5Ð5r?   c                 ó†   — ddl m} |sJ ‚d|vrt          d¦  «        ‚ | j        dd|i|¤Ž}|                     |d¦  «        S )Nr   rû   ró   rô   rò   zENCRYPTED PRIVATE KEYr_   )rö   rü   rf   rù   rë   r   s        r=   Ú,_export_private_encrypted_pkcs8_in_clear_pemz3EccKey._export_private_encrypted_pkcs8_in_clear_pemm  sl   € Ø%Ð%Ð%Ð%Ð%Ð%àÐÐÐØ˜vÐ%Ð%ÝÐTÑUÔUÐUØ(�dÔ(ÐIÐI°JÐIÀ&ÐIÐIˆØ�zŠz˜+Ð'>Ñ?Ô?Ð?r?   c                 ó¼  — |                       ¦   «         rt          d¦  «        ‚| j        j        }| j                             ¦   «         }|rQd| j        j                             ¦   «         z   }t          |¦  «        | j        j	         
                    |¦  «        z   }nBd| j        j	         
                    |¦  «        z   | j        j         
                    |¦  «        z   }|                     d¦  «        d         }t          |¦  «        t          |¦  «        |f}d                     d„ |D ¦   «         ¦  «        }|dz   t          t          j        |¦  «        ¦  «        z   S )Nz"Cannot export OpenSSH private keysrÞ   rß   ú-r?   c                 óX   — g | ]'}t          j        d t          |¦  «        ¦  «        |z   ‘Œ(S )ú>I)ÚstructÚpackr)   )Ú.0rn   s     r=   ú
<listcomp>z*EccKey._export_openssh.<locals>.<listcomp>ˆ  s/   € ÐFÐFÐF¸1�œ T­3¨q©6¬6Ñ2Ô2°QÑ6ÐFÐFÐFr?   ú )r½   rf   rd   Úopensshr¾   ri   ro   rá   r   rn   râ   Úsplitr   Újoinr   ÚbinasciiÚ
b2a_base64)	rm   rä   r¸   rq   rå   rÜ   ÚmiddleÚcompsÚblobs	            r=   Ú_export_opensshzEccKey._export_opensshv  s=  € Ø×ÒÑÔð 	CÝÐAÑBÔBÐBàŒ{Ô"ˆØœ×1Ò1Ñ3Ô3ˆàð 	AØ˜Tœ[œ]×1Ò1Ñ3Ô3Ñ3ˆJÝ˜zÑ*Ô*Øœ+œ-×0Ò0°Ñ?Ô?ñ@ˆJˆJð "Øœ+œ-×0Ò0°Ñ?Ô?ñ@àœ+œ-×0Ò0°Ñ?Ô?ñ@ˆJð —’˜C‘” Ô#ˆÝ˜‘”¥¨¡¤°Ð<ˆØ�xŠxÐFÐFÀÐFÑFÔFÑGÔGˆØ�c‰z�E¥(Ô"5°dÑ";Ô";Ñ<Ô<Ñ<Ð<r?   c                 óV  — |                      ¦   «         }|                     d¦  «        }|dvrt          d|z  ¦  «        ‚|                     dd¦  «        }|                      ¦   «         râ|                     dd¦  «        }t	          |¦  «        r t          |¦  «        }|st          d¦  «        ‚|                     d	d
¦  «        }|dk    r4|r$|r | j        |fi |¤ŽS |                      ¦   «         S  | j        |fi |¤ŽS |dk    r8|r|st          d¦  «        ‚|r | j	        dd|i|¤ŽS |  
                    ¦   «         S t          d¦  «        ‚|rt          d|z  ¦  «        ‚|dk    r|                      |¦  «        S |dk    r|                      |¦  «        S |                      |¦  «        S )aë	  Export this ECC key.

        Args:
          format (string):
            The format to use for encoding the key:

            - ``'DER'``. The key will be encoded in ASN.1 DER format (binary).
              For a public key, the ASN.1 ``subjectPublicKeyInfo`` structure
              defined in `RFC5480`_ will be used.
              For a private key, the ASN.1 ``ECPrivateKey`` structure defined
              in `RFC5915`_ is used instead (possibly within a PKCS#8 envelope,
              see the ``use_pkcs8`` flag below).
            - ``'PEM'``. The key will be encoded in a PEM_ envelope (ASCII).
            - ``'OpenSSH'``. The key will be encoded in the OpenSSH_ format
              (ASCII, public keys only).

          passphrase (byte string or string):
            The passphrase to use for protecting the private key.

          use_pkcs8 (boolean):
            Only relevant for private keys.

            If ``True`` (default and recommended), the `PKCS#8`_ representation
            will be used.

            If ``False``, the much weaker `PEM encryption`_ mechanism will be used.

          protection (string):
            When a private key is exported with password-protection
            and PKCS#8 (both ``DER`` and ``PEM`` formats), this parameter MUST be
            present and be a valid algorithm supported by :mod:`Cryptodome.IO.PKCS8`.
            It is recommended to use ``PBKDF2WithHMAC-SHA1AndAES128-CBC``.

          compress (boolean):
            If ``True``, a more compact representation of the public key
            with the X-coordinate only is used.

            If ``False`` (default), the full public key will be exported.

        .. warning::
            If you don't provide a passphrase, the private key will be
            exported in the clear!

        .. note::
            When exporting a private key with password-protection and `PKCS#8`_
            (both ``DER`` and ``PEM`` formats), any extra parameters
            to ``export_key()`` will be passed to :mod:`Cryptodome.IO.PKCS8`.

        .. _PEM:        http://www.ietf.org/rfc/rfc1421.txt
        .. _`PEM encryption`: http://www.ietf.org/rfc/rfc1423.txt
        .. _`PKCS#8`:   http://www.ietf.org/rfc/rfc5208.txt
        .. _OpenSSH:    http://www.openssh.com/txt/rfc5656.txt
        .. _RFC5480:    https://tools.ietf.org/html/rfc5480
        .. _RFC5915:    http://www.ietf.org/rfc/rfc5915.txt

        Returns:
            A multi-line string (for PEM and OpenSSH) or bytes (for DER) with the encoded key.
        Úformat)rü   ÚDERÚOpenSSHzUnknown format '%s'rä   Frò   NzEmpty passphraseÚ	use_pkcs8Trü   r  z8Private keys can only be encrpyted with DER using PKCS#8z1Private keys cannot be exported in OpenSSH formatzUnexpected parameters: '%s'r_   )r   rµ   rf   r½   r	   r   r  r  r  rù   rî   rþ   rç   r  )rm   r¹   ÚargsÚ
ext_formaträ   rò   r  s          r=   Ú
export_keyzEccKey.export_key‹  s  € ðx �{Š{‰}Œ}ˆØ—X’X˜hÑ'Ô'ˆ
ØÐ6Ð6Ð6ÝÐ2°ZÑ?Ñ@Ô@Ð@à—8’8˜J¨Ñ.Ô.ˆà×ÒÑÔð !	6ØŸš ,°Ñ5Ô5ˆJÝ˜Ñ$Ô$ð 9Ý$ ZÑ0Ô0�
Ø!ð 9Ý$Ð%7Ñ8Ô8Ð8ØŸš ¨dÑ3Ô3ˆIØ˜UÒ"Ð"Øð HØ!ð OØP˜tÔPÐQ[ÐdÐdÐ_cÐdÐdÐdà#×LÒLÑNÔNÐNà3˜4Ô3°JÐGÐGÀ$ÐGÐGÐGØ˜uÒ$Ð$àð a ið aÝ$Ð%_Ñ`Ô`Ð`Øð 6Ø-˜4Ô-ÐLÐL¸ÐLÀtÐLÐLÐLà×3Ò3Ñ5Ô5Ð5å Ð!TÑUÔUÐUàð GÝ Ð!>ÀÑ!EÑFÔFÐFØ˜UÒ"Ð"Ø×.Ò.¨xÑ8Ô8Ð8Ø˜uÒ$Ð$Ø×8Ò8¸ÑBÔBÐBà×+Ò+¨HÑ5Ô5Ð5r?   N)T)r\   r]   r^   r­   rt   r}   rÄ   r½   rÒ   rØ   r®   r³   r¾   rÜ   rç   rî   rù   rþ   r  r  r  r  r  r_   r?   r=   r±   r±   ª  s^  € € € € € ðð ð &ð  &ð  &ðD+ð +ð +ð`ð `ð `ð#ð #ð #ð
ð ð ð,ð ,ð ,ð ðð ñ „Xðð
 ðð ñ „Xðð
Að Að AðMð Mð Mð4)ð )ð )ð )ð6ð ð ð5ð 5ð 5ðOð Oð Oð6ð 6ð 6ð@ð @ð @ð=ð =ð =ð*d6ð d6ð d6ð d6ð d6r?   r±   c                  ó  — |                       d¦  «        }t          |         }|                       dt          ¦  «        }| rt          dt	          | ¦  «        z   ¦  «        ‚t          j        d|j        |¬¦  «        }t          ||¬¦  «        S )a:  Generate a new private key on the given curve.

    Args:

      curve (string):
        Mandatory. It must be a curve name defined in :numref:`curve_names`.

      randfunc (callable):
        Optional. The RNG to read randomness from.
        If ``None``, :func:`Cryptodome.Random.get_random_bytes` is used.
    rp   Úrandfuncr´   rŽ   )rÇ   rÈ   r!  )rp   r³   )	rµ   r-   r   r·   rg   r   rÉ   r4   r±   )r¹   r»   rp   r!  r³   s        r=   Úgenerater"  ò  s‹   € ð —’˜GÑ$Ô$€JÝ�JÔ€EØ�zŠz˜*Õ&6Ñ7Ô7€HØð >ÝÐ.µ°V±´Ñ<Ñ=Ô=Ð=åÔ¨1Ø+0¬;Ø&.ð	0ñ 	0ô 	0€Aõ ˜
 aÐ(Ñ(Ô(Ð(r?   c                  óz  — | d         }t           |         }|                      dd¦  «        }|                      dd¦  «        }d| v rt          d¦  «        ‚d||fvrt          |||¦  «        | d<   |                      dd¦  «        }|�*d| v r&|j        |z  }|j        ||fk    rt          d¦  «        ‚t          d	i | ¤ŽS )
a(  Build a new ECC key (private or public) starting
    from some base components.

    Args:

      curve (string):
        Mandatory. It must be a curve name defined in :numref:`curve_names`.

      d (integer):
        Only for a private key. It must be in the range ``[1..order-1]``.

      point_x (integer):
        Mandatory for a public key. X coordinate (affine) of the ECC point.

      point_y (integer):
        Mandatory for a public key. Y coordinate (affine) of the ECC point.

    Returns:
      :class:`EccKey` : a new ECC key object
    rp   Úpoint_xNÚpoint_yrx   zUnknown keyword: pointr³   z(Private and public ECC keys do not matchr_   )	r-   rµ   r·   ra   r+   r¯   r„   rf   r±   )r¹   r»   rp   r$  r%  r³   Úpub_keys          r=   Ú	constructr'    sà   € ð, ˜”€JÝ�JÔ€EØ�jŠj˜ DÑ)Ô)€GØ�jŠj˜ DÑ)Ô)€Gà�&ÐÐÝÐ0Ñ1Ô1Ð1à�G˜WÐ%Ð%Ð%å" 7¨G°ZÑ@Ô@ˆˆw‰ð 	�
Š
�3˜ÑÔ€AØ€}˜ FÐ*Ð*Ø”'˜A‘+ˆØŒ:˜' 7Ð+Ò+Ð+ÝÐGÑHÔHÐHåÐÐ�FÐÐÐr?   c                 óh  — t                                ¦   «         D ]\  }}|j        | k    r nŒt          d| z  ¦  «        ‚|j                             ¦   «         }t          |d         ¦  «        }|dk    rgt          |¦  «        dd|z  z   k    rt          d¦  «        ‚t          j
        |d|dz   …         ¦  «        }t          j
        ||dz   d…         ¦  «        }nÈ|dv rµt          |¦  «        d|z   k    rt          d¦  «        ‚t          j
        |dd…         ¦  «        }|d	z  |d	z  z
  |j        z                        |j        ¦  «        }|dk    r|                     ¦   «         r
|j        |z
  }|d	k    r|                     ¦   «         r
|j        |z
  }nt          d
¦  «        ‚t          |||¬¦  «        S )z§Convert an encoded EC point into an EccKey object

    curve_name: string with the OID of the curve
    ec_point: byte string with the EC point (not DER encoded)

    úUnsupported ECC curve (OID: %s)r   é   rŽ   rÞ   zIncorrect EC point lengthN)rÞ   é   r+  zIncorrect EC point encoding)rp   r$  r%  )r-   Úitemsrã   r[   r2   ri   r   r)   rf   r   Ú
from_bytesr3   Úsqrtrá   Úis_evenr'  )Ú	curve_oidÚec_pointr»   rp   rq   Ú
point_typern   ro   s           r=   Ú_import_public_derr3  8  sÆ  € õ %Ÿ]š]™_œ_ð Sð SÑˆ
�EØŒ9˜	Ò!Ð!ØˆEð "õ $Ð$EÈ	Ñ$QÑRÔRÐRð ”G×)Ò)Ñ+Ô+€MÝ�h˜q”kÑ"Ô"€Jð �TÒÐÝˆx‰=Œ=˜Q  ]Ñ!2Ñ2Ò3Ð3ÝÐ8Ñ9Ô9Ð9ÝÔ˜x¨¨-¸©/Ð(9Ô:Ñ;Ô;ˆÝÔ˜x¨°a©Ð(8Ð(8Ô9Ñ:Ô:ˆˆà	�{Ð	"Ð	"Ýˆx‰=Œ=˜Q Ñ.Ò/Ð/ÝÐ8Ñ9Ô9Ð9ÝÔ˜x¨¨¨œ|Ñ,Ô,ˆØ�‰T�A�a‘C‰Z˜%œ'Ñ!×'Ò'¨¬Ñ0Ô0ˆØ˜ÒÐ !§(¢(¡*¤*ÐØ”˜!‘ˆAØ˜ÒÐ !§)¢)¡+¤+ÐØ”˜!‘ˆAøåÐ6Ñ7Ô7Ð7å˜:¨q¸!Ð<Ñ<Ô<Ð<r?   c                 óô   — t          | ¦  «        \  }}}d}d}d}||||fvrt          d|z  ¦  «        ‚|st          d¦  «        ‚t          ¦   «                              |¦  «        j        }t          ||¦  «        S )z4Convert a subjectPublicKeyInfo into an EccKey objectrà   ú1.3.132.1.12ú1.3.132.1.13ú!Unsupported ECC purpose (OID: %s)zMissing ECC parameters)r   r[   rf   r   ÚdecodeÚvaluer3  )	Úencodedr¹   rã   r1  Úparamsræ   Úecdh_oidÚ	ecmqv_oidr0  s	            r=   Ú_import_subjectPublicKeyInfor>  g  s–   € õ <¸GÑDÔDÑ€Cˆ�6ð +ÐØ€HØ€Ià
Ð# X¨yÐ9Ð9Ð9Ý#Ð$GÈ#Ñ$MÑNÔNÐNð ð 3ÝÐ1Ñ2Ô2Ð2õ ‘”×$Ò$ VÑ,Ô,Ô2€Iå˜i¨Ñ2Ô2Ð2r?   c                 óÆ  — t          ¦   «                              | d¬¦  «        }|d         dk    rt          d¦  «        ‚	 t          d¬¦  «                             |d         ¦  «        j        }|�||k    rt          d¦  «        ‚|}n# t          $ r Y nw xY w|€t          d	¦  «        ‚t
                               ¦   «         D ]\  }}|j        |k    r nŒt          d
|z  ¦  «        ‚t          ¦   «                              |d         ¦  «        j
        }|j                             ¦   «         }t          |¦  «        |k    rt          d¦  «        ‚t          j        |¦  «        }	t          |¦  «        dk    rWt!          d¬¦  «                             |d         ¦  «        j        }
t#          ||
¦  «        }|j        j        }|j        j        }nd x}}t+          ||	||¬¦  «        S )N)r+  r*  )Únr_elementsr   rŽ   z!Incorrect ECC private key versionré   rÞ   zCurve mismatchzNo curve foundr)  zPrivate key is too smallr*  r+  )rp   r³   r$  r%  )r   r8  rf   r   r9  r-   r,  rã   r[   r   Úpayloadr2   ri   r)   r   r-  r   r3  r¾   rn   ro   r'  )r:  rò   r0  rø   Ú
parametersr»   rp   Úscalar_bytesrq   r³   Úpublic_key_encrÜ   r$  r%  s                 r=   Ú_import_private_derrE  Ž  s÷  € õ ‘-”-×&Ò& w¸FÐ&ÑCÔC€KØ�1„~˜ÒÐÝÐ<Ñ=Ô=Ð=ðÝ ¨!Ð,Ñ,Ô,×3Ò3°KÀ´NÑCÔCÔIˆ
ØÐ  Z°9Ò%<Ð%<ÝÐ-Ñ.Ô.Ð.Øˆ	ˆ	øÝð ð ð Øˆðøøøð ÐÝÐ)Ñ*Ô*Ð*å$Ÿ]š]™_œ_ð Sð SÑˆ
�EØŒ9˜	Ò!Ð!ØˆEð "õ $Ð$EÈ	Ñ$QÑRÔRÐRå!Ñ#Ô#×*Ò*¨;°q¬>Ñ:Ô:ÔB€LØ”G×)Ò)Ñ+Ô+€MÝ
ˆ<ÑÔ˜MÒ)Ð)ÝÐ3Ñ4Ô4Ð4ÝÔ˜<Ñ(Ô(€Aõ ˆ;ÑÔ˜1ÒÐÝ%¨qÐ1Ñ1Ô1×8Ò8¸ÀQ¼ÑHÔHÔNˆÝ'¨	°>ÑBÔBˆ
ØÔ#Ô%ˆØÔ#Ô%ˆˆà Ð ˆ�'å˜:¨°GÀWÐMÑMÔMÐMs   Á AB Â
BÂBc                 óî   — ddl m} |                     | |¦  «        \  }}}d}d}d}||||fvrt          d|z  ¦  «        ‚t	          ¦   «                              |¦  «        j        }	t          |||	¦  «        S )Nr   rð   rà   r5  r6  r7  )rö   rñ   Úunwrapr[   r   r8  r9  rE  )
r:  rò   rñ   Úalgo_oidrø   r;  ræ   r<  r=  r0  s
             r=   Ú_import_pkcs8rI  À  s•   € Ø#Ð#Ð#Ð#Ð#Ð#ð %*§L¢L°¸*Ñ$EÔ$EÑ!€Hˆk˜6ð +ÐØ€HØ€IàÐ(¨(°IÐ>Ð>Ð>Ý#Ð$GÈ(Ñ$RÑSÔSÐSå‘”×$Ò$ VÑ,Ô,Ô2€Iå˜{¨J¸	ÑBÔBÐBr?   c                 ó>   — t          | ¦  «        }t          |¦  «        S rª   )r   r>  )r:  r¹   Úsp_infos      r=   Ú_import_x509_certrL  Ú  s   € å.¨wÑ7Ô7€GÝ'¨Ñ0Ô0Ð0r?   c                 ó  — 	 t          | |¦  «        S # t          $ r}|‚d }~wt          t          t          f$ r Y nw xY w	 t          | |¦  «        S # t          $ r}|‚d }~wt          t          t          f$ r Y nw xY w	 t          | |¦  «        S # t          $ r}|‚d }~wt          t          t          f$ r Y nw xY w	 t          | |¦  «        S # t          $ r}|‚d }~wt          t          t          f$ r Y nw xY wt          d¦  «        ‚)NzNot an ECC DER key)r>  r[   rf   r·   Ú
IndexErrorrL  rE  rI  )r:  rò   Úerrs      r=   Ú_import_derrP  à  so  € ðÝ+¨G°ZÑ@Ô@Ð@øÝ ð ð ð Øˆ	øøøøÝ�	¥:Ð.ð ð ð ØˆðøøøðÝ  ¨*Ñ5Ô5Ð5øÝ ð ð ð Øˆ	øøøøÝ�	¥:Ð.ð ð ð ØˆðøøøðÝ" 7¨JÑ7Ô7Ð7øÝ ð ð ð Øˆ	øøøøÝ�	¥:Ð.ð ð ð ØˆðøøøðÝ˜W jÑ1Ô1Ð1øÝ ð ð ð Øˆ	øøøøÝ�	¥:Ð.ð ð ð Øˆðøøøõ Ð)Ñ
*Ô
*Ð*sm   ‚ ’
;œž;º;¿A Á
A8ÁAÁA8Á7A8Á<B Â
B5ÂBÂB5Â4B5Â9C	 Ã	
C2ÃCÃC2Ã1C2c                 óT  — t          j        |                      d¦  «        d         ¦  «        }g }t          |¦  «        dk    rct	          j        d|d d…         ¦  «        d         }|                     |dd|z   …         ¦  «         |d|z   d …         }t          |¦  «        dk    °ct                               ¦   «         D ]@\  }}t          |j
                             d¦  «        d         ¦  «        }|d         |k    r nŒAt          d¦  «        ‚t          |j        |d         ¦  «        S )	Nó    rŽ   r*  r	  r   r  rÞ   zUnsupported ECC curve)r  Ú
a2b_base64r  r)   r
  ÚunpackÚappendr-   r,  r   r  rf   r3  rã   )r:  Ú	keystringÚkeypartsÚlkr»   rp   r  s          r=   Ú_import_openssh_publicrY    s  € ÝÔ# G§M¢M°$Ñ$7Ô$7¸Ô$:Ñ;Ô;€Ià€HÝ
ˆi‰.Œ.˜1Ò
Ð
ÝŒ]˜4 ¨2¨A¨2¤Ñ/Ô/°Ô2ˆØ�Š˜	 ! A¨¡F (Ô+Ñ,Ô,Ð,Ø˜a "™f˜g˜gÔ&ˆ	õ ˆi‰.Œ.˜1Ò
Ð
õ
 %Ÿ]š]™_œ_ð 2ð 2Ñˆ
�EÝ˜œ×,Ò,¨SÑ1Ô1°!Ô4Ñ5Ô5ˆØ�AŒ;˜&Ò Ð ØˆEð !õ Ð0Ñ1Ô1Ð1å˜eœi¨°!¬Ñ5Ô5Ð5r?   c                 ó´  — ddl m}m}m}m}  || |¦  «        \  }} ||¦  «        \  }}|t
          vrt          d|z  ¦  «        ‚t
          |         }	|	j        dz   dz  }
 ||¦  «        \  }}t          |d         ¦  «        dk    rt          d¦  «        ‚t          |¦  «        d	|
z  dz   k    rt          d
¦  «        ‚t          j        |dd|
z   …         ¦  «        }t          j        |d|
z   d …         ¦  «        }t          |||¬¦  «        } ||¦  «        \  }}t          j        |¦  «        } ||¦  «        \  }} ||¦  «         t          |||¬¦  «        S )NrŽ   )Úimport_openssh_private_genericÚ
read_bytesÚread_stringÚcheck_paddingzUnsupported ECC curve %sr“   r”   r   r*  z/Only uncompressed OpenSSH EC keys are supportedrÞ   zIncorrect public key length)rp   )rp   r³   rx   )Ú_opensshr[  r\  r]  r^  r-   r[   r—   r   rf   r)   r   r-  ra   r±   )ÚdataÚpasswordr[  r\  r]  r^  Ússh_nameÚ	decryptedÚnamerp   rq   rÜ   r$  r%  rx   rø   r³   Ú_Úpaddeds                      r=   Ú_import_openssh_private_eccrg    sÁ  € ðCð Cð Cð Cð Cð Cð Cð Cð Cð Cð Cð Cð 9Ð8¸¸xÑHÔHÑ€Hˆià!�k )Ñ,Ô,�O€Dˆ)Ø•7ÐÐÝ#Ð$>ÀÑ$EÑFÔFÐFÝ�DŒM€EØÔ'¨!Ñ+°Ñ1€Mà&˜J yÑ1Ô1Ñ€J�	åˆJ�qŒMÑÔ˜aÒÐÝÐJÑKÔKÐKÝ
ˆ:�„˜!˜mÑ+¨aÑ/Ò/Ð/ÝÐ6Ñ7Ô7Ð7åÔ  ¨A¨a°©oÐ,=Ô!>Ñ?Ô?€GÝÔ  ¨A¨m©OÐ,<Ð,<Ô!=Ñ>Ô>€GÝ�W˜g¨TÐ2Ñ2Ô2€Eà'˜Z¨	Ñ2Ô2Ñ€K�ÝÔ˜;Ñ'Ô'€Aà�˜IÑ&Ô&�I€A€vØ€M�&ÑÔÐå˜ ¨Ð/Ñ/Ô/Ð/r?   c                 ó(  — ddl m} t          | ¦  «        } |�t          |¦  «        }|                      d¦  «        r;t	          | ¦  «        }|                     ||¦  «        \  }}}t          ||¦  «        }|S |                      d¦  «        r™t	          | ¦  «        }d}d}	t          j        |dz   |	z   d	|t          j	        ¬
¦  «        }|                     ||¦  «        \  }
}}|rd}	 t          |
|¦  «        }n,# t          $ r}|‚d}~wt          $ r t          d¦  «        ‚w xY w|S |                      d¦  «        rt          | ¦  «        S t          | ¦  «        dk    r)t          | d         ¦  «        dk    rt          | |¦  «        S t          d¦  «        ‚)a�  Import an ECC key (public or private).

    Args:
      encoded (bytes or multi-line string):
        The ECC key to import.

        An ECC **public** key can be:

        - An X.509 certificate, binary (DER) or ASCII (PEM)
        - An X.509 ``subjectPublicKeyInfo``, binary (DER) or ASCII (PEM)
        - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII)

        An ECC **private** key can be:

        - In binary format (DER, see section 3 of `RFC5915`_ or `PKCS#8`_)
        - In ASCII format (PEM or `OpenSSH 6.5+`_)

        Private keys can be in the clear or password-protected.

        For details about the PEM encoding, see `RFC1421`_/`RFC1423`_.

      passphrase (byte string):
        The passphrase to use for decrypting a private key.
        Encryption may be applied protected at the PEM level or at the PKCS#8 level.
        This parameter is ignored if the key in input is not encrypted.

    Returns:
      :class:`EccKey` : a new ECC key object

    Raises:
      ValueError: when the given key cannot be parsed (possibly because
        the pass phrase is wrong).

    .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt
    .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt
    .. _RFC5915: http://www.ietf.org/rfc/rfc5915.txt
    .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt
    .. _`OpenSSH 6.5+`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf
    r   rû   Ns   -----BEGIN OPENSSH PRIVATE KEYs   -----z-----BEGIN EC PARAMETERS-----z-----END EC PARAMETERS-----z.*?rÁ   )Úflagsz(Invalid DER encoding inside the PEM files   ecdsa-sha2-rF   zECC key format is not supported)rö   rü   r   Ú
startswithr   r8  rg  ÚreÚsubÚDOTALLrP  r[   rf   rY  r)   r   )r:  rò   rü   Útext_encodedÚopenssh_encodedÚmarkerÚenc_flagr;   Úecparams_startÚecparams_endÚder_encodedÚuefs               r=   Ú
import_keyrv  5  sÞ  € ðR "Ð!Ð!Ð!Ð!Ð!å�gÑÔ€GØÐÝ˜ZÑ(Ô(ˆ
ð ×ÒÐ;Ñ<Ô<ð Ý˜W‘~”~ˆØ,/¯JªJ°|ÀZÑ,PÔ,PÑ)ˆ˜ Ý,¨_¸jÑIÔIˆØˆà	×	Ò	˜HÑ	%Ô	%ð å˜W‘~”~ˆð 9ˆØ4ˆÝ”v˜n¨uÑ4°|ÑCÀRØ ,Ý&(¤ið1ñ 1ô 1ˆð ),¯
ª
°<ÀÑ(LÔ(LÑ%ˆ�V˜XØð 	ØˆJð	IÝ  ¨jÑ9Ô9ˆFˆFøÝ$ð 	ð 	ð 	ØˆIøøøøÝð 	Ið 	Ið 	IÝÐGÑHÔHÐHð	Iøøøàˆð ×Ò˜.Ñ)Ô)ð /Ý% gÑ.Ô.Ð.õ ˆ7�|„|�aÒÐ�D ¨¤Ñ,Ô,°Ò4Ð4Ý˜7 JÑ/Ô/Ð/å
Ð6Ñ
7Ô
7Ð7s   Ã&C7 Ã7
D ÄDÄD Ú__main__l   ýö_,)¶NÌ$ÔcÐhKf-5lk<X÷k©#E i¸  z	(P-256 G)iè  Úmsz(P-256 arbitrary point)rª   )WÚ
__future__r   rk  r
  r  Úcollectionsr   ÚCryptodome.Util.py3compatr   r   r   r   r	   ÚCryptodome.Util.numberr
   r   ÚCryptodome.Math.Numbersr   ÚCryptodome.Util.asn1r   r   r   r   ÚCryptodome.PublicKeyr   r   r   ÚCryptodome.Util._raw_apir   r   r   r   r   r   ÚCryptodome.Randomr   ÚCryptodome.Random.randomr   r&   r   r-   r1   r>   rG   rL   rT   rY   rf   r[   Úobjectra   r5   r6   Úp256_GÚ_replacer   r.   r/   r0   Úp384_Gr@   Úp521_GrM   r±   r"  r'  r3  r>  rE  rI  rL  rP  rY  rg  rv  r\   Útimer³   r¯   r   rx   ÚcountÚstartÚrangern   ÚpointXÚprintr_   r?   r=   ú<module>rŽ     sÆ  ðð> &Ð %Ð %Ð %Ð %Ð %à 	€	€	€	Ø €€€Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "à KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à +Ð +Ð +Ð +Ð +Ð +ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð@ð @ð @ð @ð @ð @ð @ð @ð @ð @ð/ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /Ð .Ð .Ð .Ð .Ð .Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð $Ð
#Ð$Að  Dñ  ô  €ðD 
ˆ�HÐWÑ	XÔ	X€Ø
€ðð ð €
ð#4ð #4ð #4ðL 
€	�„€Øðð ð €
ð#4ð #4ð #4ðL 
€	�„€Øðð ð €
ð#4ð #4ð #4ðL 
€	�„€Øð	ð 	ð 	ð 	ð 	˜Jñ 	ô 	ð 	ði'ð i'ð i'ð i'ð i'ˆvñ i'ô i'ð i'ðZ 
ˆ�'˜&”/Ô$ g¨f¤oÔ&8¸&Ñ	AÔ	A€Øˆv„×Ò &ÐÑ)Ô)€Ø ‡‚ˆt�}Š}�Z¨Ñ.Ô.Ñ /Ô /Ð /Ø
ˆD�*à	ˆ�'˜&”/Ô$ g¨f¤oÔ&8¸&Ñ	AÔ	A€Øˆv„×Ò &ÐÑ)Ô)€Ø ‡‚ˆt�}Š}�Z¨Ñ.Ô.Ñ /Ô /Ð /Ø
ˆD�*à	ˆ�'˜&”/Ô$ g¨f¤oÔ&8¸&Ñ	AÔ	A€Øˆv„×Ò &ÐÑ)Ô)€Ø ‡‚ˆt�}Š}�Z¨Ñ.Ô.Ñ /Ô /Ð /Ø
ˆD�*ðE6ð E6ð E6ð E6ð E6ˆVñ E6ô E6ð E6ðP
)ð )ð )ð4)ð )ð )ðX,=ð ,=ð ,=ð^$3ð $3ð $3ðN/Nð /Nð /Nð /NðdCð Cð Cð41ð 1ð 1ð+ð +ð +ðB6ð 6ð 6ð&0ð 0ð 0ðBU8ð U8ð U8ð U8ðp ˆzÒÐà€K€K€KàJ€Aà�FŒOÔ×"Ò"Ñ$Ô$€EØ€EàˆDŒI‰KŒK€EØˆU�5‰\Œ\ð ð ˆØ˜‘ˆˆØ	€Eˆ+˜	˜œ	™œ eÑ+¨uÑ4°tÑ;¸TÑBÔBÐBàˆDŒI‰KŒK€EØˆU�5‰\Œ\ð ð ˆØ˜!‘ˆˆØ	€EÐ
# i d¤i¡k¤k°EÑ&9¸UÑ%BÀTÑ%IÈ4ÑPÔPÐPÐPÐPð# Ðr?   