7 #ifndef _SECP256K1_SURJECTION_IMPL_H_
8 #define _SECP256K1_SURJECTION_IMPL_H_
21 unsigned char pk_ser[33];
22 size_t pk_len =
sizeof(pk_ser);
25 secp256k1_sha256_initialize(&sha256_en);
26 for (i = 0; i < n_input_tags; i++) {
27 secp256k1_eckey_pubkey_serialize(&ephemeral_input_tags[i], pk_ser, &pk_len, 1);
28 assert(pk_len ==
sizeof(pk_ser));
29 secp256k1_sha256_write(&sha256_en, pk_ser, pk_len);
31 secp256k1_eckey_pubkey_serialize(ephemeral_output_tag, pk_ser, &pk_len, 1);
32 assert(pk_len ==
sizeof(pk_ser));
33 secp256k1_sha256_write(&sha256_en, pk_ser, pk_len);
34 secp256k1_sha256_finalize(&sha256_en, msg32);
39 unsigned char sec_input[36];
43 secp256k1_scalar_get_b32(&sec_input[4], blinding_key);
44 for (i = 0; i < ns; i++) {
47 sec_input[1] = i >> 8;
48 sec_input[2] = i >> 16;
49 sec_input[3] = i >> 24;
51 secp256k1_sha256_initialize(&sha256_en);
52 secp256k1_sha256_write(&sha256_en, sec_input, 36);
53 secp256k1_sha256_finalize(&sha256_en, sec_input);
54 secp256k1_scalar_set_b32(&s[i], sec_input, &overflow);
56 memset(sec_input, 0, 32);
60 memset(sec_input, 0, 32);
64 SECP256K1_INLINE static int secp256k1_surjection_compute_public_keys(
secp256k1_gej *pubkeys,
size_t n_pubkeys,
const secp256k1_ge *input_tags,
size_t n_input_tags,
const unsigned char *used_tags,
const secp256k1_ge *output_tag,
size_t input_index,
size_t *ring_input_index) {
67 for (i = 0; i < n_input_tags; i++) {
68 if (used_tags[i / 8] & (1 << (i % 8))) {
70 secp256k1_ge_neg(&tmpge, &input_tags[i]);
71 secp256k1_gej_set_ge(&pubkeys[j], &tmpge);
72 secp256k1_gej_add_ge_var(&pubkeys[j], &pubkeys[j], output_tag, NULL);
73 if (ring_input_index != NULL && input_index == i) {
74 *ring_input_index = j;