mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-10-31 03:30:35 -04:00 
			
		
		
		
	- Added mpi_get_bit() and mpi_set_bit() individual bit setter/getter functions.
This commit is contained in:
		
							parent
							
								
									831a755d9e
								
							
						
					
					
						commit
						2f5947e1f6
					
				| @ -9,6 +9,8 @@ Features | |||||||
|      by undefining POLARSSL_FS_IO |      by undefining POLARSSL_FS_IO | ||||||
|    * A error_strerror function() has been added to translate between |    * A error_strerror function() has been added to translate between | ||||||
|      error codes and their description. |      error codes and their description. | ||||||
|  |    * Added mpi_get_bit() and mpi_set_bit() individual bit setter/getter | ||||||
|  |      functions. | ||||||
| 
 | 
 | ||||||
| Changes | Changes | ||||||
|    * Major argument / variable rewrite. Introduced use of size_t |    * Major argument / variable rewrite. Introduced use of size_t | ||||||
|  | |||||||
| @ -146,6 +146,32 @@ void mpi_swap( mpi *X, mpi *Y ); | |||||||
|  */ |  */ | ||||||
| int mpi_lset( mpi *X, t_sint z ); | int mpi_lset( mpi *X, t_sint z ); | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * \brief          Get a specific bit from X | ||||||
|  |  * | ||||||
|  |  * \param X        MPI to use | ||||||
|  |  * \param pos      Zero-based index of the bit in X | ||||||
|  |  * | ||||||
|  |  * \return         Either a 0 or a 1 | ||||||
|  |  */ | ||||||
|  | int mpi_get_bit( mpi *X, size_t pos ); | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * \brief          Set a bit of X to a specific value of 0 or 1 | ||||||
|  |  * | ||||||
|  |  * \note           Will grow X if necessary to set a bit to 1 in a not yet | ||||||
|  |  *                 existing limb. Will not grow if bit should be set to 0 | ||||||
|  |  * | ||||||
|  |  * \param X        MPI to use | ||||||
|  |  * \param pos      Zero-based index of the bit in X | ||||||
|  |  * \param val      The value to set the bit to (0 or 1) | ||||||
|  |  * | ||||||
|  |  * \return         0 if successful, | ||||||
|  |  *                 1 if memory allocation failed, | ||||||
|  |  *                 POLARSSL_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 | ||||||
|  |  */ | ||||||
|  | int mpi_set_bit( mpi *X, size_t pos, unsigned char val ); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * \brief          Return the number of least significant bits |  * \brief          Return the number of least significant bits | ||||||
|  * |  * | ||||||
|  | |||||||
| @ -170,6 +170,44 @@ cleanup: | |||||||
|     return( ret ); |     return( ret ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Get a specific bit | ||||||
|  |  */ | ||||||
|  | int mpi_get_bit( mpi *X, size_t pos ) | ||||||
|  | { | ||||||
|  |     if( X->n * biL <= pos ) | ||||||
|  |         return( 0 ); | ||||||
|  | 
 | ||||||
|  |     return ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Set a bit to a specific value of 0 or 1 | ||||||
|  |  */ | ||||||
|  | int mpi_set_bit( mpi *X, size_t pos, unsigned char val ) | ||||||
|  | { | ||||||
|  |     int ret = 0; | ||||||
|  |     size_t off = pos / biL; | ||||||
|  |     size_t idx = pos % biL; | ||||||
|  | 
 | ||||||
|  |     if( val != 0 && val != 1 ) | ||||||
|  |         return POLARSSL_ERR_MPI_BAD_INPUT_DATA; | ||||||
|  |          | ||||||
|  |     if( X->n * biL <= pos ) | ||||||
|  |     { | ||||||
|  |         if( val == 0 ) | ||||||
|  |             return ( 0 ); | ||||||
|  | 
 | ||||||
|  |         MPI_CHK( mpi_grow( X, off + 1 ) ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     X->p[off] = ( X->p[off] & ~( 0x01 << idx ) ) | ( val << idx ); | ||||||
|  | 
 | ||||||
|  | cleanup: | ||||||
|  |      | ||||||
|  |     return( ret ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Return the number of least significant bits |  * Return the number of least significant bits | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -518,6 +518,33 @@ mpi_is_prime:10:"32452867":0 | |||||||
| Test mpi_is_prime #20 | Test mpi_is_prime #20 | ||||||
| mpi_is_prime:10:"49979687":0 | mpi_is_prime:10:"49979687":0 | ||||||
| 
 | 
 | ||||||
|  | Test bit getting (Value bit 25) | ||||||
|  | mpi_get_bit:10:"49979687":25:1 | ||||||
|  | 
 | ||||||
|  | Test bit getting (Larger but same limb) | ||||||
|  | mpi_get_bit:10:"49979687":26:0 | ||||||
|  | 
 | ||||||
|  | Test bit getting (Larger and non-existing limb) | ||||||
|  | mpi_get_bit:10:"49979687":500:0 | ||||||
|  | 
 | ||||||
|  | Test bit getting (Value bit 24) | ||||||
|  | mpi_get_bit:10:"49979687":24:0 | ||||||
|  | 
 | ||||||
|  | Test bit getting (Value bit 23) | ||||||
|  | mpi_get_bit:10:"49979687":23:1 | ||||||
|  | 
 | ||||||
|  | Test bit set (Change existing value with a 1) | ||||||
|  | mpi_set_bit:10:"49979687":24:1:10:"66756903" | ||||||
|  | 
 | ||||||
|  | Test bit set (Change existing value with a 0) | ||||||
|  | mpi_set_bit:10:"49979687":25:0:10:"16425255" | ||||||
|  | 
 | ||||||
|  | Test bit set (Add above existing limbs with a 0) | ||||||
|  | mpi_set_bit:10:"49979687":80:0:10:"49979687" | ||||||
|  | 
 | ||||||
|  | Test bit set (Add above existing limbs with a 1) | ||||||
|  | mpi_set_bit:10:"49979687":80:1:10:"1208925819614629224685863" | ||||||
|  | 
 | ||||||
| MPI Selftest | MPI Selftest | ||||||
| depends_on:POLARSSL_SELF_TEST | depends_on:POLARSSL_SELF_TEST | ||||||
| mpi_selftest: | mpi_selftest: | ||||||
|  | |||||||
| @ -142,6 +142,33 @@ mpi_write_file:radix_X:input_X:output_radix:output_file | |||||||
| } | } | ||||||
| END_CASE | END_CASE | ||||||
| 
 | 
 | ||||||
|  | BEGIN_CASE | ||||||
|  | mpi_get_bit:radix_X:input_X:pos:val | ||||||
|  | { | ||||||
|  |     mpi X; | ||||||
|  |     mpi_init( &X ); | ||||||
|  |     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 ); | ||||||
|  |     TEST_ASSERT( mpi_get_bit( &X, {pos} ) == {val} ); | ||||||
|  | 
 | ||||||
|  |     mpi_free( &X ); | ||||||
|  | } | ||||||
|  | END_CASE | ||||||
|  | 
 | ||||||
|  | BEGIN_CASE | ||||||
|  | mpi_set_bit:radix_X:input_X:pos:val:radix_Y:output_Y | ||||||
|  | { | ||||||
|  |     mpi X, Y; | ||||||
|  |     mpi_init( &X ); mpi_init( &Y ); | ||||||
|  | 
 | ||||||
|  |     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 ); | ||||||
|  |     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {output_Y} ) == 0 ); | ||||||
|  |     TEST_ASSERT( mpi_set_bit( &X, {pos}, {val} ) == 0 ); | ||||||
|  |     TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 ); | ||||||
|  | 
 | ||||||
|  |     mpi_free( &X ); | ||||||
|  | } | ||||||
|  | END_CASE | ||||||
|  | 
 | ||||||
| BEGIN_CASE | BEGIN_CASE | ||||||
| mpi_lsb:radix_X:input_X:nr_bits | mpi_lsb:radix_X:input_X:nr_bits | ||||||
| { | { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paul Bakker
						Paul Bakker