/* crypto/bn/bn_gcd.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
#include "cryptlib.h"
#include "bn_lcl.h"
-#ifndef NOPROTO
static BIGNUM *euclid(BIGNUM *a, BIGNUM *b);
-#else
-static BIGNUM *euclid();
-#endif
-
-int BN_gcd(r,in_a,in_b,ctx)
-BIGNUM *r,*in_a,*in_b;
-BN_CTX *ctx;
+int BN_gcd(BIGNUM *r, BIGNUM *in_a, BIGNUM *in_b, BN_CTX *ctx)
{
BIGNUM *a,*b,*t;
int ret=0;
- a=ctx->bn[ctx->tos];
- b=ctx->bn[ctx->tos+1];
+ bn_check_top(in_a);
+ bn_check_top(in_b);
+
+ a= &(ctx->bn[ctx->tos]);
+ b= &(ctx->bn[ctx->tos+1]);
if (BN_copy(a,in_a) == NULL) goto err;
if (BN_copy(b,in_b) == NULL) goto err;
return(ret);
}
-static BIGNUM *euclid(a,b)
-BIGNUM *a,*b;
+static BIGNUM *euclid(BIGNUM *a, BIGNUM *b)
{
BIGNUM *t;
int shifts=0;
+ bn_check_top(a);
+ bn_check_top(b);
+
for (;;)
{
if (BN_is_zero(b))
}
/* solves ax == 1 (mod n) */
-BIGNUM *BN_mod_inverse(a, n, ctx)
-BIGNUM *a;
-BIGNUM *n;
-BN_CTX *ctx;
+BIGNUM *BN_mod_inverse(BIGNUM *in, BIGNUM *a, const BIGNUM *n, BN_CTX *ctx)
{
BIGNUM *A,*B,*X,*Y,*M,*D,*R;
- BIGNUM *ret=NULL,*T;
+ BIGNUM *T,*ret=NULL;
int sign;
- A=ctx->bn[ctx->tos];
- B=ctx->bn[ctx->tos+1];
- X=ctx->bn[ctx->tos+2];
- D=ctx->bn[ctx->tos+3];
- M=ctx->bn[ctx->tos+4];
- Y=ctx->bn[ctx->tos+5];
+ bn_check_top(a);
+ bn_check_top(n);
+
+ A= &(ctx->bn[ctx->tos]);
+ B= &(ctx->bn[ctx->tos+1]);
+ X= &(ctx->bn[ctx->tos+2]);
+ D= &(ctx->bn[ctx->tos+3]);
+ M= &(ctx->bn[ctx->tos+4]);
+ Y= &(ctx->bn[ctx->tos+5]);
ctx->tos+=6;
- R=BN_new();
+ if (in == NULL)
+ R=BN_new();
+ else
+ R=in;
if (R == NULL) goto err;
BN_zero(X);
B=M;
/* T has a struct, M does not */
- if (!BN_mul(T,D,X)) goto err;
+ if (!BN_mul(T,D,X,ctx)) goto err;
if (!BN_add(T,T,Y)) goto err;
M=Y;
Y=X;
}
ret=R;
err:
- if ((ret == NULL) && (R != NULL)) BN_free(R);
+ if ((ret == NULL) && (in == NULL)) BN_free(R);
ctx->tos-=6;
return(ret);
}