| .TH RSA 1 | 
 | .SH NAME | 
 | dsagen, rsagen, rsafill, asn12dsa, asn12rsa, dsa2pub, rsa2csr, rsa2pub, dsa2ssh, rsa2ssh, rsa2x509 \- generate and format dsa and rsa keys | 
 | .SH SYNOPSIS | 
 | .PP | 
 | .B dsagen | 
 | [ | 
 | .B -t | 
 | .I tag | 
 | ] | 
 | .PP | 
 | .B rsagen | 
 | [ | 
 | .B -b | 
 | .I nbits | 
 | ] | 
 | [ | 
 | .B -t | 
 | .I tag | 
 | ] | 
 | .PP | 
 | .B rsafill | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B asn12dsa | 
 | [ | 
 | .B -t | 
 | .I tag | 
 | ] | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B asn12rsa | 
 | [ | 
 | .B -t | 
 | .I tag | 
 | ] | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B dsa2pub | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B rsa2pub | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B dsa2ssh | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B rsa2ssh | 
 | [ | 
 | .B -2 | 
 | ] | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B rsa2x509 | 
 | [ | 
 | .B -e | 
 | .I expiretime | 
 | ] | 
 | .I certinfo | 
 | [ | 
 | .I file | 
 | ] | 
 | .PP | 
 | .B rsa2csr | 
 | .I certinfo | 
 | [ | 
 | .I file | 
 | ] | 
 | .SH DESCRIPTION | 
 | Plan 9 represents DSA and RSA keys as attribute-value pair lists | 
 | prefixed with the string | 
 | .BR key ; | 
 | this is the generic key format used by | 
 | .IR factotum (4). | 
 | A full DSA private key has the following attributes: | 
 | .TP | 
 | .B proto | 
 | must be | 
 | .B dsa | 
 | .TP | 
 | .B p | 
 | prime public modulus | 
 | .TP | 
 | .B q | 
 | prime group order; divides | 
 | .BR p -1 | 
 | .TP | 
 | .B alpha | 
 | group generator | 
 | .TP | 
 | .B key | 
 | .BR alpha ^ !secret | 
 | mod | 
 | .B p | 
 | .TP | 
 | .B !secret | 
 | the secret exponent | 
 | .PD | 
 | .PP | 
 | A full RSA private key has the following attributes: | 
 | .TP | 
 | .B proto | 
 | must be | 
 | .B rsa | 
 | .TP | 
 | .B size | 
 | the number of significant bits in | 
 | .B n | 
 | .TP | 
 | .B ek | 
 | the encryption exponent | 
 | .TP | 
 | .B n | 
 | the product of | 
 | .B !p | 
 | and | 
 | .B !q | 
 | .TP | 
 | .B !dk | 
 | the decryption exponent | 
 | .TP | 
 | .B !p | 
 | a large prime | 
 | .TP | 
 | .B !q | 
 | another large prime | 
 | .TP | 
 | .B "!kp\fR, \fL!kq\fR, \fL!c2 | 
 | parameters derived from the other attributes, cached to speed decryption | 
 | .PD | 
 | .LP | 
 | All the numbers in both keys are in hexadecimal except RSA's | 
 | .I size , | 
 | which is decimal. | 
 | A public key omits the attributes beginning with | 
 | .L ! . | 
 | A key may have other attributes as well (for example, a | 
 | .B service | 
 | attribute identifying how this key is typically used), | 
 | but to these utilities such attributes are merely comments. | 
 | .PP | 
 | For example, a very small (and thus insecure) private key and corresponding | 
 | public key might be: | 
 | .IP | 
 | .EX | 
 | key proto=rsa size=8 ek=7 n=8F !dk=67 !p=B !q=D !kp=3 !kq=7 !c2=6 | 
 | key proto=rsa size=8 ek=7 n=8F | 
 | .EE | 
 | .LP | 
 | Note that the order of the attributes does not matter. | 
 | .PP | 
 | .I Dsagen | 
 | prints a randomly generated DSA private key using the  | 
 | NIST-recommended algorithm. | 
 | If | 
 | .I tag | 
 | is specified, it is printed between | 
 | .B key | 
 | and | 
 | .BR proto=dsa ; | 
 | typically, | 
 | .I tag | 
 | is a sequence of attribute-value comments describing the key. | 
 | .PP | 
 | .I Rsagen | 
 | prints a randomly generated RSA private key | 
 | whose | 
 | .B n | 
 | has exactly | 
 | .I nbits | 
 | (default 1024) | 
 | significant bits. | 
 | .PP | 
 | .I Rsafill | 
 | reads a private key, | 
 | recomputes the | 
 | .BR !kp , | 
 | .BR !kq , | 
 | and | 
 | .BR !c2 | 
 | attributes if they are missing, | 
 | and prints a full key. | 
 | .PP | 
 | .I Asn12dsa | 
 | reads an DSA private key stored as ASN.1 | 
 | encoded in the binary Distinguished Encoding Rules (DER) | 
 | and prints a Plan 9 DSA key, | 
 | inserting | 
 | .I tag | 
 | exactly as | 
 | .I dsagen | 
 | does. | 
 | ASN.1/DER is a popular key format on Unix and Windows; | 
 | it is often encoded in text form using the Privacy Enhanced Mail (PEM) format | 
 | in a section labeled as an | 
 | .RB `` DSA | 
 | .B PRIVATE | 
 | .BR KEY .'' | 
 | The command: | 
 | .IP | 
 | .EX | 
 | pemdecode 'DSA PRIVATE KEY' | asn12dsa | 
 | .EE | 
 | .LP | 
 | extracts the key section from a textual ASN.1/DER/PEM key | 
 | into binary ASN.1/DER format and then | 
 | converts it to a Plan 9 DSA key. | 
 | .PP | 
 | .I Asn12rsa | 
 | is similar but operates on RSA keys. | 
 | .PP | 
 | .I Dsa2pub | 
 | reads a Plan 9 DSA public or private key, | 
 | removes the private attributes, and prints the resulting public key. | 
 | Comment attribtes are preserved. | 
 | .PP | 
 | .I Rsa2pub | 
 | is similar but operates on RSA keys. | 
 | .PP | 
 | .I Dsa2ssh | 
 | reads a Plan 9 DSA public or private key and prints the  | 
 | public portion in the format used by SSH version 2 (version 1 did not support DSA). | 
 | If the key has a  | 
 | .B comment | 
 | attribute, that comment is appended to the key. | 
 | .PP | 
 | .I Rsa2ssh | 
 | is similar but operates on RSA keys. | 
 | It decides whether to print in version 1 or version 2  | 
 | format by inspecting the | 
 | .B service | 
 | attribute. | 
 | .PP | 
 | .I Dsa2ssh | 
 | and | 
 | .I rsa2ssh | 
 | are useful for generating SSH's  | 
 | .B authorized_keys | 
 | file. | 
 | .PP | 
 | .I Rsa2x509 | 
 | reads a Plan 9 RSA private key and writes a self-signed X.509 certificate | 
 | encoded in ASN.1/DER format to standard output. | 
 | (Note that ASN.1/DER X.509 certificates are different from ASN.1/DER private keys). | 
 | The certificate uses the current time as its start time and expires | 
 | .I expiretime | 
 | seconds | 
 | (default 3 years) | 
 | later. | 
 | It contains the public half of the key | 
 | and includes | 
 | .I certinfo | 
 | as the issuer/subject string (also known as a ``Distinguished Name''). | 
 | This info is typically in the form: | 
 | .IP | 
 | .EX | 
 | C=US ST=NJ L=07974 O=Lucent OU='Bell Labs' CN=G.R.Emlin | 
 | .EE | 
 | .LP | 
 | The X.509 ASN.1/DER format is often encoded in text using a PEM section | 
 | labeled as a | 
 | .RB `` CERTIFICATE .'' | 
 | The command: | 
 | .IP | 
 | .EX | 
 | rsa2x509 'C=US OU=''Bell Labs''' file | | 
 | pemencode CERTIFICATE | 
 | .EE | 
 | .LP | 
 | generates such a textual certificate. | 
 | Applications that serve TLS-encrypted sessions | 
 | typically expect certificates in ASN.1/DER/PEM format. | 
 | .PP | 
 | .I Rsa2csr | 
 | is like | 
 | .I rsa2x509 | 
 | but writes an X.509 certificate request. | 
 | .SH EXAMPLES | 
 | Generate a fresh key and use it to start the Plan 9 TLS-enabled web server: | 
 | .IP | 
 | .EX | 
 | rsagen -t 'service=tls owner=*' >key | 
 | rsa2x509 'C=US CN=*.cs.bell-labs.com' key | | 
 | 	pemencode CERTIFICATE >cert | 
 | cat key >/mnt/factotum/ctl | 
 | ip/httpd/httpd -c cert | 
 | .EE | 
 | .PP | 
 | Generate a fresh set of SSH keys (only one is necessary), | 
 | load them into factotum, | 
 | and configure a remote Unix system to allow those keys for logins: | 
 | .IP | 
 | .EX | 
 | rsagen -t 'service=ssh role=decrypt' >rsa1 | 
 | rsagen -t 'service=ssh-rsa role=sign' >rsa2 | 
 | dsagen -t 'service=ssh-dss role=sign' >dsa2 | 
 | .EE | 
 | .PP | 
 | Convert existing Unix SSH version 2 keys instead of generating new ones: | 
 | .IP | 
 | .EX | 
 | cd $HOME/.ssh | 
 | pemdecode 'DSA PRIVATE KEY' id_dsa | asn12dsa >dsa2 | 
 | pemdecode 'RSA PRIVATE KEY' id_rsa | asn12rsa >rsa2 | 
 | .EE | 
 | .PP | 
 | Load those keys into factotum: | 
 | .IP | 
 | .EX | 
 | cat rsa1 rsa2 dsa2 | 9p write -l factotum/ctl | 
 | .EE | 
 | Allow use of those keys for logins on other systems: | 
 | .IP | 
 | .EX | 
 | rsa2ssh rsa1 >auth.keys | 
 | rsa2ssh rsa2 >>auth.keys | 
 | dsa2ssh dsa2 >>auth.keys | 
 | scp auth.keys unix:.ssh/authorized_keys | 
 | .EE | 
 | .SH SOURCE | 
 | .B \*9/src/cmd/auth | 
 | .SH "SEE ALSO | 
 | .IR factotum (4), | 
 | .IR pem (1), | 
 | .IR ssh (1) | 
 | .SH BUGS | 
 | There are too many key formats. | 
 | .PP | 
 | There is no program to convert SSH version 1 RSA private keys. |