Ë
    íU.jIÀ  ã                   ó®  — d dl mZ d dlZd dlZd dlZd dlmZmZmZ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 d dlmZ d	d
lmZmZmZ d	dlmZ   G d„ de!«      Z" G d„ de#«      Z$d„ Z%d„ Z&d'd„Z'd„ Z(d(d„Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d„ Z0d„ Z1d„ Z2d'd„Z3e4dk(  r°d dl5Z5d Z6ed!   jn                  jq                  «       Z9d"Z: e5jj                  «       Z; e<e:«      D ]  Z=e9e6z  Z>Œ	  e?d# e5jj                  «       e;z
  e:z  d$z  d%«        e5jj                  «       Z; e<e:«      D ]  Z=e>e6z  Z>Œ	  e?d& e5jj                  «       e;z
  e:z  d$z  d%«       yy))é    )Úprint_functionN)ÚbordÚtobytesÚtostrÚbchrÚ	is_string)ÚInteger)ÚDerObjectIdÚDerOctetStringÚDerSequenceÚDerBitString)Ú_expand_subject_public_key_infoÚ_create_subject_public_key_infoÚ _extract_subject_public_key_info)ÚSHA512ÚSHAKE256)Úget_random_bytesé   )ÚEccPointÚ	EccXPointÚ_curves)ÚCurveIDc                   ó   — e Zd Zy)ÚUnsupportedEccFeatureN)Ú__name__Ú
__module__Ú__qualname__© ó    úVC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\Crypto/PublicKey/ECC.pyr   r   7   s   „ Ør   r   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e
d
„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚEccKeyaþ  Class defining an ECC key.
    Do not instantiate directly.
    Use :func:`generate`, :func:`construct` or :func:`import_key` instead.

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

    :ivar pointQ: an ECC point representing the public component.
    :vartype pointQ: :class:`EccPoint` or :class:`EccXPoint`

    :ivar d: A scalar that represents the private component
             in NIST P curves. It is smaller than the
             order of the generator point.
    :vartype d: integer

    :ivar seed: A seed that represents the private component
                in Ed22519 (32 bytes), Curve25519 (32 bytes),
                Curve448 (56 bytes), Ed448 (57 bytes).
    :vartype seed: bytes
    c                 ó’	  — t        |«      }|j                  dd«      }|j                  dd«      | _        |j                  dd«      | _        |j                  dd«      | _        |€"| j                  r| j                  j
                  }|rt        dt        |«      z   «      ‚|t        vrt        d|z  «      ‚t        |   | _
        | j                  j                  | _        t        | j                  du«      t        | j                  du«      z   }|dk(  r| j                  €t        d	«      ‚y|d
k(  rt        d«      ‚| j                  j                  t        j                  k(  r·| j                  �t        d«      ‚t!        | j                  «      dk7  rt        d«      ‚t#        j$                  | j                  «      j'                  «       }|dd | _        t+        |dd «      }|dxx   dz  cc<   |d   dz  dz  |d<   t-        j.                  |d¬«      | _        y| j                  j                  t        j0                  k(  r¼| j                  �t        d«      ‚t!        | j                  «      dk7  rt        d«      ‚t3        j$                  | j                  «      j5                  d«      }|dd | _        t+        |dd «      }|dxx   dz  cc<   |dxx   dz  cc<   d|d<   t-        j.                  |d¬«      | _        y| j                  j                  t        j6                  k(  r‡| j                  �t        d«      ‚t!        | j                  «      dk7  rt        d«      ‚t+        | j                  «      }|dxx   dz  cc<   |d   dz  dz  |d<   t-        j.                  |d¬«      | _        y| j                  j                  t        j8                  k(  r†| j                  �t        d«      ‚t!        | j                  «      dk7  rt        d«      ‚t+        | j                  «      }|dxx   dz  cc<   |dxx   dz  cc<   t-        j.                  |d¬«      | _        y| j                  �t        d«      ‚t-        | j                  «      | _        d| j                  cxk  r#| j                  j:                  k  st        d «      ‚ t        d «      ‚y)!a˜  Create a new ECC key

        Keywords:
          curve : string
            The name of the curve.
          d : integer
            Mandatory for a private key one NIST P curves.
            It must be in the range ``[1..order-1]``.
          seed : bytes
            Mandatory for a private key on Ed25519 (32 bytes),
            Curve25519 (32 bytes), Curve448 (56 bytes) or Ed448 (57 bytes).
          point : EccPoint or EccXPoint
            Mandatory for a public key. If provided for a private key,
            the implementation will NOT check whether it matches ``d``.

        Only one parameter among ``d``, ``seed`` or ``point`` may be used.
        ÚcurveNÚdÚseedÚpointúUnknown parameters: zUnsupported curve (%s)r   zGAt lest one between parameters 'point', 'd' or 'seed' must be specifiedé   z,Parameters d and seed are mutually exclusivez/Parameter d can only be used with NIST P curvesé    z0Parameter seed must be 32 bytes long for Ed25519éø   é   é   é@   Úlittle©Ú	byteorderé9   z.Parameter seed must be 57 bytes long for Ed448ér   éü   é7   é€   é8   z3Parameter seed must be 32 bytes long for Curve25519z1Parameter seed must be 56 bytes long for Curve448z2Parameter 'seed' cannot be used with NIST P-curvesr   z;Parameter d must be an integer smaller than the curve order)ÚdictÚpopÚ_dÚ_seedÚ_pointr$   Ú	TypeErrorÚstrr   Ú
ValueErrorÚ_curveÚ	canonicalÚintÚidÚ_CurveIDÚED25519Úlenr   ÚnewÚdigestÚ_prefixÚ	bytearrayr	   Ú
from_bytesÚED448r   ÚreadÚ
CURVE25519ÚCURVE448Úorder)ÚselfÚkwargsÚkwargs_Ú
curve_nameÚcountÚ	seed_hashÚtmps          r    Ú__init__zEccKey.__init__Q   sû  € ô& �v“,ˆØ—[‘[ ¨$Ó/ˆ
Ø—+‘+˜c 4Ó(ˆŒØ—[‘[ ¨Ó.ˆŒ
Ø—k‘k '¨4Ó0ˆŒØÐ $§+¢+ØŸ™×*Ñ*ˆJÙÜÐ2´S¸³\ÑAÓBÐBàœWÑ$ÜÐ5¸
ÑBÓCÐCÜ˜jÑ)ˆŒØ—[‘[×*Ñ*ˆŒ
ä�D—G‘G 4Ð'Ó(¬3¨t¯z©zÀÐ/EÓ+FÑFˆà�AŠ:Ø�{‰{Ð"Ü Ð!jÓkÐkØà�AŠ:ÜÐKÓLÐLð
 �;‰;�>‰>œX×-Ñ-Ò-Ø�w‰wÐ"Ü Ð!RÓSÐSÜ�4—:‘:‹ "Ò$Ü Ð!SÓTÐTÜŸ
™
 4§:¡:Ó.×5Ñ5Ó7ˆIØ$ R S˜>ˆDŒLÜ˜I c r˜NÓ+ˆCØ�‹F�d‰N‹FØ˜2‘w ‘~¨Ñ-ˆC�‰GÜ×(Ñ(¨¸ÔAˆD�Gà�[‰[�^‰^œxŸ~™~Ò-Ø�w‰wÐ"Ü Ð!RÓSÐSÜ�4—:‘:‹ "Ò$Ü Ð!QÓRÐRÜ Ÿ™ T§Z¡ZÓ0×5Ñ5°cÓ:ˆIØ$ R S˜>ˆDŒLÜ˜I c r˜NÓ+ˆCØ�‹F�d‰N‹FØ�‹G�t‰O‹GØˆC�‰GÜ×(Ñ(¨¸ÔAˆD�Gà�[‰[�^‰^œx×2Ñ2Ò2Ø�w‰wÐ"Ü Ð!RÓSÐSÜ�4—:‘:‹ "Ò$Ü Ð!VÓWÐWÜ˜DŸJ™JÓ'ˆCØ�‹F�d‰N‹FØ˜2‘w ‘~¨Ñ-ˆC�‰GÜ×(Ñ(¨¸ÔAˆD�GØ�[‰[�^‰^œx×0Ñ0Ò0Ø�w‰wÐ"Ü Ð!RÓSÐSÜ�4—:‘:‹ "Ò$Ü Ð!TÓUÐUÜ˜DŸJ™JÓ'ˆCØ�‹F�d‰N‹FØ�‹G�t‰O‹GÜ×(Ñ(¨¸ÔAˆD�Gð �z‰zÐ%Ü Ð!UÓVÐVÜ˜dŸg™gÓ&ˆDŒGØ˜Ÿ™Ô3 $§+¡+×"3Ñ"3Ò3Ü Ð!^Ó_Ð_ð 4Ü Ð!^Ó_Ð_ð 4r   c                 óš   — t        |t        «      sy|j                  «       | j                  «       k7  ry|j                  | j                  k(  S )NF)Ú
isinstancer"   Úhas_privateÚpointQ)rQ   Úothers     r    Ú__eq__zEccKey.__eq__³   s?   € Ü˜%¤Ô(Øà×ÑÓ $×"2Ñ"2Ó"4Ò4Øà�|‰|˜tŸ{™{Ñ*Ð*r   c                 ó   — | j                  «       r[| j                  j                  r,dt        t	        j
                  | j                  «      «      z  }ndt        | j                  «      z  }nd}| j                  j                  t        j                  t        j                  fv r4| j                  j                  }d| j                  j                  ||fz  }|S | j                  j                   \  }}d| j                  j                  |||fz  }|S )Nz	, seed=%sz, d=%dÚ z EccKey(curve='%s', point_x=%d%s)z,EccKey(curve='%s', point_x=%d, point_y=%d%s))r[   r@   Ú
is_edwardsr   ÚbinasciiÚhexlifyr;   rB   r:   rC   rD   rN   rO   r\   ÚxrA   Úxy)rQ   Úextrard   ÚresultÚys        r    Ú__repr__zEccKey.__repr__¼   sß   € Ø×ÑÔØ�{‰{×%Ò%Ø#¤e¬H×,<Ñ,<¸T¿Z¹ZÓ,HÓ&IÑI‘à ¤3 t§w¡w£<Ñ/‘àˆEØ�;‰;�>‰>œh×1Ñ1Ü&×/Ñ/ð1ñ 1à—‘—‘ˆAØ7¸4¿;¹;×;PÑ;PÐRSÐUZÐ:[Ñ[ˆFð ˆð —;‘;—>‘>‰DˆAˆqØCÀtÇ{Á{×G\ÑG\Ð^_ÐabÐdiÐFjÑjˆFØˆr   c                 ó   — | j                   duS )zJ``True`` if this key can be used for making signatures or decrypting data.N)r:   ©rQ   s    r    r[   zEccKey.has_privateÍ   s   € ð �w‰w˜dÐ"Ð"r   c                 ó`  — d|cxk  r| j                   j                  k  sJ ‚ J ‚| j                   j                  }t        j                  d|¬«      }| j                  |z  }||z  j                  |«      }| j                   j                  |z  j                  |z  }|||z  ||z  z   z  |z  }||fS )Nr   r   )Úmin_inclusiveÚmax_exclusive)r@   rP   r	   Úrandom_ranger:   ÚinverseÚGrd   )	rQ   ÚzÚkrP   ÚblindÚblind_dÚinv_blind_kÚrÚss	            r    Ú_signzEccKey._signÓ   s®   € Ø�1Ô(�t—{‘{×(Ñ(Ò(Ð(Ñ(Ð(Ð(à—‘×!Ñ!ˆÜ×$Ñ$°1Ø38ô:ˆð —'‘'˜E‘/ˆØ˜q‘y×)Ñ)¨%Ó0ˆà�[‰[�]‰]˜QÑ×!Ñ! EÑ)ˆØ˜5 1™9 w°¡{Ñ2Ñ3°eÑ;ˆØ�1ˆvˆr   c                 óî   — | j                   j                  }|d   j                  |«      }| j                   j                  ||z  |z  z  }| j                  ||d   z  |z  z  }||z   j
                  |d   k(  S )Nr   r   )r@   rP   rp   rq   r\   rd   )rQ   rr   ÚrsrP   ÚsinvÚpoint1Úpoint2s          r    Ú_verifyzEccKey._verifyâ   sr   € Ø—‘×!Ñ!ˆØ�!‰u�}‰}˜UÓ#ˆØ—‘—‘ 4¨!¡8¨uÑ"4Ñ5ˆØ—‘ ¨¨1©¡°Ñ 6Ñ7ˆØ˜‘×"Ñ" b¨¡eÑ+Ð+r   c                 óP   — | j                  «       st        d«      ‚| j                  S ©NzThis is not a private ECC key)r[   r?   r:   rk   s    r    r%   zEccKey.dé   s#   € à×ÑÔ!ÜÐ<Ó=Ð=Ø�w‰wˆr   c                 óP   — | j                  «       st        d«      ‚| j                  S r�   )r[   r?   r;   rk   s    r    r&   zEccKey.seedï   s$   € à×ÑÔ!ÜÐ<Ó=Ð=Ø�z‰zÐr   c                 ó‚   — | j                   €(| j                  j                  | j                  z  | _         | j                   S ©N)r<   r@   rq   r:   rk   s    r    r\   zEccKey.pointQõ   s.   € à�;‰;ÐØŸ+™+Ÿ-™-¨$¯'©'Ñ1ˆDŒKØ�{‰{Ðr   c                 óX   — t        | j                  j                  | j                  ¬«      S )z^A matching ECC public key.

        Returns:
            a new :class:`EccKey` object
        )r$   r'   )r"   r@   rA   r\   rk   s    r    Ú
public_keyzEccKey.public_keyû   s   € ô ˜DŸK™K×1Ñ1¸¿¹ÔEÐEr   c                 óÂ  — | j                   j                  st        d«      ‚| j                  j	                  «       }|rS| j                  j
                  j                  «       rd}nd}|| j                  j                  j                  |«      z   }|S d| j                  j                  j                  |«      z   | j                  j
                  j                  |«      z   }|S )Nz/SEC1 format is only supported for NIST P curvesó   ó   ó   )	r@   Úis_weierstrassr?   r\   Úsize_in_bytesrh   Úis_oddrd   Úto_bytes)rQ   ÚcompressÚmodulus_bytesÚ
first_byter†   s        r    Ú_export_SEC1zEccKey._export_SEC1  sÀ   € Ø�{‰{×)Ò)ÜÐNÓOÐOð Ÿ™×1Ñ1Ó3ˆáØ�{‰{�}‰}×#Ñ#Ô%Ø$‘
à$�
Ø$ØŸ+™+Ÿ-™-×0Ñ0°Ó?ñ@ˆJð Ðð "ØŸ+™+Ÿ-™-×0Ñ0°Ó?ñ@àŸ+™+Ÿ-™-×0Ñ0°Ó?ñ@ˆJð Ðr   c                 óº  — | j                   j                  \  }}| j                  j                  t        j
                  k(  r8t        |j                  dd¬«      «      }|dz  dz  |d   z  |d<   t        |«      S | j                  j                  t        j                  k(  r2t        |j                  dd¬«      «      }|dz  dz  |d<   t        |«      S t        d	«      ‚)
Nr*   r/   r0   r   é   r,   r2   r7   zNot an EdDSA key to export)r\   re   r@   rC   rD   rE   rJ   rŽ   rL   r?   Úbytes)rQ   rd   rh   rg   s       r    Ú_export_eddsa_publiczEccKey._export_eddsa_public   s¾   € Ø�{‰{�~‰~‰ˆˆ1Ø�;‰;�>‰>œX×-Ñ-Ò-Ü˜qŸz™z¨"¸˜zÓAÓBˆFØ˜q™5 Q™,¨&°©*Ñ4ˆF�2‰Jô �V‹}Ðð �[‰[�^‰^œxŸ~™~Ò-Ü˜qŸz™z¨"¸˜zÓAÓBˆFØ˜a™% A™ˆF�2‰Jô �V‹}Ðô Ð9Ó:Ð:r   c                 óò   — | j                   j                  st        d«      ‚| j                  j                  }| j                  j                  «       }t        |j                  |d¬«      «      }t        |«      S )NzNot a Montgomery key to exportr/   r0   )	r@   Úis_montgomeryr?   r\   rd   rŒ   rJ   rŽ   r•   )rQ   rd   Ú
field_sizerg   s       r    Ú_export_montgomery_publicz EccKey._export_montgomery_public,  s[   € Ø�{‰{×(Ò(ÜÐ=Ó>Ð>Ø�K‰K�M‰MˆØ—[‘[×.Ñ.Ó0ˆ
Ü˜1Ÿ:™: j¸H˜:ÓEÓFˆÜ�V‹}Ðr   c                 ó|  — | j                   j                  r)| j                   j                  }| j                  «       }d }nq| j                   j                  r)| j                   j                  }| j                  «       }d }n2d}| j                  |«      }t        | j                   j                  «      }t        |||«      S )Nú1.2.840.10045.2.1)	r@   ra   Úoidr–   r˜   rš   r’   r
   r   )rQ   r�   r�   r†   Úparamss        r    Ú_export_subjectPublicKeyInfoz#EccKey._export_subjectPublicKeyInfo4  s˜   € Ø�;‰;×!Ò!Ø—+‘+—/‘/ˆCØ×2Ñ2Ó4ˆJØ‰FØ�[‰[×&Ò&Ø—+‘+—/‘/ˆCØ×7Ñ7Ó9ˆJØ‰Fà%ˆCØ×*Ñ*¨8Ó4ˆJÜ  §¡§¡Ó1ˆFä.¨sØ/9Ø/5ó7ð 	7r   c                 óÖ  — | j                  «       sJ ‚| j                  j                  «       }d| j                  j                  j	                  |«      z   | j                  j
                  j	                  |«      z   }dt        | j                  j	                  |«      «      t        | j                  j                  d¬«      t        |d¬«      g}|s|d= t        |«      j                  «       S )NrŠ   r   r   ©Úexplicitr)   )r[   r\   rŒ   rd   rŽ   rh   r   r%   r
   r@   r�   r   r   Úencode)rQ   Úinclude_ec_paramsr�   r†   Úseqs        r    Ú_export_rfc5915_private_derz"EccKey._export_rfc5915_private_derF  sÀ   € à×ÑÔ!Ð!Ð!ð Ÿ™×1Ñ1Ó3ˆØØ—k‘k—m‘m×,Ñ,¨]Ó;ñ<à—k‘k—m‘m×,Ñ,¨]Ó;ñ<ˆ
ð Ü˜dŸf™fŸo™o¨mÓ<Ó=Ü˜4Ÿ;™;Ÿ?™?°QÔ7Ü˜J°Ô3ð5ˆñ
 !Ø�A�ä˜3Ó×&Ñ&Ó(Ð(r   c                 óv  — ddl m} |j                  dd «      �d|vrt        d«      ‚| j                  �<| j
                  j                  }t        | j                  «      j                  «       }d }n3d}| j                  d¬«      }t        | j
                  j                  «      } |j                  ||fd	|i|¤Ž}|S )
Nr   ©ÚPKCS8Ú
passphraseÚ
protectionz3At least the 'protection' parameter must be presentrœ   F)r¤   Ú
key_params)Ú	Crypto.IOr©   Úgetr?   r;   r@   r�   r   r£   r¦   r
   Úwrap)rQ   rR   r©   r�   Úprivate_keyrž   rg   s          r    Ú_export_pkcs8zEccKey._export_pkcs8a  s´   € Ý#à�:‰:�l DÓ)Ð5¸,ÈfÑ:TÜÐRÓSÐSà�:‰:Ð!Ø—+‘+—/‘/ˆCÜ(¨¯©Ó4×;Ñ;Ó=ˆKØ‰Fà%ˆCØ×:Ñ:ÈUÐ:ÓSˆKÜ  §¡§¡Ó1ˆFà�—‘˜KØñ&à'-ð&ð %ñ&ˆð ˆr   c                 óT   — ddl m} | j                  |«      }|j                  |d«      S )Nr   ©ÚPEMz
PUBLIC KEY)r­   r´   rŸ   r£   )rQ   r�   r´   Úencoded_ders       r    Ú_export_public_pemzEccKey._export_public_pemv  s&   € Ý!à×7Ñ7¸ÓAˆØ�z‰z˜+ |Ó4Ð4r   c                 óX   — ddl m} | j                  «       } |j                  |d|fi |¤ŽS )Nr   r³   zEC PRIVATE KEY)r­   r´   r¦   r£   ©rQ   rª   rR   r´   rµ   s        r    Ú_export_private_pemzEccKey._export_private_pem|  s.   € Ý!à×6Ñ6Ó8ˆØˆs�z‰z˜+Ð'7¸ÑNÀvÑNÐNr   c                 óR   — ddl m} | j                  «       }|j                  |d«      S )Nr   r³   zPRIVATE KEY)r­   r´   r±   r£   )rQ   r´   rµ   s      r    Ú(_export_private_clear_pkcs8_in_clear_pemz/EccKey._export_private_clear_pkcs8_in_clear_pem‚  s$   € Ý!à×(Ñ(Ó*ˆØ�z‰z˜+ }Ó5Ð5r   c                 ó€   — ddl m} |sJ ‚d|vrt        d«      ‚ | j                  dd|i|¤Ž}|j	                  |d«      S )Nr   r³   r«   z5At least the 'protection' parameter should be presentrª   zENCRYPTED PRIVATE KEYr   )r­   r´   r?   r±   r£   r¸   s        r    Ú,_export_private_encrypted_pkcs8_in_clear_pemz3EccKey._export_private_encrypted_pkcs8_in_clear_pemˆ  sM   € Ý!áÐˆzØ˜vÑ%ÜÐTÓUÐUØ(�d×(Ñ(ÑI°JÐIÀ&ÑIˆØ�z‰z˜+Ð'>Ó?Ð?r   c                 óœ  — | j                  «       rt        d«      ‚| j                  j                  }|€t        d| j                  z  «      ‚|dk(  r'| j                  «       }t        |«      t        |«      f}nî| j                  j                  «       }|rYd| j                  j                  j                  «       z   }t        |«      | j                  j                  j                  |«      z   }nNd| j                  j                  j                  |«      z   | j                  j                  j                  |«      z   }|j                  d«      d   }t        |«      t        |«      |f}dj                  |D �cg c]$  }t!        j"                  dt%        |«      «      |z   ‘Œ& c}«      }	|d	z   t'        t)        j*                  |	«      «      z   S c c}w )
Nz"Cannot export OpenSSH private keysz Cannot export %s keys as OpenSSHússh-ed25519r)   rŠ   Ú-r   ú>IÚ )r[   r?   r@   Úopensshr$   r–   r   r\   rŒ   rh   r�   r   rd   rŽ   ÚsplitÚjoinÚstructÚpackrF   r   rb   Ú
b2a_base64)
rQ   r�   Údescr†   Úcompsr�   r‘   Úmiddlerd   Úblobs
             r    Ú_export_opensshzEccKey._export_openssh‘  s  € Ø×ÑÔÜÐAÓBÐBà�{‰{×"Ñ"ˆàˆ<ÜÐ?À$Ç*Á*ÑLÓMÐMØ�]Ò"Ø×2Ñ2Ó4ˆJÜ˜T“]¤G¨JÓ$7Ð8‰Eà ŸK™K×5Ñ5Ó7ˆMáØ §¡§¡×!5Ñ!5Ó!7Ñ7�
Ü" :Ó.Ø"Ÿk™kŸm™m×4Ñ4°]ÓCñD‘
ð &Ø"Ÿk™kŸm™m×4Ñ4°]ÓCñDà"Ÿk™kŸm™m×4Ñ4°]ÓCñD�
ð —Z‘Z “_ QÑ'ˆFÜ˜T“]¤G¨F£O°ZÐ@ˆEà�x‰xÁÓFÁ¸1œŸ™ T¬3¨q«6Ó2°QÓ6ÀÑFÓGˆØ�c‰zœE¤(×"5Ñ"5°dÓ";Ó<Ñ<Ð<ùò Gs   Å5)G	c                 ó~  — |j                  «       }|j                  d«      }|dvrt        d|z  «      ‚|j                  dd«      }| j                  «       �r#|j                  dd«      }t	        |«      rt        |«      }|st        d«      ‚|j                  d	d
«      }|du rQ| j                  j                  rt        d«      ‚| j                  j                  rt        d«      ‚d|v rt        d«      ‚|dk(  r:|r%|r | j                  |fi |¤ŽS | j                  «       S  | j                  |fi |¤ŽS |dk(  r5|r|st        d«      ‚|r | j                  dd|i|¤ŽS | j                  «       S t        d|z  «      ‚|rt        d|z  «      ‚|dk(  r| j                  |«      S |dk(  r| j                  |«      S |dk(  r| j!                  |«      S |dk(  r]| j                  j                  r| j#                  «       S | j                  j                  r| j%                  «       S | j!                  |«      S | j'                  |«      S )aÊ  Export this ECC key.

        Args:
          format (string):
            The output format:

            - ``'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).
            - ``'SEC1'``. The public key (i.e., the EC point) will be encoded
              into ``bytes`` according to Section 2.3.3 of `SEC1`_
              (which is a subset of the older X9.62 ITU standard).
              Only for NIST P-curves.
            - ``'raw'``. The public key will be encoded as ``bytes``,
              without any metadata.

              * For NIST P-curves: equivalent to ``'SEC1'``.
              * For Ed25519 and Ed448: ``bytes`` in the format
                defined in `RFC8032`_.
              * For Curve25519 and Curve448: ``bytes`` in the format
                defined in `RFC7748`_.

          passphrase (bytes or string):
            (*Private keys only*) The passphrase to protect the
            private key.

          use_pkcs8 (boolean):
            (*Private keys only*)
            If ``True`` (default and recommended), the `PKCS#8`_ representation
            will be used.
            It must be ``True`` for Ed25519, Ed448, Curve25519, and Curve448.

            If ``False`` and a passphrase is present, the obsolete PEM
            encryption 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,
            For all possible protection schemes,
            refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
            It is recommended to use ``'PBKDF2WithHMAC-SHA512AndAES128-CBC'``.

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

            If ``False`` (default), the method returns the full public key.

            This parameter is ignored for Ed25519/Ed448/Curve25519/Curve448,
            as compression is mandatory.

          prot_params (dict):
            When a private key is exported with password-protection
            and PKCS#8 (both ``DER`` and ``PEM`` formats), this dictionary
            contains the  parameters to use to derive the encryption key
            from the passphrase.
            For all possible values,
            refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
            The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2,
            and ``{'iteration_count':131072}`` for scrypt.

        .. 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:`Crypto.IO.PKCS8`.

        .. _PEM:        http://www.ietf.org/rfc/rfc1421.txt
        .. _`PEM encryption`: http://www.ietf.org/rfc/rfc1423.txt
        .. _OpenSSH:    http://www.openssh.com/txt/rfc5656.txt
        .. _RFC5480:    https://tools.ietf.org/html/rfc5480
        .. _SEC1:       https://www.secg.org/sec1-v2.pdf
        .. _RFC7748:    https://tools.ietf.org/html/rfc7748

        Returns:
            A multi-line string (for ``'PEM'`` and ``'OpenSSH'``) or
            ``bytes`` (for ``'DER'``, ``'SEC1'``, and ``'raw'``) with the encoded key.
        Úformat)r´   ÚDERÚOpenSSHÚSEC1ÚrawzUnknown format '%s'r�   Frª   NzEmpty passphraseÚ	use_pkcs8Tz%'pkcs8' must be True for EdDSA curvesz#'pkcs8' must be True for Curve25519r«   z)'protection' is only supported for PKCS#8r´   rÐ   z8Private keys can only be encrpyted with DER using PKCS#8z2Private keys cannot be exported in the '%s' formatzUnexpected parameters: '%s'rÒ   rÓ   r   )Úcopyr9   r?   r[   r   r   r@   ra   r˜   r½   r»   r¹   r±   r¦   r¶   rŸ   r’   r–   rš   rÍ   )rQ   rR   ÚargsÚ
ext_formatr�   rª   rÔ   s          r    Ú
export_keyzEccKey.export_key®  sX  € ðt �{‰{‹}ˆØ—X‘X˜hÓ'ˆ
ØÐEÑEÜÐ2°ZÑ?Ó@Ð@à—8‘8˜J¨Ó.ˆà×ÑÕØŸ™ ,°Ó5ˆJÜ˜Ô$Ü$ ZÓ0�
Ù!Ü$Ð%7Ó8Ð8àŸ™ ¨dÓ3ˆIØ˜EÑ!Ø—;‘;×)Ò)Ü$Ð%LÓMÐMØ—;‘;×,Ò,Ü$Ð%JÓKÐKØ 4Ñ'Ü$Ð%PÓQÐQà˜UÒ"ÙÙ!ØP˜t×PÑPÐQ[ÑdÐ_cÑdÐdà#×LÑLÓNÐNà3˜4×3Ñ3°JÑGÀ$ÑGÐGØ˜uÒ$á¡iÜ$Ð%_Ó`Ð`ÙØ-˜4×-Ñ-ÑL¸ÐLÀtÑLÐLà×;Ñ;Ó=Ð=ä ð "6Ø8Bñ"Có Dð Dñ Ü Ð!>ÀÑ!EÓFÐFØ˜UÒ"Ø×.Ñ.¨xÓ8Ð8Ø˜uÒ$Ø×8Ñ8¸ÓBÐBØ˜vÒ%Ø×(Ñ(¨Ó2Ð2Ø˜uÒ$Ø—;‘;×)Ò)Ø×4Ñ4Ó6Ð6Ø—[‘[×.Ò.Ø×9Ñ9Ó;Ð;à×,Ñ,¨XÓ6Ð6à×+Ñ+¨HÓ5Ð5r   N)T)r   r   r   Ú__doc__rX   r^   ri   r[   ry   r   Úpropertyr%   r&   r\   r†   r’   r–   rš   rŸ   r¦   r±   r¶   r¹   r»   r½   rÍ   rØ   r   r   r    r"   r"   ;   s©   „ ñò*``òD+òò"#òò,ð ñó ðð
 ñó ðð
 ñó ðò
Fòò8
òò7ó$)ò6ò*5òOò6ò@ò=ó:U6r   r"   c                  óV  — | j                  d«      }t        |   }| j                  dt        «      }| rt        dt	        | «      z   «      ‚t        |   j
                  t        j                  k(  r |d«      }t        ||¬«      }|S t        |   j
                  t        j                  k(  r |d«      }t        ||¬«      }|S t        |   j
                  t        j                  k(  r9 |d«      }t        ||¬«      }t        |   j                  |j                  «       |S t        |   j
                  t        j                  k(  r9 |d«      }t        ||¬«      }t        |   j                  |j                  «       |S t        j                  d|j                   |¬	«      }t        ||¬
«      }|S )a1  Generate a new private key on the given curve.

    Args:

      curve (string):
        Mandatory. It must be a curve name defined in the `ECC table`_.

      randfunc (callable):
        Optional. The RNG to read randomness from.
        If ``None``, :func:`Crypto.Random.get_random_bytes` is used.
    r$   Úrandfuncr(   r*   ©r$   r&   r2   r7   r   )rm   rn   rÜ   )r$   r%   )r9   r   r   r=   r>   rC   rD   rE   r"   rL   rN   Úvalidater\   rO   r	   ro   rP   )rR   rT   r$   rÜ   r&   Únew_keyr%   s          r    Úgeneraterà   F  s|  € ð —‘˜GÓ$€JÜ�JÑ€EØ�z‰z˜*Ô&6Ó7€HÙÜÐ.´°V³Ñ<Ó=Ð=äˆzÑ×Ñ¤×!1Ñ!1Ò1Ù˜‹|ˆÜ˜z°Ô5ˆð$ €Nô# 
�Ñ	×	Ñ	¤8§>¡>Ò	1Ù˜‹|ˆÜ˜z°Ô5ˆð €Nô 
�Ñ	×	Ñ	¤8×#6Ñ#6Ò	6Ù˜‹|ˆÜ˜z°Ô5ˆÜ�
Ñ×$Ñ$ W§^¡^Ô4ð €Nô 
�Ñ	×	Ñ	¤8×#4Ñ#4Ò	4Ù˜‹|ˆÜ˜z°Ô5ˆÜ�
Ñ×$Ñ$ W§^¡^Ô4ð €Nô × Ñ ¨qØ/4¯{©{Ø*2ô4ˆô ˜z¨QÔ/ˆà€Nr   c                  ó´  — | d   }t         |   }| j                  dd«      }| j                  dd«      }d| v rt        d«      ‚|j                  t        j
                  k(  r9|�t        ||«      | d<   t        di | ¤Ž}|j                  |j                  «       |S |j                  t        j                  k(  r9|�t        ||«      | d<   t        di | ¤Ž}|j                  |j                  «       |S d||fvrt        |||«      | d<   t        di | ¤Ž}|j                  «       r9d| v r5|j                  |j                  z  }|j                  ||fk7  rt!        d«      ‚|S )	aÕ  Build a new ECC key (private or public) starting
    from some base components.

    In most cases, you will already have an existing key
    which you can read in with :func:`import_key` instead
    of this function.

    Args:
      curve (string):
        Mandatory. The name of the elliptic curve, as defined in the `ECC table`_.

      d (integer):
        Mandatory for a private key and a NIST P-curve (e.g., P-256).
        It must be an integer in the range ``[1..order-1]``.

      seed (bytes):
        Mandatory for a private key and curves Ed25519 (32 bytes),
        Curve25519 (32 bytes), Curve448 (56 bytes) and Ed448 (57 bytes).

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

      point_y (integer):
        The Y coordinate (affine) of the ECC point.
        Mandatory for a public key,
        except for Curve25519 and Curve448.

    Returns:
      :class:`EccKey` : a new ECC key object
    r$   Úpoint_xNÚpoint_yr'   zUnknown keyword: pointz(Private and public ECC keys do not matchr   )r   r9   r=   rC   rD   rN   r   r"   rÞ   r\   rO   r   r[   rq   r%   re   r?   )rR   rT   r$   râ   rã   rß   Úpub_keys          r    Ú	constructrå   p  s]  € ðB ˜‘€JÜ�JÑ€EØ�j‰j˜ DÓ)€GØ�j‰j˜ DÓ)€Gà�&ÑÜÐ0Ó1Ð1à‡x�x”8×&Ñ&Ò&àÐÜ'¨°Ó<ˆF�7‰OÜÑ"˜6Ñ"ˆØ�‰�w—~‘~Ô&ð, €Nð) 
�‰”X×&Ñ&Ò	&àÐÜ'¨°Ó<ˆF�7‰OÜÑ"˜6Ñ"ˆØ�‰�w—~‘~Ô&ð €Nð ˜ Ð)Ñ)Ü& w°¸ÓDˆF�7‰OÜÑ"˜6Ñ"ˆð ×ÑÔ  W°Ñ%6Ø—g‘g §	¡	Ñ)ˆGØ�z‰z˜g wÐ/Ò/Ü Ð!KÓLÐLà€Nr   c                 óF  — t        j                  «       D ]  \  }}|r|j                  |k(  r n'||k(  sŒ n |rt        d|z  «      ‚t        d|z  «      ‚|j                  j                  «       }t        | d   «      }|dk(  rVt        | «      dd|z  z   k7  rt        d«      ‚t        j                  | d|dz    «      }t        j                  | |dz   d «      }n½|d	v r®t        | «      d|z   k7  rt        d«      ‚t        j                  | dd «      }|d
z  |d
z  z
  |j                  z   j                  |j                  «      }|dk(  r|j                  «       r|j                  |z
  }|d
k(  r+|j                  «       r|j                  |z
  }nt        d«      ‚t        |||¬«      S )a  Convert an encoded EC point into an EccKey object

    ec_point: byte string with the EC point (SEC1-encoded)
    curve_oid: string with the name the curve
    curve_name: string with the OID of the curve

    Either curve_id or curve_name must be specified

    úUnsupported ECC curve (OID: %s)zUnsupported ECC curve (%s)r   é   r   r)   zIncorrect EC point lengthN©r)   é   rê   zIncorrect EC point encoding©r$   râ   rã   )r   Úitemsr�   r   ÚprŒ   r   rF   r?   r	   rK   ÚbÚsqrtr�   Úis_evenrå   )	Úec_pointÚ	curve_oidrT   Ú_curve_namer$   r�   Ú
point_typerd   rh   s	            r    Ú_import_public_derrõ   ·  sš  € ô &Ÿm™mžoÑˆ�UÙ˜Ÿ™ iÒ/ÙØ˜Ó$Ùð	 .ñ Ü'Ð(IÈIÑ(UÓVÐVä'Ð(DÀzÑ(QÓRÐRð —G‘G×)Ñ)Ó+€MÜ�h˜q‘kÓ"€Jð �TÒÜˆx‹=˜Q  ]Ñ!2Ñ2Ò3ÜÐ8Ó9Ð9Ü×Ñ˜x¨¨-¸©/Ð:Ó;ˆÜ×Ñ˜x¨°a©Ð(8Ð9Ó:‰à	�|Ñ	#Üˆx‹=˜Q Ñ.Ò/ÜÐ8Ó9Ð9Ü×Ñ˜x¨¨˜|Ó,ˆà�‰T�A�a‘C‰Z˜%Ÿ'™'Ñ!×'Ñ'¨¯©Ó0ˆØ˜Ò !§(¡(¤*Ø—‘˜!‘ˆAØ˜Ò !§)¡)¤+Ø—‘˜!‘‰AäÐ6Ó7Ð7ä˜;°¸1Ô=Ð=r   c                 ó
  — t        | «      \  }}}d}dt        fdt        fdœ}dt        fdt        fdœ}||v rA|st        d|z  «      ‚	 t        «       j                  |«      j                  }t        ||¬
«      S ||v r1||   \  }	}
|rt        d|z  «      ‚ |
|«      \  }}t        |||	¬«      S ||v r-||   \  }	}|rt        d|z  «      ‚ ||«      }t        ||	¬«      S t        d|z  «      ‚# t
        $ r t        d	«      ‚w xY w)z4Convert a subjectPublicKeyInfo into an EccKey object©rœ   z1.3.132.1.12z1.3.132.1.13ÚEd25519ÚEd448©z1.3.101.112z1.3.101.113Ú
Curve25519ÚCurve448©z1.3.101.110z1.3.101.111z%Missing ECC parameters for ECC OID %szError decoding namedCurve©rò   z(Unexpected ECC parameters for ECC OID %s)râ   rã   r$   )râ   r$   zUnsupported ECC OID: %s)r   Ú_import_ed25519_public_keyÚ_import_ed448_public_keyÚ_import_curve25519_public_keyÚ_import_curve448_public_keyr?   r
   ÚdecodeÚvaluerõ   rå   r   )ÚencodedrR   r�   rñ   rž   Únist_p_oidsÚ
eddsa_oidsÚxdh_oidsrò   rT   Úimport_eddsa_public_keyrd   rh   Úimport_xdh_public_keys                 r    Ú_import_subjectPublicKeyInfor  ï  s[  € ô <¸GÓDÑ€Cˆ�6ð€Kð "Ô#=Ð>ØÔ#;Ð<ñ€Jð
 %Ô&CÐDØ"Ô$?Ð@ñ€Hð
 ˆkÑñ ÜÐDÀsÑJÓKÐKð	:Ü#›×,Ñ,¨VÓ4×:Ñ:ˆIô
 " (°iÔ@Ð@à	�
Ñ	à.8¸©oÑ+ˆ
Ð+ñ ÜÐGÈ#ÑMÓNÐNá& xÓ0‰ˆˆ1Ü ¨A°ZÔ@Ð@à	�‰Ø,4°S©MÑ)ˆ
Ð)ñ ÜÐGÈ#ÑMÓNÐNá! (Ó+ˆÜ ¨*Ô5Ð5ô $Ð$=ÀÑ$CÓDÐDøô9 ò 	:ÜÐ8Ó9Ð9ð	:ús   Á	#C- Ã-Dc                 ó¼  — t        «       j                  | d¬«      }|d   dk7  rt        d«      ‚t        «       j                  |d   «      j                  }d}|t        |«      k  rB	 t        d¬«      j                  ||   «      j                  }|�||k7  rt        d«      ‚|}|dz  }|€t        d	«      ‚t        j                  «       D ]  \  }}|j                  |k(  sŒ n t        d
|z  «      ‚|j                  j                  «       }	t        |«      |	k7  rt        d«      ‚d x}
}|t        |«      k  rg	 t        d¬«      j                  ||   «      j                  }t        ||¬«      }|j                   j"                  }
|j                   j$                  }|dz  }t'        j(                  |«      }t+        |||
|¬«      S # t        $ r Y �Œ$w xY w# t        $ r Y Œ?w xY w)N©r)   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$   r%   râ   rã   )r   r  r?   r   ÚpayloadrF   r
   r  r   rì   r�   r   rí   rŒ   r   rõ   r\   rd   rh   r	   rK   rå   )r  rª   rò   Úec_private_keyÚscalar_bytesÚnext_elementÚ
parametersrT   r$   r�   râ   rã   Úpublic_key_encr†   r%   s                  r    Ú_import_rfc5915_derr  2  sé  € ô !“]×)Ñ)¨'¸yÐ)ÓI€NØ�aÑ˜AÒÜÐ<Ó=Ð=ä!Ó#×*Ñ*¨>¸!Ñ+<Ó=×EÑE€Là€Lð ”c˜.Ó)Ò)ð	Ü$¨aÔ0×7Ñ7¸À|Ñ8TÓU×[Ñ[ˆJØÐ$¨°yÒ)@Ü Ð!1Ó2Ð2Ø"ˆIØ˜AÑˆLð ÐÜÐ)Ó*Ð*ä$Ÿ]™]ž_Ñˆ
�EØ�9‰9˜	Ó!Ùð -ô $Ð$EÈ	Ñ$QÓRÐRà—G‘G×)Ñ)Ó+€MÜ
ˆ<Ó˜MÒ)ÜÐ3Ó4Ð4ð Ð€GˆgØ”c˜.Ó)Ò)ð	Ü)°1Ô5×<Ñ<¸^ÈLÑ=YÓZ×`Ñ`ˆNÜ+¨NÀiÔPˆJØ ×'Ñ'×)Ñ)ˆGØ ×'Ñ'×)Ñ)ˆGØ˜AÑˆLô 	×Ñ˜<Ó(€AÜ˜:¨°GÀWÔMÐMøô; ò 	Úð	ûô2 ò 	Ùð	ús&   Á&AF? Ä5A&G Æ?	GÇGÇ	GÇGc                 óþ  — ddl m} |j                  | |«      \  }}}d}dddœ}ddd	œ}||v r0t        «       j	                  |«      j
                  }	t        |||	«      S ||v rB|�t        d
«      ‚d }	t        «       j	                  |«      j                  }
t        ||   |
¬«      S ||v rJ||   }|�t        d|z  «      ‚d }	t        «       j	                  |«      j                  }
t        ||   |
¬«      S t        d|z  «      ‚)Nr   r¨   r÷   rø   rù   rú   rû   rü   rý   z.EdDSA ECC private key must not have parametersrÝ   z+%s ECC private key must not have parametersz!Unsupported ECC purpose (OID: %s))r­   r©   Úunwrapr
   r  r  r  r?   r   r  rå   r   )r  rª   r©   Úalgo_oidr°   rž   r  r  r  rò   r&   rT   s               r    Ú_import_pkcs8r  m  s-  € Ýà$)§L¡L°¸*Ó$EÑ!€Hˆk˜6ð€Kð !Øñ€Jð
 $Ø!ñ€Hð
 �;ÑÜ“M×(Ñ(¨Ó0×6Ñ6ˆ	Ü" ;°
¸IÓFÐFØ	�ZÑ	ØÐÜÐMÓNÐNØˆ	ÜÓ×&Ñ& {Ó3×;Ñ;ˆÜ˜z¨(Ñ3¸$Ô?Ð?Ø	�XÑ	Ø˜hÑ'ˆ
ØÐÜÐJØ'ñ(ó )ð )àˆ	ÜÓ×&Ñ& {Ó3×;Ñ;ˆÜ˜x¨Ñ1¸Ô=Ð=ä#Ð$GÈ(Ñ$RÓSÐSr   c                 ó.   — t        | «      }t        |«      S r„   )r   r  )r  rR   Úsp_infos      r    Ú_import_x509_certr  •  s   € ä.¨wÓ7€GÜ'¨Ó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 t        d«      ‚w xY w)NzNot an ECC DER key)r  r   r?   r=   Ú
IndexErrorr  r  r  )r  rª   Úerrs      r    Ú_import_derr   ›  sò   € ðÜ+¨G°ZÓ@Ð@øÜ ò Øˆ	ûÜœ	¤:Ð.ò ÙðúðÜ  ¨*Ó5Ð5øÜ ò Øˆ	ûÜœ	¤:Ð.ò ÙðúðÜ" 7¨JÓ7Ð7øÜ ò Øˆ	ûÜœ	¤:Ð.ò ÙðúðÜ˜W jÓ1Ð1øÜ ò Øˆ	ûÜœ	¤:Ð.ò Øä
Ð)Ó
*Ð*ðúsm   ‚ Ž	3—™3²3·A Á	A(ÁAÁA(Á'A(Á,A8 Á8	BÂBÂBÂBÂ!B- Â-	CÂ6B8Â8CÃCc                 ó¨  — | j                  d«      }t        |«      dvrt        d«      ‚	 t        j                  |d   «      }g }t        |«      dkD  rJt        j                  d|d d «      d   }|j                  |dd|z    «       |d|z   d  }t        |«      dkD  rŒJ|d   |d   k7  rt        d«      ‚|d   j                  d	«      r t        j                  «       D ]_  \  }}|j                  €Œ|j                  j                  d
«      sŒ/t        |j                  j                  d«      d   «      }|d   |k(  sŒ_ n t        dz   «      ‚t        |d   |j                  ¬«      }|S |d   dk(  r!t        |d   «      \  }	}
t!        d|	|
¬«      }|S t        d|d   z   «      ‚# t"        t$        t        j&                  f$ r t        d|d   z   «      ‚w xY w)Nó    ré   zNot an openssh public keyr   rè   rÁ   r   zMismatch in openssh public keyó   ecdsa-sha2-ú
ecdsa-sha2rÀ   r)   zUnsupported ECC curve: rþ   ó   ssh-ed25519rø   rë   zUnsupported SSH key type: zError parsing SSH key type: )rÄ   rF   r?   rb   Ú
a2b_base64rÆ   ÚunpackÚappendÚ
startswithr   rì   rÃ   r   rõ   r�   rÿ   rå   r  r=   ÚError)r  ÚpartsÚ	keystringÚkeypartsÚlkrT   r$   rË   Úecc_keyrd   rh   s              r    Ú_import_openssh_publicr0  ¼  sä  € Ø�M‰M˜$Ó€EÜ
ˆ5ƒz˜ÑÜÐ4Ó5Ð5ð$DÜ×'Ñ'¨¨a©Ó1ˆ	àˆÜ�)‹n˜qÒ Ü—‘˜t Y¨r° ]Ó3°AÑ6ˆBØ�O‰O˜I a¨¨B©Ð/Ô0Ø! ! b¡& 'Ð*ˆIô �)‹n˜qÓ ð
 �‰8�x ‘{Ò"ÜÐ=Ó>Ð>ð �‰8×Ñ˜~Ô.ä%,§]¡]¦_Ñ!�
˜EØ—=‘=Ð(ØØ—}‘}×/Ñ/°Ô=ØÜ  §¡×!4Ñ!4°SÓ!9¸!Ñ!<Ó=�Ø˜A‘; &Ó(Ùð &5ô !Ð!:¸VÑ!CÓDÐDä(¨°!©ÀÇ	Á	ÔJˆGð €Nð �1‰X˜Ò'Ü-¨h°q©kÓ:‰DˆAˆqÜ i¸ÀAÔFˆGð €Nô Ð9¸EÀ!¹HÑDÓEÐEøäœ	¤8§>¡>Ð2ò DÜÐ7¸%À¹(ÑBÓCÐCðDús%   «A1F! ÂBF! Ä:+F! Å''F! ÆF! Æ!0Gc                 óö  — ddl m}m}m}m}  || |«      \  }}ddt
        dfi}|j                  d«      rÞ ||«      \  }	}|	t        vrt        d|	z  «      ‚t        |	   }
|
j                  dz   d	z  } ||«      \  }}t        |d
   «      dk7  rt        d«      ‚t        |«      d|z  dz   k7  rt        d«      ‚t        j                  |dd|z    «      }t        j                  |d|z   d  «      } ||«      \  }}t        j                  |«      }||	dœ}nG||v r5||   \  }}} ||«      \  }} ||«      \  }} ||«      \  }}|d | }||dœ}nt        d|z   «      ‚ ||«      \  }} ||«       t        d||dœ|¤ŽS )Nr   )Úimport_openssh_private_genericÚ
read_bytesÚread_stringÚcheck_paddingr¿   rø   r*   r$  zUnsupported ECC curve %sr”   é   r   rè   z/Only uncompressed OpenSSH EC keys are supportedr)   zIncorrect public key length)r%   r$   )r&   r$   zUnsupport SSH agent key type:)râ   rã   r   )Ú_opensshr2  r3  r4  r5  rÿ   r)  r   r   Úmodulus_bitsr   r?   rF   r	   rK   rå   )ÚdataÚpasswordr2  r3  r4  r5  Úkey_typeÚ	decryptedÚ
eddsa_keysÚecdsa_curve_namer$   r�   r†   râ   rã   r°   r%   rž   rT   r	  Úseed_lenÚprivate_public_keyr&   Ú_Úpaddeds                            r    Ú_import_openssh_private_eccrC  ê  sÚ  € ÷Có Cñ 9¸¸xÓHÑ€Hˆið 	˜	Ô#=¸rÐBð€Jð
 ×Ñ˜<Ô(á&1°)Ó&<Ñ#Ð˜)Ø¤7Ñ*Ü'Ð(BÐEUÑ(UÓVÐVÜÐ(Ñ)ˆØ×+Ñ+¨aÑ/°AÑ5ˆá *¨9Ó 5Ñˆ
�Iä�
˜1‘Ó !Ò#ÜÐNÓOÐOÜˆz‹?˜a -Ñ/°!Ñ3Ò3ÜÐ:Ó;Ð;ä×$Ñ$ Z°°!°M±/Ð%BÓCˆÜ×$Ñ$ Z°°-±Ð0@Ð%AÓBˆá!+¨IÓ!6Ñˆ�YÜ×Ñ˜{Ó+ˆàÐ#3Ñ4‰à	�ZÑ	à8BÀ8Ñ8LÑ5ˆ
Ð+¨Xá *¨9Ó 5Ñˆ
�IÙ2°:Ó>Ñˆ�á(2°9Ó(=Ñ%Ð˜IØ! ) 8Ð,ˆà¨Ñ4‰äÐ8¸8ÑCÓDÐDá˜IÓ&�I€A€vÙ�&ÔäÐ@˜W¨gÑ@¸Ñ@Ð@r   c                 óÒ  — t        | «      dk7  rt        d«      ‚t        d«      }d}t        | «      }|d   dz	  }|dxx   dz  cc<   t        j                  |d¬	«      }||k\  rt        d
«      ‚|dk(  ry|dz  dz
  |z  }|dz  |z  |z  dz   |z  }	 |j                  |«      }||z  |z  }	t        j                  |	|«      }
|
dz  |k7  r||
z
  }
|
|fS # t        $ r t        d«      ‚w xY w)ai  Import an Ed25519 ECC public key, encoded as raw bytes as described
    in RFC8032_.

    Args:
      encoded (bytes):
        The Ed25519 public key to import. It must be 32 bytes long.

    Returns:
      x and y (integer)

    Raises:
      ValueError: when the given key cannot be parsed.

    .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032
    r*   z9Incorrect length. Only Ed25519 public keys are supported.l   íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿl   £x²&(7Z/·
;(P8 ÑsÝe:Ì8ÎÛ
w6Rr,   r”   r-   r/   r0   zInvalid Ed25519 key (y)r   ©r   r   r)   zInvalid Ed25519 public key)rF   r?   r	   rJ   rK   rp   Ú_tonelli_shanks©r  rí   r%   rh   Úx_lsbrã   ÚuÚvÚv_invÚx2râ   s              r    rÿ   rÿ   !  s  € ô" ˆ7ƒ|�rÒÜÐTÓUÐUäÐRÓS€AØU€Aä�'Ó€AØˆb‰E�Q‰J€EØ€bƒEˆT�MƒEÜ× Ñ  ¨hÔ7€GØ�!‚|ÜÐ2Ó3Ð3Ø�!‚|Øà	�!‰�a‰˜1Ñ€AØ
�1‰*�q‰.˜AÑ	 Ñ	! QÑ&€Að7Ø—	‘	˜!“ˆØ�%‰i˜1‰_ˆÜ×)Ñ)¨"¨aÓ0ˆØ�a‰K˜EÒ!Ø˜'‘kˆGð �GÐÐøô ò 7ÜÐ5Ó6Ð6ð7ús   Â<C ÃC&c                 ó–   — t        | «      dk7  rt        d«      ‚t        | «      }|dxx   dz  cc<   t        j                  |d¬«      }|S )ah  Import a Curve25519 ECC public key,
    encoded as raw bytes as described in RFC7748_.

    Args:
      encoded (bytes):
        The Curve25519 public key to import. It must be 32 bytes long.

    Returns:
      x (integer)

    Raises:
      ValueError: when the given key cannot be parsed.

    .. _RFC7748: https://datatracker.ietf.org/doc/html/rfc7748
    r*   zIncorrect Curve25519 key lengthr,   r-   r/   r0   )rF   r?   rJ   r	   rK   )r  rd   râ   s      r    r  r  N  sJ   € ô" ˆ7ƒ|�rÒÜÐ:Ó;Ð;ä�'Ó€Aà€bƒEˆT�MƒEÜ× Ñ  ¨hÔ7€Gà€Nr   c                 óf   — t        | «      dk7  rt        d«      ‚t        j                  | d¬«      }|S )ad  Import a Curve448 ECC public key,
    encoded as raw bytes as described in RFC7748_.

    Args:
      encoded (bytes):
        The Curve448 public key to import. It must be 56 bytes long.

    Returns:
      x (integer)

    Raises:
      ValueError: when the given key cannot be parsed.

    .. _RFC7748: https://datatracker.ietf.org/doc/html/rfc7748
    r7   zIncorrect Curve448 key lengthr/   r0   )rF   r?   r	   rK   )r  râ   s     r    r  r  j  s3   € ô" ˆ7ƒ|�rÒÜÐ8Ó9Ð9ä× Ñ  °HÔ=€Gà€Nr   c                 óÔ  — t        | «      dk7  rt        d«      ‚t        d   j                  }|dz
  }| dd }t	        | d   «      dz	  }t        j                  |d¬	«      }||k\  rt        d
«      ‚|dk(  ry|dz  dz
  |z  }|dz  |z  |z  dz
  |z  }	 |j                  |«      }||z  |z  }	t        j                  |	|«      }
|
dz  |k7  r||
z
  }
|
|fS # t        $ r t        d«      ‚w xY w)ag  Import an Ed448 ECC public key, encoded as raw bytes as described
    in RFC8032_.

    Args:
      encoded (bytes):
        The Ed448 public key to import. It must be 57 bytes long.

    Returns:
        x and y (integer)

    Raises:
      ValueError: when the given key cannot be parsed.

    .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032
    r2   z7Incorrect length. Only Ed448 public keys are supported.Úcurve448i©˜  Nr7   r”   r/   r0   zInvalid Ed448 key (y)r   rE  r)   zInvalid Ed448 public key)	rF   r?   r   rí   r   r	   rK   rp   rF  rG  s              r    r   r   ƒ  s   € ô" ˆ7ƒ|�rÒÜÐRÓSÐSä�
Ñ×Ñ€AØ	ˆE‰	€Aà��ˆ€AÜ�˜‘Ó Ñ"€EÜ× Ñ  ¨hÔ7€GØ�!‚|ÜÐ0Ó1Ð1Ø�!‚|Øà	�!‰�a‰˜1Ñ€AØ
�1‰*�q‰.˜AÑ	 Ñ	! QÑ&€Að5Ø—	‘	˜!“ˆØ�%‰i˜1‰_ˆÜ×)Ñ)¨"¨aÓ0ˆØ�a‰K˜EÒ!Ø˜'‘kˆGð �GÐÐøô ò 5ÜÐ3Ó4Ð4ð5ús   Â<C ÃC'c                 ó
  — ddl m} t        | «      } |�t        |«      }| j                  d«      r/t	        | «      }|j                  ||«      \  }}}t        ||«      }|S | j                  d«      ret	        | «      }d}	d}
t        j                  |	dz   |
z   d	|t        j                  ¬
«      }|j                  ||«      \  }}}|rd}	 t        ||«      }|S | j                  d«      rt        | «      S t        | «      dkD  rt        | d   «      dk(  rt        | |«      S t        | «      dkD  r*t        | d   «      dv r|€t        d«      ‚t!        | |¬«      S t        d«      ‚# t        $ r}|‚d}~wt        $ r t        d«      ‚w xY w)ap  Import an ECC key (public or private).

    Args:
      encoded (bytes or multi-line string):
        The ECC key to import.
        The function will try to automatically detect the right format.

        Supported formats for an ECC **public** key:

        * X.509 certificate: binary (DER) or ASCII (PEM).
        * X.509 ``subjectPublicKeyInfo``: binary (DER) or ASCII (PEM).
        * SEC1_ (or X9.62), as ``bytes``. NIST P curves only.
          You must also provide the ``curve_name`` (with a value from the `ECC table`_)
        * OpenSSH line, defined in RFC5656_ and RFC8709_ (ASCII).
          This is normally the content of files like ``~/.ssh/id_ecdsa.pub``.

        Supported formats for an ECC **private** key:

        * A binary ``ECPrivateKey`` structure, as defined in `RFC5915`_ (DER).
          NIST P curves only.
        * A `PKCS#8`_ structure (or the more recent Asymmetric Key
          Package, RFC5958_): binary (DER) or ASCII (PEM).
        * `OpenSSH 6.5`_ and newer versions (ASCII).

        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 (not recommended)
        or at the PKCS#8 level (recommended).
        This parameter is ignored if the key in input is not encrypted.

      curve_name (string):
        For a SEC1 encoding only. This is the name of the curve,
        as defined in the `ECC table`_.

    .. note::

        To import EdDSA private and public keys, when encoded as raw ``bytes``, use:

        * :func:`Crypto.Signature.eddsa.import_public_key`, or
        * :func:`Crypto.Signature.eddsa.import_private_key`.

    .. note::

        To import X25519/X448 private and public keys, when encoded as raw ``bytes``, use:

        * :func:`Crypto.Protocol.DH.import_x25519_public_key`
        * :func:`Crypto.Protocol.DH.import_x25519_private_key`
        * :func:`Crypto.Protocol.DH.import_x448_public_key`
        * :func:`Crypto.Protocol.DH.import_x448_private_key`

    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: https://datatracker.ietf.org/doc/html/rfc1421
    .. _RFC1423: https://datatracker.ietf.org/doc/html/rfc1423
    .. _RFC5915: https://datatracker.ietf.org/doc/html/rfc5915
    .. _RFC5656: https://datatracker.ietf.org/doc/html/rfc5656
    .. _RFC8709: https://datatracker.ietf.org/doc/html/rfc8709
    .. _RFC5958: https://datatracker.ietf.org/doc/html/rfc5958
    .. _`PKCS#8`: https://datatracker.ietf.org/doc/html/rfc5208
    .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf
    .. _SEC1: https://www.secg.org/sec1-v2.pdf
    r   r³   Ns   -----BEGIN OPENSSH PRIVATE KEYs   -----z-----BEGIN EC PARAMETERS-----z-----END EC PARAMETERS-----z.*?r`   )Úflagsz(Invalid DER encoding inside the PEM file)r#  r%  é0   r  zNo curve name was provided)rT   zECC key format is not supported)r­   r´   r   r)  r   r  rC  ÚreÚsubÚDOTALLr   r   r?   r0  rF   r   rõ   )r  rª   rT   r´   Útext_encodedÚopenssh_encodedÚmarkerÚenc_flagrg   Úecparams_startÚecparams_endÚder_encodedÚuefs                r    Ú
import_keyr_  ¯  s¥  € õR ä�gÓ€GØÐÜ˜ZÓ(ˆ
ð ×ÑÐ;Ô<Ü˜W“~ˆØ,/¯J©J°|ÀZÓ,PÑ)ˆ˜ Ü,¨_¸jÓIˆØˆà	×	Ñ	˜HÔ	%ä˜W“~ˆð 9ˆØ4ˆÜ—v‘v˜n¨uÑ4°|ÑCÀRØ*Ü$&§I¡Iô/ˆð ),¯
©
°<ÀÓ(LÑ%ˆ�V˜XÙØˆJð	IÜ  ¨jÓ9ˆFð
 ˆð ×ÑÐ:Ô;Ü% gÓ.Ð.ô ˆ7ƒ|�aÒœD ¨¡Ó,°Ò4Ü˜7 JÓ/Ð/ô ˆ7ƒ|�aÒœD ¨¡Ó,Ð0BÑBØÐÜÐ9Ó:Ð:Ü! '°jÔAÐAä
Ð6Ó
7Ð7øô) %ò 	ØˆIûÜò 	IÜÐGÓHÐHð	Iús   ÃE Å	FÅ(E*Å*FÚ__main__l   ýö_,)¶NÌ$ÔcÐhKf-5lk<X÷k©#E Úp256i¸  z	(P-256 G)iè  Úmsz(P-256 arbitrary point))NNr„   )@Ú
__future__r   rT  rÆ   rb   ÚCrypto.Util.py3compatr   r   r   r   r   ÚCrypto.Math.Numbersr	   ÚCrypto.Util.asn1r
   r   r   r   ÚCrypto.PublicKeyr   r   r   ÚCrypto.Hashr   r   ÚCrypto.Randomr   r<   r   r   r   r   rD   r?   r   Úobjectr"   rà   rå   rõ   r  r  r  r  r   r0  rC  rÿ   r  r  r   r_  r   Útimer%   rq   rÕ   r'   rU   ÚstartÚrangerd   ÚpointXÚprintr   r   r    Ú<module>rp     s  ðõ> &ã 	Û Û ç GÕ Gå '÷,ó ,÷@ñ @÷ )å *ç 0Ñ 0Ý 'ô	˜Jô 	ôH6ˆVô H6òV'òTDóN5>òp@EóF8Nòv%TòP1ò+òB+ò\4Aòn*òZò8ò2)óX{8ð| ˆzÒãàJ€Aà�F‰O×Ñ×"Ñ"Ó$€EØ€EàˆD�I‰I‹K€EÙ�5Ž\ˆØ˜‘‰ð á	ˆ+˜	˜Ÿ	™	› eÑ+¨uÑ4°tÑ;¸TÔBàˆD�I‰I‹K€EÙ�5Ž\ˆØ˜!‘‰ð á	Ð
# i d§i¡i£k°EÑ&9¸UÑ%BÀTÑ%IÈ4ÕPð# r   