Skip to content

Commit 2020c3f

Browse files
committed
mp_cond_swap_ct: branchless masked XOR
1 parent 8d2581a commit 2020c3f

1 file changed

Lines changed: 36 additions & 8 deletions

File tree

wolfcrypt/src/integer.c

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -549,21 +549,49 @@ int mp_exch (mp_int * a, mp_int * b)
549549
return MP_OKAY;
550550
}
551551

552+
/* Constant-time conditional swap: must not branch on m (leaks scalar bit). */
552553
int mp_cond_swap_ct_ex (mp_int * a, mp_int * b, int c, int m, mp_int * t)
553554
{
554-
(void)c;
555-
(void)t;
556-
if (m == 1)
557-
mp_exch(a, b);
555+
int i;
556+
int err;
557+
int imask = -m;
558+
mp_digit mask = (mp_digit)0 - (mp_digit)m;
559+
560+
if ((err = mp_grow(a, c)) != MP_OKAY)
561+
return err;
562+
if ((err = mp_grow(b, c)) != MP_OKAY)
563+
return err;
564+
if ((err = mp_grow(t, c)) != MP_OKAY)
565+
return err;
566+
567+
t->used = (a->used ^ b->used) & imask;
568+
for (i = 0; i < c; i++) {
569+
t->dp[i] = (a->dp[i] ^ b->dp[i]) & mask;
570+
}
571+
a->used ^= t->used;
572+
for (i = 0; i < c; i++) {
573+
a->dp[i] ^= t->dp[i];
574+
}
575+
b->used ^= t->used;
576+
for (i = 0; i < c; i++) {
577+
b->dp[i] ^= t->dp[i];
578+
}
579+
558580
return MP_OKAY;
559581
}
560582

561583
int mp_cond_swap_ct (mp_int * a, mp_int * b, int c, int m)
562584
{
563-
(void)c;
564-
if (m == 1)
565-
mp_exch(a, b);
566-
return MP_OKAY;
585+
mp_int t;
586+
int err;
587+
588+
if ((err = mp_init(&t)) != MP_OKAY)
589+
return err;
590+
591+
err = mp_cond_swap_ct_ex(a, b, c, m, &t);
592+
593+
mp_clear(&t);
594+
return err;
567595
}
568596

569597

0 commit comments

Comments
 (0)