o
    Þý°j  ã                   @   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   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/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   sV  |   d¡s	tdƒ‚| dd … } t| ƒ\}} t| ƒ\}} t| ƒ\}} t| ƒ\}} |dkr/tdƒ‚t| ƒ\}} t| ƒ\}} | rAtdƒ‚t|ƒd dkrMtd	ƒ‚|d
krT|}n¸||fdkrbtd||f ƒ‚t|ƒ\}	}t|ƒ\}
}t|	ƒdkrxtdƒ‚|r~tdƒ‚t |¡ ¡ }g }d}t	ddƒD ]Z}t |	t
 d|¡ ¡ ¡ }t|d||dƒ}t
jdgt
 d|¡¢R Ž }t|ƒ}t	d|
ƒD ]#}t|dt |¡ ¡ |dƒ}t
jdgt
 d|¡¢R Ž }t|||d� q»| |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-ctrÚbcryptz#Unsupported encryption scheme %s/%sé   zIncorrect salt lengthzToo much data in kdfoptionss    OxychromaticBlowfishSwatDynamiteé   r
   é   Fz	<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)Ú
startswithr   r   r   r   r   r   ÚnewÚdigestÚranger   Úpackr   r   Ú	bytearrayr   ÚappendÚjoinÚzipr   ÚMODE_CTRÚdecrypt)r   ÚpasswordÚ
ciphernameÚkdfnameÚ
kdfoptionsÚnumber_of_keysÚ_Ú	encryptedÚ	decryptedÚsaltÚ
iterationsÚ
pwd_sha512ÚstripesÚconstantÚcountÚsalt_sha512Úout_leÚoutÚaccÚresultÚcipherÚ	checkint1Ú	checkint2Ússh_namer   r   r   Úimport_openssh_private_genericA   sf   

ý

rT   )r   ÚCryptodome.Cipherr   ÚCryptodome.Hashr   ÚCryptodome.Protocol.KDFr   ÚCryptodome.Util.strxorr   ÚCryptodome.Util.py3compatr   r   r   r   r   r   r   rT   r   r   r   r   Ú<module>   s   