@@ -24,6 +24,12 @@ impl<N: Network> Signature<N> {
2424 if message. len ( ) > N :: MAX_DATA_SIZE_IN_FIELDS as usize {
2525 bail ! ( "Cannot sign the message: the message exceeds maximum allowed size" )
2626 }
27+ // Disallowing the case message[1] == N::hash_psd2(message[0]) to separate Signature::sign from Request::sign.
28+ if message. len ( ) >= 2 && message[ 1 ] == N :: hash_psd2 ( & [ message[ 0 ] ] ) ? {
29+ bail ! (
30+ "Invalid message: message[1] == N::hash_psd2([message[0]]) is disallowed. Please construct a different message or use Request::sign."
31+ ) ;
32+ }
2733
2834 // Sample a random nonce from the scalar field.
2935 let nonce = Scalar :: rand ( rng) ;
@@ -77,3 +83,42 @@ impl<N: Network> Signature<N> {
7783 Self :: sign ( private_key, & fields, rng)
7884 }
7985}
86+
87+ #[ cfg( test) ]
88+ mod tests {
89+ use super :: * ;
90+ use snarkvm_console_network:: MainnetV0 ;
91+
92+ type CurrentNetwork = MainnetV0 ;
93+
94+ const ITERATIONS : u64 = 100 ;
95+
96+ #[ test]
97+ fn test_sign_rejects_request_like_messages ( ) -> Result < ( ) > {
98+ let mut rng = TestRng :: default ( ) ;
99+
100+ for _ in 0 ..ITERATIONS {
101+ // Sample a new private key.
102+ let private_key = PrivateKey :: < CurrentNetwork > :: new ( & mut rng) ?;
103+
104+ // Request signatures begin with (tvk, tcm) where tcm = hash_psd2(tvk).
105+ let tvk = Field :: < CurrentNetwork > :: rand ( & mut rng) ;
106+ let tcm = CurrentNetwork :: hash_psd2 ( & [ tvk] ) ?;
107+
108+ // Add a small number of extra field elements to the message.
109+ let extra_fields =
110+ ( 0 ..rng. random_range ( 0 ..10 ) ) . map ( |_| Field :: rand ( & mut rng) ) . collect :: < Vec < Field < CurrentNetwork > > > ( ) ;
111+
112+ let mut message = Vec :: with_capacity ( 2 + extra_fields. len ( ) ) ;
113+ message. extend ( [ tvk, tcm] ) ;
114+ message. extend ( extra_fields) ;
115+
116+ let error = Signature :: sign ( & private_key, & message, & mut rng) . unwrap_err ( ) ;
117+ assert ! (
118+ error. to_string( ) . contains( "message[1] == N::hash_psd2([message[0]])" ) ,
119+ "unexpected error: {error}"
120+ ) ;
121+ }
122+ Ok ( ( ) )
123+ }
124+ }
0 commit comments