o
    g8                      @   s   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 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                   @   s   e Zd ZdZdZ						d#ddZdd Zdd	 Zed
d Z	dd Z
dd Zdd Zd$ddZdd Zd$ddZd$ddZed%ddZdd Zdd  Zd!d" ZdS )&DSSKeyzX
    Representation of a DSS key which can be used to sign an verify SSH2
    data.
    zssh-dssNc                 C   s   d | _ d | _d | _d | _d | _d | _|d ur| || d S |d ur*| || d S |d u r6|d ur6t|}|d urE|\| _ | _| _| _n!| j	|| j
| j
 dd | | _ | | _| | _| | _t| 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_obj r'   I/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/dsskey.py__init__0   s4   	




zDSSKey.__init__c                 C   sJ   t  }|| j || j || j || j || j | S N)	r   
add_stringr   	add_mpintr   r   r   r   asbytes)r!   mr'   r'   r(   r-   U   s   zDSSKey.asbytesc                 C   s   |   S r*   )r-   r!   r'   r'   r(   __str__^   s   zDSSKey.__str__c                 C   s   |   | j| j| j| jfS r*   )get_namer   r   r   r   r/   r'   r'   r(   _fieldsa   s   zDSSKey._fieldsc                 C      | j S r*   )r   r/   r'   r'   r(   r1   f      zDSSKey.get_namec                 C   r3   r*   )r    r/   r'   r'   r(   get_bitsi   r4   zDSSKey.get_bitsc                 C   s
   | j d uS r*   )r   r/   r'   r'   r(   can_signl   s   
zDSSKey.can_signc           
   	   C   s   t j| jt j| jt j| j| j| jdddj	t
 d}||t }t|\}}t }|| j t|d}t|d}	t|dk rOtdt|  | }t|	dk r_tdt|	  |	 }	|||	  |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sr.   rstrsstrr'   r'   r(   sign_ssh_datao   s.   	zDSSKey.sign_ssh_datac           	      C   s   t | dkr| }n| }|| jkrdS | }t|d d d}t|dd  d}t||}tj	| j
tj| j| j| jddjt d}z|||t  W d	S  tya   Y dS w )
N(   r   r>      r7   r8   r<   FT)rF   r-   get_textr   
get_binaryr	   inflate_longr   r   r@   r   rA   r   r   r   
public_keyr   verifyr   rD   r   )	r!   r"   r   rI   kindsigRsigS	signaturerH   r'   r'   r(   verify_ssh_sig   s.   


zDSSKey.verify_ssh_sigc              	   C   R   t j| jt j| jt j| j| j| jdddj	t
 d}| j||tjj|d d S Nr7   r8   r:   r<   )r$   )r   r?   r   r@   r   rA   r   r   r   rB   r   _write_private_key_filer   PrivateFormatTraditionalOpenSSL)r!   r#   r$   rH   r'   r'   r(   write_private_key_file   "   

zDSSKey.write_private_key_filec              	   C   r[   r\   )r   r?   r   r@   r   rA   r   r   r   rB   r   _write_private_keyr   r^   r_   )r!   r&   r$   rH   r'   r'   r(   write_private_key   ra   zDSSKey.write_private_key   c                 C   sH   t j| t d }t|jjj|jjj|jjj	|jj
fd}|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
        r<   )r%   )r   generate_private_keyr   private_numbersr   r;   r9   r   r   r   r   r   )bitsprogress_funcnumbersrH   r'   r'   r(   generate   s   
zDSSKey.generatec                 C      |  d||}| | d S NDSA)_read_private_key_file_decode_key)r!   r#   r$   r"   r'   r'   r(   r         zDSSKey._from_private_key_filec                 C   rk   rl   )_read_private_keyro   )r!   r&   r$   r"   r'   r'   r(   r      rp   zDSSKey._from_private_keyc              
   C   s   |\}}|| j kr%zt| }W n+ ty$ } ztd|d }~ww || jkr8| |d}dgt| }n| 	| t
|tusOt|dk sO|d dkrStd|d | _|d | _|d | _|d	 | _|d
 | _t| j| _d S )NzUnable to parse key file: {}iiiiir      z3not a valid DSA private key file (bad ber encoding)rP               )_PRIVATE_KEY_FORMAT_ORIGINALr   decoder   r   format_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpacklist_got_bad_key_format_idtyperF   r   r   r   r   r   r	   r   r    )r!   r"   pkformatkeylister'   r'   r(   ro      s,   


$




zDSSKey._decode_key)NNNNNNr*   )rd   N)__name__
__module____qualname____doc__r   r)   r-   r0   propertyr2   r1   r5   r6   rN   rZ   r`   rc   staticmethodrj   r   r   ro   r'   r'   r'   r(   r   (   s4    
%	



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'   r(   <module>   s   