@@ -10,7 +10,7 @@ use digest::{
10
10
typenum:: { IsLess , IsLessOrEqual , Unsigned , U256 } ,
11
11
GenericArray ,
12
12
} ,
13
- Digest ,
13
+ FixedOutput , HashMarker ,
14
14
} ;
15
15
16
16
/// Placeholder type for implementing `expand_message_xmd` based on a hash function
@@ -22,14 +22,14 @@ use digest::{
22
22
/// - `len_in_bytes > 255 * HashT::OutputSize`
23
23
pub struct ExpandMsgXmd < HashT > ( PhantomData < HashT > )
24
24
where
25
- HashT : Digest + BlockSizeUser ,
25
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
26
26
HashT :: OutputSize : IsLess < U256 > ,
27
27
HashT :: OutputSize : IsLessOrEqual < HashT :: BlockSize > ;
28
28
29
29
/// ExpandMsgXmd implements expand_message_xmd for the ExpandMsg trait
30
30
impl < ' a , HashT > ExpandMsg < ' a > for ExpandMsgXmd < HashT >
31
31
where
32
- HashT : Digest + BlockSizeUser ,
32
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
33
33
// If `len_in_bytes` is bigger then 256, length of the `DST` will depend on
34
34
// the output size of the hash, which is still not allowed to be bigger then 256:
35
35
// https://www.ietf.org/archive/id/draft-irtf-cfrg-hash-to-curve-13.html#section-5.4.1-6
42
42
43
43
fn expand_message (
44
44
msgs : & [ & [ u8 ] ] ,
45
- dst : & ' a [ u8 ] ,
45
+ dsts : & ' a [ & ' a [ u8 ] ] ,
46
46
len_in_bytes : usize ,
47
47
) -> Result < Self :: Expander > {
48
48
if len_in_bytes == 0 {
@@ -54,26 +54,26 @@ where
54
54
let b_in_bytes = HashT :: OutputSize :: to_usize ( ) ;
55
55
let ell = u8:: try_from ( ( len_in_bytes + b_in_bytes - 1 ) / b_in_bytes) . map_err ( |_| Error ) ?;
56
56
57
- let domain = Domain :: xmd :: < HashT > ( dst ) ?;
58
- let mut b_0 = HashT :: new ( ) ;
59
- b_0. update ( GenericArray :: < u8 , HashT :: BlockSize > :: default ( ) ) ;
57
+ let domain = Domain :: xmd :: < HashT > ( dsts ) ?;
58
+ let mut b_0 = HashT :: default ( ) ;
59
+ b_0. update ( & GenericArray :: < u8 , HashT :: BlockSize > :: default ( ) ) ;
60
60
61
61
for msg in msgs {
62
62
b_0. update ( msg) ;
63
63
}
64
64
65
- b_0. update ( len_in_bytes_u16. to_be_bytes ( ) ) ;
66
- b_0. update ( [ 0 ] ) ;
67
- b_0 . update ( domain. data ( ) ) ;
68
- b_0. update ( [ domain. len ( ) ] ) ;
69
- let b_0 = b_0. finalize ( ) ;
65
+ b_0. update ( & len_in_bytes_u16. to_be_bytes ( ) ) ;
66
+ b_0. update ( & [ 0 ] ) ;
67
+ domain. update_hash ( & mut b_0 ) ;
68
+ b_0. update ( & [ domain. len ( ) ] ) ;
69
+ let b_0 = b_0. finalize_fixed ( ) ;
70
70
71
- let mut b_vals = HashT :: new ( ) ;
71
+ let mut b_vals = HashT :: default ( ) ;
72
72
b_vals. update ( & b_0[ ..] ) ;
73
- b_vals. update ( [ 1u8 ] ) ;
74
- b_vals . update ( domain. data ( ) ) ;
75
- b_vals. update ( [ domain. len ( ) ] ) ;
76
- let b_vals = b_vals. finalize ( ) ;
73
+ b_vals. update ( & [ 1u8 ] ) ;
74
+ domain. update_hash ( & mut b_vals ) ;
75
+ b_vals. update ( & [ domain. len ( ) ] ) ;
76
+ let b_vals = b_vals. finalize_fixed ( ) ;
77
77
78
78
Ok ( ExpanderXmd {
79
79
b_0,
89
89
/// [`Expander`] type for [`ExpandMsgXmd`].
90
90
pub struct ExpanderXmd < ' a , HashT >
91
91
where
92
- HashT : Digest + BlockSizeUser ,
92
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
93
93
HashT :: OutputSize : IsLess < U256 > ,
94
94
HashT :: OutputSize : IsLessOrEqual < HashT :: BlockSize > ,
95
95
{
@@ -103,7 +103,7 @@ where
103
103
104
104
impl < ' a , HashT > ExpanderXmd < ' a , HashT >
105
105
where
106
- HashT : Digest + BlockSizeUser ,
106
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
107
107
HashT :: OutputSize : IsLess < U256 > ,
108
108
HashT :: OutputSize : IsLessOrEqual < HashT :: BlockSize > ,
109
109
{
@@ -118,12 +118,12 @@ where
118
118
. zip ( & self . b_vals [ ..] )
119
119
. enumerate ( )
120
120
. for_each ( |( j, ( b0val, bi1val) ) | tmp[ j] = b0val ^ bi1val) ;
121
- let mut b_vals = HashT :: new ( ) ;
122
- b_vals. update ( tmp) ;
123
- b_vals. update ( [ self . index ] ) ;
124
- b_vals . update ( self . domain . data ( ) ) ;
125
- b_vals. update ( [ self . domain . len ( ) ] ) ;
126
- self . b_vals = b_vals. finalize ( ) ;
121
+ let mut b_vals = HashT :: default ( ) ;
122
+ b_vals. update ( & tmp) ;
123
+ b_vals. update ( & [ self . index ] ) ;
124
+ self . domain . update_hash ( & mut b_vals ) ;
125
+ b_vals. update ( & [ self . domain . len ( ) ] ) ;
126
+ self . b_vals = b_vals. finalize_fixed ( ) ;
127
127
true
128
128
} else {
129
129
false
@@ -133,7 +133,7 @@ where
133
133
134
134
impl < ' a , HashT > Expander for ExpanderXmd < ' a , HashT >
135
135
where
136
- HashT : Digest + BlockSizeUser ,
136
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
137
137
HashT :: OutputSize : IsLess < U256 > ,
138
138
HashT :: OutputSize : IsLessOrEqual < HashT :: BlockSize > ,
139
139
{
@@ -165,7 +165,7 @@ mod test {
165
165
len_in_bytes : u16 ,
166
166
bytes : & [ u8 ] ,
167
167
) where
168
- HashT : Digest + BlockSizeUser ,
168
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
169
169
HashT :: OutputSize : IsLess < U256 > ,
170
170
{
171
171
let block = HashT :: BlockSize :: to_usize ( ) ;
@@ -183,8 +183,8 @@ mod test {
183
183
let pad = l + mem:: size_of :: < u8 > ( ) ;
184
184
assert_eq ! ( [ 0 ] , & bytes[ l..pad] ) ;
185
185
186
- let dst = pad + domain. data ( ) . len ( ) ;
187
- assert_eq ! ( domain. data ( ) , & bytes[ pad..dst] ) ;
186
+ let dst = pad + usize :: from ( domain. len ( ) ) ;
187
+ domain. assert ( & bytes[ pad..dst] ) ;
188
188
189
189
let dst_len = dst + mem:: size_of :: < u8 > ( ) ;
190
190
assert_eq ! ( [ domain. len( ) ] , & bytes[ dst..dst_len] ) ;
@@ -205,13 +205,14 @@ mod test {
205
205
domain : & Domain < ' _ , HashT :: OutputSize > ,
206
206
) -> Result < ( ) >
207
207
where
208
- HashT : Digest + BlockSizeUser ,
208
+ HashT : BlockSizeUser + Default + FixedOutput + HashMarker ,
209
209
HashT :: OutputSize : IsLess < U256 > + IsLessOrEqual < HashT :: BlockSize > ,
210
210
{
211
211
assert_message :: < HashT > ( self . msg , domain, L :: to_u16 ( ) , self . msg_prime ) ;
212
212
213
+ let dst = [ dst] ;
213
214
let mut expander =
214
- ExpandMsgXmd :: < HashT > :: expand_message ( & [ self . msg ] , dst, L :: to_usize ( ) ) ?;
215
+ ExpandMsgXmd :: < HashT > :: expand_message ( & [ self . msg ] , & dst, L :: to_usize ( ) ) ?;
215
216
216
217
let mut uniform_bytes = GenericArray :: < u8 , L > :: default ( ) ;
217
218
expander. fill_bytes ( & mut uniform_bytes) ;
@@ -227,8 +228,8 @@ mod test {
227
228
const DST_PRIME : & [ u8 ] =
228
229
& hex ! ( "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826" ) ;
229
230
230
- let dst_prime = Domain :: xmd :: < Sha256 > ( DST ) ?;
231
- dst_prime. assert ( DST_PRIME ) ;
231
+ let dst_prime = Domain :: xmd :: < Sha256 > ( & [ DST ] ) ?;
232
+ dst_prime. assert_dst ( DST_PRIME ) ;
232
233
233
234
const TEST_VECTORS_32 : & [ TestVector ] = & [
234
235
TestVector {
@@ -299,8 +300,8 @@ mod test {
299
300
const DST_PRIME : & [ u8 ] =
300
301
& hex ! ( "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620" ) ;
301
302
302
- let dst_prime = Domain :: xmd :: < Sha256 > ( DST ) ?;
303
- dst_prime. assert ( DST_PRIME ) ;
303
+ let dst_prime = Domain :: xmd :: < Sha256 > ( & [ DST ] ) ?;
304
+ dst_prime. assert_dst ( DST_PRIME ) ;
304
305
305
306
const TEST_VECTORS_32 : & [ TestVector ] = & [
306
307
TestVector {
@@ -377,8 +378,8 @@ mod test {
377
378
const DST_PRIME : & [ u8 ] =
378
379
& hex ! ( "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626" ) ;
379
380
380
- let dst_prime = Domain :: xmd :: < Sha512 > ( DST ) ?;
381
- dst_prime. assert ( DST_PRIME ) ;
381
+ let dst_prime = Domain :: xmd :: < Sha512 > ( & [ DST ] ) ?;
382
+ dst_prime. assert_dst ( DST_PRIME ) ;
382
383
383
384
const TEST_VECTORS_32 : & [ TestVector ] = & [
384
385
TestVector {
0 commit comments