o
    >h0                  	   @  s  d Z ddlmZ ddl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 ddlmZ dd	lmZmZmZmZ ejejkrqzddlZejejf W n eefyp   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<d*d+Z-d=d-d.Z.d/d0 Z/d1d2 Z0d>d4d5Z1	d?d@d8d9Z2e3d:kre%  dS dS )Az2
Implementation module for the `ckeygen` command.
    )annotationsN)Callable)wraps)reload)AnyDictOptional)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   }/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-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/   r4   )r   parseOptionssysargvr   
UsageErrorprintopt_helpexitr   discardLogshandleErrordeferrlowerr   joinr	   printFingerprintchangePassPhrasedisplayPublicKey)optionsur   r   r   runU   s8   rV   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BadFingerPrintFormat)rT   r   r   r   enumrepresentations   s   r[   c                   C  s   da tt   )N   )
exitStatusr   errr
   Failurer   r   r   r   rM      s   rM   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)r`   r   i   i  )key_sizepublic_exponentbackend)	cryptography.hazmat.backendsrb   )cryptography.hazmat.primitives.asymmetricr`   generate_private_keyintr	   Key_saveKey)rT   rb   r`   keyPrimitivekeyr   r   r   generateRSAkey   s   

rn   dsac                 C  sX   ddl m} ddlm} | d sd| d< |jt| d | d}t|}t||  d S )Nr   ra   )ro   r   i   )rc   re   )	rf   rb   rg   ro   rh   ri   r	   rj   rk   )rT   rb   ro   rl   rm   r   r   r   generateDSAkey   s   

rp   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   ra   )ecr      s   ecdsa-sha2-nistpascii)curvere   )rf   rb   rg   rr   strencoderh   r	   _curveTablerj   rk   )rT   rb   rr   ru   rl   rm   r   r   r   generateECDSAkey   s   
ry   ed25519c                 C  s"   t j }t |}t||  d S r   )r	   Ed25519PrivateKeygeneraterj   rk   )rT   rl   rm   r   r   r   generateEd25519key   s   

r}   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'}).
    Ed25519r7   r6   r   r   r   r   r   _defaultPrivateKeySubtype   s   r   rT   Dict[Any, Any]inputCollectorOptional[Callable[[str], str]]keyTypeNamerv   returnc                 C  s`   |du rt }| d }|s,tjd| }t dkr$tjd| }|d| p+|}t|S )a  
    If C{options["filename"]} is None, prompt the user to enter a path
    or attempt to set it to .ssh/id_rsa
    @param options: command line options
    @param inputCollector: dependency injection for testing
    @param keyTypeName: key type or "rsa"
    Nr   z
~/.ssh/id_Windowsz%HOMEPATH %\.ssh\id_z%Enter file in which the key is (%s): )inputospath
expanduserplatformsystemrv   )rT   r   r   r   r   r   r   _getKeyOrDefault   s   r   Nonec                 C  s   t | }tj|d r|d7 }t| } ztj|}td|	 |
| d tj|f  W d S  tjyA   td Y d S  tyR   t| d Y d S w )N.pubz%s %s %sr)   zbad key, could not be opened, please specify a file.)r   r   r   existsr[   r	   rj   fromFilerI   sizer-   basenameBadKeyErrorrF   rK   FileNotFoundError)rT   r   rm   r   r   r   rQ      s&   

rQ   c                 C  sL  t | }ztj|}W nv tjyX   | ds td| d< ztjj|| d d}W n) tjy;   t	d Y n tjyU } zt	d|  W Y d }~nd }~ww Y n+ tjyr } zt	d|  W Y d }~nd }~w t
y   t	| d Y n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}|| W d    n	1 sw   Y  td d S )Nr'   zEnter old passphrase: 
passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: r   r%   rD   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	   rj   r   EncryptedKeyErrorgetgetpassr   rF   rK   r   rI   r   r!   toString	Exception
fromStringopenwrite)rT   r   rm   ep1p2
newkeydatafdr   r   r   rR      sh   




rR   c                 C  s   t | }ztj|}W n0 ty   t| d Y n  tjy<   | ds0t		d| d< tjj|| d d}Y nw |
 dd}t| d S )Nr   r'   zEnter passphrase: r   r   rt   )r   r	   rj   r   r   rF   rK   r   r   r   publicr   decoderI   )rT   r   rm   
displayKeyr   r   r   rS   2  s   
rS   promptc                 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   rm   keys.Keyc                 C  s  |du rt }ddddd}||   }|d }|s-t|||}td| d	}| p,|}tj|rJt| d
 |d}|d 	 dkrJt
  |drTd|d< n|d sq	 td}	td}
|	|
krhntd qY|	|d< |ddu rt|  |d< t  dt  }t|}|| jd|d |d d |d t|d |  jd|d t|}td|  td| d td|d  d  t| |d  dS )!z
    Persist a SSH key on local filesystem.

    @param key: Key which is persisted on local filesystem.

    @param options:

    @param inputCollector: Dependency injection for testing.
    Nrq   rz   r`   ro   )ECr~   RSADSAr   z%Enter file in which to save the key (z): z already exists.zOverwrite (y/n)? r   r5   r3       r'   rD   z,Enter passphrase (empty for no passphrase): r   r   r,   @r   r   i  r   )r#   z&Your identification has been saved in z"Your public key has been saved in zThe key fingerprint in r)   z is:)r   r!   r   r   stripr   r   r   rI   rO   rF   rK   r   r   r   getusersocketgethostnamer   FilePath
setContentr   chmodr   r[   r-   )rm   rT   r   KeyTypeMappingr   r   defaultPathnewPathynr   r   r#   fpr   r   r   rk   I  s^   






rk   __main__)Nr`   )rT   r   r   r   r   rv   r   rv   )rT   r   r   r   )r   rv   r   rv   r   )rm   r   rT   r   r   r   r   r   )4__doc__
__future__r   r   r   r   r   rF   collections.abcr   	functoolsr   	importlibr   typingr   r   r   twisted.conch.sshr	   twisted.pythonr
   r   r   r   unix_getpassr   	tcgetattr	tcsetattrImportErrorAttributeErrormodulesdictr   r   Optionsr   rV   r[   rM   rn   rp   ry   r}   r   r   rQ   rR   rS   r   rk   r9   r   r   r   r   <module>   s`   
&




3
F
