diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-06-11 08:26:55 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-06-11 08:34:25 +0200 |
commit | d01574f792779667a554f26d3379935827813c19 (patch) | |
tree | 462b55f018f5637c0c7e384020fab418c4d036e7 | |
parent | 4e45932659aa04417661b63e7e0546e656997d6c (diff) | |
parent | 4a09e1df51267c6d2dec219c6f96a24b716cc251 (diff) |
Merge pull request #4277
4a09e1d key.cpp: fail with a friendlier message on missing ssl EC support (Andrew Poelstra)
-rw-r--r-- | src/init.cpp | 21 | ||||
-rw-r--r-- | src/key.cpp | 12 | ||||
-rw-r--r-- | src/key.h | 3 |
3 files changed, 36 insertions, 0 deletions
diff --git a/src/init.cpp b/src/init.cpp index ca348b614e..1d86cf087d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -11,6 +11,7 @@ #include "addrman.h" #include "checkpoints.h" +#include "key.h" #include "main.h" #include "miner.h" #include "net.h" @@ -394,6 +395,23 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles) } } +/** Sanity checks + * Ensure that Bitcoin is running in a usable environment with all + * necessary library support. + */ +bool InitSanityCheck(void) +{ + if(!ECC_InitSanityCheck()) { + InitError("OpenSSL appears to lack support for elliptic curve cryptography. For more " + "information, visit https://en.bitcoin.it/wiki/OpenSSL_and_EC_Libraries"); + return false; + } + + // TODO: remaining sanity checks, see #4081 + + return true; +} + /** Initialize bitcoin. * @pre Parameters should be parsed and config file should be read. */ @@ -598,6 +616,9 @@ bool AppInit2(boost::thread_group& threadGroup) std::string strWalletFile = GetArg("-wallet", "wallet.dat"); #endif // ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log + // Sanity check + if (!InitSanityCheck()) + return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down.")); std::string strDataDir = GetDataDir().string(); #ifdef ENABLE_WALLET diff --git a/src/key.cpp b/src/key.cpp index aa24f0a622..4747beffb4 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -631,3 +631,15 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { out.nChild = nChild; return pubkey.Derive(out.pubkey, out.vchChainCode, nChild, vchChainCode); } + +bool ECC_InitSanityCheck() { + EC_KEY *pkey = EC_KEY_new_by_curve_name(NID_secp256k1); + if(pkey == NULL) + return false; + EC_KEY_free(pkey); + + // TODO Is there more EC functionality that could be missing? + return true; +} + + @@ -306,4 +306,7 @@ struct CExtKey { void SetMaster(const unsigned char *seed, unsigned int nSeedLen); }; +/** Check that required EC support is available at runtime */ +bool ECC_InitSanityCheck(void); + #endif |