Skip to content

Commit ee2cf8e

Browse files
committed
chore: more structured duplex sponge test vectors.
1 parent 347060f commit ee2cf8e

File tree

6 files changed

+323
-86
lines changed

6 files changed

+323
-86
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ curve25519-dalek = { version = "4", default-features = false, features = ["serde
3737
hex = "0.4"
3838
hex-literal = "0.4"
3939
json = "0.12.4"
40+
serde = { version = "1.0.219", features = ["derive"] }
41+
serde_json = "1.0.140"
4042
sha2 = "0.10"
4143
subtle = "2.6.1"
4244

src/duplex_sponge/keccak.rs

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -104,69 +104,6 @@ mod tests {
104104
use crate::duplex_sponge::DuplexSpongeInterface;
105105
use hex_literal::hex;
106106

107-
fn assert_sponge_output(tag: &[u8; 32], input: &[u8], expected: &[u8]) {
108-
let mut sponge = KeccakDuplexSponge::new(*tag);
109-
sponge.absorb(input);
110-
let output = sponge.squeeze(expected.len());
111-
assert_eq!(output, expected);
112-
}
113-
114-
const TEST_TAG: &[u8; 32] = b"unit_tests_keccak_tag___________";
115-
const HELLO_WORLD_OUTPUT: &[u8] = &hex!("73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c");
116-
117-
#[test]
118-
fn test_keccak_duplex_sponge() {
119-
assert_sponge_output(TEST_TAG, b"Hello, World!", HELLO_WORLD_OUTPUT);
120-
}
121-
122-
#[test]
123-
fn test_absorb_empty_before_does_not_break() {
124-
let mut sponge = KeccakDuplexSponge::new(*TEST_TAG);
125-
sponge.absorb(b"");
126-
sponge.absorb(b"Hello, World!");
127-
sponge.squeeze(0);
128-
assert_eq!(sponge.squeeze(64), HELLO_WORLD_OUTPUT);
129-
}
130-
#[test]
131-
fn test_absorb_empty_after_does_not_break() {
132-
let mut sponge = KeccakDuplexSponge::new(*TEST_TAG);
133-
sponge.absorb(b"Hello, World!");
134-
sponge.absorb(b"");
135-
sponge.squeeze(0);
136-
assert_eq!(sponge.squeeze(64), HELLO_WORLD_OUTPUT);
137-
}
138-
139-
#[test]
140-
fn test_squeeze_zero_before_behavior() {
141-
let mut sponge = KeccakDuplexSponge::new(*TEST_TAG);
142-
sponge.squeeze(0);
143-
sponge.absorb(b"Hello, World!");
144-
assert_eq!(sponge.squeeze(64), HELLO_WORLD_OUTPUT);
145-
}
146-
147-
#[test]
148-
fn test_squeeze_zero_after_behavior() {
149-
let mut sponge = KeccakDuplexSponge::new(*TEST_TAG);
150-
sponge.absorb(b"Hello, World!");
151-
sponge.squeeze(0);
152-
assert_eq!(sponge.squeeze(64), HELLO_WORLD_OUTPUT);
153-
}
154-
155-
#[test]
156-
fn test_absorb_squeeze_absorb_consistency() {
157-
let tag = *b"edge-case-test-domain-absorb0000";
158-
159-
let mut sponge = KeccakDuplexSponge::new(tag);
160-
sponge.absorb(b"first");
161-
sponge.squeeze(32);
162-
sponge.absorb(b"second");
163-
let output = sponge.squeeze(32);
164-
165-
assert_eq!(
166-
output,
167-
hex!("20ce6da64ffc09df8de254222c068358da39d23ec43e522ceaaa1b82b90c8b9a")
168-
);
169-
}
170107
#[test]
171108
fn test_associativity_of_absorb() {
172109
let expected_output =
@@ -188,26 +125,4 @@ mod tests {
188125
assert_eq!(out2, expected_output);
189126
}
190127

191-
#[test]
192-
fn test_tag_affects_output() {
193-
assert_sponge_output(
194-
b"domain-one-differs-here-00000000",
195-
b"input",
196-
&hex!("2ecad63584ec0ff7f31edb822530762e5cb4b7dc1a62b1ffe02c43f3073a61b8"),
197-
);
198-
assert_sponge_output(
199-
b"domain-two-differs-here-00000000",
200-
b"input",
201-
&hex!("6310fa0356e1bab0442fa19958e1c4a6d1dcc565b2b139b6044d1a809f531825"),
202-
);
203-
}
204-
205-
#[test]
206-
fn test_multiple_blocks_absorb_squeeze() {
207-
assert_sponge_output(
208-
b"multi-block-absorb-test_________",
209-
&vec![0xABu8; 3 * 200],
210-
&hex!("606310f839e763f4f37ce4c9730da92d4d293109de06abee8a7b40577125bcbfca331b97aee104d03139247e801d8b1a5f6b028b8e51fd643de790416819780a1235357db153462f78c150e34f29a303288f07f854e229aed41c786313119a1cee87402006ab5102271576542e5580be1927af773b0f1b46ce5c78c15267d3729928909192ea0115fcb9475b38a1ff5004477bbbb1b1f5c6a5c90c29b245a83324cb108133efc82216d33da9866051d93baab3bdf0fe02b007d4eb94885a42fcd02a9acdd47b71b6eeac17f5946367d6c69c95cbb80ac91d75e22c9862cf5fe10c7e121368e8a8cd9ff8eebe21071ff014e053725bcc624cd9f31818c4d049e70c14a22e5d3062a553ceca6157315ef2bdb3619c970c9c3d60817ee68291dcd17a282ed1b33cb3afb79c8247cd46de13add88da4418278c8b6b919914be5379daa823b036da008718c1d2a4a0768ecdf032e2b93c344ff65768c8a383a8747a1dcc13b5569b4e15cab9cc8f233fb28b13168284c8a998be6f8fa05389ff9c1d90c5845060d2df3fe0a923be8603abbd2b6f6dd6a5c09c81afe7c06bec789db87185297d6f7261f1e5637f2d140ff3b306df77f42cceffe769545ea8b011022387cd9e3d4f2c97feff5099139715f72301799fcfd59aa30f997e26da9eb7d86ee934a3f9c116d4a9e1012d795db35e1c61d27cd74bb6002f463fc129c1f9c4f25bc8e79c051ac2f1686e393d670f8d1e4cea12acfbff5a135623615d69a88f390569f17a0fc65f5886e2df491615155d5c3eb871209a5c7b0439585ad1a0acbede2e1a8d5aad1d8f3a033267e12185c5f2bbab0f2f1769247"),
211-
);
212-
}
213128
}
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
{
2+
"test_absorb_empty_after_does_not_break": {
3+
"Expected": "73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c",
4+
"HashFunction": "Keccak-f[1600] overwrite mode",
5+
"Operations": [
6+
{
7+
"data": "",
8+
"type": "absorb"
9+
},
10+
{
11+
"data": "48656c6c6f2c20576f726c6421",
12+
"type": "absorb"
13+
},
14+
{
15+
"length": 64,
16+
"type": "squeeze"
17+
}
18+
],
19+
"Tag": "756e69745f74657374735f6b656363616b5f7461675f5f5f5f5f5f5f5f5f5f5f"
20+
},
21+
"test_absorb_empty_before_does_not_break": {
22+
"Expected": "73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c",
23+
"HashFunction": "Keccak-f[1600] overwrite mode",
24+
"Operations": [
25+
{
26+
"data": "48656c6c6f2c20576f726c6421",
27+
"type": "absorb"
28+
},
29+
{
30+
"data": "",
31+
"type": "absorb"
32+
},
33+
{
34+
"length": 64,
35+
"type": "squeeze"
36+
}
37+
],
38+
"Tag": "756e69745f74657374735f6b656363616b5f7461675f5f5f5f5f5f5f5f5f5f5f"
39+
},
40+
"test_absorb_squeeze_absorb_consistency": {
41+
"Expected": "20ce6da64ffc09df8de254222c068358da39d23ec43e522ceaaa1b82b90c8b9a",
42+
"HashFunction": "Keccak-f[1600] overwrite mode",
43+
"Operations": [
44+
{
45+
"data": "6669727374",
46+
"type": "absorb"
47+
},
48+
{
49+
"length": 32,
50+
"type": "squeeze"
51+
},
52+
{
53+
"data": "7365636f6e64",
54+
"type": "absorb"
55+
},
56+
{
57+
"length": 32,
58+
"type": "squeeze"
59+
}
60+
],
61+
"Tag": "656467652d636173652d746573742d646f6d61696e2d6162736f726230303030"
62+
},
63+
"test_associativity_of_absorb": {
64+
"Expected": "7dfada182d6191e106ce287c2262a443ce2fb695c7cc5037a46626e88889af58",
65+
"HashFunction": "Keccak-f[1600] overwrite mode",
66+
"Operations": [
67+
{
68+
"data": "68656c6c6f20776f726c64",
69+
"type": "absorb"
70+
},
71+
{
72+
"length": 32,
73+
"type": "squeeze"
74+
}
75+
],
76+
"Tag": "6162736f72622d6173736f6369617469766974792d646f6d61696e2d2d2d2d2d"
77+
},
78+
"test_keccak_duplex_sponge": {
79+
"Expected": "73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c",
80+
"HashFunction": "Keccak-f[1600] overwrite mode",
81+
"Operations": [
82+
{
83+
"data": "48656c6c6f2c20576f726c6421",
84+
"type": "absorb"
85+
},
86+
{
87+
"length": 64,
88+
"type": "squeeze"
89+
}
90+
],
91+
"Tag": "756e69745f74657374735f6b656363616b5f7461675f5f5f5f5f5f5f5f5f5f5f"
92+
},
93+
"test_multiple_blocks_absorb_squeeze": {
94+
"Expected": "606310f839e763f4f37ce4c9730da92d4d293109de06abee8a7b40577125bcbfca331b97aee104d03139247e801d8b1a5f6b028b8e51fd643de790416819780a1235357db153462f78c150e34f29a303288f07f854e229aed41c786313119a1cee87402006ab5102271576542e5580be1927af773b0f1b46ce5c78c15267d3729928909192ea0115fcb9475b38a1ff5004477bbbb1b1f5c6a5c90c29b245a83324cb108133efc82216d33da9866051d93baab3bdf0fe02b007d4eb94885a42fcd02a9acdd47b71b6eeac17f5946367d6c69c95cbb80ac91d75e22c9862cf5fe10c7e121368e8a8cd9ff8eebe21071ff014e053725bcc624cd9f31818c4d049e70c14a22e5d3062a553ceca6157315ef2bdb3619c970c9c3d60817ee68291dcd17a282ed1b33cb3afb79c8247cd46de13add88da4418278c8b6b919914be5379daa823b036da008718c1d2a4a0768ecdf032e2b93c344ff65768c8a383a8747a1dcc13b5569b4e15cab9cc8f233fb28b13168284c8a998be6f8fa05389ff9c1d90c5845060d2df3fe0a923be8603abbd2b6f6dd6a5c09c81afe7c06bec789db87185297d6f7261f1e5637f2d140ff3b306df77f42cceffe769545ea8b011022387cd9e3d4f2c97feff5099139715f72301799fcfd59aa30f997e26da9eb7d86ee934a3f9c116d4a9e1012d795db35e1c61d27cd74bb6002f463fc129c1f9c4f25bc8e79c051ac2f1686e393d670f8d1e4cea12acfbff5a135623615d69a88f390569f17a0fc65f5886e2df491615155d5c3eb871209a5c7b0439585ad1a0acbede2e1a8d5aad1d8f3a033267e12185c5f2bbab0f2f1769247",
95+
"HashFunction": "Keccak-f[1600] overwrite mode",
96+
"Operations": [
97+
{
98+
"data": "abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab",
99+
"type": "absorb"
100+
},
101+
{
102+
"length": 600,
103+
"type": "squeeze"
104+
}
105+
],
106+
"Tag": "6d756c74692d626c6f636b2d6162736f72622d746573745f5f5f5f5f5f5f5f5f"
107+
},
108+
"test_squeeze_zero_after_behavior": {
109+
"Expected": "73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c",
110+
"HashFunction": "Keccak-f[1600] overwrite mode",
111+
"Operations": [
112+
{
113+
"length": 0,
114+
"type": "squeeze"
115+
},
116+
{
117+
"data": "48656c6c6f2c20576f726c6421",
118+
"type": "absorb"
119+
},
120+
{
121+
"length": 64,
122+
"type": "squeeze"
123+
}
124+
],
125+
"Tag": "756e69745f74657374735f6b656363616b5f7461675f5f5f5f5f5f5f5f5f5f5f"
126+
},
127+
"test_squeeze_zero_behavior": {
128+
"Expected": "73e4a040a956f57693fb2b2dde8a8ea2c14d39ff8830060cd0301d6de25b2097ba858efedeeb89368eaf7c94a68f62835f932b5f0dd0ba376c48a0fdb5e21f0c",
129+
"HashFunction": "Keccak-f[1600] overwrite mode",
130+
"Operations": [
131+
{
132+
"length": 0,
133+
"type": "squeeze"
134+
},
135+
{
136+
"data": "48656c6c6f2c20576f726c6421",
137+
"type": "absorb"
138+
},
139+
{
140+
"length": 0,
141+
"type": "squeeze"
142+
},
143+
{
144+
"length": 64,
145+
"type": "squeeze"
146+
}
147+
],
148+
"Tag": "756e69745f74657374735f6b656363616b5f7461675f5f5f5f5f5f5f5f5f5f5f"
149+
},
150+
"test_tag_affects_output": {
151+
"Expected": "2ecad63584ec0ff7f31edb822530762e5cb4b7dc1a62b1ffe02c43f3073a61b8",
152+
"HashFunction": "Keccak-f[1600] overwrite mode",
153+
"Operations": [
154+
{
155+
"data": "696e707574",
156+
"type": "absorb"
157+
},
158+
{
159+
"length": 32,
160+
"type": "squeeze"
161+
}
162+
],
163+
"Tag": "646f6d61696e2d6f6e652d646966666572732d686572652d3030303030303030"
164+
}
165+
}

src/tests/spec/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ mod bls12_381;
22
mod custom_schnorr_protocol;
33
mod random;
44
mod rng;
5+
6+
mod test_duplex_sponge;
57
mod test_vectors;

0 commit comments

Comments
 (0)