forked from mirrors/linux
		
	MPILIB: Provide a function to read raw data into an MPI
Provide a function to read raw data of a predetermined size into an MPI rather than expecting the size to be encoded within the data. The data is assumed to represent an unsigned integer, and the resulting MPI will be positive. The function looks like this: MPI mpi_read_raw_data(const void *, size_t); This is useful for reading ASN.1 integer primitives where the length is encoded in the ASN.1 metadata. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
		
							parent
							
								
									42d5ec27f8
								
							
						
					
					
						commit
						e104599294
					
				
					 2 changed files with 56 additions and 0 deletions
				
			
		| 
						 | 
					@ -76,6 +76,7 @@ void mpi_swap(MPI a, MPI b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*-- mpicoder.c --*/
 | 
					/*-- mpicoder.c --*/
 | 
				
			||||||
MPI do_encode_md(const void *sha_buffer, unsigned nbits);
 | 
					MPI do_encode_md(const void *sha_buffer, unsigned nbits);
 | 
				
			||||||
 | 
					MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes);
 | 
				
			||||||
MPI mpi_read_from_buffer(const void *buffer, unsigned *ret_nread);
 | 
					MPI mpi_read_from_buffer(const void *buffer, unsigned *ret_nread);
 | 
				
			||||||
int mpi_fromstr(MPI val, const char *str);
 | 
					int mpi_fromstr(MPI val, const char *str);
 | 
				
			||||||
u32 mpi_get_keyid(MPI a, u32 *keyid);
 | 
					u32 mpi_get_keyid(MPI a, u32 *keyid);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,10 +18,65 @@
 | 
				
			||||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 | 
					 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/bitops.h>
 | 
				
			||||||
 | 
					#include <asm-generic/bitops/count_zeros.h>
 | 
				
			||||||
#include "mpi-internal.h"
 | 
					#include "mpi-internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_EXTERN_MPI_BITS 16384
 | 
					#define MAX_EXTERN_MPI_BITS 16384
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * mpi_read_raw_data - Read a raw byte stream as a positive integer
 | 
				
			||||||
 | 
					 * @xbuffer: The data to read
 | 
				
			||||||
 | 
					 * @nbytes: The amount of data to read
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const uint8_t *buffer = xbuffer;
 | 
				
			||||||
 | 
						int i, j;
 | 
				
			||||||
 | 
						unsigned nbits, nlimbs;
 | 
				
			||||||
 | 
						mpi_limb_t a;
 | 
				
			||||||
 | 
						MPI val = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (nbytes >= 0 && buffer[0] == 0) {
 | 
				
			||||||
 | 
							buffer++;
 | 
				
			||||||
 | 
							nbytes--;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nbits = nbytes * 8;
 | 
				
			||||||
 | 
						if (nbits > MAX_EXTERN_MPI_BITS) {
 | 
				
			||||||
 | 
							pr_info("MPI: mpi too large (%u bits)\n", nbits);
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (nbytes > 0)
 | 
				
			||||||
 | 
							nbits -= count_leading_zeros(buffer[0]);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							nbits = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
 | 
				
			||||||
 | 
						val = mpi_alloc(nlimbs);
 | 
				
			||||||
 | 
						if (!val)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						val->nbits = nbits;
 | 
				
			||||||
 | 
						val->sign = 0;
 | 
				
			||||||
 | 
						val->nlimbs = nlimbs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (nbytes > 0) {
 | 
				
			||||||
 | 
							i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
 | 
				
			||||||
 | 
							i %= BYTES_PER_MPI_LIMB;
 | 
				
			||||||
 | 
							for (j = nlimbs; j > 0; j--) {
 | 
				
			||||||
 | 
								a = 0;
 | 
				
			||||||
 | 
								for (; i < BYTES_PER_MPI_LIMB; i++) {
 | 
				
			||||||
 | 
									a <<= 8;
 | 
				
			||||||
 | 
									a |= *buffer++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								i = 0;
 | 
				
			||||||
 | 
								val->d[j - 1] = a;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return val;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(mpi_read_raw_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
 | 
					MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const uint8_t *buffer = xbuffer;
 | 
						const uint8_t *buffer = xbuffer;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue