
    Ii-                         S 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
    )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      7/venv/lib/python3.13/site-packages/paramiko/ecdsakey.py__init___ECDSACurve.__init__0   sk    "%.. &3T^^%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	)
_ECDSACurveSetB   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   r1   s     r    r!   _ECDSACurveSet.__init__I   s    (r#   c                 X    U R                    Vs/ s H  oR                  PM     sn$ s  snf r/   r1   r   )r   curves     r    get_key_format_identifier_list-_ECDSACurveSet.get_key_format_identifier_listL   s&    9=9J9JK9J++9JKKKs   'c                 R    U R                    H  nUR                  U:X  d  M  Us  $    g r/   )r1   r   )r   r   r5   s      r    get_by_curve_class!_ECDSACurveSet.get_by_curve_classO   s%    &&E  K/ 'r#   c                 R    U R                    H  nUR                  U:X  d  M  Us  $    g r/   r4   )r   r   r5   s      r    get_by_key_format_identifier+_ECDSACurveSet.get_by_key_format_identifierT   s&    &&E**.CC 'r#   c                 R    U R                    H  nUR                  U:X  d  M  Us  $    g r/   )r1   r   )r   r   r5   s      r    get_by_key_length _ECDSACurveSet.get_by_key_lengthY   s%    &&E:- 'r#   r0   N)r$   r%   r&   r'   r(   r!   r6   r9   r<   r?   r)   r*   r#   r    r,   r,   B   s!    )L

r#   r,   c                   t   \ 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S jrSS jr\\R                  " 5       SS4S j5       rS rS rS rS rS r Sr!g)ECDSAKey_   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XR                  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   r5   	__class___ECDSA_CURVESr9   ecdsa_curveget_textendswithlenr<   r6   format_check_type_and_load_certr   r   
get_binaryr   EllipticCurvePublicKeyfrom_encoded_pointr   
ValueError)r   rH   datafilenamepasswordvalsfile_objvalidate_pointc_classrI   suffix	key_typesx
cert_types	curvename	pointinfokeys                    r    r!   ECDSAKey.__init__m   s    """86'';Kd.$-C370Dd0&&,,66G#11DDWMD ||~H
 -F  ((#Ns6{l3#11NN D **IIKI=F=F)003Y   **z +  I,,666"3::9E  (I9//BB$$002I &)"#$  9"#7889s   G?G G5c                 6    U R                   R                  5       $ r/   )rQ   r6   clss    r    identifiersECDSAKey.identifiers   s      ??AAr#   c                 "    U R                  5       $ r/   )rn   rl   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    )rK   r   
add_stringrR   r   r   public_numbersr5   r   r   re   rU   yr   asbytes)r   ri   mnumberskey_size_bytesx_bytesy_bytes	point_strs           r    r{   ECDSAKey.asbytes   s      I	T%%;;<	T%%//0$$&)),,q0Q6wyy5A^c'l:;gEwyy5A^c'l:;gE''1		Yyy{r#   c                 "    U R                  5       $ r/   )r{   r   s    r    __str__ECDSAKey.__str__   s    ||~r#   c                     U R                  5       U R                  R                  5       R                  U R                  R                  5       R                  4$ r/   )get_namerK   ry   re   rz   r   s    r    _fieldsECDSAKey._fields   sG     MMO--/11--/11
 	
r#   c                 .    U R                   R                  $ r/   )rR   r   r   s    r    r   ECDSAKey.get_name   s    555r#   c                 .    U R                   R                  $ r/   )rR   r   r   s    r    get_bitsECDSAKey.get_bits   s    ***r#   c                     U R                   S L$ r/   )rL   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$ r/   )r   ECDSArR   r   rL   signr	   r   rx   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)rS   rR   r   rX   
_sigdecoder
   rK   verifyr   r   r   r   )r   r\   rH   r   sigRsigS	signatures          r    verify_ssh_sigECDSAKey.verify_ssh_sig   s    <<>T--CCCnn__S)
(4		%%$*:*:*F*F*H!I    		s   AB" "
B/.B/c                 l    U R                  UU R                  [        R                  R                  US9  g N)r^   )_write_private_key_filerL   r   PrivateFormatTraditionalOpenSSL)r   r]   r^   s      r    write_private_key_fileECDSAKey.write_private_key_file   s3    $$''::	 	% 	
r#   c                 l    U R                  UU R                  [        R                  R                  US9  g r   )_write_private_keyrL   r   r   r   )r   r`   r^   s      r    write_private_keyECDSAKey.write_private_key   s3    ''::	 	  	
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_   )
rQ   r?   r[   rV   r   r   generate_private_keyr   rB   
public_key)rm   r5   progress_funcbitsprivate_keys        r    generateECDSAKey.generate  sv     %%77=E} !?!F!Ft!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    rO   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   r`   r^   r\   s       r    rN   ECDSAKey._from_private_key  s"    %%dH?r#   c                 >   Uu  p!X R                   :X  a    [        R                  " US [        5       S9nOX 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$                  " XR'                  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   rS   rX   	get_mpintrQ   r<   r   derive_private_keyr   	Exception_got_bad_key_format_idrL   r   rK   r5   rP   r9   rR   )r   r\   pkformatri   erH   
curve_nameverkeysigkeynamer5   r   s               r    r   ECDSAKey._decode_key"  sd   888
+#8841B 999+dm \\^
)$z1**GGM&'EFF++--/1B ''1 ^^-ii))--@@M; $	 + #3q6**+(  + #3q6**+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       $ r/   )r   	add_mpintr{   )r   r   r   rH   s       r    r   ECDSAKey._sigencodeI  s-    iaa{{}r#   c                 ^    [        U5      nUR                  5       nUR                  5       nX44$ r/   )r   r   )r   r   rH   r   r   s        r    r   ECDSAKey._sigdecodeO  s(    clMMOMMOtr#   )rR   rM   rL   rK   )NNNNNNTr/   )"r$   r%   r&   r'   r(   r,   r   r   	SECP256R1	SECP384R1	SECP521R1rQ   r!   classmethodrn   rq   r{   r   propertyr   r   r   r   r   r   r   r   r   rO   rN   r   r   r   r)   r*   r#   r    rB   rB   _   s   
 #j1j1j1	
M <9| B B ! !( 
 
6+, 

 LLN$T F F&%NNr#   rB   N)r(   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,   rB   r*   r#   r    <module>r      sQ   & K 8 @ 8
 & $  / &' '6 :tt tr#   