
    Vh0                    ~   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j2                  k(  r	 ddlZej6                  ej8                  f  e        Z!d Z" G d dejF                        Z$d Z%d Z&d Z' e"d      d        Z( e"d      d        Z) e"d      d        Z* e"d      d        Z+d Z,	 	 d!	 	 	 	 	 	 	 d"dZ-d#dZ.d Z/d Z0d$dZ1	 d%	 	 	 	 	 	 	 d&dZ2e3d k(  r e%        yy# eef$ r dej>                  d
<    ee       Y w xY w)'z2
Implementation module for the `ckeygen` command.
    )annotationsN)Callable)wraps)reload)AnyDictOptional)keys)failurefilepathlogusagetermiosc                      fd}|S )Nc                B     t                fd       }|t        <   |S )Nc                      | i |S N )argskwargskeygenerators     M/home/dcms/DCMS/lib/python3.12/site-packages/twisted/conch/scripts/ckeygen.pywrapperz:_keyGenerator.<locals>.assignkeygenerator.<locals>.wrapper%   s    000    )r   supportedKeyTypes)r   r   keyTypes   ` r   assignkeygeneratorz)_keyGenerator.<locals>.assignkeygenerator$   s,    	|		1 
	1 &-'"r   r   )r   r   s   ` r   _keyGeneratorr   #   s     r   c            	         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j                   e
ej                                      ej                  ddg      d      Zy)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%   r0   )
optActionsN)__name__
__module____qualname__synopsislongdescoptParametersoptFlagsr   CompletionsCompleteListlistr   r
   compDatar   r   r   r    r    /   s    H JH 	D<=696K	
M" 	>E EGH !u  &E&&t,=,B,B,D'EF#55#5#5udm#D
Hr   r    c            	        t               } 	 | j                  t        j                  dd         t        j                          t        t        _        | d   r| d   j                         t        v r1t        d| d   z         t        | d   j                            |        y t        j                  d| d   ddj                  t        j!                                      y | d   rt#        |        y | d	   rt%        |        y | d
   rt'        |        y | j                          t        j                  d       y # t        j
                  $ r>}t        d|z         | j                          t        j                  d       Y d }~Wd }~ww xY w)N   z	ERROR: %sr%   z&Generating public/private %s key pair.zKey type was z, must be one of z, r1   r3   r8   )r    parseOptionssysargvr   
UsageErrorprintopt_helpexitr   discardLogshandleErrordeferrlowerr   joinr
   printFingerprintchangePassPhrasedisplayPublicKey)optionsus     r   runr[   U   s7   GSXXab\*
 OOCJv6?  "&77:gfoNOgfo3356w?HH6?DII.?.D.D.F$GI 
	!		!		!/  kAos   "D9 9F
3FF
c                    | d   dk(  rt         j                  j                  | d<   | S | d   dk(  rt         j                  j                  | d<   | S t        j                  d| d          )Nr-   zmd5-hexr/   z Unsupported fingerprint format: )r
   FingerprintFormatsMD5_HEXSHA256_BASE64BadFingerPrintFormat)rY   s    r   enumrepresentationra   s   su    xI% 33;;		o	- 33AA''.wx/@.AB
 	
r   c                 V    da t        j                  t        j                                 )N   )
exitStatusr   errr   Failurer   r   r   rR   rR      s    JGGGOO	r   rsac                    ddl m} ddlm} | d   sd| d<   |j	                  t        | d         d |             }t        j                  |      }t        ||        y )Nr   default_backend)rg   r!   i   i  )key_sizepublic_exponentbackend)	cryptography.hazmat.backendsrj   )cryptography.hazmat.primitives.asymmetricrg   generate_private_keyintr
   Key_saveKey)rY   rj   rg   keyPrimitivekeys        r   generateRSAkeyrv      s\    <=6?++WV_%! , L
 ((<
 CS'r   dsac                    ddl m} ddlm} | d   sd| d<   |j	                  t        | d          |             }t        j                  |      }t        ||        y )Nr   ri   )rw   r!   i   )rk   rm   )	rn   rj   ro   rw   rp   rq   r
   rr   rs   )rY   rj   rw   rt   ru   s        r   generateDSAkeyry      sY    <=6?++WV_%! , L ((<
 CS'r   ecdsac                   ddl m} ddlm} | d   sd| d<   dt	        | d         j                  d      z   }|j                  t        j                  |    |             }t        j                  |      }t        ||        y )	Nr   ri   )ecr!      s   ecdsa-sha2-nistpascii)curverm   )rn   rj   ro   r|   strencoderp   r
   _curveTablerr   rs   )rY   rj   r|   r   rt   ru   s         r   generateECDSAkeyr      sz    <<6?  #gfo"6"="=g"FFE**u%/@ + L ((<
 CS'r   ed25519c                    t         j                  j                         }t        j                  |      }t	        ||        y r   )r
   Ed25519PrivateKeygeneraterr   rs   )rY   rt   ru   s      r   generateEd25519keyr      s.    ))224L
((<
 CS'r   c                    | dk(  ryy)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'}).
    Ed25519r;   r:   r   )r   s    r   _defaultPrivateKeySubtyper      s     )r   c                
   |t         }| d   }|sjt        j                  j                  d|       }t	        j
                         dk(  r"t        j                  j                  d|       } |d|z        xs |}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"
    r#   z
~/.ssh/id_Windowsz%HOMEPATH %\.ssh\id_z%Enter file in which the key is (%s): )inputospath
expanduserplatformsystemr   )rY   inputCollectorkeyTypeNamer#   s       r   _getKeyOrDefaultr      s     z"H77%%
;-&@A??	)ww))-A+*OPHBXMN  	 x=r   c           	        t        |       }t        j                  j                  |dz         r|dz  }t	        |       } 	 t
        j                  j                  |      }t        |j                         d|j                  | d         dt        j                  j                  |             y # t
        j                  $ r t        j                  d       Y y t        $ r t        j                  | d       Y y w xY w)N.pub r-   zbad key, could not be opened, please specify a file.)r   r   r   existsra   r
   rr   fromFilerN   sizer1   basenameBadKeyErrorrK   rP   FileNotFoundError)rY   r#   ru   s      r   rV   rV      s    (H	ww~~h'(F )GLhh) 
 12  *		
   LH:IJKLs   A/B/ /(C< C<;C<c                   t        |       }	 t        j                  j                  |      }| j                  d      sB	 t        j                  d      }t        j                  d	      }||k(  rnt        d
       <|| d<   | j                  d      t        j                               | d<   	 j                  d| d   | d         }	 t        j                  j!                  | d          t#        |d      5 }|j%                         d d d        t        d       y # t        j                  $ r | j                  d      st        j                  d      | d<   	 t        j                  j                  || d         }na# t        j                  $ r t        j                  d       Y n7t        j                  $ r"}t        j                  d|        Y d }~nd }~ww xY wY t        j                  $ r#}t        j                  d|        Y d }~d }~wt        $ r t        j                  | d       Y w xY w# t        $ r#}t        j                  d|        Y d }~d }~ww xY w# t        j                  t        j                  f$ r#}t        j                  d|        Y d }~d }~ww xY w# 1 sw Y   xY w)Nr+   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.r0   opensshsubtyper   wbz;Your identification has been saved with the new passphrase.)r   r
   rr   r   EncryptedKeyErrorgetgetpassr   rK   rP   r   rN   r   r%   toString	Exception
fromStringopenwrite)rY   r#   ru   ep1p2
newkeydatafds           r   rW   rW      sm   (HLhh)  ;;y!!STB!@ABRx9:   	{{()1)B388:)N%&6\\12y) " 

6J793EF 
h	 
 

GHY !! 	:{{6"%oo.FGGFO	:((##H#IC 	JHHHI%% 	:HH4QC899	: 60455 LH:IJKL*  604556
 ""D$4$45 604556 s   D -H? $I. 8J7<H<$F ?H< (G(H<*G<GH<GH<$H<6H$H<;H<?	I+I&&I+.#J4J//J47Kc                   t        |       }	 t        j                  j                  |      }j                         j                  d      j                  d      }t        |       y # t        $ r t        j                  | d       Y ]t        j                  $ rP | j                  d      st        j                  d      | d<   t        j                  j                  || d         }Y w xY w)Nr   r+   zEnter passphrase: r   r   r~   )r   r
   rr   r   r   rK   rP   r   r   r   publicr   decoderN   )rY   r#   ru   
displayKeys       r   rX   rX   2  s    (HFhh) &&y188AJ	*  LH:IJK!! F{{6"%oo.BCGFOhhWV_EFs   A& &!C+	AC+*C+c                    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   )prompts    r   _inputSaveFiler   @  s     =r   c                   |t         }ddddd}|| j                            }|d   }|s0t        |||      }t        d| d	      }|j	                         xs |}t
        j                  j                  |      r@t        | d
        |d      }|d   j                         dk7  rt        j                          |j                  d      rd|d<   nG|d   sB	 t        j                  d      }	t        j                  d      }
|	|
k(  rnt        d       <|	|d<   |j                  d      t        | j                               |d<   t        j                          dt!        j"                          }t%        j&                  |      }|j)                  | j+                  d|d   |d                |j-                  d       t%        j&                  |dz         j)                  | j/                         j+                  d|             t1        |      }t        d|        t        d| d       t        d|d    d       t        | j3                  |d                y) 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.
    Nrz   r   rg   rw   )ECr   RSADSAr#   z%Enter file in which to save the key (z): z already exists.zOverwrite (y/n)? r   r9   r7   r   r+   z,Enter passphrase (empty for no passphrase): r   r   r0   @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   rN   rT   rK   rP   r   r   r   getusersocketgethostnamer   FilePath
setContentr   chmodr   ra   r1   )ru   rY   r   KeyTypeMappingr   r#   defaultPathnewPathynr   r   r'   fps                r   rs   rs   I  s@    #	%PUVN ,Kz"H&wL 3K=D
 ==?1k	ww~~h
*+,/0a5;;=CHHJ{{?#V_!OPB!@ABRx9:  {{()1)B388:)N%&"#1V%7%7%9$:;G			8	$BMM12v 	 	
 HHXh'(33

i9 !)G	28*
=>	.xj
=>	#GH$5#6d
;<	#//'(+
,-r   __main__)Nrg   )rY   Dict[Any, Any]r   Optional[Callable[[str], str]]r   r   returnr   )rY   r   r   None)r   r   r   r   r   )ru   zkeys.KeyrY   r   r   r   r   r   )4__doc__
__future__r   r   r   r   r   rK   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    r[   ra   rR   rv   ry   r   r   r   r   rV   rW   rX   r   rs   r=   r   r   r   <module>r      s  
 #  	   
 $   & & " 8 8
??g***7,,,
 F 	#U]] #L<


 u  u  w   y ( 6:2  		4L*0If 6:C.	C.C. 3C. 
	C.L zE g ( !%Iws   %D D<;D<