Add framework for bn_mul_mont [from 098-fips].
authorAndy Polyakov <appro@openssl.org>
Sun, 11 Nov 2007 20:43:23 +0000 (20:43 +0000)
committerAndy Polyakov <appro@openssl.org>
Sun, 11 Nov 2007 20:43:23 +0000 (20:43 +0000)
Configure
crypto/bn/bn_lcl.h
crypto/bn/bn_mont.c

index 0a74446c33e8c4100957e4611d08ea47dd78b47e..bad6c93dd27485e79c0d559f2f2065a170d547b5 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1227,6 +1227,7 @@ $bn_obj = $bn_asm unless $bn_obj ne "";
 # bn86* is the only one implementing bn_*_part_words
 $cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn86/);
 $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /bn86/);
+$cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /\-mont|mo86\-/);
 
 $des_obj=$des_enc      unless ($des_obj =~ /\.o$/);
 $bf_obj=$bf_enc                unless ($bf_obj =~ /\.o$/);
index ad4ca7ff305a8e9c274464c8c67f37b7a86edabd..27ac4397a15172016e093f924e9d9b7ab997442a 100644 (file)
@@ -481,6 +481,7 @@ BN_ULONG bn_add_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
        int cl, int dl);
 BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
        int cl, int dl);
+int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np,const BN_ULONG *n0, int num);
 
 #ifdef  __cplusplus
 }
index b5d35d10be829f419f0d19212e6888e70da5f485..46b6eddf45cb275c62f470614c5a3c877a132888 100644 (file)
@@ -127,6 +127,21 @@ int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
        {
        BIGNUM *tmp;
        int ret=0;
+#if defined(OPENSSL_BN_ASM_MONT) && defined(MONT_WORD)
+       int num = mont->N.top;
+
+       if (num>1 && a->top==num && b->top==num)
+               {
+               if (bn_wexpand(r,num) == NULL) return(0);
+               if (bn_mul_mont(r->d,a->d,b->d,mont->N.d,&mont->n0,num))
+                       {
+                       r->neg = a->neg^b->neg;
+                       r->top = num;
+                       bn_correct_top(r);
+                       return(1);
+                       }
+               }
+#endif
 
        BN_CTX_start(ctx);
        tmp = BN_CTX_get(ctx);