pk11_prng_unittest.cc (3448B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include <memory> 8 #include "blapi.h" 9 #include "pk11pub.h" 10 11 #include "gtest/gtest.h" 12 13 namespace nss_test { 14 15 class PK11PrngTest : public ::testing::Test {}; 16 17 #ifdef UNSAFE_FUZZER_MODE 18 19 // Test that two consecutive calls to the RNG return two distinct values. 20 TEST_F(PK11PrngTest, Fuzz_DetPRNG) { 21 std::vector<uint8_t> rnd1(2048, 0); 22 std::vector<uint8_t> rnd2(2048, 0); 23 24 SECStatus rv = PK11_GenerateRandom(rnd1.data(), rnd1.size()); 25 EXPECT_EQ(rv, SECSuccess); 26 27 rv = PK11_GenerateRandom(rnd2.data(), rnd2.size()); 28 EXPECT_EQ(rv, SECSuccess); 29 30 EXPECT_NE(rnd1, rnd2); 31 } 32 33 // Test that two consecutive calls to the RNG return two equal values 34 // when the RNG's internal state is reset before each call. 35 TEST_F(PK11PrngTest, Fuzz_DetPRNG_Reset) { 36 std::vector<uint8_t> rnd1(2048, 0); 37 std::vector<uint8_t> rnd2(2048, 0); 38 39 EXPECT_EQ(SECSuccess, RNG_RandomUpdate(NULL, 0)); 40 41 SECStatus rv = PK11_GenerateRandom(rnd1.data(), rnd1.size()); 42 EXPECT_EQ(rv, SECSuccess); 43 44 EXPECT_EQ(SECSuccess, RNG_RandomUpdate(NULL, 0)); 45 46 rv = PK11_GenerateRandom(rnd2.data(), rnd2.size()); 47 EXPECT_EQ(rv, SECSuccess); 48 49 EXPECT_EQ(rnd1, rnd2); 50 } 51 52 // Test that the RNG's internal state progresses in a consistent manner. 53 TEST_F(PK11PrngTest, Fuzz_DetPRNG_StatefulReset) { 54 std::vector<uint8_t> rnd1(2048, 0); 55 std::vector<uint8_t> rnd2(2048, 0); 56 57 EXPECT_EQ(SECSuccess, RNG_RandomUpdate(NULL, 0)); 58 59 SECStatus rv = PK11_GenerateRandom(rnd1.data(), rnd1.size() - 1024); 60 EXPECT_EQ(rv, SECSuccess); 61 62 rv = PK11_GenerateRandom(rnd1.data() + 1024, rnd1.size() - 1024); 63 EXPECT_EQ(rv, SECSuccess); 64 65 EXPECT_EQ(SECSuccess, RNG_RandomUpdate(NULL, 0)); 66 67 rv = PK11_GenerateRandom(rnd2.data(), rnd2.size() - 1024); 68 EXPECT_EQ(rv, SECSuccess); 69 70 rv = PK11_GenerateRandom(rnd2.data() + 1024, rnd2.size() - 1024); 71 EXPECT_EQ(rv, SECSuccess); 72 73 EXPECT_EQ(rnd1, rnd2); 74 } 75 76 TEST_F(PK11PrngTest, Fuzz_DetPRNG_Seed) { 77 std::vector<uint8_t> rnd1(2048, 0); 78 std::vector<uint8_t> rnd2(2048, 0); 79 std::vector<uint8_t> seed = {0x01, 0x22, 0xAA, 0x45}; 80 81 SECStatus rv = PK11_RandomUpdate(seed.data(), seed.size()); 82 EXPECT_EQ(rv, SECSuccess); 83 84 rv = PK11_GenerateRandom(rnd1.data(), rnd1.size()); 85 EXPECT_EQ(rv, SECSuccess); 86 87 rv = PK11_GenerateRandom(rnd2.data(), rnd2.size()); 88 EXPECT_EQ(rv, SECSuccess); 89 90 EXPECT_NE(rnd1, rnd2); 91 } 92 93 TEST_F(PK11PrngTest, Fuzz_DetPRNG_StatefulReset_Seed) { 94 std::vector<uint8_t> rnd1(2048, 0); 95 std::vector<uint8_t> rnd2(2048, 0); 96 std::vector<uint8_t> seed = {0x01, 0x22, 0xAA, 0x45}; 97 98 SECStatus rv = PK11_RandomUpdate(seed.data(), seed.size()); 99 EXPECT_EQ(rv, SECSuccess); 100 101 rv = PK11_GenerateRandom(rnd1.data(), rnd1.size() - 1024); 102 EXPECT_EQ(rv, SECSuccess); 103 104 rv = PK11_GenerateRandom(rnd1.data() + 1024, rnd1.size() - 1024); 105 EXPECT_EQ(rv, SECSuccess); 106 107 rv = PK11_RandomUpdate(seed.data(), seed.size()); 108 EXPECT_EQ(rv, SECSuccess); 109 110 rv = PK11_GenerateRandom(rnd2.data(), rnd2.size() - 1024); 111 EXPECT_EQ(rv, SECSuccess); 112 113 rv = PK11_GenerateRandom(rnd2.data() + 1024, rnd2.size() - 1024); 114 EXPECT_EQ(rv, SECSuccess); 115 116 EXPECT_EQ(rnd1, rnd2); 117 } 118 119 #endif 120 121 } // namespace nss_test