U
    g                     @   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   A/tmp/pip-unpacked-wheel-_q8s9isk/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   sT  |  dstd| dd  } t| \}} t| \}} t| \}} t| \}} |dkr^tdt| \}} t| \}} | rtdt|d dkrtd	|d
kr|}nl||fdkrtd||f t|\}	}t|\}
}t|	dkrtd|rt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	decryptedZ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    



rB   )r   ZCryptodome.Cipherr   ZCryptodome.Hashr   ZCryptodome.Protocol.KDFr   ZCryptodome.Util.strxorr   ZCryptodome.Util.py3compatr   r   r   r   r   r   r   rB   r   r   r   r   <module>   s   