xref: /inferno-os/libkeyring/dsaalg.c (revision ce8e0d607a2bec33fcaac7237d0b5535e5b152a1)
1 #include <lib9.h>
2 #include <kernel.h>
3 #include <isa.h>
4 #include "interp.h"
5 #include "../libinterp/runt.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*
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*
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*
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
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
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
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*
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*
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*
146 dsa_genfrompk(void *vpub)
147 {
148 	return dsagen((DSApub*)vpub);
149 }
150 
151 static void
152 dsa_freepub(void *a)
153 {
154 	dsapubfree((DSApub*)a);
155 }
156 
157 static void
158 dsa_freepriv(void *a)
159 {
160 	dsaprivfree((DSApriv*)a);
161 }
162 
163 static void
164 dsa_freesig(void *a)
165 {
166 	dsasigfree((DSAsig*)a);
167 }
168 
169 static void*
170 dsa_sign(mpint* md, void *key)
171 {
172 	return dsasign((DSApriv*)key, md);
173 }
174 
175 static int
176 dsa_verify(mpint* md, void *sig, void *key)
177 {
178 	return dsaverify((DSApub*)key, (DSAsig*)sig, md) == 0;
179 }
180 
181 SigAlgVec*
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