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); }