Skip to content

Commit

Permalink
Revert slowdown for curves with expensive psi.
Browse files Browse the repository at this point in the history
  • Loading branch information
dfaranha committed Aug 12, 2024
1 parent 6cd3777 commit e9e5b46
Showing 1 changed file with 73 additions and 32 deletions.
105 changes: 73 additions & 32 deletions src/pc/relic_pc_exp.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,31 +168,52 @@ void gt_exp_gls_imp(gt_t c, const gt_t a, const bn_t b, size_t f) {
bn_rec_frb(_b, f, _b[0], u, n, ep_curve_is_pairf() == EP_BN);

l = 0;
gt_copy(t[0], a);
for (size_t i = 0; i < f; i++) {
s[i] = bn_sign(_b[i]);
_l[i] = RLC_FP_BITS + 1;
bn_rec_naf(naf + i * (RLC_FP_BITS + 1), &_l[i], _b[i], RLC_WIDTH);
l = RLC_MAX(l, _l[i]);
}

gt_copy(q, a);
if (bn_sign(_b[0]) == RLC_NEG) {
gt_inv(q, q);
}
if (RLC_WIDTH > 2) {
gt_sqr(t[0], q);
gt_mul(t[1], t[0], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[j], t[j - 1], t[0]);
if (ep_curve_is_pairf() == EP_K16 || ep_curve_embed() == 18) {
gt_copy(t[0], a);
for (size_t i = 1; i < f; i++) {
gt_psi(t[i * RLC_GT_TABLE], t[(i - 1) * RLC_GT_TABLE]);
}
}
gt_copy(t[0], q);
for (size_t i = 1; i < f; i++) {
for (size_t j = 0; j < RLC_GT_TABLE; j++) {
gt_psi(t[i * RLC_GT_TABLE + j], t[(i - 1) * RLC_GT_TABLE + j]);
if (s[i] != s[i - 1]) {
gt_inv(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j]);
for (size_t i = 0; i < f; i++) {
gt_copy(q, t[i * RLC_GT_TABLE]);
if (s[i] == RLC_NEG) {
gt_inv(q, t[i * RLC_GT_TABLE]);
}
if (RLC_WIDTH > 2) {
gt_sqr(t[i * RLC_GT_TABLE], q);
gt_mul(t[i * RLC_GT_TABLE + 1], t[i * RLC_GT_TABLE], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j - 1],
t[i * (RLC_GT_TABLE)]);
}
}
gt_copy(t[i * RLC_GT_TABLE], q);
}
} else {
gt_copy(q, a);
if (bn_sign(_b[0]) == RLC_NEG) {
gt_inv(q, q);
}
if (RLC_WIDTH > 2) {
gt_sqr(t[0], q);
gt_mul(t[1], t[0], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[j], t[j - 1], t[0]);
}
}
gt_copy(t[0], q);
for (size_t i = 1; i < f; i++) {
for (size_t j = 0; j < RLC_GT_TABLE; j++) {
gt_psi(t[i * RLC_GT_TABLE + j], t[(i - 1) * RLC_GT_TABLE + j]);
if (s[i] != s[i - 1]) {
gt_inv(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j]);
}
}
}
}
Expand Down Expand Up @@ -310,22 +331,42 @@ void gt_exp_reg_gls(gt_t c, const gt_t a, const bn_t b, size_t f) {
l = RLC_MAX(l, _l[i]);
}

gt_copy(t[0], a);
gt_inv(q, t[0]);
gt_copy_sec(q, t[0], bn_sign(_b[0]) == RLC_POS);
if (RLC_WIDTH > 2) {
gt_sqr(t[0], q);
gt_mul(t[1], t[0], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[j], t[j - 1], t[0]);
if (ep_curve_is_pairf() == EP_K16 || ep_curve_embed() == 18) {
gt_copy(t[0], a);
for (size_t i = 1; i < f; i++) {
gt_psi(t[i * RLC_GT_TABLE], t[(i - 1) * RLC_GT_TABLE]);
}
}
gt_copy(t[0], q);
for (size_t i = 1; i < f; i++) {
for (size_t j = 0; j < RLC_GT_TABLE; j++) {
gt_psi(t[i * RLC_GT_TABLE + j], t[(i - 1) * RLC_GT_TABLE + j]);
if (s[i] != s[i - 1]) {
gt_inv(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j]);
for (size_t i = 0; i < f; i++) {
gt_inv(q, t[i * RLC_GT_TABLE]);
gt_copy_sec(q, t[i * RLC_GT_TABLE], s[i] == RLC_POS);
if (RLC_WIDTH > 2) {
gt_sqr(t[i * RLC_GT_TABLE], q);
gt_mul(t[i * RLC_GT_TABLE + 1], t[i * RLC_GT_TABLE], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j - 1],
t[i * (RLC_GT_TABLE)]);
}
}
gt_copy(t[i * RLC_GT_TABLE], q);
}
} else {
gt_copy(t[0], a);
gt_inv(q, t[0]);
gt_copy_sec(q, t[0], bn_sign(_b[0]) == RLC_POS);
if (RLC_WIDTH > 2) {
gt_sqr(t[0], q);
gt_mul(t[1], t[0], q);
for (size_t j = 2; j < RLC_GT_TABLE; j++) {
gt_mul(t[j], t[j - 1], t[0]);
}
}
gt_copy(t[0], q);
for (size_t i = 1; i < f; i++) {
for (size_t j = 0; j < RLC_GT_TABLE; j++) {
gt_psi(t[i * RLC_GT_TABLE + j], t[(i - 1) * RLC_GT_TABLE + j]);
if (s[i] != s[i - 1]) {
gt_inv(t[i * RLC_GT_TABLE + j], t[i * RLC_GT_TABLE + j]);
}
}
}
}
Expand Down

0 comments on commit e9e5b46

Please sign in to comment.