git.fiddlerwoaroof.com
Browse code

Test the token generator's usage of randomness

Ed Langley authored on 14/06/2017 17:48:53
Showing 3 changed files
... ...
@@ -79,7 +79,6 @@ private:
79 79
         return line;
80 80
     }
81 81
 public:
82
-    // TODO: test to make sure that generate_key's output is different for different random numbers
83 82
     std::string generate_key() const override
84 83
     {
85 84
         base32 codec;
... ...
@@ -51,7 +51,7 @@ public:
51 51
         delegate_ (delegate) {}
52 52
     tokens() : tokens (
53 53
             delegate (new tokens_ifc)) {}
54
-    std::string generate_key (const user &user) const
54
+    std::string generate_key () const
55 55
     {
56 56
         return delegate_->generate_key ();
57 57
     }
... ...
@@ -287,6 +287,30 @@ int ensure_key_reads_key_file_if_exists ()
287 287
     succeed();
288 288
 }
289 289
 
290
+int generate_key_uses_random_source ()
291
+{
292
+    // given
293
+    user test_user (user::delegate (new fake_user ("/nowhere")));
294
+    fstreams test_streams{fstreams::delegate (new fake_fstreams ("<>", "<>"))};
295
+    totp_generator generator (totp_generator::delegate (new fake_totp_generator ()));
296
+
297
+    std::vector<uint8_t> random_bytes1 {4,2,4, 2,4,  2,4,2, 4,2};
298
+    random_source fake_rand1(random_source::delegate (new fake_rand_with_specified_result(random_bytes1)));
299
+    tokens tokens1 (tokens::create (test_streams, generator, fake_rand1));
300
+
301
+    std::vector<uint8_t> random_bytes2 {1,2,1, 2,1,  1,2,1, 2,1};
302
+    random_source fake_rand2(random_source::delegate (new fake_rand_with_specified_result(random_bytes2)));
303
+    tokens tokens2 (tokens::create (test_streams, generator, fake_rand2));
304
+
305
+    //when
306
+    std::string first_key = tokens1.generate_key();
307
+    std::string second_key = tokens2.generate_key();
308
+
309
+    // then
310
+    check (first_key != second_key, "keys generated from differing random data should not match");
311
+    succeed();
312
+}
313
+
290 314
 int run_tests()
291 315
 {
292 316
     test (reads_from_the_right_file);
... ...
@@ -294,6 +318,7 @@ int run_tests()
294 318
     test (returns_empty_string_if_file_too_short);
295 319
     test (ensure_key_creates_key_file_if_not_exists);
296 320
     test (ensure_key_reads_key_file_if_exists);
321
+    test (generate_key_uses_random_source);
297 322
     succeed();
298 323
 }
299 324