1818 b_0 : GenericArray < u8 , HashT :: OutputSize > ,
1919 b_vals : GenericArray < u8 , HashT :: OutputSize > ,
2020 domain : Domain < HashT :: OutputSize > ,
21- index : usize ,
21+ index : u8 ,
2222 offset : usize ,
23- ell : usize ,
23+ ell : u8 ,
2424}
2525
2626impl < HashT > ExpandMsgXmd < HashT >
4242 . for_each ( |( j, ( b0val, bi1val) ) | tmp[ j] = b0val ^ bi1val) ;
4343 self . b_vals = HashT :: new ( )
4444 . chain ( tmp)
45- . chain ( [ self . index as u8 ] )
45+ . chain ( [ self . index ] )
4646 . chain ( self . domain . data ( ) )
47- . chain ( [ self . domain . len ( ) as u8 ] )
47+ . chain ( [ self . domain . len ( ) ] )
4848 . finalize ( ) ;
4949 true
5050 } else {
@@ -57,34 +57,39 @@ where
5757impl < HashT > ExpandMsg for ExpandMsgXmd < HashT >
5858where
5959 HashT : Digest + BlockInput ,
60- HashT :: OutputSize : IsLess < U256 > + IsLessOrEqual < HashT :: BlockSize > ,
60+ // If `len_in_bytes` is bigger then 256, length of the `DST` will depend on
61+ // the output size of the hash, which is still not allowed to be bigger then 256:
62+ // https://www.ietf.org/archive/id/draft-irtf-cfrg-hash-to-curve-13.html#section-5.4.1-6
63+ HashT :: OutputSize : IsLess < U256 > ,
64+ // Constraint set by `expand_message_xmd`:
65+ // https://www.ietf.org/archive/id/draft-irtf-cfrg-hash-to-curve-13.html#section-5.4.1-4
66+ HashT :: OutputSize : IsLessOrEqual < HashT :: BlockSize > ,
6167{
6268 fn expand_message ( msg : & [ u8 ] , dst : & ' static [ u8 ] , len_in_bytes : usize ) -> Result < Self > {
63- if len_in_bytes > 0xFFFF {
69+ if len_in_bytes == 0 {
6470 return Err ( Error ) ;
6571 }
6672
67- let b_in_bytes = HashT :: OutputSize :: to_usize ( ) ;
68- let ell = ( len_in_bytes + b_in_bytes - 1 ) / b_in_bytes;
73+ let len_in_bytes_u16 = u16:: try_from ( len_in_bytes) . map_err ( |_| Error ) ?;
6974
70- if ell > 255 {
71- return Err ( Error ) ;
72- }
75+ let b_in_bytes = HashT :: OutputSize :: to_usize ( ) ;
76+ let ell = u8:: try_from ( ( len_in_bytes + b_in_bytes - 1 ) / b_in_bytes) . map_err ( |_| Error ) ?;
7377
7478 let domain = Domain :: xmd :: < HashT > ( dst) ;
7579 let b_0 = HashT :: new ( )
7680 . chain ( GenericArray :: < u8 , HashT :: BlockSize > :: default ( ) )
7781 . chain ( msg)
78- . chain ( [ ( len_in_bytes >> 8 ) as u8 , len_in_bytes as u8 , 0u8 ] )
82+ . chain ( len_in_bytes_u16. to_be_bytes ( ) )
83+ . chain ( [ 0 ] )
7984 . chain ( domain. data ( ) )
80- . chain ( [ domain. len ( ) as u8 ] )
85+ . chain ( [ domain. len ( ) ] )
8186 . finalize ( ) ;
8287
8388 let b_vals = HashT :: new ( )
8489 . chain ( & b_0[ ..] )
8590 . chain ( [ 1u8 ] )
8691 . chain ( domain. data ( ) )
87- . chain ( [ domain. len ( ) as u8 ] )
92+ . chain ( [ domain. len ( ) ] )
8893 . finalize ( ) ;
8994
9095 Ok ( Self {
0 commit comments