#include <libc.h>
#include <mp.h>
#include <libsec.h>
DSApriv* dsagen(DSApub *opub)
DSAsig* dsasign(DSApriv *k, mpint *m)
int dsaverify(DSApub *k, DSAsig *sig, mpint *m)
DSApub* dsapuballoc(void)
void dsapubfree(DSApub*)
DSApriv* dsaprivalloc(void)
void dsaprivfree(DSApriv*)
DSAsig* dsasigalloc(void)
void dsasigfree(DSAsig*)
DSApub* dsaprivtopub(DSApriv*)
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 };This part can be used for verifying signatures (with dsaverify ) created by the owner. The owner signs (with dsasign ) using his private key:
.EX struct DSApriv { DSApub pub; mpint *secret; // (decryption key) };Keys are generated using dsagen . If dsagen 's argument opub is nil , a key is created using a new p and q generated by DSAprimes (see prime (2)). Otherwise, p and q are copied from the old key.
Dsaprivtopub returns a newly allocated copy of the public key corresponding to the private key.
The routines dsapuballoc , dsapubfree , dsaprivalloc , and dsaprivfree are provided to manage key storage.
Dsasign signs message m using a private key k yielding a
.EX struct DSAsig { mpint *r, *s; };Dsaverify returns 0 if the signature is valid and -1 if not.
The routines dsasigalloc and dsasigfree are provided to manage signature storage.