Skip to content

Commit 6794be6

Browse files
committed
Add scalar splitting functions
Which currently delegate to the lambda-splitter in group.
1 parent d1502eb commit 6794be6

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

src/scalar.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,11 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a);
7272
/** Convert a scalar to a number. */
7373
static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a);
7474

75+
static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a);
76+
77+
#ifdef USE_ENDOMORPHISM
78+
/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */
79+
static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a);
80+
#endif
81+
7582
#endif

src/scalar_4x64_impl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,15 @@ static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t
390390
#undef extract
391391
#undef extract_fast
392392

393+
static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) {
394+
r1->d[0] = a->d[0];
395+
r1->d[1] = a->d[1];
396+
r1->d[2] = 0;
397+
r1->d[3] = 0;
398+
r2->d[0] = a->d[2];
399+
r2->d[1] = a->d[3];
400+
r2->d[2] = 0;
401+
r2->d[3] = 0;
402+
}
403+
393404
#endif

src/scalar_8x32_impl.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,4 +615,23 @@ static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t
615615
#undef extract
616616
#undef extract_fast
617617

618+
static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) {
619+
r1->d[0] = a->d[0];
620+
r1->d[1] = a->d[1];
621+
r1->d[2] = a->d[2];
622+
r1->d[3] = a->d[3];
623+
r1->d[4] = 0;
624+
r1->d[5] = 0;
625+
r1->d[6] = 0;
626+
r1->d[7] = 0;
627+
r2->d[0] = a->d[4];
628+
r2->d[1] = a->d[5];
629+
r2->d[2] = a->d[6];
630+
r2->d[3] = a->d[7];
631+
r2->d[4] = 0;
632+
r2->d[5] = 0;
633+
r2->d[6] = 0;
634+
r2->d[7] = 0;
635+
}
636+
618637
#endif

src/scalar_impl.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,27 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_
198198
#endif
199199
}
200200

201+
#ifdef USE_ENDOMORPHISM
202+
static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) {
203+
unsigned char b[32];
204+
secp256k1_scalar_get_b32(b, a);
205+
secp256k1_num_t na;
206+
secp256k1_num_set_bin(&na, b, 32);
207+
208+
secp256k1_num_t rn1, rn2;
209+
secp256k1_gej_split_exp_var(&rn1, &rn2, &na);
210+
211+
secp256k1_num_get_bin(b, 32, &rn1);
212+
secp256k1_scalar_set_b32(r1, b, NULL);
213+
if (secp256k1_num_is_neg(&rn1)) {
214+
secp256k1_scalar_negate(r1, r1);
215+
}
216+
secp256k1_num_get_bin(b, 32, &rn2);
217+
secp256k1_scalar_set_b32(r2, b, NULL);
218+
if (secp256k1_num_is_neg(&rn2)) {
219+
secp256k1_scalar_negate(r2, r2);
220+
}
221+
}
222+
#endif
223+
201224
#endif

0 commit comments

Comments
 (0)