
    a                         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y)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dZd Zd Zed        Zd Z	d Z
d	 Zd
 Zd ZddZddZedd       Zd Zd Zd Zy)DSSKeyzX
    Representation of a DSS key which can be used to sign an verify SSH2
    data.
    Nc                    d | _         d | _        d | _        d | _        d | _        d | _        || j                  ||       y || j                  ||       y ||t        |      }||\  | _         | _        | _        | _        nh| j                  |dd       |j                         | _         |j                         | _        |j                         | _        |j                         | _        t        j                  | j                         | _        y )Nssh-dsszssh-dss-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	get_mpintr
   
bit_lengthsize)selfr   datafilenamepasswordvalsfile_objs          /lib/python3.12/site-packages/paramiko/dsskey.py__init__zDSSKey.__init__.   s     ""8X6''(;Kd.$-C-1*DFDFDFDF**"8 + 
 ]]_DF]]_DF]]_DF]]_DFOODFF+	    c                 0   t               }|j                  d       |j                  | j                         |j                  | j                         |j                  | j
                         |j                  | j                         |j                         S Nr   )r   
add_string	add_mpintr   r   r   r   asbytes)r$   ms     r*   r1   zDSSKey.asbytesS   sa    I	Y	DFF	DFF	DFF	DFFyy{r,   c                 "    | j                         S N)r1   r$   s    r*   __str__zDSSKey.__str__\   s    ||~r,   c                 |    | j                         | j                  | j                  | j                  | j                  fS r4   )get_namer   r   r   r   r5   s    r*   _fieldszDSSKey._fields_   s)    @@r,   c                      yr.    r5   s    r*   r8   zDSSKey.get_namec   s    r,   c                     | j                   S r4   )r#   r5   s    r*   get_bitszDSSKey.get_bitsf   s    yyr,   c                     | j                   d uS r4   )r   r5   s    r*   can_signzDSSKey.can_signi   s    vvT!!r,   c                    t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }|j                  |t        j                               }t        |      \  }}t               }|j!                  d       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   }|j!                  ||z          |S )Nr   r   r   r   parameter_numbersr   public_numbersbackendr   r      )r   DSAPrivateNumbersr   DSAPublicNumbersr   DSAParameterNumbersr   r   r   private_keyr   signr   SHA1r   r   r/   r
   deflate_longlenr   )	r$   r%   keysigrsr2   rstrsstrs	            r*   sign_ssh_datazDSSKey.sign_ssh_datal   s   ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 hhtV[[]+#C(1I	Y  A&  A&t9r>SY/$6Dt9r>SY/$6D	TD[!r,   c                 j   t        |j                               dk(  r|j                         }n&|j                         }|dk7  ry|j                         }t	        j
                  |d d d      }t	        j
                  |dd  d      }t        ||      }t        j                  | j                  t        j                  | j                  | j                  | j                              j                  t                     }	 |j!                  ||t#        j$                                y	# t&        $ r Y y
w xY w)N(   r   r   rH      rA   rB   rF   TF)rP   r1   get_text
get_binaryr
   inflate_longr	   r   rJ   r   rK   r   r   r   
public_keyr   verifyr   rN   r   )	r$   r%   r   rR   kindsigRsigS	signaturerQ   s	            r*   verify_ssh_sigzDSSKey.verify_ssh_sig   s    s{{}#++-C<<>Dy .."C   Sb1-  RS1-(t4	""ff!55&&DFFdff

 *_.*
/ 		JJy$6    		s    %D& &	D21D2c                 v   t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }| j                  ||t        j                  j                  |       y NrA   rB   rD   rF   )r'   )r   rI   r   rJ   r   rK   r   r   r   rL   r   _write_private_key_filer   PrivateFormatTraditionalOpenSSL)r$   r&   r'   rQ   s       r*   write_private_key_filezDSSKey.write_private_key_file   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	$$''::	 	% 	
r,   c                 v   t        j                  | j                  t        j                  | j                  t        j
                  | j                  | j                  | j                                    j                  t                     }| j                  ||t        j                  j                  |       y rf   )r   rI   r   rJ   r   rK   r   r   r   rL   r   _write_private_keyr   rh   ri   )r$   r)   r'   rQ   s       r*   write_private_keyzDSSKey.write_private_key   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	''::	 	  	
r,   c                 ~   t        j                  | t                     j                         }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
        rF   )r(   )r   generate_private_keyr   private_numbersr   rE   rC   r   r   r   r   r   )bitsprogress_funcnumbersrQ   s       r*   generatezDSSKey.generate   s     **/+

/
 	 &&88::&&88::&&88::&&((	
 		
r,   c                 L    | j                  d||      }| j                  |       y NDSA)_read_private_key_file_decode_key)r$   r&   r'   r%   s       r*   r   zDSSKey._from_private_key_file   s$    **5(HEr,   c                 L    | j                  d||      }| j                  |       y rv   )_read_private_keyry   )r$   r)   r'   r%   s       r*   r   zDSSKey._from_private_key   s$    %%eXx@r,   c                 L   |\  }}|| j                   k(  r	 t        |      j                         }nB|| j                  k(  r"| j                  |d      }dgt        |      z   }n| j                  |       t              t        ust        |      dk  s|d   dk7  rt	        d      |d   | _        |d   | _        |d   | _        |d	   | _        |d
   | _        t#        j$                  | j                        | _        y # t        $ r}t	        dj                  |            d }~ww xY w)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typerP   r   r   r   r   r   r
   r"   r#   )r$   r%   pkformatkeylistes        r*   ry   zDSSKey._decode_key   s   $ t888Md)**, 99911$@GcDM)G''1=$Gq(8GAJ!OE  OODFF+	!   M"#A#H#H#KLLMs   C; ;	D#DD#)NNNNNNr4   )i   N)__name__
__module____qualname____doc__r+   r1   r6   propertyr9   r8   r=   r?   rW   rd   rj   rm   staticmethodrt   r   r   ry   r;   r,   r*   r   r   (   s     #,J A 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      s?   & 5 8 @ 9
  % / $ * W,T W,r,   