@@ -144,6 +144,49 @@ int secp256k1_silentpayments_send_create_shared_secret(const secp256k1_context *
144
144
return 1 ;
145
145
}
146
146
147
+ int secp256k1_silentpayments_create_public_tweak_data (const secp256k1_context * ctx , secp256k1_pubkey * public_tweak_data , const secp256k1_pubkey * plain_pubkeys , size_t n_plain_pubkeys , const secp256k1_xonly_pubkey * xonly_pubkeys , size_t n_xonly_pubkeys , const unsigned char * outpoint_smallest36 ) {
148
+ size_t i ;
149
+ secp256k1_ge A_sum_ge , addend ;
150
+ secp256k1_gej A_sum_gej ;
151
+ secp256k1_scalar input_hash_scalar ;
152
+
153
+ /* Sanity check inputs */
154
+ VERIFY_CHECK (ctx != NULL );
155
+ ARG_CHECK (public_tweak_data != NULL );
156
+ ARG_CHECK (plain_pubkeys == NULL || n_plain_pubkeys >= 1 );
157
+ ARG_CHECK (xonly_pubkeys == NULL || n_xonly_pubkeys >= 1 );
158
+ ARG_CHECK ((plain_pubkeys != NULL ) || (xonly_pubkeys != NULL ));
159
+ ARG_CHECK ((n_plain_pubkeys + n_xonly_pubkeys ) >= 1 );
160
+ ARG_CHECK (outpoint_smallest36 != NULL );
161
+
162
+ /* Compute input public keys sum: A_sum = A_1 + A_2 + ... + A_n */
163
+ secp256k1_gej_set_infinity (& A_sum_gej );
164
+ for (i = 0 ; i < n_plain_pubkeys ; i ++ ) {
165
+ secp256k1_pubkey_load (ctx , & addend , & plain_pubkeys [i ]);
166
+ secp256k1_gej_add_ge (& A_sum_gej , & A_sum_gej , & addend );
167
+ }
168
+ for (i = 0 ; i < n_xonly_pubkeys ; i ++ ) {
169
+ secp256k1_xonly_pubkey_load (ctx , & addend , & xonly_pubkeys [i ]);
170
+ secp256k1_gej_add_ge (& A_sum_gej , & A_sum_gej , & addend );
171
+ }
172
+ if (secp256k1_gej_is_infinity (& A_sum_gej )) {
173
+ /* TODO: do we need a special error return code for this case? */
174
+ return 0 ;
175
+ }
176
+ secp256k1_ge_set_gej (& A_sum_ge , & A_sum_gej );
177
+
178
+ /* Compute input_hash = hash(outpoint_L || A_sum) */
179
+ secp256k1_silentpayments_calculate_input_hash (& input_hash_scalar , outpoint_smallest36 , & A_sum_ge );
180
+
181
+ /* Compute A_tweaked = A_sum * input_hash */
182
+ if (!secp256k1_eckey_pubkey_tweak_mul (& A_sum_ge , & input_hash_scalar )) {
183
+ return 0 ;
184
+ }
185
+ secp256k1_pubkey_save (public_tweak_data , & A_sum_ge );
186
+
187
+ return 1 ;
188
+ }
189
+
147
190
/* TODO: implement functions for receiver side. */
148
191
149
192
#endif
0 commit comments