
    Ii!                     ~    S SK r S SKJr  S SKJr  S SKrS SKJr  S SK	J
r
JrJr  S SKJr  S SKJrJr   " S S	\
5      rg)
    N)default_backend)Cipher)Message)PKeyOPENSSH_AUTH_MAGIC_unpad_openssh)b)SSHExceptionPasswordRequiredExceptionc                   f    \ 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rg)
Ed25519Key   z
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                    S U l         S =pgUc  Ub  [        U5      nUbI  U R                  UU R                  SS9  [        R
                  R                  UR                  5       5      nODUb*  [        US5       nU R                  SU5      u  pS S S 5        OUb  U R                  SU5      u  pU(       d  U(       a  U R                  X$5      nUc  Uc  [        S5      eXpl        X`l        g ! , (       d  f       NK= f)Nz ssh-ed25519-cert-v01@openssh.com)msgkey_type	cert_typerOPENSSHz
need a key)public_blobr   _check_type_and_load_certnamenaclsigning	VerifyKey
get_binaryopen_read_private_key_parse_signing_key_data
ValueError_signing_key_verifying_key)
selfr   datafilenamepasswordfile_objverifying_keysigning_keyfpkformats
             9/venv/lib/python3.13/site-packages/paramiko/ed25519key.py__init__Ed25519Key.__init__,   s      &**;4+$-C?**< + 
 !LL223>>3CDM!h$!%!7!7	1!E %$!!33IxHNHx66tFK=#8\**'+ %$s   7C))
C7c                    SSK Jn  [        U5      nUR                  [	        [
        5      5      [
        :w  a  [        S5      eUR                  5       nUR                  5       nUR                  5       nUR                  5       nUS:X  a  U(       d  US:w  a  [        S5      eOOUS:X  a>  U(       d  [        S5      e[        U5      n	U	R                  5       n
U	R                  5       nO[        S5      eUS:w  a  XSR                  ;  a  [        S5      e/ n[        U5       Hd  n[        UR                  5       5      nUR                  5       U R                  :w  a  [        S5      eUR                  UR                  5       5        Mf     UR                  5       nUS:X  a  UnOUR                  U   n[        R                   " [#        U5      W
US   US   -   WS	S
9n[%        US   " US US    5      US   " UUS   S  5      ['        5       S9R)                  5       nUR+                  U5      UR-                  5       -   n[        [/        U5      5      nUR                  5       UR                  5       :w  a  [        S5      e/ n[        U5       H  nUR                  5       U R                  :w  a  [        S5      eUR                  5       nUR                  5       n[0        R2                  R5                  US S 5      nUR6                  R9                  5       Us=:X  a  UU   s=:X  a  USS  :X  d    e   eUR                  U5        UR                  5         M     [	        U5      S:w  a  [        S5      eU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   appendr1   kdfr	   r   r   	decryptorupdatefinalizer   r   r   
SigningKey
verify_keyencode)r"   r#   r%   r/   message
ciphernamekdfname
kdfoptionsnum_keysrC   bcrypt_saltbcrypt_roundspublic_keys_pubkeyprivate_ciphertextprivate_datacipherkeyrD   signing_keysipublickey_datar(   s                            r+   r   "Ed25519Key._parse_signing_key_dataI   sN   0 $-S!3459KK}--%%'
""$'')
??$f Z61"=11 2 /3  *%C..*KKKMM}--J6L6L$L}--xAW//12F DII-"=11v0023	 ! %//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                    U R                  5       (       a  U R                  R                  nOU R                  n[	        5       nUR                  U R                  5        UR                  UR                  5       5        UR                  5       $ N)	can_signr    rH   r!   r   
add_stringr   rI   asbytes)r"   vms      r+   rb   Ed25519Key.asbytes   s^    ==??!!,,A##AI	TYY	QXXZ yy{r]   c                     U R                  5       (       a  U R                  R                  nOU R                  nU R	                  5       U4$ r_   )r`   r    rH   r!   get_name)r"   rc   s     r+   _fieldsEd25519Key._fields   s:    ==??!!,,A##A##r]   c                     U R                   $ r_   )r   r"   s    r+   rg   Ed25519Key.get_name   s    yyr]   c                     g)N    rk   s    r+   get_bitsEd25519Key.get_bits   s    r]   c                     U R                   S L$ r_   )r    rk   s    r+   r`   Ed25519Key.can_sign   s      ,,r]   c                     [        5       nUR                  U R                  5        UR                  U R                  R	                  U5      R
                  5        U$ r_   )r   ra   r   r    sign	signature)r"   r#   	algorithmrd   s       r+   sign_ssh_dataEd25519Key.sign_ssh_data   sA    I	TYY	T&&++D1;;<r]   c                     UR                  5       U R                  :w  a  g U R                  R                  XR	                  5       5        g! [
        R                  R                   a     gf = f)NFT)r>   r   r!   verifyr   r   
exceptionsBadSignatureError)r"   r#   r   s      r+   verify_ssh_sigEd25519Key.verify_ssh_sig   sZ    <<>TYY&	&&t^^-=>  00 		s   )A A,+A,)r    r!   r   )NNNNNr_   )__name__
__module____qualname____firstlineno____doc__r   r,   r   rb   propertyrh   rg   rp   r`   rx   r~   __static_attributes__ro   r]   r+   r   r      sS    	 D KO,:^@ $ $-	r]   r   )r1   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   nacl.signingr   paramiko.messager   paramiko.pkeyr   r   r   paramiko.utilr	   paramiko.ssh_exceptionr
   r   r   ro   r]   r+   <module>r      s0   "  8 9  $ B B  Jv vr]   