o
    n~b                     @   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   H/usr/local/lib/python3.10/dist-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  qd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
      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   ZMODE_CTR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Cryptodome.Cipherr   ZCryptodome.Hashr   ZCryptodome.Protocol.KDFr   ZCryptodome.Util.strxorr   ZCryptodome.Util.py3compatr   r   r   r   r   r   r   rC   r   r   r   r   <module>   s   