|  | .TH RSA 3 | 
|  | .SH NAME | 
|  | asn1dump, | 
|  | asn1toRSApriv, | 
|  | decodepem, | 
|  | decodepemchain, | 
|  | rsadecrypt, | 
|  | rsaencrypt, | 
|  | rsafill,, | 
|  | rsagen, | 
|  | rsaprivalloc, | 
|  | rsaprivfree, | 
|  | rsaprivtopub, | 
|  | rsapuballoc, | 
|  | rsapubfree, | 
|  | X509toRSApub, | 
|  | X509dump, | 
|  | X509gen, | 
|  | X509req, | 
|  | X509verify \- RSA encryption algorithm | 
|  | .SH SYNOPSIS | 
|  | .B #include <u.h> | 
|  | .br | 
|  | .B #include <libc.h> | 
|  | .br | 
|  | .B #include <mp.h> | 
|  | .br | 
|  | .B #include <libsec.h> | 
|  | .PP | 
|  | .B | 
|  | .ta +\w'\fLPEMChain* 'u | 
|  | RSApriv*	rsagen(int nlen, int elen, int nrep) | 
|  | .PP | 
|  | .B | 
|  | RSApriv*	rsafill(mpint *n, mpint *ek, mpint *dk, mpint *p, mpint *q) | 
|  | .PP | 
|  | .B | 
|  | mpint*	rsaencrypt(RSApub *k, mpint *in, mpint *out) | 
|  | .PP | 
|  | .B | 
|  | mpint*	rsadecrypt(RSApriv *k, mpint *in, mpint *out) | 
|  | .PP | 
|  | .B | 
|  | RSApub*	rsapuballoc(void) | 
|  | .PP | 
|  | .B | 
|  | void	rsapubfree(RSApub*) | 
|  | .PP | 
|  | .B | 
|  | RSApriv*	rsaprivalloc(void) | 
|  | .PP | 
|  | .B | 
|  | void	rsaprivfree(RSApriv*) | 
|  | .PP | 
|  | .B | 
|  | RSApub*	rsaprivtopub(RSApriv*) | 
|  | .PP | 
|  | .B | 
|  | RSApub*	X509toRSApub(uchar *cert, int ncert, char *name, int nname) | 
|  | .PP | 
|  | .B | 
|  | RSApriv*	asn1toRSApriv(uchar *priv, int npriv) | 
|  | .PP | 
|  | .B | 
|  | void		asn1dump(uchar *der, int len) | 
|  | .PP | 
|  | .B | 
|  | uchar*	decodepem(char *s, char *type, int *len) | 
|  | .PP | 
|  | .B | 
|  | PEMChain*	decodepemchain(char *s, char *type) | 
|  | .PP | 
|  | .B | 
|  | void	X509dump(uchar *cert, int ncert) | 
|  | .PP | 
|  | .B | 
|  | uchar*	X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen); | 
|  | .PP | 
|  | .B | 
|  | uchar*	X509req(RSApriv *priv, char *subj, int *certlen); | 
|  | .PP | 
|  | .B | 
|  | char* X509verify(uchar *cert, int ncert, RSApub *pk) | 
|  | .SH DESCRIPTION | 
|  | .PP | 
|  | RSA is a public key encryption algorithm.  The owner of a key publishes | 
|  | the public part of the key: | 
|  | .EX | 
|  | struct RSApub | 
|  | { | 
|  | mpint	*n;	// modulus | 
|  | mpint	*ek;	// exp (encryption key) | 
|  | }; | 
|  | .EE | 
|  | This part can be used for encrypting data (with | 
|  | .IR rsaencrypt ) | 
|  | to be sent to the owner. | 
|  | The owner decrypts (with | 
|  | .IR rsadecrypt ) | 
|  | using his private key: | 
|  | .EX | 
|  | struct RSApriv | 
|  | { | 
|  | RSApub	pub; | 
|  | mpint	*dk;	// exp (decryption key) | 
|  |  | 
|  | // precomputed crt values | 
|  | mpint	*p; | 
|  | mpint	*q; | 
|  | mpint	*kp;	// k mod p-1 | 
|  | mpint	*kq;	// k mod q-1 | 
|  | mpint	*c2;	// for converting residues to number | 
|  | }; | 
|  | .EE | 
|  | .PP | 
|  | Keys are generated using | 
|  | .IR rsagen . | 
|  | .I Rsagen | 
|  | takes both bit length of the modulus, the bit length of the | 
|  | public key exponent, and the number of repetitions of the Miller-Rabin | 
|  | primality test to run.  If the latter is 0, it does the default number | 
|  | of rounds. | 
|  | .I Rsagen | 
|  | returns a newly allocated structure containing both | 
|  | public and private keys. | 
|  | .I Rsaprivtopub | 
|  | returns a newly allocated copy of the public key | 
|  | corresponding to the private key. | 
|  | .PP | 
|  | .I Rsafill | 
|  | takes as input the bare minimum pieces of an RSA private key | 
|  | and computes the rest | 
|  | .RB ( kp , | 
|  | .BR kq , | 
|  | and | 
|  | .BR c2 ). | 
|  | It returns a new private key. | 
|  | All the | 
|  | .BR mpint s | 
|  | in the key, | 
|  | even the ones that correspond directly to | 
|  | .IR rsafill 's | 
|  | input parameters, | 
|  | are freshly allocated, | 
|  | .PP | 
|  | The routines | 
|  | .IR rsaalloc , | 
|  | .IR rsafree , | 
|  | .IR rsapuballoc , | 
|  | .IR rsapubfree , | 
|  | .IR rsaprivalloc , | 
|  | and | 
|  | .I rsaprivfree | 
|  | are provided to aid in user provided key I/O. | 
|  | .PP | 
|  | Given a binary X.509 | 
|  | .IR cert , | 
|  | the routine | 
|  | .I X509toRSApub | 
|  | returns the public key and, if | 
|  | .I name | 
|  | is not nil, the CN part of the Distinguished Name of the | 
|  | certificate's Subject. | 
|  | (This is conventionally a userid or a host DNS name.) | 
|  | No verification is done of the certificate signature;  the | 
|  | caller should check the fingerprint, | 
|  | .IR sha1(cert) , | 
|  | against a table or check the certificate by other means. | 
|  | X.509 certificates are often stored in PEM format; use | 
|  | .I dec64 | 
|  | to convert to binary before computing the fingerprint or calling | 
|  | .IR X509toRSApub . | 
|  | For the special case of | 
|  | certificates signed by a known trusted key | 
|  | (in a single step, without certificate chains) | 
|  | .I X509verify | 
|  | checks the signature on | 
|  | .IR cert . | 
|  | It returns nil if successful, else an error string. | 
|  | .PP | 
|  | .I X509dump | 
|  | prints an X.509 certificate to standard ouptut. | 
|  | .PP | 
|  | .I X509gen | 
|  | creates a self-signed X.509 certificate, given an RSA keypair | 
|  | .IR priv , | 
|  | a issuer/subject string | 
|  | .IR subj , | 
|  | and the starting and ending validity dates, | 
|  | .IR valid . | 
|  | Length of the allocated binary certificate is stored in | 
|  | .IR certlen . | 
|  | The subject line is conventionally of the form | 
|  | .EX | 
|  | "C=US ST=NJ L=07922 O=Lucent OU='Bell Labs' CN=Eric" | 
|  | .EE | 
|  | using the quoting conventions of | 
|  | .I tokenize | 
|  | (see | 
|  | .IR getfields (3)). | 
|  | .PP | 
|  | .I X509req | 
|  | creates an X.509 certification request. | 
|  | .PP | 
|  | .I Asn1toRSApriv | 
|  | converts an ASN1 formatted RSA private key into the corresponding | 
|  | .B RSApriv | 
|  | structure. | 
|  | .PP | 
|  | .I Asn1dump | 
|  | prints an ASN1 object to standard output. | 
|  | .PP | 
|  | .I Decodepem | 
|  | takes a zero terminated string, | 
|  | .IR s , | 
|  | and decodes the PEM (privacy-enhanced mail) formatted section for | 
|  | .I type | 
|  | within it. | 
|  | If successful, it returns the decoded section and sets | 
|  | .BI * len | 
|  | to its decoded length. | 
|  | If not, it returns | 
|  | .BR nil , | 
|  | and | 
|  | .BI * len | 
|  | is undefined. | 
|  | .PP | 
|  | .I Decodepemchain | 
|  | is similar but expects a sequence of PEM-formatted sections | 
|  | and returns a linked list of the decodings: | 
|  | .IP | 
|  | .EX | 
|  | typedef struct PEMChain PEMChain | 
|  | struct PEMChain | 
|  | { | 
|  | PEMChain *next; | 
|  | uchar *pem; | 
|  | int pemlen; | 
|  | }; | 
|  | .EE | 
|  | .SH SOURCE | 
|  | .B \*9/src/libsec | 
|  | .SH SEE ALSO | 
|  | .IR mp (3), | 
|  | .IR aes (3), | 
|  | .IR blowfish (3), | 
|  | .IR des (3), | 
|  | .IR dsa (3), | 
|  | .IR elgamal (3), | 
|  | .IR rc4 (3), | 
|  | .IR sechash (3), | 
|  | .IR prime (3), | 
|  | .IR rand (3) | 
|  | .\" .IR pem (8) |