o
    b1-                  	   @   sv  d 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 ejejkrWzddlZejejf W n eefyV   dejd< ee Y nw e Zdd	 ZG d
d dejZdd Zdd Zdd Zeddd Zeddd Z eddd Z!eddd Z"dd Z#d d! Z$d"d# Z%d$d% Z&d&e'd'e'fd(d)Z(d*d+ Z)e*d,kre  dS dS )-z2
Implementation module for the `ckeygen` command.
    N)wraps)reload)keys)failurefilepathlogusagetermiosc                    s    fdd}|S )Nc                    s    t   fdd}|t< |S )Nc                     s    | i |S )N )argskwargskeygeneratorr
   ?/usr/lib/python3/dist-packages/twisted/conch/scripts/ckeygen.pywrapper"   s   z:_keyGenerator.<locals>.assignkeygenerator.<locals>.wrapper)r   supportedKeyTypes)r   r   keyTyper   r   assignkeygenerator!   s   z)_keyGenerator.<locals>.assignkeygeneratorr
   )r   r   r
   r   r   _keyGenerator    s   r   c                	   @   s   e Zd ZdZdZg dg dg dg dg dg dg d	g d
gZg dg dg dg dg dgZeje	e
e e	ddgddZdS )GeneralOptionszUsage:    ckeygen [options]
 z8ckeygen manipulates public/private keys in various ways.)bitsbNz$Number of bits in the key to create.)filenamefNzFilename of the key file.)typetNzSpecify type of key to create.)commentCNzProvide new comment.)newpassNNzProvide new passphrase.)passPNzProvide old passphrase.)formatosha256-base64zFingerprint format of key file.)private-key-subtypeNNz5OpenSSH private key subtype to write ("PEM" or "v1").)fingerprintlzShow fingerprint of key file.)
changepasspz&Change passphrase of private key file.)quietqzQuiet.)no-passphraseNz"Create the key with no passphrase.)showpubyz+Read private key file and print public key.PEMv1)r   r&   )
optActionsN)__name__
__module____qualname__synopsislongdescoptParametersoptFlagsr   CompletionsCompleteListlistr   r   compDatar
   r
   r
   r   r   ,   s.    
r   c               
   C   s(  t  } z| tjdd   W n" tjy1 } ztd|  |   td W Y d }~nd }~ww t	
  tt	_| d rk| d  tv rYtd| d   t| d   |  d S td| d dt f  d S | d rut|  d S | d rt|  d S | d	 rt|  d S |   td d S )
N   z	ERROR: %sr   z&Generating public/private %s key pair.z"Key type was %s, must be one of %sz, r'   r)   r.   )r   parseOptionssysargvr   
UsageErrorprintopt_helpexitr   discardLogshandleErrordeferrlowerr   joinr   printFingerprintchangePassPhrasedisplayPublicKey)optionsur
   r
   r   runR   s8   rP   c                 C   sL   | d dkrt jj| d< | S | d dkrt jj| d< | S t d| d )Nr#   zmd5-hexr%   z"Unsupported fingerprint format: {})r   FingerprintFormatsMD5_HEXSHA256_BASE64BadFingerPrintFormatr#   )rN   r
   r
   r   enumrepresentationp   s   rU   c                   C   s   da tt   )N   )
exitStatusr   errr   Failurer
   r
   r
   r   rG   }   s   rG   rsac                 C   sZ   ddl m} ddlm} | d sd| d< |jt| d d| d}t|}t||  d S )Nr   default_backend)rZ   r      i  )key_sizepublic_exponentbackend)	cryptography.hazmat.backendsr\   )cryptography.hazmat.primitives.asymmetricrZ   generate_private_keyintr   Key_saveKey)rN   r\   rZ   keyPrimitivekeyr
   r
   r   generateRSAkey   s   

ri   dsac                 C   sX   ddl m} ddlm} | d sd| d< |jt| d | d}t|}t||  d S )Nr   r[   )rj   r   r]   )r^   r`   )	ra   r\   rb   rj   rc   rd   r   re   rf   )rN   r\   rj   rg   rh   r
   r
   r   generateDSAkey   s   

rk   ecdsac                 C   sl   ddl m} ddlm} | d sd| d< dt| d d }|jtj| | d}t	|}t
||  d S )	Nr   r[   )ecr      s   ecdsa-sha2-nistpascii)curver`   )ra   r\   rb   rm   strencoderc   r   _curveTablere   rf   )rN   r\   rm   rp   rg   rh   r
   r
   r   generateECDSAkey   s   
rt   ed25519c                 C   s.   ddl m} |j }t|}t||  d S )Nr   )ru   )rb   ru   Ed25519PrivateKeygenerater   re   rf   )rN   ru   rg   rh   r
   r
   r   generateEd25519key   s   

rx   c                 C   s   | dkrdS dS )a  
    Return a reasonable default private key subtype for a given key type.

    @type keyType: L{str}
    @param keyType: A key type, as returned by
        L{twisted.conch.ssh.keys.Key.type}.

    @rtype: L{str}
    @return: A private OpenSSH key subtype (C{'PEM'} or C{'v1'}).
    Ed25519r1   r0   r
   r   r
   r
   r   _defaultPrivateKeySubtype   s   rz   c                 C   s   | d st jd}td| | d< t j| d d r$| d  d7  < t| } z!tj| d }t	d|
 || d t j| d f  W d S  tjyY   td Y d S w )Nr   ~/.ssh/id_rsa%Enter file in which the key is (%s): .pubz%s %s %sr#   zbad key)ospath
expanduserinputexistsrU   r   re   fromFilerC   sizer'   basenameBadKeyErrorr@   rE   )rN   r   rh   r
   r
   r   rK      s&   
rK   c                 C   sT  | d st jd}td| | d< z
tj| d }W nh tjyj   | ds0t		d| d< ztjj| d | d d}W n) tj
yM   td Y n tjyg } ztd|  W Y d }~nd }~ww Y n tj
y } ztd|  W Y d }~nd }~ww | d	s	 t		d}t		d}||krntd q|| d	< | dd u rt| | d< z|jd| d | d	 d}W n ty } ztd|  W Y d }~nd }~ww ztjj|| d	 d W n tjtj
fy } ztd|  W Y d }~nd }~ww t| d d}|| W d    n	1 sw   Y  td d S )Nr   r{   r|   r!   zEnter old passphrase: 
passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: r   r>   z0Enter new passphrase (empty for no passphrase): Enter same passphrase again: %Passphrases do not match.  Try again.r&   opensshsubtyper   wbz;Your identification has been saved with the new passphrase.)r~   r   r   r   r   re   r   EncryptedKeyErrorgetgetpassr   r@   rE   rC   rz   r   toString	Exception
fromStringopenwrite)rN   r   rh   ep1p2
newkeydatafdr
   r
   r   rL      sh   




rL   c                 C   s   | d st jd}td| | d< z
tj| d }W n" tjy>   | ds0t		d| d< tjj| d | d d}Y nw |
 dd}t| d S )	Nr   r{   r|   r!   zEnter passphrase: r   r   ro   )r~   r   r   r   r   re   r   r   r   r   publicr   decoderC   )rN   r   rh   
displayKeyr
   r
   r   rM     s   
rM   promptreturnc                 C   s   t | S )zv
    Ask the user where to save the key.

    This needs to be a separate function so the unit test can patch it.
    )r   )r   r
   r
   r   _inputSaveFile%  s   r   c           
      C   s  ddddd}||    }|d s*tjd| }td| d	}| p'||d< tj|d rKtd
|d  t	d}|d 
 dkrKt  |drUd|d< n|d sr	 td}td}||krintd qZ||d< |ddu rt|   |d< t  dt  }	t|d | jd|d |d d t|d d t|d d |  jd|	d t|}td|d  td|d  td|d   t| |d   dS )!z
    Persist a SSH key on local filesystem.

    @param key: Key which is persisted on local filesystem.
    @type key: C{keys.Key} implementation.

    @param options:
    @type options: L{dict}
    rl   ru   rZ   rj   )ECry   RSADSAr   z
~/.ssh/id_z%Enter file in which to save the key (z): z{} already exists.zOverwrite (y/n)? r   r/   r-       r!   r>   z,Enter passphrase (empty for no passphrase): r   r   r&   N@r   r   i  r}   )r   z(Your identification has been saved in {}z(Your public key has been saved in {}.pubzThe key fingerprint in {} is:r#   )r   r~   r   r   r   stripr   rC   r#   r   rI   r@   rE   r   r   rz   getusersocketgethostnamer   FilePath
setContentr   chmodr   rU   r'   )
rh   rN   KeyTypeMappingkeyTypeNamedefaultPathnewPathynr   r   r   r
   r
   r   rf   .  sV   





rf   __main__)+__doc__r   r~   r   r@   	functoolsr   impr   twisted.conch.sshr   twisted.pythonr   r   r   r   unix_getpassr	   	tcgetattr	tcsetattrImportErrorAttributeErrormodulesdictr   r   Optionsr   rP   rU   rG   ri   rk   rt   rx   rz   rK   rL   rM   rq   r   rf   r3   r
   r
   r
   r   <module>   sP   
&



3	>
