tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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