
    @wjX                       U d dl mZ d dlZd dlZd dlZd dl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 d dlmZmZmZmZmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZm Z m!Z!m"Z" 	 d d
l#m$Z% dZ&dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2 ejf                  d      Z4dZ5dZ6dZ7dZ8dZ9dZ:d Z; ejf                  e6d!z   e7z   ejx                        Z= e> e? e@d"d#                  ZAe	 G d$ d%             ZB eBej                  d&ej                  d d dd'       eBej                  d&ej                  d d dd'       eBej                  d&ej                  d d(d d'      d)ZGd*eHd+<   e+e,e-d,ZId]d-ZJd^d.ZKd_d/ZLd`d0ZM	 	 	 	 	 	 	 	 	 	 dad1ZNdbd2ZOdbd3ZPdcd4ZQdbd5ZRddd6ZS G d7 d8      ZT G d9 d:      ZU G d; d<      ZV G d= d>      ZW G d? d@      ZXdedAZY G dB dC      ZZ G dD dE      Z[e) eU       e* eV       e( eX       e+ eWdF ej                               e, eWdG ej                               e- eWdH ej                               e/ eZ       e0 e[       iZ_dfdIZ`ej                  ej                  ej                  ej                  ej                  f   Zf	 dgddJ	 	 	 	 	 	 	 	 	 dhdKZg	 	 	 	 	 	 	 	 didLZhej                  ej                  ej                  ej                  ej                  f   Zmej                  ej                  ej                  ej                  f   Zn G dM dNej                        Zp G dO dP      ZqdjdQZr	 d[	 	 	 dkdRZs	 	 	 	 dkdSZtdldTZu	 	 	 	 	 	 dmdUZv	 dg	 	 	 	 	 dndVZwdodWZxej                  ej                  ej                  ej                  f   ZydXZz G dY dZ      Z{y# e'$ r dZ&	 d[	 	 	 	 	 	 	 	 	 	 	 d\dZ%Y Kw xY w)p    )annotationsN)	dataclass)utilsUnsupportedAlgorithm)hashes)dsaeced25519paddingrsa)AEADDecryptionContextCipher
algorithmsmodes)EncodingKeySerializationEncryptionNoEncryptionPrivateFormatPublicFormat_KeySerializationEncryption)kdfTFc                    t        d      )NzNeed bcrypt moduler   )passwordsaltdesired_key_bytesroundsignore_few_roundss        n/root/dashboard-youtube/.venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/ssh.py_bcrypt_kdfr    0   s     ##788    s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   sk-ssh-ed25519@openssh.coms"   sk-ecdsa-sha2-nistp256@openssh.coms   rsa-sha2-256s   rsa-sha2-512s   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   none
   aes256-ctr   s   (.*?)      c                  T    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   y)
_SSHCipherztype[algorithms.AES]algintkey_lenz3type[modes.CTR] | type[modes.CBC] | type[modes.GCM]mode	block_leniv_len
int | Nonetag_lenboolis_aeadN)__name__
__module____qualname____annotations__ r!   r   r'   r'   [   s(    	L
==NKMr!   r'       )r(   r*   r+   r,   r-   r/   r1      )r"   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]_SSH_CIPHERS)	secp256r1	secp384r1	secp521r1c                   t        | t        j                        rt        | j	                               }|S t        | t        j
                        rt        |       }|S t        | t        j                  t        j                  f      rt        }|S t        | t        j                  t        j                  f      rt        }|S t        | t        j                  t        j                   f      rt"        }|S t%        d      )NUnsupported key type)
isinstancer
   EllipticCurvePrivateKey_ecdsa_key_type
public_keyEllipticCurvePublicKeyr   RSAPrivateKeyRSAPublicKey_SSH_RSAr	   DSAPrivateKeyDSAPublicKey_SSH_DSAr   Ed25519PrivateKeyEd25519PublicKey_SSH_ED25519
ValueError)keykey_types     r   _get_ssh_key_typerP      s    #r112"3>>#34 O 
C22	3"3' O 
C#++S-=-=>	? O 
C#++S-=-=>	? O 
g'')A)AB
   O /00r!   c                    | j                   }|j                  t        vrt        d|j                        t        |j                     S )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )curvename_ECDSA_KEY_TYPErM   )rB   rR   s     r   rA   rA      sE    Ezz(5ejj^D
 	
 5::&&r!   c                @    | rt        |       |z  dk7  rt        d      y)zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenrM   )datar,   s     r   _check_block_sizerX      s&    3t9y(A-899 .r!   c                    | rt        d      y)z!All data should have been parsed.zCorrupt data: unparsed dataN)rM   rW   s    r   _check_emptyr[      s    677 r!   c                   |st        d      t        |    }t        |||j                  |j                  z   |d      }t        |j                  |d|j                         |j                  ||j                  d             S )z$Generate key + iv and return cipher.z9Key is password-protected, but password was not provided.TN)	TypeErrorr9   r    r*   r-   r   r(   r+   )
ciphernamer   r   r   ciphseeds         r   _init_cipherra      s     G
 	
 
#D$t{{2FDD n%&		$t||~&' r!   c                r    t        |       dk  rt        d      t        j                  | dd d      | dd fS )Uint32   Invalid dataNbig	byteorderrV   rM   r)   
from_bytesrZ   s    r   _get_u32rk      <    
4y1}((>>$r(e>4d12h>>r!   c                r    t        |       dk  rt        d      t        j                  | dd d      | dd fS )Uint64   re   Nrf   rg   ri   rZ   s    r   _get_u64rp      rl   r!   c                d    t        |       \  }} |t        |       kD  rt        d      | d| | |d fS )zBytes with u32 length prefixre   N)rk   rV   rM   )rW   ns     r   _get_sshstrrs      s<    tnGAt3t9}((8T!"Xr!   c                x    t        |       \  }} |r|d   dkD  rt        d      t        j                  |d      | fS )zBig integer.r      re   rf   )rs   rM   r)   rj   )rW   vals     r   
_get_mpintrw      s>    D!IC
s1v}((>>#u%t++r!   c                    | dk  rt        d      | sy| j                         dz   dz  }t        j                  | |      S )z!Storage format for signed bigint.r   znegative mpint not allowedr!   ro   )rM   
bit_lengthr   int_to_bytes)rv   nbytess     r   	_to_mpintr|      sD    
Qw566nn"q(Fc6**r!   c                  h    e Zd ZU dZded<   dddZddZddZddZdd	Z	dd
Z
ddZdddZddZy)	_FragListz,Build recursive structure without data copy.zlist[utils.Buffer]flistNc                N    g | _         |r| j                   j                  |       y y N)r   extend)selfinits     r   __init__z_FragList.__init__   s#    
JJd# r!   c                :    | j                   j                  |       y)zAdd plain bytesN)r   appendr   rv   s     r   put_rawz_FragList.put_raw   s    

#r!   c                \    | j                   j                  |j                  dd             y)zBig-endian uint32rd   rf   lengthrh   Nr   r   to_bytesr   s     r   put_u32z_FragList.put_u32  !    

#,,a5,ABr!   c                \    | j                   j                  |j                  dd             y)zBig-endian uint64ro   rf   r   Nr   r   s     r   put_u64z_FragList.put_u64  r   r!   c                .   t        |t        t        t        f      r6| j	                  t        |             | j                  j                  |       y| j	                  |j                                | j                  j                  |j                         y)zBytes prefixed with u32 lengthN)
r?   bytes
memoryview	bytearrayr   rV   r   r   sizer   r   s     r   
put_sshstrz_FragList.put_sshstr
  s]    cE:y9:LLS"JJc"LL$JJcii(r!   c                8    | j                  t        |             y)z*Big-endian bigint prefixed with u32 lengthN)r   r|   r   s     r   	put_mpintz_FragList.put_mpint  s    	#'r!   c                H    t        t        t        | j                              S )zCurrent number of bytes)summaprV   r   r   s    r   r   z_FragList.size  s    3sDJJ'((r!   c                V    | j                   D ]  }t        |      }|||z   }}||||  |S )zWrite into bytearray)r   rV   )r   dstbufposfragflenstarts         r   renderz_FragList.render  s>    JJ 	%Dt9DcDj3E $F5	% 
r!   c                    t        t        | j                                     }| j                  |       |j	                         S )zReturn as bytes)r   r   r   r   tobytes)r   bufs     r   r   z_FragList.tobytes#  s/    499;/0C{{}r!   r   )r   zlist[utils.Buffer] | NonereturnNone)rv   utils.Bufferr   r   )rv   r)   r   r   )rv   zbytes | _FragListr   r   r   r)   )r   )r   r   r   r)   r   r)   r   r   )r2   r3   r4   __doc__r5   r   r   r   r   r   r   r   r   r   r6   r!   r   r~   r~      s:    6$
CC)()r!   r~   c                  l    e Zd ZdZ	 	 	 	 ddZ	 	 	 	 d	dZ	 	 	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    c                F    t        |      \  }}t        |      \  }}||f|fS )zRSA public fieldsrw   )r   rW   err   s       r   
get_publicz_SSHFormatRSA.get_public3  s.     T"4T"41vt|r!   c                    | j                  |      \  \  }}}t        j                  ||      }|j                         }||fS )zMake RSA public key from data.)r   r   RSAPublicNumbersrB   )r   rW   r   rr   public_numbersrB   s         r   load_publicz_SSHFormatRSA.load_public;  sE     t,A--a3#..0
4r!   c           	        t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }	}||f|k7  rt        d      t        j                  ||      }
t        j                  ||	      }t        j
                  ||      }t        j                  ||	||
|||      }|j                  |      }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatchunsafe_skip_rsa_key_validation)rw   rM   r   rsa_crt_dmp1rsa_crt_dmq1r   RSAPrivateNumbersprivate_key)r   rW   	pubfieldsr   rr   r   diqmppqdmp1dmq1r   private_numbersr   s                  r   load_privatez_SSHFormatRSA.load_privateD  s     T"4T"4T"4%
dT"4T"4q6Y?@@1%1%--a3//q!T4~
 &11+I 2 
 D  r!   c                    |j                         }|j                  |j                         |j                  |j                         y)zWrite RSA public keyN)r   r   r   rr   )r   rB   f_pubpubns       r   encode_publicz_SSHFormatRSA.encode_public\  s2     ((*r!   c                   |j                         }|j                  }|j                  |j                         |j                  |j                         |j                  |j
                         |j                  |j                         |j                  |j                         |j                  |j                         y)zWrite RSA private keyN)	r   r   r   rr   r   r   r   r   r   )r   r   f_privr   r   s        r   encode_privatez_SSHFormatRSA.encode_privated  s     &557(77))*))***+--.**+**+r!   N)rW   r   r   z"tuple[tuple[int, int], memoryview])rW   r   r   z#tuple[rsa.RSAPublicKey, memoryview])rW   r   r   r0   r   z$tuple[rsa.RSAPrivateKey, memoryview])rB   zrsa.RSAPublicKeyr   r~   r   r   )r   zrsa.RSAPrivateKeyr   r~   r   r   	r2   r3   r4   r   r   r   r   r   r   r6   r!   r   r   r   *  s    	+  	, !!KO!	-!0 * 3< 	 ,,,6?,	,r!   r   c                  l    e Zd ZdZd	dZ	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZ	y)_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    c                    t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}||||f|fS )zDSA public fieldsr   )r   rW   r   r   gys         r   r   z_SSHFormatDSA.get_public}  sM    T"4T"4T"4T"41a|T!!r!   c                    | j                  |      \  \  }}}}}t        j                  |||      }t        j                  ||      }| j	                  |       |j                         }||fS )zMake DSA public key from data.)r   r	   DSAParameterNumbersDSAPublicNumbers	_validaterB   )	r   rW   r   r   r   r   parameter_numbersr   rB   s	            r   r   z_SSHFormatDSA.load_public  sl     "__T2Aq!d33Aq!<--a1BC~&#..0
4r!   c                H   | j                  |      \  \  }}}}}t        |      \  }}||||f|k7  rt        d      t        j                  |||      }	t        j
                  ||	      }
| j                  |
       t        j                  ||
      }|j                         }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r   rw   rM   r	   r   r   r   DSAPrivateNumbersr   )r   rW   r   r   r   r   r   r   xr   r   r   r   s                r   r   z_SSHFormatDSA.load_private  s     "__T2Aq!dT"4q!Q<9$?@@33Aq!<--a1BC~&//>B%113D  r!   c                6   |j                         }|j                  }| j                  |       |j                  |j                         |j                  |j
                         |j                  |j                         |j                  |j                         y)zWrite DSA public keyN)r   r   r   r   r   r   r   r   )r   rB   r   r   r   s        r   r   z_SSHFormatDSA.encode_public  su     $224*<<~&)++,)++,)++,(()r!   c                    | j                  |j                         |       |j                  |j                         j                         y)zWrite DSA private keyN)r   rB   r   r   r   )r   r   r   s      r   r   z_SSHFormatDSA.encode_private  s:     	;113V<446889r!   c                l    |j                   }|j                  j                         dk7  rt        d      y )Ni   z#SSH supports only 1024 bit DSA keys)r   r   ry   rM   )r   r   r   s      r   r   z_SSHFormatDSA._validate  s6    *<<))+t3BCC 4r!   N)rW   r   r   ztuple[tuple, memoryview])rW   r   r   z#tuple[dsa.DSAPublicKey, memoryview])rW   r   r   r0   r   z$tuple[dsa.DSAPrivateKey, memoryview])rB   zdsa.DSAPublicKeyr   r~   r   r   )r   zdsa.DSAPrivateKeyr   r~   r   r   )r   zdsa.DSAPublicNumbersr   r   )
r2   r3   r4   r   r   r   r   r   r   r   r6   r!   r   r   r   t  s~    "	 	 	,	 !!KO!	-! ***3<*	*:,:6?:	:Dr!   r   c                  t    e Zd ZdZd	dZ	 	 	 	 d
dZ	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	y)_SSHFormatECDSAzFormat for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    c                     || _         || _        y r   )ssh_curve_namerR   )r   r   rR   s      r   r   z_SSHFormatECDSA.__init__  s    ,
r!   c                    t        |      \  }}t        |      \  }}|| j                  k7  rt        d      t        |      dk(  rt        d      |d   dk7  rt	        d      ||f|fS )zECDSA public fieldszCurve name mismatchr   zInvalid EC point: empty datard   zNeed uncompressed point)rs   r   rM   rV   NotImplementedError)r   rW   rR   points       r   r   z_SSHFormatECDSA.get_public  sw     "$'t!$'tD'''233u:?;<<8q=%&?@@u~t##r!   c                    | j                  |      \  \  }}}t        j                  j                  | j                  |j                               }||fS z Make ECDSA public key from data.)r   r
   rC   from_encoded_pointrR   r   )r   rW   _r   rB   s        r   r   z_SSHFormatECDSA.load_public  sM      ??40
ED..AAJJ

 4r!   c                    | j                  |      \  \  }}}t        |      \  }}||f|k7  rt        d      t        j                  || j
                        }||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r   rw   rM   r
   derive_private_keyrR   )r   rW   r   r   
curve_namer   secretr   s           r   r   z_SSHFormatECDSA.load_private  sd     %)OOD$9!UT!$')+ABB++FDJJ?D  r!   c                    |j                  t        j                  t        j                        }|j                  | j                         |j                  |       y)zWrite ECDSA public keyN)public_bytesr   X962r   UncompressedPointr   r   )r   rB   r   r   s       r   r   z_SSHFormatECDSA.encode_public  sG     ''MM<99
 	,,-r!   c                    |j                         }|j                         }| j                  ||       |j                  |j                         y)zWrite ECDSA private keyN)rB   r   r   r   private_value)r   r   r   rB   r   s        r   r   z_SSHFormatECDSA.encode_private  sD     !++-
%557:v.667r!   N)r   r   rR   ec.EllipticCurve)rW   r   r   z0tuple[tuple[memoryview, memoryview], memoryview]rW   r   r   z,tuple[ec.EllipticCurvePublicKey, memoryview])rW   r   r   r0   r   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rB   ec.EllipticCurvePublicKeyr   r~   r   r   )r   zec.EllipticCurvePrivateKeyr   r~   r   r   )
r2   r3   r4   r   r   r   r   r   r   r   r6   r!   r   r   r     s    	$$	9$  	5 
!
!KO
!	6
! 3 <E 	 858?H8	8r!   r   c                  l    e Zd ZdZ	 	 	 	 ddZ	 	 	 	 d	dZ	 	 	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    c                (    t        |      \  }}|f|fS )zEd25519 public fields)rs   )r   rW   r   s      r   r   z_SSHFormatEd25519.get_public  s     "$'tx~r!   c                    | j                  |      \  \  }}t        j                  j                  |j	                               }||fS z"Make Ed25519 public key from data.)r   r   rK   from_public_bytesr   )r   rW   r   rB   s       r   r   z_SSHFormatEd25519.load_public  sD     .$--??MMO

 4r!   c                    | j                  |      \  \  }}t        |      \  }}|dd }|dd }||k7  s|f|k7  rt        d      t        j                  j                  |      }||fS )z#Make Ed25519 private key from data.Nr7   z$Corrupt data: ed25519 field mismatch)r   rs   rM   r   rJ   from_private_bytes)	r   rW   r   r   r   keypairr   point2r   s	            r   r   z_SSHFormatEd25519.load_private  sy     .$#D)"F?uh)3CDD//BB6JD  r!   c                    |j                  t        j                  t        j                        }|j	                  |       y)zWrite Ed25519 public keyN)r   r   Rawr   r   )r   rB   r   raw_public_keys       r   r   z_SSHFormatEd25519.encode_public,  s3     $00LL,**
 	(r!   c                N   |j                         }|j                  t        j                  t        j                  t                     }|j                  t        j                  t        j                        }t        ||g      }| j                  ||       |j                  |       y)zWrite Ed25519 private keyN)rB   private_bytesr   r  r   r   r   r   r~   r   r   )r   r   r   rB   raw_private_keyr  	f_keypairs          r   r   z _SSHFormatEd25519.encode_private5  s     !++-
%33LL-++\^
 $00LL,**
 ?@	:v.)$r!   N)rW   r   r   z$tuple[tuple[memoryview], memoryview]rW   r   r   z+tuple[ed25519.Ed25519PublicKey, memoryview])rW   r   r   r0   r   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rB   zed25519.Ed25519PublicKeyr   r~   r   r   )r   zed25519.Ed25519PrivateKeyr   r~   r   r   r   r6   r!   r   r   r     s    	-  	4 !!KO!	5!)2);D)	)%4%>G%	%r!   r   c                    t        |       \  }} |j                         j                  d      st        d| d      || fS )z!
    U2F application strings
    s   ssh:z4U2F application string does not start with b'ssh:' ())rs   r   
startswithrM   )rW   applications     r   load_applicationr  F  sU     $D)K ++G4}A
 	
 r!   c                  (    e Zd ZdZ	 	 	 	 ddZddZy)_SSHFormatSKEd25519z
    The format of a sk-ssh-ed25519@openssh.com public key is:

        string		"sk-ssh-ed25519@openssh.com"
        string		public key
        string		application (user-specified, but typically "ssh:")
    c                h    t        t              j                  |      \  }}t        |      \  }}||fS r   )_lookup_kformatrL   r   r  r   rW   rB   r   s       r   r   z_SSHFormatSKEd25519.load_public\  s7     +<8DDTJ
D"4(44r!   c                    t        d      )Nz,sk-ssh-ed25519 private keys cannot be loadedr   r   rW   s     r   r   z_SSHFormatSKEd25519.get_publicd  s     #:
 	
r!   Nr
  rW   r   r   ztyping.NoReturnr2   r3   r4   r   r   r   r6   r!   r   r  r  S  s!      	4 
r!   r  c                  (    e Zd ZdZ	 	 	 	 ddZddZy)_SSHFormatSKECDSAz
    The format of a sk-ecdsa-sha2-nistp256@openssh.com public key is:

        string		"sk-ecdsa-sha2-nistp256@openssh.com"
        string		curve name
        ec_point	Q
        string		application (user-specified, but typically "ssh:")
    c                h    t        t              j                  |      \  }}t        |      \  }}||fS r   )r  _ECDSA_NISTP256r   r  r  s       r   r   z_SSHFormatSKECDSA.load_publicv  s7     +?;GGM
D"4(44r!   c                    t        d      )Nz4sk-ecdsa-sha2-nistp256 private keys cannot be loadedr   r  s     r   r   z_SSHFormatSKECDSA.get_public~  s     #B
 	
r!   Nr   r  r  r6   r!   r   r  r  l  s!      	5 
r!   r  s   nistp256s   nistp384s   nistp521c                    t        | t              st        |       j                         } | t        v r	t        |    S t        d|       )z"Return valid format or throw errorzUnsupported key type: )r?   r   r   r   _KEY_FORMATSr   )rO   s    r   r  r    sE    h&h'//1<H%%
!7|D
EEr!   r   c                  t        j                  d|        |t        j                  d|       t        j	                  |       }|st        d      |j                  d      }|j                  d      }t        j                  t        |       ||       } | j                  t              st        d      t        |       t        t              d } t        |       \  }} t        |       \  }} t        |       \  }	} t        |       \  }
} |
dk7  rt        d      t        |       \  }} t        |      \  }}t!        |      }|j#                  |      \  }}t%        |       |t&        k7  s
|t&        k7  r|j)                         }|t*        vrt-        d|      |t.        k7  rt-        d|      t*        |   j0                  }t*        |   j2                  }t        |       \  }} t*        |   j4                  r$t7        |       }t        |      |k7  rt        d	      t%        |        t9        ||       t        |	      \  }}t        |      \  }}t%        |       t;        |||j)                         |      }|j=                         }t        |j?                  |            }t*        |   j4                  r-tA        |tB              sJ t%        |jE                               nNt%        |jG                                n4|rtI        d
      t        |       \  }} t%        |        d}t9        ||       t        |      \  }}t        |      \  }}||k7  rt        d      t        |      \  }}||k7  rt        d      |jK                  |||      \  }}t        |      \  }}|tL        dt        |       k7  rt        d      tA        |tN        jP                        r&tS        jT                  dt         jV                  d       |S )z.Load private key from OpenSSH custom encoding.rW   Nr   zNot OpenSSH private key formatr$   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherz4Password was given but private key is not encrypted.ro   zCorrupt data: broken checksumzCorrupt data: key type mismatchr   zCorrupt data: invalid paddingDSSH DSA keys are deprecated and will be removed in a future release.   
stacklevel),r   _check_byteslike_check_bytes_PEM_RCsearchrM   r   endbinascii
a2b_base64r   r  	_SK_MAGICrV   rs   rk   r  r   r[   _NONEr   r9   r   _BCRYPTr,   r/   r1   r   rX   ra   	decryptorupdater?   r   finalize_with_tagfinalizer]   r   _PADDINGr	   rG   warningswarnDeprecatedIn40)rW   r   backendr   mp1p2r^   kdfname
kdfoptionsnkeyspubdatapub_key_typekformatr   ciphername_bytesblklenr/   edatatagr   kbufr   r_   decck1ck2rO   r   r   s                                 r   load_ssh_private_keyrI    s    
64(:x0tA9::	
B	
qBz$/267D??9%9::dC	N,-D #4(J%MGT"4(J4.KE4z122  %MGT'0L'l+G ++G4IwUg.%--/</&&'7&:;  g&):7+'FGG./99/088!$'t ()11+C3x7" !NOO%( ,
d~T,hOnn3::e,-()11c#8999..s34 (F  "$'tT%(%JC%JC
cz899 "%(OHe<:;; --'E . K 5!HAu 3u:&&899+s001  		
 r!   c                   t        j                  d|       t        | t        j                        r&t        j                  dt         j                  d       t        |       }t        |      }t               }|rt        }t        |   j                  }t        }t        }	t        |t               r|j"                  |j"                  }	t%        j&                  d      }
|j)                  |
       |j+                  |	       t-        |||
|	      }nt.        x}}d}d}d}t%        j&                  d      }d	}t               }|j)                  |       |j1                  | j3                         |       t        ||g      }|j)                  |       |j5                  | |       |j)                  |       |j7                  t8        d||j;                         |z  z
          t               }|j7                  t<               |j)                  |       |j)                  |       |j)                  |       |j+                  |       |j)                  |       |j)                  |       |j;                         }|j;                         }t?        tA        ||z               }|jC                  |       ||z
  }|&|jE                         jG                  ||| ||d        tI        |d|       S )
z3Serialize private key with OpenSSH custom encoding.r   ISSH DSA key support is deprecated and will be removed in a future releaserd   r#  Nr#   ro   r$   r!   )%r   r&  r?   r	   rG   r4  r5  r6  rP   r  r~   _DEFAULT_CIPHERr9   r,   r.  _DEFAULT_ROUNDSr   _kdf_roundsosurandomr   r   ra   r-  r   rB   r   r   r3  r   r,  r   r   r   	encryptorupdate_intor   )r   r   encryption_algorithmrO   r@  f_kdfoptionsr^   rB  r;  r   r   r_   r=  checkvalcommentf_public_key	f_secretsf_mainslenmlenr   ofss                         r   _serialize_ssh_private_keyr]    s    
z8,+s001*  		
 !-Hh'G ;L$
j)33 +-HI$00<)55Fzz"~%V$J$?$$
WEzz!}HG ;LH%+002LA8X./I";	2!hE9>>+;f+D!EFG [F
NN9
j!
g
l#
NN5
l#
i  >>D;;=D
Ytf}-
.C
MM#
+C $$ST]CI>Udr!   c                      e Zd ZdZdZy)SSHCertificateTyper$   r"  N)r2   r3   r4   USERHOSTr6   r!   r   r_  r_  p  s    DDr!   r_  c                     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       ZddZedd       Zedd       Zedd       Z	edd       Z
edd       Zedd	       Zedd
       Zedd       ZddZddZddZy)SSHCertificatec                6   || _         || _        || _        	 t        |      | _        || _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        || _        || _        || _        || _        y # t
        $ r t        d      w xY w)NzInvalid certificate type)_nonce_public_key_serialr_  _typerM   _key_id_valid_principals_valid_after_valid_before_critical_options_extensions	_sig_type_sig_key_inner_sig_type
_signature_cert_key_type
_cert_body_tbs_cert_body)r   re  rf  rg  _cctyperi  rj  rk  rl  rm  rn  ro  rp  rq  rr  ru  rs  rt  s                     r   r   zSSHCertificate.__init__v  s    ( &	9+G4DJ !2(*!2&" .$,$,  	9788	9s   B Bc                ,    t        | j                        S r   )r   re  r   s    r   noncezSSHCertificate.nonce  s    T[[!!r!   c                J    t        j                  t        | j                        S r   )typingcastSSHCertPublicKeyTypesrf  r   s    r   rB   zSSHCertificate.public_key  s     {{0$2B2BCCr!   c                    | j                   S r   )rg  r   s    r   serialzSSHCertificate.serial  s    ||r!   c                    | j                   S r   )rh  r   s    r   typezSSHCertificate.type  s    zzr!   c                ,    t        | j                        S r   )r   ri  r   s    r   key_idzSSHCertificate.key_id  s    T\\""r!   c                    | j                   S r   )rj  r   s    r   valid_principalszSSHCertificate.valid_principals      %%%r!   c                    | j                   S r   )rl  r   s    r   valid_beforezSSHCertificate.valid_before  s    !!!r!   c                    | j                   S r   )rk  r   s    r   valid_afterzSSHCertificate.valid_after  s       r!   c                    | j                   S r   )rm  r   s    r   critical_optionszSSHCertificate.critical_options  r  r!   c                    | j                   S r   )rn  r   s    r   
extensionszSSHCertificate.extensions  s    r!   c                    t        | j                        }|j                  | j                        \  }}t	        |       |S r   )r  ro  r   rp  r[   )r   	sigformatsignature_keysigkey_rests       r   r  zSSHCertificate.signature_key  s7    #DNN3	%.%:%:4==%I"{[!r!   c                    t        | j                        dz   t        j                  t        | j                        d      z   S )N    F)newline)r   rs  r*  
b2a_base64rt  r   s    r   r   zSSHCertificate.public_bytes  s<    $%%&!!%"8%HI	
r!   c                   | j                         }t        |t        j                        r9|j	                  t        | j                        t        | j                               y t        |t        j                        rt        | j                        \  }}t        |      \  }}t        |       t        j                  ||      }t        |j                        }|j	                  |t        | j                        t        j                   |             y t        |t"        j$                        sJ | j&                  t(        k(  rt+        j,                         }nQ| j&                  t.        k(  rt+        j0                         }n)| j&                  t2        k(  sJ t+        j4                         }|j	                  t        | j                        t        | j                        t7        j8                         |       y r   )r  r?   r   rK   verifyr   rr  ru  r
   rC   rw   r[   
asym_utilsencode_dss_signature_get_ec_hash_algrR   ECDSAr   rE   rq  rF   r   SHA1_SSH_RSA_SHA256SHA256_SSH_RSA_SHA512SHA512r   PKCS1v15)r   r  rrW   scomputed_sighash_algs          r   verify_cert_signaturez$SSHCertificate.verify_cert_signature  sl   **,mW%=%=>  doo&d.A.A(B r'@'@A 1GAt &GAt%::1a@L'(;(;<H  eD$7$78"((8:L mS-=-=>>>##x/!;;=%%8!==?++>>>!==?  doo&d))*  "	r!   N)"re  r   rf  SSHPublicKeyTypesrg  r)   rv  r)   ri  r   rj  list[bytes]rk  r)   rl  r)   rm  dict[bytes, bytes]rn  r  ro  r   rp  r   rq  r   rr  r   ru  r   rs  r   rt  r   r   )r   r|  r   )r   r_  )r   r  )r   r  )r   r   )r2   r3   r4   r   propertyrx  rB   r~  r  r  r  r  r  r  r  r  r   r  r6   r!   r   rc  rc  u  sy   '-'- ''- 	'-
 '- '- ''- '- '- .'- ('- '- '- $'- '-  #!'-" #'-$ %'-R " "D
     # # & & " " ! ! & &    
r!   rc  c                   t        | t        j                        rt        j                         S t        | t        j
                        rt        j                         S t        | t        j                        sJ t        j                         S r   )	r?   r
   	SECP256R1r   r  	SECP384R1SHA384	SECP521R1r  )rR   s    r   r  r    sV    %&}}	E2<<	(}}%...}}r!   c                   t        j                  d|        t        j                  |       }|st	        d      |j                  d      x}}|j                  d      }d}|j                  t              rd}|d t        t                }|t        k(  r|st        d      t        |      }	 t        t        j                  |            }|r|}	t#        |      \  }
}|
|k7  rt	        d	      |rt#        |      \  }}|j%                  |      \  }}|rt'        |      \  }}t)        |      \  }}t#        |      \  }}t#        |      \  }}g }|r+t#        |      \  }}|j+                  t-        |             |r+t'        |      \  }}t'        |      \  }}t#        |      \  }}t/        |      }t#        |      \  }}t/        |      }t#        |      \  }}t#        |      \  }}t#        |      \  }}|t        k(  r|st        d
      	d t        |        }t#        |      \  }}t1        |       t#        |      \  }} |t2        k(  r|t4        t6        t2        fvs|t2        k7  r||k7  rt	        d      t#        |       \  }!} t1        |        t9        |||||||||||||!|||	      S t1        |       |S # t        t        j                   f$ r t	        d      w xY w)NrW   zInvalid line formatr$   r"  FTz-DSA keys aren't supported in SSH certificateszInvalid formatzInvalid key formatz3DSA signatures aren't supported in SSH certificatesz!Signature key type does not match)r   r%  _SSH_PUBKEY_RCmatchrM   groupendswith_CERT_SUFFIXrV   rI   r   r  r   r*  r+  r]   Errorrs   r   rp   rk   r   r   _parse_exts_optsr[   rF   r  r  rc  )"rW   _legacy_dsa_allowedr8  rO   orig_key_typekey_body	with_certr@  rest	cert_bodyinner_key_typerx  rB   r~  cctyper  
principalsr  	principalr  r  crit_optionsr  extsr  r   sig_key_rawsig_typesig_keytbs_cert_bodysignature_rawinner_sig_typesig_rest	signatures"                                     r   _load_ssh_public_identityr     s    
64(T"A.// wwqz)H}wwqzHI&	0s<0018$7";
 	
 h'G+(--h78 	&t,ND&-..!$'t**40J~~"4(&t,
D$/
$;!Iz##E)$45  %TNT%d^d(.d+L9 &
d%d+
d#4'-T'4'x(;&E  ",SYJ/)$/tT#.}#=   #_h?@("~'A@AA)(3	8X#
 	
( 	TK x~~& +)**+s   +J3 3%Kc                    t        |       S r   )r  rZ   s    r   load_ssh_public_identityr  _  s     %T**r!   c                2   i }d }| rt        |       \  }} t        |      }||v rt        d      |||k  rt        d      t        |       \  }} t        |      dkD  r't        |      \  }}t        |      dkD  rt        d      t        |      ||<   |}| r|S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)rs   r   rM   rV   )	exts_optsresult	last_namerS   bnamevalueextras          r   r  r  e  s    !#FI
%i0iT{F?-.. UY%6:;;&y1yu:>&u-LE55zA~ !DEEeu	  Mr!   c                   t        |t        j                  t        j                  t        j                  f      st        d      t        |       }t        |      }t               }|j                  |       |j                  | |       |j                         }t        j                  |      }|j                  |       |j                         S )Nz2hash_algorithm must be either MD5, SHA1, or SHA256)r?   r   MD5r  r  r]   rP   r  r~   r   r   r   Hashr0  r2  )rN   hash_algorithmrO   r@  r   ssh_binary_datahash_objs          r   ssh_key_fingerprintr  y  s     	V[[&--0 LMM %Hh'GKE	X#u%mmoO {{>*HOOO$r!   c                    t        | d      }t        |t              r|j                         }n|}t        |t        j
                        r&t        j                  dt        j                  d       |S )NT)r  r!  r"  r#  )
r  r?   rc  rB   r	   rH   r4  r5  r   r6  )rW   r7  cert_or_keyrB   s       r   load_ssh_public_keyr    sb     ,DdKK+~. ++-
 
*c../  		
 r!   c                   t        | t        j                        r&t        j                  dt
        j                  d       t        |       }t        |      }t               }|j                  |       |j                  | |       t        j                  |j                               j                         }dj!                  |d|g      S )z&One-line public key format for OpenSSHrK  rd   r#  r!   r  )r?   r	   rH   r4  r5  r   r6  rP   r  r~   r   r   r*  r  r   stripjoin)rB   rO   r@  r   pubs        r   serialize_ssh_public_keyr    s    *c../*  		
 !,Hh'GKE	X*e,


emmo
.
4
4
6C88XtS)**r!      c            
          e Zd Zddddg dddg g f
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 ddZddZddZddZ	 	 	 	 ddZd	 Z	dd
Z
ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZy)SSHCertificateBuilderNFc                    || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        y r   
rf  rg  rh  ri  rj  _valid_for_all_principalsrl  rk  rm  rn  )r   rf  rg  rh  ri  rj  r  rl  rk  rm  rn  s              r   r   zSSHCertificateBuilder.__init__  sQ     '
!2)B&*(!2&r!   c                   t        |t        j                  t        j                  t
        j                  f      st        d      | j                  t        d      t        || j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  
      S )Nr>   zpublic_key already setr  )r?   r
   rC   r   rE   r   rK   r]   rf  rM   r  rg  rh  ri  rj  r  rl  rk  rm  rn  )r   rB   s     r   rB   z SSHCertificateBuilder.public_key  s     ))  ((
 233'566$"LL**LL"44&*&D&D,,**"44((
 	
r!   c                   t        |t              st        d      d|cxk  rdk  st        d       t        d      | j                  t        d      t        | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  
      S )Nzserial must be an integerr               z"serial must be between 0 and 2**64zserial already setr  )r?   r)   r]   rM   rg  r  rf  rh  ri  rj  r  rl  rk  rm  rn  )r   r~  s     r   r~  zSSHCertificateBuilder.serial  s    &#&788F"U"ABB #ABB<<#122$((**LL"44&*&D&D,,**"44((
 	
r!   c                D   t        |t              st        d      | j                  t	        d      t        | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  
      S )Nz"type must be an SSHCertificateTypeztype already setr  )r?   r_  r]   rh  rM   r  rf  rg  ri  rj  r  rl  rk  rm  rn  )r   r  s     r   r  zSSHCertificateBuilder.type  s    $ 23@AA::!/00$((LLLL"44&*&D&D,,**"44((
 	
r!   c                D   t        |t              st        d      | j                  t	        d      t        | j                  | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  
      S )Nzkey_id must be byteszkey_id already setr  )r?   r   r]   ri  rM   r  rf  rg  rh  rj  r  rl  rk  rm  rn  )r   r  s     r   r  zSSHCertificateBuilder.key_id#  s    &%(233<<#122$((LL**"44&*&D&D,,**"44((
 	
r!   c                   | j                   rt        d      t        d |D              r|st        d      | j                  rt        d      t        |      t        kD  rt        d      t        | j                  | j                  | j                  | j                  || j                   | j                  | j                  | j                  | j                  
      S )NzDPrincipals can't be set because the cert is valid for all principalsc              3  <   K   | ]  }t        |t                y wr   )r?   r   ).0r   s     r   	<genexpr>z9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>?  s     CQJq%(Cs   z5principals must be a list of bytes and can't be emptyzvalid_principals already setz:Reached or exceeded the maximum number of valid_principalsr  )r  rM   allr]   rj  rV   _SSHKEY_CERT_MAX_PRINCIPALSr  rf  rg  rh  ri  rl  rk  rm  rn  )r   r  s     r   r  z&SSHCertificateBuilder.valid_principals6  s     ))% 
 C2BCC#G  !!;<< #>>L  %((LL**LL.&*&D&D,,**"44((
 	
r!   c                <   | j                   rt        d      | j                  rt        d      t        | j                  | j
                  | j                  | j                  | j                   d| j                  | j                  | j                  | j                  
      S )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTr  )rj  rM   r  r  rf  rg  rh  ri  rl  rk  rm  rn  r   s    r   valid_for_all_principalsz.SSHCertificateBuilder.valid_for_all_principalsZ  s    !!+  ))CDD$((LL**LL"44&*,,**"44((
 	
r!   c                   t        |t        t        f      st        d      t        |      }|dk  s|dk\  rt	        d      | j
                  t	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  | j                  
      S )Nz$valid_before must be an int or floatr   r  zvalid_before must [0, 2**64)zvalid_before already setr  )r?   r)   floatr]   rM   rl  r  rf  rg  rh  ri  rj  r  rk  rm  rn  )r   r  s     r   r  z"SSHCertificateBuilder.valid_beforep  s    ,e5BCC<(!|u4;<<)788$((LL**LL"44&*&D&D&**"44((
 	
r!   c                   t        |t        t        f      st        d      t        |      }|dk  s|dk\  rt	        d      | j
                  t	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  
      S )Nz#valid_after must be an int or floatr   r  zvalid_after must [0, 2**64)zvalid_after already setr  )r?   r)   r  r]   rM   rk  r  rf  rg  rh  ri  rj  r  rl  rm  rn  )r   r  s     r   r  z!SSHCertificateBuilder.valid_after  s    +U|4ABB+&?kU2:;;(677$((LL**LL"44&*&D&D,,$"44((
 	
r!   c                   t        |t              rt        |t              st        d      || j                  D cg c]  \  }}|	 c}}v rt	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  |f| j                  
      S c c}}w )Nname and value must be byteszDuplicate critical option namer  )r?   r   r]   rm  rM   r  rf  rg  rh  ri  rj  r  rl  rk  rn  r   rS   r  r   s       r   add_critical_optionz)SSHCertificateBuilder.add_critical_option  s     $&j.F:;;(>(>?WT1D??=>>$((LL**LL"44&*&D&D,,**F 6 6FuF((
 	
 @   Cc                   t        |t              rt        |t              st        d      || j                  D cg c]  \  }}|	 c}}v rt	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  |f
      S c c}}w )Nr  zDuplicate extension namer  )r?   r   r]   rn  rM   r  rf  rg  rh  ri  rj  r  rl  rk  rm  r  s       r   add_extensionz#SSHCertificateBuilder.add_extension  s     $&j.F:;;(8(89WT1D99788$((LL**LL"44&*&D&D,,**"44:$**:T5M:
 	
 :r  c           
     "   t        |t        j                  t        j                  t
        j                  f      st        d      | j                  t        d      | j                  dn| j                  }| j                  t        d      | j                  dn| j                  }| j                  s| j                  st        d      | j                  t        d      | j                   t        d      | j                   | j                  kD  rt        d	      | j"                  j%                  d
        | j&                  j%                  d        t)        | j                        }|t*        z   }t-        j.                  d      }t1        |      }t3               }|j5                  |       |j5                  |       |j7                  | j                  |       |j9                  |       |j;                  | j                  j<                         |j5                  |       t3               }	| j                  D ]  }
|	j5                  |
        |j5                  |	j?                                |j9                  | j                          |j9                  | j                         t3               }| j"                  D ]p  \  }}|j5                  |       tA        |      dkD  r;t3               }|j5                  |       |j5                  |j?                                `|j5                  |       r |j5                  |j?                                t3               }| j&                  D ]p  \  }}|j5                  |       tA        |      dkD  r;t3               }|j5                  |       |j5                  |j?                                `|j5                  |       r |j5                  |j?                                |j5                  d       t)        |      }t1        |      }t3               }|j5                  |       |j7                  |jC                         |       |j5                  |j?                                t        |t
        j                        rl|jE                  |j?                               }t3               }|j5                  |       |j5                  |       |j5                  |j?                                nt        |t        j                        rtG        |jH                        }|jE                  |j?                         t        jJ                  |            }tM        jN                  |      \  }}t3               }|j5                  |       t3               }|jQ                  |       |jQ                  |       |j5                  |j?                                |j5                  |j?                                nt        |t        j                        sJ t3               }|j5                  tR               |jE                  |j?                         tU        jV                         tY        jZ                               }|j5                  |       |j5                  |j?                                t]        j^                  |j?                               ja                         }tc        jd                  tf        ti        djk                  |d|g                  S )NzUnsupported private key typezpublic_key must be setr   ztype must be setr!   zAvalid_principals must be set if valid_for_all_principals is Falsezvalid_before must be setzvalid_after must be setz-valid_after must be earlier than valid_beforec                    | d   S Nr   r6   r   s    r   <lambda>z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    !A$ r!   )rN   c                    | d   S r  r6   r  s    r   r  z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    AaD r!   r7   r  )6r?   r
   r@   r   rD   r   rJ   r]   rf  rM   rg  rh  ri  rj  r  rl  rk  rm  sortrn  rP   r  rO  rP  r  r~   r   r   r   r   r  r   rV   rB   signr  rR   r  r  decode_dss_signaturer   r  r   r  r   r  r*  r  r  rz  r{  rc  r  r  )r   r   r~  r  rO   cert_prefixrx  r@  ffprincipalsr   fcritrS   r  foptvalfextfextvalca_typecaformatcafr  fsigr  r  r  fsigblob	cert_datas                              r   r	  zSSHCertificateBuilder.sign  sh   **!!))
 :;;#566 ll*::/00 ,$,, %%d.L.L 
 %788$677t111LMM 	###7.1$T%5%56- 

2!(+K	[!	Ud..2			&			$**""#	Vk'' 	&A""1%	&	[((*+			$##$			$$$%11 	(KD%T"5zA~#+""5)  !23  '	( 	
U]]_%{++ 	'KD%OOD!5zA~#+""5) 12&	' 	
T\\^$	S#K0"7+kw{557=	S[[]# k7#<#<=#((5I;DOOG$OOI&LL(R%?%?@'(9(9:H#((bhhx6HII229=DAq;DOOG$ {Hq!q!OOH,,./LL( k3+<+<===
 ;DOOO,#((		W--/I OOI&LL(''		4::<	 {{$SXX{D).L%MN
 	
r!   )rf  zSSHCertPublicKeyTypes | Nonerg  r.   rh  zSSHCertificateType | Noneri  bytes | Nonerj  r  r  r0   rl  r.   rk  r.   rm  list[tuple[bytes, bytes]]rn  r  )rB   r|  r   r  )r~  r)   r   r  )r  r_  r   r  )r  r   r   r  )r  r  r   r  )r  int | floatr   r  )r  r  r   r  )rS   r   r  r   r   r  )r   SSHCertPrivateKeyTypesr   rc  )r2   r3   r4   r   rB   r~  r  r  r  r  r  r  r  r  r	  r6   r!   r   r  r    s    59"+/ $)+*/$(#'7913'1' ' )	'
 ' '' $(' "' !' 5' /'0
/
	
8
*
&
&"
 +"
	"
H
,
,
,

"'
	
,

"'
	
,G
r!   r  )F)r   r   r   r   r   r)   r   r)   r   r0   r   r   )rN   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr   r   )rB   r   r   r   )rW   r   r,   r)   r   r   )rW   r   r   r   )
r^   r   r   r  r   r   r   r)   r   z)Cipher[modes.CBC | modes.CTR | modes.GCM])rW   r   r   ztuple[int, memoryview])rW   r   r   tuple[memoryview, memoryview])rv   r)   r   r   )r   r  )rO   r   r   )
rW   r   r   r  r7  
typing.Anyr   r0   r   SSHPrivateKeyTypes)r   r  r   r   rS  r   r   r   )rR   r   r   zhashes.HashAlgorithm)rW   r   r   z"SSHCertificate | SSHPublicKeyTypes)r  r   r   r  )rN   r  r  z(hashes.MD5 | hashes.SHA1 | hashes.SHA256r   r   )rW   r   r7  r  r   r  )rB   r  r   r   )|
__future__r   r*  enumrO  rerz  r4  dataclassesr   cryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr	   r
   r   r   r   r  &cryptography.hazmat.primitives.ciphersr   r   r   r   ,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   bcryptr   r    _bcrypt_supportedImportErrorrL   rF   rI   r  _ECDSA_NISTP384_ECDSA_NISTP521r  _SK_SSH_ED25519_SK_SSH_ECDSA_NISTP256r  r  compiler  r,  	_SK_START_SK_ENDr.  r-  rL  rM  DOTALLr'  r   r   ranger3  r'   AESCTRCBCGCMr9   r5   rT   rP   rA   rX   r[   ra   rk   rp   rs   rw   r|   r~   r   r   r   r   r  r  r  r  r  r  r  r  Unionr@   rD   rG   rJ   r  rI  r]  rC   rE   rH   rK   r  r|  Enumr_  rc  r  r  r  r  r  r  r  r  r  r  r6   r!   r   <module>r;     sC  
 #   	 	   !  8 1  J  9) (((' 0>  "!23	2	
.
 "**Y)G3RYY
? ia 012    NNYY NNYY  *NNYY ')% @ !  &':8  	
 /,??,+3 3lG, G,TCD CDLF8 F8R@% @%F

 
2
 
6 momo#%_[,",,.A_[,",,.A_[,",,.A(*-/	F \\  o
 ,1o
oo o
 %)o odJ#JJ 5J 	JZ LL    
~ ~B \
\ (\~+
+'+(	< 4 /3
!+(+(    " I
 I
s$  
9 #(999 9 	9
  9 
9
9s   )N! !N=<N=