
    mg                        d Z ddl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 ddlmZ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 ee   Zee   Z G d de      Z G d de      Z  G d de      Z!er1 ede d        eddde ed       e jD                  D ]  Z# ee#d        er2 ede!d        eddde!ed       e!jD                  D ]  Z# ee#d        yy)z#EdDSA public key encryption handler    )OptionalTupleUnioncast   )ASN1DecodeErrorObjectIdentifier
der_encode
der_decode)EdDSAPrivateKeyEdDSAPublicKey)ed25519_availableed448_available)String	SSHPacket)OMITSSHKeySSHOpenSSHCertificateV01)KeyImportErrorKeyExportError)register_public_key_algregister_certificate_alg)register_x509_certificate_algc                      e Zd ZU dZeeef   ed<   dZde	de
fdZ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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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#y)_EdKeyz'Handler for EdDSA public key encryption_key    otherreturnc                     t        |t        |             xr\ | j                  j                  |j                  j                  k(  xr- | j                  j                  |j                  j                  k(  S N)
isinstancetyper   public_valueprivate_value)selfr   s     .lib/python3.12/site-packages/asyncssh/eddsa.py__eq__z_EdKey.__eq__.   s\     5$t*- D		&&%***A*AAD		''5::+C+CC	Er   c                 l    t        | j                  j                  | j                  j                  f      S r!   )hashr   r$   r%   r&   s    r'   __hash__z_EdKey.__hash__6   s&    TYY++TYY-D-DEFFr   	algorithmc                 >     | t        j                  |dd             S )z Generate a new EdDSA private key   N)r   generate)clsr-   s     r'   r0   z_EdKey.generate9   s      ?++IabM:;;r   
key_paramsc                     	 t        t        |      \  } | t        j                  | j                  dd |            S # t
        t        f$ r t        d      dw xY w)zConstruct an EdDSA private keyr/   NzInvalid EdDSA private key)r   _PrivateKeyArgsr   	constructr-   	TypeError
ValueErrorr   )r1   r2   r%   s      r'   make_privatez_EdKey.make_privateB   sg    	H!/:>NM00qr1B1>@ A A:& 	H !<=4G	H	   := Ac                     	 t        t        |      \  } | t        j                  | j                  dd |            S # t
        t        f$ r t        d      dw xY w)zConstruct an EdDSA public keyr/   NzInvalid EdDSA public key)r   _PublicKeyArgsr   r5   r-   r6   r7   r   )r1   r2   r$   s      r'   make_publicz_EdKey.make_publicN   sd    	G <ML~//ab0A0<> ? ?:& 	G !;<$F	Gr9   
alg_paramsdatac                 V    	 t        t        t        |            fS # t        $ r Y yw xY w)z(Decode a PKCS#8 format EdDSA private keyN)r   bytesr   r   r1   r=   r>   s      r'   decode_pkcs8_privatez_EdKey.decode_pkcs8_privateZ   s.    	
4 0133 		s    	((c                     |fS )z'Decode a PKCS#8 format EdDSA public key rA   s      r'   decode_pkcs8_publicz_EdKey.decode_pkcs8_publicf   s     wr   packetc                 b    |j                         }|j                         }|dt        |        fS )z&Decode an SSH format EdDSA private keyN)
get_stringlen)r1   rF   r$   r%   s       r'   decode_ssh_privatez_EdKey.decode_ssh_privateo   s9     ((*))+1L 11244r   c                 (    |j                         }|fS )z%Decode an SSH format EdDSA public key)rH   )r1   rF   r$   s      r'   decode_ssh_publicz_EdKey.decode_ssh_publicx   s     ((*r   c                     | j                   j                  st        d      t        t	        | j                   j                        fS )z(Encode a PKCS#8 format EdDSA private keyKey is not private)r   r%   r   r   r
   r+   s    r'   encode_pkcs8_privatez_EdKey.encode_pkcs8_private   s7     yy&& !566Z		 7 7888r   c                 :    t         | j                  j                  fS )z'Encode a PKCS#8 format EdDSA public key)r   r   r$   r+   s    r'   encode_pkcs8_publicz_EdKey.encode_pkcs8_public   s     TYY++++r   c                    | j                   j                  t        d      dj                  t	        | j                   j
                        t	        | j                   j                  | j                   j
                  z         f      S )z&Encode an SSH format EdDSA private keyrN   r   )r   r%   r   joinr   r$   r+   s    r'   encode_ssh_privatez_EdKey.encode_ssh_private   sm     99""* !566xx		 6 67		 7 7 $		 6 6!7 89 : 	:r   c                 @    t        | j                  j                        S )z%Encode an SSH format EdDSA public key)r   r   r$   r+   s    r'   encode_ssh_publicz_EdKey.encode_ssh_public   s     dii,,--r   c                 "    | j                         S )z3Encode EdDSA certificate private key data for agent)rT   r+   s    r'   encode_agent_cert_privatez _EdKey.encode_agent_cert_private   s     &&((r   sig_algorithmc                     | j                   j                  st        d      t        | j                   j	                  |            S )z6Compute an SSH-encoded signature of the specified datazPrivate key needed for signing)r   r%   r7   r   sign)r&   r>   rY   s      r'   sign_sshz_EdKey.sign_ssh   s5    
 yy&&=>>diinnT*++r   c                 z    |j                         }|j                          | j                  j                  ||      S )z5Verify an SSH-encoded signature of the specified data)rH   	check_endr   verify)r&   r>   rY   rF   sigs        r'   
verify_sshz_EdKey.verify_ssh   s5     !yyc**r   N)$__name__
__module____qualname____doc__r   r   r   __annotations__r-   objectboolr(   intr,   classmethodr@   r0   r   r8   r<   r   r4   rB   r;   rE   r   rJ   rL   r   rO   rQ   rT   rV   rX   r\   ra   rD   r   r'   r   r   '   s   1
/
00IEF Et EG# G < <8 < < 	Hf 	H 	H 	H 	GV 	G 	G 	G 	f 	#(	-5o-F	 	 V "',4^,D  5	 5o 5 5 y ^  9eFFN&; 9,U66>%: ,
:E :.5 .
)5 )
,U ,5 ,U ,	+u 	+U 	+$	+)-	+r   r   c                   F    e Zd ZdZdZ ed      ZefZdez   fZ e	e      Z
y)_Ed25519Keyz,Handler for Curve25519 public key encryption   ssh-ed25519z1.3.101.112   x509v3-Nrb   rc   rd   re   r-   r	   	pkcs8_oidsig_algorithmsx509_algorithmssetall_sig_algorithmsrD   r   r'   rl   rl      s3    6I /I\N!I-/O^,r   rl   c                   F    e Zd ZdZdZ ed      ZefZdez   fZ e	e      Z
y)	_Ed448Keyz*Handler for Curve448 public key encryption	   ssh-ed448z1.3.101.113rn   Nro   rD   r   r'   rv   rv      s3    4I /I\N!I-/O^,r   rv   rm   Ts    ssh-ed25519-cert-v01@openssh.comrw   s   ssh-ed448-cert-v01@openssh.comN)$re   typingr   r   r   r   asn1r   r	   r
   r   cryptor   r   r   r   rF   r   r   
public_keyr   r   r   r   r   r   r   r   r@   r4   r;   r   rl   rv   rr   algrD   r   r'   <module>r}      s   * * / / K K 3 6 % > > 6 I 5 ,uM+V M+`-& -- - NK>Q@(*BDJ **%c40 + L)T:Q.O&(@$H ((%c40 ) r   