ó
    &ÝNjL,  ã                   óÖ   • S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	J
r
  SSKJr  SSKJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr   " S S5      r " S S5      r " S S\5      rg)z
ECDSA keys
é    )ÚOptional)ÚInvalidSignatureÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚserialization)Úec)Údecode_dss_signatureÚencode_dss_signature)Ú	four_byte)ÚMessage)ÚPKey)ÚSSHException)Údeflate_longc                   ó   • \ rS rSrSrS rSrg)Ú_ECDSACurveé)   zØ
Represents a specific ECDSA Curve (nistp256, nistp384, etc).

Handles the generation of the key format identifier and the selection of
the proper hash function. Also grabs the proper curve from the 'ecdsa'
package.
c                 ó(  • X l         UR                  U l        SU R                   -   U l        U R                  S::  a  [        R
                  U l        O;U R                  S::  a  [        R                  U l        O[        R                  U l        Xl	        g )Núecdsa-sha2-é   i€  )
Ú	nist_nameÚkey_sizeÚ
key_lengthÚkey_format_identifierr   ÚSHA256Úhash_objectÚSHA384ÚSHA512Úcurve_class)Úselfr   r   s      ÚN/home/mande/repo/quber/.venv/lib/python3.13/site-packages/paramiko/ecdsakey.pyÚ__init__Ú_ECDSACurve.__init__2   sk   € Ø"ŒØ%×.Ñ.ˆŒð &3°T·^±^Ñ%CˆÔ"ð �?‰?˜cÓ!Ü%Ÿ}™}ˆDÕØ�_‰_ Ó#Ü%Ÿ}™}ˆDÕä%Ÿ}™}ˆDÔà&Õó    )r   r   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   Ú__static_attributes__© r$   r!   r   r   )   s   † ñõ'r$   r   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
Ú_ECDSACurveSetéD   z 
A collection to hold the ECDSA curves. Allows querying by oid and by key
format identifier. The two ways in which ECDSAKey needs to be able to look
up curves.
c                 ó   • Xl         g ©N©Úecdsa_curves)r    r2   s     r!   r"   Ú_ECDSACurveSet.__init__K   s   € Ø(Õr$   c                 óX   • U R                    Vs/ s H  oR                  PM     sn$ s  snf r0   ©r2   r   )r    Úcurves     r!   Úget_key_format_identifier_listÚ-_ECDSACurveSet.get_key_format_identifier_listN   s&   € Ø9=×9JÒ9JÓKÒ9J°×+Ô+Ñ9JÑKÐKùÒKs   �'c                 óR   • U R                    H  nUR                  U:X  d  M  Us  $    g r0   )r2   r   )r    r   r6   s      r!   Úget_by_curve_classÚ!_ECDSACurveSet.get_by_curve_classQ   s%   € Ø×&Ô&ˆEØ× Ñ  KÕ/Ø’ò 'r$   c                 óR   • U R                    H  nUR                  U:X  d  M  Us  $    g r0   r5   )r    r   r6   s      r!   Úget_by_key_format_identifierÚ+_ECDSACurveSet.get_by_key_format_identifierV   s&   € Ø×&Ô&ˆEØ×*Ñ*Ð.CÕCØ’ò 'r$   c                 óR   • U R                    H  nUR                  U:X  d  M  Us  $    g r0   )r2   r   )r    r   r6   s      r!   Úget_by_key_lengthÚ _ECDSACurveSet.get_by_key_length[   s%   € Ø×&Ô&ˆEØ×Ñ :Õ-Ø’ò 'r$   r1   N)r%   r&   r'   r(   r)   r"   r7   r:   r=   r@   r*   r+   r$   r!   r-   r-   D   s!   † ñò)òLòò
õ
r$   r-   c                   ó’  • \ rS rSrSr\" \" \R                  S5      \" \R                  S5      \" \R                  S5      /5      r       SS jr\S 5       r\S	 5       rS
 rS r\S 5       rS rS rS rSS jrS r\S\\R4                     4S j5       r\\R                  " 5       SS4S j5       rS rS rS rS r S r!Sr"g)ÚECDSAKeyéa   zP
Representation of an ECDSA key which can be used to sign and verify SSH2
data.
Únistp256Únistp384Únistp521Nc                 óð  • S U l         S U l        S U l        Ub  U R                  Xd5        g Ub  U R	                  X45        g Uc  Ub  [        U5      nUbP  Uu  U l        U l         U R                  R                  R                  nU R                  R                  U5      U l
        g UR                  5       n	Sn
U	R                  U
5      (       a  U	S [        U
5      *  n	U R                  R                  U	5      U l
        U R                  R                  5       nU Vs/ s H  nSR!                  U5      PM     nnU R#                  XUS9  UR                  5       nXàR                  R$                  :w  a  ['        SR!                  U5      5      eUR)                  5       n [*        R,                  R/                  U R                  R1                  5       U5      nUU l         g s  snf ! [2         a    ['        S5      ef = f)Nz-cert-v01@openssh.comz{}-cert-v01@openssh.com)ÚmsgÚkey_typeÚ	cert_typezCan't handle curve of type {}zInvalid public key)Úverifying_keyÚsigning_keyÚpublic_blobÚ_from_private_keyÚ_from_private_key_filer   r6   Ú	__class__Ú_ECDSA_CURVESr:   Úecdsa_curveÚget_textÚendswithÚlenr=   r7   ÚformatÚ_check_type_and_load_certr   r   Ú
get_binaryr	   ÚEllipticCurvePublicKeyÚfrom_encoded_pointr   Ú
ValueError)r    rI   ÚdataÚfilenameÚpasswordÚvalsÚfile_objÚvalidate_pointÚc_classrJ   ÚsuffixÚ	key_typesÚxÚ
cert_typesÚ	curvenameÚ	pointinfoÚkeys                    r!   r"   ÚECDSAKey.__init__o   sñ  € ð "ˆÔØˆÔØˆÔØÑØ×"Ñ" 8Ô6ØØÑØ×'Ñ'¨Ô;ØØ‰K˜dÑ.Ü˜$“-ˆCØÑØ37Ñ0ˆDÔ˜dÔ0Ø×&Ñ&×,Ñ,×6Ñ6ˆGØ#×1Ñ1×DÑDÀWÓMˆDÕð —|‘|“~ˆHð
 -ˆFØ× Ñ  ×(Ñ(Ø# N¤s¨6£{ lÐ3�Ø#×1Ñ1×NÑNØó ˆDÔð ×*Ñ*×IÑIÓKˆIá=FóÚ=F¸Ð)×0Ñ0°Ö3¹Yð ð ð ×*Ñ*Ø°zð +ñ ð Ÿ™›ˆIØ×,Ñ,×6Ñ6Ó6Ü"Ø3×:Ñ:¸9ÓEóð ð Ÿ™Ó(ˆIð9Ü×/Ñ/×BÑBØ×$Ñ$×0Ñ0Ó2°Ió�ð &)�Õ"ùò#øô$ ó 9Ü"Ð#7Ó8Ð8ð9ús   ÄGÆ?G ÇG5c                 ó6   • U R                   R                  5       $ r0   )rR   r7   ©Úclss    r!   ÚidentifiersÚECDSAKey.identifiers®   s   € à× Ñ ×?Ñ?ÓAÐAr$   c                 ó"   • U R                  5       $ r0   )ro   rm   s    r!   Ú supported_key_format_identifiersÚ)ECDSAKey.supported_key_format_identifiers³   s   € à�‰Ó Ð r$   c                 ó  • U R                   n[        5       nUR                  U R                  R                  5        UR                  U R                  R
                  5        UR                  5       nUR                  R                  S-   S-  n[        UR                  SS9nSU[        U5      -
  -  U-   n[        UR                  SS9nSU[        U5      -
  -  U-   n[        U-   U-   nUR                  U5        UR                  5       $ )Né   é   F)Úadd_sign_paddingó    )rL   r   Ú
add_stringrS   r   r   Úpublic_numbersr6   r   r   rf   rV   Úyr   Úasbytes)r    rj   ÚmÚnumbersÚkey_size_bytesÚx_bytesÚy_bytesÚ	point_strs           r!   r|   ÚECDSAKey.asbytes·   sâ   € Ø× Ñ ˆÜ‹IˆØ	�‰�T×%Ñ%×;Ñ;Ô<Ø	�‰�T×%Ñ%×/Ñ/Ô0à×$Ñ$Ó&ˆàŸ)™)×,Ñ,¨qÑ0°QÑ6ˆä˜wŸy™y¸5ÑAˆØ˜^¬c°'«lÑ:Ñ;¸gÑEˆä˜wŸy™y¸5ÑAˆØ˜^¬c°'«lÑ:Ñ;¸gÑEˆä Ñ'¨'Ñ1ˆ	Ø	�‰�YÔØ�y‰y‹{Ðr$   c                 ó"   • U R                  5       $ r0   )r|   ©r    s    r!   Ú__str__ÚECDSAKey.__str__Ë   s   € Ø�|‰|‹~Ðr$   c                 ó°   • U R                  5       U R                  R                  5       R                  U R                  R                  5       R                  4$ r0   )Úget_namerL   rz   rf   r{   r…   s    r!   Ú_fieldsÚECDSAKey._fieldsÎ   sG   € ð �M‰M‹OØ×Ñ×-Ñ-Ó/×1Ñ1Ø×Ñ×-Ñ-Ó/×1Ñ1ð
ð 	
r$   c                 ó.   • U R                   R                  $ r0   )rS   r   r…   s    r!   r‰   ÚECDSAKey.get_nameÖ   s   € Ø×Ñ×5Ñ5Ð5r$   c                 ó.   • U R                   R                  $ r0   )rS   r   r…   s    r!   Úget_bitsÚECDSAKey.get_bitsÙ   s   € Ø×Ñ×*Ñ*Ð*r$   c                 ó   • U R                   S L$ r0   ©rM   r…   s    r!   Úcan_signÚECDSAKey.can_signÜ   s   € Ø×Ñ tÐ+Ð+r$   c                 óP  • [         R                  " U R                  R                  5       5      nU R                  R                  X5      n[        U5      u  pV[        5       nUR                  U R                  R                  5        UR                  U R                  XV5      5        U$ r0   )r	   ÚECDSArS   r   rM   Úsignr
   r   ry   r   Ú
_sigencode)r    r]   Ú	algorithmÚecdsaÚsigÚrÚsr}   s           r!   Úsign_ssh_dataÚECDSAKey.sign_ssh_dataß   sz   € Ü—’˜×)Ñ)×5Ñ5Ó7Ó8ˆØ×Ñ×#Ñ# DÓ0ˆÜ# CÓ(‰ˆä‹IˆØ	�‰�T×%Ñ%×;Ñ;Ô<Ø	�‰�T—_‘_ QÓ*Ô+Øˆr$   c                 ód  • UR                  5       U R                  R                  :w  a  gUR                  5       nU R	                  U5      u  pE[        XE5      n U R                  R                  Xa[        R                  " U R                  R                  5       5      5        g! [         a     gf = f)NFT)rT   rS   r   rY   Ú
_sigdecoder   rL   Úverifyr	   r–   r   r   )r    r]   rI   r›   ÚsigRÚsigSÚ	signatures          r!   Úverify_ssh_sigÚECDSAKey.verify_ssh_sigé   s”   € Ø�<‰<‹>˜T×-Ñ-×CÑCÓCØØ�n‰nÓˆØ—_‘_ SÓ)‰
ˆÜ(¨Ó4ˆ	ð	Ø×Ñ×%Ñ%Ø¤§¢¨$×*:Ñ*:×*FÑ*FÓ*HÓ!Iôð øô  ó 	Ùð	ús   ÁAB" Â"
B/Â.B/Úreturnc                 ó   • U R                   $ r0   r’   r…   s    r!   Úprivate_keyÚECDSAKey.private_keyù   s   € à×ÑÐr$   c                 ó  • UbH  U R                   R                  U5      nUc  [        SR                  U5      5      eUR	                  5       n[
        R                  " U[        5       S9n[        XDR                  5       4S9$ )zß
Generate a new private ECDSA key.  This factory function can be used to
generate a new host key or authentication key.

:param progress_func: Not used for this type of key.
:returns: A new private key (`.ECDSAKey`) object
zUnsupported key length: {:d})Úbackend)r`   )
rR   r@   r\   rW   r   r	   Úgenerate_private_keyr   rC   Ú
public_key)rn   r6   Úprogress_funcÚbitsrª   s        r!   ÚgenerateÚECDSAKey.generateý   sv   € ð ÑØ×%Ñ%×7Ñ7¸Ó=ˆEØ‰}Ü Ð!?×!FÑ!FÀtÓ!LÓMÐMØ×%Ñ%Ó'ˆEä×-Ò-¨e¼_Ó=NÑOˆÜ˜k×+AÑ+AÓ+CÐDÑEÐEr$   c                 óJ   • U R                  SX5      nU R                  U5        g ©NÚEC)Ú_read_private_key_fileÚ_decode_key)r    r^   r_   r]   s       r!   rP   ÚECDSAKey._from_private_key_file  s"   € Ø×*Ñ*¨4°ÓDˆØ×Ñ˜Õr$   c                 óJ   • U R                  SX5      nU R                  U5        g rµ   )Ú_read_private_keyr¸   )r    ra   r_   r]   s       r!   rO   ÚECDSAKey._from_private_key  s"   € Ø×%Ñ% d¨HÓ?ˆØ×Ñ˜Õr$   c                 ó>  • Uu  p!X R                   :X  a    [        R                  " US [        5       S9nO¼X R                  :X  aœ   [        U5      nUR                  5       nUR                  5       nUR                  5       nSU-   n	U R                  R!                  U	5      n
U
(       d  [        S5      e["        R$                  " XŠR'                  5       [        5       5      nOU R+                  U5        WU l        UR/                  5       U l        UR2                  R4                  nU R                  R7                  U5      U l        g ! [        [
        [        [        4 a  n[        [        U5      5      eS nAff = f! [(         a  n[        [        U5      5      eS nAff = f)N)r_   r­   r   zInvalid key curve identifier)Ú_PRIVATE_KEY_FORMAT_ORIGINALr   Úload_der_private_keyr   r\   ÚAssertionErrorÚ	TypeErrorr   r   ÚstrÚ_PRIVATE_KEY_FORMAT_OPENSSHr   rT   rY   Ú	get_mpintrR   r=   r	   Úderive_private_keyr   Ú	ExceptionÚ_got_bad_key_format_idrM   r¯   rL   r6   rQ   r:   rS   )r    r]   Úpkformatrj   ÚerI   Ú
curve_nameÚverkeyÚsigkeyÚnamer6   r   s               r!   r¸   ÚECDSAKey._decode_key  sd  € Ø‰ˆØ×8Ñ8Ó8ð
+Ü#×8Ò8Ø 4´Ó1Bñ‘ð ×9Ñ9Ó9ð+Ü˜d“m�Ø Ÿ\™\›^�
ØŸ™Ó)�ØŸ™›�Ø$ zÑ1�Ø×*Ñ*×GÑGÈÓM�ÞÜ&Ð'EÓFÐFÜ×+Ò+Ø×-Ñ-Ó/´Ó1Bó‘ð ×'Ñ'¨Ô1àˆÔØ Ÿ^™^Ó-ˆÔØ—i‘i×)Ñ)ˆØ×-Ñ-×@Ñ@ÀÓMˆÕøô; ÜÜÜ$ð	ó +ô #¤3 q£6Ó*Ð*ûð+ûô( ó +ô #¤3 q£6Ó*Ð*ûð+ús0   •E ÁBE9 ÅE6ÅE1Å1E6Å9
FÆFÆFc                 óz   • [        5       nUR                  U5        UR                  U5        UR                  5       $ r0   )r   Ú	add_mpintr|   )r    rœ   r�   rI   s       r!   r˜   ÚECDSAKey._sigencode@  s-   € Ü‹iˆØ�‰�aÔØ�‰�aÔØ�{‰{‹}Ðr$   c                 ó^   • [        U5      nUR                  5       nUR                  5       nX44$ r0   )r   rÄ   )r    r›   rI   rœ   r�   s        r!   r¡   ÚECDSAKey._sigdecodeF  s(   € Ü�c‹lˆØ�M‰M‹OˆØ�M‰M‹OˆØˆtˆr$   )rS   rN   rM   rL   )NNNNNNTr0   )#r%   r&   r'   r(   r)   r-   r   r	   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1rR   r"   Úclassmethodro   rr   r|   r†   ÚpropertyrŠ   r‰   r�   r“   rž   r¦   r   ÚEllipticCurvePrivateKeyrª   r²   rP   rO   r¸   r˜   r¡   r*   r+   r$   r!   rC   rC   a   s&  † ññ
 #á˜Ÿ™ jÓ1Ù˜Ÿ™ jÓ1Ù˜Ÿ™ jÓ1ð	
ó€Mð ØØØØØð ô=9ð~ ñBó ðBð ñ!ó ð!òò(ð ñ
ó ð
ò6ò+ò,ôòð  ð ˜X b×&@Ñ&@ÑAó  ó ð ð ØŸLšL›N¸$ÀTó Fó ðFò&òò%NòNõr$   rC   N)r)   Útypingr   Úcryptography.exceptionsr   r   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr	   Ú/cryptography.hazmat.primitives.asymmetric.utilsr
   r   Úparamiko.commonr   Úparamiko.messager   Úparamiko.pkeyr   Úparamiko.ssh_exceptionr   Úparamiko.utilr   r   r-   rC   r+   r$   r!   Ú<module>rå      sS   ðñ&õ ç JÝ 8ß @Ý 8÷õ
 &Ý $Ý Ý /Ý &÷'ñ '÷6ñ ô:iˆtõ ir$   