U
    ÈZj  ã                   @   sx   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
mZmZ dd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZdS )é    N)ÚAES)ÚSHA512)Ú_bcrypt_hash)Ústrxor)ÚtostrÚbchrÚbordc                 C   s<   t | ƒdk rtdƒ‚t d| d d… ¡d }|| dd … fS )Né   zInsufficient dataú>Ir   )ÚlenÚ
ValueErrorÚstructÚunpack)ÚdataÚvalue© r   ú\/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/PublicKey/_openssh.pyÚ	read_int4(   s    r   c                 C   s8   t | ƒ\}} t| ƒ|k r tdƒ‚| d |… | |d … fS )NzInsufficient data (V))r   r   r   )r   Úsizer   r   r   Ú
read_bytes/   s    r   c                 C   s   t | ƒ\}}t|ƒ|fS )N)r   r   )r   ÚsÚdr   r   r   Úread_string6   s    r   c                 C   s2   t | ƒD ]$\}}t|ƒ|d d@ krtdƒ‚qd S )Né   éÿ   zIncorrect padding)Ú	enumerater   r   )ÚpadÚvÚxr   r   r   Úcheck_padding;   s    r   c                 C   sT  |   d¡stdƒ‚| dd … } t| ƒ\}} t| ƒ\}} t| ƒ\}} t| ƒ\}} |dkr^tdƒ‚t| ƒ\}} t| ƒ\}} | r‚tdƒ‚t|ƒd dkrštd	ƒ‚|d
krª|}�nl||fdkrÆtd||f ƒ‚t|ƒ\}	}t|ƒ\}
}t|	ƒdkròtdƒ‚|rþtdƒ‚t |¡ ¡ }g }d}t	ddƒD ]°}t |	t
 d|¡ ¡ ¡ }t|d||dƒ}t
jd t
 d|¡žŽ }t|ƒ}t	d|
ƒD ]D}t|dt |¡ ¡ |dƒ}t
jd!t
 d|¡žŽ }t|||d� �qt| |d d… ¡ �qd dd„ t|Ž D ƒ¡}tj|d d… tjd|dd… d�}| |¡}t|ƒ\}}t|ƒ\}}||k�r@tdƒ‚t|ƒ\}}||fS )"Ns   openssh-key-v1 zIncorrect magic valueé   r   zWe only handle 1 key at a timezToo much dataé   r   zIncorrect payload lengthÚnone)z
aes256-ctrZbcryptz#Unsupported encryption scheme %s/%sé   zIncorrect salt lengthzToo much data in kdfoptionss    OxychromaticBlowfishSwatDynamiteé   r
   é   Fú	<IIIIIIIIz	>IIIIIIII)Úoutputé   ó    c                 S   s    g | ]\}}t |ƒt |ƒ ‘qS r   )r   )Ú.0ÚaÚbr   r   r   Ú
<listcomp>y   s     z2import_openssh_private_generic.<locals>.<listcomp>é    é0   )ÚnonceÚinitial_valuezIncorrect checksum)r&   )r&   )Ú
startswithr   r   r   r   r   r   ÚnewÚdigestÚranger   Úpackr   r   Ú	bytearrayr   ÚappendÚjoinÚzipr   ZMODE_CTRZdecrypt)r   ÚpasswordZ
ciphernameZkdfnameZ
kdfoptionsZnumber_of_keysÚ_Z	encryptedZ	decryptedÚsaltZ
iterationsZ
pwd_sha512ZstripesZconstantÚcountZsalt_sha512Zout_leÚoutÚaccÚresultÚcipherZ	checkint1Z	checkint2Zssh_namer   r   r   Úimport_openssh_private_genericA   sf    

ý

rC   )r   ZCrypto.Cipherr   ZCrypto.Hashr   ZCrypto.Protocol.KDFr   ZCrypto.Util.strxorr   ZCrypto.Util.py3compatr   r   r   r   r   r   r   rC   r   r   r   r   Ú<module>   s   