5 * DSA signing and verification
8 * start p=xxx q=xxx alpha=xxx key=xxx
12 * Verify: (not implemented)
13 * start p=xxx q=xxx alpha=xxx key=xxx
15 * write signature(msg)
18 * all numbers are hexadecimal bigints parsable with strtomp.
26 uchar digest[SHA1dlen], sigblob[20+20];
30 k = keylookup("%A", c->attr);
34 c->state = "read data";
35 if((n=convread(c, digest, SHA1dlen)) < 0){
39 m = betomp(digest, SHA1dlen, nil);
44 sig = dsasign(k->priv, m);
49 if(mpsignif(sig->r) > 20*8 || mpsignif(sig->s) > 20*8){
50 werrstr("signature too long");
53 mptoberjust(sig->r, sigblob, 20);
54 mptoberjust(sig->s, sigblob+20, 20);
55 convwrite(c, sigblob, sizeof sigblob);
61 * convert to canonical form (lower case)
62 * for use in attribute matches.
68 if('A' <= *a && *a <= 'Z')
79 priv = dsaprivalloc();
81 if((a=strfindattr(k->attr, "p"))==nil
82 || (priv->pub.p=strtomp(a, nil, 16, nil))==nil)
85 if((a=strfindattr(k->attr, "q"))==nil
86 || (priv->pub.q=strtomp(a, nil, 16, nil))==nil)
89 if(!probably_prime(priv->pub.p, 20) && !probably_prime(priv->pub.q, 20)) {
90 werrstr("dsa: p or q not prime");
93 if((a=strfindattr(k->attr, "alpha"))==nil
94 || (priv->pub.alpha=strtomp(a, nil, 16, nil))==nil)
97 if((a=strfindattr(k->attr, "key"))==nil
98 || (priv->pub.key=strtomp(a, nil, 16, nil))==nil)
101 if((a=strfindattr(k->privattr, "!secret"))==nil
102 || (priv->secret=strtomp(a, nil, 16, nil))==nil)
115 static int first = 1;
118 fmtinstall('B', mpfmt);
122 if((k->priv = readdsapriv(k)) == nil){
123 werrstr("malformed key data");
132 dsaprivfree(k->priv);