Adding optional initial vector to EncryptedContent
Refs: #3013
Change-Id: I1c6fea3552796d13525d33e3a9d385156e2d463e
diff --git a/src/encrypted-content.cpp b/src/encrypted-content.cpp
index 0a7c9e1..29f8ceb 100644
--- a/src/encrypted-content.cpp
+++ b/src/encrypted-content.cpp
@@ -19,11 +19,13 @@
{
}
-EncryptedContent::EncryptedContent(tlv::AlgorithmTypeValue type, const KeyLocator& keyLocator, const ConstBufferPtr& payload)
+EncryptedContent::EncryptedContent(tlv::AlgorithmTypeValue type, const KeyLocator& keyLocator,
+ ConstBufferPtr payload, ConstBufferPtr iv)
: m_type(type)
, m_hasKeyLocator(true)
, m_keyLocator(keyLocator)
, m_payload(payload)
+ , m_iv(iv)
{
}
@@ -57,13 +59,26 @@
}
void
-EncryptedContent::setPayload(const ConstBufferPtr& payload)
+EncryptedContent::setInitialVector(ConstBufferPtr iv)
+{
+ m_wire.reset();
+ m_iv = iv;
+}
+
+ConstBufferPtr
+EncryptedContent::getInitialVector() const
+{
+ return m_iv;
+}
+
+void
+EncryptedContent::setPayload(ConstBufferPtr payload)
{
m_wire.reset();
m_payload = payload;
}
-const ConstBufferPtr
+ConstBufferPtr
EncryptedContent::getPayload() const
{
return m_payload;
@@ -75,7 +90,13 @@
{
size_t totalLength = 0;
- totalLength += block.appendByteArrayBlock(tlv::EncryptedPayload, m_payload->buf(), m_payload->size());
+ if (m_payload != nullptr)
+ totalLength += block.prependByteArrayBlock(tlv::EncryptedPayload, m_payload->buf(), m_payload->size());
+ else
+ throw Error("EncryptedContent does not have a payload");
+
+ if (m_iv != nullptr)
+ totalLength += block.prependByteArrayBlock(tlv::InitialVector, m_iv->buf(), m_iv->size());
if (m_type != -1)
totalLength += prependNonNegativeIntegerBlock(block, tlv::EncryptionAlgorithm, m_type);
@@ -85,7 +106,7 @@
if (m_hasKeyLocator)
totalLength += m_keyLocator.wireEncode(block);
else
- throw Error("EncryptedContent does not have key locator");
+ throw Error("EncryptedContent does not have a key locator");
totalLength += block.prependVarNumber(totalLength);
totalLength += block.prependVarNumber(tlv::EncryptedContent);
@@ -140,8 +161,15 @@
else
throw Error("EncryptedContent does not have encryption algorithm");
+ if (it != m_wire.elements_end() && it->type() == tlv::InitialVector) {
+ m_iv = make_shared<Buffer>(it->value_begin(), it->value_end());
+ it++;
+ }
+ else
+ m_iv = nullptr;
+
if (it != m_wire.elements_end() && it->type() == tlv::EncryptedPayload) {
- m_payload = make_shared<Buffer>(it->value_begin(),it->value_end());
+ m_payload = make_shared<Buffer>(it->value_begin(), it->value_end());
it++;
}
else