flexible_transcript/
tests.rs

1use crate::Transcript;
2
3/// Test the sanity of a transcript.
4pub fn test_transcript<T: Transcript>()
5where
6  T::Challenge: PartialEq,
7{
8  // Ensure distinct names cause distinct challenges
9  {
10    let mut t1 = T::new(b"1");
11    let mut t2 = T::new(b"2");
12    assert!(t1.challenge(b"c") != t2.challenge(b"c"));
13  }
14
15  // Ensure names can't lead into labels
16  {
17    let mut t1 = T::new(b"12");
18    let c1 = t1.challenge(b"c");
19    let mut t2 = T::new(b"1");
20    let c2 = t2.challenge(b"2c");
21    assert!(c1 != c2);
22  }
23
24  let t = || T::new(b"name");
25  let c = |mut t: T| t.challenge(b"c");
26
27  // Ensure domain separators do something
28  {
29    let mut t1 = t();
30    t1.domain_separate(b"d");
31    assert!(c(t1) != c(t()));
32  }
33
34  // Ensure distinct domain separators create distinct challenges
35  {
36    let mut t1 = t();
37    let mut t2 = t();
38    t1.domain_separate(b"d1");
39    t2.domain_separate(b"d2");
40    assert!(c(t1) != c(t2));
41  }
42
43  // Ensure distinct messages create distinct challenges
44  {
45    // By label
46    {
47      let mut t1 = t();
48      let mut t2 = t();
49      t1.append_message(b"msg", b"a");
50      t2.append_message(b"msg", b"b");
51      assert!(c(t1) != c(t2));
52    }
53
54    // By value
55    {
56      let mut t1 = t();
57      let mut t2 = t();
58      t1.append_message(b"a", b"val");
59      t2.append_message(b"b", b"val");
60      assert!(c(t1) != c(t2));
61    }
62  }
63
64  // Ensure challenges advance the transcript
65  {
66    let mut t = t();
67    let c1 = t.challenge(b"c");
68    let c2 = t.challenge(b"c");
69    assert!(c1 != c2);
70  }
71
72  // Ensure distinct challenge labels produce distinct challenges
73  assert!(t().challenge(b"a") != t().challenge(b"b"));
74
75  // Ensure RNG seed calls advance the transcript
76  {
77    let mut t = t();
78    let s1 = t.rng_seed(b"s");
79    let s2 = t.rng_seed(b"s");
80    assert!(s1 != s2);
81  }
82
83  // Ensure distinct RNG seed labels produce distinct seeds
84  assert!(t().rng_seed(b"a") != t().rng_seed(b"b"));
85}
86
87#[test]
88fn test_digest() {
89  test_transcript::<crate::DigestTranscript<sha2::Sha256>>();
90  test_transcript::<crate::DigestTranscript<blake2::Blake2b512>>();
91}
92
93#[cfg(feature = "recommended")]
94#[test]
95fn test_recommended() {
96  test_transcript::<crate::RecommendedTranscript>();
97}
98
99#[cfg(feature = "merlin")]
100#[test]
101fn test_merlin() {
102  test_transcript::<crate::MerlinTranscript>();
103}