2020-02-23 14:08:57 +00:00
|
|
|
/*
|
|
|
|
* sshkeygen.h: routines used internally to key generation.
|
|
|
|
*/
|
|
|
|
|
2020-02-23 14:30:03 +00:00
|
|
|
/* ----------------------------------------------------------------------
|
2020-02-23 14:08:57 +00:00
|
|
|
* A table of all the primes that fit in a 16-bit integer. Call
|
|
|
|
* init_primes_array to make sure it's been initialised.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NSMALLPRIMES 6542 /* number of primes < 65536 */
|
|
|
|
extern const unsigned short *const smallprimes;
|
|
|
|
void init_smallprimes(void);
|
2020-02-23 14:30:03 +00:00
|
|
|
|
|
|
|
/* ----------------------------------------------------------------------
|
|
|
|
* A system for making up random candidate integers during prime
|
|
|
|
* generation. This unconditionally ensures that the numbers have the
|
|
|
|
* right number of bits and are not divisible by any prime in the
|
|
|
|
* smallprimes[] array above. It can also impose further constraints,
|
|
|
|
* as documented below.
|
|
|
|
*/
|
|
|
|
typedef struct PrimeCandidateSource PrimeCandidateSource;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* pcs_new: you say how many bits you want the prime to have (with the
|
|
|
|
* usual semantics that an n-bit number is in the range [2^{n-1},2^n))
|
|
|
|
* and also specify what you want its topmost 'nfirst' bits to be.
|
|
|
|
*
|
|
|
|
* (The 'first' system is used for RSA keys, where you need to arrange
|
|
|
|
* that the product of your two primes is in a more tightly
|
|
|
|
* constrained range than the factor of 4 you'd get by just generating
|
|
|
|
* two (n/2)-bit primes and multiplying them. Any application that
|
|
|
|
* doesn't need that can simply specify first = nfirst = 1.)
|
|
|
|
*/
|
|
|
|
PrimeCandidateSource *pcs_new(unsigned bits, unsigned first, unsigned nfirst);
|
|
|
|
|
|
|
|
/* Insist that generated numbers must be congruent to 'res' mod 'mod' */
|
|
|
|
void pcs_require_residue(PrimeCandidateSource *s, mp_int *mod, mp_int *res);
|
|
|
|
|
|
|
|
/* Convenience wrapper for the common case where res = 1 */
|
|
|
|
void pcs_require_residue_1(PrimeCandidateSource *s, mp_int *mod);
|
|
|
|
|
|
|
|
/* Insist that generated numbers must _not_ be congruent to 'res' mod
|
|
|
|
* 'mod'. This is used to avoid being 1 mod the RSA public exponent,
|
|
|
|
* which is small, so it only needs ordinary integer parameters. */
|
|
|
|
void pcs_avoid_residue_small(PrimeCandidateSource *s,
|
|
|
|
unsigned mod, unsigned res);
|
|
|
|
|
|
|
|
/* Prepare a PrimeCandidateSource to actually generate numbers. This
|
|
|
|
* function does last-minute computation that has to be delayed until
|
|
|
|
* all constraints have been input. */
|
|
|
|
void pcs_ready(PrimeCandidateSource *s);
|
|
|
|
|
|
|
|
/* Actually generate a candidate integer. You must free the result, of
|
|
|
|
* course. */
|
|
|
|
mp_int *pcs_generate(PrimeCandidateSource *s);
|
|
|
|
|
|
|
|
/* Free a PrimeCandidateSource. */
|
|
|
|
void pcs_free(PrimeCandidateSource *s);
|
|
|
|
|
|
|
|
/* Return some internal fields of the PCS. Used by testcrypt for
|
|
|
|
* unit-testing this system. */
|
|
|
|
void pcs_inspect(PrimeCandidateSource *pcs, mp_int **limit_out,
|
|
|
|
mp_int **factor_out, mp_int **addend_out);
|