o b1- @svdZddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZejejkrWz ddlZejejfWneefyVdejd<eeYnweZdd ZGd d d ejZd d ZddZddZedddZedddZ edddZ!edddZ"ddZ#d d!Z$d"d#Z%d$d%Z&d&e'd'e'fd(d)Z(d*d+Z)e*d,kredSdS)-z2 Implementation module for the `ckeygen` command. N)wraps)reload)keys)failurefilepathlogusagetermioscsfdd}|S)Ncs tfdd}|t<|S)Ncs|i|S)N)argskwargs keygeneratorr ?/usr/lib/python3/dist-packages/twisted/conch/scripts/ckeygen.pywrapper"sz:_keyGenerator..assignkeygenerator..wrapper)rsupportedKeyTypes)rrkeyTyper rassignkeygenerator!sz)_keyGenerator..assignkeygeneratorr )rrr rr _keyGenerator s rc @seZdZdZdZgdgdgdgdgdgdgd gd gZgd gd gd gdgdgZeje e e e ddgddZ dS)GeneralOptionszUsage: ckeygen [options] z8ckeygen manipulates public/private keys in various ways.)bitsbNz$Number of bits in the key to create.)filenamefNzFilename of the key file.)typetNzSpecify type of key to create.)commentCNzProvide new comment.)newpassNNzProvide new passphrase.)passPNzProvide old passphrase.)formato sha256-base64zFingerprint format of key file.)private-key-subtypeNNz5OpenSSH private key subtype to write ("PEM" or "v1").) fingerprintlzShow fingerprint of key file.) changepasspz&Change passphrase of private key file.)quietqzQuiet.) no-passphraseNz"Create the key with no passphrase.)showpubyz+Read private key file and print public key.PEMv1)rr&) optActionsN)__name__ __module__ __qualname__synopsislongdesc optParametersoptFlagsr Completions CompleteListlistrrcompDatar r r rr,s.  rc Cs(t}z |tjddWn"tjy1}ztd||tdWYd}~nd}~wwt t t _ |drk|d tvrYtd|dt|d |dStd|ddtfdS|drut|dS|drt|dS|d rt|dS|tddS) Nz ERROR: %srz&Generating public/private %s key pair.z"Key type was %s, must be one of %sz, r'r)r.)r parseOptionssysargvr UsageErrorprintopt_helpexitr discardLogs handleErrordeferrlowerrjoinrprintFingerprintchangePassPhrasedisplayPublicKey)optionsur r rrunRs8    rPcCsL|ddkrtjj|d<|S|ddkrtjj|d<|Std|d)Nr#zmd5-hexr%z"Unsupported fingerprint format: {})rFingerprintFormatsMD5_HEX SHA256_BASE64BadFingerPrintFormatr#)rNr r renumrepresentationps     rUcCsdatt)N) exitStatusrerrrFailurer r r rrG}srGrsacCsZddlm}ddlm}|dsd|d<|jt|dd|d}t|}t||dS)Nrdefault_backend)rZri)key_sizepublic_exponentbackend) cryptography.hazmat.backendsr\)cryptography.hazmat.primitives.asymmetricrZgenerate_private_keyintrKey_saveKey)rNr\rZ keyPrimitivekeyr r rgenerateRSAkeys    ridsacCsXddlm}ddlm}|dsd|d<|jt|d|d}t|}t||dS)Nrr[)rjrr])r^r`) rar\rbrjrcrdrrerf)rNr\rjrgrhr r rgenerateDSAkeys    rkecdsacCslddlm}ddlm}|dsd|d<dt|dd}|jtj||d}t |}t ||dS) Nrr[)ecrsecdsa-sha2-nistpascii)curver`) rar\rbrmstrencodercr _curveTablererf)rNr\rmrprgrhr r rgenerateECDSAkeys    rted25519cCs.ddlm}|j}t|}t||dS)Nr)ru)rbruEd25519PrivateKeygeneraterrerf)rNrurgrhr r rgenerateEd25519keys   rxcCs|dkrdSdS)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'}). Ed25519r1r0r rr r r_defaultPrivateKeySubtypes rzcCs|dstjd}td||d<tj|ddr$|dd7<t|}z!tj|d}t d| | |dtj |dfWdStj yYtdYdSw)Nr ~/.ssh/id_rsa%Enter file in which the key is (%s): .pubz%s %s %sr#zbad key)ospath expanduserinputexistsrUrrefromFilerCsizer'basename BadKeyErrorr@rE)rNrrhr r rrKs&   rKc CsT|dstjd}td||d<z tj|d}Wnhtjyj|ds0t d|d<ztjj|d|dd}Wn)tj yMt dYntjyg}zt d|WYd}~nd}~wwYntj y}zt d|WYd}~nd}~ww|d s t d }t d }||krnt d q||d <|ddurt||d<z|jd|d|d d}Wnty}zt d|WYd}~nd}~wwz tjj||d dWntjtj fy}zt d|WYd}~nd}~wwt|dd }||Wdn 1swYt ddS)Nrr{r|r!zEnter old passphrase:  passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: rr>z0Enter new passphrase (empty for no passphrase): Enter same passphrase again: %Passphrases do not match. Try again.r&opensshsubtyperwbz;Your identification has been saved with the new passphrase.)r~rrrrrerEncryptedKeyErrorgetgetpassrr@rErCrzrtoString Exception fromStringopenwrite)rNrrhep1p2 newkeydatafdr r rrLsh        rLcCs|dstjd}td||d<z tj|d}Wn"tjy>|ds0t d|d<tjj|d|dd}Ynw| d d}t |dS) Nrr{r|r!zEnter passphrase: rrro)r~rrrrrerrrrpublicrdecoderC)rNrrh displayKeyr r rrMs   rMpromptreturncCst|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)rr r r_inputSaveFile%src Csddddd}||}|ds*tjd|}td|d }|p'||d<tj|drKtd |dt d }|d  d krKt | drUd|d<n|dsr td}td}||krintdqZ||d<| ddurt||d<tdt} t|d|jd|d|ddt|ddt|dd|jd| dt|}td|dtd|dtd|d t||d dS)!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} rlrurZrj)ECryRSADSArz ~/.ssh/id_z%Enter file in which to save the key (z): z{} already exists.zOverwrite (y/n)? rr/r-r!r>z,Enter passphrase (empty for no passphrase): rrr&N@rrir})rz(Your identification has been saved in {}z(Your public key has been saved in {}.pubzThe key fingerprint in {} is:r#)rr~rrrstriprrCr#rrIr@rErrrzgetusersocket gethostnamerFilePath setContentrchmodrrUr') rhrNKeyTypeMapping keyTypeName defaultPathnewPathynrrrr r rrf.sV      rf__main__)+__doc__rr~rr@ functoolsrimprtwisted.conch.sshrtwisted.pythonrrrr unix_getpassr tcgetattr tcsetattr ImportErrorAttributeErrormodulesdictrrOptionsrrPrUrGrirkrtrxrzrKrLrMrqrrfr3r r r rsP       &     3 >