o
    g-                     @   s   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 dZG dd dZG dd deZdS )z
ECDSA keys
    )InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)ec)decode_dss_signatureencode_dss_signature)	four_byte)Message)PKey)SSHException)deflate_longc                   @   s   e Zd ZdZdd ZdS )_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                 C   sT   || _ |j| _d| j  | _| jdkrtj| _n| jdkr!tj| _ntj| _|| _	d S )Necdsa-sha2-   i  )
	nist_namekey_size
key_lengthkey_format_identifierr   SHA256hash_objectSHA384SHA512curve_class)selfr   r    r   K/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/ecdsakey.py__init__0   s   




z_ECDSACurve.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   '   s    r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )_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                 C   s
   || _ d S Necdsa_curves)r   r&   r   r   r   r   I      
z_ECDSACurveSet.__init__c                 C   s   dd | j D S )Nc                 S   s   g | ]}|j qS r   )r   ).0curver   r   r   
<listcomp>M   s    zA_ECDSACurveSet.get_key_format_identifier_list.<locals>.<listcomp>r%   r   r   r   r   get_key_format_identifier_listL   s   z-_ECDSACurveSet.get_key_format_identifier_listc                 C   "   | j D ]}|j|kr|  S qd S r$   )r&   r   )r   r   r)   r   r   r   get_by_curve_classO   
   

z!_ECDSACurveSet.get_by_curve_classc                 C   r-   r$   )r&   r   )r   r   r)   r   r   r   get_by_key_format_identifierT   r/   z+_ECDSACurveSet.get_by_key_format_identifierc                 C   r-   r$   )r&   r   )r   r   r)   r   r   r   get_by_key_lengthY   r/   z _ECDSACurveSet.get_by_key_lengthN)	r   r    r!   r"   r   r,   r.   r0   r1   r   r   r   r   r#   B   s    r#   c                   @   s   e Zd ZdZeeejdeejdeej	dgZ
							d-ddZed	d
 Zedd Zdd Zdd Zedd Zdd Zdd Zdd Zd.ddZdd Zd.ddZd.dd Zee ddfd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, ZdS )/ECDSAKeyz\
    Representation of an ECDSA key which can be used to sign and verify SSH2
    data.
    nistp256nistp384nistp521NTc                 C   sJ  d | _ d | _d | _|d ur| || d S |d ur!| || d S |d u r-|d ur-t|}|d urE|\| _| _ | jjj}| j	|| _
d S | }	d}
|	|
rY|	d t|
  }	| j|	| _
| j }dd |D }| j|||d | }|| j
jkrtd|| }ztj| j
 |}|| _ W d S  ty   tdw )Nz-cert-v01@openssh.comc                 S   s   g | ]}d  |qS )z{}-cert-v01@openssh.com)format)r(   xr   r   r   r*      s    
z%ECDSAKey.__init__.<locals>.<listcomp>)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_CURVESr.   ecdsa_curveget_textendswithlenr0   r,   _check_type_and_load_certr   r   r6   
get_binaryr   EllipticCurvePublicKeyfrom_encoded_pointr   
ValueError)r   r8   datafilenamepasswordvalsfile_objvalidate_pointc_classr9   suffix	key_types
cert_types	curvename	pointinfokeyr   r   r   r   m   sV   



zECDSAKey.__init__c                 C   s
   | j  S r$   )rA   r,   clsr   r   r   identifiers   s   
zECDSAKey.identifiersc                 C      |   S r$   )rZ   rX   r   r   r    supported_key_format_identifiers   s   z)ECDSAKey.supported_key_format_identifiersc                 C   s   | j }t }|| jj || jj | }|jjd d }t	|j
dd}d|t|  | }t	|jdd}d|t|  | }t| | }|| | S )N      F)add_sign_padding    )r;   r   
add_stringrB   r   r   public_numbersr)   r   r   r7   rE   yr
   asbytes)r   rW   mnumberskey_size_bytesx_bytesy_bytes	point_strr   r   r   rd      s   
zECDSAKey.asbytesc                 C   r[   r$   )rd   r+   r   r   r   __str__      zECDSAKey.__str__c                 C   s   |   | j j| j jfS r$   )get_namer;   rb   r7   rc   r+   r   r   r   _fields   s   

zECDSAKey._fieldsc                 C      | j jS r$   )rB   r   r+   r   r   r   rm      rl   zECDSAKey.get_namec                 C   ro   r$   )rB   r   r+   r   r   r   get_bits   rl   zECDSAKey.get_bitsc                 C   s
   | j d uS r$   )r<   r+   r   r   r   can_sign   r'   zECDSAKey.can_signc                 C   sT   t | j }| j||}t|\}}t }|| jj	 || 
|| |S r$   )r   ECDSArB   r   r<   signr   r   ra   r   
_sigencode)r   rK   	algorithmecdsasigrsre   r   r   r   sign_ssh_data   s   zECDSAKey.sign_ssh_datac                 C   sl   |  | jjkr
dS | }| |\}}t||}z| j||t	| j
  W dS  ty5   Y dS w )NFT)rC   rB   r   rG   
_sigdecoder	   r;   verifyr   rr   r   r   )r   rK   r8   rw   sigRsigS	signaturer   r   r   verify_ssh_sig   s   
zECDSAKey.verify_ssh_sigc                 C      | j || jtjj|d d S N)rM   )_write_private_key_filer<   r   PrivateFormatTraditionalOpenSSL)r   rL   rM   r   r   r   write_private_key_file      
zECDSAKey.write_private_key_filec                 C   r   r   )_write_private_keyr<   r   r   r   )r   rO   rM   r   r   r   write_private_key   r   zECDSAKey.write_private_keyc                 C   sT   |dur| j |}|du rtd|| }tj|t d}t||	 fd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
        NzUnsupported key length: {:d})backend)rN   )
rA   r1   rJ   r6   r   r   generate_private_keyr   r2   
public_key)rY   r)   progress_funcbitsprivate_keyr   r   r   generate  s   	zECDSAKey.generatec                 C      |  d||}| | d S NEC)_read_private_key_file_decode_key)r   rL   rM   rK   r   r   r   r?        zECDSAKey._from_private_key_filec                 C   r   r   )_read_private_keyr   )r   rO   rM   rK   r   r   r   r>     r   zECDSAKey._from_private_keyc                 C   s  |\}}|| j kr+ztj|d t d}W n_ ttttfy* } ztt	|d }~ww || j
kroz,t|}| }| }| }d| }	| j|	}
|
sQtdt||
 t }W n tyn } ztt	|d }~ww | | || _| | _|jj}| j|| _d S )N)rM   r   r   zInvalid key curve identifier)_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   rJ   AssertionError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSHr   rC   rG   	get_mpintrA   r0   r   derive_private_keyr   	Exception_got_bad_key_format_idr<   r   r;   r)   r@   r.   rB   )r   rK   pkformatrW   er8   
curve_nameverkeysigkeynamer)   r   r   r   r   r   "  sJ   




zECDSAKey._decode_keyc                 C   s"   t  }|| || | S r$   )r   	add_mpintrd   )r   rx   ry   r8   r   r   r   rt   I  s   

zECDSAKey._sigencodec                 C   s    t |}| }| }||fS r$   )r   r   )r   rw   r8   rx   ry   r   r   r   r{   O  s   zECDSAKey._sigdecode)NNNNNNTr$   ) r   r    r!   r"   r#   r   r   	SECP256R1	SECP384R1	SECP521R1rA   r   classmethodrZ   r\   rd   rk   propertyrn   rm   rp   rq   rz   r   r   r   r   r?   r>   r   rt   r{   r   r   r   r   r2   _   sL    




>






'r2   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#   r2   r   r   r   r   <module>   s   