
    mg                      6   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 ddlmZ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 eeeeeef   Zeeeeef   Z G d de      Z eded        edddeed       ej>                  D ]  Z  ee d        y)z!DSA public key encryption handler    )OptionalTupleUnioncast   )ASN1DecodeErrorObjectIdentifier
der_encode
der_decode)DSAPrivateKeyDSAPublicKey)all_ints)MPIntString	SSHPacket)SSHKeySSHOpenSSHCertificateV01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Z	dZ
 ed      ZefZdez   fZ ee      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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(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%)&_DSAKeyz%Handler for DSA public key encryption_key   ssh-dsssha256s   DSAz1.2.840.10040.4.1s   x509v3-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(  xr- | j                  j                  |j                  j                  k(  S N)
isinstancetyper   pqgyx)selfr   s     ,lib/python3.12/site-packages/asyncssh/dsa.py__eq__z_DSAKey.__eq__3   s     5$t*- ,		uzz||+,		uzz||+, 		uzz||+, 		uzz||+	,
 		uzz||+	-    c                     t        | j                  j                  | j                  j                  | j                  j                  | j                  j
                  | j                  j                  f      S r    )hashr   r#   r$   r%   r&   r'   r(   s    r)   __hash__z_DSAKey.__hash__>   sG    TYY[[$))++tyy{{YY[[$))++/ 0 	0r+   	algorithmc                 :     | t        j                  d            S )zGenerate a new DSA private keyi   )key_size)r   generate)clsr0   s     r)   r3   z_DSAKey.generateB   s     =))4899r+   
key_paramsc           	      l    t        t        |      \  }}}}} | t        j                  |||||            S )zConstruct a DSA private key)r   _PrivateKeyArgsr   	construct)r4   r5   r#   r$   r%   r&   r'   s          r)   make_privatez_DSAKey.make_privateJ   s8     _j91aA=**1aAq9::r+   c                 h    t        t        |      \  }}}} | t        j                  ||||            S )zConstruct a DSA public key)r   _PublicKeyArgsr   r8   )r4   r5   r#   r$   r%   r&   s         r)   make_publicz_DSAKey.make_publicR   s4     .*5
1a<))!Q1566r+   key_datac                     t        |t              r4t        |      dk(  r&t        |      r|d   dk(  rt	        t
        |dd       S y)z&Decode a PKCS#1 format DSA private key   r   r   N)r!   tuplelenr   r   r7   )r4   r=   s     r)   decode_pkcs1_privatez_DSAKey.decode_pkcs1_privateZ   sB    
 x'CMQ,>"x{a'7!"66r+   c                 p    t        |t              r&t        |      dk(  rt        |      r|\  }}}}||||fS y)z%Decode a PKCS#1 format DSA public key   N)r!   r@   rA   r   )r4   r=   r&   r#   r$   r%   s         r)   decode_pkcs1_publicz_DSAKey.decode_pkcs1_publice   s?    
 x'CMQ,>"!JAq!QaA:r+   
alg_paramsdatac                     	 t        |      }t        |t              rCt	        |      dk(  r5t        |      r*t        |t              r|\  }}}t        |||      }|||||fS y# t        $ r Y yw xY w)z&Decode a PKCS#8 format DSA private keyN   )r   r   r!   r@   rA   r   intpow)r4   rF   rG   r'   r#   r$   r%   r&   s           r)   decode_pkcs8_privatez_DSAKey.decode_pkcs8_privateq   sx    
	4 A z5)c*o.B$As); GAq!Aq\AaAq=   		s   A! !	A-,A-c                     	 t        |      }t        |t              r5t	        |      dk(  r't        |      rt        |t              r|\  }}}||||fS y# t        $ r Y yw xY w)z%Decode a PKCS#8 format DSA public keyNrI   )r   r   r!   r@   rA   r   rJ   )r4   rF   rG   r&   r#   r$   r%   s          r)   decode_pkcs8_publicz_DSAKey.decode_pkcs8_public   si    
	4 A z5)c*o.B$As); GAq!aA:  		s   A 	AApacketc                     |j                         }|j                         }|j                         }|j                         }|j                         }|||||fS )z$Decode an SSH format DSA private key	get_mpint)r4   rO   r#   r$   r%   r&   r'   s          r)   decode_ssh_privatez_DSAKey.decode_ssh_private   sZ     !Q1}r+   c                     |j                         }|j                         }|j                         }|j                         }||||fS )z#Decode an SSH format DSA public keyrQ   )r4   rO   r#   r$   r%   r&   s         r)   decode_ssh_publicz_DSAKey.decode_ssh_public   sJ     !Qzr+   c                    | j                   j                  st        d      d| j                   j                  | j                   j                  | j                   j
                  | j                   j                  | j                   j                  fS )z&Encode a PKCS#1 format DSA private keyKey is not privater   )r   r'   r   r#   r$   r%   r&   r.   s    r)   encode_pkcs1_privatez_DSAKey.encode_pkcs1_private   s[     yy{{ !566499;;		TYY[[		TYY[[* 	*r+   c                     | j                   j                  | j                   j                  | j                   j                  | j                   j                  fS )z%Encode a PKCS#1 format DSA public key)r   r&   r#   r$   r%   r.   s    r)   encode_pkcs1_publicz_DSAKey.encode_pkcs1_public   s3     		TYY[[$))++tyy{{CCr+   c                    | j                   j                  st        d      | j                   j                  | j                   j                  | j                   j
                  ft        | j                   j                        fS )z&Encode a PKCS#8 format DSA private keyrW   )r   r'   r   r#   r$   r%   r
   r.   s    r)   encode_pkcs8_privatez_DSAKey.encode_pkcs8_private   sR     yy{{ !566		TYY[[$))++6
499;;8OOOr+   c                     | j                   j                  | j                   j                  | j                   j                  ft	        | j                   j
                        fS )z%Encode a PKCS#8 format DSA public key)r   r#   r$   r%   r
   r&   r.   s    r)   encode_pkcs8_publicz_DSAKey.encode_pkcs8_public   s;     		TYY[[$))++6
499;;8OOOr+   c           	         | j                   j                  st        d      dj                  t	        | j                   j
                        t	        | j                   j                        t	        | j                   j                        t	        | j                   j                        t	        | j                   j                        f      S )z$Encode an SSH format DSA private keyrW   r+   )	r   r'   r   joinr   r#   r$   r%   r&   r.   s    r)   encode_ssh_privatez_DSAKey.encode_ssh_private   s~     yy{{ !566xxtyy{{+U499;;-?tyy{{+U499;;-?tyy{{+- . 	.r+   c                    dj                  t        | j                  j                        t        | j                  j                        t        | j                  j
                        t        | j                  j                        f      S )z#Encode an SSH format DSA public keyr+   )r`   r   r   r#   r$   r%   r&   r.   s    r)   encode_ssh_publicz_DSAKey.encode_ssh_public   sZ     xxtyy{{+U499;;-?tyy{{+U499;;-?A B 	Br+   c                     | j                   j                  st        d      t        | j                   j                        S )z1Encode DSA certificate private key data for agentrW   )r   r'   r   r   r.   s    r)   encode_agent_cert_privatez!_DSAKey.encode_agent_cert_private   s.     yy{{ !566TYY[[!!r+   sig_algorithmc                 *   | j                   j                  st        d      t        | j                   j	                  |d            }t        t        t        t        f   |      \  }}t        |j                  dd      |j                  dd      z         S )z6Compute an SSH-encoded signature of the specified datazPrivate key needed for signingsha1   big)
r   r'   
ValueErrorr   signr   r   rJ   r   to_bytes)r(   rG   rf   sigrss         r)   sign_sshz_DSAKey.sign_ssh   sr    
 yy{{=>>f56E#s(OS)1ajjU+ajjU.CCDDr+   c                    |j                         }|j                          t        |      dk7  ryt        j	                  |dd d      }t        j	                  |dd d      }| j
                  j                  |t        ||f      d      S )z5Verify an SSH-encoded signature of the specified data(   FNri   rj   rh   )
get_string	check_endrA   rJ   
from_bytesr   verifyr
   )r(   rG   rf   rO   rn   ro   rp   s          r)   
verify_sshz_DSAKey.verify_ssh   sz     !s8r>NN3s8U+NN3rs8U+yyj!Q&8&AAr+   N)0__name__
__module____qualname____doc__r   r   r   __annotations__r0   default_x509_hashpem_namer	   	pkcs8_oidsig_algorithmsx509_algorithmssetall_sig_algorithmsobjectboolr*   rJ   r/   classmethodbytesr3   r   r9   r<   r   r7   rB   r;   rE   rL   rN   r   rS   rU   rX   rZ   r   r\   r^   ra   rc   re   rq   rx    r+   r)   r   r   &   s|   /
|+
,,I H !45I\N!I-/O^,	-F 	-t 	-0# 0 : :9 : : ;f ; ; ; 7V 7 7 7 F _%  	6 	^$	 	 f #(-5o-F " V "',4^,D   		 	o 	 	 y ^  *f *DV D
PeFFN&; PPU66>%: P
.E .B5 B"5 "
EU 
E5 
EU 
EBu BU B$B)-Br+   r   r   Fs   ssh-dss-cert-v01@openssh.comN)!r|   typingr   r   r   r   asn1r   r	   r
   r   cryptor   r   miscr   rO   r   r   r   
public_keyr   r   r   r   r   r   rJ   r7   r;   r   r   algr   r+   r)   <module>r      s   * ( / / K K /  , , H H I 5 S#sC/0sCc)*SBf SBl 
GU 3 J(G ":EC ""C!#u- #r+   