
    AHj                         d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ  G d	 d
e      Zy)    )UnionN)default_backend)Cipher)Message)OPENSSH_AUTH_MAGICPKey_unpad_openssh)PasswordRequiredExceptionSSHException)bc                       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 Zedeej                   j"                  df   fd       ZddZd Zy)
Ed25519Keya  
    Representation of an `Ed25519 <https://ed25519.cr.yp.to/>`_ key.

    .. note::
        Ed25519 key support was added to OpenSSH in version 6.5.

    .. versionadded:: 2.2
    .. versionchanged:: 2.3
        Added a ``file_obj`` parameter to match other key classes.
    zssh-ed25519Nc                    d | _         d\  | _        | _        ||t        |      }|Q| j	                  || j
                  d       t        j                  j                  |j                               | _        nD|+t        |d      5 }| j                  d|      \  }}d d d        n|| j                  d|      \  }}|s|r| j                  ||      | _        | j                  | j                  t        d      y y # 1 sw Y   IxY w)N)NNz ssh-ed25519-cert-v01@openssh.com)msgkey_type	cert_typerOPENSSHz
need a key)public_blob_verifying_key_signing_keyr   _check_type_and_load_certnamenaclsigning	VerifyKey
get_binaryopen_read_private_key_parse_signing_key_data
ValueError)selfr   datafilenamepasswordfile_objfpkformats           K/root/tools/cai/cai_env/lib/python3.12/site-packages/paramiko/ed25519key.py__init__zEd25519Key.__init__,   s     1;.T.;4+$-C?**< + 
 #',,"8"89I"JD!h$ F!%!7!7	1!E$F F!!33IxHNHdx $ < <T8 LD$)<)<)D\** *E$F Fs   C==Dc                    ddl m} t        |      }|j                  t	        t
                    t
        k7  rt        d      |j                         }|j                         }|j                         }|j                         }|dk(  r|s|dk7  rTt        d      |dk(  r9|st        d      t        |      }	|	j                         }
|	j                         }nt        d      |dk7  r||j                  vrt        d      g }t        |      D ]b  }t        |j                               }|j                         | j                  k7  rt        d      |j                  |j                                d |j                         }|dk(  r|}n|j                  |   }t        j                   t#        |      
|d   |d   z   d	
      }t%         |d   |d |d           |d   ||d   d        t'                     j)                         }|j+                  |      |j-                         z   }t        t/        |            }|j                         |j                         k7  rt        d      g }t        |      D ]  }|j                         | j                  k7  rt        d      |j                         }|j                         }t0        j2                  j5                  |d d       }|j6                  j9                         |cxk(  r||   cxk(  r	|dd  k(  sJ  J |j                  |       |j                           t	        |      dk7  rt        d      |d   S )Nr   )	TransportzInvalid keynonebcryptzPrivate key file is encryptedzkey-sizez
block-sizeT)r%   saltdesired_key_bytesroundsignore_few_roundsclassmode)backend       )paramiko.transportr,   r   	get_byteslenr   r   get_textr   get_intr
   _cipher_inforanger   appendr.   kdfr   r   r   	decryptorupdatefinalizer	   r   r   
SigningKey
verify_keyencode)r"   r#   r%   r,   message
ciphernamekdfname
kdfoptionsnum_keysr@   bcrypt_saltbcrypt_roundspublic_keys_pubkeyprivate_ciphertextprivate_datacipherkeyrA   signing_keysipublickey_datasigning_keys                            r)   r    z"Ed25519Key._parse_signing_key_dataF   sY   0 $-S!3459KK}--%%'
""$'')
??$f Z61"=11 /3  *%C..*KKKMM}--Ji6L6L$L}--x 	4AW//12F DII-"=11v0023		4 %//1-L++J7F**8 "("4vl7K"K$ #'C w$8fZ&8 9:vs6*#5#789') ik	    !34y7I7I7KK  .67?? 11}--x 	!A!TYY."=11'')F))+H ,,11(3B-@K &&--/!q>! BC=!!!
 , %	!( |!}--A    c                     | j                   }||j                         nd}t               }|j                  | j                         |j                  |       |j                         S )NrZ   )verifying_keyrF   r   
add_stringr   asbytes)r"   vmy_bytesms       r)   r^   zEd25519Key.asbytes   sM    !"188:CI	TYY	Xyy{rZ   c                 :    | j                         | j                  fS N)get_namer\   r"   s    r)   _fieldszEd25519Key._fields   s    !3!344rZ   c                     | j                   S rc   )r   re   s    r)   rd   zEd25519Key.get_name   s    yyrZ   c                      y)N    re   s    r)   get_bitszEd25519Key.get_bits   s    rZ   c                     | j                   d uS rc   )r   re   s    r)   can_signzEd25519Key.can_sign   s      ,,rZ   c                     | j                   d uS rc   )r   re   s    r)   
can_verifyzEd25519Key.can_verify   s    ""$..rZ   returnc                     | j                         r| j                  j                  S | j                         r| j                  S y rc   )rm   r   rE   ro   r   re   s    r)   r\   zEd25519Key.verifying_key   s6    ==?$$///__&&&rZ   c                     t               }|j                  | j                         |j                  | j                  j	                  |      j
                         |S rc   )r   r]   r   r   sign	signature)r"   r#   	algorithmra   s       r)   sign_ssh_datazEd25519Key.sign_ssh_data   sA    I	TYY	T&&++D1;;<rZ   c                     |j                         | j                  k7  ry	 | j                  j                  ||j	                                y# t
        j                  j                  $ r Y yw xY w)NFT)r;   r   r   verifyr   r   
exceptionsBadSignatureError)r"   r#   r   s      r)   verify_ssh_sigzEd25519Key.verify_ssh_sig   s\    <<>TYY&	&&tS^^-=>  00 		s   *A A+*A+)NNNNNrc   )__name__
__module____qualname____doc__r   r*   r    r^   propertyrf   rd   rk   rm   ro   r   r   r   r   r\   rv   r{   rj   rZ   r)   r   r      s    	 D KO+4^@ 5 5-/ uT\\%;%;T%AB  	rZ   r   )typingr   r.   nacl.signingr   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   paramiko.messager   paramiko.pkeyr   r   r	   paramiko.ssh_exceptionr
   r   paramiko.utilr   r   rj   rZ   r)   <module>r      s3   "    8 9 $ B B J y yrZ   