|
|
@ -146,6 +146,10 @@ namespace crypto |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// DH/ElGamal
|
|
|
|
// DH/ElGamal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const int ELGAMAL_SHORT_EXPONENT_NUM_BITS = 226; |
|
|
|
|
|
|
|
const int ELGAMAL_FULL_EXPONENT_NUM_BITS = 2048; |
|
|
|
|
|
|
|
|
|
|
|
#define elgp GetCryptoConstants ().elgp |
|
|
|
#define elgp GetCryptoConstants ().elgp |
|
|
|
#define elgg GetCryptoConstants ().elgg |
|
|
|
#define elgg GetCryptoConstants ().elgg |
|
|
|
|
|
|
|
|
|
|
@ -169,6 +173,10 @@ namespace crypto |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (m_DH->priv_key) { BN_free (m_DH->priv_key); m_DH->priv_key = NULL; }; |
|
|
|
if (m_DH->priv_key) { BN_free (m_DH->priv_key); m_DH->priv_key = NULL; }; |
|
|
|
if (m_DH->pub_key) { BN_free (m_DH->pub_key); m_DH->pub_key = NULL; }; |
|
|
|
if (m_DH->pub_key) { BN_free (m_DH->pub_key); m_DH->pub_key = NULL; }; |
|
|
|
|
|
|
|
#if !defined(__x86_64__) // use short exponent for non x64
|
|
|
|
|
|
|
|
m_DH->priv_key = BN_new (); |
|
|
|
|
|
|
|
BN_rand (m_DH->priv_key, ELGAMAL_SHORT_EXPONENT_NUM_BITS, 0, 1); |
|
|
|
|
|
|
|
#endif |
|
|
|
DH_generate_key (m_DH); |
|
|
|
DH_generate_key (m_DH); |
|
|
|
if (priv) bn2buf (m_DH->priv_key, priv, 256); |
|
|
|
if (priv) bn2buf (m_DH->priv_key, priv, 256); |
|
|
|
if (pub) bn2buf (m_DH->pub_key, pub, 256); |
|
|
|
if (pub) bn2buf (m_DH->pub_key, pub, 256); |
|
|
@ -201,9 +209,9 @@ namespace crypto |
|
|
|
// select random k
|
|
|
|
// select random k
|
|
|
|
BIGNUM * k = BN_new (); |
|
|
|
BIGNUM * k = BN_new (); |
|
|
|
#if defined(__x86_64__) |
|
|
|
#if defined(__x86_64__) |
|
|
|
BN_rand (k, 2048, -1, 1); // full exponent for x64
|
|
|
|
BN_rand (k, ELGAMAL_FULL_EXPONENT_NUM_BITS, -1, 1); // full exponent for x64
|
|
|
|
#else |
|
|
|
#else |
|
|
|
BN_rand (k, 226, -1, 1); // short exponent of 226 bits
|
|
|
|
BN_rand (k, ELGAMAL_SHORT_EXPONENT_NUM_BITS, -1, 1); // short exponent of 226 bits
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
// caulculate a
|
|
|
|
// caulculate a
|
|
|
|
a = BN_new (); |
|
|
|
a = BN_new (); |
|
|
@ -282,6 +290,14 @@ namespace crypto |
|
|
|
{ |
|
|
|
{ |
|
|
|
#if defined(__x86_64__) || defined(__i386__) || defined(_MSC_VER) |
|
|
|
#if defined(__x86_64__) || defined(__i386__) || defined(_MSC_VER) |
|
|
|
RAND_bytes (priv, 256); |
|
|
|
RAND_bytes (priv, 256); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
// lower 226 bits (28 bytes and 2 bits) only. short exponent
|
|
|
|
|
|
|
|
auto numBytes = (ELGAMAL_SHORT_EXPONENT_NUM_BITS)/8 + 1; // 29
|
|
|
|
|
|
|
|
auto numZeroBytes = 256 - numBytes; |
|
|
|
|
|
|
|
RAND_bytes (priv + numZeroBytes, numBytes); |
|
|
|
|
|
|
|
memset (priv, 0, numZeroBytes); |
|
|
|
|
|
|
|
priv[numZeroBytes] &= 0x04; |
|
|
|
|
|
|
|
#endif |
|
|
|
BN_CTX * ctx = BN_CTX_new (); |
|
|
|
BN_CTX * ctx = BN_CTX_new (); |
|
|
|
BIGNUM * p = BN_new (); |
|
|
|
BIGNUM * p = BN_new (); |
|
|
|
BN_bin2bn (priv, 256, p); |
|
|
|
BN_bin2bn (priv, 256, p); |
|
|
@ -289,11 +305,6 @@ namespace crypto |
|
|
|
bn2buf (p, pub, 256); |
|
|
|
bn2buf (p, pub, 256); |
|
|
|
BN_free (p); |
|
|
|
BN_free (p); |
|
|
|
BN_CTX_free (ctx); |
|
|
|
BN_CTX_free (ctx); |
|
|
|
#else |
|
|
|
|
|
|
|
DHKeys dh; |
|
|
|
|
|
|
|
dh.GenerateKeys (priv, pub); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// HMAC
|
|
|
|
// HMAC
|
|
|
|