ByteArray HKDF::expand(const ByteArray &prk, const ByteArray &info, int outputSize) const { int iterations = std::ceil((float)outputSize / HKDF::HASH_OUTPUT_SIZE); ByteArray mixin; ByteArray results; int remainingBytes = outputSize; for (int i = iterationStartOffset; i < (iterations + iterationStartOffset); i++) { ByteArray message(mixin); if (!info.empty()) { message += info; } message += ByteArray(1, (char)(i % 256)); unsigned char out[32]; HMAC_SHA256((unsigned char*)message.c_str(), message.size(), (unsigned char*)prk.c_str(), prk.size(), out); ByteArray stepResult((const char*)out, 32); int stepSize = std::min((int)remainingBytes, (int)stepResult.size()); results += stepResult.substr(0, stepSize); mixin = stepResult; remainingBytes -= stepSize; } return results; }
void OpenPGPCryptoHashHMAC::reset(void) { std::string key(m_keyBuf.rawBuffer(), m_keyLen); switch (m_hashType) { case (XSECCryptoHash::HASH_SHA1) : mp_md.reset(HMAC_SHA1(key)); break; case (XSECCryptoHash::HASH_MD5) : mp_md.reset(HMAC_MD5(key)); break; case (XSECCryptoHash::HASH_SHA224) : mp_md.reset(HMAC_SHA224(key)); break; case (XSECCryptoHash::HASH_SHA256) : mp_md.reset(HMAC_SHA256(key)); break; case (XSECCryptoHash::HASH_SHA384) : mp_md.reset(HMAC_SHA384(key)); break; case (XSECCryptoHash::HASH_SHA512) : mp_md.reset(HMAC_SHA512(key)); break; default : mp_md.reset(); } if(!mp_md) { throw XSECCryptoException(XSECCryptoException::MDError, "OpenPGP:HashHMAC - Error loading Message Digest"); } }
ByteArray HKDF::extract(const ByteArray &salt, const ByteArray &inputKeyMaterial) const { unsigned char out[32]; HMAC_SHA256((unsigned char*)inputKeyMaterial.c_str(), inputKeyMaterial.size(), (unsigned char*)salt.c_str(), salt.size(), out); return ByteArray((const char*)out, 32); }
ByteArray SenderChainKey::getDerivative(const ByteArray &seed, const ByteArray &key) const { unsigned char out[32]; HMAC_SHA256((unsigned char*)seed.c_str(), seed.size(), (unsigned char*)key.c_str(), key.size(), out); return ByteArray((const char*)out, 32); }