<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
l_T                 @   s  d dl mZmZ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	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 yd d	lmZ d
Z W n  e!k
r   dZ dd ZY nX yd dl"m#Z$ W n" e!k
r   d dl"m%Z$ Y nX dZ&dZ'dZ(dZ)dZ*dZ+dZ,ej-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6ej-e0d  e1 ej7Z8e9e:e;d!dSZ<ej=d"ej>dfej=d"ej?dfd#Z@e)e*e+d$ZAejBd%ZCejBd&ZDd'd( ZEe0d) e1d) fd*d+ZFd,d- ZGd.d/ ZHd0d1 ZId2d3 ZJd4d5 ZKd6d7 ZLd8d9 ZMd:d; ZNG d<d= d=eOZPG d>d? d?eOZQG d@dA dAeOZRG dBdC dCeOZSG dDdE dEeOZTe'eQ e(eR e&eT e)eSdFejU e*eSdGejV e+eSdHejW iZXdIdJ ZYdTdKdLZZdUdMdNZ[dVdOdPZ\dQdR Z]dS )W    )absolute_importdivisionprint_functionN)utils)UnsupportedAlgorithm)_get_backend)dsaeced25519rsa)Cipher
algorithmsmodes)EncodingNoEncryptionPrivateFormatPublicFormat)kdfTFc              O   s   t dd S )NzNeed bcrypt module)r   )argskwargs r   /usr/lib64/python3.6/ssh.py_bcrypt_kdf!   s    r   )encodebytes)encodestrings   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   nones
   aes256-ctr   H   s   (.*?)       )s
   aes256-ctrs
   aes256-cbc)Z	secp256r1Z	secp384r1Z	secp521r1s   >Is   >Qc             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: %r)curvename_ECDSA_KEY_TYPE
ValueError)
public_keyr   r   r   r   _ecdsa_key_typeS   s
    
r$      
c             C   s   dj |t| |gS )N    )join_base64_encode)dataprefixsuffixr   r   r   _ssh_pem_encode]   s    r,   c             C   s"   |  st | | dkrtddS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenr"   )r)   Z	block_lenr   r   r   _check_block_sizea   s    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_emptyg   s    r/   c       
      C   sT   |st dt|  \}}}}t|||| |d}	t||	d| ||	|d |S )z$Generate key + iv and return cipher.zKey is password-protected.TN)r"   _SSH_CIPHERSr   r   )

ciphernamepasswordsaltroundsbackendZalgoZkey_lenmodeZiv_lenZseedr   r   r   _init_cipherm   s
    r7   c             C   s6   t | dk rtdtj| dd d | dd fS )ZUint32   zInvalid dataNr   )r-   r"   _U32unpack)r)   r   r   r   _get_u32w   s    r;   c             C   s6   t | dk rtdtj| dd d | dd fS )ZUint64   zInvalid dataNr   )r-   r"   _U64r:   )r)   r   r   r   _get_u64~   s    r>   c             C   s8   t | \}} |t| kr td| d| | |d fS )zBytes with u32 length prefixzInvalid dataN)r;   r-   r"   )r)   nr   r   r   _get_sshstr   s    r@   c             C   s8   t | \}} |r(tj|ddkr(tdtj|d| fS )zBig integer.r      zInvalid dataZbig)r@   six
indexbytesr"   r   Zint_from_bytes)r)   valr   r   r   
_get_mpint   s    rE   c             C   s4   | dk rt d| sdS | j d d }tj| |S )z!Storage format for signed bigint.r   znegative mpint not allowedr&   r<   )r"   
bit_lengthr   Zint_to_bytes)rD   nbytesr   r   r   	_to_mpint   s    rH   c               @   sT   e Zd ZdZd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dS )	_FragListz,Build recursive structure without data copy.Nc             C   s   g | _ |r| j j| d S )N)flistextend)selfZinitr   r   r   __init__   s    z_FragList.__init__c             C   s   | j j| dS )zAdd plain bytesN)rJ   append)rL   rD   r   r   r   put_raw   s    z_FragList.put_rawc             C   s   | j jtj| dS )zBig-endian uint32N)rJ   rN   r9   pack)rL   rD   r   r   r   put_u32   s    z_FragList.put_u32c             C   sL   t |tttfr,| jt| | jj| n| j|j  | jj	|j dS )zBytes prefixed with u32 lengthN)

isinstancebytes
memoryview	bytearrayrQ   r-   rJ   rN   sizerK   )rL   rD   r   r   r   
put_sshstr   s
    z_FragList.put_sshstrc             C   s   | j t| dS )z*Big-endian bigint prefixed with u32 lengthN)rW   rH   )rL   rD   r   r   r   	put_mpint   s    z_FragList.put_mpintc             C   s   t tt| jS )zCurrent number of bytes)summapr-   rJ   )rL   r   r   r   rV      s    z_FragList.sizer   c             C   s6   x0| j D ]&}t|}|||  }}||||< qW |S )zWrite into bytearray)rJ   r-   )rL   ZdstbufposZfragZflenstartr   r   r   render   s
    z_FragList.renderc             C   s"   t t| j }| j| |j S )zReturn as bytes)rT   rU   rV   r]   tobytes)rL   bufr   r   r   r^      s    
z_FragList.tobytes)N)r   )__name__
__module____qualname____doc__rM   rO   rQ   rW   rX   rV   r]   r^   r   r   r   r   rI      s   
	
rI   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    c             C   s$   t |\}}t |\}}||f|fS )zRSA public fields)rE   )rL   r)   er?   r   r   r   
get_public   s    z_SSHFormatRSA.get_publicc             C   s0   | j |\\}}}tj||}|j|}||fS )zMake RSA public key from data.)rf   r   RSAPublicNumbersr#   )rL   key_typer)   r5   re   r?   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j||}
tj||	}tj||}tj||	||
|||}|j|}||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch)rE   r"   r   Zrsa_crt_dmp1Zrsa_crt_dmq1rg   ZRSAPrivateNumbersprivate_key)rL   r)   	pubfieldsr5   r?   re   diqmppqZdmp1Zdmq1ri   private_numbersrk   r   r   r   load_private   s    
z_SSHFormatRSA.load_privatec             C   s$   |j  }|j|j |j|j dS )zWrite RSA public keyN)ri   rX   re   r?   )rL   r#   f_pubZpubnr   r   r   encode_public   s    z_SSHFormatRSA.encode_publicc             C   sZ   |j  }|j}|j|j |j|j |j|j |j|j |j|j |j|j dS )zWrite RSA private keyN)	rq   ri   rX   r?   re   rm   rn   ro   rp   )rL   rk   f_privrq   ri   r   r   r   encode_private   s    z_SSHFormatRSA.encode_privateN)	r`   ra   rb   rc   rf   rj   rr   rt   rv   r   r   r   r   rd      s   rd   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    c             C   s@   t |\}}t |\}}t |\}}t |\}}||||f|fS )zDSA public fields)rE   )rL   r)   ro   rp   gyr   r   r   rf     s
    z_SSHFormatDSA.get_publicc             C   sL   | j |\\}}}}}tj|||}tj||}	| j|	 |	j|}
|
|fS )zMake DSA public key from data.)rf   r   DSAParameterNumbersDSAPublicNumbers	_validater#   )rL   rh   r)   r5   ro   rp   rx   ry   parameter_numbersri   r#   r   r   r   rj     s    

z_SSHFormatDSA.load_publicc             C   s|   | j |\\}}}}}t|\}}||||f|k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)	rf   rE   r"   r   rz   r{   r|   ZDSAPrivateNumbersrk   )rL   r)   rl   r5   ro   rp   rx   ry   xr}   ri   rq   rk   r   r   r   rr   '  s    

z_SSHFormatDSA.load_privatec             C   sL   |j  }|j}| j| |j|j |j|j |j|j |j|j dS )zWrite DSA public keyN)ri   r}   r|   rX   ro   rp   rx   ry   )rL   r#   rs   ri   r}   r   r   r   rt   5  s    
z_SSHFormatDSA.encode_publicc             C   s$   | j |j | |j|j j dS )zWrite DSA private keyN)rt   r#   rX   rq   r~   )rL   rk   ru   r   r   r   rv   @  s    z_SSHFormatDSA.encode_privatec             C   s    |j }|jj dkrtdd S )Ni   z#SSH supports only 1024 bit DSA keys)r}   ro   rF   r"   )rL   ri   r}   r   r   r   r|   E  s    z_SSHFormatDSA._validateN)
r`   ra   rb   rc   rf   rj   rr   rt   rv   r|   r   r   r   r   rw     s   	rw   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )_SSHFormatECDSAzFormat for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    c             C   s   || _ || _d S )N)ssh_curve_namer   )rL   r   r   r   r   r   rM   W  s    z_SSHFormatECDSA.__init__c             C   sN   t |\}}t |\}}|| jkr*tdtj|ddkrBtd||f|fS )zECDSA public fieldszCurve name mismatchr   r8   zNeed uncompressed point)r@   r   r"   rB   rC   NotImplementedError)rL   r)   r   pointr   r   r   rf   [  s    
z_SSHFormatECDSA.get_publicc             C   s.   | j |\\}}}tjj| j|j }||fS )z Make ECDSA public key from data.)rf   r	   EllipticCurvePublicKeyZfrom_encoded_pointr   r^   )rL   rh   r)   r5   
curve_namer   r#   r   r   r   rj   e  s    z_SSHFormatECDSA.load_publicc             C   sJ   | j |\\}}}t|\}}||f|kr2tdtj|| j|}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)rf   rE   r"   r	   Zderive_private_keyr   )rL   r)   rl   r5   r   r   secretrk   r   r   r   rr   m  s    z_SSHFormatECDSA.load_privatec             C   s*   |j tjtj}|j| j |j| dS )zWrite ECDSA public keyN)public_bytesr   ZX962r   ZUncompressedPointrW   r   )rL   r#   rs   r   r   r   r   rt   w  s    z_SSHFormatECDSA.encode_publicc             C   s,   |j  }|j }| j|| |j|j dS )zWrite ECDSA private keyN)r#   rq   rt   rX   Zprivate_value)rL   rk   ru   r#   rq   r   r   r   rv     s    z_SSHFormatECDSA.encode_privateN)
r`   ra   rb   rc   rM   rf   rj   rr   rt   rv   r   r   r   r   r   K  s   


r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    c             C   s   t |\}}|f|fS )zEd25519 public fields)r@   )rL   r)   r   r   r   r   rf     s    z_SSHFormatEd25519.get_publicc             C   s(   | j |\\}}tjj|j }||fS )z"Make Ed25519 public key from data.)rf   r
   Ed25519PublicKeyZfrom_public_bytesr^   )rL   rh   r)   r5   r   r#   r   r   r   rj     s    
z_SSHFormatEd25519.load_publicc       	      C   sb   | j |\\}}t|\}}|dd }|dd }||ksF|f|krNtdtjj|}||fS )z#Make Ed25519 private key from data.Nr   z$Corrupt data: ed25519 field mismatch)rf   r@   r"   r
   Ed25519PrivateKeyZfrom_private_bytes)	rL   r)   rl   r5   r   Zkeypairr   Zpoint2rk   r   r   r   rr     s    z_SSHFormatEd25519.load_privatec             C   s   |j tjtj}|j| dS )zWrite Ed25519 public keyN)r   r   Rawr   rW   )rL   r#   rs   raw_public_keyr   r   r   rt     s    z_SSHFormatEd25519.encode_publicc             C   sR   |j  }|jtjtjt }|jtjtj}t||g}| j	|| |j
| dS )zWrite Ed25519 private keyN)r#   Zprivate_bytesr   r   r   r   r   r   rI   rt   rW   )rL   rk   ru   r#   Zraw_private_keyr   Z	f_keypairr   r   r   rv     s    z _SSHFormatEd25519.encode_privateN)	r`   ra   rb   rc   rf   rj   rr   rt   rv   r   r   r   r   r     s   r   s   nistp256s   nistp384s   nistp521c             C   s6   t | tst| j } | tkr&t|  S td|  dS )z"Return valid format or throw errorzUnsupported key type: %rN)rR   rS   rT   r^   _KEY_FORMATSr   )rh   r   r   r   _lookup_kformat  s
    
r   c             C   sR  t jd|  t|}|dk	r(t jd| tj| }|s>td|jd}|jd}t	j
t| || } | jtsztdt| ttd } t| \}} t| \}} t| \}} t| \}	} |	dkrtdt| \}
} t|
\}}
t|}|j|
\}}
t|
 t| \}} t|  ||fttfkr|j }|tkrHtd| |tkr^td| t| d	 }t|| t|\}}t|\}}t| t|||j ||}t|j j|}nd
}t|| t|\}}t|\}}||krtdt|\}}||krtd|j|||\}}t|\}}|tdt| krNtd|S )z.Load private key from OpenSSH custom encoding.r)   Nr2   zNot OpenSSH private key formatr   zOnly one key supportedzUnsupported cipher: %rzUnsupported KDF: %r   r<   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid padding)r   _check_bytesliker   _check_bytes_PEM_RCsearchr"   r\   endbinascii
a2b_base64rT   
startswith	_SK_MAGICr-   r@   r;   r   rf   r/   _NONEr^   r0   r   _BCRYPTr.   r7   Z	decryptorupdaterr   _PADDING)r)   r2   r5   mZp1Zp2r1   kdfnameZ
kdfoptionsnkeysZpubdataZpub_key_typekformatrl   Zedatablklenr3   Zkbufr4   ciphZck1Zck2rh   rk   commentr   r   r   load_ssh_private_key  sl    









r   c             C   s>  |dk	rt jd| |r,t|tkr,tdt| tjrFt| j	 }n>t| t
jrXt}n,t| tjrjt}nt| tjr|t}ntdt|}t }|rt}t| d }t}t}tjd}	|j|	 |j| td}
t|||	||
}nt }}d}d}d}tjd	}d
}t }|j| |j | j	 | t||g}|j| |j!| | |j| |j"t#d||j$ |    t }|j"t% |j| |j| |j| |j| |j| |j| |j$ }|j$ }t&t'|| }|j(| || }|dk	r|j) j*||| ||d  t+|d| }t'||||< |S )z3Serialize private key with OpenSSH custom encoding.Nr2   zNPasswords longer than 72 bytes are not supported by OpenSSH private key formatzUnsupported key typer   r   r<   r   r8   r&   ),r   r   r-   _MAX_PASSWORDr"   rR   r	   ZEllipticCurvePrivateKeyr$   r#   r   ZRSAPrivateKey_SSH_RSAr   ZDSAPrivateKey_SSH_DSAr
   r   _SSH_ED25519r   rI   _DEFAULT_CIPHERr0   r   _DEFAULT_ROUNDSosurandomrW   rQ   r   r7   r   rt   rv   rO   r   rV   r   rT   rU   r]   Z	encryptorZupdate_intor,   )rk   r2   rh   r   Zf_kdfoptionsr1   r   r   r4   r3   r5   r   r   Zcheckvalr   Zf_public_keyZ	f_secretsZf_mainZslenZmlenr_   ZofsZtxtr   r   r   serialize_ssh_private_key  st    















 r   c             C   s  t |}tjd|  tj| }|s*td|jd }}|jd}d}t|tt d krrd}|dtt  }t	|}yt
tj|} W n" ttjfk
r   tdY nX t| \}} ||krtd|rt| \}	} |j|| |\}
} |rxt| \}} 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   r   _SSH_PUBKEY_RCmatchr"   group_CERT_SUFFIXr-   r   rT   r   r   	TypeErrorErrorr@   rj   r>   r;   r/   )r)   r5   r   rh   Zorig_key_typeZkey_bodyZ	with_certr   Zinner_key_typeZnoncer#   serialZcctypeZkey_idZ
principalsZvalid_afterZvalid_beforeZcrit_options
extensionsZreservedZsig_keyZ	signaturer   r   r   load_ssh_public_keym  sH    

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 }|j| |j| | tj|j j }dj|d|gS )z&One-line public key format for OpenSSHzUnsupported key typer&       )rR   r	   r   r$   r   ZRSAPublicKeyr   r   ZDSAPublicKeyr   r
   r   r   r"   r   rI   rW   rt   r   Z
b2a_base64r^   stripr'   )r#   rh   r   rs   Zpubr   r   r   serialize_ssh_public_key  s    

r      )N)N)N)^Z
__future__r   r   r   r   r   restructrB   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Z)cryptography.hazmat.primitives.asymmetricr   r	   r
   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   Zbcryptr   r   Z_bcrypt_supportedImportErrorbase64r   r(   r   r   r   r   Z_ECDSA_NISTP256Z_ECDSA_NISTP384Z_ECDSA_NISTP521r   compiler   r   Z	_SK_STARTZ_SK_ENDr   r   r   r   r   DOTALLr   rT   rU   ranger   ZAESZCTRZCBCr0   r!   Structr9   r=   r$   r,   r.   r/   r7   r;   r>   r@   rE   rH   objectrI   rd   rw   r   r   Z	SECP256R1Z	SECP384R1Z	SECP521R1r   r   r   r   r   r   r   r   r   r   <module>   s   





0>>=:	
J
O
+