summaryrefslogtreecommitdiffstats
path: root/crypto/bn/bn_lib.c
diff options
context:
space:
mode:
authorBodo Möller <bodo@openssl.org>2002-10-28 13:23:24 +0000
committerBodo Möller <bodo@openssl.org>2002-10-28 13:23:24 +0000
commit5c6bf03117a26942327f43d02e9113e9870f7aba (patch)
tree69fe35ae1e549a9b68c2e6fbb0d209a19dc8856f /crypto/bn/bn_lib.c
parentf72ed6153b2b54c2129354187a2f50193b68f0a1 (diff)
fast reduction for NIST curves
Submitted by: Nils Larsch
Diffstat (limited to 'crypto/bn/bn_lib.c')
-rw-r--r--crypto/bn/bn_lib.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c
index 20f851cc66..fc610e0438 100644
--- a/crypto/bn/bn_lib.c
+++ b/crypto/bn/bn_lib.c
@@ -522,6 +522,51 @@ BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
return(a);
}
+BIGNUM *BN_ncopy(BIGNUM *a, const BIGNUM *b, size_t n)
+ {
+ int i, min;
+ BN_ULONG *A;
+ const BN_ULONG *B;
+
+ bn_check_top(b);
+
+ if (a == b)
+ return a;
+
+ min = (b->top < (int)n)? b->top: (int)n;
+
+ if (!min)
+ {
+ BN_zero(a);
+ return a;
+ }
+
+ if (bn_wexpand(a, min) == NULL)
+ return NULL;
+
+ A=a->d;
+ B=b->d;
+ for (i=min>>2; i>0; i--, A+=4, B+=4)
+ {
+ BN_ULONG a0,a1,a2,a3;
+ a0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];
+ A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
+ }
+ switch (min&3)
+ {
+ case 3: A[2]=B[2];
+ case 2: A[1]=B[1];
+ case 1: A[0]=B[0];
+ case 0: ;
+ }
+ a->top = min;
+
+ a->neg = b->neg;
+ bn_fix_top(a);
+
+ return(a);
+ }
+
void BN_swap(BIGNUM *a, BIGNUM *b)
{
int flags_old_a, flags_old_b;