]> Git Repo - J-linux.git/blobdiff - lib/crypto/mpi/mpi-add.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / lib / crypto / mpi / mpi-add.c
index 9056fc5167fc84c67f9dbe236ae88ac92278294a..3015140d486023f7eac73fe3e9ec87ce303f1552 100644 (file)
 
 #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);
This page took 0.03072 seconds and 4 git commands to generate.