xref: /inferno-os/libkeyring/dsaalg.c (revision 7de2b42d50e3c05cc143e7b51284009b5e185581)
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