
    \d,                     6   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    r6	 ddlZej        ej        f n"# eef$ r dej        d<    ee           Y nw xY w e            Zd Z G d	 d
ej                  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 Z$d Z%d Z&de'de'fdZ(d Z)e*dk    r e             dS dS )z2
Implementation module for the `ckeygen` command.
    N)wraps)reload)keys)failurefilepathlogusagetermiosc                       fd}|S )Nc                 R     t                      fd            }|t          <   |S )Nc                       | i |S N )argskwargskeygenerators     =lib/python3.11/site-packages/twisted/conch/scripts/ckeygen.pywrapperz:_keyGenerator.<locals>.assignkeygenerator.<locals>.wrapper"   s    <0000    )r   supportedKeyTypes)r   r   keyTypes   ` r   assignkeygeneratorz)_keyGenerator.<locals>.assignkeygenerator!   sB    	|			1 	1 	1 	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                                                     ej	        ddg          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       H JH 	DCC<<<===666999666KKK	
 	
 	
M" 	>==EEE   EEEGGGH !u &E&tt,=,B,B,D,D'E'EFF#55#5udm#D#D
 
  HHHr   r   c            	         t                      } 	 |                     t          j        dd                     nV# t          j        $ rD}t          d|z             |                                  t          j        d           Y d }~nd }~ww xY wt          j
                     t          t          _        | d         r| d                                         t          v rGt          d| d         z             t          | d                                                  |            d S t          j        d| d         dd                    t                                                               d S | d         rt#          |            d S | d	         rt%          |            d S | d
         rt'          |            d S |                                  t          j        d           d S )N   z	ERROR: %sr    z&Generating public/private %s key pair.zKey type was z, must be one of z, r,   r.   r3   )r   parseOptionssysargvr	   
UsageErrorprintopt_helpexitr   discardLogshandleErrordeferrlowerr   joinr   printFingerprintchangePassPhrasedisplayPublicKey)optionsus     r   runrV   R   s   GSXabb\****   kAo OCJv 6?  ""&777:gfoNOOOgfo33556w?????HH6???DII.?.D.D.F.F$G$G$GI     
	 !!!!!		 !!!!!		 !!!!!s   '8 B:BB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BadFingerPrintFormatr(   )rT   s    r   enumrepresentationr\   p   sw    xI%% 3;		o	-	- 3A'0778IJJ
 
 	
r   c                  R    da t          j        t          j                                )N   )
exitStatusr   errr   Failurer   r   r   rM   rM   }   s"    JGGO	r   rsac                     ddl m} ddlm} | d         sd| d<   |                    t          | d                   d |                      }t          j        |          }t          ||            d S )Nr   default_backend)rb   r   i   i  )key_sizepublic_exponentbackend)	cryptography.hazmat.backendsre   )cryptography.hazmat.primitives.asymmetricrb   generate_private_keyintr   Key_saveKey)rT   re   rb   keyPrimitivekeys        r   generateRSAkeyrq      s    <<<<<<======6? ++WV_%%!! ,  L
 (<
 
 CS'r   dsac                     ddl m} ddlm} | d         sd| d<   |                    t          | d                    |                      }t          j        |          }t          ||            d S )Nr   rd   )rr   r   i   )rf   rh   )	ri   re   rj   rr   rk   rl   r   rm   rn   )rT   re   rr   ro   rp   s        r   generateDSAkeyrt      s    <<<<<<======6? ++WV_%%!! ,  L (<
 
 CS'r   ecdsac                 4   ddl m} ddlm} | d         sd| d<   dt	          | d                                       d          z   }|                    t          j        |          |                      }t          j	        |          }t          ||            d S )	Nr   rd   )ecr      s   ecdsa-sha2-nistpascii)curverh   )ri   re   rj   rw   strencoderk   r   _curveTablerm   rn   )rT   re   rw   rz   ro   rp   s         r   generateECDSAkeyr~      s    <<<<<<<<<<<<6?   #gfo"6"6"="=g"F"FFE**u%/@/@ +  L (<
 
 CS'r   ed25519c                     t           j                                        }t          j        |          }t	          ||            d S r   )r   Ed25519PrivateKeygeneraterm   rn   )rT   ro   rp   s      r   generateEd25519keyr      s;    )2244L
(<
 
 CS'r   c                     | 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'}).
    Ed25519r6   r5   r   )r   s    r   _defaultPrivateKeySubtyper      s     )tur   c           
      v   | d         s4t           j                            d          }t          d|z            | d<   t           j                            | d         dz             r| dxx         dz  cc<   t          |           } 	 t          j                            | d                   }t          |
                                d|                    | d                   dt           j                            | d                              d S # t          j        $ r t          j        d           Y d S w xY w)Nr   ~/.ssh/id_rsa%Enter file in which the key is (%s): .pub r(   zbad key)ospath
expanduserinputexistsr\   r   rm   fromFilerI   sizer,   basenameBadKeyErrorrF   rK   )rT   r   rp   s      r   rQ   rQ      sE   : X7%%o66#$Kh$VWW
	w~~gj)F233 &
v% ))Gh
 344 



 12222  !4555		
 	
 	
 	
 	
    s   B
D #D87D8c                    | d         s4t           j                            d          }t          d|z            | d<   	 t          j                            | d                   }n# t          j        $ r |                     d          st          j	        d          | d<   	 t          j                            | d         | d                   }nW# t          j
        $ r t          j        d           Y n2t          j        $ r!}t          j        d|            Y d }~nd }~ww xY wY n2t          j
        $ r!}t          j        d|            Y d }~nd }~ww xY w|                     d	          sE	 t          j	        d          }t          j	        d          }||k    rnt          d           ?|| d	<   |                     d          $t          |                                          | d<   	 |                    d| d         | d	                   }n.# t"          $ r!}t          j        d|            Y d }~nd }~ww xY w	 t          j                            || d	                    n?# t          j        t          j
        f$ r!}t          j        d|            Y d }~nd }~ww xY wt'          | d         d          5 }|                    |           d d d            n# 1 swxY 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$   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   r   r   r   rm   r   EncryptedKeyErrorgetgetpassr   rF   rK   rI   r   r    toString	Exception
fromStringopenwrite)rT   r   rp   ep1p2
newkeydatafds           r   rR   rR      s   : X7%%o66#$Kh$VWW
6h
 344! 	: 	: 	:{{6"" 	H%o.FGGGFO	:(##GJ$7GFO#TTCC 	J 	J 	JHHIIIII% 	: 	: 	:H8Q8899999999	: 6 6 6444555555556 ;;y!!  	;!STTB!@AABRxx9:::	;  	{{())1)B388::)N)N%&6\\12y) " 
 



  6 6 64445555555566J793EFFFF"D$45 6 6 6444555555556 
gj!4	(	( B
               

GHHHHHs   %A$ $;E -CE#D"1E3D"DED""E'E5EE-$H 
H=H88H='I) )J%J  J%>K  K$'K$c                 :   | d         s4t           j                            d          }t          d|z            | d<   	 t          j                            | d                   }nn# t          j        $ r\ |                     d          st          j	        d          | d<   t          j                            | d         | d                   }Y nw xY w|
                                                    d                              d          }t          |           d S )	Nr   r   r   r&   zEnter passphrase: r   r   ry   )r   r   r   r   r   rm   r   r   r   r   publicr   decoderI   )rT   r   rp   
displayKeys       r   rS   rS     s   : X7%%o66#$Kh$VWW
Qh
 344! Q Q Q{{6"" 	D%o.BCCGFOh
 3PPQ &&y1188AAJ	*s   %A$ $A(CCpromptreturnc                      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   s    r   _inputSaveFiler   #  s     ==r   c                    ddddd}||                                           }|d         sNt          j                            d|           }t	          d| d	          }|                                p||d<   t          j                            |d                   rht          d
                    |d                              t          d          }|d         
                                dk    rt          j                     |                    d          rd|d<   nM|d         sE	 t          j        d          }t          j        d          }||k    rnt          d           ?||d<   |                    d          $t          |                                            |d<   t          j                     dt#          j                     }	t'          j        |d                                       |                     d|d         |d                              t          j        |d         d           t'          j        |d         dz                                 |                                                     d|	                     t3          |          }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}
    ru   r   rb   rr   )ECr   RSADSAr   z
~/.ssh/id_z%Enter file in which to save the key (z): z{} already exists.zOverwrite (y/n)? r   r4   r2   r   r&   rD   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   rI   r(   r   rO   rF   rK   r   r   r   getusersocketgethostnamer   FilePath
setContentr   chmodr   r\   r,   )
rp   rT   KeyTypeMappingkeyTypeNamedefaultPathnewPathynr   r   r"   s
             r   rn   rn   ,  s    $	%PUVVN ,K: =g(()Ck)C)CDD DKDDD
 
 &mmoo<
	w~~gj)** "))'**=>>???&''a5;;==CHJJJ{{?## 	V_ 	;!OPPB!@AABRxx9:::	; {{())1)B388::)N)N%&"";;V%7%9%9;;Ggj)**5512v 	 	
 	
   HWZ %(((gj)F233>>

i99   !))G	
4
;
;GJ<O
P
PQQQ	
4
;
;GJ<O
P
PQQQ	
)
0
01B
C
CDDD	#//'(+
,
,-----r   __main__)+__doc__r   r   r   rF   	functoolsr   impr   twisted.conch.sshr   twisted.pythonr   r   r   r	   unix_getpassr
   	tcgetattr	tcsetattrImportErrorAttributeErrormodulesdictr   r   Optionsr   rV   r\   rM   rq   rt   r~   r   r   rQ   rR   rS   r{   r   rn   r8   r   r   r   <module>r      s  
 
  				  



             " " " " " " 8 8 8 8 8 8 8 8 8 8 8 8
?g***7,,,,(   !%Iw DFF 	 	 	# # # # #U] # # #L  <

 

 


 
 
 u   u   w    y    $  *0I 0I 0If  3 3    ;. ;. ;.| zCEEEEE s   A A43A4