
    a,                         d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ  G d de      Z G d de      Z G d de      Zy)z
ECDSA keys
    )InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)ec)decode_dss_signatureencode_dss_signature)	four_byte)Message)PKey)SSHException)deflate_longc                       e Zd ZdZd Zy)_ECDSACurvez
    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                 D   || _         |j                  | _        d| j                   z   | _        | j                  dk  rt        j
                  | _        || _	        y | j                  dk  rt        j                  | _        || _	        y t        j                  | _        || _	        y )Necdsa-sha2-   i  )
	nist_namekey_size
key_lengthkey_format_identifierr   SHA256hash_objectSHA384SHA512curve_class)selfr   r   s      1lib/python3.12/site-packages/paramiko/ecdsakey.py__init__z_ECDSACurve.__init__0   s    "%.. &3T^^%C" ??c!%}}D ' __#%}}D '  &}}D&    N)__name__
__module____qualname____doc__r     r!   r   r   r   '   s    'r!   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)_ECDSACurveSetz
    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                     || _         y N)ecdsa_curves)r   r+   s     r   r    z_ECDSACurveSet.__init__I   s
    (r!   c                 T    | j                   D cg c]  }|j                   c}S c c}w r*   r+   r   )r   curves     r   get_key_format_identifier_listz-_ECDSACurveSet.get_key_format_identifier_listL   s"    9=9J9JK++KKKs   %c                 L    | j                   D ]  }|j                  |k(  s|c S  y r*   )r+   r   )r   r   r.   s      r   get_by_curve_classz!_ECDSACurveSet.get_by_curve_classO   s*    && 	E  K/	r!   c                 L    | j                   D ]  }|j                  |k(  s|c S  y r*   r-   )r   r   r.   s      r   get_by_key_format_identifierz+_ECDSACurveSet.get_by_key_format_identifierT   s+    && 	E**.CC	r!   c                 L    | j                   D ]  }|j                  |k(  s|c S  y r*   )r+   r   )r   r   r.   s      r   get_by_key_lengthz _ECDSACurveSet.get_by_key_lengthY   s*    && 	E:-	r!   N)	r"   r#   r$   r%   r    r/   r1   r3   r5   r&   r!   r   r(   r(   B   s!    )L

r!   r(   c                   P   e Zd ZdZ e eej                  d       eej                  d       eej                  d      g      Z
	 	 	 	 	 	 	 ddZed        Zd Zd	 Zed
        Zd Zd Zd Zd Zd ZddZddZe ej                         ddfd       Zd Zd Zd Zd Zd Zy)ECDSAKeyz\
    Representation of an ECDSA key which can be used to sign and verify SSH2
    data.
    nistp256nistp384nistp521Nc                    d | _         d | _        d | _        || j                  ||       y || j	                  ||       y ||t        |      }|P|\  | _        | _         | j                  j                  j                  }| j                  j                  |      | _
        y |j                         }	d}
|	j                  |
      r|	d t        |
        }	| j                  j                  |	      | _
        | j                  j                         }|D cg c]  }dj!                  |       }}| j#                  |||       |j                         }|| j                  j$                  k7  rt'        dj!                  |            |j)                         }	 t*        j,                  j/                  | j                  j1                         |      }|| _         y c c}w # t2        $ r t'        d      w xY w)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   r.   	__class___ECDSA_CURVESr1   ecdsa_curveget_textendswithlenr3   r/   format_check_type_and_load_certr   r   
get_binaryr   EllipticCurvePublicKeyfrom_encoded_pointr   
ValueError)r   r<   datafilenamepasswordvalsfile_objvalidate_pointc_classr=   suffix	key_typesx
cert_types	curvename	pointinfokeys                    r   r    zECDSAKey.__init__m   s    """8X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89)003J  **)z +  ID,,666"3::9E  (I9//BB$$002I &)"#$  9"#7889s   G?G G-c                 6    | j                   j                         S r*   )rE   r/   )clss    r    supported_key_format_identifiersz)ECDSAKey.supported_key_format_identifiers   s      ??AAr!   c                     | j                   }t               }|j                  | j                  j                         |j                  | j                  j
                         |j                         }|j                  j                  dz   dz  }t        |j                  d      }d|t        |      z
  z  |z   }t        |j                  d      }d|t        |      z
  z  |z   }t        |z   |z   }|j                  |       |j                         S )N      F)add_sign_padding    )r?   r   
add_stringrF   r   r   public_numbersr.   r   r   rY   rI   yr   asbytes)r   r]   mnumberskey_size_bytesx_bytesy_bytes	point_strs           r   ri   z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                 "    | j                         S r*   )ri   r   s    r   __str__zECDSAKey.__str__   s    ||~r!   c                     | j                         | j                  j                         j                  | j                  j                         j                  fS r*   )get_namer?   rg   rY   rh   rq   s    r   _fieldszECDSAKey._fields   sG     MMO--/11--/11
 	
r!   c                 .    | j                   j                  S r*   )rF   r   rq   s    r   rt   zECDSAKey.get_name   s    555r!   c                 .    | j                   j                  S r*   )rF   r   rq   s    r   get_bitszECDSAKey.get_bits   s    ***r!   c                     | j                   d uS r*   )r@   rq   s    r   can_signzECDSAKey.can_sign   s    t++r!   c                 T   t        j                  | j                  j                               }| j                  j                  ||      }t        |      \  }}t               }|j                  | j                  j                         |j                  | j                  ||             |S r*   )r   ECDSArF   r   r@   signr	   r   rf   r   
_sigencode)r   rP   ecdsasigrsrj   s          r   sign_ssh_datazECDSAKey.sign_ssh_data   s    ))5578##D%0#C(1I	T%%;;<	T__Q*+r!   c                 d   |j                         | j                  j                  k7  ry|j                         }| j	                  |      \  }}t        ||      }	 | j                  j                  ||t        j                  | j                  j                                      y# t        $ r Y yw xY w)NFT)rG   rF   r   rL   
_sigdecoder
   r?   verifyr   r|   r   r   )r   rP   r<   r   sigRsigS	signatures          r   verify_ssh_sigzECDSAKey.verify_ssh_sig   s    <<>T--CCCnn__S)
d(t4		%%4$*:*:*F*F*H!I    		s   AB# #	B/.B/c                 r    | j                  || j                  t        j                  j                  |       y N)rR   )_write_private_key_filer@   r   PrivateFormatTraditionalOpenSSL)r   rQ   rR   s      r   write_private_key_filezECDSAKey.write_private_key_file   s3    $$''::	 	% 	
r!   c                 r    | j                  || j                  t        j                  j                  |       y r   )_write_private_keyr@   r   r   r   )r   rT   rR   s      r   write_private_keyzECDSAKey.write_private_key   s3    ''::	 	  	
r!   c                 
   |G| j                   j                  |      }|t        dj                  |            |j	                         }t        j                  |t                     }t        ||j                         f      S )a  
        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)rS   )
rE   r5   rO   rJ   r   r   generate_private_keyr   r7   
public_key)r_   r.   progress_funcbitsprivate_keys        r   generatezECDSAKey.generate   sx     %%77=E} !?!F!Ft!LMM%%'E--e_=NOk;+A+A+CDEEr!   c                 L    | j                  d||      }| j                  |       y NEC)_read_private_key_file_decode_key)r   rQ   rR   rP   s       r   rC   zECDSAKey._from_private_key_file  s$    **48Dr!   c                 L    | j                  d||      }| j                  |       y r   )_read_private_keyr   )r   rT   rR   rP   s       r   rB   zECDSAKey._from_private_key  s$    %%dHh?r!   c                 6   |\  }}|| j                   k(  r"	 t        j                  |d t                     }n|| j                  k(  r	 t        |      }|j                         }|j                         }|j                         }d|z   }	| j                  j!                  |	      }
|
st        d      t#        j$                  ||
j'                         t                     }n| j+                  |       | _        |j/                         | _        |j2                  j4                  }| j                  j7                  |      | _        y # t        t
        t        t        f$ r}t        t        |            d }~ww xY w# t(        $ r}t        t        |            d }~ww xY w)N)rR   r   r   zInvalid key curve identifier)_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   rO   AssertionError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSHr   rG   rL   	get_mpintrE   r3   r   derive_private_keyr   	Exception_got_bad_key_format_idr@   r   r?   r.   rD   r1   rF   )r   rP   pkformatr]   er<   
curve_nameverkeysigkeynamer.   r   s               r   r   zECDSAKey._decode_key  sl   $t888
+#8841B 999+dm \\^
)$z1**GGM&'EFF++E--/1B ''1 ^^-ii))--@@M; $	 + #3q6**+(  + #3q6**+s0    E BE6 E3E..E36	F?FFc                 z    t               }|j                  |       |j                  |       |j                         S r*   )r   	add_mpintri   )r   r   r   r<   s       r   r~   zECDSAKey._sigencodeC  s-    iaa{{}r!   c                 `    t        |      }|j                         }|j                         }||fS r*   )r   r   )r   r   r<   r   r   s        r   r   zECDSAKey._sigdecodeI  s*    clMMOMMO!tr!   )NNNNNNTr*   )r"   r#   r$   r%   r(   r   r   	SECP256R1	SECP384R1	SECP521R1rE   r    classmethodr`   ri   rr   propertyru   rt   rx   rz   r   r   r   r   r   rC   rB   r   r~   r   r&   r!   r   r7   r7   _   s    
 #j1j1j1	
M ;9z B B( 
 
6+, 

 (BLLN$T F F&%NNr!   r7   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   objectr   r(   r7   r&   r!   r   <module>r      sU   & K 8 @ 8
 & $  / &'& '6V :nt nr!   