// Hashing functions bool OSSLEVPHashAlgorithm::hashInit() { if (!HashAlgorithm::hashInit()) { return false; } // Initialize the context curCTX = EVP_MD_CTX_new(); if (curCTX == NULL) { ERROR_MSG("Failed to allocate space for EVP_MD_CTX"); return false; } // Initialize EVP digesting if (!EVP_DigestInit_ex(curCTX, getEVPHash(), NULL)) { ERROR_MSG("EVP_DigestInit failed"); EVP_MD_CTX_free(curCTX); curCTX = NULL; ByteString dummy; HashAlgorithm::hashFinal(dummy); return false; } return true; }
bool OSSLEVPHashAlgorithm::hashFinal(ByteString& hashedData) { if (!HashAlgorithm::hashFinal(hashedData)) { return false; } hashedData.resize(EVP_MD_size(getEVPHash())); unsigned int outLen = hashedData.size(); if (!EVP_DigestFinal_ex(curCTX, &hashedData[0], &outLen)) { ERROR_MSG("EVP_DigestFinal failed"); EVP_MD_CTX_free(curCTX); curCTX = NULL; return false; } hashedData.resize(outLen); EVP_MD_CTX_free(curCTX); curCTX = NULL; return true; }
bool OSSLEVPMacAlgorithm::signFinal(ByteString& signature) { if (!MacAlgorithm::signFinal(signature)) { return false; } signature.resize(EVP_MD_size(getEVPHash())); unsigned int outLen = signature.size(); if (!HMAC_Final(&curCTX, &signature[0], &outLen)) { ERROR_MSG("HMAC_Final failed"); HMAC_CTX_cleanup(&curCTX); return false; } signature.resize(outLen); HMAC_CTX_cleanup(&curCTX); return true; }
bool OSSLEVPMacAlgorithm::verifyFinal(ByteString& signature) { if (!MacAlgorithm::verifyFinal(signature)) { return false; } ByteString macResult; unsigned int outLen = EVP_MD_size(getEVPHash()); macResult.resize(outLen); if (!HMAC_Final(&curCTX, &macResult[0], &outLen)) { ERROR_MSG("HMAC_Final failed"); HMAC_CTX_cleanup(&curCTX); return false; } HMAC_CTX_cleanup(&curCTX); return macResult == signature; }
// Signing functions bool OSSLEVPMacAlgorithm::signInit(const SymmetricKey* key) { // Call the superclass initialiser if (!MacAlgorithm::signInit(key)) { return false; } // Initialize the context HMAC_CTX_init(&curCTX); // Initialize EVP signing if (!HMAC_Init(&curCTX, key->getKeyBits().const_byte_str(), key->getKeyBits().size(), getEVPHash())) { ERROR_MSG("HMAC_Init failed"); HMAC_CTX_cleanup(&curCTX); ByteString dummy; MacAlgorithm::signFinal(dummy); return false; } return true; }