I found out they changed from RFC 5114 to RFC 8998 for the KeyAgreement.
Code:
uint32_t KeyAgreement::prepare(void* buffer, uint32_t* length)
{
CryptoPP::AutoSeededX917RNG<CryptoPP::Rijndael> rng;
auto values = CryptoPP::ASN1::secp256r1().GetValues();
m_domain.AccessGroupParameters().Initialize(CryptoPP::ASN1::secp256r1());
if (!m_domain.GetGroupParameters().ValidateGroup(rng, 3))
{
return 0;
}
m_privateKey.New(m_domain.PrivateKeyLength());
m_publicKey.New(m_domain.PublicKeyLength());
m_domain.GenerateKeyPair(rng, m_privateKey, m_publicKey);
size_t dataLength = m_publicKey.size();
if (*length < dataLength)
{
return 0;
}
*length = dataLength;
memcpy(buffer, m_publicKey.data(), dataLength);
return m_domain.AgreedValueLength();
}
bool KeyAgreement::agree(uint32_t agreeLength, const void* buffer, uint32_t length)
{
if (agreeLength != m_domain.AgreedValueLength() || length != m_domain.PublicKeyLength())
{
return false;
}
m_sharedKey.New(agreeLength);
CryptoPP::SecByteBlock pubKey((const uint8_t*)buffer, length);
if (!m_domain.Agree(m_sharedKey, m_privateKey, pubKey))
{
return false;
}
CryptoPP::Integer sharedKey(m_sharedKey.data(), m_sharedKey.size());
if (sharedKey == 0)
{
return false;
}
return true;
}






