B
    uf                 @  s  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% yd dl&m'Z( dZ)W n4 e*k
r"   dZ)ddddddddddZ(Y nX dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3e4dZ5dZ6dZ7d Z8d!Z9d"Z:d#Z;d$Z<e4e7d% e8 ej=Z>e?e@eAd&d'ZBeG d(d) d)ZCeCejDd*ejEd$d$ddd+eCejDd*ejFd$d$ddd+eCejDd*ejGd$d,d$dd+d-ZHd.eId/< e.e/e0d0ZJd1dd2d3d4ZKd5dd6d7d8ZLe7d9 e8d9 fddddd:d;d<ZMddd=d>d?d@ZNdd=dAdBdCZOddDdddEdFdGdHZPdIdJdAdKdLZQdIdJdAdMdNZRdIdOdAdPdQZSdIdJdAdRdSZTdddTdUdVZUG dWdX dXZVG dYdZ dZZWG d[d\ d\ZXG d]d^ d^ZYG d_d` d`ZZe,eW e-eX e+eZ e.eYdae[ e/eYdbe\ e0eYdce] iZ^ddddedfZ_ej`ejaejbejcejdf ZedddDdgdhdidjdkZfdhddlddmdndoZgej`ejhejiejjejkf Zlej`ejhejiejkf ZmG dpdq dqejnZoG drds dsZpdtdudvdwdxZqdddydAdzd{ZrddydAd|d}ZsdId~dddZtdddgddddZuddd6ddZvej`ejaejbejdf ZwdZxG dd dZydS )    )annotationsN)encodebytes)	dataclass)utils)UnsupportedAlgorithm)hashes)dsaeced25519paddingrsa)AEADDecryptionContextCipher
algorithmsmodes)EncodingKeySerializationEncryptionNoEncryptionPrivateFormatPublicFormat_KeySerializationEncryption)kdfTFbytesintbool)passwordsaltdesired_key_bytesroundsignore_few_roundsreturnc             C  s   t dd S )NzNeed bcrypt module)r   )r   r   r   r   r    r!   r/home/ankuromar296_gmail_com/myenv/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/ssh.py_bcrypt_kdf1   s    r#   s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@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   nones
   aes256-ctr   s   (.*?)      c               @  sF   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< dS )
_SSHCipherztype[algorithms.AES]algr   key_lenz3type[modes.CTR] | type[modes.CBC] | type[modes.GCM]mode	block_leniv_lenz
int | Nonetag_lenr   is_aeadN)__name__
__module____qualname____annotations__r!   r!   r!   r"   r'   X   s   
r'       )r(   r)   r*   r+   r,   r-   r.      )s
   aes256-ctrs
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]_SSH_CIPHERS)Z	secp256r1Z	secp384r1Z	secp521r1z&SSHPrivateKeyTypes | SSHPublicKeyTypes)keyr    c             C  s   t | tjrt|  }nft | tjr0t| }nPt | tjtjfrHt	}n8t | t
jt
jfr`t}n t | tjtjfrxt}ntd|S )NzUnsupported key type)
isinstancer	   EllipticCurvePrivateKey_ecdsa_key_type
public_keyEllipticCurvePublicKeyr   RSAPrivateKeyRSAPublicKey_SSH_RSAr   DSAPrivateKeyDSAPublicKey_SSH_DSAr
   Ed25519PrivateKeyEd25519PublicKey_SSH_ED25519
ValueError)r6   key_typer!   r!   r"   _get_ssh_key_type   s    
rG   zec.EllipticCurvePublicKey)r:   r    c             C  s*   | j }|jtk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_TYPErE   )r:   rH   r!   r!   r"   r9      s
    
r9      
)dataprefixsuffixr    c             C  s   d |t| |gS )N    )join_base64_encode)rL   rM   rN   r!   r!   r"   _ssh_pem_encode   s    rR   None)rL   r+   r    c             C  s    | rt | | dkrtddS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenrE   )rL   r+   r!   r!   r"   _check_block_size   s    rU   )rL   r    c             C  s   | rt ddS )z!All data should have been parsed.zCorrupt data: unparsed dataN)rE   )rL   r!   r!   r"   _check_empty   s    rV   zbytes | Nonez)Cipher[modes.CBC | modes.CTR | modes.GCM])
ciphernamer   r   r   r    c             C  sV   |st dt|  }t|||j|j |d}t||d|j |||jd S )z$Generate key + iv and return cipher.zKey is password-protected.TN)rE   r5   r#   r)   r,   r   r(   r*   )rW   r   r   r   ciphseedr!   r!   r"   _init_cipher   s    rZ   
memoryviewztuple[int, memoryview]c             C  s6   t | dk rtdtj| dd dd| dd fS )ZUint32   zInvalid dataNbig)	byteorder)rT   rE   r   
from_bytes)rL   r!   r!   r"   _get_u32   s    r`   c             C  s6   t | dk rtdtj| dd dd| dd fS )ZUint64   zInvalid dataNr]   )r^   )rT   rE   r   r_   )rL   r!   r!   r"   _get_u64   s    rb   ztuple[memoryview, memoryview]c             C  s8   t | \}} |t| kr td| d| | |d fS )zBytes with u32 length prefixzInvalid dataN)r`   rT   rE   )rL   nr!   r!   r"   _get_sshstr   s    rd   c             C  s4   t | \}} |r$|d dkr$tdt|d| fS )zBig integer.r      zInvalid datar]   )rd   rE   r   r_   )rL   valr!   r!   r"   
_get_mpint   s    rg   )rf   r    c             C  s4   | dk rt d| sdS |  d d }t| |S )z!Storage format for signed bigint.r   znegative mpint not allowedrO   ra   )rE   
bit_lengthr   Zint_to_bytes)rf   nbytesr!   r!   r"   	_to_mpint   s    rj   c               @  s   e Zd ZU dZded< d"ddddd	Zd
ddddZdddddZdddddZdddddZ	dddddZ
ddddZd#ddddddZd
dd d!ZdS )$	_FragListz,Build recursive structure without data copy.zlist[bytes]flistNzlist[bytes] | NonerS   )initr    c             C  s   g | _ |r| j | d S )N)rl   extend)selfrm   r!   r!   r"   __init__   s    z_FragList.__init__r   )rf   r    c             C  s   | j | dS )zAdd plain bytesN)rl   append)ro   rf   r!   r!   r"   put_raw  s    z_FragList.put_rawr   c             C  s   | j |jddd dS )zBig-endian uint32r\   r]   )lengthr^   N)rl   rq   to_bytes)ro   rf   r!   r!   r"   put_u32  s    z_FragList.put_u32c             C  s   | j |jddd dS )zBig-endian uint64ra   r]   )rs   r^   N)rl   rq   rt   )ro   rf   r!   r!   r"   put_u64	  s    z_FragList.put_u64zbytes | _FragListc             C  sL   t |tttfr,| t| | j| n| |  | j	|j dS )zBytes prefixed with u32 lengthN)
r7   r   r[   	bytearrayru   rT   rl   rq   sizern   )ro   rf   r!   r!   r"   
put_sshstr  s
    z_FragList.put_sshstrc             C  s   |  t| dS )z*Big-endian bigint prefixed with u32 lengthN)ry   rj   )ro   rf   r!   r!   r"   	put_mpint  s    z_FragList.put_mpint)r    c             C  s   t tt| jS )zCurrent number of bytes)summaprT   rl   )ro   r!   r!   r"   rx     s    z_FragList.sizer   r[   )dstbufposr    c             C  s6   x0| j D ]&}t|}|||  }}||||< qW |S )zWrite into bytearray)rl   rT   )ro   r}   r~   fragZflenstartr!   r!   r"   render  s
    z_FragList.renderc             C  s"   t t|  }| | | S )zReturn as bytes)r[   rw   rx   r   tobytes)ro   bufr!   r!   r"   r   &  s    
z_FragList.tobytes)N)r   )r/   r0   r1   __doc__r2   rp   rr   ru   rv   ry   rz   rx   r   r   r!   r!   r!   r"   rk      s   
	rk   c               @  sb   e Zd ZdZddddZddddd	Zdd
dddZddddddZddddddZdS )_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    r[   )rL   c             C  s$   t |\}}t |\}}||f|fS )zRSA public fields)rg   )ro   rL   erc   r!   r!   r"   
get_public6  s    z_SSHFormatRSA.get_publicz#tuple[rsa.RSAPublicKey, memoryview])rL   r    c             C  s.   |  |\\}}}t||}| }||fS )zMake RSA public key from data.)r   r   RSAPublicNumbersr:   )ro   rL   r   rc   public_numbersr:   r!   r!   r"   load_public<  s    z_SSHFormatRSA.load_publicz$tuple[rsa.RSAPrivateKey, memoryview]c          	   C  s   t |\}}t |\}}t |\}}t |\}}t |\}}t |\}}||f|kr\tdt||}	t||}
t||}t||||	|
||}| }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch)rg   rE   r   Zrsa_crt_dmp1Zrsa_crt_dmq1r   ZRSAPrivateNumbersprivate_key)ro   rL   	pubfieldsrc   r   diqmppqZdmp1Zdmq1r   private_numbersr   r!   r!   r"   load_privateE  s    z_SSHFormatRSA.load_privatezrsa.RSAPublicKeyrk   rS   )r:   f_pubr    c             C  s$   |  }||j ||j dS )zWrite RSA public keyN)r   rz   r   rc   )ro   r:   r   Zpubnr!   r!   r"   encode_public[  s    z_SSHFormatRSA.encode_publiczrsa.RSAPrivateKey)r   f_privr    c             C  sZ   |  }|j}||j ||j ||j ||j ||j ||j dS )zWrite RSA private keyN)	r   r   rz   rc   r   r   r   r   r   )ro   r   r   r   r   r!   r!   r"   encode_privatec  s    z_SSHFormatRSA.encode_privateN)	r/   r0   r1   r   r   r   r   r   r   r!   r!   r!   r"   r   -  s   	r   c               @  st   e Zd ZdZdddddZddddd	Zdd
dddZddddddZddddddZdddddZ	dS )_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    r[   ztuple[tuple, memoryview])rL   r    c             C  s@   t |\}}t |\}}t |\}}t |\}}||||f|fS )zDSA public fields)rg   )ro   rL   r   r   gyr!   r!   r"   r   |  s
    z_SSHFormatDSA.get_publicz#tuple[dsa.DSAPublicKey, memoryview]c       	      C  sJ   |  |\\}}}}}t|||}t||}| | | }||fS )zMake DSA public key from data.)r   r   DSAParameterNumbersDSAPublicNumbers	_validater:   )	ro   rL   r   r   r   r   parameter_numbersr   r:   r!   r!   r"   r     s    
z_SSHFormatDSA.load_publicz$tuple[dsa.DSAPrivateKey, memoryview]c             C  sz   |  |\\}}}}}t|\}}||||f|kr:tdt|||}t||}	| |	 t||	}
|
 }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r   rg   rE   r   r   r   r   ZDSAPrivateNumbersr   )ro   rL   r   r   r   r   r   xr   r   r   r   r!   r!   r"   r     s    
z_SSHFormatDSA.load_privatezdsa.DSAPublicKeyrk   rS   )r:   r   r    c             C  sL   |  }|j}| | ||j ||j ||j ||j dS )zWrite DSA public keyN)r   r   r   rz   r   r   r   r   )ro   r:   r   r   r   r!   r!   r"   r     s    
z_SSHFormatDSA.encode_publiczdsa.DSAPrivateKey)r   r   r    c             C  s$   |  | | || j dS )zWrite DSA private keyN)r   r:   rz   r   r   )ro   r   r   r!   r!   r"   r     s    z_SSHFormatDSA.encode_privatezdsa.DSAPublicNumbers)r   r    c             C  s    |j }|j dkrtdd S )Ni   z#SSH supports only 1024 bit DSA keys)r   r   rh   rE   )ro   r   r   r!   r!   r"   r     s    z_SSHFormatDSA._validateN)
r/   r0   r1   r   r   r   r   r   r   r   r!   r!   r!   r"   r   s  s   r   c               @  st   e Zd ZdZdddddZddd	d
dZddd	ddZddd	ddZddddddZddddddZ	dS )_SSHFormatECDSAzFormat for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    r   zec.EllipticCurve)ssh_curve_namerH   c             C  s   || _ || _d S )N)r   rH   )ro   r   rH   r!   r!   r"   rp     s    z_SSHFormatECDSA.__init__r[   ztuple[tuple, memoryview])rL   r    c             C  sJ   t |\}}t |\}}|| jkr*td|d dkr>td||f|fS )zECDSA public fieldszCurve name mismatchr   r\   zNeed uncompressed point)rd   r   rE   NotImplementedError)ro   rL   rH   pointr!   r!   r"   r     s    
z_SSHFormatECDSA.get_publicz,tuple[ec.EllipticCurvePublicKey, memoryview]c             C  s.   |  |\\}}}tj| j| }||fS )z Make ECDSA public key from data.)r   r	   r;   Zfrom_encoded_pointrH   r   )ro   rL   _r   r:   r!   r!   r"   r     s    z_SSHFormatECDSA.load_publicz-tuple[ec.EllipticCurvePrivateKey, memoryview]c             C  sH   |  |\\}}}t|\}}||f|kr2tdt|| j}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r   rg   rE   r	   Zderive_private_keyrH   )ro   rL   r   Z
curve_namer   secretr   r!   r!   r"   r     s    z_SSHFormatECDSA.load_privatezec.EllipticCurvePublicKeyrk   rS   )r:   r   r    c             C  s*   | tjtj}|| j || dS )zWrite ECDSA public keyN)public_bytesr   ZX962r   ZUncompressedPointry   r   )ro   r:   r   r   r!   r!   r"   r     s    z_SSHFormatECDSA.encode_publiczec.EllipticCurvePrivateKey)r   r   r    c             C  s,   |  }| }| || ||j dS )zWrite ECDSA private keyN)r:   r   r   rz   Zprivate_value)ro   r   r   r:   r   r!   r!   r"   r     s    z_SSHFormatECDSA.encode_privateN)
r/   r0   r1   r   rp   r   r   r   r   r   r!   r!   r!   r"   r     s   



r   c               @  sd   e Zd ZdZdddddZddddd	Zdd
dddZddddddZddddddZdS )_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    r[   ztuple[tuple, memoryview])rL   r    c             C  s   t |\}}|f|fS )zEd25519 public fields)rd   )ro   rL   r   r!   r!   r"   r     s    z_SSHFormatEd25519.get_publicz+tuple[ed25519.Ed25519PublicKey, memoryview]c             C  s(   |  |\\}}tj| }||fS )z"Make Ed25519 public key from data.)r   r
   rC   Zfrom_public_bytesr   )ro   rL   r   r:   r!   r!   r"   r     s    
z_SSHFormatEd25519.load_publicz,tuple[ed25519.Ed25519PrivateKey, memoryview]c             C  sb   |  |\\}}t|\}}|dd }|dd }||ksF|f|krNtdtj|}||fS )z#Make Ed25519 private key from data.Nr3   z$Corrupt data: ed25519 field mismatch)r   rd   rE   r
   rB   Zfrom_private_bytes)ro   rL   r   r   Zkeypairr   Zpoint2r   r!   r!   r"   r     s    z_SSHFormatEd25519.load_privatezed25519.Ed25519PublicKeyrk   rS   )r:   r   r    c             C  s   | tjtj}|| dS )zWrite Ed25519 public keyN)r   r   Rawr   ry   )ro   r:   r   raw_public_keyr!   r!   r"   r   %  s    z_SSHFormatEd25519.encode_publiczed25519.Ed25519PrivateKey)r   r   r    c             C  sR   |  }|tjtjt }|tjtj}t||g}| 	|| |
| dS )zWrite Ed25519 private keyN)r:   Zprivate_bytesr   r   r   r   r   r   rk   r   ry   )ro   r   r   r:   Zraw_private_keyr   Z	f_keypairr!   r!   r"   r   .  s    z _SSHFormatEd25519.encode_privateN)	r/   r0   r1   r   r   r   r   r   r   r!   r!   r!   r"   r     s   
	r   s   nistp256s   nistp384s   nistp521)rF   c             C  s8   t | tst|  } | tkr&t|  S td| dS )z"Return valid format or throw errorzUnsupported key type: N)r7   r   r[   r   _KEY_FORMATSr   )rF   r!   r!   r"   _lookup_kformatI  s
    
r   z
typing.AnySSHPrivateKeyTypes)rL   r   backendr    c             C  s  t d|  |dk	r t d| t| }|s6td|d}|d}t	t
| || } | tsrtdt
| ttd } t| \}} t| \}} t| \}} t| \}	} |	dkrtdt| \}
} t|
\}}
t|}||
\}}
t|
 ||fttfkr&| }|tkr.td||tkrFtd|t| j}t| j}t| \}} t| jrt| }t||krtd	nt|  t|| t|\}}t|\}}t| t||| |}| }t
||}t| jrt |t!st"t|#| nt|$  n"t| \}} t|  d
}t|| t|\}}t|\}}||krrtdt|\}}||krtd|%||\}}t|\}}|t&dt| krtdt |t'j(rt)j*dt j+dd |S )z.Load private key from OpenSSH custom encoding.rL   Nr   zNot OpenSSH private key formatr%   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherra   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid paddingzDSSH DSA keys are deprecated and will be removed in a future release.   )
stacklevel),r   _check_byteslike_check_bytes_PEM_RCsearchrE   r   endbinascii
a2b_base64r[   
startswith	_SK_MAGICrT   rd   r`   r   r   rV   _NONEr   r5   r   _BCRYPTr+   r-   r.   r   rU   rZ   Z	decryptorupdater7   r   AssertionErrorZfinalize_with_tagfinalizer   _PADDINGr   r?   warningswarnDeprecatedIn40)rL   r   r   mp1p2rW   kdfnameZ
kdfoptionsnkeysZpubdataZpub_key_typekformatr   Zciphername_bytesblklenr-   Zedatatagr   Zkbufr   rX   decZck1Zck2rF   r   r   r!   r!   r"   load_ssh_private_keyZ  s    












r   r   )r   r   encryption_algorithmr    c             C  s  t d| t| tjr*tjdt jdd t| }t	|}t
 }|rt}t| j}t}t}	t|trt|jdk	rt|j}	td}
||
 ||	 t|||
|	}nt }}d}d}d}td}d	}t
 }|| ||  | t
||g}|| || | || |td|| |    t
 }|t || || || || || || | }| }tt || }|!| || }|dk	r|" #||| ||d  t$|d| S )
z3Serialize private key with OpenSSH custom encoding.r   zISSH DSA key support is deprecated and will be removed in a future releaser\   )r   Nr$   ra   r%   rO   )%r   r   r7   r   r?   r   r   r   rG   r   rk   _DEFAULT_CIPHERr5   r+   r   _DEFAULT_ROUNDSr   Z_kdf_roundsosurandomry   ru   rZ   r   r   r:   r   rr   r   rx   r   r[   rw   r   Z	encryptorZupdate_intorR   )r   r   r   rF   r   Zf_kdfoptionsrW   r   r   r   r   rX   r   ZcheckvalcommentZf_public_keyZ	f_secretsZf_mainslenmlenr   Zofsr!   r!   r"   _serialize_ssh_private_key  sf    


















 r   c               @  s   e Zd ZdZdZdS )SSHCertificateTyper%   r   N)r/   r0   r1   USERZHOSTr!   r!   r!   r"   r     s   r   c               @  s  e Zd Zdddddddddddddddddddd	Zedd
ddZdd
ddZedd
ddZedd
ddZedd
ddZ	edd
ddZ
edd
ddZedd
ddZedd
ddZedd
dd Zdd
d!d"Zdd
d#d$Zd%d
d&d'Zd(S ))SSHCertificater[   SSHPublicKeyTypesr   zlist[bytes]zdict[bytes, bytes]r   )_nonce_public_key_serial_cctype_key_id_valid_principals_valid_after_valid_before_critical_options_extensions	_sig_type_sig_key_inner_sig_type
_signature_tbs_cert_body_cert_key_type
_cert_bodyc             C  s   || _ || _|| _yt|| _W n tk
r<   tdY nX || _|| _|| _|| _	|	| _
|
| _|| _|| _|| _|| _|| _|| _|| _d S )NzInvalid certificate type)r   r   r   r   _typerE   r   r   r   r   r   r   r   r   r   r   r   r   r   )ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r"   rp   #  s(    zSSHCertificate.__init__)r    c             C  s
   t | jS )N)r   r   )ro   r!   r!   r"   nonceL  s    zSSHCertificate.nonceSSHCertPublicKeyTypesc             C  s   t t| jS )N)typingcastr   r   )ro   r!   r!   r"   r:   P  s    zSSHCertificate.public_keyc             C  s   | j S )N)r   )ro   r!   r!   r"   serialU  s    zSSHCertificate.serialr   c             C  s   | j S )N)r   )ro   r!   r!   r"   typeY  s    zSSHCertificate.typec             C  s
   t | jS )N)r   r   )ro   r!   r!   r"   key_id]  s    zSSHCertificate.key_idc             C  s   | j S )N)r   )ro   r!   r!   r"   valid_principalsa  s    zSSHCertificate.valid_principalsc             C  s   | j S )N)r   )ro   r!   r!   r"   valid_beforee  s    zSSHCertificate.valid_beforec             C  s   | j S )N)r   )ro   r!   r!   r"   valid_afteri  s    zSSHCertificate.valid_afterc             C  s   | j S )N)r   )ro   r!   r!   r"   critical_optionsm  s    zSSHCertificate.critical_optionsc             C  s   | j S )N)r   )ro   r!   r!   r"   
extensionsq  s    zSSHCertificate.extensionsc             C  s&   t | j}|| j\}}t| |S )N)r   r   r   r   rV   )ro   Z	sigformatsignature_keyZsigkey_restr!   r!   r"   r   u  s    
zSSHCertificate.signature_keyc             C  s"   t | jd tjt | jdd S )N    F)newline)r   r   r   
b2a_base64r   )ro   r!   r!   r"   r   {  s    zSSHCertificate.public_bytesrS   c             C  s   |   }t|tjr.|t| jt| j nt|tj	rt
| j\}}t
|\}}t| t||}t|j}||t| jt| nnt|tjst| jtkrt }n*| jtkrt }n| jtkstt }|t| jt| jt | d S )N)r   r7   r
   rC   verifyr   r   r   r	   r;   rg   rV   
asym_utilsZencode_dss_signature_get_ec_hash_algrH   ECDSAr   r=   r   r   r>   r   SHA1_SSH_RSA_SHA256SHA256_SSH_RSA_SHA512SHA512r   PKCS1v15)ro   r   rrL   sZcomputed_sighash_algr!   r!   r"   verify_cert_signature  s0    




z$SSHCertificate.verify_cert_signatureN)r/   r0   r1   rp   propertyr   r:   r   r   r   r   r   r   r   r   r   r   r  r!   r!   r!   r"   r   "  s   .)r   zec.EllipticCurvezhashes.HashAlgorithm)rH   r    c             C  sD   t | tjrt S t | tjr(t S t | tjs8tt	 S d S )N)
r7   r	   	SECP256R1r   r   	SECP384R1SHA384	SECP521R1r   r  )rH   r!   r!   r"   r     s    r   z"SSHCertificate | SSHPublicKeyTypesc       "      C  s  t d|  t| }|s"td|d }}|d}d}|tr^d}|d tt  }|t	krr|srt
dt|}ytt|}W n" ttjfk
r   tdY nX |r|}	t|\}
}|
|krtd	|rt|\}}||\}}|rtt|\}}t|\}}t|\}}t|\}}g }x&|rRt|\}}|t| q.W t|\}}t|\}}t|\}}t|}t|\}}t|}t|\}}t|\}}t|\}}|t	kr|st
d
|	d t|  }t|\}}t| t|\}} |tkr|tttgks0|tkr8||kr8tdt| \}!} t|  t||||||||||||||!|||	S t| |S d S )NrL   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matchrE   groupendswith_CERT_SUFFIXrT   rA   r   r   r[   r   r   	TypeErrorErrorrd   r   rb   r`   rq   r   _parse_exts_optsrV   r>   r   r  r   )"rL   _legacy_dsa_allowedr   rF   Zorig_key_typeZkey_bodyZ	with_certr   restZ	cert_bodyZinner_key_typer   r:   r   Zcctyper   Z
principalsr   Z	principalr   r   Zcrit_optionsr   extsr   r   Zsig_key_rawZsig_typeZsig_keyZtbs_cert_bodyZsignature_rawZinner_sig_typeZsig_rest	signaturer!   r!   r"   _load_ssh_public_identity  s    



r  c             C  s   t | S )N)r  )rL   r!   r!   r"   load_ssh_public_identity  s    r  zdict[bytes, bytes])	exts_optsr    c             C  s   i }d }x| rt | \}} t|}||kr2td|d k	rJ||k rJtdt | \}} t|dkrt |\}}t|dkrtdt|||< |}q
W |S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)rd   r   rE   rT   )r  result	last_namerI   Zbnamevalueextrar!   r!   r"   r    s"    r  r   )rL   r   r    c             C  sF   t | dd}t|tr | }n|}t|tjrBtjdtj	dd |S )NT)r  zDSSH DSA keys are deprecated and will be removed in a future release.r   )r   )
r  r7   r   r:   r   r@   r   r   r   r   )rL   r   Zcert_or_keyr:   r!   r!   r"   load_ssh_public_key&  s    

r   c             C  sl   t | tjrtjdtjdd t| }t|}t	 }|
| || | t|  }d|d|gS )z&One-line public key format for OpenSSHzISSH DSA key support is deprecated and will be removed in a future releaser\   )r   rO   r   )r7   r   r@   r   r   r   r   rG   r   rk   ry   r   r   r   r   striprP   )r:   rF   r   r   Zpubr!   r!   r"   serialize_ssh_public_key:  s    
r"     c               @  s   e Zd Zddddg dddg g f
ddddddddd	d	d

ddZdd dddZdd dddZdd dddZdd dddZdd dddZd d! Z	d"d d#d$d%Z
d"d d&d'd(Zddd d)d*d+Zddd d)d,d-Zd.d/d0d1d2ZdS )3SSHCertificateBuilderNFzSSHCertPublicKeyTypes | Nonez
int | NonezSSHCertificateType | Nonezbytes | Nonezlist[bytes]r   zlist[tuple[bytes, bytes]])
r   r   r   r   r   _valid_for_all_principalsr   r   r   r   c             C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S )N)
r   r   r   r   r   r%  r   r   r   r   )ro   r   r   r   r   r   r%  r   r   r   r   r!   r!   r"   rp   [  s    zSSHCertificateBuilder.__init__r   )r:   r    c             C  s^   t |tjtjtjfstd| jd k	r0t	dt
|| j| j| j| j| j| j| j| j| jd
S )NzUnsupported key typezpublic_key already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r	   r;   r   r=   r
   rC   r  r   rE   r$  r   r   r   r   r%  r   r   r   r   )ro   r:   r!   r!   r"   r:   s  s&    

z SSHCertificateBuilder.public_keyr   )r   r    c             C  sp   t |tstdd|  kr&dk s0n td| jd k	rBtdt| j|| j| j| j	| j
| j| j| j| jd
S )Nzserial must be an integerr   l            z"serial must be between 0 and 2**64zserial already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r  rE   r   r$  r   r   r   r   r%  r   r   r   r   )ro   r   r!   r!   r"   r     s"    

zSSHCertificateBuilder.serialr   )r   r    c             C  sR   t |tstd| jd k	r$tdt| j| j|| j| j	| j
| j| j| j| jd
S )Nz"type must be an SSHCertificateTypeztype already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r  r   rE   r$  r   r   r   r   r%  r   r   r   r   )ro   r   r!   r!   r"   r     s    

zSSHCertificateBuilder.typer   )r   r    c             C  sR   t |tstd| jd k	r$tdt| j| j| j|| j	| j
| j| j| j| jd
S )Nzkey_id must be byteszkey_id already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r  r   rE   r$  r   r   r   r   r%  r   r   r   r   )ro   r   r!   r!   r"   r     s    

zSSHCertificateBuilder.key_id)r   r    c             C  s|   | j rtdtdd |D r$|s,td| jr:tdt|tkrNtdt| j| j	| j
| j|| j | j| j| j| jd
S )NzDPrincipals can't be set because the cert is valid for all principalsc             s  s   | ]}t |tV  qd S )N)r7   r   ).0r   r!   r!   r"   	<genexpr>  s    z9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>z5principals must be a list of bytes and can't be emptyzvalid_principals already setz:Reached or exceeded the maximum number of valid_principals)
r   r   r   r   r   r%  r   r   r   r   )r%  rE   allr  r   rT   _SSHKEY_CERT_MAX_PRINCIPALSr$  r   r   r   r   r   r   r   r   )ro   r   r!   r!   r"   r     s.    z&SSHCertificateBuilder.valid_principalsc             C  sJ   | j rtd| jrtdt| j| j| j| j| j d| j| j	| j
| jd
S )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setT)
r   r   r   r   r   r%  r   r   r   r   )r   rE   r%  r$  r   r   r   r   r   r   r   r   )ro   r!   r!   r"   valid_for_all_principals  s     z.SSHCertificateBuilder.valid_for_all_principalszint | float)r   r    c             C  sv   t |ttfstdt|}|dk s.|dkr6td| jd k	rHtdt| j| j| j	| j
| j| j|| j| j| jd
S )Nz$valid_before must be an int or floatr   l            zvalid_before must [0, 2**64)zvalid_before already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r   floatr  rE   r   r$  r   r   r   r   r   r%  r   r   r   )ro   r   r!   r!   r"   r     s$    
z"SSHCertificateBuilder.valid_before)r   r    c             C  sv   t |ttfstdt|}|dk s.|dkr6td| jd k	rHtdt| j| j| j	| j
| j| j| j|| j| jd
S )Nz#valid_after must be an int or floatr   l            zvalid_after must [0, 2**64)zvalid_after already set)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r+  r  rE   r   r$  r   r   r   r   r   r%  r   r   r   )ro   r   r!   r!   r"   r     s$    
z!SSHCertificateBuilder.valid_after)rI   r  r    c             C  sr   t |trt |tstd|dd | jD kr8tdt| j| j| j| j	| j
| j| j| j| j||ff| jd
S )Nzname and value must be bytesc             S  s   g | ]\}}|qS r!   r!   )r&  rI   r   r!   r!   r"   
<listcomp>6  s    z=SSHCertificateBuilder.add_critical_option.<locals>.<listcomp>zDuplicate critical option name)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r  r   rE   r$  r   r   r   r   r   r%  r   r   r   )ro   rI   r  r!   r!   r"   add_critical_option0  s    z)SSHCertificateBuilder.add_critical_optionc             C  sr   t |trt |tstd|dd | jD kr8tdt| j| j| j| j	| j
| j| j| j| j| j||ffd
S )Nzname and value must be bytesc             S  s   g | ]\}}|qS r!   r!   )r&  rI   r   r!   r!   r"   r,  L  s    z7SSHCertificateBuilder.add_extension.<locals>.<listcomp>zDuplicate extension name)
r   r   r   r   r   r%  r   r   r   r   )r7   r   r  r   rE   r$  r   r   r   r   r   r%  r   r   r   )ro   rI   r  r!   r!   r"   add_extensionF  s    z#SSHCertificateBuilder.add_extensionSSHCertPrivateKeyTypesr   )r   r    c          	   C  s  t |tjtjtjfstd| jd kr0t	d| j
d kr>dn| j
}| jd krVt	d| jd krddn| j}| js~| js~t	d| jd krt	d| jd krt	d| j| jkrt	d	| jjd
d d | jjdd d t| j}|t }td}t|}t }|| || || j| || || jj || t }	x| jD ]}
|	|
 qVW ||	  || j || j t }xV| jD ]L\}}|| t |dkrt }|| ||  n
|| qW ||  t }xV| jD ]L\}}|| t |dkrJt }|| ||  n
|| q
W ||  |d t|}t|}t }|| ||! | ||  t |tjr|"| }t }|| || ||  nt |tjrzt#|j$}|"| t%|}t&'|\}}t }|| t }|(| |(| ||  ||  nTt |tjst)t }|t* |"| t+, t-. }|| ||  t/0| 1 }t23t4t5d6|d|gS )NzUnsupported private key typezpublic_key must be setr   ztype must be setrO   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             S  s   | d S )Nr   r!   )r   r!   r!   r"   <lambda>  rO   z,SSHCertificateBuilder.sign.<locals>.<lambda>)r6   c             S  s   | d S )Nr   r!   )r   r!   r!   r"   r0    rO   r3   r   )7r7   r	   r8   r   r<   r
   rB   r  r   rE   r   r   r   r   r%  r   r   r   sortr   rG   r  r   r   r   rk   ry   r   rv   ru   r  r   rT   r:   signr   rH   r   r   Zdecode_dss_signaturerz   r   r  r   r  r   r  r   r   r!  r   r   r   r  rP   )ro   r   r   r   rF   Zcert_prefixr   r   fZfprincipalsr   ZfcritrI   r  ZfoptvalZfextZfextvalZca_typeZcaformatZcafr  Zfsigr  r  r  ZfsigblobZ	cert_datar!   r!   r"   r2  \  s    
























zSSHCertificateBuilder.sign)r/   r0   r1   rp   r:   r   r   r   r   r*  r   r   r-  r.  r2  r!   r!   r!   r"   r$  Z  s*   $$r$  )F)N)F)N)z
__future__r   r   enumr   rer   r   base64r   rQ   dataclassesr   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r	   r
   r   r   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Zbcryptr   r#   Z_bcrypt_supportedImportErrorrD   r>   rA   Z_ECDSA_NISTP256Z_ECDSA_NISTP384Z_ECDSA_NISTP521r  r   r  compiler  r   Z	_SK_STARTZ_SK_ENDr   r   r   r   DOTALLr   r[   rw   ranger   r'   ZAESZCTRZCBCZGCMr5   r2   rJ   rG   r9   rR   rU   rV   rZ   r`   rb   rd   rg   rj   rk   r   r   r   r   r	  r
  r  r   r   Unionr8   r<   r?   rB   r   r   r   r;   r=   r@   rC   r   r   Enumr   r   r   r  r  r  r   r"  r/  r)  r$  r!   r!   r!   r"   <module>   s     	 

6FFEB	
eM

 ]
