diff options
author | Werner Koch <wk@gnupg.org> | 1998-08-05 16:51:58 +0000 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 1998-08-05 16:51:58 +0000 |
commit | ba52295882a0b161c46f22342238425ef7d5c091 (patch) | |
tree | 605112ab0ee826ce9a92e687e3bf88abe29a2573 /mpi/mpicoder.c | |
parent | 2c5e32a68883a017b2bc87003f50ce5a4f1109d4 (diff) | |
download | libgcrypt-ba52295882a0b161c46f22342238425ef7d5c091.tar.gz |
intermediate check in
Diffstat (limited to 'mpi/mpicoder.c')
-rw-r--r-- | mpi/mpicoder.c | 44 |
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. |