
    AHjL,                         d 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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y)z
ECDSA keys
    )Optional)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      I/root/tools/cai/cai_env/lib/python3.12/site-packages/paramiko/ecdsakey.py__init__z_ECDSACurve.__init__2   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__K   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_listN   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_classQ   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_identifierV   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_length[   s*    && 	E:-	r"   N)	r#   r$   r%   r&   r!   r0   r2   r4   r6   r'   r"   r    r)   r)   D   s!    )L

r"   r)   c                      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edeej2                     f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_CURVESr2   ecdsa_curveget_textendswithlenr4   r0   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__o   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+   )rF   r0   clss    r    identifierszECDSAKey.identifiers   s      ??AAr"   c                 "    | j                         S r+   )rb   r`   s    r     supported_key_format_identifiersz)ECDSAKey.supported_key_format_identifiers   s      r"   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_stringrG   r   r   public_numbersr/   r   r   rZ   rJ   yr   asbytes)r   r^   mnumberskey_size_bytesx_bytesy_bytes	point_strs           r    rm   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+   )rm   r   s    r    __str__zECDSAKey.__str__   s    ||~r"   c                     | j                         | j                  j                         j                  | j                  j                         j                  fS r+   )get_namer@   rk   rZ   rl   ru   s    r    _fieldszECDSAKey._fields   sG     MMO--/11--/11
 	
r"   c                 .    | j                   j                  S r+   )rG   r   ru   s    r    rx   zECDSAKey.get_name   s    555r"   c                 .    | j                   j                  S r+   )rG   r   ru   s    r    get_bitszECDSAKey.get_bits   s    ***r"   c                     | j                   d uS r+   rA   ru   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	   ECDSArG   r   rA   signr
   r   rj   r   
_sigencode)r   rQ   	algorithmecdsasigrsrn   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)rH   rG   r   rM   
_sigdecoder   r@   verifyr	   r   r   r   )r   rQ   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/returnc                     | j                   S r+   r~   ru   s    r    private_keyzECDSAKey.private_key   s    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)rT   )
rF   r6   rP   rK   r   r	   generate_private_keyr   r8   
public_key)ra   r/   progress_funcbitsr   s        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   rR   rS   rQ   s       r    rD   zECDSAKey._from_private_key_file  s$    **48Dr"   c                 L    | j                  d||      }| j                  |       y r   )_read_private_keyr   )r   rU   rS   rQ   s       r    rC   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)rS   r   r   zInvalid key curve identifier)_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   rP   AssertionError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSHr   rH   rM   	get_mpintrF   r4   r	   derive_private_keyr   	Exception_got_bad_key_format_idrA   r   r@   r/   rE   r2   rG   )r   rQ   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_mpintrm   )r   r   r   r=   s       r    r   zECDSAKey._sigencode@  s-    iaa{{}r"   c                 `    t        |      }|j                         }|j                         }||fS r+   )r   r   )r   r   r=   r   r   s        r    r   zECDSAKey._sigdecodeF  s*    clMMOMMO!tr"   )NNNNNNTr+   )!r#   r$   r%   r&   r)   r   r	   	SECP256R1	SECP384R1	SECP521R1rF   r!   classmethodrb   rd   rm   rv   propertyry   rx   r|   r   r   r   r   EllipticCurvePrivateKeyr   r   rD   rC   r   r   r   r'   r"   r    r8   r8   a   s(   
 #j1j1j1	
M  =9~ B B ! !( 
 
6+,   Xb&@&@A     (BLLN$T F F&%NNr"   r8   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)   r8   r'   r"   r    <module>r      sS   &  J 8 @ 8
 & $  / &' '6 :it ir"   