137da2899SCharles.Forsyth #include <lib9.h>
237da2899SCharles.Forsyth #include <kernel.h>
337da2899SCharles.Forsyth #include <isa.h>
437da2899SCharles.Forsyth #include "interp.h"
5*7de2b42dSforsyth #include "../libinterp/keyringif.h"
637da2899SCharles.Forsyth #include "mp.h"
737da2899SCharles.Forsyth #include "libsec.h"
837da2899SCharles.Forsyth #include "keys.h"
937da2899SCharles.Forsyth
1037da2899SCharles.Forsyth static char* pkattr[] = { "p", "q", "alpha", "key", nil };
1137da2899SCharles.Forsyth static char* skattr[] = { "p", "q", "alpha", "key", "!secret", nil };
1237da2899SCharles.Forsyth static char* sigattr[] = { "r", "s", nil };
1337da2899SCharles.Forsyth
1437da2899SCharles.Forsyth static void*
dsa_str2sk(char * str,char ** strp)1537da2899SCharles.Forsyth dsa_str2sk(char *str, char **strp)
1637da2899SCharles.Forsyth {
1737da2899SCharles.Forsyth DSApriv *dsa;
1837da2899SCharles.Forsyth char *p;
1937da2899SCharles.Forsyth
2037da2899SCharles.Forsyth dsa = dsaprivalloc();
2137da2899SCharles.Forsyth dsa->pub.p = base64tobig(str, &p);
2237da2899SCharles.Forsyth dsa->pub.q = base64tobig(str, &p);
2337da2899SCharles.Forsyth dsa->pub.alpha = base64tobig(p, &p);
2437da2899SCharles.Forsyth dsa->pub.key = base64tobig(p, &p);
2537da2899SCharles.Forsyth dsa->secret = base64tobig(p, &p);
2637da2899SCharles.Forsyth if(strp)
2737da2899SCharles.Forsyth *strp = p;
28032c0afdSforsyth if(dsa->pub.p == nil || dsa->pub.q == nil ||
29032c0afdSforsyth dsa->pub.alpha == nil || dsa->pub.key == nil || dsa->secret == nil){
30032c0afdSforsyth dsaprivfree(dsa);
31032c0afdSforsyth return nil;
32032c0afdSforsyth }
3337da2899SCharles.Forsyth return dsa;
3437da2899SCharles.Forsyth }
3537da2899SCharles.Forsyth
3637da2899SCharles.Forsyth static void*
dsa_str2pk(char * str,char ** strp)3737da2899SCharles.Forsyth dsa_str2pk(char *str, char **strp)
3837da2899SCharles.Forsyth {
3937da2899SCharles.Forsyth DSApub *dsa;
4037da2899SCharles.Forsyth char *p;
4137da2899SCharles.Forsyth
4237da2899SCharles.Forsyth dsa = dsapuballoc();
4337da2899SCharles.Forsyth dsa->p = base64tobig(str, &p);
4437da2899SCharles.Forsyth dsa->q = base64tobig(str, &p);
4537da2899SCharles.Forsyth dsa->alpha = base64tobig(p, &p);
4637da2899SCharles.Forsyth dsa->key = base64tobig(p, &p);
4737da2899SCharles.Forsyth if(strp)
4837da2899SCharles.Forsyth *strp = p;
49032c0afdSforsyth if(dsa->p == nil || dsa->q == nil || dsa->alpha == nil || dsa->key == nil){
50032c0afdSforsyth dsapubfree(dsa);
51032c0afdSforsyth return nil;
52032c0afdSforsyth }
5337da2899SCharles.Forsyth return dsa;
5437da2899SCharles.Forsyth }
5537da2899SCharles.Forsyth
5637da2899SCharles.Forsyth static void*
dsa_str2sig(char * str,char ** strp)5737da2899SCharles.Forsyth dsa_str2sig(char *str, char **strp)
5837da2899SCharles.Forsyth {
5937da2899SCharles.Forsyth DSAsig *dsa;
6037da2899SCharles.Forsyth char *p;
6137da2899SCharles.Forsyth
6237da2899SCharles.Forsyth dsa = dsasigalloc();
6337da2899SCharles.Forsyth dsa->r = base64tobig(str, &p);
6437da2899SCharles.Forsyth dsa->s = base64tobig(p, &p);
6537da2899SCharles.Forsyth if(strp)
6637da2899SCharles.Forsyth *strp = p;
67032c0afdSforsyth if(dsa->r == nil || dsa->s == nil){
68032c0afdSforsyth dsasigfree(dsa);
69032c0afdSforsyth return nil;
70032c0afdSforsyth }
7137da2899SCharles.Forsyth return dsa;
7237da2899SCharles.Forsyth }
7337da2899SCharles.Forsyth
7437da2899SCharles.Forsyth static int
dsa_sk2str(void * veg,char * buf,int len)7537da2899SCharles.Forsyth dsa_sk2str(void *veg, char *buf, int len)
7637da2899SCharles.Forsyth {
7737da2899SCharles.Forsyth DSApriv *dsa;
7837da2899SCharles.Forsyth char *cp, *ep;
7937da2899SCharles.Forsyth
8037da2899SCharles.Forsyth dsa = veg;
8137da2899SCharles.Forsyth ep = buf + len - 1;
8237da2899SCharles.Forsyth cp = buf;
8337da2899SCharles.Forsyth
8437da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->pub.p);
8537da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->pub.q);
8637da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->pub.alpha);
8737da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->pub.key);
8837da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->secret);
8937da2899SCharles.Forsyth *cp = 0;
9037da2899SCharles.Forsyth
9137da2899SCharles.Forsyth return cp - buf;
9237da2899SCharles.Forsyth }
9337da2899SCharles.Forsyth
9437da2899SCharles.Forsyth static int
dsa_pk2str(void * veg,char * buf,int len)9537da2899SCharles.Forsyth dsa_pk2str(void *veg, char *buf, int len)
9637da2899SCharles.Forsyth {
9737da2899SCharles.Forsyth DSApub *dsa;
9837da2899SCharles.Forsyth char *cp, *ep;
9937da2899SCharles.Forsyth
10037da2899SCharles.Forsyth dsa = veg;
10137da2899SCharles.Forsyth ep = buf + len - 1;
10237da2899SCharles.Forsyth cp = buf;
10337da2899SCharles.Forsyth
10437da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->p);
10537da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->q);
10637da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->alpha);
10737da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->key);
10837da2899SCharles.Forsyth *cp = 0;
10937da2899SCharles.Forsyth
11037da2899SCharles.Forsyth return cp - buf;
11137da2899SCharles.Forsyth }
11237da2899SCharles.Forsyth
11337da2899SCharles.Forsyth static int
dsa_sig2str(void * veg,char * buf,int len)11437da2899SCharles.Forsyth dsa_sig2str(void *veg, char *buf, int len)
11537da2899SCharles.Forsyth {
11637da2899SCharles.Forsyth DSAsig *dsa;
11737da2899SCharles.Forsyth char *cp, *ep;
11837da2899SCharles.Forsyth
11937da2899SCharles.Forsyth dsa = veg;
12037da2899SCharles.Forsyth ep = buf + len - 1;
12137da2899SCharles.Forsyth cp = buf;
12237da2899SCharles.Forsyth
12337da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->r);
12437da2899SCharles.Forsyth cp += snprint(cp, ep - cp, "%U\n", dsa->s);
12537da2899SCharles.Forsyth *cp = 0;
12637da2899SCharles.Forsyth
12737da2899SCharles.Forsyth return cp - buf;
12837da2899SCharles.Forsyth }
12937da2899SCharles.Forsyth
13037da2899SCharles.Forsyth static void*
dsa_sk2pk(void * vs)13137da2899SCharles.Forsyth dsa_sk2pk(void *vs)
13237da2899SCharles.Forsyth {
13337da2899SCharles.Forsyth return dsaprivtopub((DSApriv*)vs);
13437da2899SCharles.Forsyth }
13537da2899SCharles.Forsyth
13637da2899SCharles.Forsyth /* generate a dsa secret key with new params */
13737da2899SCharles.Forsyth static void*
dsa_gen(int len)13837da2899SCharles.Forsyth dsa_gen(int len)
13937da2899SCharles.Forsyth {
14037da2899SCharles.Forsyth USED(len);
14137da2899SCharles.Forsyth return dsagen(nil);
14237da2899SCharles.Forsyth }
14337da2899SCharles.Forsyth
14437da2899SCharles.Forsyth /* generate a dsa secret key with same params as a public key */
14537da2899SCharles.Forsyth static void*
dsa_genfrompk(void * vpub)14637da2899SCharles.Forsyth dsa_genfrompk(void *vpub)
14737da2899SCharles.Forsyth {
14837da2899SCharles.Forsyth return dsagen((DSApub*)vpub);
14937da2899SCharles.Forsyth }
15037da2899SCharles.Forsyth
15137da2899SCharles.Forsyth static void
dsa_freepub(void * a)15237da2899SCharles.Forsyth dsa_freepub(void *a)
15337da2899SCharles.Forsyth {
15437da2899SCharles.Forsyth dsapubfree((DSApub*)a);
15537da2899SCharles.Forsyth }
15637da2899SCharles.Forsyth
15737da2899SCharles.Forsyth static void
dsa_freepriv(void * a)15837da2899SCharles.Forsyth dsa_freepriv(void *a)
15937da2899SCharles.Forsyth {
16037da2899SCharles.Forsyth dsaprivfree((DSApriv*)a);
16137da2899SCharles.Forsyth }
16237da2899SCharles.Forsyth
16337da2899SCharles.Forsyth static void
dsa_freesig(void * a)16437da2899SCharles.Forsyth dsa_freesig(void *a)
16537da2899SCharles.Forsyth {
16637da2899SCharles.Forsyth dsasigfree((DSAsig*)a);
16737da2899SCharles.Forsyth }
16837da2899SCharles.Forsyth
16937da2899SCharles.Forsyth static void*
dsa_sign(mpint * md,void * key)17031a18a69SCharles.Forsyth dsa_sign(mpint* md, void *key)
17137da2899SCharles.Forsyth {
17237da2899SCharles.Forsyth return dsasign((DSApriv*)key, md);
17337da2899SCharles.Forsyth }
17437da2899SCharles.Forsyth
17537da2899SCharles.Forsyth static int
dsa_verify(mpint * md,void * sig,void * key)17631a18a69SCharles.Forsyth dsa_verify(mpint* md, void *sig, void *key)
17737da2899SCharles.Forsyth {
17837da2899SCharles.Forsyth return dsaverify((DSApub*)key, (DSAsig*)sig, md) == 0;
17937da2899SCharles.Forsyth }
18037da2899SCharles.Forsyth
18137da2899SCharles.Forsyth SigAlgVec*
dsainit(void)18237da2899SCharles.Forsyth dsainit(void)
18337da2899SCharles.Forsyth {
18437da2899SCharles.Forsyth SigAlgVec *vec;
18537da2899SCharles.Forsyth
18637da2899SCharles.Forsyth vec = malloc(sizeof(SigAlgVec));
18737da2899SCharles.Forsyth if(vec == nil)
18837da2899SCharles.Forsyth return nil;
18937da2899SCharles.Forsyth
19037da2899SCharles.Forsyth vec->name = "dsa";
19137da2899SCharles.Forsyth
19237da2899SCharles.Forsyth vec->pkattr = pkattr;
19337da2899SCharles.Forsyth vec->skattr = skattr;
19437da2899SCharles.Forsyth vec->sigattr = sigattr;
19537da2899SCharles.Forsyth
19637da2899SCharles.Forsyth vec->str2sk = dsa_str2sk;
19737da2899SCharles.Forsyth vec->str2pk = dsa_str2pk;
19837da2899SCharles.Forsyth vec->str2sig = dsa_str2sig;
19937da2899SCharles.Forsyth
20037da2899SCharles.Forsyth vec->sk2str = dsa_sk2str;
20137da2899SCharles.Forsyth vec->pk2str = dsa_pk2str;
20237da2899SCharles.Forsyth vec->sig2str = dsa_sig2str;
20337da2899SCharles.Forsyth
20437da2899SCharles.Forsyth vec->sk2pk = dsa_sk2pk;
20537da2899SCharles.Forsyth
20637da2899SCharles.Forsyth vec->gensk = dsa_gen;
20737da2899SCharles.Forsyth vec->genskfrompk = dsa_genfrompk;
20837da2899SCharles.Forsyth vec->sign = dsa_sign;
20937da2899SCharles.Forsyth vec->verify = dsa_verify;
21037da2899SCharles.Forsyth
21137da2899SCharles.Forsyth vec->skfree = dsa_freepriv;
21237da2899SCharles.Forsyth vec->pkfree = dsa_freepub;
21337da2899SCharles.Forsyth vec->sigfree = dsa_freesig;
21437da2899SCharles.Forsyth
21537da2899SCharles.Forsyth return vec;
21637da2899SCharles.Forsyth }
217