98 const secp256k1_context *ctx,
99 const secp256k1_generator *blinding_gen,
104 secp256k1_rfc6979_hmac_sha256 rng;
105 size_t blinding_offset = 0;
106 size_t generator_slots = 0;
107 size_t allocation_bytes = 0;
108 unsigned char seed[64];
109 secp256k1_gej precompj;
112 VERIFY_CHECK(ctx != NULL);
113 VERIFY_CHECK(blinding_gen != NULL);
114 VERIFY_CHECK(precomp_n >= 1);
126 ret->
gens = (secp256k1_ge *)checked_malloc(&ctx->error_callback, allocation_bytes);
127 if (ret->
gens == NULL) {
134 secp256k1_fe_get_b32(&seed[0], &secp256k1_ge_const_g.x);
135 secp256k1_fe_get_b32(&seed[32], &secp256k1_ge_const_g.y);
137 secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed,
sizeof(seed));
138 for (i = 0; i < n; ++i) {
140 unsigned char tmp[32] = {0};
141 secp256k1_generator gen;
142 secp256k1_rfc6979_hmac_sha256_generate(&rng, tmp,
sizeof(tmp));
143 CHECK(secp256k1_generator_generate(ctx, &gen, tmp));
144 secp256k1_generator_load(&ret->
gens[i], &gen);
146 secp256k1_gej_set_ge(&precompj, &ret->
gens[i]);
147 for (j = 1; j < precomp_n; ++j) {
149 for (k = 0; k < 256 / precomp_n; ++k) {
150 secp256k1_gej_double_var(&precompj, &precompj, NULL);
152 secp256k1_ge_set_gej(&ret->
gens[i + n * j], &precompj);
156 secp256k1_generator_load(&ret->
blinding_gen[0], blinding_gen);
158 for (i = 1; i < precomp_n; ++i) {
160 for (k = 0; k < 256 / precomp_n; ++k) {
161 secp256k1_gej_double_var(&precompj, &precompj, NULL);
165 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
182 secp256k1_scalar *r1,
183 secp256k1_scalar *r2,
184 const unsigned char *seed,
187 static const unsigned char domain[] =
"Purify/Bulletproof/ScalarExpand";
188 unsigned char digest[32];
189 unsigned char idx_bytes[9];
190 secp256k1_sha256 sha256;
194 VERIFY_CHECK(seed != NULL);
195 for (shift = 0; shift < 8; ++shift) {
196 idx_bytes[shift] = (
unsigned char)(idx >> (8 * (7 - shift)));
200 secp256k1_sha256_initialize(&sha256);
201 secp256k1_sha256_write(&sha256, domain,
sizeof(domain) - 1);
202 secp256k1_sha256_write(&sha256, seed, 32);
203 secp256k1_sha256_write(&sha256, idx_bytes,
sizeof(idx_bytes));
204 secp256k1_sha256_finalize(&sha256, digest);
205 secp256k1_scalar_set_b32(r1, digest, &overflow);
206 VERIFY_CHECK(!overflow);
209 secp256k1_sha256_initialize(&sha256);
210 secp256k1_sha256_write(&sha256, domain,
sizeof(domain) - 1);
211 secp256k1_sha256_write(&sha256, seed, 32);
212 secp256k1_sha256_write(&sha256, idx_bytes,
sizeof(idx_bytes));
213 secp256k1_sha256_finalize(&sha256, digest);
214 secp256k1_scalar_set_b32(r2, digest, &overflow);
215 VERIFY_CHECK(!overflow);
217 secp256k1_memczero(digest,
sizeof(digest), 1);
222 const secp256k1_scalar *sec,
223 const secp256k1_scalar *value,
224 const secp256k1_ge *value_gen,
225 const secp256k1_ge *blind_gen
230 secp256k1_ecmult_const(rj, value_gen, value);
231 secp256k1_ecmult_const(&bj, blind_gen, sec);
232 if (!secp256k1_gej_is_infinity(&bj)) {
233 secp256k1_ge_set_gej(&bp, &bj);
234 secp256k1_gej_add_ge(rj, rj, &bp);
236 secp256k1_gej_clear(&bj);
237 secp256k1_ge_clear(&bp);
static SECP256K1_INLINE void secp256k1_pedersen_ecmult_scalar(secp256k1_gej *rj, const secp256k1_scalar *sec, const secp256k1_scalar *value, const secp256k1_ge *value_gen, const secp256k1_ge *blind_gen)
secp256k1_fast_scalar scal