1- use crate :: duplex_sponge:: { keccak:: KeccakDuplexSponge , DuplexSpongeInterface } ;
1+ use crate :: duplex_sponge:: {
2+ keccak:: KeccakDuplexSponge , shake:: ShakeDuplexSponge , DuplexSpongeInterface ,
3+ } ;
4+ use libtest_mimic:: { Arguments , Failed , Trial } ;
25use serde:: { Deserialize , Serialize } ;
36use std:: collections:: HashMap ;
47
@@ -10,8 +13,8 @@ struct TestVector {
1013 hash_function : String ,
1114 #[ serde( rename = "Operations" ) ]
1215 operations : Vec < Operation > ,
13- #[ serde( rename = "Tag " ) ]
14- tag : String ,
16+ #[ serde( rename = "IV " ) ]
17+ iv : String ,
1518}
1619
1720#[ derive( Debug , Deserialize , Serialize ) ]
@@ -36,12 +39,15 @@ fn load_test_vectors() -> HashMap<String, TestVector> {
3639 serde_json:: from_str ( json_data) . expect ( "Failed to parse test vectors JSON" )
3740}
3841
39- fn run_test_vector ( name : & str , test_vector : & TestVector ) {
40- let tag_bytes = hex_decode ( & test_vector. tag ) ;
41- let mut tag_array = [ 0u8 ; 32 ] ;
42- tag_array. copy_from_slice ( & tag_bytes) ;
42+ fn run_test_vector ( name : & str , test_vector : & TestVector ) -> Result < ( ) , Failed > {
43+ let iv_bytes = hex_decode ( & test_vector. iv ) ;
44+ let iv_array: [ u8 ; 64 ] = iv_bytes. try_into ( ) . unwrap ( ) ;
4345
44- let mut sponge = KeccakDuplexSponge :: new ( tag_array) ;
46+ let mut sponge: Box < dyn DuplexSpongeInterface > = match test_vector. hash_function . as_str ( ) {
47+ "Keccak-f[1600] overwrite mode" => Box :: new ( KeccakDuplexSponge :: new ( iv_array) ) ,
48+ "SHAKE128" => Box :: new ( ShakeDuplexSponge :: new ( iv_array) ) ,
49+ _ => panic ! ( "Unknown hash function: {}" , test_vector. hash_function) ,
50+ } ;
4551 let mut final_output = Vec :: new ( ) ;
4652
4753 for operation in & test_vector. operations {
@@ -62,88 +68,27 @@ fn run_test_vector(name: &str, test_vector: &TestVector) {
6268 }
6369 }
6470
65- let expected_output = hex_decode ( & test_vector. expected ) ;
66- assert_eq ! ( final_output, expected_output, "Test vector '{name}' failed" ) ;
71+ assert_eq ! (
72+ hex:: encode( final_output) ,
73+ test_vector. expected,
74+ "Test vector '{name}' failed"
75+ ) ;
76+ Ok ( ( ) )
6777}
6878
6979#[ test]
7080fn test_all_duplex_sponge_vectors ( ) {
7181 let test_vectors = load_test_vectors ( ) ;
7282
73- for ( name, test_vector) in test_vectors {
74- run_test_vector ( & name, & test_vector) ;
75- }
76- }
77-
78- #[ test]
79- fn test_keccak_duplex_sponge_vector ( ) {
80- let test_vectors = load_test_vectors ( ) ;
81- let test_vector = test_vectors. get ( "test_keccak_duplex_sponge" ) . unwrap ( ) ;
82- run_test_vector ( "test_keccak_duplex_sponge" , test_vector) ;
83- }
84-
85- #[ test]
86- fn test_absorb_empty_before_vector ( ) {
87- let test_vectors = load_test_vectors ( ) ;
88- let test_vector = test_vectors
89- . get ( "test_absorb_empty_before_does_not_break" )
90- . unwrap ( ) ;
91- run_test_vector ( "test_absorb_empty_before_does_not_break" , test_vector) ;
92- }
93-
94- #[ test]
95- fn test_absorb_empty_after_vector ( ) {
96- let test_vectors = load_test_vectors ( ) ;
97- let test_vector = test_vectors
98- . get ( "test_absorb_empty_after_does_not_break" )
99- . unwrap ( ) ;
100- run_test_vector ( "test_absorb_empty_after_does_not_break" , test_vector) ;
101- }
102-
103- #[ test]
104- fn test_squeeze_zero_before_vector ( ) {
105- let test_vectors = load_test_vectors ( ) ;
106- let test_vector = test_vectors. get ( "test_squeeze_zero_behavior" ) . unwrap ( ) ;
107- run_test_vector ( "test_squeeze_zero_behavior" , test_vector) ;
108- }
109-
110- #[ test]
111- fn test_squeeze_zero_after_vector ( ) {
112- let test_vectors = load_test_vectors ( ) ;
113- let test_vector = test_vectors
114- . get ( "test_squeeze_zero_after_behavior" )
115- . unwrap ( ) ;
116- run_test_vector ( "test_squeeze_zero_after_behavior" , test_vector) ;
117- }
118-
119- #[ test]
120- fn test_absorb_squeeze_absorb_consistency_vector ( ) {
121- let test_vectors = load_test_vectors ( ) ;
122- let test_vector = test_vectors
123- . get ( "test_absorb_squeeze_absorb_consistency" )
124- . unwrap ( ) ;
125- run_test_vector ( "test_absorb_squeeze_absorb_consistency" , test_vector) ;
126- }
127-
128- #[ test]
129- fn test_associativity_of_absorb_vector ( ) {
130- let test_vectors = load_test_vectors ( ) ;
131- let test_vector = test_vectors. get ( "test_associativity_of_absorb" ) . unwrap ( ) ;
132- run_test_vector ( "test_associativity_of_absorb" , test_vector) ;
133- }
134-
135- #[ test]
136- fn test_tag_affects_output_vector ( ) {
137- let test_vectors = load_test_vectors ( ) ;
138- let test_vector = test_vectors. get ( "test_tag_affects_output" ) . unwrap ( ) ;
139- run_test_vector ( "test_tag_affects_output" , test_vector) ;
140- }
141-
142- #[ test]
143- fn test_multiple_blocks_absorb_squeeze_vector ( ) {
144- let test_vectors = load_test_vectors ( ) ;
145- let test_vector = test_vectors
146- . get ( "test_multiple_blocks_absorb_squeeze" )
147- . unwrap ( ) ;
148- run_test_vector ( "test_multiple_blocks_absorb_squeeze" , test_vector) ;
83+ let tests = test_vectors
84+ . into_iter ( )
85+ . map ( |( name, test_vector) | {
86+ Trial :: test (
87+ format ! ( "tests::spec::test_duplex_sponge::{}" , name) ,
88+ move || run_test_vector ( & name, & test_vector) ,
89+ )
90+ } )
91+ . collect ( ) ;
92+
93+ libtest_mimic:: run ( & Arguments :: from_args ( ) , tests) . exit ( ) ;
14994}
0 commit comments