1 #include <lib9.h>
2 #include <kernel.h>
3 #include <isa.h>
4 #include "interp.h"
5 #include "../libinterp/keyringif.h"
6 #include "mp.h"
7 #include "libsec.h"
8 #include "keys.h"
9
10 static char* pkattr[] = { "p", "q", "alpha", "key", nil };
11 static char* skattr[] = { "p", "q", "alpha", "key", "!secret", nil };
12 static char* sigattr[] = { "r", "s", nil };
13
14 static void*
dsa_str2sk(char * str,char ** strp)15 dsa_str2sk(char *str, char **strp)
16 {
17 DSApriv *dsa;
18 char *p;
19
20 dsa = dsaprivalloc();
21 dsa->pub.p = base64tobig(str, &p);
22 dsa->pub.q = base64tobig(str, &p);
23 dsa->pub.alpha = base64tobig(p, &p);
24 dsa->pub.key = base64tobig(p, &p);
25 dsa->secret = base64tobig(p, &p);
26 if(strp)
27 *strp = p;
28 if(dsa->pub.p == nil || dsa->pub.q == nil ||
29 dsa->pub.alpha == nil || dsa->pub.key == nil || dsa->secret == nil){
30 dsaprivfree(dsa);
31 return nil;
32 }
33 return dsa;
34 }
35
36 static void*
dsa_str2pk(char * str,char ** strp)37 dsa_str2pk(char *str, char **strp)
38 {
39 DSApub *dsa;
40 char *p;
41
42 dsa = dsapuballoc();
43 dsa->p = base64tobig(str, &p);
44 dsa->q = base64tobig(str, &p);
45 dsa->alpha = base64tobig(p, &p);
46 dsa->key = base64tobig(p, &p);
47 if(strp)
48 *strp = p;
49 if(dsa->p == nil || dsa->q == nil || dsa->alpha == nil || dsa->key == nil){
50 dsapubfree(dsa);
51 return nil;
52 }
53 return dsa;
54 }
55
56 static void*
dsa_str2sig(char * str,char ** strp)57 dsa_str2sig(char *str, char **strp)
58 {
59 DSAsig *dsa;
60 char *p;
61
62 dsa = dsasigalloc();
63 dsa->r = base64tobig(str, &p);
64 dsa->s = base64tobig(p, &p);
65 if(strp)
66 *strp = p;
67 if(dsa->r == nil || dsa->s == nil){
68 dsasigfree(dsa);
69 return nil;
70 }
71 return dsa;
72 }
73
74 static int
dsa_sk2str(void * veg,char * buf,int len)75 dsa_sk2str(void *veg, char *buf, int len)
76 {
77 DSApriv *dsa;
78 char *cp, *ep;
79
80 dsa = veg;
81 ep = buf + len - 1;
82 cp = buf;
83
84 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.p);
85 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.q);
86 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.alpha);
87 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.key);
88 cp += snprint(cp, ep - cp, "%U\n", dsa->secret);
89 *cp = 0;
90
91 return cp - buf;
92 }
93
94 static int
dsa_pk2str(void * veg,char * buf,int len)95 dsa_pk2str(void *veg, char *buf, int len)
96 {
97 DSApub *dsa;
98 char *cp, *ep;
99
100 dsa = veg;
101 ep = buf + len - 1;
102 cp = buf;
103
104 cp += snprint(cp, ep - cp, "%U\n", dsa->p);
105 cp += snprint(cp, ep - cp, "%U\n", dsa->q);
106 cp += snprint(cp, ep - cp, "%U\n", dsa->alpha);
107 cp += snprint(cp, ep - cp, "%U\n", dsa->key);
108 *cp = 0;
109
110 return cp - buf;
111 }
112
113 static int
dsa_sig2str(void * veg,char * buf,int len)114 dsa_sig2str(void *veg, char *buf, int len)
115 {
116 DSAsig *dsa;
117 char *cp, *ep;
118
119 dsa = veg;
120 ep = buf + len - 1;
121 cp = buf;
122
123 cp += snprint(cp, ep - cp, "%U\n", dsa->r);
124 cp += snprint(cp, ep - cp, "%U\n", dsa->s);
125 *cp = 0;
126
127 return cp - buf;
128 }
129
130 static void*
dsa_sk2pk(void * vs)131 dsa_sk2pk(void *vs)
132 {
133 return dsaprivtopub((DSApriv*)vs);
134 }
135
136 /* generate a dsa secret key with new params */
137 static void*
dsa_gen(int len)138 dsa_gen(int len)
139 {
140 USED(len);
141 return dsagen(nil);
142 }
143
144 /* generate a dsa secret key with same params as a public key */
145 static void*
dsa_genfrompk(void * vpub)146 dsa_genfrompk(void *vpub)
147 {
148 return dsagen((DSApub*)vpub);
149 }
150
151 static void
dsa_freepub(void * a)152 dsa_freepub(void *a)
153 {
154 dsapubfree((DSApub*)a);
155 }
156
157 static void
dsa_freepriv(void * a)158 dsa_freepriv(void *a)
159 {
160 dsaprivfree((DSApriv*)a);
161 }
162
163 static void
dsa_freesig(void * a)164 dsa_freesig(void *a)
165 {
166 dsasigfree((DSAsig*)a);
167 }
168
169 static void*
dsa_sign(mpint * md,void * key)170 dsa_sign(mpint* md, void *key)
171 {
172 return dsasign((DSApriv*)key, md);
173 }
174
175 static int
dsa_verify(mpint * md,void * sig,void * key)176 dsa_verify(mpint* md, void *sig, void *key)
177 {
178 return dsaverify((DSApub*)key, (DSAsig*)sig, md) == 0;
179 }
180
181 SigAlgVec*
dsainit(void)182 dsainit(void)
183 {
184 SigAlgVec *vec;
185
186 vec = malloc(sizeof(SigAlgVec));
187 if(vec == nil)
188 return nil;
189
190 vec->name = "dsa";
191
192 vec->pkattr = pkattr;
193 vec->skattr = skattr;
194 vec->sigattr = sigattr;
195
196 vec->str2sk = dsa_str2sk;
197 vec->str2pk = dsa_str2pk;
198 vec->str2sig = dsa_str2sig;
199
200 vec->sk2str = dsa_sk2str;
201 vec->pk2str = dsa_pk2str;
202 vec->sig2str = dsa_sig2str;
203
204 vec->sk2pk = dsa_sk2pk;
205
206 vec->gensk = dsa_gen;
207 vec->genskfrompk = dsa_genfrompk;
208 vec->sign = dsa_sign;
209 vec->verify = dsa_verify;
210
211 vec->skfree = dsa_freepriv;
212 vec->pkfree = dsa_freepub;
213 vec->sigfree = dsa_freesig;
214
215 return vec;
216 }
217