
    Ii8                          S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	  SSK
JrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJr   " S S\5      rg)z
DSS keys.
    )InvalidSignature)default_backend)hashesserialization)dsa)decode_dss_signatureencode_dss_signature)util)	zero_byte)SSHException)Message)BERBERException)PKeyc                       \ rS rSrSrSr      SS jrS rS r\	S 5       r
S	 rS
 rS rSS jrS rSS jrSS jr\SS j5       rS rS rS rSrg)DSSKey(   zL
Representation of a DSS key which can be used to sign an verify SSH2
data.
zssh-dssNc                 N   S U l         S U l        S U l        S U l        S U l        S U l        Ub  U R                  Xd5        g Ub  U R                  X45        g Uc  Ub  [        U5      nUb  Uu  U l         U l        U l        U l        O|U R                  UU R                  U R                   S3S9  UR                  5       U l         UR                  5       U l        UR                  5       U l        UR                  5       U l        [        R                  " U R                   5      U l        g )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          5/venv/lib/python3.13/site-packages/paramiko/dsskey.py__init__DSSKey.__init__0   s    ""86'';Kd.$-C-1*DFDFDFDF**!YYK'<= + 
 ]]_DF]]_DF]]_DF]]_DFOODFF+	    c                 D   [        5       nUR                  U R                  5        UR                  U R                  5        UR                  U R
                  5        UR                  U R                  5        UR                  U R                  5        UR                  5       $ N)	r   
add_stringr!   	add_mpintr   r   r   r   asbytes)r%   ms     r+   r3   DSSKey.asbytesU   se    I	TYY	DFF	DFF	DFF	DFFyy{r.   c                 "    U R                  5       $ r0   )r3   r%   s    r+   __str__DSSKey.__str__^   s    ||~r.   c                 |    U R                  5       U R                  U R                  U R                  U R                  4$ r0   )get_namer   r   r   r   r7   s    r+   _fieldsDSSKey._fieldsa   s)    @@r.   c                     U R                   $ r0   )r!   r7   s    r+   r;   DSSKey.get_namef       yyr.   c                     U R                   $ r0   )r$   r7   s    r+   get_bitsDSSKey.get_bitsi   r@   r.   c                     U R                   S L$ r0   )r   r7   s    r+   can_signDSSKey.can_signl   s    vvT!!r.   c                    [         R                  " U R                  [         R                  " U R                  [         R
                  " U R                  U R                  U R                  S9S9S9R                  [        5       S9nUR                  U[        R                  " 5       5      n[        U5      u  pV[        5       nUR!                  U R"                  5        [$        R&                  " US5      n[$        R&                  " US5      n	[)        U5      S:  a  [*        S[)        U5      -
  -  U-   n[)        U	5      S:  a  [*        S[)        U	5      -
  -  U	-   n	UR!                  X-   5        U$ )Nr   r   r   r   parameter_numbersr   public_numbersbackendr      )r   DSAPrivateNumbersr   DSAPublicNumbersr   DSAParameterNumbersr   r   r   private_keyr   signr   SHA1r   r   r1   r!   r
   deflate_longlenr   )
r%   r&   	algorithmkeysigrsr4   rstrsstrs
             r+   sign_ssh_dataDSSKey.sign_ssh_datao   s   ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 hhtV[[]+#C(I	TYY  A&  A&t9r>SY/$6Dt9r>SY/$6D	T[!r.   c           	      v   [        UR                  5       5      S:X  a  UR                  5       nO0UR                  5       nX@R                  :w  a  gUR	                  5       n[
        R                  " US S S5      n[
        R                  " USS  S5      n[        XV5      n[        R                  " U R                  [        R                  " U R                  U R                  U R                  S9S9R                  [!        5       S9n UR#                  Xq[$        R&                  " 5       5        g! [(         a     g	f = f)
Nr   r   rO      rH   rI   rM   TF)rW   r3   get_textr!   
get_binaryr
   inflate_longr	   r   rQ   r   rR   r   r   r   
public_keyr   verifyr   rU   r   )	r%   r&   r   rZ   kindsigRsigS	signaturerY   s	            r+   verify_ssh_sigDSSKey.verify_ssh_sig   s    s{{}#++-C<<>Dyy .."C   Sb1-  RS1-(4	""ff!55&&DFFdff

 *_.*
/ 		JJy6    		s   %D+ +
D87D8c                 ^   [         R                  " U R                  [         R                  " U R                  [         R
                  " U R                  U R                  U R                  S9S9S9R                  [        5       S9nU R                  UU[        R                  R                  US9  g NrH   rI   rK   rM   )r(   )r   rP   r   rQ   r   rR   r   r   r   rS   r   _write_private_key_filer   PrivateFormatTraditionalOpenSSL)r%   r'   r(   rY   s       r+   write_private_key_fileDSSKey.write_private_key_file   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	$$''::	 	% 	
r.   c                 ^   [         R                  " U R                  [         R                  " U R                  [         R
                  " U R                  U R                  U R                  S9S9S9R                  [        5       S9nU R                  UU[        R                  R                  US9  g ro   )r   rP   r   rQ   r   rR   r   r   r   rS   r   _write_private_keyr   rq   rr   )r%   r*   r(   rY   s       r+   write_private_keyDSSKey.write_private_key   s    ##ff//&&"%"9"9ff$&&#
 +o/+
0 	 	''::	 	  	
r.   c                 t   [         R                  " U [        5       S9R                  5       n[	        UR
                  R                  R                  UR
                  R                  R                  UR
                  R                  R                  UR
                  R                  4S9nUR                  Ul        U$ )z
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
rM   )r)   )r   generate_private_keyr   private_numbersr   rL   rJ   r   r   r   r   r   )bitsprogress_funcnumbersrY   s       r+   generateDSSKey.generate   s     **/+

/
 	 &&88::&&88::&&88::&&((	
 		
r.   c                 J    U R                  SX5      nU R                  U5        g NDSA)_read_private_key_file_decode_key)r%   r'   r(   r&   s       r+   r   DSSKey._from_private_key_file   s"    **5(Er.   c                 J    U R                  SX5      nU R                  U5        g r   )_read_private_keyr   )r%   r*   r(   r&   s       r+   r   DSSKey._from_private_key   s"    %%eX@r.   c                 T   Uu  p!X R                   :X  a   [        U5      R                  5       nOBX R                  :X  a"  U R                  US5      nS/[        U5      -   nOU R                  U5        [        W5      [        Ld  [        U5      S:  d	  US   S:w  a  [	        S5      eUS   U l        US   U l        US   U l        US	   U l        US
   U l        ["        R$                  " U R                  5      U l        g ! [         a  n[	        SR                  U5      5      eS nAff = f)NzUnable to parse key file: {}iiiiir      z3not a valid DSA private key file (bad ber encoding)rb               )_PRIVATE_KEY_FORMAT_ORIGINALr   decoder   r   format_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpacklist_got_bad_key_format_idtyperW   r   r   r   r   r   r
   r#   r$   )r%   r&   pkformatkeylistes        r+   r   DSSKey._decode_key   s    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')r   r   r   r   r$   r   r   )NNNNNNr0   )i   N)__name__
__module____qualname____firstlineno____doc__r!   r,   r3   r8   propertyr<   r;   rB   rE   r_   rl   rs   rw   staticmethodr   r   r   r   __static_attributes__ r.   r+   r   r   (   s    
 D #,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
  % / $ * Z,T Z,r.   