1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
5 6e527fbc 2005-02-13 devnull * DSA signing and verification
8 6e527fbc 2005-02-13 devnull * start p=xxx q=xxx alpha=xxx key=xxx
9 6e527fbc 2005-02-13 devnull * write msg
10 6e527fbc 2005-02-13 devnull * read signature(msg)
12 6e527fbc 2005-02-13 devnull * Verify: (not implemented)
13 6e527fbc 2005-02-13 devnull * start p=xxx q=xxx alpha=xxx key=xxx
14 6e527fbc 2005-02-13 devnull * write msg
15 6e527fbc 2005-02-13 devnull * write signature(msg)
16 6e527fbc 2005-02-13 devnull * read ok or fail
18 6e527fbc 2005-02-13 devnull * all numbers are hexadecimal bigints parsable with strtomp.
21 6e527fbc 2005-02-13 devnull static int
22 6e527fbc 2005-02-13 devnull xdsasign(Conv *c)
25 6e527fbc 2005-02-13 devnull mpint *m;
26 ce94dbe6 2005-02-13 devnull uchar digest[SHA1dlen], sigblob[20+20];
27 6e527fbc 2005-02-13 devnull DSAsig *sig;
30 6e527fbc 2005-02-13 devnull k = keylookup("%A", c->attr);
31 6e527fbc 2005-02-13 devnull if(k == nil)
32 6e527fbc 2005-02-13 devnull return -1;
34 6e527fbc 2005-02-13 devnull c->state = "read data";
35 6e527fbc 2005-02-13 devnull if((n=convread(c, digest, SHA1dlen)) < 0){
36 6e527fbc 2005-02-13 devnull keyclose(k);
37 6e527fbc 2005-02-13 devnull return -1;
39 6e527fbc 2005-02-13 devnull m = betomp(digest, SHA1dlen, nil);
40 6e527fbc 2005-02-13 devnull if(m == nil){
41 6e527fbc 2005-02-13 devnull keyclose(k);
42 6e527fbc 2005-02-13 devnull return -1;
44 6e527fbc 2005-02-13 devnull sig = dsasign(k->priv, m);
45 6e527fbc 2005-02-13 devnull keyclose(k);
46 6e527fbc 2005-02-13 devnull mpfree(m);
47 6e527fbc 2005-02-13 devnull if(sig == nil)
48 6e527fbc 2005-02-13 devnull return -1;
49 ce94dbe6 2005-02-13 devnull if(mpsignif(sig->r) > 20*8 || mpsignif(sig->s) > 20*8){
50 ce94dbe6 2005-02-13 devnull werrstr("signature too long");
51 ce94dbe6 2005-02-13 devnull return -1;
53 ce94dbe6 2005-02-13 devnull mptoberjust(sig->r, sigblob, 20);
54 ce94dbe6 2005-02-13 devnull mptoberjust(sig->s, sigblob+20, 20);
55 ce94dbe6 2005-02-13 devnull convwrite(c, sigblob, sizeof sigblob);
56 6e527fbc 2005-02-13 devnull dsasigfree(sig);
57 6e527fbc 2005-02-13 devnull return 0;
61 fa325e9b 2020-01-10 cross * convert to canonical form (lower case)
62 6e527fbc 2005-02-13 devnull * for use in attribute matches.
64 6e527fbc 2005-02-13 devnull static void
65 6e527fbc 2005-02-13 devnull strlwr(char *a)
67 6e527fbc 2005-02-13 devnull for(; *a; a++){
68 6e527fbc 2005-02-13 devnull if('A' <= *a && *a <= 'Z')
69 6e527fbc 2005-02-13 devnull *a += 'a' - 'A';
73 6e527fbc 2005-02-13 devnull static DSApriv*
74 6e527fbc 2005-02-13 devnull readdsapriv(Key *k)
77 6e527fbc 2005-02-13 devnull DSApriv *priv;
79 6e527fbc 2005-02-13 devnull priv = dsaprivalloc();
81 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "p"))==nil
82 6e527fbc 2005-02-13 devnull || (priv->pub.p=strtomp(a, nil, 16, nil))==nil)
83 6e527fbc 2005-02-13 devnull goto Error;
84 6e527fbc 2005-02-13 devnull strlwr(a);
85 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "q"))==nil
86 6e527fbc 2005-02-13 devnull || (priv->pub.q=strtomp(a, nil, 16, nil))==nil)
87 6e527fbc 2005-02-13 devnull goto Error;
88 6e527fbc 2005-02-13 devnull strlwr(a);
89 ddfc031c 2010-03-12 rsc if(!probably_prime(priv->pub.p, 20) && !probably_prime(priv->pub.q, 20)) {
90 ddfc031c 2010-03-12 rsc werrstr("dsa: p or q not prime");
93 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "alpha"))==nil
94 6e527fbc 2005-02-13 devnull || (priv->pub.alpha=strtomp(a, nil, 16, nil))==nil)
95 6e527fbc 2005-02-13 devnull goto Error;
96 6e527fbc 2005-02-13 devnull strlwr(a);
97 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "key"))==nil
98 6e527fbc 2005-02-13 devnull || (priv->pub.key=strtomp(a, nil, 16, nil))==nil)
99 6e527fbc 2005-02-13 devnull goto Error;
100 6e527fbc 2005-02-13 devnull strlwr(a);
101 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!secret"))==nil
102 6e527fbc 2005-02-13 devnull || (priv->secret=strtomp(a, nil, 16, nil))==nil)
103 6e527fbc 2005-02-13 devnull goto Error;
104 6e527fbc 2005-02-13 devnull strlwr(a);
105 6e527fbc 2005-02-13 devnull return priv;
108 6e527fbc 2005-02-13 devnull dsaprivfree(priv);
109 6e527fbc 2005-02-13 devnull return nil;
112 6e527fbc 2005-02-13 devnull static int
113 6e527fbc 2005-02-13 devnull dsacheck(Key *k)
115 6e527fbc 2005-02-13 devnull static int first = 1;
117 6e527fbc 2005-02-13 devnull if(first){
118 6e527fbc 2005-02-13 devnull fmtinstall('B', mpfmt);
119 6e527fbc 2005-02-13 devnull first = 0;
122 6e527fbc 2005-02-13 devnull if((k->priv = readdsapriv(k)) == nil){
123 6e527fbc 2005-02-13 devnull werrstr("malformed key data");
124 6e527fbc 2005-02-13 devnull return -1;
126 6e527fbc 2005-02-13 devnull return 0;
129 6e527fbc 2005-02-13 devnull static void
130 6e527fbc 2005-02-13 devnull dsaclose(Key *k)
132 6e527fbc 2005-02-13 devnull dsaprivfree(k->priv);
133 6e527fbc 2005-02-13 devnull k->priv = nil;
136 6e527fbc 2005-02-13 devnull static Role
137 fa325e9b 2020-01-10 cross dsaroles[] =
139 6e527fbc 2005-02-13 devnull "sign", xdsasign,
143 6e527fbc 2005-02-13 devnull Proto dsa = {
145 6e527fbc 2005-02-13 devnull dsaroles,
147 6e527fbc 2005-02-13 devnull dsacheck,
148 6e527fbc 2005-02-13 devnull dsaclose