
    mg/              	          U d Z ddlmZmZmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZ ddlmZ ddlmZmZmZ dd	lmZmZ dd
lmZmZ ddlmZmZ ddlmZ eeeee f   ef   Z!eeef   Z" e
d      Z#dddddZ$i Z%eee
f   e&d<   i Z'ee
ef   e&d<    G d de      Z(dD ]H  \  Z)Z*de)z   Z+e+dz   Z,de+z   Z- e
e*      Z.e.e%e)<   e)e'e.<    ee+e(de+f        ede+e,e(ed        ee-d       J y)z#ECDSA public key encryption handler    )DictOptionalTupleUnioncast   )ASN1DecodeError	BitStringObjectIdentifierTaggedDERObject)
der_encode
der_decode)	CryptoKeyECDSAPrivateKeyECDSAPublicKey)lookup_ec_curve_by_params)MPIntString	SSHPacket)SSHKeySSHOpenSSHCertificateV01)KeyImportErrorKeyExportError)register_public_key_algregister_certificate_alg)register_x509_certificate_algz1.2.840.10045.1.1sha256sha384sha512)   1.3.132.0.10   nistp256   nistp384   nistp521	_alg_oids_alg_oid_mapc                   6    e Zd ZU dZeeef   ed<   dZdZ	 e
d      Zdef fdZded	efd
Zd	efdZeded	efd       Zeded	d fd       Zeded	efd       Zeded	efd       Zeded	ee   fd       Zeded	ee   fd       Zededed	ee   fd       Zededed	ee   fd       Z ede!d	efd       Z"ede!d	efd       Z#d	efdZ$d	efdZ%d	efdZ&d	e'eef   fdZ(d	e'eef   fd Z)d	efd!Z*d	efd"Z+d	efd#Z,ded$ed	efd%Z-ded$ede!d	efd&Z. xZ/S )'_ECKeyz0Handler for elliptic curve public key encryption_keyr   s   ECz1.2.840.10045.2.1keyc                 j   t         |   |       d| j                  j                  z   | _        | j                  f| _        d| j                  z   f| _        t        | j
                        | _        t        | j                  j                     | _
        t        | j                  j                     | _        y )N   ecdsa-sha2-   x509v3-)super__init__r(   curve_id	algorithmsig_algorithmsx509_algorithmssetall_sig_algorithmsr$   _alg_oid
_hash_algs	_hash_alg)selfr)   	__class__s     .lib/python3.12/site-packages/asyncssh/ecdsa.pyr.   z_ECKey.__init__=   s    '$))*<*<<#~~/ *T^^ ;="%d&9&9":!$))"4"45#DII$6$67    otherreturnc                    t        |t        |             xr | j                  j                  |j                  j                  k(  xr | j                  j                  |j                  j                  k(  xr\ | j                  j
                  |j                  j
                  k(  xr- | j                  j                  |j                  j                  k(  S N)
isinstancetyper(   r/   xyd)r8   r<   s     r:   __eq__z_ECKey.__eq__H   s     5$t*- ,		""ejj&9&99,		uzz||+, 		uzz||+, 		uzz||+		-r;   c                     t        | j                  j                  | j                  j                  | j                  j                  | j                  j
                  f      S r?   )hashr(   r/   rB   rC   rD   r8   s    r:   __hash__z_ECKey.__hash__R   s?    TYY''YY[[$))++/ 0 	0r;   
alg_paramsc                 0   t        |t              r	 t        |   }|S t        |t
              rt        |      dk\  r|d   dk(  rt        |d   t
              rt        |d         dk(  r|d   d   t        k(  rt        |d   t
              rt        |d         dk\  rt        |d   t              rt        |d   d   t              rt        |d   d   t              rot        |d   t              r\|d   d   }t        j                  |d   d   d	      }t        j                  |d   d   d	      }|d   }|d   }	 t        |||||      }|S t	        d
      # t        $ r t	        d|z        dw xY w# t        $ r}t	        t        |            dd}~ww xY w)z5Look up an EC curve matching the specified parameterszUnknown elliptic curve OID %sN   r   r            bigzInvalid EC curve parameters)r@   r   r%   KeyErrorr   tuplelenPRIME_FIELDbytesint
from_bytesr   
ValueErrorstr)	clsrJ   r/   pabpointnexcs	            r:   _lookup_curvez_ECKey._lookup_curveV   s    j"23;'
32 + U+J10Dmq Z
1u%E*Q- A%*Q-*:k*IA.3z!}3E3JA.Aq)51Aq)51A,1a Az!}Q/7Az!}Q/7AqME1A94Q1eQG  !!>??-  ;$%D%/&0 16:;;&  9$SX.D89s#   	E :E2 E/2	F;FFr0   c                 >     | t        j                  |dd             S )zGenerate a new EC private key   N)r   generate)rZ   r0   s     r:   rd   z_ECKey.generatew   s      ?++IbcN;<<r;   
key_paramsc                     t        t        |      \  }}}t        |t              rt        j                  |d      } | t        j                  |||            S )zConstruct an EC private keyrP   )r   _PrivateKeyArgsr@   rU   rV   rW   r   	construct)rZ   re   r/   private_valuepublic_values        r:   make_privatez_ECKey.make_private   sV    
 *- 	.- mU+NN=%@M?,,X|-:< = 	=r;   c                 `    t        t        |      \  }} | t        j                  ||            S )zConstruct an EC public key)r   _PublicKeyArgsr   rh   )rZ   re   r/   rj   s       r:   make_publicz_ECKey.make_public   s-     "&nj!A,>++HlCDDr;   key_datac                     t        |t              rt        |      dkD  r|d   dk(  rt        |d   t              rt        |d   t              r|d   j
                  dk(  r|d   j                  }|d   }t        |      dkD  rxt        |d   t              re|d   j
                  dk(  rSt        |d   j                  t              r6|d   j                  j                  dk(  r|d   j                  j                  }nd}| j                  |      ||fS y)z%Decode a PKCS#1 format EC private keyrM   r   r   rN   r;   N)
r@   rR   rS   rU   r   tagvaluer
   unusedra   )rZ   ro   rJ   private_key
public_keys        r:   decode_pkcs1_privatez_ECKey.decode_pkcs1_private   s    
 x'CMA,=q ZU%C8A;81$!!**J"1+KH!x{O<QKOOq(x{00)<QK%%,,1$,QK$5$5$;$;
 
$$Z0+zIIr;   c                     t        d      )z$Decode a PKCS#1 format EC public keyz'PKCS#1 not supported for EC public keys)r   )rZ   ro   s     r:   decode_pkcs1_publicz_ECKey.decode_pkcs1_public   s     FGGr;   datac                    	 t        |      }t        |t              rt	        |      dkD  r|d   dk(  rt        |d   t
              r|d   }t	        |      dkD  rxt        |d   t              re|d   j                  dk(  rSt        |d   j                  t              r6|d   j                  j                  dk(  r|d   j                  j                  }nd}| j                  |      ||fS y# t        $ r d}Y w xY w)z%Decode a PKCS#8 format EC private keyNr   r   rM   r;   )r   r	   r@   rR   rS   rU   r   rq   rr   r
   rs   ra   )rZ   rJ   ry   ro   rt   ru   s         r:   decode_pkcs8_privatez_ECKey.decode_pkcs8_private   s    
	!$'H x'CMA,=q ZU%C"1+KH!x{O<QKOOq(x{00)<QK%%,,1%a[..44
 
$$Z0+zII%  	H	s   C( (C65C6c                 J    t        |t              r| j                  |      |fS y)z$Decode a PKCS#8 format EC public keyN)r@   r   ra   )rZ   rJ   ry   s      r:   decode_pkcs8_publicz_ECKey.decode_pkcs8_public   s(    
 j"23$$Z0$66r;   packetc                 l    |j                         }|j                         }|j                         }|||fS )z#Decode an SSH format EC private key)
get_string	get_mpint)rZ   r~   r/   ru   rt   s        r:   decode_ssh_privatez_ECKey.decode_ssh_private   s;     $$&&&(
&&(j00r;   c                 J    |j                         }|j                         }||fS )z"Decode an SSH format EC public key)r   )rZ   r~   r/   ru   s       r:   decode_ssh_publicz_ECKey.decode_ssh_public   s+     $$&&&(
##r;   c                 T    t        dt        | j                  j                              S )z2Encode an EC public key blob as a tagged bitstringr   )r   r
   r(   rj   rH   s    r:   encode_public_taggedz_ECKey.encode_public_tagged   s      q)DII,B,B"CDDr;   c                     | j                   j                  st        d      d| j                   j                  t        d| j                        | j                         fS )z%Encode a PKCS#1 format EC private keyKey is not privater   r   )r(   ri   r   r   r5   r   rH   s    r:   encode_pkcs1_privatez_ECKey.encode_pkcs1_private   sP     yy&& !566499**4==1))+- 	-r;   c                     t        d      )z$Encode a PKCS#1 format EC public keyz*PKCS#1 is not supported for EC public keys)r   rH   s    r:   encode_pkcs1_publicz_ECKey.encode_pkcs1_public   s     IJJr;   c                     | j                   j                  st        d      | j                  t	        d| j                   j                  | j                         f      fS )z%Encode a PKCS#8 format EC private keyr   r   )r(   ri   r   r5   r   r   rH   s    r:   encode_pkcs8_privatez_ECKey.encode_pkcs8_private  sX     yy&& !566}}j!TYY-D-D*.*C*C*E*G H H 	Hr;   c                 F    | j                   | j                  j                  fS )z$Encode a PKCS#8 format EC public key)r5   r(   rj   rH   s    r:   encode_pkcs8_publicz_ECKey.encode_pkcs8_public  s     }}dii4444r;   c                    | j                   j                  st        d      dj                  t	        | j                   j
                        t	        | j                   j                        t        | j                   j                        f      S )z#Encode an SSH format EC private keyr   r;   )r(   rD   r   joinr   r/   rj   r   rH   s    r:   encode_ssh_privatez_ECKey.encode_ssh_private  sd     yy{{ !566xx		 2 23		 6 67tyy{{+- . 	.r;   c                     dj                  t        | j                  j                        t        | j                  j                        f      S )z"Encode an SSH format EC public keyr;   )r   r   r(   r/   rj   rH   s    r:   encode_ssh_publicz_ECKey.encode_ssh_public  s=     xx		 2 23		 6 679 : 	:r;   c                     | j                   j                  st        d      t        | j                   j                        S )z3Encode ECDSA certificate private key data for agentr   )r(   rD   r   r   rH   s    r:   encode_agent_cert_privatez _ECKey.encode_agent_cert_private!  s.     yy{{ !566TYY[[!!r;   sig_algorithmc                 "   | j                   j                  st        d      t        | j                   j	                  || j
                              }t        t        t        t        f   |      \  }}t        t        |      t        |      z         S )z6Compute an SSH-encoded signature of the specified datazPrivate key needed for signing)r(   ri   rX   r   signr7   r   r   rV   r   r   )r8   ry   r   sigrss         r:   sign_sshz_ECKey.sign_ssh)  sj    
 yy&&=>>dnn=>E#s(OS)1eAhq)**r;   c                    |j                         }|j                          t        |      }|j                         }|j                         }|j                          | j                  j                  |t        ||f      | j                        S )z5Verify an SSH-encoded signature of the specified data)r   	check_endr   r   r(   verifyr   r7   )r8   ry   r   r~   r   r   r   s          r:   
verify_sshz_ECKey.verify_ssh5  su     !3yyj!Q&8$..IIr;   )0__name__
__module____qualname____doc__r   r   r   __annotations__default_x509_hashpem_namer   	pkcs8_oidr   r.   objectboolrE   rV   rI   classmethodrU   ra   rd   r   rk   rn   r   rg   rv   rm   rx   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r9   s   @r:   r'   r'   4   s   :
/
00 H !45I	8I 	8-F -t -0# 0 v %  @ = =8 = = 
=f 
= 
= 
= EV E E E F _% 0 H6 H^$H H f #(-5o-F 4 V "',4^,D  1	 1o 1 1 $y $^ $ $Ef E
-f -KV K
HeFFN&; H5U66>%: 5
.E .:5 :"5 "
+U 
+5 
+U 
+Ju JU J$J)-Jr;   r'   ))r#   z1.3.132.0.35)r"   z1.3.132.0.34)r!   z1.2.840.10045.3.1.7)r    z1.3.132.0.10r+   s   -cert-v01@openssh.comr,   TN)/r   typingr   r   r   r   r   asn1r	   r
   r   r   r   r   cryptor   r   r   r   r~   r   r   r   ru   r   r   r   r   r   r   r   rU   rV   rg   rm   rT   r6   r$   r   r%   r'   	_curve_id_oid_str
_algorithm_cert_algorithm_x509_algorithm_oid r;   r:   <module>r      s<  * * 5 5 O O ( > > - , , 8 6 I 5 uUCZ0%78ue|$ 23'''')

 ,.	4''( -.0d#U*+ 0OJV OJd?Ix  )+J #;;O :-OH%DIi"LJzmDQ
O#%=tE!/48?r;   