diff options
Diffstat (limited to 'lib/crypto/mpi/mpi-add.c')
| -rw-r--r-- | lib/crypto/mpi/mpi-add.c | 89 | 
1 files changed, 26 insertions, 63 deletions
diff --git a/lib/crypto/mpi/mpi-add.c b/lib/crypto/mpi/mpi-add.c index 9056fc5167fc..3015140d4860 100644 --- a/lib/crypto/mpi/mpi-add.c +++ b/lib/crypto/mpi/mpi-add.c @@ -13,62 +13,12 @@  #include "mpi-internal.h" -/**************** - * Add the unsigned integer V to the mpi-integer U and store the - * result in W. U and V may be the same. - */ -void mpi_add_ui(MPI w, MPI u, unsigned long v) -{ -	mpi_ptr_t wp, up; -	mpi_size_t usize, wsize; -	int usign, wsign; - -	usize = u->nlimbs; -	usign = u->sign; -	wsign = 0; - -	/* If not space for W (and possible carry), increase space.  */ -	wsize = usize + 1; -	if (w->alloced < wsize) -		mpi_resize(w, wsize); - -	/* These must be after realloc (U may be the same as W).  */ -	up = u->d; -	wp = w->d; - -	if (!usize) {  /* simple */ -		wp[0] = v; -		wsize = v ? 1:0; -	} else if (!usign) {  /* mpi is not negative */ -		mpi_limb_t cy; -		cy = mpihelp_add_1(wp, up, usize, v); -		wp[usize] = cy; -		wsize = usize + cy; -	} else { -		/* The signs are different.  Need exact comparison to determine -		 * which operand to subtract from which. -		 */ -		if (usize == 1 && up[0] < v) { -			wp[0] = v - up[0]; -			wsize = 1; -		} else { -			mpihelp_sub_1(wp, up, usize, v); -			/* Size can decrease with at most one limb. */ -			wsize = usize - (wp[usize-1] == 0); -			wsign = 1; -		} -	} - -	w->nlimbs = wsize; -	w->sign   = wsign; -} - - -void mpi_add(MPI w, MPI u, MPI v) +int mpi_add(MPI w, MPI u, MPI v)  {  	mpi_ptr_t wp, up, vp;  	mpi_size_t usize, vsize, wsize;  	int usign, vsign, wsign; +	int err;  	if (u->nlimbs < v->nlimbs) { /* Swap U and V. */  		usize = v->nlimbs; @@ -76,7 +26,9 @@ void mpi_add(MPI w, MPI u, MPI v)  		vsize = u->nlimbs;  		vsign = u->sign;  		wsize = usize + 1; -		RESIZE_IF_NEEDED(w, wsize); +		err = RESIZE_IF_NEEDED(w, wsize); +		if (err) +			return err;  		/* These must be after realloc (u or v may be the same as w).  */  		up = v->d;  		vp = u->d; @@ -86,7 +38,9 @@ void mpi_add(MPI w, MPI u, MPI v)  		vsize = v->nlimbs;  		vsign = v->sign;  		wsize = usize + 1; -		RESIZE_IF_NEEDED(w, wsize); +		err = RESIZE_IF_NEEDED(w, wsize); +		if (err) +			return err;  		/* These must be after realloc (u or v may be the same as w).  */  		up = u->d;  		vp = v->d; @@ -128,28 +82,37 @@ void mpi_add(MPI w, MPI u, MPI v)  	w->nlimbs = wsize;  	w->sign = wsign; +	return 0;  }  EXPORT_SYMBOL_GPL(mpi_add); -void mpi_sub(MPI w, MPI u, MPI v) +int mpi_sub(MPI w, MPI u, MPI v)  { -	MPI vv = mpi_copy(v); +	int err; +	MPI vv; + +	vv = mpi_copy(v); +	if (!vv) +		return -ENOMEM; +  	vv->sign = !vv->sign; -	mpi_add(w, u, vv); +	err = mpi_add(w, u, vv);  	mpi_free(vv); + +	return err;  }  EXPORT_SYMBOL_GPL(mpi_sub); -void mpi_addm(MPI w, MPI u, MPI v, MPI m) +int mpi_addm(MPI w, MPI u, MPI v, MPI m)  { -	mpi_add(w, u, v); -	mpi_mod(w, w, m); +	return mpi_add(w, u, v) ?: +	       mpi_mod(w, w, m);  }  EXPORT_SYMBOL_GPL(mpi_addm); -void mpi_subm(MPI w, MPI u, MPI v, MPI m) +int mpi_subm(MPI w, MPI u, MPI v, MPI m)  { -	mpi_sub(w, u, v); -	mpi_mod(w, w, m); +	return mpi_sub(w, u, v) ?: +	       mpi_mod(w, w, m);  }  EXPORT_SYMBOL_GPL(mpi_subm);  | 
