
    ӝgh                       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 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Z0dZ1dZ2dZ3dZ4dZ5 ejl                  d      Z7dZ8dZ9dZ:dZ;dZ<d Z=d!Z> ejl                  e9d"z   e:z   ej~                        Z@ eA eB eCd#d$                  ZDe G d% d&             ZE eEej                  d'ej                  d!d!dd(       eEej                  d'ej                  d!d!dd(       eEej                  d'ej                  d!d)d!d(      d*ZJd+eKd,<   e.e/e0d-ZLd`d.ZMdad/ZNe9d0z   e:d0z   f	 	 	 	 	 	 	 dbd1ZOdcd2ZPddd3ZQ	 	 	 	 	 	 	 	 	 	 ded4ZRdfd5ZSdfd6ZTdgd7ZUdfd8ZVdhd9ZW G d: d;      ZX G d< d=      ZY G d> d?      ZZ G d@ dA      Z[ G dB dC      Z\didDZ] G dE dF      Z^ G dG dH      Z_e, eY       e- eZ       e+ e\       e. e[dI ej                               e/ e[dJ ej                               e0 e[dK ej                               e2 e^       e3 e_       iZcdjdLZdej                  ej                  ej                  ej                  ej                  f   Zj	 dkddM	 	 	 	 	 	 	 	 	 dldNZk	 	 	 	 	 	 	 	 dmdOZlej                  ej                  ej                  ej                  ej                  f   Zqej                  ej                  ej                  ej                  f   Zr G dP dQej                        Zt G dR dS      ZudndTZv	 d^	 	 	 dodUZw	 	 	 	 dpdVZxdqdWZy	 	 	 	 	 	 drdXZz	 dk	 	 	 	 	 dsdYZ{dtdZZ|ej                  ej                  ej                  ej                  f   Z}d[Z~ G d\ d]      Zy# e*$ r dZ)	 d^	 	 	 	 	 	 	 	 	 	 	 d_dZ(Y _w xY w)u    )annotationsN)encodebytes)	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        t/var/www/enzed_healthcare/enzed_env/lib/python3.12/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                  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.   r0   r2      )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_typerQ      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_TYPErN   )rC   rS   s     r    rB   rB      sE    Ezz(5ejj^D
 	
 5::&&r"      
c                <    dj                  |t        |       |g      S )Nr"   )join_base64_encode)dataprefixsuffixs      r    _ssh_pem_encoder]      s    
 88V^D16:;;r"   c                @    | rt        |       |z  dk7  rt        d      y)zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenrN   )rZ   r-   s     r    _check_block_sizer`      s&    3t9y(A-899 .r"   c                    | rt        d      y)z!All data should have been parsed.zCorrupt data: unparsed dataN)rN   rZ   s    r    _check_emptyrc      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)	TypeErrorr:   r!   r+   r.   r   r)   r,   )
ciphernamer   r   r   ciphseeds         r    _init_cipherri      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r_   rN   r*   
from_bytesrb   s    r    _get_u32rs      <    
4y1}((>>$r(e>4d12h>>r"   c                r    t        |       dk  rt        d      t        j                  | dd d      | dd fS )Uint64   rm   Nrn   ro   rq   rb   s    r    _get_u64rx      rt   r"   c                d    t        |       \  }} |t        |       kD  rt        d      | d| | |d fS )zBytes with u32 length prefixrm   N)rs   r_   rN   )rZ   ns     r    _get_sshstrr{      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      rm   rn   )r{   rN   r*   rr   )rZ   vals     r    
_get_mpintr      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"   rw   )rN   
bit_lengthr   int_to_bytes)r~   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   r~   s     r    put_rawz_FragList.put_raw  s    

#r"   c                \    | j                   j                  |j                  dd             y)zBig-endian uint32rl   rn   lengthrp   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 uint64rw   rn   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   r_   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mapr_   r   r   s    r    r   z_FragList.size   s    3sDJJ'((r"   c                V    | j                   D ]  }t        |      }|||z   }}||||  |S )zWrite into bytearray)r   r_   )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)r~   utils.Bufferr   r   )r~   r*   r   r   )r~   zbytes | _FragListr   r   r   r*   )r   )r   r   r   r*   r   r*   r   r   )r3   r4   r5   __doc__r6   r   r   r   r   r   r   r   r   r   r7   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r   )r   rZ   erz   s       r    
get_publicz_SSHFormatRSA.get_public<  s.     T"4T"41vt|r"   c                    | j                  |      \  \  }}}t        j                  ||      }|j                         }||fS )zMake RSA public key from data.)r   r   RSAPublicNumbersrC   )r   rZ   r   rz   public_numbersrC   s         r    load_publicz_SSHFormatRSA.load_publicD  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)r   rN   r   rsa_crt_dmp1rsa_crt_dmq1r   RSAPrivateNumbersprivate_key)r   rZ   	pubfieldsr   rz   r   diqmppqdmp1dmq1r   private_numbersr   s                  r    load_privatez_SSHFormatRSA.load_privateM  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   rz   )r   rC   f_pubpubns       r    encode_publicz_SSHFormatRSA.encode_publice  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   rz   r   r   r   r   r   )r   r   f_privr   r   s        r    encode_privatez_SSHFormatRSA.encode_privatem  s     &557(77))*))***+--.**+**+r"   N)rZ   r   r   z"tuple[tuple[int, int], memoryview])rZ   r   r   z#tuple[rsa.RSAPublicKey, memoryview])rZ   r   r   r1   r   z$tuple[rsa.RSAPrivateKey, memoryview])rC   zrsa.RSAPublicKeyr   r   r   r   )r   zrsa.RSAPrivateKeyr   r   r   r   	r3   r4   r5   r   r   r   r   r   r   r7   r"   r    r   r   3  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   rZ   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	_validaterC   )	r   rZ   r   r   r   r   parameter_numbersr   rC   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   r   rN   r
   r   r   r   DSAPrivateNumbersr   )r   rZ   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   rC   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   rC   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   r   rN   )r   r   r   s      r    r   z_SSHFormatDSA._validate  s6    *<<))+t3BCC 4r"   N)rZ   r   r   ztuple[tuple, memoryview])rZ   r   r   z#tuple[dsa.DSAPublicKey, memoryview])rZ   r   r   r1   r   z$tuple[dsa.DSAPrivateKey, memoryview])rC   zdsa.DSAPublicKeyr   r   r   r   )r   zdsa.DSAPrivateKeyr   r   r   r   )r   zdsa.DSAPublicNumbersr   r   )
r3   r4   r5   r   r   r   r   r   r   r   r7   r"   r    r   r   }  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_namerS   )r   r   rS   s      r    r   z_SSHFormatECDSA.__init__  s    ,
r"   c                    t        |      \  }}t        |      \  }}|| j                  k7  rt        d      |d   dk7  rt        d      ||f|fS )zECDSA public fieldszCurve name mismatchr   rl   zNeed uncompressed point)r{   r   rN   NotImplementedError)r   rZ   rS   points       r    r   z_SSHFormatECDSA.get_public  s`     "$'t!$'tD'''2338q=%&?@@u~t##r"   c                    | j                  |      \  \  }}}t        j                  j                  | j                  |j                               }||fS z Make ECDSA public key from data.)r   r   rD   from_encoded_pointrS   r   )r   rZ   _r   rC   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   r   rN   r   derive_private_keyrS   )r   rZ   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   rC   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)rC   r   r   r   private_value)r   r   r   rC   r   s        r    r   z_SSHFormatECDSA.encode_private  sD     !++-
%557:v.667r"   N)r   r   rS   ec.EllipticCurve)rZ   r   r   z0tuple[tuple[memoryview, memoryview], memoryview]rZ   r   r   z,tuple[ec.EllipticCurvePublicKey, memoryview])rZ   r   r   r1   r   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rC   ec.EllipticCurvePublicKeyr   r   r   r   )r   zec.EllipticCurvePrivateKeyr   r   r   r   )
r3   r4   r5   r   r   r   r   r   r   r   r7   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)r{   )r   rZ   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   rL   from_public_bytesr   )r   rZ   r   rC   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.Nr8   z$Corrupt data: ed25519 field mismatch)r   r{   rN   r   rK   from_private_bytes)	r   rZ   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   rC   r   raw_public_keys       r    r   z_SSHFormatEd25519.encode_public3  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)rC   private_bytesr   r  r   r   r   r   r   r   r   )r   r   r   rC   raw_private_keyr  	f_keypairs          r    r   z _SSHFormatEd25519.encode_private<  s     !++-
%33LL-++\^
 $00LL,**
 ?@	:v.)$r"   N)rZ   r   r   z$tuple[tuple[memoryview], memoryview]rZ   r   r   z+tuple[ed25519.Ed25519PublicKey, memoryview])rZ   r   r   r1   r   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rC   zed25519.Ed25519PublicKeyr   r   r   r   )r   zed25519.Ed25519PrivateKeyr   r   r   r   r   r7   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:' ())r{   r   
startswithrN   )rZ   applications     r    load_applicationr  M  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_kformatrM   r   r  r   rZ   rC   r   s       r    r   z_SSHFormatSKEd25519.load_publicc  s7     +<8DDTJ
D"4(44r"   c                    t        d      )Nz,sk-ssh-ed25519 private keys cannot be loadedr   r   rZ   s     r    r   z_SSHFormatSKEd25519.get_publick  s     #:
 	
r"   Nr  rZ   r   r   ztyping.NoReturnr3   r4   r5   r   r   r   r7   r"   r    r  r  Z  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_public}  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   r7   r"   r    r"  r"  s  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   )rP   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.rZ   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.rw   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searchrN   r   endbinascii
a2b_base64r   r  	_SK_MAGICr_   r{   rs   r  r   rc   _NONEr   r:   r   _BCRYPTr-   r0   r2   r   r`   ri   	decryptorupdater@   r   finalize_with_tagfinalizere   r   _PADDINGr
   rH   warningswarnDeprecatedIn40)rZ   r   backendr   mp1p2rf   kdfname
kdfoptionsnkeyspubdatapub_key_typekformatr   ciphername_bytesblklenr0   edatatagr   kbufr   rg   decck1ck2rP   r   r   s                                 r    load_ssh_private_keyrQ    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 releaserl   r+  Nr$   rw   r%   r"   )%r   r.  r@   r
   rH   r<  r=  r>  rQ   r  r   _DEFAULT_CIPHERr:   r-   r6  _DEFAULT_ROUNDSr   _kdf_roundsosurandomr   r   ri   r5  r   rC   r   r   r;  r   r4  r   r   r   	encryptorupdate_intor]   )r   r   encryption_algorithmrP   rH  f_kdfoptionsrf   rJ  rC  r   r   rg   rE  checkvalcommentf_public_key	f_secretsf_mainslenmlenr   ofss                         r    _serialize_ssh_private_keyre    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>3u:&&r"   c                      e Zd ZdZdZy)SSHCertificateTyper%   r*  N)r3   r4   r5   USERHOSTr7   r"   r    rg  rg  w  s    DDr"   rg  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_serialrg  _typerN   _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   rm  rn  ro  _cctyperq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r}  r{  r|  s                     r    r   zSSHCertificate.__init__}  s    ( &	9+G4DJ !2(*!2&" .$,$,  	9788	9s   B Bc                ,    t        | j                        S r   )r   rm  r   s    r    noncezSSHCertificate.nonce  s    T[[!!r"   c                J    t        j                  t        | j                        S r   )typingcastSSHCertPublicKeyTypesrn  r   s    r    rC   zSSHCertificate.public_key  s     {{0$2B2BCCr"   c                    | j                   S r   )ro  r   s    r    serialzSSHCertificate.serial  s    ||r"   c                    | j                   S r   )rp  r   s    r    typezSSHCertificate.type  s    zzr"   c                ,    t        | j                        S r   )r   rq  r   s    r    key_idzSSHCertificate.key_id  s    T\\""r"   c                    | j                   S r   )rr  r   s    r    valid_principalszSSHCertificate.valid_principals      %%%r"   c                    | j                   S r   )rt  r   s    r    valid_beforezSSHCertificate.valid_before  s    !!!r"   c                    | j                   S r   )rs  r   s    r    valid_afterzSSHCertificate.valid_after  s       r"   c                    | j                   S r   )ru  r   s    r    critical_optionszSSHCertificate.critical_options  r  r"   c                    | j                   S r   )rv  r   s    r    
extensionszSSHCertificate.extensions  s    r"   c                    t        | j                        }|j                  | j                        \  }}t	        |       |S r   )r  rw  r   rx  rc   )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   r{  r2  
b2a_base64r|  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   rL   verifyr   rz  r}  r   rD   r   rc   
asym_utilsencode_dss_signature_get_ec_hash_algrS   ECDSAr   rF   ry  rG   r	   SHA1_SSH_RSA_SHA256SHA256_SSH_RSA_SHA512SHA512r   PKCS1v15)r   r  rrZ   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)"rm  r   rn  SSHPublicKeyTypesro  r*   r~  r*   rq  r   rr  list[bytes]rs  r*   rt  r*   ru  dict[bytes, bytes]rv  r  rw  r   rx  r   ry  r   rz  r   r}  r   r{  r   r|  r   r   )r   r  r   )r   rg  )r   r  )r   r  )r   r   )r3   r4   r5   r   propertyr  rC   r  r  r  r  r  r  r  r  r  r   r  r7   r"   r    rk  rk  |  sy   '-'- ''- 	'-
 '- '- ''- '- '- .'- ('- '- '- $'- '-  #!'-" #'-$ %'-R " "D
     # # & & " " ! ! & &    
r"   rk  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  )rS   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)NrZ   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matchrN   groupendswith_CERT_SUFFIXr_   rJ   r   r  r   r2  r3  re   Errorr{   r   rx   rs   r   r   _parse_exts_optsrc   rG   r  r  rk  )"rZ   _legacy_dsa_allowedr@  rP   orig_key_typekey_body	with_certrH  rest	cert_bodyinner_key_typer  rC   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  rb   s    r    load_ssh_public_identityr  f  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)r{   r   rN   r_   )	exts_optsresult	last_namerT   bnamevalueextras          r    r  r  l  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                  f      st	        d      t        |       }t        |      }t               }|j                  |       |j                  | |       |j                         }t        j                  |      }|j                  |       |j                         S )Nz+hash_algorithm must be either MD5 or SHA256)r@   r	   MD5r  re   rQ   r  r   r   r   r   Hashr8  r:  )rO   hash_algorithmrP   rH  r   ssh_binary_datahash_objs          r    ssh_key_fingerprintr    s     nvzz6==&ABEFF %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@   rk  rC   r
   rI   r<  r=  r   r>  )rZ   r?  cert_or_keyrC   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 OpenSSHrS  rl   r+  r"   r  )r@   r
   rI   r<  r=  r   r>  rQ   r  r   r   r   r2  r  r   striprX   )rC   rP   rH  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   
rn  ro  rp  rq  rr  _valid_for_all_principalsrt  rs  ru  rv  )r   rn  ro  rp  rq  rr  r  rt  rs  ru  rv  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   rD   r   rF   r   rL   re   rn  rN   r  ro  rp  rq  rr  r  rt  rs  ru  rv  )r   rC   s     r    rC   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*   re   rN   ro  r  rn  rp  rq  rr  r  rt  rs  ru  rv  )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@   rg  re   rp  rN   r  rn  ro  rq  rr  r  rt  rs  ru  rv  )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   re   rq  rN   r  rn  ro  rp  rr  r  rt  rs  ru  rv  )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>C  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  rN   allre   rr  r_   _SSHKEY_CERT_MAX_PRINCIPALSr  rn  ro  rp  rq  rt  rs  ru  rv  )r   r  s     r    r  z&SSHCertificateBuilder.valid_principals:  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  )rr  rN   r  r  rn  ro  rp  rq  rt  rs  ru  rv  r   s    r    valid_for_all_principalsz.SSHCertificateBuilder.valid_for_all_principals^  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*   floatre   rN   rt  r  rn  ro  rp  rq  rr  r  rs  ru  rv  )r   r  s     r    r  z"SSHCertificateBuilder.valid_beforet  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   re   rN   rs  r  rn  ro  rp  rq  rr  r  rt  ru  rv  )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   re   ru  rN   r  rn  ro  rp  rq  rr  r  rt  rs  rv  r   rT   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   re   rv  rN   r  rn  ro  rp  rq  rr  r  rt  rs  ru  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   r7   r   s    r    <lambda>z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    !A$ r"   )rO   c                    | d   S r  r7   r  s    r    r  z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    AaD r"   r8   r  )6r@   r   rA   r   rE   r   rK   re   rn  rN   ro  rp  rq  rr  r  rt  rs  ru  sortrv  rQ   r  rW  rX  r  r   r   r   r   r   r  r   r_   rC   signr  rS   r  r  decode_dss_signaturer   r  r   r  r	   r  r2  r  r  r  r  rk  r  rX   )r   r   r  r  rP   cert_prefixr  rH  ffprincipalsr   fcritrT   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"   )rn  zSSHCertPublicKeyTypes | Nonero  r/   rp  zSSHCertificateType | Nonerq  bytes | Nonerr  r  r  r1   rt  r/   rs  r/   ru  list[tuple[bytes, bytes]]rv  r   )rC   r  r   r  )r  r*   r   r  )r  rg  r   r  )r  r   r   r  )r  r  r   r  )r  int | floatr   r  )r  r!  r   r  )rT   r   r  r   r   r  )r   SSHCertPrivateKeyTypesr   rk  )r3   r4   r5   r   rC   r  r  r  r  r  r  r  r  r  r  r7   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   r1   r   r   )rO   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr   r   )rC   r   r   r   )rZ   r   r[   r   r\   r   r   r   )rZ   r   r-   r*   r   r   )rZ   r   r   r   )
rf   r   r   r  r   r   r   r*   r   z)Cipher[modes.CBC | modes.CTR | modes.GCM])rZ   r   r   ztuple[int, memoryview])rZ   r   r   tuple[memoryview, memoryview])r~   r*   r   r   )r   r#  )rP   r   r   )
rZ   r   r   r  r?  
typing.Anyr   r1   r   SSHPrivateKeyTypes)r   r%  r   r   r[  r   r   r   )rS   r   r   zhashes.HashAlgorithm)rZ   r   r   "SSHCertificate | SSHPublicKeyTypes)rZ   r   r   r&  )r  r   r   r  )rO   r  r  zhashes.MD5 | hashes.SHA256r   r   )rZ   r   r?  r$  r   r  )rC   r  r   r   )
__future__r   r2  enumrW  rer  r<  base64r   rY   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ImportErrorrM   rG   rJ   r$  _ECDSA_NISTP384_ECDSA_NISTP521r  _SK_SSH_ED25519_SK_SSH_ECDSA_NISTP256r  r  compiler  r4  	_SK_START_SK_ENDr6  r5  rT  rU  DOTALLr/  r   r   ranger;  r(   AESCTRCBCGCMr:   r6   rU   rQ   rB   r]   r`   rc   ri   rs   rx   r{   r   r   r   r   r   r   r  r  r  r"  r  r  r  r'  r  UnionrA   rE   rH   rK   r%  rQ  re  rD   rF   rI   rL   r  r  Enumrg  rk  r  r  r  r  r  r  r  r"  r  r  r7   r"   r    <module>rD     s  
 #   	 	   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G, G,TCD CDLD8 D8N@% @%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 \
\ (\~+
+'+(	. . /3
!+(+(    " I
 I
y$  
9 #(999 9 	9
  9 
9
9s   /N; ;OO