| // This file was extracted from the TCG Published |
| // Trusted Platform Module Library |
| // Part 4: Supporting Routines |
| // Family "2.0" |
| // Level 00 Revision 01.16 |
| // October 30, 2014 |
| |
| #ifndef RSA_H |
| #define RSA_H |
| // |
| // This value is used to set the size of the table that is searched by the prime iterator. This is used during |
| // the generation of different primes. The smaller tables are used when generating smaller primes. |
| // |
| extern const UINT16 primeTableBytes; |
| // |
| // The following define determines how large the prime number difference table will be defined. The value of |
| // 13 will allocate the maximum size table which allows generation of the first 6542 primes which is all the |
| // primes less than 2^16. |
| #define PRIME_DIFF_TABLE_512_BYTE_PAGES 13 |
| // |
| // This set of macros used the value above to set the table size. |
| // |
| #ifndef PRIME_DIFF_TABLE_512_BYTE_PAGES |
| # define PRIME_DIFF_TABLE_512_BYTE_PAGES 4 |
| #endif |
| #ifdef PRIME_DIFF_TABLE_512_BYTE_PAGES |
| # if PRIME_DIFF_TABLE_512_BYTE_PAGES > 12 |
| # define PRIME_DIFF_TABLE_BYTES 6542 |
| # else |
| # if PRIME_DIFF_TABLE_512_BYTE_PAGES <= 0 |
| # define PRIME_DIFF_TABLE_BYTES 512 |
| # else |
| # define PRIME_DIFF_TABLE_BYTES (PRIME_DIFF_TABLE_512_BYTE_PAGES * 512) |
| # endif |
| # endif |
| #endif |
| extern const BYTE primeDiffTable [PRIME_DIFF_TABLE_BYTES]; |
| // |
| // This determines the number of bits in the sieve field This must be a power of two. |
| // |
| #define FIELD_POWER 14 // This is the only value in this group that should be |
| // changed |
| #define FIELD_BITS (1 << FIELD_POWER) |
| #define MAX_FIELD_SIZE ((FIELD_BITS / 8) + 1) |
| // |
| // This is the pre-sieved table. It already has the bits for multiples of 3, 5, and 7 cleared. |
| // |
| #define SEED_VALUES_SIZE 105 |
| const extern BYTE seedValues[SEED_VALUES_SIZE]; |
| // |
| // This allows determination of the number of bits that are set in a byte without having to count them |
| // individually. |
| // |
| const extern BYTE bitsInByte[256]; |
| // |
| // This is the iterator structure for accessing the compressed prime number table. The expectation is that |
| // values will need to be accesses sequentially. This tries to save some data access. |
| // |
| typedef struct { |
| UINT32 lastPrime; |
| UINT32 index; |
| UINT32 final; |
| } PRIME_ITERATOR; |
| #ifdef RSA_INSTRUMENT |
| # define INSTRUMENT_SET(a, b) ((a) = (b)) |
| # define INSTRUMENT_ADD(a, b) (a) = (a) + (b) |
| # define INSTRUMENT_INC(a) (a) = (a) + 1 |
| extern UINT32 failedAtIteration[10]; |
| extern UINT32 MillerRabinTrials; |
| extern UINT32 totalFieldsSieved; |
| extern UINT32 emptyFieldsSieved; |
| extern UINT32 noPrimeFields; |
| extern UINT32 primesChecked; |
| extern UINT16 lastSievePrime; |
| #else |
| # define INSTRUMENT_SET(a, b) |
| # define INSTRUMENT_ADD(a, b) |
| # define INSTRUMENT_INC(a) |
| #endif |
| #ifdef RSA_DEBUG |
| extern UINT16 defaultFieldSize; |
| #define NUM_PRIMES 2047 |
| extern const __int16 primes[NUM_PRIMES]; |
| #else |
| #define defaultFieldSize MAX_FIELD_SIZE |
| #endif |
| #endif |