Add set_long and get_long functions
They work on platform-dependent long ints
This commit is contained in:
		
							parent
							
								
									a263647f23
								
							
						
					
					
						commit
						6df187aea4
					
				
							
								
								
									
										39
									
								
								bn_mp_get_long.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								bn_mp_get_long.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | #include <tommath.h> | ||||||
|  | #ifdef BN_MP_GET_INT_C | ||||||
|  | /* LibTomMath, multiple-precision integer library -- Tom St Denis
 | ||||||
|  |  * | ||||||
|  |  * LibTomMath is a library that provides multiple-precision | ||||||
|  |  * integer arithmetic as well as number theoretic functionality. | ||||||
|  |  * | ||||||
|  |  * The library was designed directly after the MPI library by | ||||||
|  |  * Michael Fromberger but has been written from scratch with | ||||||
|  |  * additional optimizations in place. | ||||||
|  |  * | ||||||
|  |  * The library is free for all purposes without any express | ||||||
|  |  * guarantee it works. | ||||||
|  |  * | ||||||
|  |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* get the lower unsigned long of an mp_int, platform dependent */ | ||||||
|  | unsigned long mp_get_long(mp_int * a) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |   unsigned long res; | ||||||
|  | 
 | ||||||
|  |   if (a->used == 0) { | ||||||
|  |      return 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /* get number of digits of the lsb we have to read */ | ||||||
|  |   i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; | ||||||
|  | 
 | ||||||
|  |   /* get most significant digit of result */ | ||||||
|  |   res = DIGIT(a,i); | ||||||
|  |     | ||||||
|  |   while (--i >= 0) { | ||||||
|  |     res = (res << DIGIT_BIT) | DIGIT(a,i); | ||||||
|  |   } | ||||||
|  |   return res; | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										48
									
								
								bn_mp_set_long.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								bn_mp_set_long.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | #include <tommath.h> | ||||||
|  | #ifdef BN_MP_SET_INT_C | ||||||
|  | /* LibTomMath, multiple-precision integer library -- Tom St Denis
 | ||||||
|  |  * | ||||||
|  |  * LibTomMath is a library that provides multiple-precision | ||||||
|  |  * integer arithmetic as well as number theoretic functionality. | ||||||
|  |  * | ||||||
|  |  * The library was designed directly after the MPI library by | ||||||
|  |  * Michael Fromberger but has been written from scratch with | ||||||
|  |  * additional optimizations in place. | ||||||
|  |  * | ||||||
|  |  * The library is free for all purposes without any express | ||||||
|  |  * guarantee it works. | ||||||
|  |  * | ||||||
|  |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* set a platform dependent unsigned long int */ | ||||||
|  | int mp_set_long (mp_int * a, unsigned long b) | ||||||
|  | { | ||||||
|  |   int     x, res; | ||||||
|  | 
 | ||||||
|  |   mp_zero (a); | ||||||
|  |    | ||||||
|  |   /* set four bits at a time */ | ||||||
|  |   for (x = 0; x < sizeof(unsigned long) * 2; x++) { | ||||||
|  |     /* shift the number up four bits */ | ||||||
|  |     if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { | ||||||
|  |       return res; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* OR in the top four bits of the source */ | ||||||
|  |     a->dp[0] |= (b >> ((sizeof(unsigned long)) * 8 - 4)) & 15; | ||||||
|  | 
 | ||||||
|  |     /* shift the source up to the next four bits */ | ||||||
|  |     b <<= 4; | ||||||
|  | 
 | ||||||
|  |     /* ensure that digits are not clamped off */ | ||||||
|  |     a->used += 1; | ||||||
|  |   } | ||||||
|  |   mp_clamp (a); | ||||||
|  |   return MP_OKAY; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* $Source$ */ | ||||||
|  | /* $Revision$ */ | ||||||
|  | /* $Date$ */ | ||||||
| @ -242,9 +242,15 @@ void mp_set(mp_int *a, mp_digit b); | |||||||
| /* set a 32-bit const */ | /* set a 32-bit const */ | ||||||
| int mp_set_int(mp_int *a, unsigned long b); | int mp_set_int(mp_int *a, unsigned long b); | ||||||
| 
 | 
 | ||||||
|  | /* set a platform dependent unsigned long value */ | ||||||
|  | int mp_set_long(mp_int *a, unsigned long b); | ||||||
|  | 
 | ||||||
| /* get a 32-bit value */ | /* get a 32-bit value */ | ||||||
| unsigned long mp_get_int(mp_int * a); | unsigned long mp_get_int(mp_int * a); | ||||||
| 
 | 
 | ||||||
|  | /* get a platform dependent unsigned long value */ | ||||||
|  | unsigned long mp_get_long(mp_int * a); | ||||||
|  | 
 | ||||||
| /* initialize and set a digit */ | /* initialize and set a digit */ | ||||||
| int mp_init_set (mp_int * a, mp_digit b); | int mp_init_set (mp_int * a, mp_digit b); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user