diff --git a/Crypto.cpp b/Crypto.cpp index 831ecf30..75ece1b7 100644 --- a/Crypto.cpp +++ b/Crypto.cpp @@ -66,7 +66,44 @@ namespace crypto const int rsae_ = 65537; - const CryptoConstants& GetCryptoConstants () + struct CryptoConstants + { + // DH/ElGamal + BIGNUM * elgp; + BIGNUM * elgg; + + // DSA + BIGNUM * dsap; + BIGNUM * dsaq; + BIGNUM * dsag; + + // RSA + BIGNUM * rsae; + + CryptoConstants (const uint8_t * elgp_, int elgg_, const uint8_t * dsap_, + const uint8_t * dsaq_, const uint8_t * dsag_, int rsae_) + { + elgp = BN_new (); + BN_bin2bn (elgp_, 256, elgp); + elgg = BN_new (); + BN_set_word (elgg, elgg_); + dsap = BN_new (); + BN_bin2bn (dsap_, 128, dsap); + dsaq = BN_new (); + BN_bin2bn (dsaq_, 20, dsaq); + dsag = BN_new (); + BN_bin2bn (dsag_, 128, dsag); + rsae = BN_new (); + BN_set_word (rsae, rsae_); + } + + ~CryptoConstants () + { + BN_free (elgp); BN_free (elgg); BN_free (dsap); BN_free (dsaq); BN_free (dsag); BN_free (rsae); + } + }; + + static const CryptoConstants& GetCryptoConstants () { static CryptoConstants cryptoConstants (elgp_, elgg_, dsap_, dsaq_, dsag_, rsae_); return cryptoConstants; @@ -81,6 +118,32 @@ namespace crypto return true; } +// RSA + #define rsae GetCryptoConstants ().rsae + const BIGNUM * GetRSAE () + { + return rsae; + } + +// DSA + #define dsap GetCryptoConstants ().dsap + #define dsaq GetCryptoConstants ().dsaq + #define dsag GetCryptoConstants ().dsag + DSA * CreateDSA () + { + DSA * dsa = DSA_new (); + dsa->p = BN_dup (dsap); + dsa->q = BN_dup (dsaq); + dsa->g = BN_dup (dsag); + dsa->priv_key = NULL; + dsa->pub_key = NULL; + return dsa; + } + +// DH/ElGamal + #define elgp GetCryptoConstants ().elgp + #define elgg GetCryptoConstants ().elgg + // DH DHKeys::DHKeys (): m_IsUpdated (true) diff --git a/Crypto.h b/Crypto.h index d08e3b3c..fd49ebc5 100644 --- a/Crypto.h +++ b/Crypto.h @@ -6,64 +6,20 @@ #include #include #include +#include #include "Base.h" namespace i2p { namespace crypto { - struct CryptoConstants - { - // DH/ElGamal - BIGNUM * elgp; - BIGNUM * elgg; - - // DSA - BIGNUM * dsap; - BIGNUM * dsaq; - BIGNUM * dsag; - - // RSA - BIGNUM * rsae; - - CryptoConstants (const uint8_t * elgp_, int elgg_, const uint8_t * dsap_, - const uint8_t * dsaq_, const uint8_t * dsag_, int rsae_) - { - elgp = BN_new (); - BN_bin2bn (elgp_, 256, elgp); - elgg = BN_new (); - BN_set_word (elgg, elgg_); - dsap = BN_new (); - BN_bin2bn (dsap_, 128, dsap); - dsaq = BN_new (); - BN_bin2bn (dsaq_, 20, dsaq); - dsag = BN_new (); - BN_bin2bn (dsag_, 128, dsag); - rsae = BN_new (); - BN_set_word (rsae, rsae_); - } - - ~CryptoConstants () - { - BN_free (elgp); BN_free (elgg); BN_free (dsap); BN_free (dsaq); BN_free (dsag); BN_free (rsae); - } - }; - - const CryptoConstants& GetCryptoConstants (); - - // DH/ElGamal - #define elgp GetCryptoConstants ().elgp - #define elgg GetCryptoConstants ().elgg + bool bn2buf (const BIGNUM * bn, uint8_t * buf, size_t len); // DSA - #define dsap GetCryptoConstants ().dsap - #define dsaq GetCryptoConstants ().dsaq - #define dsag GetCryptoConstants ().dsag + DSA * CreateDSA (); // RSA - #define rsae GetCryptoConstants ().rsae - - bool bn2buf (const BIGNUM * bn, uint8_t * buf, size_t len); + const BIGNUM * GetRSAE (); // DH class DHKeys diff --git a/I2PControl.cpp b/I2PControl.cpp index 5b262e54..4760caec 100644 --- a/I2PControl.cpp +++ b/I2PControl.cpp @@ -525,7 +525,9 @@ namespace client { EVP_PKEY * pkey = EVP_PKEY_new (); RSA * rsa = RSA_new (); - RSA_generate_key_ex (rsa, 4096, i2p::crypto::rsae, NULL); + BIGNUM * e = BN_dup (i2p::crypto::GetRSAE ()); + RSA_generate_key_ex (rsa, 4096, e, NULL); + BN_free (e); if (rsa) { EVP_PKEY_assign_RSA (pkey, rsa); diff --git a/Reseed.cpp b/Reseed.cpp index 1bbd2750..0aac168f 100644 --- a/Reseed.cpp +++ b/Reseed.cpp @@ -156,7 +156,7 @@ namespace data BIGNUM * s = BN_new (), * n = BN_new (); BN_bin2bn (signature, signatureLength, s); BN_bin2bn (it->second, i2p::crypto::RSASHA5124096_KEY_LENGTH, n); - BN_mod_exp (s, s, i2p::crypto::rsae, n, bnctx); // s = s^e mod n + BN_mod_exp (s, s, i2p::crypto::GetRSAE (), n, bnctx); // s = s^e mod n uint8_t * enSigBuf = new uint8_t[signatureLength]; i2p::crypto::bn2buf (s, enSigBuf, signatureLength); // digest is right aligned diff --git a/Signature.h b/Signature.h index 1e7ac2eb..a0b54468 100644 --- a/Signature.h +++ b/Signature.h @@ -44,11 +44,7 @@ namespace crypto DSAVerifier (const uint8_t * signingKey) { - m_PublicKey = DSA_new (); - m_PublicKey->p = BN_dup (dsap); - m_PublicKey->q = BN_dup (dsaq); - m_PublicKey->g = BN_dup (dsag); - m_PublicKey->priv_key = NULL; + m_PublicKey = CreateDSA (); m_PublicKey->pub_key = BN_bin2bn (signingKey, DSA_PUBLIC_KEY_LENGTH, NULL); } @@ -86,12 +82,8 @@ namespace crypto DSASigner (const uint8_t * signingPrivateKey) { - m_PrivateKey = DSA_new (); - m_PrivateKey->p = BN_dup (dsap); - m_PrivateKey->q = BN_dup (dsaq); - m_PrivateKey->g = BN_dup (dsag); + m_PrivateKey = CreateDSA (); m_PrivateKey->priv_key = BN_bin2bn (signingPrivateKey, DSA_PRIVATE_KEY_LENGTH, NULL); - m_PrivateKey->pub_key = NULL; } ~DSASigner () @@ -116,12 +108,7 @@ namespace crypto inline void CreateDSARandomKeys (uint8_t * signingPrivateKey, uint8_t * signingPublicKey) { - DSA * dsa = DSA_new (); - dsa->p = BN_dup (dsap); - dsa->q = BN_dup (dsaq); - dsa->g = BN_dup (dsag); - dsa->priv_key = NULL; - dsa->pub_key = NULL; + DSA * dsa = CreateDSA (); DSA_generate_key (dsa); bn2buf (dsa->priv_key, signingPrivateKey, DSA_PRIVATE_KEY_LENGTH); bn2buf (dsa->pub_key, signingPublicKey, DSA_PUBLIC_KEY_LENGTH); @@ -285,7 +272,7 @@ namespace crypto { m_PublicKey = RSA_new (); memset (m_PublicKey, 0, sizeof (RSA)); - m_PublicKey->e = BN_dup (rsae); + m_PublicKey->e = BN_dup (GetRSAE ()); m_PublicKey->n = BN_bin2bn (signingKey, keyLen, NULL); } @@ -319,7 +306,7 @@ namespace crypto { m_PrivateKey = RSA_new (); memset (m_PrivateKey, 0, sizeof (RSA)); - m_PrivateKey->e = BN_dup (rsae); + m_PrivateKey->e = BN_dup (GetRSAE ()); m_PrivateKey->n = BN_bin2bn (signingPrivateKey, keyLen, NULL); m_PrivateKey->d = BN_bin2bn (signingPrivateKey + keyLen, keyLen, NULL); } @@ -345,10 +332,12 @@ namespace crypto inline void CreateRSARandomKeys (size_t publicKeyLen, uint8_t * signingPrivateKey, uint8_t * signingPublicKey) { RSA * rsa = RSA_new (); - RSA_generate_key_ex (rsa, publicKeyLen*8, rsae, NULL); + BIGNUM * e = BN_dup (GetRSAE ()); // make it non-const + RSA_generate_key_ex (rsa, publicKeyLen*8, e, NULL); bn2buf (rsa->n, signingPrivateKey, publicKeyLen); bn2buf (rsa->d, signingPrivateKey + publicKeyLen, publicKeyLen); bn2buf (rsa->n, signingPublicKey, publicKeyLen); + BN_free (e); // this e is not assigned to rsa->e RSA_free (rsa); }