cvs commit: src/lib/libmp mpasbn.c

Simon L. Nielsen simon at FreeBSD.org
Sat Jul 29 11:09:27 UTC 2006


On 2006.07.29 08:14:27 +0200, Stefan Farfeleder wrote:
> On Fri, Jul 28, 2006 at 11:00:16PM +0000, Simon L. Nielsen wrote:
> > simon       2006-07-28 23:00:16 UTC
> > 
> >   FreeBSD src repository
> > 
> >   Modified files:
> >     lib/libmp            mpasbn.c 
> >   Log:
> >   Do not put BN_CTX structures on the stack, but instead allocate them
> >   runtime using BN_CTX_new().  This is done since in OpenSSL 0.9.7e we
> >   can only allocate BN_CTX on the stack by including an internal OpenSSL
> >   header file, and in OpenSSL 0.9.8 BN_CTX is entirely opaque, so having
> >   it on the stack is not possible at all.
> >   
> >   This is done as preparation for OpenSSL 0.9.8b import.
> 
> It might be preferable to pass the allocated BN_CTXs to _mdiv(),
> _mult() and _sdiv() because then msqrt() would have to call
> BN_CTX_new() only once.

Sounds like a good idea.  How about the attached patch?

-- 
Simon L. Nielsen
-------------- next part --------------
Index: mpasbn.c
===================================================================
RCS file: /home/ncvs/src/lib/libmp/mpasbn.c,v
retrieving revision 1.4
diff -u -d -r1.4 mpasbn.c
--- mpasbn.c	28 Jul 2006 23:00:16 -0000	1.4
+++ mpasbn.c	29 Jul 2006 11:02:31 -0000
@@ -95,15 +95,16 @@
 static MINT *_itom(const char *, short);
 static void _madd(const char *, const MINT *, const MINT *, MINT *);
 static int _mcmpa(const char *, const MINT *, const MINT *);
-static void _mdiv(const char *, const MINT *, const MINT *, MINT *, MINT *);
+static void _mdiv(const char *, const MINT *, const MINT *, MINT *, MINT *,
+		BN_CTX *);
 static void _mfree(const char *, MINT *);
 static void _moveb(const char *, const BIGNUM *, MINT *);
 static void _movem(const char *, const MINT *, MINT *);
 static void _msub(const char *, const MINT *, const MINT *, MINT *);
 static char *_mtod(const char *, const MINT *);
 static char *_mtox(const char *, const MINT *);
-static void _mult(const char *, const MINT *, const MINT *, MINT *);
-static void _sdiv(const char *, const MINT *, short, MINT *, short *);
+static void _mult(const char *, const MINT *, const MINT *, MINT *, BN_CTX *);
+static void _sdiv(const char *, const MINT *, short, MINT *, short *, BN_CTX *);
 static MINT *_xtom(const char *, const char *);
 
 /*
@@ -223,14 +224,11 @@
  * Compute qmp=nmp/dmp and rmp=nmp%dmp.
  */
 static void
-_mdiv(const char *msg, const MINT *nmp, const MINT *dmp, MINT *qmp, MINT *rmp)
+_mdiv(const char *msg, const MINT *nmp, const MINT *dmp, MINT *qmp, MINT *rmp,
+    BN_CTX *c)
 {
 	BIGNUM q, r;
-	BN_CTX *c;
 
-	c = BN_CTX_new();
-	if (c == NULL)
-		_bnerr(msg);
 	BN_init(&r);
 	BN_init(&q);
 	BN_ERRCHECK(msg, BN_div(&q, &r, nmp->bn, dmp->bn, c));
@@ -238,14 +236,18 @@
 	_moveb(msg, &r, rmp);
 	BN_free(&q);
 	BN_free(&r);
-	BN_CTX_free(c);
 }
 
 void
 mdiv(const MINT *nmp, const MINT *dmp, MINT *qmp, MINT *rmp)
 {
+	BN_CTX *c;
 
-	_mdiv("mdiv", nmp, dmp, qmp, rmp);
+	c = BN_CTX_new();
+	if (c == NULL)
+		_bnerr("mdiv");
+	_mdiv("mdiv", nmp, dmp, qmp, rmp, c);
+	BN_CTX_free(c);
 }
 
 /*
@@ -357,11 +359,15 @@
 void
 msqrt(const MINT *nmp, MINT *xmp, MINT *rmp)
 {
+	BN_CTX *c;
 	MINT *tolerance;
 	MINT *ox, *x;
 	MINT *z1, *z2, *z3;
 	short i;
 
+	c = BN_CTX_new();
+	if (c == NULL)
+		_bnerr("msqrt");
 	tolerance = _itom("msqrt", 1);
 	x = _itom("msqrt", 1);
 	ox = _itom("msqrt", 0);
@@ -370,13 +376,13 @@
 	z3 = _itom("msqrt", 0);
 	do {
 		_movem("msqrt", x, ox);
-		_mdiv("msqrt", nmp, x, z1, z2);
+		_mdiv("msqrt", nmp, x, z1, z2, c);
 		_madd("msqrt", x, z1, z2);
-		_sdiv("msqrt", z2, 2, x, &i);
+		_sdiv("msqrt", z2, 2, x, &i, c);
 		_msub("msqrt", ox, x, z3);
 	} while (_mcmpa("msqrt", z3, tolerance) == 1);
 	_movem("msqrt", x, xmp);
-	_mult("msqrt", x, x, z1);
+	_mult("msqrt", x, x, z1, c);
 	_msub("msqrt", nmp, z1, z2);
 	_movem("msqrt", z2, rmp);
 	_mfree("msqrt", tolerance);
@@ -385,6 +391,7 @@
 	_mfree("msqrt", z1);
 	_mfree("msqrt", z2);
 	_mfree("msqrt", z3);
+	BN_CTX_free(c);
 }
 
 /*
@@ -470,26 +477,26 @@
  * Compute rmp=mp1*mp2.
  */
 static void
-_mult(const char *msg, const MINT *mp1, const MINT *mp2, MINT *rmp)
+_mult(const char *msg, const MINT *mp1, const MINT *mp2, MINT *rmp, BN_CTX *c)
 {
 	BIGNUM b;
-	BN_CTX *c;
 
-	c = BN_CTX_new();
-	if (c == NULL)
-		_bnerr(msg);
 	BN_init(&b);
 	BN_ERRCHECK(msg, BN_mul(&b, mp1->bn, mp2->bn, c));
 	_moveb(msg, &b, rmp);
 	BN_free(&b);
-	BN_CTX_free(c);
 }
 
 void
 mult(const MINT *mp1, const MINT *mp2, MINT *rmp)
 {
+	BN_CTX *c;
 
-	_mult("mult", mp1, mp2, rmp);
+	c = BN_CTX_new();
+	if (c == NULL)
+		_bnerr("mult");
+	_mult("mult", mp1, mp2, rmp, c);
+	BN_CTX_free(c);
 }
 
 /*
@@ -538,16 +545,13 @@
  * Compute qmp=nmp/d and ro=nmp%d.
  */
 static void
-_sdiv(const char *msg, const MINT *nmp, short d, MINT *qmp, short *ro)
+_sdiv(const char *msg, const MINT *nmp, short d, MINT *qmp, short *ro,
+    BN_CTX *c)
 {
 	MINT *dmp, *rmp;
 	BIGNUM q, r;
-	BN_CTX *c;
 	char *s;
 
-	c = BN_CTX_new();
-	if (c == NULL)
-		_bnerr(msg);
 	BN_init(&q);
 	BN_init(&r);
 	dmp = _itom(msg, d);
@@ -565,14 +569,18 @@
 	_mfree(msg, rmp);
 	BN_free(&r);
 	BN_free(&q);
-	BN_CTX_free(c);
 }
 
 void
 sdiv(const MINT *nmp, short d, MINT *qmp, short *ro)
 {
+	BN_CTX *c;
 
-	_sdiv("sdiv", nmp, d, qmp, ro);
+	c = BN_CTX_new();
+	if (c == NULL)
+		_bnerr("sdiv");
+	_sdiv("sdiv", nmp, d, qmp, ro, c);
+	BN_CTX_free(c);
 }
 
 /*


More information about the cvs-src mailing list