blob: e53b3f192da8463ff0fe4aac37254d548db01f6c [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2015, Regents of the University of California
*
* This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
* See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
*
* ndn-group-encrypt is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* ndn-group-encrypt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* ndn-group-encrypt, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "encrypted-content.hpp"
#include "boost-test.hpp"
#include <algorithm>
namespace ndn {
namespace gep {
namespace tests {
BOOST_AUTO_TEST_SUITE(TestEncryptedContent)
const uint8_t encrypted[] = {
0x82, 0x24, // EncryptedContent
0x1c, 0x16, // KeyLocator
0x07, 0x14, // Name
0x08, 0x04,
0x74, 0x65, 0x73, 0x74, // 'test'
0x08, 0x03,
0x6b, 0x65, 0x79, // 'key'
0x08, 0x07,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, // 'locator'
0x83, 0x01, // EncryptedAlgorithm
0x00,
0x84, 0x07, // EncryptedPayload
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
const uint8_t message[] = {
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
BOOST_AUTO_TEST_CASE(Constructor)
{
EncryptedContent content;
BOOST_CHECK_EQUAL(content.getAlgorithmType(), -1);
BOOST_CHECK_EQUAL(content.getPayload() == nullptr, true);
BOOST_CHECK_EQUAL(content.hasKeyLocator(), false);
BOOST_CHECK_THROW(content.getKeyLocator(), EncryptedContent::Error);
ConstBufferPtr payload = make_shared<Buffer>(message, sizeof(message));
KeyLocator keyLocator("test/key/locator");
EncryptedContent sha256RsaContent(tlv::AlgorithmSha256WithRsa, keyLocator, payload);
ConstBufferPtr contentPayload = sha256RsaContent.getPayload();
BOOST_CHECK_EQUAL(sha256RsaContent.getAlgorithmType(), tlv::AlgorithmSha256WithRsa);
BOOST_CHECK_EQUAL_COLLECTIONS(contentPayload->begin(),
contentPayload->end(),
payload->begin(),
payload->end());
BOOST_CHECK_EQUAL(sha256RsaContent.hasKeyLocator(), true);
BOOST_CHECK_NO_THROW(sha256RsaContent.getKeyLocator());
BOOST_CHECK_EQUAL(sha256RsaContent.getKeyLocator().getName(), Name("test/key/locator"));
Block encryptedBlock(encrypted, sizeof(encrypted));
const Block& encoded = sha256RsaContent.wireEncode();
BOOST_CHECK_EQUAL_COLLECTIONS(encryptedBlock.wire(),
encryptedBlock.wire() + encryptedBlock.size(),
encoded.wire(),
encoded.wire() + encoded.size());
sha256RsaContent = EncryptedContent(encryptedBlock);
contentPayload = sha256RsaContent.getPayload();
BOOST_CHECK_EQUAL(sha256RsaContent.getAlgorithmType(), tlv::AlgorithmSha256WithRsa);
BOOST_CHECK_EQUAL(sha256RsaContent.hasKeyLocator(), true);
BOOST_CHECK_EQUAL_COLLECTIONS(contentPayload->begin(),
contentPayload->end(),
payload->begin(),
payload->end());
BOOST_CHECK_NO_THROW(sha256RsaContent.getKeyLocator());
BOOST_CHECK_EQUAL(sha256RsaContent.getKeyLocator().getName(), Name("test/key/locator"));
}
BOOST_AUTO_TEST_CASE(ConstructorError)
{
const uint8_t error1[] = {
0x1f, 0x24, // Wrong EncryptedContent (0x82, 0x24)
0x1c, 0x16, // KeyLocator
0x07, 0x14, // Name
0x08, 0x04,
0x74, 0x65, 0x73, 0x74,
0x08, 0x03,
0x6b, 0x65, 0x79,
0x08, 0x07,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
0x83, 0x01, // EncryptedAlgorithm
0x00,
0x84, 0x07, // EncryptedPayload
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
Block errorBlock1(error1, sizeof(error1));
BOOST_CHECK_THROW(EncryptedContent info(errorBlock1), EncryptedContent::Error);
const uint8_t error2[] = {
0x82, 0x24, // EncryptedContent
0x1d, 0x16, // Wrong KeyLocator (0x1c, 0x16)
0x07, 0x14, // Name
0x08, 0x04,
0x74, 0x65, 0x73, 0x74,
0x08, 0x03,
0x6b, 0x65, 0x79,
0x08, 0x07,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
0x83, 0x01, // EncryptedAlgorithm
0x00,
0x84, 0x07, // EncryptedPayload
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
Block errorBlock2(error2, sizeof(error2));
BOOST_CHECK_THROW(EncryptedContent info(errorBlock2), EncryptedContent::Error);
const uint8_t error3[] = {
0x82, 0x24, // EncryptedContent
0x1c, 0x16, // KeyLocator
0x07, 0x14, // Name
0x08, 0x04,
0x74, 0x65, 0x73, 0x74,
0x08, 0x03,
0x6b, 0x65, 0x79,
0x08, 0x07,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
0x1d, 0x01, // Wrong EncryptedAlgorithm (0x83, 0x01)
0x00,
0x84, 0x07, // EncryptedPayload
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
Block errorBlock3(error3, sizeof(error3));
BOOST_CHECK_THROW(EncryptedContent info(errorBlock3), EncryptedContent::Error);
const uint8_t error4[] = {
0x82, 0x24, // EncryptedContent
0x1c, 0x16, // KeyLocator
0x07, 0x14, // Name
0x08, 0x04,
0x74, 0x65, 0x73, 0x74, // 'test'
0x08, 0x03,
0x6b, 0x65, 0x79, // 'key'
0x08, 0x07,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, // 'locator'
0x83, 0x01, // EncryptedAlgorithm
0x00,
0x21, 0x07, // EncryptedPayload (0x84, 0x07)
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74
};
Block errorBlock4(error4, sizeof(error4));
BOOST_CHECK_THROW(EncryptedContent info(errorBlock4), EncryptedContent::Error);
const uint8_t error5[] = {
0x82, 0x00 // Empty EncryptedContent
};
Block errorBlock5(error5, sizeof(error5));
BOOST_CHECK_THROW(EncryptedContent info(errorBlock5), EncryptedContent::Error);
}
BOOST_AUTO_TEST_CASE(SetterGetter)
{
EncryptedContent content;
BOOST_CHECK_EQUAL(content.getAlgorithmType(), -1);
BOOST_CHECK_EQUAL(content.getPayload() == nullptr, true);
BOOST_CHECK_EQUAL(content.hasKeyLocator(), false);
BOOST_CHECK_THROW(content.getKeyLocator(), EncryptedContent::Error);
content.setAlgorithmType(tlv::AlgorithmSha256WithRsa);
BOOST_CHECK_EQUAL(content.getAlgorithmType(), tlv::AlgorithmSha256WithRsa);
BOOST_CHECK_EQUAL(content.getPayload() == nullptr, true);
BOOST_CHECK_EQUAL(content.hasKeyLocator(), false);
KeyLocator keyLocator("/test/key/locator");
content.setKeyLocator(keyLocator);
BOOST_CHECK_EQUAL(content.hasKeyLocator(), true);
BOOST_CHECK_NO_THROW(content.getKeyLocator());
BOOST_CHECK_EQUAL(content.getKeyLocator().getName(), Name("/test/key/locator"));
BOOST_CHECK_EQUAL(content.getPayload() == nullptr, true);
ConstBufferPtr payload = make_shared<Buffer>(message, sizeof(message));
content.setPayload(payload);
ConstBufferPtr contentPayload = content.getPayload();
BOOST_CHECK_EQUAL_COLLECTIONS(contentPayload->begin(),
contentPayload->end(),
payload->begin(),
payload->end());
const Block& encoded = content.wireEncode();
Block contentBlock(encrypted, sizeof(encrypted));
BOOST_CHECK_EQUAL_COLLECTIONS(contentBlock.wire(),
contentBlock.wire() + contentBlock.size(),
encoded.wire(),
encoded.wire() + encoded.size());
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
} // namespace gep
} // namespace ndn