Exemple #1
0
void 
IpmiPayload::deserializeEncryptedRmcpp(ByteVector& outData, const ByteVector& key, const ByteVector& in, size_t& pos)
{
    // deserialize payload
    deserializeRmcpp(outData, in, pos);
    // strip IV from payload
    ByteVector iv(outData.c_ptr(), 16);

    outData.erase(outData.begin(), outData.begin() + 16);
    // decrypt payload
    ByteVector decryptedPayload;
    CryptoProxy::getInstance()->decrypt(key, iv, outData, decryptedPayload);
    // verify padding
    byte_t padLength = decryptedPayload[decryptedPayload.length() - 1];
    const byte_t* pad = decryptedPayload.c_ptr(decryptedPayload.length() - padLength -1);
    for (byte_t i = 1; i <= padLength; ++i, ++pad)
    {
        if (*pad != i)
            throw runtime_error("Incorrect padding on incoming encrypted message");
    }
    // strip padding
    outData.assign(decryptedPayload.begin(), decryptedPayload.end() - padLength -1);
}