
    7g8                          d Z ddl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mZ ddlmZ  G d de          ZdS )z
DSS keys.
    )InvalidSignature)default_backend)hashesserialization)dsa)decode_dss_signatureencode_dss_signature)util)	zero_byte)SSHException)Message)BERBERException)PKeyc                       e Zd ZdZdZ	 	 	 	 	 	 d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dd            Zd Zd Zd ZdS )DSSKeyzX
    Representation of a DSS key which can be used to sign an verify SSH2
    data.
    zssh-dssNc                 r   d | _         d | _        d | _        d | _        d | _        d | _        ||                     ||           d S ||                     ||           d S ||t          |          }||\  | _         | _        | _        | _        n| 	                    || j
        | j
         d           |                                | _         |                                | _        |                                | _        |                                | _        t          j        | j                   | _        d S )Nz-cert-v01@openssh.com)msgkey_type	cert_type)pqgyxpublic_blob_from_private_key_from_private_key_filer   _check_type_and_load_certname	get_mpintr
   
bit_lengthsize)selfr   datafilenamepasswordvalsfile_objs          I/var/www/html/syslog/venv/lib/python3.11/site-packages/paramiko/dsskey.py__init__zDSSKey.__init__0   s,    ""8X666F''(;;;FKd.$--C-1*DFDFDFDFF**!Y=== +   
 ]]__DF]]__DF]]__DF]]__DFODF++			    c                 J   t                      }|                    | j                   |                    | j                   |                    | j                   |                    | j                   |                    | j                   |                                S N)	r   
add_stringr    	add_mpintr   r   r   r   asbytes)r$   ms     r*   r1   zDSSKey.asbytesU   s}    II	TY	DF	DF	DF	DFyy{{r,   c                 *    |                                  S r.   )r1   r$   s    r*   __str__zDSSKey.__str__^   s    ||~~r,   c                 \    |                                  | j        | j        | j        | j        fS r.   )get_namer   r   r   r   r4   s    r*   _fieldszDSSKey._fieldsa   s#    @@r,   c                     | j         S r.   )r    r4   s    r*   r7   zDSSKey.get_namef   
    yr,   c                     | j         S r.   )r#   r4   s    r*   get_bitszDSSKey.get_bitsi   r:   r,   c                     | j         d uS r.   )r   r4   s    r*   can_signzDSSKey.can_signl   s    vT!!r,   c                    t          j        | j        t          j        | j        t          j        | j        | j        | j                                      	                    t                                }|                    |t          j                              }t          |          \  }}t                      }|                    | j                   t%          j        |d          }t%          j        |d          }	t)          |          dk     rt*          dt)          |          z
  z  |z   }t)          |	          dk     rt*          dt)          |	          z
  z  |	z   }	|                    ||	z              |S )Nr   r   r   r   parameter_numbersr   public_numbersbackendr      )r   DSAPrivateNumbersr   DSAPublicNumbersr   DSAParameterNumbersr   r   r   private_keyr   signr   SHA1r   r   r/   r    r
   deflate_longlenr   )
r$   r%   	algorithmkeysigrsr2   rstrsstrs
             r*   sign_ssh_datazDSSKey.sign_ssh_datao   sL   #f/&"%"9f$&# # #  
 
 
 +o//+
0
0 	 hhtV[]]++#C((1II	TY A&& A&&t99r>>SYY/$6Dt99r>>SYY/$6D	TD[!!!r,   c                    t          |                                          dk    r|                                }n5|                                }|| j        k    rdS |                                }t          j        |d d         d          }t          j        |dd          d          }t          ||          }t          j	        | j
        t          j        | j        | j        | j                                                t!                                }	 |                    ||t%          j                               dS # t(          $ r Y d	S w xY w)
N(   r   rG      r@   rA   rE   TF)rO   r1   get_textr    
get_binaryr
   inflate_longr	   r   rI   r   rJ   r   r   r   
public_keyr   verifyr   rM   r   )	r$   r%   r   rR   kindsigRsigS	signaturerQ   s	            r*   verify_ssh_sigzDSSKey.verify_ssh_sig   sC   s{{}}##++--CC<<>>Dty  q..""C  SbS1-- RSS1--(t44	"f!5&DFdf  
 
 

 *_..*
/
/ 		JJy$666 4   	 	 	55	s   (E 
EEc                 F   t          j        | j        t          j        | j        t          j        | j        | j        | j                                      	                    t                                }|                     ||t          j        j        |           d S Nr@   rA   rC   rE   )r'   )r   rH   r   rI   r   rJ   r   r   r   rK   r   _write_private_key_filer   PrivateFormatTraditionalOpenSSL)r$   r&   r'   rQ   s       r*   write_private_key_filezDSSKey.write_private_key_file   s    #f/&"%"9f$&# # #  
 
 
 +o//+
0
0 	 	$$':	 	% 	
 	
 	
 	
 	
r,   c                 F   t          j        | j        t          j        | j        t          j        | j        | j        | j                                      	                    t                                }|                     ||t          j        j        |           d S rf   )r   rH   r   rI   r   rJ   r   r   r   rK   r   _write_private_keyr   rh   ri   )r$   r)   r'   rQ   s       r*   write_private_keyzDSSKey.write_private_key   s    #f/&"%"9f$&# # #  
 
 
 +o//+
0
0 	 	':	 	  	
 	
 	
 	
 	
r,      c                    t          j        | t                                                                }t	          |j        j        j        |j        j        j        |j        j        j	        |j        j
        f          }|j        |_        |S )a$  
        Generate a new private DSS key.  This factory function can be used to
        generate a new host key or authentication key.

        :param int bits: number of bits the generated key should be.
        :param progress_func: Unused
        :return: new `.DSSKey` private key
        rE   )r(   )r   generate_private_keyr   private_numbersr   rD   rB   r   r   r   r   r   )bitsprogress_funcnumbersrQ   s       r*   generatezDSSKey.generate   s     */++
 
 

/

 	 &8:&8:&8:&(	
 
 
 	
r,   c                 ^    |                      d||          }|                     |           d S NDSA)_read_private_key_file_decode_key)r$   r&   r'   r%   s       r*   r   zDSSKey._from_private_key_file   s3    **5(HEEr,   c                 ^    |                      d||          }|                     |           d S rw   )_read_private_keyrz   )r$   r)   r'   r%   s       r*   r   zDSSKey._from_private_key   s3    %%eXx@@r,   c                    |\  }}|| j         k    rW	 t          |                                          }n~# t          $ r'}t	          d                    |                    d }~ww xY w|| j        k    r*|                     |d          }dgt          |          z   }n| 	                    |           t          |          t          ust          |          dk     s|d         dk    rt	          d          |d         | _        |d         | _        |d         | _        |d	         | _        |d
         | _        t#          j        | j                  | _        d S )NzUnable to parse key file: {}iiiiir      z3not a valid DSA private key file (bad ber encoding)rZ               )_PRIVATE_KEY_FORMAT_ORIGINALr   decoder   r   format_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpacklist_got_bad_key_format_idtyperO   r   r   r   r   r   r
   r"   r#   )r$   r%   pkformatkeylistes        r*   rz   zDSSKey._decode_key   sW   $ t888Md))**,, M M M"#A#H#H#K#KLLLM99911$@@GcDMM)GG''111==$$Gq(8(8GAJ!OOE   ODF++			s   !4 
A%"A  A%)NNNNNNr.   )rn   N)__name__
__module____qualname____doc__r    r+   r1   r5   propertyr8   r7   r<   r>   rW   rd   rj   rm   staticmethodru   r   r   rz    r,   r*   r   r   (   sO        
 D #, #, #, #,J     A A XA    " " "   2  :
 
 
 
$
 
 
 
$    \2    , , , , ,r,   r   N)r   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   /cryptography.hazmat.primitives.asymmetric.utilsr   r	   paramikor
   paramiko.commonr   paramiko.ssh_exceptionr   paramiko.messager   paramiko.berr   r   paramiko.pkeyr   r   r   r,   r*   <module>r      s9  &  5 4 4 4 4 4 8 8 8 8 8 8 @ @ @ @ @ @ @ @ 9 9 9 9 9 9       
       % % % % % % / / / / / / $ $ $ $ $ $ * * * * * * * *      Z, Z, Z, Z, Z,T Z, Z, Z, Z, Z,r,   