blob: 0af452513ff17e70d02664e3dc606a242224f027 [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// This file was extracted from the TCG Published
2// Trusted Platform Module Library
3// Part 4: Supporting Routines
4// Family "2.0"
5// Level 00 Revision 01.16
6// October 30, 2014
7
8#ifndef RSA_H
9#define RSA_H
10//
11// This value is used to set the size of the table that is searched by the prime iterator. This is used during
12// the generation of different primes. The smaller tables are used when generating smaller primes.
13//
14extern const UINT16 primeTableBytes;
15//
16// The following define determines how large the prime number difference table will be defined. The value of
17// 13 will allocate the maximum size table which allows generation of the first 6542 primes which is all the
18// primes less than 2^16.
19#define PRIME_DIFF_TABLE_512_BYTE_PAGES 13
20//
21// This set of macros used the value above to set the table size.
22//
23#ifndef PRIME_DIFF_TABLE_512_BYTE_PAGES
24# define PRIME_DIFF_TABLE_512_BYTE_PAGES 4
25#endif
26#ifdef PRIME_DIFF_TABLE_512_BYTE_PAGES
27# if PRIME_DIFF_TABLE_512_BYTE_PAGES > 12
28# define PRIME_DIFF_TABLE_BYTES 6542
29# else
30# if PRIME_DIFF_TABLE_512_BYTE_PAGES <= 0
31# define PRIME_DIFF_TABLE_BYTES 512
32# else
33# define PRIME_DIFF_TABLE_BYTES (PRIME_DIFF_TABLE_512_BYTE_PAGES * 512)
34# endif
35# endif
36#endif
37extern const BYTE primeDiffTable [PRIME_DIFF_TABLE_BYTES];
38//
39// This determines the number of bits in the sieve field This must be a power of two.
40//
41#define FIELD_POWER 14 // This is the only value in this group that should be
42 // changed
43#define FIELD_BITS (1 << FIELD_POWER)
44#define MAX_FIELD_SIZE ((FIELD_BITS / 8) + 1)
45//
46// This is the pre-sieved table. It already has the bits for multiples of 3, 5, and 7 cleared.
47//
48#define SEED_VALUES_SIZE 105
49const extern BYTE seedValues[SEED_VALUES_SIZE];
50//
51// This allows determination of the number of bits that are set in a byte without having to count them
52// individually.
53//
54const extern BYTE bitsInByte[256];
55//
56// This is the iterator structure for accessing the compressed prime number table. The expectation is that
57// values will need to be accesses sequentially. This tries to save some data access.
58//
59typedef struct {
60 UINT32 lastPrime;
61 UINT32 index;
62 UINT32 final;
63} PRIME_ITERATOR;
64#ifdef RSA_INSTRUMENT
65# define INSTRUMENT_SET(a, b) ((a) = (b))
66# define INSTRUMENT_ADD(a, b) (a) = (a) + (b)
67# define INSTRUMENT_INC(a) (a) = (a) + 1
68extern UINT32 failedAtIteration[10];
69extern UINT32 MillerRabinTrials;
70extern UINT32 totalFieldsSieved;
71extern UINT32 emptyFieldsSieved;
72extern UINT32 noPrimeFields;
73extern UINT32 primesChecked;
74extern UINT16 lastSievePrime;
75#else
76# define INSTRUMENT_SET(a, b)
77# define INSTRUMENT_ADD(a, b)
78# define INSTRUMENT_INC(a)
79#endif
80#ifdef RSA_DEBUG
81extern UINT16 defaultFieldSize;
82#define NUM_PRIMES 2047
83extern const __int16 primes[NUM_PRIMES];
84#else
85#define defaultFieldSize MAX_FIELD_SIZE
86#endif
87#endif