| /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
| /** |
| * Copyright (c) 2014-2018, Regents of the University of California |
| * |
| * This file is part of NAC (Name-Based Access Control for NDN). |
| * See AUTHORS.md for complete list of NAC authors and contributors. |
| * |
| * NAC 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. |
| * |
| * NAC 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 |
| * NAC, 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 nac { |
| namespace tests { |
| |
| BOOST_AUTO_TEST_SUITE(TestEncryptedContent) |
| |
| const uint8_t encrypted[] = { |
| 0x82, 0x30, // 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 |
| 0x03, |
| 0x85, 0x0a, // InitialVector |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 0x84, 0x07, // EncryptedPayload |
| 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74 |
| }; |
| |
| const uint8_t encryptedNoIv[] = { |
| 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 |
| 0x03, |
| 0x84, 0x07, // EncryptedPayload |
| 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74 |
| }; |
| |
| const uint8_t message[] = { |
| 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74 |
| }; |
| |
| const uint8_t iv[] = { |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73 |
| }; |
| |
| BOOST_AUTO_TEST_CASE(Constructor) |
| { |
| // checking default setting. |
| EncryptedContent content; |
| BOOST_CHECK_EQUAL(content.getAlgorithmType(), -1); |
| BOOST_CHECK_EQUAL(content.getPayload().size(), 0); |
| BOOST_CHECK_EQUAL(content.getInitialVector().size(), 0); |
| BOOST_CHECK_EQUAL(content.hasKeyLocator(), false); |
| BOOST_CHECK_THROW(content.getKeyLocator(), EncryptedContent::Error); |
| |
| // check an encrypted content with IV |
| EncryptedContent rsaOaepContent(tlv::AlgorithmRsaOaep, |
| KeyLocator("test/key/locator"), |
| message, sizeof(message), |
| iv, sizeof(iv)); |
| |
| BOOST_CHECK_EQUAL(rsaOaepContent.getAlgorithmType(), tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContent.getPayload().begin(), |
| rsaOaepContent.getPayload().end(), |
| message, |
| message + sizeof(message)); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContent.getInitialVector().begin(), |
| rsaOaepContent.getInitialVector().end(), |
| iv, |
| iv + sizeof(iv)); |
| BOOST_CHECK_EQUAL(rsaOaepContent.hasKeyLocator(), true); |
| BOOST_CHECK_NO_THROW(rsaOaepContent.getKeyLocator()); |
| BOOST_CHECK_EQUAL(rsaOaepContent.getKeyLocator().getName(), Name("test/key/locator")); |
| |
| // encoding |
| Block encryptedBlock(encrypted, sizeof(encrypted)); |
| const Block& encoded = rsaOaepContent.wireEncode(); |
| |
| BOOST_CHECK_EQUAL_COLLECTIONS(encryptedBlock.wire(), |
| encryptedBlock.wire() + encryptedBlock.size(), |
| encoded.wire(), |
| encoded.wire() + encoded.size()); |
| |
| // decoding |
| EncryptedContent rsaOaepContent2(encryptedBlock); |
| BOOST_CHECK_EQUAL(rsaOaepContent2.getAlgorithmType(), tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContent2.getPayload().begin(), |
| rsaOaepContent2.getPayload().end(), |
| message, |
| message + sizeof(message)); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContent2.getInitialVector().begin(), |
| rsaOaepContent2.getInitialVector().end(), |
| iv, |
| iv + sizeof(iv)); |
| BOOST_CHECK_EQUAL(rsaOaepContent2.hasKeyLocator(), true); |
| BOOST_CHECK_NO_THROW(rsaOaepContent2.getKeyLocator()); |
| BOOST_CHECK_EQUAL(rsaOaepContent2.getKeyLocator().getName(), Name("test/key/locator")); |
| |
| |
| // Check no IV case |
| EncryptedContent rsaOaepContentNoIv(tlv::AlgorithmRsaOaep, |
| KeyLocator("test/key/locator"), |
| message, sizeof(message)); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv.getAlgorithmType(), tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContentNoIv.getPayload().begin(), |
| rsaOaepContentNoIv.getPayload().end(), |
| message, |
| message + sizeof(message)); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv.getInitialVector().size(), 0); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv.hasKeyLocator(), true); |
| BOOST_CHECK_NO_THROW(rsaOaepContentNoIv.getKeyLocator()); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv.getKeyLocator().getName(), Name("test/key/locator")); |
| |
| // encoding |
| Block encryptedBlock2(encryptedNoIv, sizeof(encryptedNoIv)); |
| const Block& encodedNoIV = rsaOaepContentNoIv.wireEncode(); |
| BOOST_CHECK_EQUAL_COLLECTIONS(encryptedBlock2.wire(), |
| encryptedBlock2.wire() + encryptedBlock2.size(), |
| encodedNoIV.wire(), |
| encodedNoIV.wire() + encodedNoIV.size()); |
| |
| // decoding |
| EncryptedContent rsaOaepContentNoIv2(encryptedBlock2); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv2.getAlgorithmType(), tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL_COLLECTIONS(rsaOaepContentNoIv2.getPayload().begin(), |
| rsaOaepContentNoIv2.getPayload().end(), |
| message, |
| message + sizeof(message)); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv2.getInitialVector().size(), 0); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv2.hasKeyLocator(), true); |
| BOOST_CHECK_NO_THROW(rsaOaepContentNoIv2.getKeyLocator()); |
| BOOST_CHECK_EQUAL(rsaOaepContentNoIv2.getKeyLocator().getName(), Name("test/key/locator")); |
| |
| } |
| |
| BOOST_AUTO_TEST_CASE(ConstructorError) |
| { |
| const uint8_t error1[] = { |
| 0x1f, 0x30, // 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 |
| 0x03, |
| 0x85, 0x0a, // InitialVector |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 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, 0x30, // 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 |
| 0x03, |
| 0x85, 0x0a, // InitialVector |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 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, 0x30, // 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) |
| 0x03, |
| 0x85, 0x0a, // InitialVector |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 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, 0x30, // 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 |
| 0x03, |
| 0x1f, 0x0a, // InitialVector (0x84, 0x0a) |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 0x84, 0x07, // EncryptedPayload |
| 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, 0x30, // 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 |
| 0x03, |
| 0x85, 0x0a, // InitialVector |
| 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x62, 0x69, 0x74, 0x73, |
| 0x21, 0x07, // EncryptedPayload (0x85, 0x07) |
| 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74 |
| }; |
| Block errorBlock5(error5, sizeof(error5)); |
| BOOST_CHECK_THROW(EncryptedContent info(errorBlock5), EncryptedContent::Error); |
| |
| const uint8_t error6[] = { |
| 0x82, 0x00 // Empty EncryptedContent |
| }; |
| Block errorBlock6(error6, sizeof(error6)); |
| BOOST_CHECK_THROW(EncryptedContent info(errorBlock6), EncryptedContent::Error); |
| } |
| |
| BOOST_AUTO_TEST_CASE(SetterGetter) |
| { |
| EncryptedContent content; |
| BOOST_CHECK_EQUAL(content.getAlgorithmType(), -1); |
| BOOST_CHECK_EQUAL(content.getPayload().size(), 0); |
| BOOST_CHECK_EQUAL(content.getInitialVector().size(), 0); |
| BOOST_CHECK_EQUAL(content.hasKeyLocator(), false); |
| BOOST_CHECK_THROW(content.getKeyLocator(), EncryptedContent::Error); |
| |
| content.setAlgorithmType(tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL(content.getAlgorithmType(), tlv::AlgorithmRsaOaep); |
| BOOST_CHECK_EQUAL(content.getPayload().size(), 0); |
| BOOST_CHECK_EQUAL(content.getInitialVector().size(), 0); |
| 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().size(), 0); |
| BOOST_CHECK_EQUAL(content.getInitialVector().size(), 0); |
| |
| content.setPayload(message, sizeof(message)); |
| BOOST_CHECK_EQUAL_COLLECTIONS(content.getPayload().begin(), |
| content.getPayload().end(), |
| message, |
| message + sizeof(message)); |
| |
| content.setInitialVector(iv, sizeof(iv)); |
| BOOST_CHECK_EQUAL_COLLECTIONS(content.getInitialVector().begin(), |
| content.getInitialVector().end(), |
| iv, |
| iv + sizeof(iv)); |
| |
| 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 nac |
| } // namespace ndn |