
    #	h                       % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r
  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJr  S SKJr  S S	KJrJrJrJr  S S
KJ r J!r!J"r"J#r#J$r$J%r%   S SK&J'r(  Sr)Sr+Sr,Sr-Sr.Sr/Sr0Sr1Sr2Sr3Sr4Sr5\Rl                  " S5      r7Sr8Sr9Sr:Sr;Sr<S r=S!r>\Rl                  " \9S"-   \:-   \R~                  5      r@\A" \B" \C" S#S$5      5      5      rD\ " S% S&5      5       rE\E" \R                  S'\R                  S!S!SSS(9\E" \R                  S'\R                  S!S!SSS(9\E" \R                  S'\R                  S!S)S!SS(9S*.rJS+\KS,'   \.\/\0S-.rLS^S. jrMS_S/ jrN\9S0-   \:S0-   4       S`S1 jjrOSaS2 jrPSbS3 jrQ          ScS4 jrRSdS5 jrSSdS6 jrTSeS7 jrUSdS8 jrVSfS9 jrW " S: S;5      rX " S< S=5      rY " S> S?5      rZ " S@ SA5      r[ " SB SC5      r\SgSD jr] " SE SF5      r^ " SG SH5      r_\,\Y" 5       \-\Z" 5       \+\\" 5       \.\[" SI\R                  " 5       5      \/\[" SJ\R                  " 5       5      \0\[" SK\R                  " 5       5      \2\^" 5       \3\_" 5       0rcShSL jrd\R                  \R                  \R                  \R                  \R                  4   rj Si       SjSM jjrk        SkSN jrl\R                  \R                  \R                  \R                  \R                  4   rq\R                  \R                  \R                  \R                  4   rr " SO SP\R                  5      rt " SQ SR5      ruSlSS jrv S\   SmST jjrw    SmSU jrxSnSV jry Si     SoSW jjrzSpSX jr{\R                  \R                  \R                  \R                  4   r|SYr} " SZ S[5      r~g! \* a    Sr) S\           S]S jjr( GNcf = f)q    )annotationsN)encodebytes)	dataclass)utilsUnsupportedAlgorithm)hashes)dsaeced25519paddingrsa)AEADDecryptionContextCipher
algorithmsmodes)EncodingKeySerializationEncryptionNoEncryptionPrivateFormatPublicFormat_KeySerializationEncryption)kdfTFc                    [        S5      e)NzNeed bcrypt moduler   )passwordsaltdesired_key_bytesroundsignore_few_roundss        b/var/www/html/env/lib/python3.13/site-packages/cryptography/hazmat/primitives/serialization/ssh.py_bcrypt_kdfr!   1   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                  \    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   Srg)
_SSHCipher\   z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_aead N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r4   r"   r    r(   r(   \   s(    	L
==NKMr"   r(       )r*   r,   r-   r.   r/   r1   r3      )r#   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]_SSH_CIPHERS)	secp256r1	secp384r1	secp521r1c                .   [        U [        R                  5      (       a  [        U R	                  5       5      nU$ [        U [        R
                  5      (       a  [        U 5      nU$ [        U [        R                  [        R                  45      (       a  [        nU$ [        U [        R                  [        R                  45      (       a  [        nU$ [        U [        R                  [        R                   45      (       a  ["        nU$ [%        S5      e)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_typerT      s    #r1122"3>>#34 O 
C22	3	3"3' O 
C#++S-=-=>	?	? O 
C#++S-=-=>	?	? O 
g'')A)AB
 
   O /00r"   c                    U R                   nUR                  [        ;  a  [        SUR                  < 35      e[        UR                     $ )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )curvename_ECDSA_KEY_TYPErQ   )rF   rV   s     r    rE   rE      sE    Ezz(5ejj^D
 	
 5::&&r"      
c                <    SR                  U[        U 5      U/5      $ )Nr"   )join_base64_encode)dataprefixsuffixs      r    _ssh_pem_encoder`      s    
 88V^D16:;;r"   c                L    U (       a  [        U 5      U-  S:w  a  [        S5      eg)zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenrQ   )r]   r.   s     r    _check_block_sizerc      s&    3t9y(A-899 .r"   c                (    U (       a  [        S5      eg)z!All data should have been parsed.zCorrupt data: unparsed dataN)rQ   r]   s    r    _check_emptyrf      s    677 r"   c                   U(       d  [        S5      e[        U    n[        XUR                  UR                  -   US5      n[        UR                  USUR                   5      UR                  XTR                  S 5      5      $ )z$Generate key + iv and return cipher.zKey is password-protected.TN)rQ   r=   r!   r,   r/   r   r*   r-   )
ciphernamer   r   r   ciphseeds         r    _init_cipherrk      sx     566
#Dt{{2FDD n%&		$||~&' r"   c                n    [        U 5      S:  a  [        S5      e[        R                  U SS SS9U SS 4$ )Uint32   Invalid dataNbig	byteorderrb   rQ   r+   
from_bytesre   s    r    _get_u32ru      <    
4y1}((>>$r(e>4d12h>>r"   c                n    [        U 5      S:  a  [        S5      e[        R                  U SS SS9U SS 4$ )Uint64   ro   Nrp   rq   rs   re   s    r    _get_u64rz      rv   r"   c                b    [        U 5      u  pU[        U 5      :  a  [        S5      eU SU XS 4$ )zBytes with u32 length prefixro   N)ru   rb   rQ   )r]   ns     r    _get_sshstrr}      s8    tnGA3t9}((8T"Xr"   c                    [        U 5      u  pU(       a  US   S:  a  [        S5      e[        R                  US5      U 4$ )zBig integer.r      ro   rp   )r}   rQ   r+   rt   )r]   vals     r    
_get_mpintr      s<    D!IC
s1v}((>>#u%t++r"   c                    U S:  a  [        S5      eU (       d  gU R                  5       S-   S-  n[        R                  " X5      $ )z!Storage format for signed bigint.r   znegative mpint not allowedr"   ry   )rQ   
bit_lengthr   int_to_bytes)r   nbytess     r    	_to_mpintr      sB    
Qw566nn"q(Fc**r"   c                      \ rS rSr% SrS\S'   SSS jjrSS jrSS jrSS	 jr	SS
 jr
SS jrSS jrSSS jjrSS jrSrg)	_FragList   z,Build recursive structure without data copy.list[bytes]flistNc                X    / U l         U(       a  U R                   R                  U5        g g N)r   extend)selfinits     r    __init___FragList.__init__   s#    
JJd# r"   c                :    U R                   R                  U5        g)zAdd plain bytesN)r   appendr   r   s     r    put_raw_FragList.put_raw  s    

#r"   c                V    U R                   R                  UR                  SSS95        g)zBig-endian uint32rn   rp   lengthrr   Nr   r   to_bytesr   s     r    put_u32_FragList.put_u32	  !    

#,,a5,ABr"   c                V    U R                   R                  UR                  SSS95        g)zBig-endian uint64ry   rp   r   Nr   r   s     r    put_u64_FragList.put_u64  r   r"   c                8   [        U[        [        [        45      (       a6  U R	                  [        U5      5        U R                  R                  U5        gU R	                  UR                  5       5        U R                  R                  UR                  5        g)zBytes prefixed with u32 lengthN)
rC   bytes
memoryview	bytearrayr   rb   r   r   sizer   r   s     r    
put_sshstr_FragList.put_sshstr  s`    cE:y9::LLS"JJc"LL$JJcii(r"   c                8    U R                  [        U5      5        g)z*Big-endian bigint prefixed with u32 lengthN)r   r   r   s     r    	put_mpint_FragList.put_mpint  s    	#'r"   c                H    [        [        [        U R                  5      5      $ )zCurrent number of bytes)summaprb   r   r   s    r    r   _FragList.size  s    3sDJJ'((r"   c                R    U R                    H  n[        U5      nX"U-   p%X1XR& M     U$ )zWrite into bytearray)r   rb   )r   dstbufposfragflenstarts         r    render_FragList.render"  s1    JJDt9DDj3 $5  
r"   c                    [        [        U R                  5       5      5      nU R                  U5        UR	                  5       $ )zReturn as bytes)r   r   r   r   tobytes)r   bufs     r    r   _FragList.tobytes*  s/    499;/0C{{}r"   )r   r   )r   zlist[bytes] | NonereturnNone)r   r   r   r   )r   r+   r   r   )r   zbytes | _FragListr   r   r   r+   )r   )r   r   r   r+   r   r+   r   r   )r5   r6   r7   r8   __doc__r9   r   r   r   r   r   r   r   r   r   r:   r4   r"   r    r   r      s:    6$
CC)()r"   r   c                  z    \ rS rSrSr    S
S jr    SS jr    SS jr      SS jr      SS jr	Sr
g	)_SSHFormatRSAi1  zTFormat for RSA keys.

Public:
    mpint e, n
Private:
    mpint n, e, d, iqmp, p, q
c                @    [        U5      u  p![        U5      u  p1X#4U4$ )zRSA public fieldsr   )r   r]   er|   s       r    
get_public_SSHFormatRSA.get_public:  s(     T"T"vt|r"   c                    U R                  U5      u  u  p#n[        R                  " X#5      nUR                  5       nXQ4$ )zMake RSA public key from data.)r   r   RSAPublicNumbersrF   )r   r]   r   r|   public_numbersrF   s         r    load_public_SSHFormatRSA.load_publicB  s?     t,--a3#..0
r"   c           	        [        U5      u  p1[        U5      u  pA[        U5      u  pQ[        U5      u  pa[        U5      u  pq[        U5      u  pXC4U:w  a  [        S5      e[        R                  " XW5      n	[        R                  " XX5      n
[        R
                  " XC5      n[        R                  " XxXYXU5      nUR                  5       nX4$ )zMake RSA private key from data.z Corrupt data: rsa field mismatch)r   rQ   r   rsa_crt_dmp1rsa_crt_dmq1r   RSAPrivateNumbersprivate_key)r   r]   	pubfieldsr|   r   diqmppqdmp1dmq1r   private_numbersr   s                 r    load_private_SSHFormatRSA.load_privateK  s     T"T"T"%
T"T"6Y?@@%%--a3//!4~
 &113  r"   c                    UR                  5       nUR                  UR                  5        UR                  UR                  5        g)zWrite RSA public keyN)r   r   r   r|   )r   rF   f_pubpubns       r    encode_public_SSHFormatRSA.encode_publica  s2     ((*r"   c                   UR                  5       nUR                  nUR                  UR                  5        UR                  UR                  5        UR                  UR
                  5        UR                  UR                  5        UR                  UR                  5        UR                  UR                  5        g)zWrite RSA private keyN)	r   r   r   r|   r   r   r   r   r   )r   r   f_privr   r   s        r    encode_private_SSHFormatRSA.encode_privatei  s     &557(77))*))***+--.**+**+r"   r4   N)r]   r   r   z"tuple[tuple[int, int], memoryview])r]   r   r   z#tuple[rsa.RSAPublicKey, memoryview])r]   r   r   z$tuple[rsa.RSAPrivateKey, memoryview])rF   zrsa.RSAPublicKeyr   r   r   r   )r   zrsa.RSAPrivateKeyr   r   r   r   r5   r6   r7   r8   r   r   r   r   r   r   r:   r4   r"   r    r   r   1  s    	+  	, !!	-!, * 3< 	 ,,,6?,	,r"   r   c                  |    \ rS rSrSrSS jr    SS jr    SS jr      SS jr      SS jr	SS jr
S	rg
)_SSHFormatDSAiy  zTFormat for DSA keys.

Public:
    mpint p, q, g, y
Private:
    mpint p, q, g, y, x
c                v    [        U5      u  p![        U5      u  p1[        U5      u  pA[        U5      u  pQX#XE4U4$ )zDSA public fieldsr   )r   r]   r   r   gys         r    r   _SSHFormatDSA.get_public  sA    T"T"T"T"a|T!!r"   c                    U R                  U5      u  u  p#pEn[        R                  " X#U5      n[        R                  " XV5      nU R	                  U5        UR                  5       nX4$ )zMake DSA public key from data.)r   r
   DSAParameterNumbersDSAPublicNumbers	_validaterF   )	r   r]   r   r   r   r   parameter_numbersr   rF   s	            r    r   _SSHFormatDSA.load_public  sa     "__T2qd33A!<--aC~&#..0
r"   c                >   U R                  U5      u  u  p4pVn[        U5      u  pqX4XV4U:w  a  [        S5      e[        R                  " X4U5      n[        R
                  " Xh5      n	U R                  U	5        [        R                  " Xy5      n
U
R                  5       nX4$ )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r   r   rQ   r
   r   r   r   DSAPrivateNumbersr   )r   r]   r   r   r   r   r   xr   r   r   r   s               r    r   _SSHFormatDSA.load_private  s     "__T2qdT"!<9$?@@33A!<--aC~&//B%113  r"   c                6   UR                  5       nUR                  nU R                  U5        UR                  UR                  5        UR                  UR
                  5        UR                  UR                  5        UR                  UR                  5        g)zWrite DSA public keyN)r   r   r   r   r   r   r   r   )r   rF   r   r   r   s        r    r   _SSHFormatDSA.encode_public  su     $224*<<~&)++,)++,)++,(()r"   c                    U R                  UR                  5       U5        UR                  UR                  5       R                  5        g)zWrite DSA private keyN)r   rF   r   r   r   )r   r   r   s      r    r   _SSHFormatDSA.encode_private  s:     	;113V<446889r"   c                n    UR                   nUR                  R                  5       S:w  a  [        S5      eg )Ni   z#SSH supports only 1024 bit DSA keys)r   r   r   rQ   )r   r   r   s      r    r   _SSHFormatDSA._validate  s6    *<<))+t3BCC 4r"   r4   N)r]   r   r   ztuple[tuple, memoryview])r]   r   r   z#tuple[dsa.DSAPublicKey, memoryview])r]   r   r   z$tuple[dsa.DSAPrivateKey, memoryview])rF   zdsa.DSAPublicKeyr   r   r   r   )r   zdsa.DSAPrivateKeyr   r   r   r   )r   zdsa.DSAPublicNumbersr   r   )r5   r6   r7   r8   r   r   r   r   r   r   r   r:   r4   r"   r    r   r   y  sv    "	 	 	,	 !!	-! ***3<*	*:,:6?:	:Dr"   r   c                      \ rS rSrSrSS jr    SS jr    SS jr    SS jr      SS jr	      SS jr
S	rg
)_SSHFormatECDSAi  zvFormat for ECDSA keys.

Public:
    str curve
    bytes point
Private:
    str curve
    bytes point
    mpint secret
c                    Xl         X l        g r   )ssh_curve_namerV   )r   r  rV   s      r    r   _SSHFormatECDSA.__init__  s    ,
r"   c                    [        U5      u  p![        U5      u  p1X R                  :w  a  [        S5      eUS   S:w  a  [        S5      eX#4U4$ )zECDSA public fieldszCurve name mismatchr   rn   zNeed uncompressed point)r}   r  rQ   NotImplementedError)r   r]   rV   points       r    r   _SSHFormatECDSA.get_public  sX     "$'!$''''2338q=%&?@@~t##r"   c                    U R                  U5      u  u  p#n[        R                  R                  U R                  UR                  5       5      nXA4$ z Make ECDSA public key from data.)r   r   rG   from_encoded_pointrV   r   )r   r]   _r  rF   s        r    r   _SSHFormatECDSA.load_public  sI      ??40
D..AAJJ

 r"   c                    U R                  U5      u  u  p4n[        U5      u  pQX44U:w  a  [        S5      e[        R                  " XPR
                  5      nXa4$ )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r   r   rQ   r   derive_private_keyrV   )r   r]   r   
curve_namer  secretr   s          r    r   _SSHFormatECDSA.load_private  sZ     %)OOD$9!T!$')+ABB++FJJ?  r"   c                    UR                  [        R                  [        R                  5      nUR                  U R                  5        UR                  U5        g)zWrite ECDSA public keyN)public_bytesr   X962r   UncompressedPointr   r  )r   rF   r   r  s       r    r   _SSHFormatECDSA.encode_public  sG     ''MM<99
 	,,-r"   c                    UR                  5       nUR                  5       nU R                  X25        UR                  UR                  5        g)zWrite ECDSA private keyN)rF   r   r   r   private_value)r   r   r   rF   r   s        r    r   _SSHFormatECDSA.encode_private  sB     !++-
%557:.667r"   )rV   r  N)r  r   rV   ec.EllipticCurve)r]   r   r   z0tuple[tuple[memoryview, memoryview], memoryview]r]   r   r   z,tuple[ec.EllipticCurvePublicKey, memoryview])r]   r   r   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rF   ec.EllipticCurvePublicKeyr   r   r   r   )r   zec.EllipticCurvePrivateKeyr   r   r   r   )r5   r6   r7   r8   r   r   r   r   r   r   r   r:   r4   r"   r    r   r     s    	
$
$	9
$  	5 
!
!	6
! 3 <E 	 858?H8	8r"   r   c                  z    \ rS rSrSr    S
S jr    SS jr    SS jr      SS jr      SS jr	Sr
g	)_SSHFormatEd25519i  zfFormat for Ed25519 keys.

Public:
    bytes point
Private:
    bytes point
    bytes secret_and_point
c                &    [        U5      u  p!U4U4$ )zEd25519 public fields)r}   )r   r]   r  s      r    r   _SSHFormatEd25519.get_public  s     "$'x~r"   c                    U R                  U5      u  u  p![        R                  R                  UR	                  5       5      nX14$ z"Make Ed25519 public key from data.)r   r   rO   from_public_bytesr   )r   r]   r  rF   s       r    r   _SSHFormatEd25519.load_public  s@     .--??MMO

 r"   c                    U R                  U5      u  u  p1[        U5      u  pAUSS nUSS nX6:w  d  U4U:w  a  [        S5      e[        R                  R                  U5      nXq4$ )z#Make Ed25519 private key from data.Nr;   z$Corrupt data: ed25519 field mismatch)r   r}   rQ   r   rN   from_private_bytes)r   r]   r   r  keypairr  point2r   s           r    r   _SSHFormatEd25519.load_private!  sq     .#D)"?uh)3CDD//BB6J  r"   c                    UR                  [        R                  [        R                  5      nUR	                  U5        g)zWrite Ed25519 public keyN)r  r   Rawr   r   )r   rF   r   raw_public_keys       r    r   _SSHFormatEd25519.encode_public/  s3     $00LL,**
 	(r"   c                J   UR                  5       nUR                  [        R                  [        R                  [        5       5      nUR                  [        R                  [        R                  5      n[        XE/5      nU R                  X25        UR                  U5        g)zWrite Ed25519 private keyN)rF   private_bytesr   r*  r   r   r  r   r   r   r   )r   r   r   rF   raw_private_keyr+  	f_keypairs          r    r    _SSHFormatEd25519.encode_private8  s     !++-
%33LL-++\^
 $00LL,**
 ?@	:.)$r"   r4   N)r]   r   r   z$tuple[tuple[memoryview], memoryview]r]   r   r   z+tuple[ed25519.Ed25519PublicKey, memoryview])r]   r   r   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rF   zed25519.Ed25519PublicKeyr   r   r   r   )r   zed25519.Ed25519PrivateKeyr   r   r   r   r   r4   r"   r    r  r    s    	-  	4 !!	5!)2);D)	)%4%>G%	%r"   r  c                    [        U 5      u  pUR                  5       R                  S5      (       d  [        SU S35      eX4$ )z
U2F application strings
s   ssh:z4U2F application string does not start with b'ssh:' ())r}   r   
startswithrQ   )r]   applications     r    load_applicationr7  I  sT     $D)K ++G44}A
 	
 r"   c                  *    \ rS rSrSr    SS jrSrg)_SSHFormatSKEd25519iV  z
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                b    [        [        5      R                  U5      u  p![        U5      u  p1X!4$ r!  )_lookup_kformatrP   r   r7  r   r]   rF   r
  s       r    r   _SSHFormatSKEd25519.load_public_  s1     +<8DDTJ
"4(r"   r4   Nr2  r5   r6   r7   r8   r   r   r:   r4   r"   r    r9  r9  V  s      	4 r"   r9  c                  *    \ rS rSrSr    SS jrSrg)_SSHFormatSKECDSAih  z
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                b    [        [        5      R                  U5      u  p![        U5      u  p1X!4$ r  )r;  _ECDSA_NISTP256r   r7  r<  s       r    r   _SSHFormatSKECDSA.load_publicr  s1     +?;GGM
"4(r"   r4   Nr  r>  r4   r"   r    r@  r@  h  s      	5 r"   r@  s   nistp256s   nistp384s   nistp521c                    [        U [        5      (       d  [        U 5      R                  5       n U [        ;   a	  [        U    $ [        SU < 35      e)z"Return valid format or throw errorzUnsupported key type: )rC   r   r   r   _KEY_FORMATSr   )rS   s    r    r;  r;    sH    h&&h'//1<H%%
!7|D
EEr"   c                   [         R                  " SU 5        Ub  [         R                  " SU5        [        R	                  U 5      nU(       d  [        S5      eUR                  S5      nUR                  S5      n[        R                  " [        U 5      XE 5      n U R                  [        5      (       d  [        S5      e[        U 5      [        [        5      S n [        U 5      u  p`[        U 5      u  pp[        U 5      u  p[        U 5      u  pU	S:w  a  [        S5      e[        U 5      u  p[        U
5      u  p[!        U5      nUR#                  U
5      u  p[%        U
5        Xg4[&        [&        4:w  Ga  UR)                  5       nU[*        ;  a  [-        SU< 35      eU[.        :w  a  [-        SU< 35      e[*        U   R0                  n[*        U   R2                  n[        U 5      u  nn [*        U   R4                  (       a&  [7        U 5      n[        U5      U:w  a  [        S	5      eO[%        U 5        [9        UU5        [        U5      u  nn[        U5      u  nn[%        U5        [;        XUR)                  5       U5      nUR=                  5       n[        UR?                  U5      5      n[*        U   R4                  (       a2  [A        U[B        5      (       d   e[%        URE                  W5      5        OA[%        URG                  5       5        O'[        U 5      u  nn [%        U 5        S
n[9        UU5        [        U5      u  nn[        U5      u  nnUU:w  a  [        S5      e[        U5      u  nnUU:w  a  [        S5      eURI                  UU5      u  nn[        U5      u  nnU[J        S[        U5       :w  a  [        S5      e[A        U[L        RN                  5      (       a$  [P        RR                  " S[         RT                  SS9  U$ )z.Load private key from OpenSSH custom encoding.r]   Nr   zNot OpenSSH private key formatr%   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherry   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid paddingDSSH DSA keys are deprecated and will be removed in a future release.   
stacklevel)+r   _check_byteslike_check_bytes_PEM_RCsearchrQ   r   endbinascii
a2b_base64r   r5  	_SK_MAGICrb   r}   ru   r;  r   rf   _NONEr   r=   r   _BCRYPTr.   r1   r3   r   rc   rk   	decryptorupdaterC   r   finalize_with_tagfinalizer   _PADDINGr
   rK   warningswarnDeprecatedIn40)r]   r   backendmp1p2rh   kdfname
kdfoptionsnkeyspubdatapub_key_typekformatr   ciphername_bytesblklenr1   edatatagr   kbufr   ri   decck1ck2rS   r   r
  s                                r    load_ssh_private_keyro    s    
64(:x0tA9::	
B	
qBz$/67D??9%%9::dC	N,-D #4(J%MG"4(J4.KEz122  %MG'0Ll+G ++G4I.%--/</&&'7&:;  g&):7+'FGG./99/088!$'t ()11+C3x7" !NOO # %( ,
d~T,Onn3::e,-()11c#89999..s34 ( "$'tT%(%JC%JC
cz899 "%(OHe<:;; --eY?K5!HAu 3u:&&899+s0011  		
 r"   c                   [         R                  " SU5        [        U [        R                  5      (       a$  [
        R                  " S[         R                  SS9  [        U 5      n[        U5      n[        5       nU(       a  [        n[        U   R                  n[        n[        n	[        U[         5      (       a  UR"                  b  UR"                  n	[$        R&                  " S5      n
UR)                  U
5        UR+                  U	5        [-        XaX5      nO[.        =phSnSnSn[$        R&                  " S5      nS	n[        5       nUR)                  U5        UR1                  U R3                  5       U5        [        X/5      nUR)                  U5        UR5                  U U5        UR)                  U5        UR7                  [8        SUUR;                  5       U-  -
   5        [        5       nUR7                  [<        5        UR)                  U5        UR)                  U5        UR)                  U5        UR+                  U5        UR)                  U5        UR)                  U5        UR;                  5       nUR;                  5       n[?        [A        UU-   5      5      nURC                  U5        UU-
  nUb&  URE                  5       RG                  UUU UUS 5        [I        USU 5      $ )
z3Serialize private key with OpenSSH custom encoding.r   ISSH DSA key support is deprecated and will be removed in a future releasern   rI  Nr$   ry   r%   r"   )%r   rL  rC   r
   rK   rZ  r[  r\  rT   r;  r   _DEFAULT_CIPHERr=   r.   rT  _DEFAULT_ROUNDSr   _kdf_roundsosurandomr   r   rk   rS  r   rF   r   r   rY  r   rR  r   r   r   	encryptorupdate_intor`   )r   r   encryption_algorithmrS   rf  f_kdfoptionsrh   rh  ra  r   r   ri   rc  checkvalcommentf_public_key	f_secretsf_mainslenmlenr   ofss                         r    _serialize_ssh_private_keyr     s}    
z8,+s0011*  		
 !-Hh'G ;L$
j)33 +-HII$00<)55Fzz"~%V$J$?$$
Ezz!}HG ;LH%+002LA8./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>3u:&&r"   c                      \ rS rSrSrSrSrg)SSHCertificateTypei[  r%   rH  r4   N)r5   r6   r7   r8   USERHOSTr:   r4   r"   r    r  r  [  s    DDr"   r  c                  >   \ rS rSr                                  SS jr\SS j5       rSS jr\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSrg)SSHCertificatei`  c                   Xl         X l        X0l         [        U5      U l        XPl        X`l        Xpl        Xl	        Xl
        Xl        Xl        Xl        Xl        Xl        UU l        UU l        Xl        g ! [
         a    [        S5      ef = f)NzInvalid certificate type)_nonce_public_key_serialr  _typerQ   _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   r  r  r  _cctyper  r  r  r  r  r  r  r  r  r  r  r  r  s                     r    r   SSHCertificate.__init__a  s    ( &	9+G4DJ !2(*!2&" .$,$,  	9788	9s   A5 5Bc                ,    [        U R                  5      $ r   )r   r  r   s    r    nonceSSHCertificate.nonce  s    T[[!!r"   c                L    [         R                  " [        U R                  5      $ r   )typingcastSSHCertPublicKeyTypesr  r   s    r    rF   SSHCertificate.public_key  s     {{0$2B2BCCr"   c                    U R                   $ r   )r  r   s    r    serialSSHCertificate.serial  s    ||r"   c                    U R                   $ r   )r  r   s    r    typeSSHCertificate.type  s    zzr"   c                ,    [        U R                  5      $ r   )r   r  r   s    r    key_idSSHCertificate.key_id  s    T\\""r"   c                    U R                   $ r   )r  r   s    r    valid_principalsSSHCertificate.valid_principals      %%%r"   c                    U R                   $ r   )r  r   s    r    valid_beforeSSHCertificate.valid_before  s    !!!r"   c                    U R                   $ r   )r  r   s    r    valid_afterSSHCertificate.valid_after  s       r"   c                    U R                   $ r   )r  r   s    r    critical_optionsSSHCertificate.critical_options  r  r"   c                    U R                   $ r   )r  r   s    r    
extensionsSSHCertificate.extensions  s    r"   c                    [        U R                  5      nUR                  U R                  5      u  p#[	        U5        U$ r   )r;  r  r   r  rf   )r   	sigformatsignature_keysigkey_rests       r    r  SSHCertificate.signature_key  s5    #DNN3	%.%:%:4==%I"[!r"   c                    [        U R                  5      S-   [        R                  " [        U R                  5      SS9-   $ )N    F)newline)r   r  rP  
b2a_base64r  r   s    r    r  SSHCertificate.public_bytes  s<    $%%&!!%"8%HI	
r"   c                   U R                  5       n[        U[        R                  5      (       a9  UR	                  [        U R                  5      [        U R                  5      5        g [        U[        R                  5      (       a  [        U R                  5      u  p#[        U5      u  pC[        U5        [        R                  " X$5      n[        UR                  5      nUR	                  U[        U R                  5      [        R                   " U5      5        g [        U["        R$                  5      (       d   eU R&                  [(        :X  a  [*        R,                  " 5       nOUU R&                  [.        :X  a  [*        R0                  " 5       nO+U R&                  [2        :X  d   e[*        R4                  " 5       nUR	                  [        U R                  5      [        U R                  5      [6        R8                  " 5       U5        g r   )r  rC   r   rO   verifyr   r  r  r   rG   r   rf   
asym_utilsencode_dss_signature_get_ec_hash_algrV   ECDSAr   rI   r  rJ   r	   SHA1_SSH_RSA_SHA256SHA256_SSH_RSA_SHA512SHA512r   PKCS1v15)r   r  rr]   scomputed_sighash_algs          r    verify_cert_signature$SSHCertificate.verify_cert_signature  so   **,mW%=%=>>  doo&d.A.A(B r'@'@AA 1GA &GA%::1@L'(;(;<H  eD$7$78"((8:L mS-=-=>>>>##x/!;;=%%8!==?++>>>!==?  doo&d))*  "	r"   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  N)"r  r   r  SSHPublicKeyTypesr  r+   r  r+   r  r   r  r   r  r+   r  r+   r  dict[bytes, bytes]r  r  r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   )r   r  r   )r   r  )r   r   )r   r  )r   r   )r5   r6   r7   r8   r   propertyr  rF   r  r  r  r  r  r  r  r  r  r  r  r:   r4   r"   r    r  r  `  sy   '-'- ''- 	'-
 '- '- ''- '- '- .'- ('- '- '- $'- '-  #!'-" #'-$ %'-R " "D
     # # & & " " ! ! & &    
r"   r  c                >   [        U [        R                  5      (       a  [        R                  " 5       $ [        U [        R
                  5      (       a  [        R                  " 5       $ [        U [        R                  5      (       d   e[        R                  " 5       $ r   )	rC   r   	SECP256R1r	   r  	SECP384R1SHA384	SECP521R1r  )rV   s    r    r  r    s_    %&&}}	E2<<	(	(}}%....}}r"   c                   [         R                  " SU 5        [        R                  U 5      nU(       d  [	        S5      eUR                  S5      =p4UR                  S5      nSnUR                  [        5      (       a  SnUS [        [        5      *  nU[        :X  a  U(       d  [        S5      e[        U5      n [        [        R                  " U5      5      nU(       a  Un	[#        U5      u  pX:w  a  [	        S	5      eU(       a  [#        U5      u  pUR%                  U5      u  pU(       Ga  ['        U5      u  p[)        U5      u  p[#        U5      u  p[#        U5      u  nn/ nU(       a1  [#        U5      u  nnUR+                  [-        U5      5        U(       a  M1  ['        U5      u  nn['        U5      u  nn[#        U5      u  nn[/        U5      n[#        U5      u  nn[/        U5      n[#        U5      u  nn[#        U5      u  nn[#        U5      u  nnU[        :X  a  U(       d  [        S
5      eW	S [        U5      *  n[#        U5      u  nn[1        U5        [#        U5      u  nn U[2        :X  a  U[4        [6        [2        4;  d  U[2        :w  a  UU:w  a  [	        S5      e[#        U 5      u  n!n [1        U 5        [9        WUUUUUUUUUUUUU!UUU	5      $ [1        U5        U$ ! [        [        R                   4 a    [	        S5      ef = f)Nr]   zInvalid line formatr%   rH  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   rK  _SSH_PUBKEY_RCmatchrQ   groupendswith_CERT_SUFFIXrb   rM   r   r;  r   rP  rQ  	TypeErrorErrorr}   r   rz   ru   r   r   _parse_exts_optsrf   rJ   r  r  r  )"r]   _legacy_dsa_allowedr^  rS   orig_key_typekey_body	with_certrf  rest	cert_bodyinner_key_typer  rF   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,N&-..!$'**40J~~"4(&t,
D$/
$;!Iz##E)$45 j %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   ;K# #&L	c                    [        U 5      $ r   )r   re   s    r    load_ssh_public_identityr  J  s     %T**r"   c                H   0 nS nU (       a  [        U 5      u  p0[        U5      nXA;   a  [        S5      eUb  XB:  a  [        S5      e[        U 5      u  pP[        U5      S:  a'  [        U5      u  pV[        U5      S:  a  [        S5      e[        U5      X'   UnU (       a  M  U$ )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)r}   r   rQ   rb   )	exts_optsresult	last_namerW   bnamevalueextras          r    r  r  P  s    !#FI
%i0T{?-.. U%6:;;&y1u:>&u-LE5zA~ !DEEe	 ) Mr"   c                    [        U SS9n[        U[        5      (       a  UR                  5       nOUn[        U[        R
                  5      (       a$  [        R                  " S[        R                  SS9  U$ )NT)r  rG  rH  rI  )
r   rC   r  rF   r
   rL   rZ  r[  r   r\  )r]   r]  cert_or_keyrF   s       r    load_ssh_public_keyr  d  sh     ,DdKK+~.. ++-
 
*c..//  		
 r"   c                   [        U [        R                  5      (       a$  [        R                  " S[
        R                  SS9  [        U 5      n[        U5      n[        5       nUR                  U5        UR                  X5        [        R                  " UR                  5       5      R                  5       nSR!                  USU/5      $ )z&One-line public key format for OpenSSHrq  rn   rI  r"   r  )rC   r
   rL   rZ  r[  r   r\  rT   r;  r   r   r   rP  r  r   stripr[   )rF   rS   rf  r   pubs        r    serialize_ssh_public_keyr  x  s    *c..//*  		
 !,Hh'GKE	X*,


emmo
.
4
4
6C88XtS)**r"      c            
          \ rS rSrSSSS/ SSS/ / 4
                   SS jjr    SS jrSS jrSS jrSS jr    SS	 jr	S
 r
SS jrSS jr      SS jr      SS jrSS jrSrg)SSHCertificateBuilderi  NFc                |    Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        g r   
r  r  r  r  r  _valid_for_all_principalsr  r  r  r  )r   r  r  r  r  r  r  r  r  r  r  s              r    r   SSHCertificateBuilder.__init__  s=     '
!2)B&*(!2&r"   c                   [        U[        R                  [        R                  [
        R                  45      (       d  [        S5      eU R                  b  [        S5      e[        UU R                  U R                  U R                  U R                  U R                  U R                   U R"                  U R$                  U R&                  S9
$ )NrB   zpublic_key already setr  )rC   r   rG   r   rI   r   rO   r  r  rQ   r  r  r  r  r  r  r  r  r  r  )r   rF   s     r    rF    SSHCertificateBuilder.public_key  s     ))  ((
 
 233'566$"LL**LL"44&*&D&D,,**"44((
 	
r"   c                ~   [        U[        5      (       d  [        S5      eSUs=::  a  S:  d  O  [        S5      eU R                  b  [        S5      e[        U R                  UU R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nzserial must be an integerr               z"serial must be between 0 and 2**64zserial already setr  )rC   r+   r  rQ   r  r  r  r  r  r  r  r  r  r  r  )r   r  s     r    r  SSHCertificateBuilder.serial  s    &#&&788F"U"ABB<<#122$((**LL"44&*&D&D,,**"44((
 	
r"   c                J   [        U[        5      (       d  [        S5      eU R                  b  [	        S5      e[        U R                  U R                  UU R                  U R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nz"type must be an SSHCertificateTypeztype already setr  )rC   r  r  r  rQ   r  r  r  r  r  r  r  r  r  r  )r   r  s     r    r  SSHCertificateBuilder.type  s    $ 233@AA::!/00$((LLLL"44&*&D&D,,**"44((
 	
r"   c                J   [        U[        5      (       d  [        S5      eU R                  b  [	        S5      e[        U R                  U R                  U R                  UU R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nzkey_id must be byteszkey_id already setr  )rC   r   r  r  rQ   r  r  r  r  r  r  r  r  r  r  )r   r  s     r    r  SSHCertificateBuilder.key_id  s    &%((233<<#122$((LL**"44&*&D&D,,**"44((
 	
r"   c                   U R                   (       a  [        S5      e[        S U 5       5      (       a  U(       d  [        S5      eU R                  (       a  [        S5      e[        U5      [        :  a  [        S5      e[        U R                  U R                  U R                  U R                  UU R                   U R                  U R                  U R                  U R                  S9
$ )NzDPrincipals can't be set because the cert is valid for all principalsc              3  B   #    U  H  n[        U[        5      v   M     g 7fr   )rC   r   ).0r   s     r    	<genexpr>9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>  s     C2BQJq%((2Bs   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  rQ   allr  r  rb   _SSHKEY_CERT_MAX_PRINCIPALSr  r  r  r  r  r  r  r  r  )r   r  s     r    r  &SSHCertificateBuilder.valid_principals  s     ))% 
 C2BCCC#G  !!;<< #>>L  %((LL**LL.&*&D&D,,**"44((
 	
r"   c                J   U R                   (       a  [        S5      eU R                  (       a  [        S5      e[        U R                  U R
                  U R                  U R                  U R                   SU R                  U R                  U R                  U R                  S9
$ )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTr  )r  rQ   r  r  r  r  r  r  r  r  r  r  r   s    r    valid_for_all_principals.SSHCertificateBuilder.valid_for_all_principals,  s    !!+  ))CDD$((LL**LL"44&*,,**"44((
 	
r"   c                   [        U[        [        45      (       d  [        S5      e[        U5      nUS:  d  US:  a  [	        S5      eU R
                  b  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  UU R                  U R                  U R                  S9
$ )Nz$valid_before must be an int or floatr   r  zvalid_before must [0, 2**64)zvalid_before already setr  )rC   r+   floatr  rQ   r  r  r  r  r  r  r  r  r  r  r  )r   r  s     r    r  "SSHCertificateBuilder.valid_beforeB  s    ,e55BCC<(!|u4;<<)788$((LL**LL"44&*&D&D&**"44((
 	
r"   c                   [        U[        [        45      (       d  [        S5      e[        U5      nUS:  d  US:  a  [	        S5      eU R
                  b  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  UU R                  U R                  S9
$ )Nz#valid_after must be an int or floatr   r  zvalid_after must [0, 2**64)zvalid_after already setr  )rC   r+   r-  r  rQ   r  r  r  r  r  r  r  r  r  r  r  )r   r  s     r    r  !SSHCertificateBuilder.valid_afterX  s    +U|44ABB+&?kU2:;;(677$((LL**LL"44&*&D&D,,$"44((
 	
r"   c                   [        U[        5      (       a  [        U[        5      (       d  [        S5      eXR                   VVs/ s H  u  pUPM	     snn;   a  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  / U R                  QWU4PU R                  S9
$ s  snnf )Nname and value must be byteszDuplicate critical option namer  )rC   r   r  r  rQ   r  r  r  r  r  r  r  r  r  r  r   rW   r  r
  s       r    add_critical_option)SSHCertificateBuilder.add_critical_optionn  s     $&&j.F.F:;;(>(>?(>WTD(>??=>>$((LL**LL"44&*&D&D,,**F 6 6FuF((
 	
 @   C!c                   [        U[        5      (       a  [        U[        5      (       d  [        S5      eXR                   VVs/ s H  u  pUPM	     snn;   a  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  / U R                  QWU4PS9
$ s  snnf )Nr2  zDuplicate extension namer  )rC   r   r  r  rQ   r  r  r  r  r  r  r  r  r  r  r3  s       r    add_extension#SSHCertificateBuilder.add_extension  s     $&&j.F.F:;;(8(89(8WTD(899788$((LL**LL"44&*&D&D,,**"44:$**:T5M:
 	
 :r6  c           
     ~   [        U[        R                  [        R                  [
        R                  45      (       d  [        S5      eU R                  c  [        S5      eU R                  c  SOU R                  nU R                  c  [        S5      eU R                  c  SOU R                  nU R                  (       d  U R                  (       d  [        S5      eU R                  c  [        S5      eU R                   c  [        S5      eU R                   U R                  :  a  [        S	5      eU R"                  R%                  S
 S9  U R&                  R%                  S S9  [)        U R                  5      nU[*        -   n[,        R.                  " S5      n[1        U5      n[3        5       nUR5                  U5        UR5                  U5        UR7                  U R                  U5        UR9                  U5        UR;                  U R                  R<                  5        UR5                  U5        [3        5       n	U R                   H  n
U	R5                  U
5        M     UR5                  U	R?                  5       5        UR9                  U R                   5        UR9                  U R                  5        [3        5       nU R"                   Hr  u  pUR5                  U5        [A        U5      S:  a<  [3        5       nUR5                  U5        UR5                  UR?                  5       5        Ma  UR5                  U5        Mt     UR5                  UR?                  5       5        [3        5       nU R&                   Hr  u  pUR5                  U5        [A        U5      S:  a<  [3        5       nUR5                  U5        UR5                  UR?                  5       5        Ma  UR5                  U5        Mt     UR5                  UR?                  5       5        UR5                  S5        [)        U5      n[1        U5      n[3        5       nUR5                  U5        UR7                  URC                  5       U5        UR5                  UR?                  5       5        [        U[
        R                  5      (       al  URE                  UR?                  5       5      n[3        5       nUR5                  U5        UR5                  U5        UR5                  UR?                  5       5        GO[        U[        R                  5      (       a  [G        URH                  5      nURE                  UR?                  5       [        RJ                  " U5      5      n[L        RN                  " U5      u  nn[3        5       nUR5                  U5        [3        5       nURQ                  U5        URQ                  U5        UR5                  UR?                  5       5        UR5                  UR?                  5       5        O[        U[        R                  5      (       d   e[3        5       nUR5                  [R        5        URE                  UR?                  5       [T        RV                  " 5       [X        RZ                  " 5       5      nUR5                  U5        UR5                  UR?                  5       5        [\        R^                  " UR?                  5       5      Ra                  5       n[b        Rd                  " [f        [i        SRk                  USU/5      5      5      $ )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                    U S   $ Nr   r4   r   s    r    <lambda>,SSHCertificateBuilder.sign.<locals>.<lambda>  s    !A$r"   )rR   c                    U S   $ r<  r4   r=  s    r    r>  r?    s    AaDr"   r;   r  )6rC   r   rD   r   rH   r   rN   r  r  rQ   r  r  r  r  r  r  r  r  sortr  rT   r  ru  rv  r;  r   r   r   r   r   r  r   rb   rF   signr  rV   r  r  decode_dss_signaturer   r  r   r  r	   r  rP  r  r  r  r  r  r  r[   )r   r   r  r  rS   cert_prefixr  rf  ffprincipalsr   fcritrW   r  foptvalfextfextvalca_typecaformatcafr  fsigr  r  r  fsigblob	cert_datas                              r    rB  SSHCertificateBuilder.sign  sc   **!!))
 
 :;;#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1KDT"5zA~#+""5)  !23  ' 2 	
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"   )
r  r  r  r  r  r  r  r  r  r  )r  zSSHCertPublicKeyTypes | Noner  r0   r  zSSHCertificateType | Noner  bytes | Noner  r   r  r2   r  r0   r  r0   r  list[tuple[bytes, bytes]]r  rS  )rF   r  r   r  )r  r+   r   r  )r  r  r   r  )r  r   r   r  )r  r   r   r  )r  int | floatr   r  )r  rT  r   r  )rW   r   r  r   r   r  )r   SSHCertPrivateKeyTypesr   r  )r5   r6   r7   r8   r   rF   r  r  r  r  r*  r  r  r4  r8  rB  r:   r4   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   r2   r   r   )rR   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr   r   )rF   r  r   r   )r]   r   r^   r   r_   r   r   r   )r]   r   r.   r+   r   r   )r]   r   r   r   )
rh   r   r   rR  r   r   r   r+   r   z)Cipher[modes.CBC | modes.CTR | modes.GCM])r]   r   r   ztuple[int, memoryview])r]   r   r   tuple[memoryview, memoryview])r   r+   r   r   )r   rV  )rS   r   r   )r]   r   r   rR  r]  
typing.Anyr   SSHPrivateKeyTypes)r   rX  r   r   ry  r   r   r   )rV   r  r   zhashes.HashAlgorithm)r]   r   r   z"SSHCertificate | SSHPublicKeyTypes)r  r   r   r  )r]   r   r]  rW  r   r  )rF   r  r   r   )
__future__r   rP  enumru  rer  rZ  base64r   r\   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ImportErrorrP   rJ   rM   rB  _ECDSA_NISTP384_ECDSA_NISTP521r  _SK_SSH_ED25519_SK_SSH_ECDSA_NISTP256r  r  compiler  rR  	_SK_START_SK_ENDrT  rS  rr  rs  DOTALLrM  r   r   rangerY  r(   AESCTRCBCGCMr=   r9   rX   rT   rE   r`   rc   rf   rk   ru   rz   r}   r   r   r   r   r   r   r  r7  r9  r@  r  r  r  rE  r;  UnionrD   rH   rK   rN   rX  ro  r  rG   rI   rL   rO   r  r  Enumr  r  r  r   r  r  r  r  rU  r'  r  r4   r"   r    <module>rv     sF  
 #   	 	   0 !  8 1  J  9) (((' 0>  "!23	2	
.
 **Y)G3RYY
? ia 012    NNYY NNYY  *NNYY ')% @ !  &' %eO<
<< < 	<:8  	
 /(??,+3 3lE, E,PCD CDLD8 D8N@% @%F
   $   ( momo#%_[",,.A_[",,.A_[",,.A(*-/	F \\  e
ee e 	ePJ'#J'J' 5J' 	J'Z LL    
~ ~B \
\ (\~+
+'+* (,
$(+(    " I
 I
U#  
9 #(999 9 	9
  9 
9 9
9s   /N< <OO