
    7g-                         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          Z G d d          Z G 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                       e Zd ZdZ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                     || _         |j        | _        d| j         z   | _        | 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   s      K/var/www/html/syslog/venv/lib/python3.11/site-packages/paramiko/ecdsakey.py__init__z_ECDSACurve.__init__0   sr    "%. &3T^%C" ?c!!%}D_##%}D%}D&    N)__name__
__module____qualname____doc__r     r!   r   r   r   '   s-         ' ' ' ' 'r!   r   c                   0    e Zd ZdZd Zd Zd Zd Z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                     || _         d S Necdsa_curves)r   r,   s     r   r    z_ECDSACurveSet.__init__I   s    (r!   c                 $    d | j         D             S )Nc                     g | ]	}|j         
S r&   )r   ).0curves     r   
<listcomp>zA_ECDSACurveSet.get_key_format_identifier_list.<locals>.<listcomp>M   s    KKK+KKKr!   r+   r   s    r   get_key_format_identifier_listz-_ECDSACurveSet.get_key_format_identifier_listL   s    KK9JKKKKr!   c                 8    | j         D ]}|j        |k    r|c S d S r*   )r,   r   )r   r   r0   s      r   get_by_curve_classz!_ECDSACurveSet.get_by_curve_classO   s:    & 	 	E K// 0	 	r!   c                 8    | j         D ]}|j        |k    r|c S d S r*   )r,   r   )r   r   r0   s      r   get_by_key_format_identifierz+_ECDSACurveSet.get_by_key_format_identifierT   s<    & 	 	E*.CCC D	 	r!   c                 8    | j         D ]}|j        |k    r|c S d S r*   )r,   r   )r   r   r0   s      r   get_by_key_lengthz _ECDSACurveSet.get_by_key_lengthY   s:    & 	 	E:-- .	 	r!   N)	r"   r#   r$   r%   r    r3   r5   r7   r9   r&   r!   r   r(   r(   B   sl         ) ) )L L L  
  
    r!   r(   c                   r   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ed	             Zd
 Zd Zed             Zd Zd Zd Zd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dS )ECDSAKeyz\
    Representation of an ECDSA key which can be used to sign and verify SSH2
    data.
    nistp256nistp384nistp521NTc                    d | _         d | _        d | _        ||                     ||           d S ||                     ||           d S ||t          |          }|A|\  | _        | _         | j        j        j        }| j        	                    |          | _
        d S |                                }	d}
|	                    |
          r|	d t          |
                    }	| j                            |	          | _
        | j                                        }d |D             }|                     |||           |                                }|| j
        j        k    r"t%          d                    |                    |                                }	 t*          j                            | j
                                        |          }|| _         d S # t2          $ r t%          d          w xY w)Nz-cert-v01@openssh.comc                 8    g | ]}d                      |          S )z{}-cert-v01@openssh.com)format)r/   xs     r   r1   z%ECDSAKey.__init__.<locals>.<listcomp>   s4       89)0033  r!   )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   r0   	__class___ECDSA_CURVESr5   ecdsa_curveget_textendswithlenr7   r3   _check_type_and_load_certr   r   rA   
get_binaryr   EllipticCurvePublicKeyfrom_encoded_pointr   
ValueError)r   rC   datafilenamepasswordvalsfile_objvalidate_pointc_classrD   suffix	key_types
cert_types	curvename	pointinfokeys                   r   r    zECDSAKey.__init__m   s/    """8X666F''(;;;FKd.$--C370Dd0&,6G#1DDWMMD ||~~H
 -F  (( 4#Ns6{{lN3#1NN   D *IIKKI =F  J **)z +    ID,666"3::9EE   ((I9/BB$0022I  &)""" 9 9 9"#78889s   >G G4c                 4    | j                                         S r*   )rL   r3   clss    r   identifierszECDSAKey.identifiers   s     ??AAAr!   c                 *    |                                  S r*   )rf   rd   s    r    supported_key_format_identifiersz)ECDSAKey.supported_key_format_identifiers   s       r!   c                    | j         }t                      }|                    | 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   }|                    |           |                                S )N      F)add_sign_padding    )rF   r   
add_stringrM   r   r   public_numbersr0   r   r   rB   rP   yr   asbytes)r   rb   mnumberskey_size_bytesx_bytesy_bytes	point_strs           r   rq   zECDSAKey.asbytes   s     II	T%;<<<	T%/000$$&&),q0Q6wy5AAA^c'll:;gEwy5AAA^c'll:;gE''1		Yyy{{r!   c                 *    |                                  S r*   )rq   r2   s    r   __str__zECDSAKey.__str__   s    ||~~r!   c                     |                                  | j                                        j        | j                                        j        fS r*   )get_namerF   ro   rB   rp   r2   s    r   _fieldszECDSAKey._fields   sC     MMOO--//1--//1
 	
r!   c                     | j         j        S r*   )rM   r   r2   s    r   r{   zECDSAKey.get_name   s    55r!   c                     | j         j        S r*   )rM   r   r2   s    r   get_bitszECDSAKey.get_bits   s    **r!   c                     | j         d uS r*   )rG   r2   s    r   can_signzECDSAKey.can_sign   s    t++r!   c                 b   t          j        | j                                                  }| j                            ||          }t          |          \  }}t                      }|                    | j        j	                   |                    | 
                    ||                     |S r*   )r   ECDSArM   r   rG   signr	   r   rn   r   
_sigencode)r   rV   	algorithmecdsasigrsrr   s           r   sign_ssh_datazECDSAKey.sign_ssh_data   s    )557788##D%00#C((1II	T%;<<<	T__Q**+++r!   c                 t   |                                 | j        j        k    rdS |                                }|                     |          \  }}t          ||          }	 | j                            ||t          j	        | j        
                                                     dS # t          $ r Y dS w xY w)NFT)rN   rM   r   rR   
_sigdecoder
   rF   verifyr   r   r   r   )r   rV   rC   r   sigRsigS	signatures          r   verify_ssh_sigzECDSAKey.verify_ssh_sig   s    <<>>T-CCC5nn__S))
d(t44		%%4$*:*F*F*H*H!I!I   4   	 	 	55	s   "AB) )
B76B7c                 `    |                      || j        t          j        j        |           d S N)rX   )_write_private_key_filerG   r   PrivateFormatTraditionalOpenSSL)r   rW   rX   s      r   write_private_key_filezECDSAKey.write_private_key_file   s>    $$':	 	% 	
 	
 	
 	
 	
r!   c                 `    |                      || j        t          j        j        |           d S r   )_write_private_keyrG   r   r   r   )r   rZ   rX   s      r   write_private_keyzECDSAKey.write_private_key   s>    ':	 	  	
 	
 	
 	
 	
r!   c                 6   |R| j                             |          }|"t          d                    |                    |                                }t          j        |t                                }t          ||	                                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
        NzUnsupported key length: {:d})backend)rY   )
rL   r9   rU   rA   r   r   generate_private_keyr   r;   
public_key)re   r0   progress_funcbitsprivate_keys        r   generatezECDSAKey.generate  s     %77==E} !?!F!Ft!L!LMMM%%''E-e_=N=NOOOk;+A+A+C+CDEEEEr!   c                 ^    |                      d||          }|                     |           d S NEC)_read_private_key_file_decode_key)r   rW   rX   rV   s       r   rJ   zECDSAKey._from_private_key_file  s3    **48DDr!   c                 ^    |                      d||          }|                     |           d S r   )_read_private_keyr   )r   rZ   rX   rV   s       r   rI   zECDSAKey._from_private_key  s3    %%dHh??r!   c                    |\  }}|| j         k    rg	 t          j        |d t                                }n@# t          t
          t          t          f$ r!}t          t          |                    d }~ww xY w|| j
        k    r	 t          |          }|                                }|                                }|                                }d|z   }	| j                            |	          }
|
st          d          t#          j        ||
                                t                                }nC# t(          $ r!}t          t          |                    d }~ww xY w|                     |           || _        |                                | _        |j        j        }| j                            |          | _        d S )N)rX   r   r   zInvalid key curve identifier)_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   rU   AssertionError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSHr   rN   rR   	get_mpintrL   r7   r   derive_private_keyr   	Exception_got_bad_key_format_idrG   r   rF   r0   rK   r5   rM   )r   rV   pkformatrb   erC   
curve_nameverkeysigkeynamer0   r   s               r   r   zECDSAKey._decode_key"  s   $t888
+#841B1B   $	 + + + #3q66***+ 999+dmm \\^^
))$z1*GGMM G&'EFFF+E--//1B1B   + + + #3q66***+
 ''111 ^^--i)-@@MMs.   #7 A5A00A5B/D4 4
E>EEc                     t                      }|                    |           |                    |           |                                S r*   )r   	add_mpintrq   )r   r   r   rC   s       r   r   zECDSAKey._sigencodeI  s=    iiaa{{}}r!   c                 x    t          |          }|                                }|                                }||fS r*   )r   r   )r   r   rC   r   r   s        r   r   zECDSAKey._sigdecodeO  s0    cllMMOOMMOO!tr!   )NNNNNNTr*   ) r"   r#   r$   r%   r(   r   r   	SECP256R1	SECP384R1	SECP521R1rL   r    classmethodrf   rh   rq   ry   propertyr|   r{   r   r   r   r   r   r   r   rJ   rI   r   r   r   r&   r!   r   r;   r;   _   s        
 #NKj11Kj11Kj11	
 M <9 <9 <9 <9| B B [B ! ! [!  (   
 
 X
6 6 6+ + +, , ,      
 
 
 

 
 
 
 (BLNN$T F F F [F&    %N %N %NN      r!   r;   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(   r;   r&   r!   r   <module>r      sx  &  K J J J J J J J 8 8 8 8 8 8 @ @ @ @ @ @ @ @ 8 8 8 8 8 8       
 & % % % % % $ $ $ $ $ $       / / / / / / & & & & & &' ' ' ' ' ' ' '6       :t t t t tt t t t t tr!   