fixed point DH operations

This commit is contained in:
Jacob Barthelmeh
2016-01-29 10:31:49 -07:00
parent 6856e5bbe6
commit 9a5ad356a6
2 changed files with 51 additions and 4 deletions

View File

@ -30,7 +30,7 @@
#include <wolfssl/wolfcrypt/dh.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
#ifndef USER_MATH_LIB
#if !defined(USER_MATH_LIB) && !defined(WOLFSSL_DH_CONST)
#include <math.h>
#define XPOW(x,y) pow((x),(y))
#define XLOG(x) log((x))
@ -39,7 +39,7 @@
#endif
#ifndef WOLFSSL_HAVE_MIN
#if !defined(WOLFSSL_HAVE_MIN) && !defined(WOLFSSL_DH_CONST)
#define WOLFSSL_HAVE_MIN
static INLINE word32 min(word32 a, word32 b)
@ -72,6 +72,8 @@ void wc_FreeDhKey(DhKey* key)
}
/* if defined to not use floating point values do not compile in */
#ifndef WOLFSSL_DH_CONST
static word32 DiscreteLogWorkFactor(word32 n)
{
/* assuming discrete log takes about the same time as factoring */
@ -81,14 +83,51 @@ static word32 DiscreteLogWorkFactor(word32 n)
return (word32)(2.4 * XPOW((double)n, 1.0/3.0) *
XPOW(XLOG((double)n), 2.0/3.0) - 5);
}
#endif /* WOLFSSL_DH_CONST*/
/* if not using fixed points use DiscreteLogWorkFactor function for unsual size
otherwise round up on size needed */
#ifndef WOLFSSL_DH_CONST
#define WOLFSSL_DH_ROUND(x)
#else
#define WOLFSSL_DH_ROUND(x) \
do { \
if (x % 128) { \
x &= 0xffffff80;\
x += 128; \
} \
} \
while (0)
#endif
static int GeneratePrivate(DhKey* key, WC_RNG* rng, byte* priv, word32* privSz)
{
int ret;
word32 sz = mp_unsigned_bin_size(&key->p);
sz = min(sz, 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
/* predetermined values that operation would return for size */
WOLFSSL_DH_ROUND(sz); /* if using fixed points only, than round up */
switch (sz) {
case 128: sz = 21; break;
case 256: sz = 29; break;
case 384: sz = 34; break;
case 512: sz = 39; break;
case 640: sz = 42; break;
case 768: sz = 46; break;
case 896: sz = 49; break;
case 1024: sz = 52; break;
default:
#ifndef WOLFSSL_DH_CONST
/* if using floating points and size of p is not in table */
sz = min(sz, 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
WOLFSSL_BIT_SIZE + 1);
break;
#else
return BAD_FUNC_ARG;
#endif
}
ret = wc_RNG_GenerateBlock(rng, priv, sz);
if (ret != 0)
@ -107,7 +146,7 @@ static int GeneratePublic(DhKey* key, const byte* priv, word32 privSz,
{
int ret = 0;
mp_int x;
mp_int x;
mp_int y;
if (mp_init_multi(&x, &y, 0, 0, 0, 0) != MP_OKAY)

View File

@ -162,6 +162,8 @@
#define NO_FILESYSTEM
#define NO_SHA512
#define NO_DH
/* Allows use of DH with fixed points if uncommented and NO_DH is removed */
/* WOLFSSL_DH_CONST */
#define NO_DSA
#define NO_HC128
#define NO_RSA
@ -246,6 +248,8 @@
#define NO_DEV_RANDOM
#define NO_SHA512
#define NO_DH
/* Allows use of DH with fixed points if uncommented and NO_DH is removed */
/* WOLFSSL_DH_CONST */
#define NO_DSA
#define NO_HC128
#define HAVE_ECC
@ -267,6 +271,8 @@
#define NO_RSA
#define NO_DSA
#define NO_DH
/* Allows use of DH with fixed points if uncommented and NO_DH is removed */
/* WOLFSSL_DH_CONST */
#define NO_CERTS
#define NO_PWDBASED
#define NO_DES3
@ -533,6 +539,8 @@ static char *fgets(char *buff, int sz, FILE *fp)
#define NO_WRITEV
#define NO_SHA512
#define NO_DH
/* Allows use of DH with fixed points if uncommented and NO_DH is removed */
/* WOLFSSL_DH_CONST */
#define NO_DSA
#define NO_HC128
#define NO_DEV_RANDOM