forsyth20121205-174063a80cc13 years agoHistory
230 lines · 3.8 KB · C
RawDownload
#include <lib9.h>#include <kernel.h>#include <isa.h>#include "interp.h"#include "../libinterp/keyringif.h"#include "mp.h"#include "libsec.h"#include "keys.h" static char*	pkattr[] = { "n", "ek", nil };static char*	skattr[] = { "n", "ek", "!dk", "!p", "!q", "!kp", "!kq", "!c2", nil };static char*	sigattr[] = { "val", nil }; static void*rsa_str2sk(char *str, char **strp){	RSApriv *rsa;	char *p; 	rsa = rsaprivalloc();	rsa->pub.n = base64tobig(str, &p);	rsa->pub.ek = base64tobig(p, &p);	rsa->dk = base64tobig(p, &p);	rsa->p = base64tobig(p, &p);	rsa->q = base64tobig(p, &p);	rsa->kp = base64tobig(p, &p);	rsa->kq = base64tobig(p, &p);	rsa->c2 = base64tobig(p, &p);	if(strp)		*strp = p;	if(rsa->pub.n == nil || rsa->pub.ek == nil ||	   rsa->dk == nil || rsa->p == nil || rsa->q == nil ||	   rsa->kp == nil || rsa->kq == nil || rsa->c2 == nil){		rsaprivfree(rsa);		return nil;	} 	return rsa;} static void*rsa_str2pk(char *str, char **strp){	RSApub *rsa;	char *p; 	rsa = rsapuballoc();	rsa->n = base64tobig(str, &p);	rsa->ek = base64tobig(p, &p);	if(strp)		*strp = p;	if(rsa->n == nil || rsa->ek == nil){		rsapubfree(rsa);		return nil;	} 	return rsa;} static void*rsa_str2sig(char *str, char **strp){	mpint *rsa;	char *p; 	rsa = base64tobig(str, &p);	if(rsa == nil)		return nil;	if(strp)		*strp = p;	return rsa;} static intrsa_sk2str(void *vrsa, char *buf, int len){	RSApriv *rsa;	char *cp, *ep; 	rsa = vrsa;	ep = buf + len - 1;	cp = buf; 	cp += snprint(cp, ep - cp, "%U\n", rsa->pub.n);	cp += snprint(cp, ep - cp, "%U\n", rsa->pub.ek);	cp += snprint(cp, ep - cp, "%U\n", rsa->dk);	cp += snprint(cp, ep - cp, "%U\n", rsa->p);	cp += snprint(cp, ep - cp, "%U\n", rsa->q);	cp += snprint(cp, ep - cp, "%U\n", rsa->kp);	cp += snprint(cp, ep - cp, "%U\n", rsa->kq);	cp += snprint(cp, ep - cp, "%U\n", rsa->c2);	*cp = 0; 	return cp - buf;} static intrsa_pk2str(void *vrsa, char *buf, int len){	RSApub *rsa;	char *cp, *ep; 	rsa = vrsa;	ep = buf + len - 1;	cp = buf;	cp += snprint(cp, ep - cp, "%U\n", rsa->n);	cp += snprint(cp, ep - cp, "%U\n", rsa->ek);	*cp = 0; 	return cp - buf;} static intrsa_sig2str(void *vrsa, char *buf, int len){	mpint *rsa;	char *cp, *ep; 	rsa = vrsa;	ep = buf + len - 1;	cp = buf; 	cp += snprint(cp, ep - cp, "%U\n", rsa);	*cp = 0; 	return cp - buf;} static void*rsa_sk2pk(void *vs){	return rsaprivtopub((RSApriv*)vs);} /* generate an rsa secret key */static void*rsa_gen(int len){	RSApriv *key; 	for(;;){		key = rsagen(len, 6, 0);		if(mpsignif(key->pub.n) == len)			return key;		rsaprivfree(key);	}} /* generate an rsa secret key with same params as a public key */static void*rsa_genfrompk(void *vpub){	RSApub *pub; 	pub = vpub;	return rsagen(mpsignif(pub->n), mpsignif(pub->ek), 0);} static void*rsa_sign(mpint* m, void *key){	return rsadecrypt((RSApriv*)key, m, nil);} static intrsa_verify(mpint* m, void *sig, void *key){	mpint *t;	int r; 	t = rsaencrypt((RSApub*)key, (mpint*)sig, nil);	r = mpcmp(t, m) == 0;	mpfree(t);	return r;} static voidrsa_freepriv(void *a){	rsaprivfree((RSApriv*)a);} static voidrsa_freepub(void *a){	rsapubfree((RSApub*)a);} static voidrsa_freesig(void *a){	mpfree(a);} SigAlgVec*rsainit(void){	SigAlgVec *vec; 	vec = malloc(sizeof(SigAlgVec));	if(vec == nil)		return nil; 	vec->name = "rsa"; 	vec->pkattr = pkattr;	vec->skattr = skattr;	vec->sigattr = sigattr; 	vec->str2sk = rsa_str2sk;	vec->str2pk = rsa_str2pk;	vec->str2sig = rsa_str2sig; 	vec->sk2str = rsa_sk2str;	vec->pk2str = rsa_pk2str;	vec->sig2str = rsa_sig2str; 	vec->sk2pk = rsa_sk2pk; 	vec->gensk = rsa_gen;	vec->genskfrompk = rsa_genfrompk;	vec->sign = rsa_sign;	vec->verify = rsa_verify; 	vec->skfree = rsa_freepriv;	vec->pkfree = rsa_freepub;	vec->sigfree = rsa_freesig; 	return vec;}