sync
This commit is contained in:
parent
123b6c5611
commit
6871d7cb85
12 changed files with 224 additions and 96 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: bn_arch.h,v 1.10 2023/06/12 16:42:11 jsing Exp $ */
|
||||
/* $OpenBSD: bn_arch.h,v 1.11 2023/06/17 15:40:46 jsing Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
|
||||
*
|
||||
|
@ -177,6 +177,33 @@ bn_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0,
|
|||
*out_r0 = r0;
|
||||
}
|
||||
|
||||
#define HAVE_BN_MUL2_MULW_ADDTW
|
||||
|
||||
static inline void
|
||||
bn_mul2_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0,
|
||||
BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||
{
|
||||
BN_ULONG r2, r1, r0, x1, x0;
|
||||
|
||||
__asm__ (
|
||||
"umulh %[x1], %[a], %[b] \n"
|
||||
"mul %[x0], %[a], %[b] \n"
|
||||
"adds %[r0], %[c0], %[x0] \n"
|
||||
"adcs %[r1], %[c1], %[x1] \n"
|
||||
"adc %[r2], xzr, %[c2] \n"
|
||||
"adds %[r0], %[r0], %[x0] \n"
|
||||
"adcs %[r1], %[r1], %[x1] \n"
|
||||
"adc %[r2], xzr, %[r2] \n"
|
||||
: [r2]"=&r"(r2), [r1]"=&r"(r1), [r0]"=&r"(r0), [x1]"=&r"(x1),
|
||||
[x0]"=&r"(x0)
|
||||
: [a]"r"(a), [b]"r"(b), [c2]"r"(c2), [c1]"r"(c1), [c0]"r"(c0)
|
||||
: "cc");
|
||||
|
||||
*out_r2 = r2;
|
||||
*out_r1 = r1;
|
||||
*out_r0 = r0;
|
||||
}
|
||||
|
||||
#define HAVE_BN_QWMULW_ADDW
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: bn_mont.c,v 1.59 2023/04/30 05:21:20 tb Exp $ */
|
||||
/* $OpenBSD: bn_mont.c,v 1.60 2023/06/17 14:43:50 jsing Exp $ */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
|
@ -327,6 +327,36 @@ bn_mod_mul_montgomery_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
bn_montgomery_multiply_word(const BN_ULONG *ap, BN_ULONG b, const BN_ULONG *np,
|
||||
BN_ULONG *tp, BN_ULONG w, BN_ULONG *carry_a, BN_ULONG *carry_n, int n_len)
|
||||
{
|
||||
BN_ULONG x3, x2, x1, x0;
|
||||
|
||||
*carry_a = *carry_n = 0;
|
||||
|
||||
while (n_len & ~3) {
|
||||
bn_qwmulw_addqw_addw(ap[3], ap[2], ap[1], ap[0], b,
|
||||
tp[3], tp[2], tp[1], tp[0], *carry_a, carry_a,
|
||||
&x3, &x2, &x1, &x0);
|
||||
bn_qwmulw_addqw_addw(np[3], np[2], np[1], np[0], w,
|
||||
x3, x2, x1, x0, *carry_n, carry_n,
|
||||
&tp[3], &tp[2], &tp[1], &tp[0]);
|
||||
ap += 4;
|
||||
np += 4;
|
||||
tp += 4;
|
||||
n_len -= 4;
|
||||
}
|
||||
while (n_len > 0) {
|
||||
bn_mulw_addw_addw(ap[0], b, tp[0], *carry_a, carry_a, &x0);
|
||||
bn_mulw_addw_addw(np[0], w, x0, *carry_n, carry_n, &tp[0]);
|
||||
ap++;
|
||||
np++;
|
||||
tp++;
|
||||
n_len--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* bn_montgomery_multiply_words() computes r = aR * bR * R^-1 = abR for the
|
||||
* given word arrays. The caller must ensure that rp, ap, bp and np are all
|
||||
|
@ -336,10 +366,10 @@ void
|
|||
bn_montgomery_multiply_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
|
||||
const BN_ULONG *np, BN_ULONG *tp, BN_ULONG n0, int n_len)
|
||||
{
|
||||
BN_ULONG a0, b, carry_a, carry_n, carry, mask, w, x;
|
||||
int i, j;
|
||||
BN_ULONG a0, b, carry_a, carry_n, carry, mask, w;
|
||||
int i;
|
||||
|
||||
carry_a = carry_n = carry = 0;
|
||||
carry = 0;
|
||||
|
||||
for (i = 0; i < n_len; i++)
|
||||
tp[i] = 0;
|
||||
|
@ -349,15 +379,12 @@ bn_montgomery_multiply_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *b
|
|||
for (i = 0; i < n_len; i++) {
|
||||
b = bp[i];
|
||||
|
||||
/* Compute new t[0] * n0, as we need it inside the loop. */
|
||||
/* Compute new t[0] * n0, as we need it for this iteration. */
|
||||
w = (a0 * b + tp[0]) * n0;
|
||||
|
||||
for (j = 0; j < n_len; j++) {
|
||||
bn_mulw_addw_addw(ap[j], b, tp[j], carry_a, &carry_a, &x);
|
||||
bn_mulw_addw_addw(np[j], w, x, carry_n, &carry_n, &tp[j]);
|
||||
}
|
||||
bn_montgomery_multiply_word(ap, b, np, tp, w, &carry_a,
|
||||
&carry_n, n_len);
|
||||
bn_addw_addw(carry_a, carry_n, carry, &carry, &tp[n_len]);
|
||||
carry_a = carry_n = 0;
|
||||
|
||||
tp++;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue