8 #ifndef _SECP256K1_BORROMEAN_IMPL_H_
9 #define _SECP256K1_BORROMEAN_IMPL_H_
17 #include "ecmult_gen.h"
23 #ifdef WORDS_BIGENDIAN
26 #define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24))
29 SECP256K1_INLINE static void secp256k1_borromean_hash(
unsigned char *hash,
const unsigned char *m,
size_t mlen,
const unsigned char *e,
size_t elen,
30 size_t ridx,
size_t eidx) {
34 secp256k1_sha256_initialize(&sha256_en);
35 ring =
BE32((uint32_t)ridx);
36 epos =
BE32((uint32_t)eidx);
37 secp256k1_sha256_write(&sha256_en, e, elen);
38 secp256k1_sha256_write(&sha256_en, m, mlen);
39 secp256k1_sha256_write(&sha256_en, (
unsigned char*)&ring, 4);
40 secp256k1_sha256_write(&sha256_en, (
unsigned char*)&epos, 4);
41 secp256k1_sha256_finalize(&sha256_en, hash);
64 unsigned char tmp[33];
78 secp256k1_sha256_initialize(&sha256_e0);
79 for (i = 0; i < nrings; i++) {
81 secp256k1_borromean_hash(tmp, m, mlen, e0, 32, i, 0);
82 secp256k1_scalar_set_b32(&ens, tmp, &overflow);
83 for (j = 0; j < rsizes[i]; j++) {
84 if (overflow || secp256k1_scalar_is_zero(&s[count]) || secp256k1_scalar_is_zero(&ens) || secp256k1_gej_is_infinity(&pubs[count])) {
91 secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count], &ens, &s[count]);
92 if (secp256k1_gej_is_infinity(&rgej)) {
96 secp256k1_ge_set_gej_var(&rge, &rgej);
97 secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1);
98 if (j != rsizes[i] - 1) {
99 secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j + 1);
100 secp256k1_scalar_set_b32(&ens, tmp, &overflow);
102 secp256k1_sha256_write(&sha256_e0, tmp, size);
107 secp256k1_sha256_write(&sha256_e0, m, mlen);
108 secp256k1_sha256_finalize(&sha256_e0, tmp);
109 return memcmp(e0, tmp, 32) == 0;
114 const size_t *rsizes,
const size_t *secidx,
size_t nrings,
const unsigned char *m,
size_t mlen) {
119 unsigned char tmp[33];
136 secp256k1_sha256_initialize(&sha256_e0);
138 for (i = 0; i < nrings; i++) {
140 secp256k1_ecmult_gen(ecmult_gen_ctx, &rgej, &k[i]);
141 secp256k1_ge_set_gej(&rge, &rgej);
142 if (secp256k1_gej_is_infinity(&rgej)) {
145 secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1);
146 for (j = secidx[i] + 1; j < rsizes[i]; j++) {
147 secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j);
148 secp256k1_scalar_set_b32(&ens, tmp, &overflow);
149 if (overflow || secp256k1_scalar_is_zero(&ens)) {
156 secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count + j], &ens, &s[count + j]);
157 if (secp256k1_gej_is_infinity(&rgej)) {
160 secp256k1_ge_set_gej_var(&rge, &rgej);
161 secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1);
163 secp256k1_sha256_write(&sha256_e0, tmp, size);
166 secp256k1_sha256_write(&sha256_e0, m, mlen);
167 secp256k1_sha256_finalize(&sha256_e0, e0);
169 for (i = 0; i < nrings; i++) {
171 secp256k1_borromean_hash(tmp, m, mlen, e0, 32, i, 0);
172 secp256k1_scalar_set_b32(&ens, tmp, &overflow);
173 if (overflow || secp256k1_scalar_is_zero(&ens)) {
176 for (j = 0; j < secidx[i]; j++) {
177 secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count + j], &ens, &s[count + j]);
178 if (secp256k1_gej_is_infinity(&rgej)) {
181 secp256k1_ge_set_gej_var(&rge, &rgej);
182 secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1);
183 secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j + 1);
184 secp256k1_scalar_set_b32(&ens, tmp, &overflow);
185 if (overflow || secp256k1_scalar_is_zero(&ens)) {
189 secp256k1_scalar_mul(&s[count + j], &ens, &sec[i]);
190 secp256k1_scalar_negate(&s[count + j], &s[count + j]);
191 secp256k1_scalar_add(&s[count + j], &s[count + j], &k[i]);
192 if (secp256k1_scalar_is_zero(&s[count + j])) {
197 secp256k1_scalar_clear(&ens);
198 secp256k1_ge_clear(&rge);
199 secp256k1_gej_clear(&rgej);