| .TH DSA 3 | 
 | .SH NAME | 
 | asn1toDSApriv, dsagen, dsasign, dsaverify, dsapuballoc, dsapubfree, dsaprivalloc, dsaprivfree, dsasigalloc, dsasigfree, dsaprivtopub - digital signature algorithm | 
 | .SH SYNOPSIS | 
 | .B #include <u.h> | 
 | .br | 
 | .B #include <libc.h> | 
 | .br | 
 | .B #include <mp.h> | 
 | .br | 
 | .B #include <libsec.h> | 
 | .PP | 
 | .B | 
 | DSApriv*	dsagen(DSApub *opub) | 
 | .PP | 
 | .B | 
 | DSAsig*	dsasign(DSApriv *k, mpint *m) | 
 | .PP | 
 | .B | 
 | int		dsaverify(DSApub *k, DSAsig *sig, mpint *m) | 
 | .PP | 
 | .B | 
 | DSApub*	dsapuballoc(void) | 
 | .PP | 
 | .B | 
 | void		dsapubfree(DSApub*) | 
 | .PP | 
 | .B | 
 | DSApriv*	dsaprivalloc(void) | 
 | .PP | 
 | .B | 
 | void		dsaprivfree(DSApriv*) | 
 | .PP | 
 | .B | 
 | DSAsig*	dsasigalloc(void) | 
 | .PP | 
 | .B | 
 | void		dsasigfree(DSAsig*) | 
 | .PP | 
 | .B | 
 | DSApub*	dsaprivtopub(DSApriv*) | 
 | .PP | 
 | .B | 
 | DSApriv*	asn1toDSApriv(uchar *priv, int npriv) | 
 | .SH DESCRIPTION | 
 | .PP | 
 | DSA is the NIST approved digital signature algorithm.  The owner of a key publishes | 
 | the public part of the key: | 
 | .EX | 
 | 	struct DSApub | 
 | 	{ | 
 | 		mpint	*p;	// modulus | 
 | 		mpint	*q;	// group order, q divides p-1 | 
 | 		mpint	*alpha;	// group generator | 
 | 		mpint	*key;	// alpha**secret mod p | 
 | 	}; | 
 | .EE | 
 | This part can be used for verifying signatures (with | 
 | .IR dsaverify ) | 
 | created by the owner. | 
 | The owner signs (with | 
 | .IR dsasign ) | 
 | using his private key: | 
 | .EX | 
 | 	struct DSApriv | 
 | 	{ | 
 | 		DSApub	pub; | 
 | 		mpint	*secret; // (decryption key) | 
 | 	}; | 
 | .EE | 
 | .PP | 
 | Keys are generated using | 
 | .IR dsagen . | 
 | If | 
 | .IR dsagen 's | 
 | argument | 
 | .I opub | 
 | is | 
 | .BR nil , | 
 | a key is created using a new | 
 | .B p | 
 | and | 
 | .B q | 
 | generated by | 
 | .IR DSAprimes | 
 | (see | 
 | .IR prime (3)). | 
 | Otherwise, | 
 | .B p | 
 | and | 
 | .B q | 
 | are copied from the old key. | 
 | .PP | 
 | .I Dsaprivtopub | 
 | returns a newly allocated copy of the public key | 
 | corresponding to the private key. | 
 | .PP | 
 | The routines | 
 | .IR dsapuballoc , | 
 | .IR dsapubfree , | 
 | .IR dsaprivalloc , | 
 | and | 
 | .I dsaprivfree | 
 | are provided to manage key storage. | 
 | .PP | 
 | .I Dsasign | 
 | signs message | 
 | .I m | 
 | using a private key | 
 | .I k | 
 | yielding a | 
 | .EX | 
 | 	struct DSAsig | 
 | 	{ | 
 | 		mpint	*r, *s; | 
 | 	}; | 
 | .EE | 
 | .I Dsaverify | 
 | returns 0 if the signature is valid and \-1 if not. | 
 | .PP | 
 | The routines | 
 | .I dsasigalloc | 
 | and | 
 | .I dsasigfree | 
 | are provided to manage signature storage. | 
 | .PP | 
 | .I Asn1toDSApriv | 
 | converts an ASN1 formatted DSA private key into the corresponding | 
 | .B DSApriv | 
 | structure; see  | 
 | .IR rsa (3) | 
 | for other ASN1 routines. | 
 | .SH SOURCE | 
 | .B \*9/src/libsec | 
 | .SH SEE ALSO | 
 | .IR mp (3), | 
 | .IR aes (3), | 
 | .IR blowfish (3), | 
 | .IR des (3), | 
 | .IR rc4 (3), | 
 | .IR rsa (3), | 
 | .IR sechash (3), | 
 | .IR prime (3), | 
 | .IR rand (3) |