| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /* ---- NUMBER THEORY ---- */
- #ifdef MPI
- #include "ltc_tommath.h"
- /* in/out macros */
- #define OUTPUT_BIGNUM(num, out, y, z) \
- { \
- if ((y + 4) > *outlen) { return CRYPT_BUFFER_OVERFLOW; } \
- z = (unsigned long)mp_unsigned_bin_size(num); \
- STORE32L(z, out+y); \
- y += 4; \
- if ((y + z) > *outlen) { return CRYPT_BUFFER_OVERFLOW; } \
- if ((err = mp_to_unsigned_bin(num, out+y)) != MP_OKAY) { return mpi_to_ltc_error(err); } \
- y += z; \
- }
- #define INPUT_BIGNUM(num, in, x, y, inlen) \
- { \
- /* load value */ \
- if ((y + 4) > inlen) { \
- err = CRYPT_INVALID_PACKET; \
- goto error; \
- } \
- LOAD32L(x, in+y); \
- y += 4; \
- \
- /* sanity check... */ \
- if ((x+y) > inlen) { \
- err = CRYPT_INVALID_PACKET; \
- goto error; \
- } \
- \
- /* load it */ \
- if ((err = mp_read_unsigned_bin(num, (unsigned char *)in+y, (int)x)) != MP_OKAY) {\
- err = mpi_to_ltc_error(err); \
- goto error; \
- } \
- y += x; \
- if ((err = mp_shrink(num)) != MP_OKAY) { \
- err = mpi_to_ltc_error(err); \
- goto error; \
- } \
- }
- int is_prime(mp_int *, int *);
- int rand_prime(mp_int *N, long len, prng_state *prng, int wprng);
- #else
- #ifdef MRSA
- #error RSA requires the big int library
- #endif
- #ifdef MECC
- #error ECC requires the big int library
- #endif
- #ifdef MDH
- #error DH requires the big int library
- #endif
- #ifdef MDSA
- #error DSA requires the big int library
- #endif
- #endif /* MPI */
- /* ---- PUBLIC KEY CRYPTO ---- */
- #define PK_PRIVATE 0 /* PK private keys */
- #define PK_PUBLIC 1 /* PK public keys */
- /* ---- PACKET ---- */
- #ifdef PACKET
- void packet_store_header(unsigned char *dst, int section, int subsection);
- int packet_valid_header(unsigned char *src, int section, int subsection);
- #endif
- /* ---- RSA ---- */
- #ifdef MRSA
- /* Min and Max RSA key sizes (in bits) */
- #define MIN_RSA_SIZE 1024
- #define MAX_RSA_SIZE 4096
- /* Stack required for temps (plus padding) */
- // #define RSA_STACK (8 + (MAX_RSA_SIZE/8))
- typedef struct Rsa_key {
- int type;
- mp_int e, d, N, p, q, qP, dP, dQ;
- } rsa_key;
- int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);
- int rsa_exptmod(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen, int which,
- prng_state *prng, int prng_idx,
- rsa_key *key);
- #ifdef RSA_TIMING
- int tim_exptmod(prng_state *prng, int prng_idx,
- mp_int *c, mp_int *e, mp_int *d, mp_int *n, mp_int *m);
- #else
- #define tim_exptmod(prng, prng_idx, c, e, d, n, m) mpi_to_ltc_error(mp_exptmod(c, d, n, m))
- #endif
- void rsa_free(rsa_key *key);
- /* These use PKCS #1 v2.0 padding */
- int rsa_encrypt_key(const unsigned char *inkey, unsigned long inlen,
- unsigned char *outkey, unsigned long *outlen,
- const unsigned char *lparam, unsigned long lparamlen,
- prng_state *prng, int prng_idx, int hash_idx, rsa_key *key);
-
- int rsa_decrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *outkey, unsigned long *keylen,
- const unsigned char *lparam, unsigned long lparamlen,
- prng_state *prng, int prng_idx,
- int hash_idx, int *res,
- rsa_key *key);
- int rsa_sign_hash(const unsigned char *msghash, unsigned long msghashlen,
- unsigned char *sig, unsigned long *siglen,
- prng_state *prng, int prng_idx,
- int hash_idx, unsigned long saltlen,
- rsa_key *key);
- int rsa_verify_hash(const unsigned char *sig, unsigned long siglen,
- const unsigned char *msghash, unsigned long msghashlen,
- prng_state *prng, int prng_idx,
- int hash_idx, unsigned long saltlen,
- int *stat, rsa_key *key);
- /* these use PKCS #1 v1.5 padding */
- int rsa_v15_encrypt_key(const unsigned char *inkey, unsigned long inlen,
- unsigned char *outkey, unsigned long *outlen,
- prng_state *prng, int prng_idx,
- rsa_key *key);
-
- int rsa_v15_decrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *outkey, unsigned long keylen,
- prng_state *prng, int prng_idx,
- int *res, rsa_key *key);
- int rsa_v15_sign_hash(const unsigned char *msghash, unsigned long msghashlen,
- unsigned char *sig, unsigned long *siglen,
- prng_state *prng, int prng_idx,
- int hash_idx, rsa_key *key);
- int rsa_v15_verify_hash(const unsigned char *sig, unsigned long siglen,
- const unsigned char *msghash, unsigned long msghashlen,
- prng_state *prng, int prng_idx,
- int hash_idx, int *stat,
- rsa_key *key);
- /* PKCS #1 import/export */
- int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key);
- int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key);
-
- #endif
- /* ---- DH Routines ---- */
- #ifdef MDH
- typedef struct Dh_key {
- int idx, type;
- mp_int x, y;
- } dh_key;
- int dh_test(void);
- void dh_sizes(int *low, int *high);
- int dh_get_size(dh_key *key);
- int dh_make_key(prng_state *prng, int wprng, int keysize, dh_key *key);
- void dh_free(dh_key *key);
- int dh_export(unsigned char *out, unsigned long *outlen, int type, dh_key *key);
- int dh_import(const unsigned char *in, unsigned long inlen, dh_key *key);
- int dh_shared_secret(dh_key *private_key, dh_key *public_key,
- unsigned char *out, unsigned long *outlen);
- int dh_encrypt_key(const unsigned char *inkey, unsigned long keylen,
- unsigned char *out, unsigned long *len,
- prng_state *prng, int wprng, int hash,
- dh_key *key);
- int dh_decrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *outkey, unsigned long *keylen,
- dh_key *key);
- int dh_sign_hash(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen,
- prng_state *prng, int wprng, dh_key *key);
- int dh_verify_hash(const unsigned char *sig, unsigned long siglen,
- const unsigned char *hash, unsigned long hashlen,
- int *stat, dh_key *key);
- #endif
- /* ---- ECC Routines ---- */
- #ifdef MECC
- typedef struct {
- mp_int x, y;
- } ecc_point;
- typedef struct {
- int type, idx;
- ecc_point pubkey;
- mp_int k;
- } ecc_key;
- int ecc_test(void);
- void ecc_sizes(int *low, int *high);
- int ecc_get_size(ecc_key *key);
- int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key);
- void ecc_free(ecc_key *key);
- int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
- int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
- int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key,
- unsigned char *out, unsigned long *outlen);
- int ecc_encrypt_key(const unsigned char *inkey, unsigned long keylen,
- unsigned char *out, unsigned long *len,
- prng_state *prng, int wprng, int hash,
- ecc_key *key);
- int ecc_decrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *outkey, unsigned long *keylen,
- ecc_key *key);
- int ecc_sign_hash(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen,
- prng_state *prng, int wprng, ecc_key *key);
- int ecc_verify_hash(const unsigned char *sig, unsigned long siglen,
- const unsigned char *hash, unsigned long hashlen,
- int *stat, ecc_key *key);
- #endif
- #ifdef MDSA
- typedef struct {
- int type, qord;
- mp_int g, q, p, x, y;
- } dsa_key;
- int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
- void dsa_free(dsa_key *key);
- int dsa_sign_hash(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen,
- prng_state *prng, int wprng, dsa_key *key);
- int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
- const unsigned char *hash, unsigned long inlen,
- int *stat, dsa_key *key);
- int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key);
- int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key);
- int dsa_verify_key(dsa_key *key, int *stat);
- #endif
- /* DER handling */
- int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen);
- int der_decode_integer(const unsigned char *in, unsigned long *inlen, mp_int *num);
- int der_length_integer(mp_int *num, unsigned long *len);
- int der_put_multi_integer(unsigned char *dst, unsigned long *outlen, mp_int *num, ...);
- int der_get_multi_integer(const unsigned char *src, unsigned long *inlen, mp_int *num, ...);
|