Blame


1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
3 6e527fbc 2005-02-13 devnull
4 6e527fbc 2005-02-13 devnull /*
5 6e527fbc 2005-02-13 devnull * DSA signing and verification
6 fa325e9b 2020-01-10 cross *
7 6e527fbc 2005-02-13 devnull * Sign:
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)
11 6e527fbc 2005-02-13 devnull *
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
17 fa325e9b 2020-01-10 cross *
18 6e527fbc 2005-02-13 devnull * all numbers are hexadecimal bigints parsable with strtomp.
19 6e527fbc 2005-02-13 devnull */
20 fa325e9b 2020-01-10 cross
21 6e527fbc 2005-02-13 devnull static int
22 6e527fbc 2005-02-13 devnull xdsasign(Conv *c)
23 6e527fbc 2005-02-13 devnull {
24 6e527fbc 2005-02-13 devnull int n;
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;
28 6e527fbc 2005-02-13 devnull Key *k;
29 6e527fbc 2005-02-13 devnull
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;
33 6e527fbc 2005-02-13 devnull
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;
38 6e527fbc 2005-02-13 devnull }
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;
43 6e527fbc 2005-02-13 devnull }
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;
52 ce94dbe6 2005-02-13 devnull }
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;
58 6e527fbc 2005-02-13 devnull }
59 6e527fbc 2005-02-13 devnull
60 6e527fbc 2005-02-13 devnull /*
61 fa325e9b 2020-01-10 cross * convert to canonical form (lower case)
62 6e527fbc 2005-02-13 devnull * for use in attribute matches.
63 6e527fbc 2005-02-13 devnull */
64 6e527fbc 2005-02-13 devnull static void
65 6e527fbc 2005-02-13 devnull strlwr(char *a)
66 6e527fbc 2005-02-13 devnull {
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';
70 6e527fbc 2005-02-13 devnull }
71 6e527fbc 2005-02-13 devnull }
72 6e527fbc 2005-02-13 devnull
73 6e527fbc 2005-02-13 devnull static DSApriv*
74 6e527fbc 2005-02-13 devnull readdsapriv(Key *k)
75 6e527fbc 2005-02-13 devnull {
76 6e527fbc 2005-02-13 devnull char *a;
77 6e527fbc 2005-02-13 devnull DSApriv *priv;
78 6e527fbc 2005-02-13 devnull
79 6e527fbc 2005-02-13 devnull priv = dsaprivalloc();
80 6e527fbc 2005-02-13 devnull
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");
91 ddfc031c 2010-03-12 rsc goto Error;
92 ddfc031c 2010-03-12 rsc }
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;
106 6e527fbc 2005-02-13 devnull
107 6e527fbc 2005-02-13 devnull Error:
108 6e527fbc 2005-02-13 devnull dsaprivfree(priv);
109 6e527fbc 2005-02-13 devnull return nil;
110 6e527fbc 2005-02-13 devnull }
111 6e527fbc 2005-02-13 devnull
112 6e527fbc 2005-02-13 devnull static int
113 6e527fbc 2005-02-13 devnull dsacheck(Key *k)
114 6e527fbc 2005-02-13 devnull {
115 6e527fbc 2005-02-13 devnull static int first = 1;
116 fa325e9b 2020-01-10 cross
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;
120 6e527fbc 2005-02-13 devnull }
121 6e527fbc 2005-02-13 devnull
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;
125 6e527fbc 2005-02-13 devnull }
126 6e527fbc 2005-02-13 devnull return 0;
127 6e527fbc 2005-02-13 devnull }
128 6e527fbc 2005-02-13 devnull
129 6e527fbc 2005-02-13 devnull static void
130 6e527fbc 2005-02-13 devnull dsaclose(Key *k)
131 6e527fbc 2005-02-13 devnull {
132 6e527fbc 2005-02-13 devnull dsaprivfree(k->priv);
133 6e527fbc 2005-02-13 devnull k->priv = nil;
134 6e527fbc 2005-02-13 devnull }
135 6e527fbc 2005-02-13 devnull
136 6e527fbc 2005-02-13 devnull static Role
137 fa325e9b 2020-01-10 cross dsaroles[] =
138 6e527fbc 2005-02-13 devnull {
139 6e527fbc 2005-02-13 devnull "sign", xdsasign,
140 6e527fbc 2005-02-13 devnull 0
141 6e527fbc 2005-02-13 devnull };
142 6e527fbc 2005-02-13 devnull
143 6e527fbc 2005-02-13 devnull Proto dsa = {
144 6e527fbc 2005-02-13 devnull "dsa",
145 6e527fbc 2005-02-13 devnull dsaroles,
146 6e527fbc 2005-02-13 devnull nil,
147 6e527fbc 2005-02-13 devnull dsacheck,
148 6e527fbc 2005-02-13 devnull dsaclose
149 6e527fbc 2005-02-13 devnull };