* [including the GNU Public Licence.]
*/
+/*
+ * Details about Montgomery multiplication algorithms can be found at:
+ * http://www.ece.orst.edu/ISL/Publications.html
+ * http://www.ece.orst.edu/ISL/Koc/papers/j37acmon.pdf
+ */
+
#include <stdio.h>
#include "cryptlib.h"
#include "bn_lcl.h"
#define MONT_WORD
-int BN_mod_mul_montgomery(r,a,b,mont,ctx)
-BIGNUM *r,*a,*b;
-BN_MONT_CTX *mont;
-BN_CTX *ctx;
+int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_MONT_CTX *mont,
+ BN_CTX *ctx)
{
BIGNUM *tmp,*tmp2;
return(0);
}
-int BN_from_montgomery(ret,a,mont,ctx)
-BIGNUM *ret;
-BIGNUM *a;
-BN_MONT_CTX *mont;
-BN_CTX *ctx;
+int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont,
+ BN_CTX *ctx)
{
-#ifdef BN_RECURSION
+#ifdef BN_RECURSION_MONT
if (mont->use_word)
#endif
{
err1:
return(retn);
}
-#ifdef BN_RECURSION
+#ifdef BN_RECURSION_MONT
else /* bignum version */
{
BIGNUM *t1,*t2,*t3;
/* hmm... if a is between i and 2*i, things are bad */
if (a->top > i)
{
- j=bn_add_words(ret->d,ret->d,&(a->d[i]),i);
+ j=(int)(bn_add_words(ret->d,ret->d,&(a->d[i]),i));
if (j) /* overflow */
bn_sub_words(ret->d,ret->d,mont->N.d,i);
}
#endif
}
-BN_MONT_CTX *BN_MONT_CTX_new()
+BN_MONT_CTX *BN_MONT_CTX_new(void)
{
BN_MONT_CTX *ret;
return(ret);
}
-void BN_MONT_CTX_init(ctx)
-BN_MONT_CTX *ctx;
+void BN_MONT_CTX_init(BN_MONT_CTX *ctx)
{
ctx->use_word=0;
ctx->ri=0;
ctx->flags=0;
}
-void BN_MONT_CTX_free(mont)
-BN_MONT_CTX *mont;
+void BN_MONT_CTX_free(BN_MONT_CTX *mont)
{
+ if(mont == NULL)
+ return;
+
BN_free(&(mont->RR));
BN_free(&(mont->N));
BN_free(&(mont->Ni));
Free(mont);
}
-int BN_MONT_CTX_set(mont,mod,ctx)
-BN_MONT_CTX *mont;
-BIGNUM *mod;
-BN_CTX *ctx;
+int BN_MONT_CTX_set(BN_MONT_CTX *mont, BIGNUM *mod, BN_CTX *ctx)
{
BIGNUM Ri,*R;
R= &(mont->RR); /* grab RR as a temp */
BN_copy(&(mont->N),mod); /* Set N */
-#ifdef BN_RECURSION
+#ifdef BN_RECURSION_MONT
if (mont->N.top < BN_MONT_CTX_SET_SIZE_WORD)
#endif
{
BN_free(&Ri);
/* mod->top=z; */
}
-#ifdef BN_RECURSION
+#ifdef BN_RECURSION_MONT
else
{
mont->use_word=0;
return(0);
}
-BN_MONT_CTX *BN_MONT_CTX_copy(to, from)
-BN_MONT_CTX *to, *from;
+BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from)
{
if (to == from) return(to);