@@ -44,22 +44,38 @@ static void secp256k1_pedersen_commitment_save(secp256k1_pedersen_commitment* co
4444}
4545
4646int secp256k1_pedersen_commitment_parse (const secp256k1_context * ctx , secp256k1_pedersen_commitment * commit , const unsigned char * input ) {
47+ secp256k1_fe x ;
48+ secp256k1_ge ge ;
49+
4750 VERIFY_CHECK (ctx != NULL );
4851 ARG_CHECK (commit != NULL );
4952 ARG_CHECK (input != NULL );
5053 (void ) ctx ;
51- if ((input [0 ] & 0xFE ) != 8 ) {
54+
55+ if ((input [0 ] & 0xFE ) != 8 ||
56+ !secp256k1_fe_set_b32 (& x , & input [1 ]) ||
57+ !secp256k1_ge_set_xquad (& ge , & x )) {
5258 return 0 ;
5359 }
54- memcpy (commit -> data , input , sizeof (commit -> data ));
60+ if (input [0 ] & 1 ) {
61+ secp256k1_ge_neg (& ge , & ge );
62+ }
63+ secp256k1_pedersen_commitment_save (commit , & ge );
5564 return 1 ;
5665}
5766
5867int secp256k1_pedersen_commitment_serialize (const secp256k1_context * ctx , unsigned char * output , const secp256k1_pedersen_commitment * commit ) {
68+ secp256k1_ge ge ;
69+
5970 VERIFY_CHECK (ctx != NULL );
6071 ARG_CHECK (output != NULL );
6172 ARG_CHECK (commit != NULL );
62- memcpy (output , commit -> data , sizeof (commit -> data ));
73+
74+ secp256k1_pedersen_commitment_load (& ge , commit );
75+
76+ output [0 ] = 11 ^ secp256k1_fe_is_quad_var (& ge .y );
77+ secp256k1_fe_normalize_var (& ge .x );
78+ secp256k1_fe_get_b32 (& output [1 ], & ge .x );
6379 return 1 ;
6480}
6581
0 commit comments