Browse Source

Rentroducing libsec, removing TLS (#740)

Signed-off-by: Álvaro Jurado <elbingmiss@gmail.com>
Álvaro Jurado 6 years ago
parent
commit
520b5402cc

+ 0 - 22
LICENSE.mit

@@ -1,22 +0,0 @@
-Copyright (c) 2011-2017 cinap_lenrek <cinap_lenrek@felloff.net>
-Julius Schmidt <aiju@phicode.de>, mischief <mischief@offblast.org>,
-et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 0 - 6
sys/src/libsec/klibsec.json

@@ -16,14 +16,12 @@
 			"port/desCBC.c",
 			"port/desECB.c",
 			"port/desmodes.c",
-			"port/dh.c",
 			"port/dsaalloc.c",
 			"port/dsagen.c",
 			"port/dsaprimes.c",
 			"port/dsaprivtopub.c",
 			"port/dsasign.c",
 			"port/dsaverify.c",
-			"port/ecc.c",
 			"port/egalloc.c",
 			"port/egdecrypt.c",
 			"port/egencrypt.c",
@@ -37,7 +35,6 @@
 			"port/gensafeprime.c",
 			"port/genstrongprime.c",
 			"port/hmac.c",
-			"port/jacobian.c",
 			"port/md4.c",
 			"port/md5block.c",
 			"port/md5.c",
@@ -53,8 +50,6 @@
 			"port/rsafill.c",
 			"port/rsagen.c",
 			"port/rsaprivtopub.c",
-			"port/secp256r1.c",
-			"port/secp384r1.c",
 			"port/sha1block.c",
 			"port/sha1.c",
 			"port/sha1pickle.c",
@@ -66,7 +61,6 @@
 			"port/smallprimetest.c",
 			"port/thumb.c",
 			"port/tlshand.c",
-			"port/tsmemcmp.c",
 			"port/x509.c"
 		]
 	}

+ 0 - 6
sys/src/libsec/libsec.json

@@ -16,14 +16,12 @@
 			"port/desCBC.c",
 			"port/desECB.c",
 			"port/desmodes.c",
-			"port/dh.c",
 			"port/dsaalloc.c",
 			"port/dsagen.c",
 			"port/dsaprimes.c",
 			"port/dsaprivtopub.c",
 			"port/dsasign.c",
 			"port/dsaverify.c",
-			"port/ecc.c",
 			"port/egalloc.c",
 			"port/egdecrypt.c",
 			"port/egencrypt.c",
@@ -37,7 +35,6 @@
 			"port/gensafeprime.c",
 			"port/genstrongprime.c",
 			"port/hmac.c",
-			"port/jacobian.c",
 			"port/md4.c",
 			"port/md5block.c",
 			"port/md5.c",
@@ -53,8 +50,6 @@
 			"port/rsafill.c",
 			"port/rsagen.c",
 			"port/rsaprivtopub.c",
-			"port/secp256r1.c",
-			"port/secp384r1.c",
 			"port/sha1block.c",
 			"port/sha1.c",
 			"port/sha1pickle.c",
@@ -66,7 +61,6 @@
 			"port/smallprimetest.c",
 			"port/thumb.c",
 			"port/tlshand.c",
-			"port/tsmemcmp.c",
 			"port/x509.c"
 		]
 	}

+ 0 - 98
sys/src/libsec/port/dh.c

@@ -1,98 +0,0 @@
-/*
- * Copyright 2014 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-#include <libsec.h>
-
-mpint*
-dh_new(DHstate *dh, mpint *p, mpint *q, mpint *g)
-{
-	mpint *pm1;
-	int n;
-
-	memset(dh, 0, sizeof(*dh));
-	if(mpcmp(g, mpone) <= 0)
-		return nil;
-
-	n = mpsignif(p);
-	pm1 = mpnew(n);
-	mpsub(p, mpone, pm1);
-	dh->p = mpcopy(p);
-	dh->g = mpcopy(g);
-	dh->q = mpcopy(q != nil ? q : pm1);
-	dh->x = mpnew(mpsignif(dh->q));
-	dh->y = mpnew(n);
-	for(;;){
-		mpnrand(dh->q, genrandom, dh->x);
-		mpexp(dh->g, dh->x, dh->p, dh->y);
-		if(mpcmp(dh->y, mpone) > 0 && mpcmp(dh->y, pm1) < 0)
-			break;
-	}
-	mpfree(pm1);
-
-	return dh->y;
-}
-
-mpint*
-dh_finish(DHstate *dh, mpint *y)
-{
-	mpint *k = nil;
-
-	if(y == nil || dh->x == nil || dh->p == nil || dh->q == nil)
-		goto Out;
-
-	/* y > 1 */
-	if(mpcmp(y, mpone) <= 0)
-		goto Out;
-
-	k = mpnew(mpsignif(dh->p));
-
-	/* y < p-1 */
-	mpsub(dh->p, mpone, k);
-	if(mpcmp(y, k) >= 0){
-Bad:
-		mpfree(k);
-		k = nil;
-		goto Out;
-	}
-
-	/* y**q % p == 1 if q < p-1 */
-	if(mpcmp(dh->q, k) < 0){
-		mpexp(y, dh->q, dh->p, k);
-		if(mpcmp(k, mpone) != 0)
-			goto Bad;
-	}
-
-	mpexp(y, dh->x, dh->p, k);
-
-Out:
-	mpfree(dh->p);
-	mpfree(dh->q);
-	mpfree(dh->g);
-	mpfree(dh->x);
-	mpfree(dh->y);
-	memset(dh, 0, sizeof(*dh));
-	return k;
-}

+ 0 - 639
sys/src/libsec/port/ecc.c

@@ -1,639 +0,0 @@
-/*
- * Copyright 2012 - 2017 Julius Schmidt <aiju@phicode.de>
- * Copyright 2015 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- * Copyright 2015 - 2017 mischief <mischief@offblast.org>
- * Copyright 2017 HarveyOS
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-#include <libsec.h>
-#include <ctype.h>
-
-extern void jacobian_affine(mpint *p,
-	mpint *X, mpint *Y, mpint *Z);
-extern void jacobian_dbl(mpint *p, mpint *a,
-	mpint *X1, mpint *Y1, mpint *Z1,
-	mpint *X3, mpint *Y3, mpint *Z3);
-extern void jacobian_add(mpint *p, mpint *a,
-	mpint *X1, mpint *Y1, mpint *Z1,
-	mpint *X2, mpint *Y2, mpint *Z2,
-	mpint *X3, mpint *Y3, mpint *Z3);
-
-void
-ecassign(ECdomain *dom, ECpoint *a, ECpoint *b)
-{
-	if((b->inf = a->inf) != 0)
-		return;
-	mpassign(a->x, b->x);
-	mpassign(a->y, b->y);
-	if(b->z != nil){
-		mpassign(a->z != nil ? a->z : mpone, b->z);
-		return;
-	}
-	if(a->z != nil){
-		b->z = mpcopy(a->z);
-		jacobian_affine(dom->p, b->x, b->y, b->z);
-		mpfree(b->z);
-		b->z = nil;
-	}
-}
-
-void
-ecadd(ECdomain *dom, ECpoint *a, ECpoint *b, ECpoint *s)
-{
-	if(a->inf && b->inf){
-		s->inf = 1;
-		return;
-	}
-	if(a->inf){
-		ecassign(dom, b, s);
-		return;
-	}
-	if(b->inf){
-		ecassign(dom, a, s);
-		return;
-	}
-
-	if(s->z == nil){
-		s->z = mpcopy(mpone);
-		ecadd(dom, a, b, s);
-		if(!s->inf)
-			jacobian_affine(dom->p, s->x, s->y, s->z);
-		mpfree(s->z);
-		s->z = nil;
-		return;
-	}
-
-	if(a == b)
-		jacobian_dbl(dom->p, dom->a,
-			a->x, a->y, a->z != nil ? a->z : mpone,
-			s->x, s->y, s->z);
-	else
-		jacobian_add(dom->p, dom->a,
-			a->x, a->y, a->z != nil ? a->z : mpone,
-			b->x, b->y, b->z != nil ? b->z : mpone,
-			s->x, s->y, s->z);
-	s->inf = mpcmp(s->z, mpzero) == 0;
-}
-
-void
-ecmul(ECdomain *dom, ECpoint *a, mpint *k, ECpoint *s)
-{
-	ECpoint ns, na;
-	mpint *l;
-
-	if(a->inf || mpcmp(k, mpzero) == 0){
-		s->inf = 1;
-		return;
-	}
-	ns.inf = 1;
-	ns.x = mpnew(0);
-	ns.y = mpnew(0);
-	ns.z = mpnew(0);
-	na.x = mpnew(0);
-	na.y = mpnew(0);
-	na.z = mpnew(0);
-	ecassign(dom, a, &na);
-	l = mpcopy(k);
-	l->sign = 1;
-	while(mpcmp(l, mpzero) != 0){
-		if(l->p[0] & 1)
-			ecadd(dom, &na, &ns, &ns);
-		ecadd(dom, &na, &na, &na);
-		mpright(l, 1, l);
-	}
-	if(k->sign < 0 && !ns.inf){
-		ns.y->sign = -1;
-		mpmod(ns.y, dom->p, ns.y);
-	}
-	ecassign(dom, &ns, s);
-	mpfree(ns.x);
-	mpfree(ns.y);
-	mpfree(ns.z);
-	mpfree(na.x);
-	mpfree(na.y);
-	mpfree(na.z);
-	mpfree(l);
-}
-
-int
-ecverify(ECdomain *dom, ECpoint *a)
-{
-	mpint *p, *q;
-	int r;
-
-	if(a->inf)
-		return 1;
-
-	assert(a->z == nil);	/* need affine coordinates */
-	p = mpnew(0);
-	q = mpnew(0);
-	mpmodmul(a->y, a->y, dom->p, p);
-	mpmodmul(a->x, a->x, dom->p, q);
-	mpmodadd(q, dom->a, dom->p, q);
-	mpmodmul(q, a->x, dom->p, q);
-	mpmodadd(q, dom->b, dom->p, q);
-	r = mpcmp(p, q);
-	mpfree(p);
-	mpfree(q);
-	return r == 0;
-}
-
-int
-ecpubverify(ECdomain *dom, ECpub *a)
-{
-	ECpoint p;
-	int r;
-
-	if(a->inf)
-		return 0;
-	if(!ecverify(dom, a))
-		return 0;
-	p.x = mpnew(0);
-	p.y = mpnew(0);
-	p.z = mpnew(0);
-	ecmul(dom, a, dom->n, &p);
-	r = p.inf;
-	mpfree(p.x);
-	mpfree(p.y);
-	mpfree(p.z);
-	return r;
-}
-
-static void
-fixnibble(uint8_t *a)
-{
-	if(*a >= 'a')
-		*a -= 'a'-10;
-	else if(*a >= 'A')
-		*a -= 'A'-10;
-	else
-		*a -= '0';
-}
-
-static int
-octet(char **s)
-{
-	uint8_t c, d;
-
-	c = *(*s)++;
-	if(!isxdigit(c))
-		return -1;
-	d = *(*s)++;
-	if(!isxdigit(d))
-		return -1;
-	fixnibble(&c);
-	fixnibble(&d);
-	return (c << 4) | d;
-}
-
-static mpint*
-halfpt(ECdomain *dom, char *s, char **rptr, mpint *out)
-{
-	char *buf, *r;
-	int n;
-	mpint *ret;
-
-	n = ((mpsignif(dom->p)+7)/8)*2;
-	if(strlen(s) < n)
-		return 0;
-	buf = malloc(n+1);
-	buf[n] = 0;
-	memcpy(buf, s, n);
-	ret = strtomp(buf, &r, 16, out);
-	*rptr = s + (r - buf);
-	free(buf);
-	return ret;
-}
-
-static int
-mpleg(mpint *a, mpint *b)
-{
-	int r, k;
-	mpint *m, *n, *t;
-
-	r = 1;
-	m = mpcopy(a);
-	n = mpcopy(b);
-	for(;;){
-		if(mpcmp(m, n) > 0)
-			mpmod(m, n, m);
-		if(mpcmp(m, mpzero) == 0){
-			r = 0;
-			break;
-		}
-		if(mpcmp(m, mpone) == 0)
-			break;
-		k = mplowbits0(m);
-		if(k > 0){
-			if(k & 1)
-				switch(n->p[0] & 15){
-				case 3: case 5: case 11: case 13:
-					r = -r;
-				}
-			mpright(m, k, m);
-		}
-		if((n->p[0] & 3) == 3 && (m->p[0] & 3) == 3)
-			r = -r;
-		t = m;
-		m = n;
-		n = t;
-	}
-	mpfree(m);
-	mpfree(n);
-	return r;
-}
-
-static int
-mpsqrt(mpint *n, mpint *p, mpint *r)
-{
-	mpint *a, *t, *s, *xp, *xq, *yp, *yq, *zp, *zq, *N;
-
-	if(mpleg(n, p) == -1)
-		return 0;
-	a = mpnew(0);
-	t = mpnew(0);
-	s = mpnew(0);
-	N = mpnew(0);
-	xp = mpnew(0);
-	xq = mpnew(0);
-	yp = mpnew(0);
-	yq = mpnew(0);
-	zp = mpnew(0);
-	zq = mpnew(0);
-	for(;;){
-		for(;;){
-			mpnrand(p, genrandom, a);
-			if(mpcmp(a, mpzero) > 0)
-				break;
-		}
-		mpmul(a, a, t);
-		mpsub(t, n, t);
-		mpmod(t, p, t);
-		if(mpleg(t, p) == -1)
-			break;
-	}
-	mpadd(p, mpone, N);
-	mpright(N, 1, N);
-	mpmul(a, a, t);
-	mpsub(t, n, t);
-	mpassign(a, xp);
-	uitomp(1, xq);
-	uitomp(1, yp);
-	uitomp(0, yq);
-	while(mpcmp(N, mpzero) != 0){
-		if(N->p[0] & 1){
-			mpmul(xp, yp, zp);
-			mpmul(xq, yq, zq);
-			mpmul(zq, t, zq);
-			mpadd(zp, zq, zp);
-			mpmod(zp, p, zp);
-			mpmul(xp, yq, zq);
-			mpmul(xq, yp, s);
-			mpadd(zq, s, zq);
-			mpmod(zq, p, yq);
-			mpassign(zp, yp);
-		}
-		mpmul(xp, xp, zp);
-		mpmul(xq, xq, zq);
-		mpmul(zq, t, zq);
-		mpadd(zp, zq, zp);
-		mpmod(zp, p, zp);
-		mpmul(xp, xq, zq);
-		mpadd(zq, zq, zq);
-		mpmod(zq, p, xq);
-		mpassign(zp, xp);
-		mpright(N, 1, N);
-	}
-	if(mpcmp(yq, mpzero) != 0)
-		abort();
-	mpassign(yp, r);
-	mpfree(a);
-	mpfree(t);
-	mpfree(s);
-	mpfree(N);
-	mpfree(xp);
-	mpfree(xq);
-	mpfree(yp);
-	mpfree(yq);
-	mpfree(zp);
-	mpfree(zq);
-	return 1;
-}
-
-ECpoint*
-strtoec(ECdomain *dom, char *s, char **rptr, ECpoint *ret)
-{
-	int allocd, o;
-	mpint *r;
-
-	allocd = 0;
-	if(ret == nil){
-		allocd = 1;
-		ret = mallocz(sizeof(*ret), 1);
-		if(ret == nil)
-			return nil;
-		ret->x = mpnew(0);
-		ret->y = mpnew(0);
-	}
-	ret->inf = 0;
-	o = 0;
-	switch(octet(&s)){
-	case 0:
-		ret->inf = 1;
-		break;
-	case 3:
-		o = 1;
-	case 2:
-		if(halfpt(dom, s, &s, ret->x) == nil)
-			goto err;
-		r = mpnew(0);
-		mpmul(ret->x, ret->x, r);
-		mpadd(r, dom->a, r);
-		mpmul(r, ret->x, r);
-		mpadd(r, dom->b, r);
-		if(!mpsqrt(r, dom->p, r)){
-			mpfree(r);
-			goto err;
-		}
-		if((r->p[0] & 1) != o)
-			mpsub(dom->p, r, r);
-		mpassign(r, ret->y);
-		mpfree(r);
-		if(!ecverify(dom, ret))
-			goto err;
-		break;
-	case 4:
-		if(halfpt(dom, s, &s, ret->x) == nil)
-			goto err;
-		if(halfpt(dom, s, &s, ret->y) == nil)
-			goto err;
-		if(!ecverify(dom, ret))
-			goto err;
-		break;
-	}
-	if(ret->z != nil && !ret->inf)
-		mpassign(mpone, ret->z);
-	return ret;
-
-err:
-	if(rptr)
-		*rptr = s;
-	if(allocd){
-		mpfree(ret->x);
-		mpfree(ret->y);
-		free(ret);
-	}
-	return nil;
-}
-
-ECpriv*
-ecgen(ECdomain *dom, ECpriv *p)
-{
-	if(p == nil){
-		p = mallocz(sizeof(*p), 1);
-		if(p == nil)
-			return nil;
-		p->ecpoint.x = mpnew(0);
-		p->ecpoint.y = mpnew(0);
-		p->d = mpnew(0);
-	}
-	for(;;){
-		mpnrand(dom->n, genrandom, p->d);
-		if(mpcmp(p->d, mpzero) > 0)
-			break;
-	}
-	ecmul(dom, &dom->G, p->d, (struct ECpoint *)p);
-	return p;
-}
-
-void
-ecdsasign(ECdomain *dom, ECpriv *priv, uint8_t *dig, int len, mpint *r, mpint *s)
-{
-	ECpriv tmp;
-	mpint *E, *t;
-
-	tmp.ecpoint.x = mpnew(0);
-	tmp.ecpoint.y = mpnew(0);
-	tmp.ecpoint.z = nil;
-	tmp.d = mpnew(0);
-	E = betomp(dig, len, nil);
-	t = mpnew(0);
-	if(mpsignif(dom->n) < 8*len)
-		mpright(E, 8*len - mpsignif(dom->n), E);
-	for(;;){
-		ecgen(dom, &tmp);
-		mpmod(tmp.ecpoint.x, dom->n, r);
-		if(mpcmp(r, mpzero) == 0)
-			continue;
-		mpmul(r, priv->d, s);
-		mpadd(E, s, s);
-		mpinvert(tmp.d, dom->n, t);
-		mpmodmul(s, t, dom->n, s);
-		if(mpcmp(s, mpzero) != 0)
-			break;
-	}
-	mpfree(t);
-	mpfree(E);
-	mpfree(tmp.ecpoint.x);
-	mpfree(tmp.ecpoint.y);
-	mpfree(tmp.d);
-}
-
-int
-ecdsaverify(ECdomain *dom, ECpub *pub, uint8_t *dig, int len, mpint *r, mpint *s)
-{
-	mpint *E, *t, *u1, *u2;
-	ECpoint R, S;
-	int ret;
-
-	if(mpcmp(r, mpone) < 0 || mpcmp(s, mpone) < 0 || mpcmp(r, dom->n) >= 0 || mpcmp(r, dom->n) >= 0)
-		return 0;
-	E = betomp(dig, len, nil);
-	if(mpsignif(dom->n) < 8*len)
-		mpright(E, 8*len - mpsignif(dom->n), E);
-	t = mpnew(0);
-	u1 = mpnew(0);
-	u2 = mpnew(0);
-	R.x = mpnew(0);
-	R.y = mpnew(0);
-	R.z = mpnew(0);
-	S.x = mpnew(0);
-	S.y = mpnew(0);
-	S.z = mpnew(0);
-	mpinvert(s, dom->n, t);
-	mpmodmul(E, t, dom->n, u1);
-	mpmodmul(r, t, dom->n, u2);
-	ecmul(dom, &dom->G, u1, &R);
-	ecmul(dom, pub, u2, &S);
-	ecadd(dom, &R, &S, &R);
-	ret = 0;
-	if(!R.inf){
-		jacobian_affine(dom->p, R.x, R.y, R.z);
-		mpmod(R.x, dom->n, t);
-		ret = mpcmp(r, t) == 0;
-	}
-	mpfree(E);
-	mpfree(t);
-	mpfree(u1);
-	mpfree(u2);
-	mpfree(R.x);
-	mpfree(R.y);
-	mpfree(R.z);
-	mpfree(S.x);
-	mpfree(S.y);
-	mpfree(S.z);
-	return ret;
-}
-
-static char *code = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
-
-void
-base58enc(uint8_t *src, char *dst, int len)
-{
-	mpint *n, *r, *b;
-	char *sdst, t;
-
-	sdst = dst;
-	n = betomp(src, len, nil);
-	b = uitomp(58, nil);
-	r = mpnew(0);
-	while(mpcmp(n, mpzero) != 0){
-		mpdiv(n, b, n, r);
-		*dst++ = code[mptoui(r)];
-	}
-	for(; *src == 0; src++)
-		*dst++ = code[0];
-	dst--;
-	while(dst > sdst){
-		t = *sdst;
-		*sdst++ = *dst;
-		*dst-- = t;
-	}
-}
-
-int
-base58dec(char *src, uint8_t *dst, int len)
-{
-	mpint *n, *b, *r;
-	char *t;
-
-	n = mpnew(0);
-	r = mpnew(0);
-	b = uitomp(58, nil);
-	for(; *src; src++){
-		t = strchr(code, *src);
-		if(t == nil){
-			mpfree(n);
-			mpfree(r);
-			mpfree(b);
-			werrstr("invalid base58 char");
-			return -1;
-		}
-		uitomp(t - code, r);
-		mpmul(n, b, n);
-		mpadd(n, r, n);
-	}
-	mptober(n, dst, len);
-	mpfree(n);
-	mpfree(r);
-	mpfree(b);
-	return 0;
-}
-
-void
-ecdominit(ECdomain *dom, void (*init)(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h))
-{
-	memset(dom, 0, sizeof(*dom));
-	dom->p = mpnew(0);
-	dom->a = mpnew(0);
-	dom->b = mpnew(0);
-	dom->G.x = mpnew(0);
-	dom->G.y = mpnew(0);
-	dom->n = mpnew(0);
-	dom->h = mpnew(0);
-	if(init){
-		(*init)(dom->p, dom->a, dom->b, dom->G.x, dom->G.y, dom->n, dom->h);
-		dom->p = mpfield(dom->p);
-	}
-}
-
-void
-ecdomfree(ECdomain *dom)
-{
-	mpfree(dom->p);
-	mpfree(dom->a);
-	mpfree(dom->b);
-	mpfree(dom->G.x);
-	mpfree(dom->G.y);
-	mpfree(dom->n);
-	mpfree(dom->h);
-	memset(dom, 0, sizeof(*dom));
-}
-
-int
-ecencodepub(ECdomain *dom, ECpub *pub, uint8_t *data, int len)
-{
-	int n;
-
-	n = (mpsignif(dom->p)+7)/8;
-	if(len < 1 + 2*n)
-		return 0;
-	len = 1 + 2*n;
-	data[0] = 0x04;
-	mptober(pub->x, data+1, n);
-	mptober(pub->y, data+1+n, n);
-	return len;
-}
-
-ECpub*
-ecdecodepub(ECdomain *dom, uint8_t *data, int len)
-{
-	ECpub *pub;
-	int n;
-
-	n = (mpsignif(dom->p)+7)/8;
-	if(len != 1 + 2*n || data[0] != 0x04)
-		return nil;
-	pub = mallocz(sizeof(*pub), 1);
-	if(pub == nil)
-		return nil;
-	pub->x = betomp(data+1, n, nil);
-	pub->y = betomp(data+1+n, n, nil);
-	if(!ecpubverify(dom, pub)){
-		ecpubfree(pub);
-		pub = nil;
-	}
-	return pub;
-}
-
-void
-ecpubfree(ECpub *p)
-{
-	if(p == nil)
-		return;
-	mpfree(p->x);
-	mpfree(p->y);
-	free(p);
-}

+ 0 - 201
sys/src/libsec/port/jacobian.c

@@ -1,201 +0,0 @@
-/*
- * Copyright 2016 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- * Copyright 2017 HarveyOS
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-
-void
-jacobian_new(mpint *x, mpint *y, mpint *z, mpint *X, mpint *Y, mpint *Z){
-  mpassign(x, X);
-  mpassign(y, Y);
-  mpassign(z, Z);
-}
-
-void
-jacobian_inf(mpint *X, mpint *Y, mpint *Z){
-  jacobian_new(mpzero, mpone, mpzero, X, Y, Z);
-}
-
-void
-jacobian_affine(mpint *p, mpint *X, mpint *Y, mpint *Z){
-  mpint *ZZZ = mpnew(0);
-  mpint *ZZ = mpnew(0);
-  if (mpcmp(Z, mpzero)!=0){
-    mpmodmul(Z, Z, p, ZZ);
-    mpmodmul(ZZ, Z, p, ZZZ);
-    mpint *tmp1 = mpnew(0);
-    mpinvert(ZZ, p, tmp1);
-    mpmodmul(X, tmp1, p, X);
-    mpfree(tmp1);
-    tmp1 = mpnew(0);
-    mpinvert(ZZZ, p, tmp1);
-    mpmodmul(Y, tmp1, p, Y);
-    mpfree(tmp1);
-    mpassign(mpone, Z);
-  }
-  mpfree(ZZ);
-  mpfree(ZZZ);
-}
-
-void
-jacobian_dbl(mpint *p, mpint *a, mpint *X1, mpint *Y1, mpint *Z1, mpint *X3, mpint *Y3, mpint *Z3){
-	mpint *M = mpnew(0);
-	mpint *S = mpnew(0);
-	mpint *ZZ = mpnew(0);
-	mpint *YYYY = mpnew(0);
-	mpint *YY = mpnew(0);
-	mpint *XX = mpnew(0);
-	if(mpcmp(Y1, mpzero) == 0){
-		jacobian_inf(X3, Y3, Z3);
-		}else{
-		mpmodmul(X1, X1, p, XX);
-		mpmodmul(Y1, Y1, p, YY);
-		mpmodmul(YY, YY, p, YYYY);
-		mpmodmul(Z1, Z1, p, ZZ);
-		mpint *tmp1 = mpnew(0);
-		mpmodadd(X1, YY, p, tmp1);
-		mpmodmul(tmp1, tmp1, p, tmp1);
-		mpmodsub(tmp1, XX, p, tmp1);
-		mpmodsub(tmp1, YYYY, p, tmp1);
-		mpmodadd(tmp1, tmp1, p, S); // 2*tmp1
-		mpfree(tmp1);
-		tmp1 = mpnew(0);
-		uitomp(3UL, tmp1);
-		mpmodmul(tmp1, XX, p, M);
-		mpfree(tmp1);
-		tmp1 = mpnew(0);
-		mpint *tmp2 = mpnew(0);
-		mpmodmul(ZZ, ZZ, p, tmp2);
-		mpmodmul(a, tmp2, p, tmp1);
-		mpfree(tmp2);
-		mpmodadd(M, tmp1, p, M);
-		mpfree(tmp1);
-		mpmodadd(Y1, Z1, p, Z3);
-		mpmodmul(Z3, Z3, p, Z3);
-		mpmodsub(Z3, YY, p, Z3);
-		mpmodsub(Z3, ZZ, p, Z3);
-		mpmodmul(M, M, p, X3);
-		tmp1 = mpnew(0);
-		mpmodadd(S, S, p, tmp1); // 2*S
-		mpmodsub(X3, tmp1, p, X3);
-		mpfree(tmp1);
-		tmp1 = mpnew(0);
-		mpmodsub(S, X3, p, tmp1);
-		mpmodmul(M, tmp1, p, Y3);
-		mpfree(tmp1);
-		tmp1 = mpnew(0);
-		tmp2 = mpnew(0);
-		uitomp(8UL, tmp2);
-		mpmodmul(tmp2, YYYY, p, tmp1);
-		mpfree(tmp2);
-		mpmodsub(Y3, tmp1, p, Y3);
-		mpfree(tmp1);
-		}
-	mpfree(M);
-	mpfree(S);
-	mpfree(ZZ);
-	mpfree(YYYY);
-	mpfree(YY);
-	mpfree(XX);
-}
-
-void
-jacobian_add(mpint *p, mpint *a, mpint *X1, mpint *Y1, mpint *Z1, mpint *X2, mpint *Y2, mpint *Z2, mpint *X3, mpint *Y3, mpint *Z3){
-	mpint *V = mpnew(0);
-	mpint *r = mpnew(0);
-	mpint *J = mpnew(0);
-	mpint *I = mpnew(0);
-	mpint *H = mpnew(0);
-	mpint *S2 = mpnew(0);
-	mpint *S1 = mpnew(0);
-	mpint *U2 = mpnew(0);
-	mpint *U1 = mpnew(0);
-	mpint *Z2Z2 = mpnew(0);
-	mpint *Z1Z1 = mpnew(0);
-	mpmodmul(Z1, Z1, p, Z1Z1);
-	mpmodmul(Z2, Z2, p, Z2Z2);
-	mpmodmul(X1, Z2Z2, p, U1);
-	mpmodmul(X2, Z1Z1, p, U2);
-	mpint *tmp1 = mpnew(0);
-	mpmodmul(Y1, Z2, p, tmp1);
-	mpmodmul(tmp1, Z2Z2, p, S1);
-	mpfree(tmp1);
-	tmp1 = mpnew(0);
-	mpmodmul(Y2, Z1, p, tmp1);
-	mpmodmul(tmp1, Z1Z1, p, S2);
-	mpfree(tmp1);
-	if(mpcmp(U1, U2) == 0){
-		if(mpcmp(S1, S2) != 0){
-			jacobian_inf(X3, Y3, Z3);
-			}else{
-			jacobian_dbl(p, a, X1, Y1, Z1, X3, Y3, Z3);
-			}
-		}else{
-		mpmodsub(U2, U1, p, H);
-		mpmodadd(H, H, p, I); // 2*H
-		mpmodmul(I, I, p, I);
-		mpmodmul(H, I, p, J);
-		mpint *tmp2 = mpnew(0);
-		mpmodsub(S2, S1, p, tmp2);
-		mpmodadd(tmp2, tmp2, p, r); // 2*tmp2
-		mpfree(tmp2);
-		mpmodmul(U1, I, p, V);
-		mpmodmul(r, r, p, X3);
-		mpmodsub(X3, J, p, X3);
-		tmp2 = mpnew(0);
-		mpmodadd(V, V, p, tmp2); // 2*V
-		mpmodsub(X3, tmp2, p, X3);
-		mpfree(tmp2);
-		tmp2 = mpnew(0);
-		mpmodsub(V, X3, p, tmp2);
-		mpmodmul(r, tmp2, p, Y3);
-		mpfree(tmp2);
-		tmp2 = mpnew(0);
-		mpint *tmp3 = mpnew(0);
-		mpmodadd(S1, S1, p, tmp3); // 2*S1
-		mpmodmul(tmp3, J, p, tmp2);
-		mpfree(tmp3);
-		mpmodsub(Y3, tmp2, p, Y3);
-		mpfree(tmp2);
-		tmp2 = mpnew(0);
-		mpmodadd(Z1, Z2, p, tmp2);
-		mpmodmul(tmp2, tmp2, p, tmp2);
-		mpmodsub(tmp2, Z1Z1, p, tmp2);
-		mpmodsub(tmp2, Z2Z2, p, tmp2);
-		mpmodmul(tmp2, H, p, Z3);
-		mpfree(tmp2);
-		}
-	mpfree(V);
-	mpfree(r);
-	mpfree(J);
-	mpfree(I);
-	mpfree(H);
-	mpfree(S2);
-	mpfree(S1);
-	mpfree(U2);
-	mpfree(U1);
-	mpfree(Z2Z2);
-	mpfree(Z1Z1);
-}

+ 0 - 39
sys/src/libsec/port/secp256r1.c

@@ -1,39 +0,0 @@
-/*
- * Copyright 2016 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- * Copyright 2017 HarveyOS
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-
-void
-secp256r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h){
-  strtomp("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", nil, 16, p);
-  uitomp(3UL, a);
-  mpsub(p,a,a);
-  strtomp("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", nil, 16, b);
-  strtomp("6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", nil, 16, x);
-  strtomp("4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", nil, 16, y);
-  strtomp("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", nil, 16, n);
-  mpassign(mpone, h);
-}

+ 0 - 39
sys/src/libsec/port/secp384r1.c

@@ -1,39 +0,0 @@
-/*
- * Copyright 2016 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- * Copyright 2017 HarveyOS
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-
-void
-secp384r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h){
-  strtomp("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", nil, 16, p);
-  uitomp(3UL, a);
-  mpsub(p,a,a);
-  strtomp("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", nil, 16, b);
-  strtomp("AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", nil, 16, x);
-  strtomp("3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", nil, 16, y);
-  strtomp("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", nil, 16, n);
-  mpassign(mpone, h);
-}

File diff suppressed because it is too large
+ 217 - 598
sys/src/libsec/port/tlshand.c


+ 0 - 51
sys/src/libsec/port/tsmemcmp.c

@@ -1,51 +0,0 @@
-/*
- * Copyright 2015 - 2017 cinap_lenrek <cinap_lenrek@felloff.net>
- * Copyright 2017 HarveyOS
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <mp.h>
-#include <libsec.h>
-
-/*
- * timing safe memcmp()
- */
-int
-tsmemcmp(void *a1, void *a2, uint32_t n)
-{
-	int lt, gt, c1, c2, r, m;
-	uint8_t *s1, *s2;
-
-	r = m = 0;
-	s1 = a1;
-	s2 = a2;
-	while(n--){
-		c1 = *s1++;
-		c2 = *s2++;
-		lt = (c1 - c2) >> 8;
-		gt = (c2 - c1) >> 8;
-		r |= (lt - gt) & ~m;
-		m |= lt | gt;
-	}
-	return r;
-}

File diff suppressed because it is too large
+ 247 - 427
sys/src/libsec/port/x509.c


Some files were not shown because too many files changed in this diff