1 /*############################################################################ 2 # Copyright 2017 Intel Corporation 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 ############################################################################*/ 16 /// Unit tests for OneTimePad. 17 /*! \file */ 18 19 #include <gtest/gtest.h> 20 21 #include "epid/member/tiny/math/unittests/onetimepad.h" 22 23 namespace { 24 25 TEST(OneTimePadTest, GenerateFailsWhenDefaultConstructedWithoutInit) { 26 OneTimePad otp; 27 EXPECT_EQ(0u, otp.BitsConsumed()); 28 std::vector<unsigned int> actual({0, 0}); 29 EXPECT_NE(0, OneTimePad::Generate(actual.data(), 8, &otp)); 30 } 31 32 TEST(OneTimePadTest, GeneratesCorrectDataWhenConstructedWithUint8s) { 33 std::vector<unsigned int> actual1({0, 0}); 34 std::vector<unsigned int> actual2({0, 0}); 35 const std::vector<unsigned int> expected1({0x07050301, 0}); 36 const std::vector<unsigned int> expected2({0x0e0c0a09, 0}); 37 OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e}); 38 EXPECT_EQ(0u, otp.BitsConsumed()); 39 EXPECT_EQ(0, OneTimePad::Generate(actual1.data(), 32, &otp)); 40 EXPECT_EQ(expected1, actual1); 41 EXPECT_EQ(32u, otp.BitsConsumed()); 42 EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp)); 43 EXPECT_EQ(expected2, actual2); 44 EXPECT_EQ(64u, otp.BitsConsumed()); 45 } 46 47 TEST(OneTimePadTest, GeneratesCorrectDataWhenInitilizedWithUint8s) { 48 std::vector<unsigned int> actual1({0, 0}); 49 std::vector<unsigned int> actual2({0, 0}); 50 const std::vector<unsigned int> expected1({0x07050301, 0}); 51 const std::vector<unsigned int> expected2({0x0e0c0a09, 0}); 52 OneTimePad otp; 53 otp.InitUint8({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e}); 54 EXPECT_EQ(0u, otp.BitsConsumed()); 55 EXPECT_EQ(0, OneTimePad::Generate(actual1.data(), 32, &otp)); 56 EXPECT_EQ(expected1, actual1); 57 EXPECT_EQ(32u, otp.BitsConsumed()); 58 EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp)); 59 EXPECT_EQ(expected2, actual2); 60 EXPECT_EQ(64u, otp.BitsConsumed()); 61 } 62 TEST(OneTimePadTest, GeneratesCorrectDataWhenInitilizedWithUint32s) { 63 std::vector<uint32_t> actual({0x00}); 64 const std::vector<uint32_t> expected({0x01}); 65 std::vector<uint32_t> actual2({0x00}); 66 const std::vector<uint32_t> expected2({0x01020304}); 67 OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e}); 68 otp.InitUint32({0x01, 0x01020304}); 69 EXPECT_EQ(0u, otp.BitsConsumed()); 70 EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp)); 71 EXPECT_EQ(32u, otp.BitsConsumed()); 72 EXPECT_EQ(expected, actual); 73 EXPECT_EQ(0, OneTimePad::Generate(actual2.data(), 32, &otp)); 74 EXPECT_EQ(expected2, actual2); 75 EXPECT_EQ(64u, otp.BitsConsumed()); 76 } 77 TEST(OneTimePadTest, GeneratesSingleBytesCorrectly) { 78 OneTimePad otp({0x01, 0x03, 0x05, 0x07, 0x09, 0x0a, 0x0c, 0x0e}); 79 std::vector<uint8_t> expected1({0x01, 0x00, 0x00, 0x00}); 80 std::vector<uint8_t> expected2({0x03, 0x00, 0x00, 0x00}); 81 std::vector<uint8_t> expected3({0x05, 0x00, 0x00, 0x00}); 82 std::vector<uint8_t> actual({0, 0, 0, 0}); 83 EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp)); 84 EXPECT_EQ(8u, otp.BitsConsumed()); 85 EXPECT_EQ(expected1, actual); 86 EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp)); 87 EXPECT_EQ(16u, otp.BitsConsumed()); 88 EXPECT_EQ(expected2, actual); 89 EXPECT_EQ(0, OneTimePad::Generate((uint32_t*)actual.data(), 8, &otp)); 90 EXPECT_EQ(24u, otp.BitsConsumed()); 91 EXPECT_EQ(expected3, actual); 92 } 93 94 TEST(OneTimePadTest, GenerateRejectsNullPtr) { 95 OneTimePad otp(8); 96 EXPECT_NE(0, OneTimePad::Generate(nullptr, 32, &otp)); 97 } 98 TEST(OneTimePadTest, GenerateRejectsNegativeBits) { 99 OneTimePad otp(8); 100 std::vector<unsigned int> actual({0, 0}); 101 EXPECT_NE(0, OneTimePad::Generate(actual.data(), -32, &otp)); 102 } 103 TEST(OneTimePadTest, GenerateRejectsZeroBits) { 104 OneTimePad otp(8); 105 std::vector<unsigned int> actual({0, 0}); 106 EXPECT_NE(0, OneTimePad::Generate(actual.data(), 0, &otp)); 107 } 108 TEST(OneTimePadTest, GenerateRejectsTooLargeRequest) { 109 OneTimePad otp(8); 110 std::vector<unsigned int> actual({0, 0}); 111 EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp)); 112 EXPECT_EQ(0, OneTimePad::Generate(actual.data(), 32, &otp)); 113 EXPECT_NE(0, OneTimePad::Generate(actual.data(), 32, &otp)); 114 } 115 116 TEST(OneTimePadTest, GenerateRejectsUnsupportedBitRequest) { 117 OneTimePad otp(8); 118 std::vector<unsigned int> actual({0, 0}); 119 EXPECT_NE(0, OneTimePad::Generate(actual.data(), 31, &otp)); 120 } 121 122 TEST(OneTimePadTest, GenerateCoddlesDevelopersWhoDoNotCheckReturnValues) { 123 OneTimePad otp(4); 124 uint32_t word; 125 EXPECT_EQ(0, OneTimePad::Generate(&word, 32, &otp)); 126 EXPECT_NE(0, OneTimePad::Generate(&word, 32, &otp)); 127 EXPECT_THROW(OneTimePad::Generate(&word, 32, &otp), std::runtime_error); 128 } 129 130 } // namespace 131