Home | History | Annotate | Download | only in internal
      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