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 * RSA authentication.
6 fa325e9b 2020-01-10 cross *
7 ce94dbe6 2005-02-13 devnull * Encrypt/Decrypt:
8 6e527fbc 2005-02-13 devnull * start n=xxx ek=xxx
9 6e527fbc 2005-02-13 devnull * write msg
10 ce94dbe6 2005-02-13 devnull * read encrypt/decrypt(msg)
11 6e527fbc 2005-02-13 devnull *
12 6e527fbc 2005-02-13 devnull * Sign (PKCS #1 using hash=sha1 or hash=md5)
13 6e527fbc 2005-02-13 devnull * start n=xxx ek=xxx
14 6e527fbc 2005-02-13 devnull * write hash(msg)
15 6e527fbc 2005-02-13 devnull * read signature(hash(msg))
16 fa325e9b 2020-01-10 cross *
17 ce94dbe6 2005-02-13 devnull * Verify:
18 ce94dbe6 2005-02-13 devnull * start n=xxx ek=xxx
19 ce94dbe6 2005-02-13 devnull * write hash(msg)
20 ce94dbe6 2005-02-13 devnull * write signature(hash(msg))
21 ce94dbe6 2005-02-13 devnull * read ok or fail
22 ce94dbe6 2005-02-13 devnull *
23 6e527fbc 2005-02-13 devnull * all numbers are hexadecimal biginits parsable with strtomp.
24 6e527fbc 2005-02-13 devnull * must be lower case for attribute matching in start.
25 6e527fbc 2005-02-13 devnull */
26 6e527fbc 2005-02-13 devnull
27 6e527fbc 2005-02-13 devnull static int
28 ce94dbe6 2005-02-13 devnull xrsadecrypt(Conv *c)
29 6e527fbc 2005-02-13 devnull {
30 ce94dbe6 2005-02-13 devnull char *txt, buf[4096], *role;
31 ce94dbe6 2005-02-13 devnull int n, ret;
32 ce94dbe6 2005-02-13 devnull mpint *m, *mm;
33 6e527fbc 2005-02-13 devnull Key *k;
34 ce94dbe6 2005-02-13 devnull RSApriv *key;
35 6e527fbc 2005-02-13 devnull
36 ce94dbe6 2005-02-13 devnull ret = -1;
37 ce94dbe6 2005-02-13 devnull txt = nil;
38 ce94dbe6 2005-02-13 devnull m = nil;
39 ce94dbe6 2005-02-13 devnull mm = nil;
40 ce94dbe6 2005-02-13 devnull
41 ce94dbe6 2005-02-13 devnull /* fetch key */
42 ce94dbe6 2005-02-13 devnull c->state = "keylookup";
43 6e527fbc 2005-02-13 devnull k = keylookup("%A", c->attr);
44 6e527fbc 2005-02-13 devnull if(k == nil)
45 ce94dbe6 2005-02-13 devnull goto out;
46 ce94dbe6 2005-02-13 devnull key = k->priv;
47 fa325e9b 2020-01-10 cross
48 ce94dbe6 2005-02-13 devnull /* make sure have private half if needed */
49 ce94dbe6 2005-02-13 devnull role = strfindattr(c->attr, "role");
50 ce94dbe6 2005-02-13 devnull if(strcmp(role, "decrypt") == 0 && !key->c2){
51 ce94dbe6 2005-02-13 devnull werrstr("missing private half of key -- cannot decrypt");
52 ce94dbe6 2005-02-13 devnull goto out;
53 6e527fbc 2005-02-13 devnull }
54 fa325e9b 2020-01-10 cross
55 ce94dbe6 2005-02-13 devnull /* read text */
56 ce94dbe6 2005-02-13 devnull c->state = "read";
57 ce94dbe6 2005-02-13 devnull if((n=convreadm(c, &txt)) < 0)
58 ce94dbe6 2005-02-13 devnull goto out;
59 ce94dbe6 2005-02-13 devnull if(n < 32){
60 ce94dbe6 2005-02-13 devnull convprint(c, "data too short");
61 ce94dbe6 2005-02-13 devnull goto out;
62 6e527fbc 2005-02-13 devnull }
63 fa325e9b 2020-01-10 cross
64 ce94dbe6 2005-02-13 devnull /* encrypt/decrypt */
65 1f8a8072 2005-03-15 devnull m = betomp((uchar*)txt, n, nil);
66 6e527fbc 2005-02-13 devnull if(m == nil)
67 ce94dbe6 2005-02-13 devnull goto out;
68 ce94dbe6 2005-02-13 devnull if(strcmp(role, "decrypt") == 0)
69 e1a22963 2005-02-13 devnull mm = rsadecrypt(key, m, nil);
70 ce94dbe6 2005-02-13 devnull else
71 ce94dbe6 2005-02-13 devnull mm = rsaencrypt(&key->pub, m, nil);
72 ce94dbe6 2005-02-13 devnull if(mm == nil)
73 ce94dbe6 2005-02-13 devnull goto out;
74 1f8a8072 2005-03-15 devnull n = mptobe(mm, (uchar*)buf, sizeof buf, nil);
75 fa325e9b 2020-01-10 cross
76 ce94dbe6 2005-02-13 devnull /* send response */
77 ce94dbe6 2005-02-13 devnull c->state = "write";
78 ce94dbe6 2005-02-13 devnull convwrite(c, buf, n);
79 ce94dbe6 2005-02-13 devnull ret = 0;
80 ce94dbe6 2005-02-13 devnull
81 ce94dbe6 2005-02-13 devnull out:
82 6e527fbc 2005-02-13 devnull mpfree(m);
83 ce94dbe6 2005-02-13 devnull mpfree(mm);
84 6e527fbc 2005-02-13 devnull keyclose(k);
85 ce94dbe6 2005-02-13 devnull free(txt);
86 ce94dbe6 2005-02-13 devnull return ret;
87 6e527fbc 2005-02-13 devnull }
88 6e527fbc 2005-02-13 devnull
89 6e527fbc 2005-02-13 devnull static int
90 6e527fbc 2005-02-13 devnull xrsasign(Conv *c)
91 6e527fbc 2005-02-13 devnull {
92 ce94dbe6 2005-02-13 devnull char *hash, *role;
93 ce94dbe6 2005-02-13 devnull int dlen, n, ret;
94 6e527fbc 2005-02-13 devnull DigestAlg *hashfn;
95 6e527fbc 2005-02-13 devnull Key *k;
96 ce94dbe6 2005-02-13 devnull RSApriv *key;
97 6e527fbc 2005-02-13 devnull uchar sig[1024], digest[64];
98 ce94dbe6 2005-02-13 devnull char *sig2;
99 6e527fbc 2005-02-13 devnull
100 ce94dbe6 2005-02-13 devnull ret = -1;
101 fa325e9b 2020-01-10 cross
102 ce94dbe6 2005-02-13 devnull /* fetch key */
103 ce94dbe6 2005-02-13 devnull c->state = "keylookup";
104 6e527fbc 2005-02-13 devnull k = keylookup("%A", c->attr);
105 6e527fbc 2005-02-13 devnull if(k == nil)
106 ce94dbe6 2005-02-13 devnull goto out;
107 ce94dbe6 2005-02-13 devnull
108 ce94dbe6 2005-02-13 devnull /* make sure have private half if needed */
109 ce94dbe6 2005-02-13 devnull key = k->priv;
110 ce94dbe6 2005-02-13 devnull role = strfindattr(c->attr, "role");
111 ce94dbe6 2005-02-13 devnull if(strcmp(role, "sign") == 0 && !key->c2){
112 ce94dbe6 2005-02-13 devnull werrstr("missing private half of key -- cannot sign");
113 ce94dbe6 2005-02-13 devnull goto out;
114 ce94dbe6 2005-02-13 devnull }
115 fa325e9b 2020-01-10 cross
116 ce94dbe6 2005-02-13 devnull /* get hash type from key */
117 6e527fbc 2005-02-13 devnull hash = strfindattr(k->attr, "hash");
118 6e527fbc 2005-02-13 devnull if(hash == nil)
119 6e527fbc 2005-02-13 devnull hash = "sha1";
120 6e527fbc 2005-02-13 devnull if(strcmp(hash, "sha1") == 0){
121 6e527fbc 2005-02-13 devnull hashfn = sha1;
122 6e527fbc 2005-02-13 devnull dlen = SHA1dlen;
123 6e527fbc 2005-02-13 devnull }else if(strcmp(hash, "md5") == 0){
124 6e527fbc 2005-02-13 devnull hashfn = md5;
125 6e527fbc 2005-02-13 devnull dlen = MD5dlen;
126 6e527fbc 2005-02-13 devnull }else{
127 6e527fbc 2005-02-13 devnull werrstr("unknown hash function %s", hash);
128 ce94dbe6 2005-02-13 devnull goto out;
129 6e527fbc 2005-02-13 devnull }
130 ce94dbe6 2005-02-13 devnull
131 ce94dbe6 2005-02-13 devnull /* read hash */
132 ce94dbe6 2005-02-13 devnull c->state = "read hash";
133 ce94dbe6 2005-02-13 devnull if((n=convread(c, digest, dlen)) < 0)
134 ce94dbe6 2005-02-13 devnull goto out;
135 ce94dbe6 2005-02-13 devnull
136 ce94dbe6 2005-02-13 devnull if(strcmp(role, "sign") == 0){
137 ce94dbe6 2005-02-13 devnull /* sign */
138 ce94dbe6 2005-02-13 devnull if((n=rsasign(key, hashfn, digest, dlen, sig, sizeof sig)) < 0)
139 ce94dbe6 2005-02-13 devnull goto out;
140 ce94dbe6 2005-02-13 devnull
141 ce94dbe6 2005-02-13 devnull /* write */
142 ce94dbe6 2005-02-13 devnull convwrite(c, sig, n);
143 ce94dbe6 2005-02-13 devnull }else{
144 ce94dbe6 2005-02-13 devnull /* read signature */
145 ce94dbe6 2005-02-13 devnull if((n = convreadm(c, &sig2)) < 0)
146 ce94dbe6 2005-02-13 devnull goto out;
147 fa325e9b 2020-01-10 cross
148 ce94dbe6 2005-02-13 devnull /* verify */
149 ce94dbe6 2005-02-13 devnull if(rsaverify(&key->pub, hashfn, digest, dlen, (uchar*)sig2, n) == 0)
150 ce94dbe6 2005-02-13 devnull convprint(c, "ok");
151 ce94dbe6 2005-02-13 devnull else
152 ce94dbe6 2005-02-13 devnull convprint(c, "signature does not verify");
153 ce94dbe6 2005-02-13 devnull free(sig2);
154 6e527fbc 2005-02-13 devnull }
155 ce94dbe6 2005-02-13 devnull ret = 0;
156 ce94dbe6 2005-02-13 devnull
157 ce94dbe6 2005-02-13 devnull out:
158 6e527fbc 2005-02-13 devnull keyclose(k);
159 ce94dbe6 2005-02-13 devnull return ret;
160 6e527fbc 2005-02-13 devnull }
161 6e527fbc 2005-02-13 devnull
162 6e527fbc 2005-02-13 devnull /*
163 fa325e9b 2020-01-10 cross * convert to canonical form (lower case)
164 6e527fbc 2005-02-13 devnull * for use in attribute matches.
165 6e527fbc 2005-02-13 devnull */
166 6e527fbc 2005-02-13 devnull static void
167 6e527fbc 2005-02-13 devnull strlwr(char *a)
168 6e527fbc 2005-02-13 devnull {
169 6e527fbc 2005-02-13 devnull for(; *a; a++){
170 6e527fbc 2005-02-13 devnull if('A' <= *a && *a <= 'Z')
171 6e527fbc 2005-02-13 devnull *a += 'a' - 'A';
172 6e527fbc 2005-02-13 devnull }
173 6e527fbc 2005-02-13 devnull }
174 6e527fbc 2005-02-13 devnull
175 6e527fbc 2005-02-13 devnull static RSApriv*
176 6e527fbc 2005-02-13 devnull readrsapriv(Key *k)
177 6e527fbc 2005-02-13 devnull {
178 6e527fbc 2005-02-13 devnull char *a;
179 6e527fbc 2005-02-13 devnull RSApriv *priv;
180 6e527fbc 2005-02-13 devnull
181 6e527fbc 2005-02-13 devnull priv = rsaprivalloc();
182 6e527fbc 2005-02-13 devnull
183 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "ek"))==nil
184 6e527fbc 2005-02-13 devnull || (priv->pub.ek=strtomp(a, nil, 16, nil))==nil)
185 6e527fbc 2005-02-13 devnull goto Error;
186 6e527fbc 2005-02-13 devnull strlwr(a);
187 fa325e9b 2020-01-10 cross if((a=strfindattr(k->attr, "n"))==nil
188 6e527fbc 2005-02-13 devnull || (priv->pub.n=strtomp(a, nil, 16, nil))==nil)
189 6e527fbc 2005-02-13 devnull goto Error;
190 6e527fbc 2005-02-13 devnull strlwr(a);
191 ce94dbe6 2005-02-13 devnull if(k->privattr == nil) /* only public half */
192 ce94dbe6 2005-02-13 devnull return priv;
193 ce94dbe6 2005-02-13 devnull
194 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!p"))==nil
195 6e527fbc 2005-02-13 devnull || (priv->p=strtomp(a, nil, 16, nil))==nil)
196 6e527fbc 2005-02-13 devnull goto Error;
197 6e527fbc 2005-02-13 devnull strlwr(a);
198 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!q"))==nil
199 6e527fbc 2005-02-13 devnull || (priv->q=strtomp(a, nil, 16, nil))==nil)
200 6e527fbc 2005-02-13 devnull goto Error;
201 6e527fbc 2005-02-13 devnull strlwr(a);
202 ddfc031c 2010-03-12 rsc if(!probably_prime(priv->p, 20) || !probably_prime(priv->q, 20)) {
203 ddfc031c 2010-03-12 rsc werrstr("rsa: p or q not prime");
204 ddfc031c 2010-03-12 rsc goto Error;
205 ddfc031c 2010-03-12 rsc }
206 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!kp"))==nil
207 6e527fbc 2005-02-13 devnull || (priv->kp=strtomp(a, nil, 16, nil))==nil)
208 6e527fbc 2005-02-13 devnull goto Error;
209 6e527fbc 2005-02-13 devnull strlwr(a);
210 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!kq"))==nil
211 6e527fbc 2005-02-13 devnull || (priv->kq=strtomp(a, nil, 16, nil))==nil)
212 6e527fbc 2005-02-13 devnull goto Error;
213 6e527fbc 2005-02-13 devnull strlwr(a);
214 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!c2"))==nil
215 6e527fbc 2005-02-13 devnull || (priv->c2=strtomp(a, nil, 16, nil))==nil)
216 6e527fbc 2005-02-13 devnull goto Error;
217 6e527fbc 2005-02-13 devnull strlwr(a);
218 fa325e9b 2020-01-10 cross if((a=strfindattr(k->privattr, "!dk"))==nil
219 6e527fbc 2005-02-13 devnull || (priv->dk=strtomp(a, nil, 16, nil))==nil)
220 6e527fbc 2005-02-13 devnull goto Error;
221 6e527fbc 2005-02-13 devnull strlwr(a);
222 6e527fbc 2005-02-13 devnull return priv;
223 6e527fbc 2005-02-13 devnull
224 6e527fbc 2005-02-13 devnull Error:
225 6e527fbc 2005-02-13 devnull rsaprivfree(priv);
226 6e527fbc 2005-02-13 devnull return nil;
227 6e527fbc 2005-02-13 devnull }
228 6e527fbc 2005-02-13 devnull
229 6e527fbc 2005-02-13 devnull static int
230 6e527fbc 2005-02-13 devnull rsacheck(Key *k)
231 6e527fbc 2005-02-13 devnull {
232 6e527fbc 2005-02-13 devnull static int first = 1;
233 fa325e9b 2020-01-10 cross
234 6e527fbc 2005-02-13 devnull if(first){
235 6e527fbc 2005-02-13 devnull fmtinstall('B', mpfmt);
236 6e527fbc 2005-02-13 devnull first = 0;
237 6e527fbc 2005-02-13 devnull }
238 6e527fbc 2005-02-13 devnull
239 6e527fbc 2005-02-13 devnull if((k->priv = readrsapriv(k)) == nil){
240 6e527fbc 2005-02-13 devnull werrstr("malformed key data");
241 6e527fbc 2005-02-13 devnull return -1;
242 6e527fbc 2005-02-13 devnull }
243 6e527fbc 2005-02-13 devnull return 0;
244 6e527fbc 2005-02-13 devnull }
245 6e527fbc 2005-02-13 devnull
246 6e527fbc 2005-02-13 devnull static void
247 6e527fbc 2005-02-13 devnull rsaclose(Key *k)
248 6e527fbc 2005-02-13 devnull {
249 6e527fbc 2005-02-13 devnull rsaprivfree(k->priv);
250 6e527fbc 2005-02-13 devnull k->priv = nil;
251 6e527fbc 2005-02-13 devnull }
252 6e527fbc 2005-02-13 devnull
253 6e527fbc 2005-02-13 devnull static Role
254 fa325e9b 2020-01-10 cross rsaroles[] =
255 6e527fbc 2005-02-13 devnull {
256 6e527fbc 2005-02-13 devnull "sign", xrsasign,
257 ce94dbe6 2005-02-13 devnull "verify", xrsasign, /* public operation */
258 ce94dbe6 2005-02-13 devnull "decrypt", xrsadecrypt,
259 ce94dbe6 2005-02-13 devnull "encrypt", xrsadecrypt, /* public operation */
260 6e527fbc 2005-02-13 devnull 0
261 6e527fbc 2005-02-13 devnull };
262 6e527fbc 2005-02-13 devnull
263 6e527fbc 2005-02-13 devnull Proto rsa = {
264 6e527fbc 2005-02-13 devnull "rsa",
265 6e527fbc 2005-02-13 devnull rsaroles,
266 6e527fbc 2005-02-13 devnull nil,
267 6e527fbc 2005-02-13 devnull rsacheck,
268 6e527fbc 2005-02-13 devnull rsaclose
269 6e527fbc 2005-02-13 devnull };