U
    cc]                     @   s  U 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mZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZ zd dlmZ d	ZW n2 ek
r   d
ZdZe e e!e!e"e dddZY nX dZ#dZ$dZ%dZ&dZ'dZ(dZ)e*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2e*e-d e. ej3Z4e5e6e7ddZ8ej9d ej:dfej9d ej;dfd!Z<ej=e ej>ej?ej9 e!ej@ej?ej: ej?ej; f e!f f eAd"< e&e'e(d#ZBejCe d$d%d&ZDe-d' e.d' fe e e e d(d)d*ZEe e!dd+d,d-ZFe dd.d/d0ZGe ejHe  e e!eej@ej;ej:f  d1d2d3ZIe5ej>e!e5f d.d4d5ZJe5ej>e!e5f d.d6d7ZKe5ej>e5e5f d.d8d9ZLe5ej>e!e5f d.d:d;ZMe!e d<d=d>ZNG d?d@ d@ZOG dAdB dBZPG dCdD dDZQG dEdF dFZRG dGdH dHZSe$eP e%eQ e#eS e&eRdIeT e'eRdJeU e(eRdKeV iZWe dLdMdNZXej@ejYejZej[ej\f Z]d[e ejHe  ej^e]dOdPdQZ_e]e ee dRdSdTZ`ej@ejCejaejbejcf Zdd\e ej^eddUdVdWZeede d$dXdYZfdS )]    N)encodebytes)utilsUnsupportedAlgorithm)dsaeced25519rsa)Cipher
algorithmsmodes)EncodingKeySerializationEncryptionNoEncryptionPrivateFormatPublicFormat_KeySerializationEncryption)kdfTF)passwordsaltdesired_key_bytesroundsignore_few_roundsreturnc                 C   s   t dd S )NzNeed bcrypt moduler   )r   r   r   r   r    r   j/var/www/html/project/venv/lib/python3.8/site-packages/cryptography/hazmat/primitives/serialization/ssh.py_bcrypt_kdf    s    r   s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   none
   aes256-ctr   s   (.*?)          )r   s
   aes256-cbc_SSH_CIPHERS)Z	secp256r1Z	secp384r1Z	secp521r1)
public_keyr   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_TYPE
ValueError)r#   r$   r   r   r   _ecdsa_key_typeW   s    

r(      
)dataprefixsuffixr   c                 C   s   d |t| |gS )N    )join_base64_encode)r*   r+   r,   r   r   r   _ssh_pem_encodea   s    r0   )r*   	block_lenr   c                 C   s    | rt | | dkrtddS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenr'   )r*   r1   r   r   r   _check_block_sizei   s    r3   r*   r   c                 C   s   | rt ddS )z!All data should have been parsed.zCorrupt data: unparsed dataN)r'   r*   r   r   r   _check_emptyo   s    r6   )
ciphernamer   r   r   r   c           	      C   sR   |st dt|  \}}}}t|||| |d}t||d| |||d S )z$Generate key + iv and return cipher.zKey is password-protected.TN)r'   r"   r   r
   )	r7   r   r   r   algoZkey_lenmodeZiv_lenseedr   r   r   _init_cipheru   s
    r;   c                 C   s6   t | dk rtdtj| dd dd| dd fS )ZUint32   Invalid dataNbig	byteorderr2   r'   int
from_bytesr5   r   r   r   _get_u32   s    rD   c                 C   s6   t | dk rtdtj| dd dd| dd fS )ZUint64   r=   Nr>   r?   rA   r5   r   r   r   _get_u64   s    rF   c                 C   s8   t | \}} |t| kr td| d| | |d fS )zBytes with u32 length prefixr=   N)rD   r2   r'   )r*   nr   r   r   _get_sshstr   s    rH   c                 C   s4   t | \}} |r$|d dkr$tdt|d| fS )zBig integer.r      r=   r>   )rH   r'   rB   rC   )r*   valr   r   r   
_get_mpint   s    rK   rJ   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 allowedr-   rE   )r'   
bit_lengthr   Zint_to_bytes)rJ   nbytesr   r   r   	_to_mpint   s    rO   c                   @   s   e Zd ZU dZeje ed< deje ddddZedddd	Z	e
ddd
dZejed f ddddZe
ddddZe
dddZdee
e
dddZedddZdS )	_FragListz,Build recursive structure without data copy.flistN)initr   c                 C   s   g | _ |r| j | d S N)rQ   extend)selfrR   r   r   r   __init__   s    z_FragList.__init__rL   c                 C   s   | j | dS )zAdd plain bytesN)rQ   appendrU   rJ   r   r   r   put_raw   s    z_FragList.put_rawc                 C   s   | j |jddd dS )zBig-endian uint32r<   r>   )lengthr@   N)rQ   rW   to_bytesrX   r   r   r   put_u32   s    z_FragList.put_u32c                 C   sL   t |tttfr,| t| | j| n| |  | j	|j dS )zBytes prefixed with u32 lengthN)

isinstancebytes
memoryview	bytearrayr\   r2   rQ   rW   sizerT   rX   r   r   r   
put_sshstr   s
    z_FragList.put_sshstrc                 C   s   |  t| dS )z*Big-endian bigint prefixed with u32 lengthN)rb   rO   rX   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mapr2   rQ   )rU   r   r   r   ra      s    z_FragList.sizer   )dstbufposr   c                 C   s2   | j D ]&}t|}|||  }}||||< q|S )zWrite into bytearray)rQ   r2   )rU   rf   rg   fragZflenstartr   r   r   render   s
    
z_FragList.renderc                 C   s"   t t|  }| | | S )zReturn as bytes)r_   r`   ra   rj   tobytes)rU   bufr   r   r   rk      s    
z_FragList.tobytes)N)r   )__name__
__module____qualname____doc__typingListr^   __annotations__rV   rY   rB   r\   Unionrb   rc   ra   r_   rj   rk   r   r   r   r   rP      s   
	rP   c                   @   s~   e Zd ZdZedddZeejej	ef dddZ
eejejef ddd	Zej	ed
dddZejed
dddZd
S )_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    r5   c                 C   s$   t |\}}t |\}}||f|fS )zRSA public fieldsrK   )rU   r*   erG   r   r   r   
get_public   s    z_SSHFormatRSA.get_publicr4   c                 C   s.   |  |\\}}}t||}| }||fS )zMake RSA public key from data.)rx   r	   RSAPublicNumbersr#   )rU   r*   rw   rG   public_numbersr#   r   r   r   load_public   s    z_SSHFormatRSA.load_publicc              	   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)rK   r'   r	   Zrsa_crt_dmp1Zrsa_crt_dmq1ry   ZRSAPrivateNumbersprivate_key)rU   r*   	pubfieldsrG   rw   diqmppqZdmp1Zdmq1rz   private_numbersr|   r   r   r   load_private   s,          z_SSHFormatRSA.load_privateNr#   f_pubr   c                 C   s$   |  }||j ||j dS )zWrite RSA public keyN)rz   rc   rw   rG   )rU   r#   r   Zpubnr   r   r   encode_public  s    z_SSHFormatRSA.encode_publicr|   f_privr   c                 C   sZ   |  }|j}||j ||j ||j ||j ||j ||j dS )zWrite RSA private keyN)	r   rz   rc   rG   rw   r~   r   r   r   )rU   r|   r   r   rz   r   r   r   encode_private  s    z_SSHFormatRSA.encode_private)rm   rn   ro   rp   r_   rx   rq   Tupler	   RSAPublicKeyr{   RSAPrivateKeyr   rP   r   r   r   r   r   r   ru      s    
 	 ru   c                   @   s   e Zd ZdZeejejef dddZeejej	ef dddZ
eejejef dddZej	ed	d
ddZejed	dddZejd	dddZd	S )_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    r4   c                 C   s@   t |\}}t |\}}t |\}}t |\}}||||f|fS )zDSA public fieldsrv   )rU   r*   r   r   gyr   r   r   rx   -  s
    z_SSHFormatDSA.get_publicc           	      C   sJ   |  |\\}}}}}t|||}t||}| | | }||fS )zMake DSA public key from data.)rx   r   DSAParameterNumbersDSAPublicNumbers	_validater#   )	rU   r*   r   r   r   r   parameter_numbersrz   r#   r   r   r   r{   7  s    
z_SSHFormatDSA.load_publicc                 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)	rx   rK   r'   r   r   r   r   ZDSAPrivateNumbersr|   )rU   r*   r}   r   r   r   r   xr   rz   r   r|   r   r   r   r   B  s    
z_SSHFormatDSA.load_privateNr   c                 C   sL   |  }|j}| | ||j ||j ||j ||j dS )zWrite DSA public keyN)rz   r   r   rc   r   r   r   r   )rU   r#   r   rz   r   r   r   r   r   R  s    
z_SSHFormatDSA.encode_publicr   c                 C   s$   |  | | || j dS )zWrite DSA private keyN)r   r#   rc   r   r   )rU   r|   r   r   r   r   r   _  s    z_SSHFormatDSA.encode_private)rz   r   c                 C   s    |j }|j dkrtdd S )Ni   z#SSH supports only 1024 bit DSA keys)r   r   rM   r'   )rU   rz   r   r   r   r   r   f  s    z_SSHFormatDSA._validate)rm   rn   ro   rp   r_   rq   r   rx   r   DSAPublicKeyr{   DSAPrivateKeyr   rP   r   r   r   r   r   r   r   r   r   $  s&   	  r   c                   @   s   e Zd ZdZeejdddZee	j
e	j
ef dddZee	j
ejef ddd	Zee	j
ejef dd
dZejeddddZejeddddZdS )_SSHFormatECDSAzFormat for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    ssh_curve_namer$   c                 C   s   || _ || _d S rS   r   )rU   r   r$   r   r   r   rV   x  s    z_SSHFormatECDSA.__init__r4   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)rH   r   r'   NotImplementedError)rU   r*   r$   pointr   r   r   rx   |  s    
z_SSHFormatECDSA.get_publicc                 C   s.   |  |\\}}}tj| j| }||fS )z Make ECDSA public key from data.)rx   r   EllipticCurvePublicKeyZfrom_encoded_pointr$   rk   )rU   r*   
curve_namer   r#   r   r   r   r{     s     z_SSHFormatECDSA.load_publicc                 C   sH   |  |\\}}}t|\}}||f|kr2tdt|| j}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)rx   rK   r'   r   Zderive_private_keyr$   )rU   r*   r}   r   r   secretr|   r   r   r   r     s    z_SSHFormatECDSA.load_privateNr   c                 C   s*   | tjtj}|| j || dS )zWrite ECDSA public keyN)public_bytesr   ZX962r   ZUncompressedPointrb   r   )rU   r#   r   r   r   r   r   r     s     z_SSHFormatECDSA.encode_publicr   c                 C   s,   |  }| }| || ||j dS )zWrite ECDSA private keyN)r#   r   r   rc   Zprivate_value)rU   r|   r   r#   r   r   r   r   r     s    z_SSHFormatECDSA.encode_private)rm   rn   ro   rp   r^   r   ZEllipticCurverV   r_   rq   r   rx   r   r{   EllipticCurvePrivateKeyr   rP   r   r   r   r   r   r   r   l  s&     r   c                   @   s   e Zd ZdZeejejef dddZeejej	ef dddZ
eejejef dddZej	ed	d
ddZejed	dddZd	S )_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    r4   c                 C   s   t |\}}|f|fS )zEd25519 public fields)rH   )rU   r*   r   r   r   r   rx     s    z_SSHFormatEd25519.get_publicc                 C   s(   |  |\\}}tj| }||fS )z"Make Ed25519 public key from data.)rx   r   Ed25519PublicKeyZfrom_public_bytesrk   )rU   r*   r   r#   r   r   r   r{     s
    z_SSHFormatEd25519.load_publicc                 C   sb   |  |\\}}t|\}}|dd }|dd }||ksF|f|krNtdtj|}||fS )z#Make Ed25519 private key from data.Nr!   z$Corrupt data: ed25519 field mismatch)rx   rH   r'   r   Ed25519PrivateKeyZfrom_private_bytes)rU   r*   r}   r   Zkeypairr   Zpoint2r|   r   r   r   r     s    z_SSHFormatEd25519.load_privateNr   c                 C   s   | tjtj}|| dS )zWrite Ed25519 public keyN)r   r   Rawr   rb   )rU   r#   r   raw_public_keyr   r   r   r     s
     z_SSHFormatEd25519.encode_publicr   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   rP   r   rb   )rU   r|   r   r#   Zraw_private_keyr   Z	f_keypairr   r   r   r     s       z _SSHFormatEd25519.encode_private)rm   rn   ro   rp   r_   rq   r   rx   r   r   r{   r   r   rP   r   r   r   r   r   r   r     s$   
 
 r   s   nistp256s   nistp384s   nistp521key_typec                 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)r]   r^   r_   rk   _KEY_FORMATSr   r   r   r   r   _lookup_kformat   s
    
r   )r*   r   backendr   c                 C   sJ  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|
 t| \}} t|  ||fttfkr| }|tkrBtd||tkrZtd|t| d	 }t|| t|\}}t|\}}t| t||| |}t
| |}nd
}t|| t|\}}t|\}}||krtdt|\}}||krtd|||\}}t|\}}|tdt| krFtd|S )z.Load private key from OpenSSH custom encoding.r*   Nr   zNot OpenSSH private key formatr   zOnly one key supportedzUnsupported cipher: zUnsupported KDF:    rE   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid padding)r   _check_byteslike_check_bytes_PEM_RCsearchr'   ri   endbinascii
a2b_base64r_   
startswith	_SK_MAGICr2   rH   rD   r   rx   r6   _NONErk   r"   r   _BCRYPTr3   r;   Z	decryptorupdater   _PADDING)r*   r   r   mp1p2r7   kdfnameZ
kdfoptionsnkeysZpubdataZpub_key_typekformatr}   ZedataZciphername_bytesblklenr   Zkbufr   ciphZck1Zck2r   r|   commentr   r   r   load_ssh_private_key  sl    









r   )r|   r   encryption_algorithmr   c                 C   s  t d| t| tjr&t|  }n>t| tjr8t	}n,t| t
jrJt}nt| tjr\t}ntdt|}t }|rt}t| d }t}t}	t|tr|jdk	r|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   Unsupported key typer   Nr   rE   r   r<   r-   )+r   r   r]   r   r   r(   r#   r	   r   _SSH_RSAr   r   _SSH_DSAr   r   _SSH_ED25519r'   r   rP   _DEFAULT_CIPHERr"   r   _DEFAULT_ROUNDSr   Z_kdf_roundsosurandomrb   r\   r;   r   r   r   rY   r   ra   r   r_   r`   rj   Z	encryptorZupdate_intor0   )r|   r   r   r   r   Zf_kdfoptionsr7   r   r   r   r   r   r   Zcheckvalr   Zf_public_keyZ	f_secretsZf_mainslenmlenrl   Zofsr   r   r   _serialize_ssh_private_key^  sp    















 r   )r*   r   r   c              	   C   sx  t d|  t| }|s"td|d }}|d}d}t|tt d krjd}|dtt  }t|}zt	t
|}W n" tt
jfk
r   tdY nX t|\}	}|	|krtd|rt|\}
}||\}}|rlt|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t|\}}t| |S )	z-Load public key from OpenSSH one-line format.r*   zInvalid line formatr      FNTzInvalid key format)r   r   _SSH_PUBKEY_RCmatchr'   group_CERT_SUFFIXr2   r   r_   r   r   	TypeErrorErrorrH   r{   rF   rD   r6   )r*   r   r   r   Zorig_key_typeZkey_bodyZ	with_certr   restZinner_key_typenoncer#   serialZcctypeZkey_idZ
principalsZvalid_afterZvalid_beforeZcrit_options
extensionsreservedZsig_key	signaturer   r   r   load_ssh_public_key  sF    

r   c                 C   s   t | tjrt| }n>t | tjr(t}n,t | tjr:t	}nt | t
jrLt}ntdt|}t }|| || | t|  }d|d|gS )z&One-line public key format for OpenSSHr   r-       )r]   r   r   r(   r	   r   r   r   r   r   r   r   r   r'   r   rP   rb   r   r   
b2a_base64rk   stripr.   )r#   r   r   r   Zpubr   r   r   serialize_ssh_public_key  s    

r   )F)N)N)gr   r   rerq   base64r   r/   Zcryptographyr   Zcryptography.exceptionsr   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r	   Z&cryptography.hazmat.primitives.ciphersr
   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Zbcryptr   r   Z_bcrypt_supportedImportErrorr^   rB   boolr   r   r   Z_ECDSA_NISTP256Z_ECDSA_NISTP384Z_ECDSA_NISTP521r   compiler   r   Z	_SK_STARTZ_SK_ENDr   r   r   r   DOTALLr   r_   r`   ranger   ZAESZCTRZCBCr"   Dictr   Typert   rs   r&   r   r(   r0   r3   r6   Optionalr;   rD   rF   rH   rK   rO   rP   ru   r   r   r   Z	SECP256R1Z	SECP384R1Z	SECP521R1r   r   r   r   r   r   Z_SSH_PRIVATE_KEY_TYPESAnyr   r   r   r   r   Z_SSH_PUBLIC_KEY_TYPESr   r   r   r   r   r   <module>   s
    	 



2FHGD      
	 NO	  ,