MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
 {
        const uint8_t *buffer = xbuffer;
-       int i, j;
-       unsigned nbits, nbytes, nlimbs;
-       mpi_limb_t a;
-       MPI val = NULL;
+       unsigned int nbits, nbytes;
+       MPI val;
 
        if (*ret_nread < 2)
                return ERR_PTR(-EINVAL);
                pr_info("MPI: mpi too large (%u bits)\n", nbits);
                return ERR_PTR(-EINVAL);
        }
-       buffer += 2;
 
        nbytes = DIV_ROUND_UP(nbits, 8);
        if (nbytes + 2 > *ret_nread) {
                return ERR_PTR(-EINVAL);
        }
 
-       nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);
-       val = mpi_alloc(nlimbs);
+       val = mpi_read_raw_data(buffer + 2, nbytes);
        if (!val)
                return ERR_PTR(-ENOMEM);
-       i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
-       i %= BYTES_PER_MPI_LIMB;
-       val->nbits = nbits;
-       j = val->nlimbs = nlimbs;
-       val->sign = 0;
-       for (; j > 0; j--) {
-               a = 0;
-               for (; i < BYTES_PER_MPI_LIMB; i++) {
-                       a <<= 8;
-                       a |= *buffer++;
-               }
-               i = 0;
-               val->d[j - 1] = a;
-       }
 
        *ret_nread = nbytes + 2;
        return val;