
    AHjZ                         d 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mZ ddlmZ ddlmZ dd	lmZ  G d
 de      Zy)z
RSA keys.
    )Optional)InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)paddingrsa)Message)PKey)SSHExceptionc                   F   e Zd ZdZdZej                  ej                  ej                  ej                  dZ	 	 	 	 	 	 ddZ	e
d        Zed        Zedeej                      fd	       Zed
        Zd Zd Zed        Zd Zd Zd ZddZd Zedd       Zd Zd Zd Zy)RSAKeyzZ
    Representation of an RSA key which can be used to sign and verify SSH2
    data.
    ssh-rsa)zrsa-sha2-256z!rsa-sha2-256-cert-v01@openssh.comzrsa-sha2-512z!rsa-sha2-512-cert-v01@openssh.comNc                    d | _         d | _        || j                  ||       y || j                  ||       y ||t	        |      }||| _         y | j                  || j                  d       t        j                  |j                         |j                               j                  t                     | _         y )Nssh-rsa-cert-v01@openssh.com)msgkey_type	cert_typeen)keypublic_blob_from_private_key_from_private_key_filer   _check_type_and_load_certnamer
   RSAPublicNumbers	get_mpint
public_keyr   )selfr   datafilenamepasswordr   file_objs          G/root/tools/cai/cai_env/lib/python3.12/site-packages/paramiko/rsakey.py__init__zRSAKey.__init__1   s     ""8X6''(;Kd.$-C?DH** 8 +  ++--/S]]_j*+ H    c                 R    t        | j                  j                               ddgz   S )Nr   r   )listHASHESkeys)clss    r'   identifierszRSAKey.identifiersR   s,     CJJOO%&**
 
 	
r)   c                 .    | j                   j                  S N)r   key_sizer"   s    r'   sizezRSAKey.size]   s    xx   r)   returnc                 f    t        | j                  t        j                        r| j                  S d S r1   
isinstancer   r
   RSAPrivateKeyr3   s    r'   private_keyzRSAKey.private_keya   s$    %dhh0A0ABtxxLLr)   c                     t        | j                  t        j                        r$| j                  j	                         j
                  S | j                  j                         S r1   )r8   r   r
   r9   private_numberspublic_numbersr3   s    r'   r=   zRSAKey.public_numberse   sB    dhh 1 1288++-<<<88**,,r)   c                     t               }|j                  | j                         |j                  | j                  j
                         |j                  | j                  j                         |j                         S r1   )r   
add_stringr   	add_mpintr=   r   r   asbytes)r"   ms     r'   rA   zRSAKey.asbytesl   sU    I	TYY	D''))*	D''))*yy{r)   c                 D    | j                         j                  dd      S )Nutf8ignore)errors)rA   decoder3   s    r'   __str__zRSAKey.__str__s   s      ||~$$VH$==r)   c                 x    | j                         | j                  j                  | j                  j                  fS r1   )get_namer=   r   r   r3   s    r'   _fieldszRSAKey._fieldsy   s-    !4!4!6!68K8K8M8MNNr)   c                     | j                   S r1   )r   r3   s    r'   rJ   zRSAKey.get_name}       yyr)   c                     | j                   S r1   )r4   r3   s    r'   get_bitszRSAKey.get_bits   rM   r)   c                 J    t        | j                  t        j                        S r1   r7   r3   s    r'   can_signzRSAKey.can_sign   s    $((C$5$566r)   c                    || j                   }| j                  j                  |t        j                          | j
                  |                }t               }|j                  |j                  dd             |j                  |       |S )N)r	   	algorithmz-cert-v01@openssh.com )	r   r   signr	   PKCS1v15r,   r   r?   replace)r"   r#   rS   sigrB   s        r'   sign_ssh_datazRSAKey.sign_ssh_data   s~    		Ihhmm$$& -dkk),.  
 I	Y&&'>CD	Sr)   c                    |j                         }|| j                  vry| j                  }t        |t        j
                        r|j                         }|j                         }|j                  t        |      dz  z
  }|dkD  rd|dz   dz  z  |z   }	 |j                  ||t        j                          | j                  |                 y# t        $ r Y yw xY w)NF   r          T)get_textr,   r   r8   r
   r9   r!   
get_binaryr2   lenverifyr	   rV   r   )r"   r#   r   sig_algorithmr   rU   diffs          r'   verify_ssh_sigzRSAKey.verify_ssh_sig   s    +hhc3,,-.."C ~~||c$i!m+!8taxAo.5D	JJdG,,.0JM0J0L    		s   8C 	CCc                 Z    t        j                  d| t                     }t        |      S )a$  
        Generate a new private RSA 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 `.RSAKey` private key
        i  )public_exponentr2   backend)r   )r
   generate_private_keyr   r   )bitsprogress_funcr   s      r'   generatezRSAKey.generate   s*     &&!D/:K
 #r)   c                 L    | j                  d||      }| j                  |       y NRSA)_read_private_key_file_decode_key)r"   r$   r%   r#   s       r'   r   zRSAKey._from_private_key_file   s$    **5(HEr)   c                 L    | j                  d||      }| j                  |       y rm   )_read_private_keyrp   )r"   r&   r%   r#   s       r'   r   zRSAKey._from_private_key   s$    %%eXx@r)   c           	      6   |\  }}|| j                   k(  r"	 t        j                  |d t                     }n|| j                  k(  rp| j                  |d      \  }}}}}}	t        j                  ||      }
t        j                  ||	|||dz
  z  ||	dz
  z  ||
      j                  t                     }n| j                  |       t!        t        j"                        sJ || _        y # t        t
        t        f$ r}t        t        |            d }~ww xY w)N)r%   rg   iiiiiir      )pqddmp1dmq1iqmpr=   )_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   
ValueError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpackr
   r   RSAPrivateNumbersr:   _got_bad_key_format_idr8   r9   r   )r"   r#   pkformatr   r   r   rx   r{   rv   rw   r=   s              r'   rp   zRSAKey._decode_key   s   $t888+#8841B
 999"&"="=dH"MAq!T1a 11A;N''!a%[!a%[- k/+,  ''1#s00111# 	+?@ +"3q6**+s    C+ +D?DD)NNNNNNr1   ) __name__
__module____qualname____doc__r   r   SHA256SHA512r,   r(   classmethodr/   propertyr4   r   r
   r9   r:   r=   rA   rH   rK   rJ   rO   rQ   rY   rd   staticmethodrk   r   r   rp    r)   r'   r   r   #   s   
 D-3]]-3]]	F ,B 
 
 ! ! MXc&7&78 M M - -> O O7 0   r)   r   N)r   typingr   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr	   r
   paramiko.messager   paramiko.pkeyr   paramiko.ssh_exceptionr   r   r   r)   r'   <module>r      s2   &  J 8 @ B $  /|T |r)   