flexible_transcript_mirror/
tests.rs

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