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