
    mgP                     h   U d Z ddlmZmZ ddlZddlmZmZmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZmZ ddlmZmZ e
ed	f   Zeeeeegef   Ze	eeef   Zeeeegef   Ze	eef   Zeeeegef   Z e	e e	ed
f   f   Z! ed      Z" ed      Z# ed      Z$ ed      Z% ed      Z& ed      Z' ed      Z( ed      Z) ed      Z* ed      Z+ ed      Z, ed      Z- ed      Z. ed      Z/ ed      Z0 ed      Z1 ed      Z2 ed      Z3 ed      Z4 ed      Z5i Z6eeef   e7d<   i Z8eeef   e7d <   i Z9eeef   e7d!<   i Z:ee	eef   ef   e7d"<   i Z;eeef   e7d#<   i Z<eeef   e7d$<   i Z=eee!f   e7d%<   i Z>eeef   e7d&<   i Z?eeef   e7d'<   i Z@eeef   e7d(<    G d) d*eA      ZB G d+ d	      ZCd,ed-ed.ed/ed0ed1efd2ZDd,ed-ed.ed/ed0ed3ed1efd4ZEd5ed-ed,ed6ed1ef
d7ZFd5ed-ed,ed6ed1ef
d8ZGd9ed6ed:ed1efd;ZHd<ed-ed=ed1efd>ZId5ed-ed1efd?ZJd@edAed6ed1dfdBZKdCedDedEedFed,ed6ed1dfdGZLdHedIedFed6ed1df
dJZMdKedLedFe dMed1df
dNZNdDedOed1dfdPZOdQed@ed-ed1e	eeef   fdRZPdQedAedSed-ed1ef
dTZQdQedCedDedUed-ed1efdVZRdWed-ed1efdXZSdYZTdZd[e"eFedZfdZd\e#eFedZfd]d\e(eGed]fd^d\e'eGed^fd_d\e&eGed`fdad\e%eGedbffZUdce-eHdcfdde.eHddfdee/eHdefdfe+eHdffdge)eHdgfdZe,eHdZfd^e*eHd^ffZVdhe0eIffZWd\e1fdie2fdje3fdke4fdle5ffZXeTD ]  ZY eKeY  	 eUD ]  ZZ eLeZ  	 eVD ]  Z[ eMe[  	 eWD ]  Z\ eNe\  	 eXD ]  Z] eOe]  	 y)mz2Asymmetric key password based encryption functions    )md5sha1N)CallableDictSequenceTupleUnion   )ASN1DecodeErrorObjectIdentifier
der_encode
der_decode)BasicCipherget_cipher_paramspbkdf2_hmac)
BytesOrStrHashType_RFC1423Pad.z1.2.840.113549.1.5.3z1.2.840.113549.1.5.10z1.2.840.113549.1.5.13z1.2.840.113549.1.12.1.1z1.2.840.113549.1.12.1.2z1.2.840.113549.1.12.1.3z1.2.840.113549.1.12.1.4z1.2.840.113533.7.66.10z1.2.840.113549.3.7z1.3.6.1.4.1.3029.1.2z1.3.14.3.2.7z2.16.840.1.101.3.4.1.2z2.16.840.1.101.3.4.1.22z2.16.840.1.101.3.4.1.42z1.2.840.113549.1.5.12z1.2.840.113549.2.7z1.2.840.113549.2.8z1.2.840.113549.2.9z1.2.840.113549.2.10z1.2.840.113549.2.11_pkcs1_cipher_pkcs1_dek_name_pkcs8_handler_pkcs8_cipher_oid_pbes2_cipher_pbes2_cipher_oid
_pbes2_kdf_pbes2_kdf_oid
_pbes2_prf_pbes2_prf_oidc                       e Zd ZdZy)KeyEncryptionErrorzKey encryption error

       This exception is raised by key decryption functions when the data
       provided is not a valid encrypted private key.

    N)__name__
__module____qualname____doc__     ,lib/python3.12/site-packages/asyncssh/pbe.pyr    r    V   s    r&   r    c                   H    e Zd ZdZdedededefdZdedefd	Zdedefd
Z	y)r   a9  RFC 1423 padding functions

       This class implements RFC 1423 padding for encryption and
       decryption of data by block ciphers. On encryption, the data is
       padded by between 1 and the cipher's block size number of bytes,
       with the padding value being equal to the length of the padding.

    cipher_name
block_sizekeyivc                 6    t        |||      | _        || _        y )N)r   _cipher_block_size)selfr)   r*   r+   r,   s        r'   __init__z_RFC1423Pad.__init__i   s    ";R8%r&   datareturnc                     | j                   t        |      | j                   z  z
  }||t        |f      z  z  }| j                  j	                  |      S )zPad data before encrypting it)r/   lenbytesr.   encryptr0   r2   pads      r'   r7   z_RFC1423Pad.encryptn   sM     #d)d.>.>">?eSFm##||##D))r&   c                     | j                   j                  |      }|rC|d   }d|cxk  r| j                  k  r)n t	        d      || d |t        |f      z  k(  r|d|  S t	        d      )z,Remove padding from data after decrypting itr
   NzUnable to decrypt key)r.   decryptr/   r6   r    r8   s      r'   r<   z_RFC1423Pad.decryptu   s|     ||##D)r(CS,D,,, !!899 #K3v#66EcT{" !899r&   N)
r!   r"   r#   r$   strintr6   r1   r7   r<   r%   r&   r'   r   r   _   sP    &C &S &&!&&
*E *e *:E :e :r&   hash_alg
passphrasesaltcountkey_sizer3   c                    t        |t              r|j                  d      }||z   }t        |      D ]  } | |      j	                         } t        |      |k  r!|t        | ||z   |||t        |      z
        z   S |d| S )a  PKCS#5 v1.5 key derivation function for password-based encryption

       This function implements the PKCS#5 v1.5 algorithm for deriving
       an encryption key from a passphrase and salt.

       The standard PBKDF1 function cannot generate more key bytes than
       the hash digest size, but 3DES uses a modified form of it which
       calls PBKDF1 recursively on the result to generate more key data.
       Support for this is implemented here.

    utf-8N)
isinstancer=   encoderangedigestr5   _pbkdf1)r?   r@   rA   rB   rC   r+   _s          r'   rJ   rJ      s     *c"&&w/

t
C5\sm""$  3x8WXsZ'7u%C02 2 	2 9H~r&   idxc                    dt         dt        dt         fd} |        j                  }|t        |f      z  }t        |t              r|j                  d      }t         |||       ||dz   |      z         }	d}
t        |
      |k  r||	z   }t        |      D ]  } | |      j                         } t        j                   |||      d      }t        d	t        |	      |      D ]E  }t        j                  |	|||z    d      |z   d
z   d
|dz  z  z  }|j                  |d      |	|||z    G |
|z  }
t        |
      |k  r|
d| S )zPKCS#12 key derivation function for password-based encryption

       This function implements the PKCS#12 algorithm for deriving an
       encryption key from a passphrase and salt.

    r2   vr3   c                 V    t        |       }||z   dz
  |z  |z  }||z   dz
  |z  | z  d| S )z9Make a block a multiple of v bytes long by repeating datar
   N)r5   )r2   rN   lsizes       r'   _make_blockz_pbkdf_p12.<locals>._make_block   sC     IQq A%(Q,1$,et44r&   zutf-16bes     r&   bigr   r
      N)r6   r>   r*   rF   r=   rG   	bytearrayr5   rH   rI   
from_bytesto_bytes)r?   r@   rA   rB   rC   rL   rR   rN   DIr+   AiBxs                  r'   
_pbkdf_p12r^      sS   5% 5C 5E 5 	
A	E3&MA*c"&&z2
+dA&Z'5I1)MMNA
C
c(X
EuA""$A  NN;q!,e4q#a&!$A!AaC%014q8Q!A#XFAzz!U+Aa!H % 	q c(X
 y>r&   paramsr)   c                    t        | t              r4t        |       dk7  s&t        | d   t              rt        | d   t              st        d      | \  }}t        |      \  }}}t        ||||||z         }	|	d| |	|d }
}	t        |||	|
      S )aD  PKCS#5 v1.5 cipher selection function for password-based encryption

       This function implements the PKCS#5 v1.5 algorithm for password-based
       encryption. It returns a cipher object which can be used to encrypt
       or decrypt data based on the specified encryption parameters,
       passphrase, and salt.

       r   r
   z#Invalid PBES1 encryption parametersN)	rF   tupler5   r6   r>   r    r   rJ   r   )r_   r@   r?   r)   rA   rB   rC   iv_sizer*   r+   r,   s              r'   _pbes1rd      s     vu%V)96!9e,6!9c* !FGGKD%$5k$B!Hgz
(JeX5G
HC)8nc()nC{JR88r&   c                 j   t        | t              rAt        |       dk7  s3t        | d   t              r | d   rt        | d   t              r| d   dk(  rt        d      | \  }}t        |      \  }}}t        |||||d      }	|dk(  rt        ||	d      }
|
S t        |||||d      }t        |||	|      }
|
S )a<  PKCS#12 cipher selection function for password-based encryption

       This function implements the PKCS#12 algorithm for password-based
       encryption. It returns a cipher object which can be used to encrypt
       or decrypt data based on the specified encryption parameters,
       passphrase, and salt.

    ra   r   r
   z+Invalid PBES1 PKCS#12 encryption parametersr&   )
rF   rb   r5   r6   r>   r    r   r^   r   r   )r_   r@   r?   r)   rA   rB   rC   rc   r*   r+   cipherr,   s               r'   _pbe_p12rg      s     vu%V)96!9e,F1I6!9c*fQi1n !NOOKD%$5k$B!Hgz
Xz4!
DCQ%k3<
 M *dE7AF[*c2>Mr&   
enc_paramsr+   c                     t        |      \  }}}t        |       dk7  st        | d   t              st	        d      t        | d         |k7  rt	        d      t        |||| d         S )zPKCS#5 v2.0 handler for PBES2 ciphers with an IV as a parameter

       This function returns the appropriate cipher object to use for
       PBES2 encryption for ciphers that have only an IV as an encryption
       parameter.

    r
   r   #Invalid PBES2 encryption parametersz&Invalid length IV for PBES2 encryption)r   r5   rF   r6   r    r   )rh   r)   r+   rK   rc   r*   s         r'   	_pbes2_ivrk      sl     /{;Aw

:!:jmU#C !FGG
:a=W$ !IJJ{JZ]CCr&   
kdf_paramsdefault_key_sizec                    t        |       dk7  s$t        | d   t              rt        | d         dk  rt        d      t	        | d         } t        | d   t
              rt        | d   t              st        d      | j                  d      }| j                  d      }| r%t        | d   t              r| j                  d      }n|}| rjt        | d   t              rLt        | d         dk(  r;t        | d   d   t              r%| d   d   }|t        v r
t        |   }nt        d      t        d      d}t        |t              r|j                  d      }t        |||||      S )	zPKCS#5 v2.0 handler for PBKDF2 key derivation

       This function parses the PBKDF2 arguments from a PKCS#8 encrypted key
       and returns the encryption key to use for encryption.

    r
   r   ra   z'Invalid PBES2 key derivation parametersz$Unknown PBES2 pseudo-random functionz/Invalid PBES2 pseudo-random function parametersr   rE   )r5   rF   rb   r    listr6   r>   popr   r   r=   rG   r   )rl   r@   rm   rA   rB   rC   prf_alg	hash_names           r'   _pbes2_pbkdf2rs     s^    	J1Jz!}e$D
1" !JKKjm$Jz!}e,:a=#. !JKK>>!DNN1EjA4>>!$#z!}e,Z]1Cq1H:a=+-=> mA&G*$&w/	( *4 5 5 % &2 3 3 	*c"&&w/
y*dE8DDr&   c                 $   t        | t              rVt        |       dk7  sHt        | d   t              r5t        | d         dk  s$t        | d   t              rt        | d         dk  rt        d      t	        | d         }|j                  d      }|t        vrt        d      t	        | d         }|j                  d      }|t        vrt        d      t        |   \  }}t        |   \  }}	t        |	      \  }
}} ||||
g| } |||	|      S )a=  PKCS#5 v2.0 cipher selection function for password-based encryption

       This function implements the PKCS#5 v2.0 algorithm for password-based
       encryption. It returns a cipher object which can be used to encrypt
       or decrypt data based on the specified encryption parameters and
       passphrase.

    ra   r   r
   rj   z%Unknown PBES2 key derivation functionz"Unknown PBES2 encryption algorithm)	rF   rb   r5   r    ro   rp   r   r   r   )r_   r@   rl   kdf_algrh   enc_algkdf_handlerkdf_argsenc_handlerr)   rm   rK   r+   s                r'   _pbes2rz   B  s    vu%V)96!9e,F1I0B6!9e,F1I0B !FGGfQiJnnQGj  !HIIfQiJnnQGm# !EFF&w/K,W5K.{;a
j*.>
J
JCz;44r&   pkcs1_cipher_namepkcs1_dek_namec                 (    |t         |<   |t        | <   y)z8Register a cipher used for PKCS#1 private key encryptionN)r   r   )r{   r|   r)   s      r'   register_pkcs1_cipherr~   e  s     %0M.!)7O%&r&   pkcs8_cipher_namerr   pkcs8_cipher_oidhandlerc                 2    |||ft         |<   |t        | |f<   y)z8Register a cipher used for PKCS#8 private key encryptionN)r   r   )r   rr   r   r   r?   r)   s         r'   register_pkcs8_cipherr   m  s'     )0;'GN#$6F'23r&   pbes2_cipher_namepbes2_cipher_oidc                 ,    ||ft         |<   |t        | <   y)z%Register a PBES2 encryption algorithmN)r   r   )r   r   r   r)   s       r'   register_pbes2_cipherr   w  s      (/&<M"#+;'(r&   kdf_namekdf_oidargsc                 ,    ||ft         |<   |t        | <   y)z(Register a PBES2 key derivation functionN)r   r   )r   r   r   r   s       r'   register_pbes2_kdfr     s     #D/Jw&N8r&   prf_oidc                 (    | t         |<   |t        | <   y)z'Register a PBES2 pseudo-random functionN)r   r   )rr   r   s     r'   register_pbes2_prfr     s     $Jw 'N9r&   r2   c                    |t         v rnt         |   }t        |   }t        |      \  }}}t        j                  |      }t        t        ||dd d|      }	t        |||	|      }
|||
j                  |       fS t        d      )zEncrypt PKCS#1 key data

       This function encrypts PKCS#1 key data using the specified cipher
       and passphrase. Available ciphers include:

           aes128-cbc, aes192-cbc, aes256-cbc, des-cbc, des3-cbc

    NrT   r
   #Unknown PKCS#1 encryption algorithm)
r   r   r   osurandomrJ   r   r   r7   r    )r2   r{   r@   r|   r)   rC   rc   r*   r,   r+   rf   s              r'   pkcs1_encryptr     s     O+():;#N3(9+(F%':ZZ c:r"1vq(;[*c2>r6>>$#777 !FGGr&   r,   c                     |t         v rMt         |   }t        |      \  }}}t        t        ||dd d|      }t	        ||||      }	|	j                  |       S t        d      )zDecrypt PKCS#1 key data

       This function decrypts PKCS#1 key data using the specified algorithm,
       initialization vector, and passphrase. The algorithm name and IV
       should be taken from the PEM DEK-Info header.

    NrT   r
   r   )r   r   rJ   r   r   r<   r    )
r2   r|   r,   r@   r)   rC   rK   r*   r+   rf   s
             r'   pkcs1_decryptr     sj     &#N3"3K"@!Zc:r"1vq(;[*c2>~~d## !FGGr&   versionc                 `   |dk(  rG||ft         v r=t         ||f   }t        |   \  }}}|}	t        j                  d      df}
 ||
|||      }n|dk(  r|t        v rt        |   }t
        |   \  }}t        |      \  }}}t        j                  d      dg}t        j                  |      }||f}|dk7  r.|t        v r|j                  t        |   df       nt        d      t        }	t        t        |      f|f}
t        |
|      }nt        d      t        |	|
f|j                  |       f      S )	a  Encrypt PKCS#8 key data

       This function encrypts PKCS#8 key data using the specified cipher,
       hash, encryption version, and passphrase.

       Available ciphers include:

           aes128-cbc, aes192-cbc, aes256-cbc, blowfish-cbc, cast128-cbc,
           des-cbc, des2-cbc, des3-cbc, rc4-40, and rc4-128

       Available hashes include:

           md5, sha1, sha256, sha384, sha512

       Available versions include 1 for PBES1 and 2 for PBES2.

       Only some combinations of cipher, hash, and version are supported.

    r
   rT   i   ra   r   NzUnknown PBES2 hash function#Unknown PKCS#8 encryption algorithm)r   r   r   r   r   r   r   r   appendr    _ES2_ES2_PBKDF2rb   rz   r   r7   )r2   r   rr   r   r@   r   r   r?   r)   algr_   rf   r   rK   rc   rl   r,   rh   s                     r'   pkcs8_encryptr     sJ   , !|*I6:KK,->	-IJ)78H)I&;**Q-.X{C	A+/@@,->?&'78;)+67AjjmT*
ZZ &+
N*!!>)#<d"CD()FGGj 12J?
+ !FGGV}fnnT&:;<<r&   key_datac                    t        | t              rt        |       dk7  rt        d      | \  }}t        |t              rt        |      dk7  st        |t              st        d      |\  }}|t
        k(  rt        ||      }n,|t        v rt        |   \  }}}	 |||||	      }nt        d      	 t        |j                  |            S # t        t        f$ r t        d      dw xY w)zDecrypt PKCS#8 key data

       This function decrypts key data in PKCS#8 EncryptedPrivateKeyInfo
       format using the specified passphrase.

    ra   z#Invalid PKCS#8 encrypted key formatr   z!Invalid PKCS#8 encrypted key dataN)rF   rb   r5   r    r6   r   rz   r   r   r<   r   UnicodeDecodeError)
r   r@   
alg_paramsr2   r   r_   rf   r   r?   r)   s
             r'   pkcs8_decryptr     s     h&#h-1*< !FGGJz5)S_-A4' !FGGKC
d{
+		)7)<&;X{C !FGGP&...///0 P !DE4OPs   0C
 
C&))
aes128-cbcs   AES-128-CBCr   )
aes192-cbcs   AES-192-CBCr   )
aes256-cbcs   AES-256-CBCr   )des-cbcs   DES-CBCr   )des3-cbcs   DES-EDE3-CBCr   r   r   r   zdes2-cbcr   zrc4-40	arcfour40zrc4-128arcfourr   r   r   zblowfish-cbczcast128-cbcpbkdf2sha224sha256sha384sha512)^r$   hashlibr   r   r   typingr   r   r   r   r	   asn1r   r   r   r   cryptor   r   r   miscr   r   _Cipherobjectr=   _PKCS8CipherHandler_PKCS8Cipherr6   _PBES2CipherHandler_PBES2Cipherr>   _PBES2KDFHandler	_PBES2KDF_ES1_MD5_DES_ES1_SHA1_DESr   _P12_RC4_128_P12_RC4_40	_P12_DES3	_P12_DES2_ES2_CAST128	_ES2_DES3_ES2_BF_ES2_DES_ES2_AES128_ES2_AES192_ES2_AES256r   	_ES2_SHA1_ES2_SHA224_ES2_SHA256_ES2_SHA384_ES2_SHA512r   __annotations__r   r   r   r   r   r   r   r   r   
ValueErrorr    r   rJ   r^   rd   rg   rk   rs   rz   r~   r   r   r   r   r   r   r   r   _pkcs1_cipher_list_pkcs8_cipher_list_pbes2_cipher_list_pbes2_kdf_list_pbes2_prf_list_pkcs1_cipher_args_pkcs8_cipher_args_pbes2_cipher_args_pbes2_kdf_args_pbes2_prf_argsr%   r&   r'   <module>r      s  * 9  	 9 9 K K ? ? & ]*
+
HcBGKL ((C78#u5w>? (#-.Xz37>? "E&#+$667	 ##9:"#:;"#:;"#<="#<="#<=	"#<=	"#;<"#78	"#9:">2"#;<"#<="#<="#:;"#78	"#78"#78"#89"#89"$tE3J $$&c5j! &79%|34 9=? 4c3h)99: ?68t$l23 813 4--. 302
D!9,- 2.0S**+ 0*,
D!3&' ,.0S**+ 0 !: !:Hh J e "%*/8% %z % %%%(%/2%7<%P96 9z 9X 99 '92V  x ")<D( D D5 DW D(-Eh -EJ -E$'-E,1-E` 56  5z  5g  5F8S 8% 8'*8/38GS GS G,<G#6GBJG (+G 04G<S <,<<#6< (+< 04<' '/? ' 0'9?'DH'(# (0@ (T (H H# H(H-25%3F-GH2H Hu H% H(H-2H*2= 2=# 2=# 2=2=,62=;@2=jPF P
 Pv PB  vyAvyA	xzB	xzBx{CxyA  [9|<[9|<[9|<W9~>\9}=X9y9Y9z:  {M*
 y{{{{ --. - --. - --. - 'O( ' 'O( 'r&   