From 2d9eff0ecf477b51c9798514dd9ad4222987f060 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sun, 29 Apr 2012 16:48:00 -0700 Subject: [PATCH] Add strUnHex and DH support to utils. --- src/utils.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.h | 10 ++++++++ 2 files changed, 74 insertions(+) diff --git a/src/utils.cpp b/src/utils.cpp index 1c454d004..f67a87724 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -24,4 +24,68 @@ char charHex(int iDigit) return iDigit < 10 ? '0' + iDigit : 'A' - 10 + iDigit; } +int charUnHex(char cDigit) +{ + return cDigit >= '0' && cDigit <= '9' + ? cDigit - '0' + : cDigit >= 'A' && cDigit <= 'F' + ? cDigit - 'A' + 10 + : cDigit >= 'a' && cDigit <= 'f' + ? cDigit - 'a' + 10 + : -1; +} + +void strUnHex(std::string& strDst, const std::string& strSrc) +{ + int iBytes = strSrc.size()/2; + + strDst.resize(iBytes); + + for (int i=0; i != iBytes; i++) + strDst[i] = (charUnHex(strSrc[i*2]) << 4) | charUnHex(strSrc[i*2+1]); +} + +void DH_der_gen(std::string& strDer, int iKeyLength) +{ + DH* dh = 0; + int iCodes; + + do { + dh = DH_generate_parameters(iKeyLength, DH_GENERATOR_5, NULL, NULL); + iCodes = 0; + DH_check(dh, &iCodes); + } while (iCodes & (DH_CHECK_P_NOT_PRIME|DH_CHECK_P_NOT_SAFE_PRIME|DH_UNABLE_TO_CHECK_GENERATOR|DH_NOT_SUITABLE_GENERATOR)); + + strDer.resize(i2d_DHparams(dh, NULL)); + + unsigned char* next = reinterpret_cast(&strDer[0]); + + (void) i2d_DHparams(dh, &next); +} + +void DH_der_gen_hex(std::string& strDer, int iKeyLength) +{ + std::string strBuf; + + DH_der_gen(strBuf, iKeyLength); + + strHex(strDer, strBuf); +} + +DH* DH_der_load(const std::string& strDer) +{ + const unsigned char *pbuf = reinterpret_cast(&strDer[0]); + + return d2i_DHparams(NULL, &pbuf, strDer.size()); +} + +DH* DH_der_load_hex(const std::string& strDer) +{ + std::string strBuf; + + strUnHex(strBuf, strDer); + + return DH_der_load(strBuf); +} + // vim:ts=4 diff --git a/src/utils.h b/src/utils.h index dc6ba8e87..02ee67f90 100644 --- a/src/utils.h +++ b/src/utils.h @@ -4,6 +4,8 @@ #include #include +#include + #define nothing() do {} while (0) boost::posix_time::ptime ptEpoch(); @@ -46,6 +48,14 @@ inline void strHex(std::string& strDst, const std::vector vchData strHex(strDst, vchData.begin(), vchData.size()); } +int charUnHex(char cDigit); +void strUnHex(std::string& strDst, const std::string& strSrc); + +DH* DH_der_load(const std::string& strDer); +DH* DH_der_load_hex(const std::string& strDer); +void DH_der_gen(std::string& strDer, int iKeyLength); +void DH_der_gen_hex(std::string& strDer, int iKeyLength); + #endif // vim:ts=4