summaryrefslogtreecommitdiff
path: root/mpi/mpicoder.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>1998-08-05 16:51:58 +0000
committerWerner Koch <wk@gnupg.org>1998-08-05 16:51:58 +0000
commitba52295882a0b161c46f22342238425ef7d5c091 (patch)
tree605112ab0ee826ce9a92e687e3bf88abe29a2573 /mpi/mpicoder.c
parent2c5e32a68883a017b2bc87003f50ce5a4f1109d4 (diff)
downloadlibgcrypt-ba52295882a0b161c46f22342238425ef7d5c091.tar.gz
intermediate check in
Diffstat (limited to 'mpi/mpicoder.c')
-rw-r--r--mpi/mpicoder.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/mpi/mpicoder.c b/mpi/mpicoder.c
index eba82a28..2775f5be 100644
--- a/mpi/mpicoder.c
+++ b/mpi/mpicoder.c
@@ -123,6 +123,50 @@ mpi_read(IOBUF inp, unsigned *ret_nread, int secure)
}
+MPI
+mpi_read_from_buffer(byte *buffer, unsigned *ret_nread, int secure)
+{
+ int i, j;
+ unsigned nbits, nbytes, nlimbs, nread=0;
+ mpi_limb_t a;
+ MPI val = MPI_NULL;
+
+ if( *ret_nread < 2 )
+ goto leave;
+ nbits = buffer[0] << 8 | buffer[1];
+ if( nbits > MAX_EXTERN_MPI_BITS ) {
+ log_error("mpi too large (%u bits)\n", nbits);
+ goto leave;
+ }
+ buffer += 2;
+ nread = 2;
+
+ nbytes = (nbits+7) / 8;
+ nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
+ val = secure? mpi_alloc_secure( nlimbs )
+ : mpi_alloc( nlimbs );
+ 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++ ) {
+ if( ++nread > *ret_nread )
+ log_bug("mpi larger than buffer");
+ a <<= 8;
+ a |= *buffer++;
+ }
+ i = 0;
+ val->d[j-1] = a;
+ }
+
+ leave:
+ *ret_nread = nread;
+ return val;
+}
+
/****************
* Make an mpi from a character string.