mirror of
https://github.com/wiire-a/pixiewps.git
synced 2025-07-27 15:54:29 +02:00
Removed unused tomcrypt headers
This commit is contained in:
parent
65dd9975da
commit
f8c295c5b5
@ -83,13 +83,13 @@ enum {
|
|||||||
#include <tomcrypt_macros.h>
|
#include <tomcrypt_macros.h>
|
||||||
#include <tomcrypt_cipher.h>
|
#include <tomcrypt_cipher.h>
|
||||||
#include <tomcrypt_hash.h>
|
#include <tomcrypt_hash.h>
|
||||||
#include <tomcrypt_mac.h>
|
/* #include <tomcrypt_mac.h> */
|
||||||
#include <tomcrypt_prng.h>
|
/* #include <tomcrypt_prng.h> */
|
||||||
#include <tomcrypt_pk.h>
|
/* #include <tomcrypt_pk.h> */
|
||||||
#include <tomcrypt_math.h>
|
/* #include <tomcrypt_math.h> */
|
||||||
#include <tomcrypt_misc.h>
|
/* #include <tomcrypt_misc.h> */
|
||||||
#include <tomcrypt_argchk.h>
|
#include <tomcrypt_argchk.h>
|
||||||
#include <tomcrypt_pkcs.h>
|
/* #include <tomcrypt_pkcs.h> */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,569 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LTC_HMAC
|
|
||||||
typedef struct Hmac_state {
|
|
||||||
hash_state md;
|
|
||||||
int hash;
|
|
||||||
hash_state hashstate;
|
|
||||||
unsigned char key[MAXBLOCKSIZE];
|
|
||||||
} hmac_state;
|
|
||||||
|
|
||||||
int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen);
|
|
||||||
int hmac_process(hmac_state *hmac, const unsigned char *in, unsigned long inlen);
|
|
||||||
int hmac_done(hmac_state *hmac, unsigned char *out, unsigned long *outlen);
|
|
||||||
int hmac_test(void);
|
|
||||||
int hmac_memory(int hash,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int hmac_memory_multi(int hash,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int hmac_file(int hash, const char *fname, const unsigned char *key,
|
|
||||||
unsigned long keylen,
|
|
||||||
unsigned char *dst, unsigned long *dstlen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_OMAC
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int cipher_idx,
|
|
||||||
buflen,
|
|
||||||
blklen;
|
|
||||||
unsigned char block[MAXBLOCKSIZE],
|
|
||||||
prev[MAXBLOCKSIZE],
|
|
||||||
Lu[2][MAXBLOCKSIZE];
|
|
||||||
symmetric_key key;
|
|
||||||
} omac_state;
|
|
||||||
|
|
||||||
int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen);
|
|
||||||
int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen);
|
|
||||||
int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen);
|
|
||||||
int omac_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int omac_memory_multi(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int omac_file(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const char *filename,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int omac_test(void);
|
|
||||||
#endif /* LTC_OMAC */
|
|
||||||
|
|
||||||
#ifdef LTC_PMAC
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */
|
|
||||||
Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */
|
|
||||||
Lr[MAXBLOCKSIZE], /* L * x^-1 */
|
|
||||||
block[MAXBLOCKSIZE], /* currently accumulated block */
|
|
||||||
checksum[MAXBLOCKSIZE]; /* current checksum */
|
|
||||||
|
|
||||||
symmetric_key key; /* scheduled key for cipher */
|
|
||||||
unsigned long block_index; /* index # for current block */
|
|
||||||
int cipher_idx, /* cipher idx */
|
|
||||||
block_len, /* length of block */
|
|
||||||
buflen; /* number of bytes in the buffer */
|
|
||||||
} pmac_state;
|
|
||||||
|
|
||||||
int pmac_init(pmac_state *pmac, int cipher, const unsigned char *key, unsigned long keylen);
|
|
||||||
int pmac_process(pmac_state *pmac, const unsigned char *in, unsigned long inlen);
|
|
||||||
int pmac_done(pmac_state *pmac, unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pmac_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *msg, unsigned long msglen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pmac_memory_multi(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
|
|
||||||
int pmac_file(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const char *filename,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pmac_test(void);
|
|
||||||
|
|
||||||
/* internal functions */
|
|
||||||
int pmac_ntz(unsigned long x);
|
|
||||||
void pmac_shift_xor(pmac_state *pmac);
|
|
||||||
|
|
||||||
#endif /* PMAC */
|
|
||||||
|
|
||||||
#ifdef LTC_POLY1305
|
|
||||||
typedef struct {
|
|
||||||
ulong32 r[5];
|
|
||||||
ulong32 h[5];
|
|
||||||
ulong32 pad[4];
|
|
||||||
unsigned long leftover;
|
|
||||||
unsigned char buffer[16];
|
|
||||||
int final;
|
|
||||||
} poly1305_state;
|
|
||||||
|
|
||||||
int poly1305_init(poly1305_state *st, const unsigned char *key, unsigned long keylen);
|
|
||||||
int poly1305_process(poly1305_state *st, const unsigned char *in, unsigned long inlen);
|
|
||||||
int poly1305_done(poly1305_state *st, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int poly1305_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int poly1305_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int poly1305_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int poly1305_test(void);
|
|
||||||
#endif /* LTC_POLY1305 */
|
|
||||||
|
|
||||||
#ifdef LTC_BLAKE2SMAC
|
|
||||||
typedef hash_state blake2smac_state;
|
|
||||||
int blake2smac_init(blake2smac_state *st, unsigned long outlen, const unsigned char *key, unsigned long keylen);
|
|
||||||
int blake2smac_process(blake2smac_state *st, const unsigned char *in, unsigned long inlen);
|
|
||||||
int blake2smac_done(blake2smac_state *st, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2smac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2smac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int blake2smac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2smac_test(void);
|
|
||||||
#endif /* LTC_BLAKE2SMAC */
|
|
||||||
|
|
||||||
#ifdef LTC_BLAKE2BMAC
|
|
||||||
typedef hash_state blake2bmac_state;
|
|
||||||
int blake2bmac_init(blake2bmac_state *st, unsigned long outlen, const unsigned char *key, unsigned long keylen);
|
|
||||||
int blake2bmac_process(blake2bmac_state *st, const unsigned char *in, unsigned long inlen);
|
|
||||||
int blake2bmac_done(blake2bmac_state *st, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2bmac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2bmac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int blake2bmac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);
|
|
||||||
int blake2bmac_test(void);
|
|
||||||
#endif /* LTC_BLAKE2BMAC */
|
|
||||||
|
|
||||||
#ifdef LTC_PELICAN
|
|
||||||
|
|
||||||
typedef struct pelican_state
|
|
||||||
{
|
|
||||||
symmetric_key K;
|
|
||||||
unsigned char state[16];
|
|
||||||
int buflen;
|
|
||||||
} pelican_state;
|
|
||||||
|
|
||||||
int pelican_init(pelican_state *pelmac, const unsigned char *key, unsigned long keylen);
|
|
||||||
int pelican_process(pelican_state *pelmac, const unsigned char *in, unsigned long inlen);
|
|
||||||
int pelican_done(pelican_state *pelmac, unsigned char *out);
|
|
||||||
int pelican_test(void);
|
|
||||||
|
|
||||||
int pelican_memory(const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_XCBC
|
|
||||||
|
|
||||||
/* add this to "keylen" to xcbc_init to use a pure three-key XCBC MAC */
|
|
||||||
#define LTC_XCBC_PURE 0x8000UL
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char K[3][MAXBLOCKSIZE],
|
|
||||||
IV[MAXBLOCKSIZE];
|
|
||||||
|
|
||||||
symmetric_key key;
|
|
||||||
|
|
||||||
int cipher,
|
|
||||||
buflen,
|
|
||||||
blocksize;
|
|
||||||
} xcbc_state;
|
|
||||||
|
|
||||||
int xcbc_init(xcbc_state *xcbc, int cipher, const unsigned char *key, unsigned long keylen);
|
|
||||||
int xcbc_process(xcbc_state *xcbc, const unsigned char *in, unsigned long inlen);
|
|
||||||
int xcbc_done(xcbc_state *xcbc, unsigned char *out, unsigned long *outlen);
|
|
||||||
int xcbc_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int xcbc_memory_multi(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int xcbc_file(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const char *filename,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int xcbc_test(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_F9_MODE
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char akey[MAXBLOCKSIZE],
|
|
||||||
ACC[MAXBLOCKSIZE],
|
|
||||||
IV[MAXBLOCKSIZE];
|
|
||||||
|
|
||||||
symmetric_key key;
|
|
||||||
|
|
||||||
int cipher,
|
|
||||||
buflen,
|
|
||||||
keylen,
|
|
||||||
blocksize;
|
|
||||||
} f9_state;
|
|
||||||
|
|
||||||
int f9_init(f9_state *f9, int cipher, const unsigned char *key, unsigned long keylen);
|
|
||||||
int f9_process(f9_state *f9, const unsigned char *in, unsigned long inlen);
|
|
||||||
int f9_done(f9_state *f9, unsigned char *out, unsigned long *outlen);
|
|
||||||
int f9_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int f9_memory_multi(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
int f9_file(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const char *filename,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int f9_test(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ENC+AUTH modes
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LTC_EAX_MODE
|
|
||||||
|
|
||||||
#if !(defined(LTC_OMAC) && defined(LTC_CTR_MODE))
|
|
||||||
#error LTC_EAX_MODE requires LTC_OMAC and CTR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char N[MAXBLOCKSIZE];
|
|
||||||
symmetric_CTR ctr;
|
|
||||||
omac_state headeromac, ctomac;
|
|
||||||
} eax_state;
|
|
||||||
|
|
||||||
int eax_init(eax_state *eax, int cipher, const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *header, unsigned long headerlen);
|
|
||||||
|
|
||||||
int eax_encrypt(eax_state *eax, const unsigned char *pt, unsigned char *ct, unsigned long length);
|
|
||||||
int eax_decrypt(eax_state *eax, const unsigned char *ct, unsigned char *pt, unsigned long length);
|
|
||||||
int eax_addheader(eax_state *eax, const unsigned char *header, unsigned long length);
|
|
||||||
int eax_done(eax_state *eax, unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int eax_encrypt_authenticate_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *header, unsigned long headerlen,
|
|
||||||
const unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int eax_decrypt_verify_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *header, unsigned long headerlen,
|
|
||||||
const unsigned char *ct, unsigned long ctlen,
|
|
||||||
unsigned char *pt,
|
|
||||||
unsigned char *tag, unsigned long taglen,
|
|
||||||
int *stat);
|
|
||||||
|
|
||||||
int eax_test(void);
|
|
||||||
#endif /* EAX MODE */
|
|
||||||
|
|
||||||
#ifdef LTC_OCB_MODE
|
|
||||||
typedef struct {
|
|
||||||
unsigned char L[MAXBLOCKSIZE], /* L value */
|
|
||||||
Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */
|
|
||||||
Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */
|
|
||||||
Lr[MAXBLOCKSIZE], /* L * x^-1 */
|
|
||||||
R[MAXBLOCKSIZE], /* R value */
|
|
||||||
checksum[MAXBLOCKSIZE]; /* current checksum */
|
|
||||||
|
|
||||||
symmetric_key key; /* scheduled key for cipher */
|
|
||||||
unsigned long block_index; /* index # for current block */
|
|
||||||
int cipher, /* cipher idx */
|
|
||||||
block_len; /* length of block */
|
|
||||||
} ocb_state;
|
|
||||||
|
|
||||||
int ocb_init(ocb_state *ocb, int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen, const unsigned char *nonce);
|
|
||||||
|
|
||||||
int ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct);
|
|
||||||
int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt);
|
|
||||||
|
|
||||||
int ocb_done_encrypt(ocb_state *ocb,
|
|
||||||
const unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int ocb_done_decrypt(ocb_state *ocb,
|
|
||||||
const unsigned char *ct, unsigned long ctlen,
|
|
||||||
unsigned char *pt,
|
|
||||||
const unsigned char *tag, unsigned long taglen, int *stat);
|
|
||||||
|
|
||||||
int ocb_encrypt_authenticate_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce,
|
|
||||||
const unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int ocb_decrypt_verify_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce,
|
|
||||||
const unsigned char *ct, unsigned long ctlen,
|
|
||||||
unsigned char *pt,
|
|
||||||
const unsigned char *tag, unsigned long taglen,
|
|
||||||
int *stat);
|
|
||||||
|
|
||||||
int ocb_test(void);
|
|
||||||
|
|
||||||
/* internal functions */
|
|
||||||
void ocb_shift_xor(ocb_state *ocb, unsigned char *Z);
|
|
||||||
int ocb_ntz(unsigned long x);
|
|
||||||
int s_ocb_done(ocb_state *ocb, const unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct, unsigned char *tag, unsigned long *taglen, int mode);
|
|
||||||
|
|
||||||
#endif /* LTC_OCB_MODE */
|
|
||||||
|
|
||||||
#ifdef LTC_OCB3_MODE
|
|
||||||
typedef struct {
|
|
||||||
unsigned char Offset_0[MAXBLOCKSIZE], /* Offset_0 value */
|
|
||||||
Offset_current[MAXBLOCKSIZE], /* Offset_{current_block_index} value */
|
|
||||||
L_dollar[MAXBLOCKSIZE], /* L_$ value */
|
|
||||||
L_star[MAXBLOCKSIZE], /* L_* value */
|
|
||||||
L_[32][MAXBLOCKSIZE], /* L_{i} values */
|
|
||||||
tag_part[MAXBLOCKSIZE], /* intermediate result of tag calculation */
|
|
||||||
checksum[MAXBLOCKSIZE]; /* current checksum */
|
|
||||||
|
|
||||||
/* AAD related members */
|
|
||||||
unsigned char aSum_current[MAXBLOCKSIZE], /* AAD related helper variable */
|
|
||||||
aOffset_current[MAXBLOCKSIZE], /* AAD related helper variable */
|
|
||||||
adata_buffer[MAXBLOCKSIZE]; /* AAD buffer */
|
|
||||||
int adata_buffer_bytes; /* bytes in AAD buffer */
|
|
||||||
unsigned long ablock_index; /* index # for current adata (AAD) block */
|
|
||||||
|
|
||||||
symmetric_key key; /* scheduled key for cipher */
|
|
||||||
unsigned long block_index; /* index # for current data block */
|
|
||||||
int cipher, /* cipher idx */
|
|
||||||
tag_len, /* length of tag */
|
|
||||||
block_len; /* length of block */
|
|
||||||
} ocb3_state;
|
|
||||||
|
|
||||||
int ocb3_init(ocb3_state *ocb, int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
unsigned long taglen);
|
|
||||||
|
|
||||||
int ocb3_encrypt(ocb3_state *ocb, const unsigned char *pt, unsigned long ptlen, unsigned char *ct);
|
|
||||||
int ocb3_decrypt(ocb3_state *ocb, const unsigned char *ct, unsigned long ctlen, unsigned char *pt);
|
|
||||||
int ocb3_encrypt_last(ocb3_state *ocb, const unsigned char *pt, unsigned long ptlen, unsigned char *ct);
|
|
||||||
int ocb3_decrypt_last(ocb3_state *ocb, const unsigned char *ct, unsigned long ctlen, unsigned char *pt);
|
|
||||||
int ocb3_add_aad(ocb3_state *ocb, const unsigned char *aad, unsigned long aadlen);
|
|
||||||
int ocb3_done(ocb3_state *ocb, unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int ocb3_encrypt_authenticate_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *adata, unsigned long adatalen,
|
|
||||||
const unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int ocb3_decrypt_verify_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *adata, unsigned long adatalen,
|
|
||||||
const unsigned char *ct, unsigned long ctlen,
|
|
||||||
unsigned char *pt,
|
|
||||||
const unsigned char *tag, unsigned long taglen,
|
|
||||||
int *stat);
|
|
||||||
|
|
||||||
int ocb3_test(void);
|
|
||||||
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int ocb3_int_ntz(unsigned long x);
|
|
||||||
void ocb3_int_xor_blocks(unsigned char *out, const unsigned char *block_a, const unsigned char *block_b, unsigned long block_len);
|
|
||||||
#endif /* LTC_SOURCE */
|
|
||||||
|
|
||||||
#endif /* LTC_OCB3_MODE */
|
|
||||||
|
|
||||||
#ifdef LTC_CCM_MODE
|
|
||||||
|
|
||||||
#define CCM_ENCRYPT LTC_ENCRYPT
|
|
||||||
#define CCM_DECRYPT LTC_DECRYPT
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
symmetric_key K;
|
|
||||||
int cipher, /* which cipher */
|
|
||||||
taglen, /* length of the tag */
|
|
||||||
x; /* index in PAD */
|
|
||||||
|
|
||||||
unsigned long L, /* L value */
|
|
||||||
ptlen, /* length that will be enc / dec */
|
|
||||||
current_ptlen, /* current processed length */
|
|
||||||
aadlen, /* length of the aad */
|
|
||||||
current_aadlen, /* length of the currently provided add */
|
|
||||||
noncelen; /* length of the nonce */
|
|
||||||
|
|
||||||
unsigned char PAD[16],
|
|
||||||
ctr[16],
|
|
||||||
CTRPAD[16],
|
|
||||||
CTRlen;
|
|
||||||
} ccm_state;
|
|
||||||
|
|
||||||
int ccm_init(ccm_state *ccm, int cipher,
|
|
||||||
const unsigned char *key, int keylen, int ptlen, int taglen, int aad_len);
|
|
||||||
|
|
||||||
int ccm_reset(ccm_state *ccm);
|
|
||||||
|
|
||||||
int ccm_add_nonce(ccm_state *ccm,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen);
|
|
||||||
|
|
||||||
int ccm_add_aad(ccm_state *ccm,
|
|
||||||
const unsigned char *adata, unsigned long adatalen);
|
|
||||||
|
|
||||||
int ccm_process(ccm_state *ccm,
|
|
||||||
unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
int direction);
|
|
||||||
|
|
||||||
int ccm_done(ccm_state *ccm,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int ccm_memory(int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
symmetric_key *uskey,
|
|
||||||
const unsigned char *nonce, unsigned long noncelen,
|
|
||||||
const unsigned char *header, unsigned long headerlen,
|
|
||||||
unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen,
|
|
||||||
int direction);
|
|
||||||
|
|
||||||
int ccm_test(void);
|
|
||||||
|
|
||||||
#endif /* LTC_CCM_MODE */
|
|
||||||
|
|
||||||
#if defined(LRW_MODE) || defined(LTC_GCM_MODE)
|
|
||||||
void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* table shared between GCM and LRW */
|
|
||||||
#if defined(LTC_GCM_TABLES) || defined(LTC_LRW_TABLES) || ((defined(LTC_GCM_MODE) || defined(LTC_GCM_MODE)) && defined(LTC_FAST))
|
|
||||||
extern const unsigned char gcm_shift_table[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_GCM_MODE
|
|
||||||
|
|
||||||
#define GCM_ENCRYPT LTC_ENCRYPT
|
|
||||||
#define GCM_DECRYPT LTC_DECRYPT
|
|
||||||
|
|
||||||
#define LTC_GCM_MODE_IV 0
|
|
||||||
#define LTC_GCM_MODE_AAD 1
|
|
||||||
#define LTC_GCM_MODE_TEXT 2
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
symmetric_key K;
|
|
||||||
unsigned char H[16], /* multiplier */
|
|
||||||
X[16], /* accumulator */
|
|
||||||
Y[16], /* counter */
|
|
||||||
Y_0[16], /* initial counter */
|
|
||||||
buf[16]; /* buffer for stuff */
|
|
||||||
|
|
||||||
int cipher, /* which cipher */
|
|
||||||
ivmode, /* Which mode is the IV in? */
|
|
||||||
mode, /* mode the GCM code is in */
|
|
||||||
buflen; /* length of data in buf */
|
|
||||||
|
|
||||||
ulong64 totlen, /* 64-bit counter used for IV and AAD */
|
|
||||||
pttotlen; /* 64-bit counter for the PT */
|
|
||||||
|
|
||||||
#ifdef LTC_GCM_TABLES
|
|
||||||
unsigned char PC[16][256][16] /* 16 tables of 8x128 */
|
|
||||||
#ifdef LTC_GCM_TABLES_SSE2
|
|
||||||
__attribute__ ((aligned (16)))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
} gcm_state;
|
|
||||||
|
|
||||||
void gcm_mult_h(gcm_state *gcm, unsigned char *I);
|
|
||||||
|
|
||||||
int gcm_init(gcm_state *gcm, int cipher,
|
|
||||||
const unsigned char *key, int keylen);
|
|
||||||
|
|
||||||
int gcm_reset(gcm_state *gcm);
|
|
||||||
|
|
||||||
int gcm_add_iv(gcm_state *gcm,
|
|
||||||
const unsigned char *IV, unsigned long IVlen);
|
|
||||||
|
|
||||||
int gcm_add_aad(gcm_state *gcm,
|
|
||||||
const unsigned char *adata, unsigned long adatalen);
|
|
||||||
|
|
||||||
int gcm_process(gcm_state *gcm,
|
|
||||||
unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
int direction);
|
|
||||||
|
|
||||||
int gcm_done(gcm_state *gcm,
|
|
||||||
unsigned char *tag, unsigned long *taglen);
|
|
||||||
|
|
||||||
int gcm_memory( int cipher,
|
|
||||||
const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *IV, unsigned long IVlen,
|
|
||||||
const unsigned char *adata, unsigned long adatalen,
|
|
||||||
unsigned char *pt, unsigned long ptlen,
|
|
||||||
unsigned char *ct,
|
|
||||||
unsigned char *tag, unsigned long *taglen,
|
|
||||||
int direction);
|
|
||||||
int gcm_test(void);
|
|
||||||
|
|
||||||
#endif /* LTC_GCM_MODE */
|
|
||||||
|
|
||||||
#ifdef LTC_CHACHA20POLY1305_MODE
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
poly1305_state poly;
|
|
||||||
chacha_state chacha;
|
|
||||||
ulong64 aadlen;
|
|
||||||
ulong64 ctlen;
|
|
||||||
int aadflg;
|
|
||||||
} chacha20poly1305_state;
|
|
||||||
|
|
||||||
#define CHACHA20POLY1305_ENCRYPT LTC_ENCRYPT
|
|
||||||
#define CHACHA20POLY1305_DECRYPT LTC_DECRYPT
|
|
||||||
|
|
||||||
int chacha20poly1305_init(chacha20poly1305_state *st, const unsigned char *key, unsigned long keylen);
|
|
||||||
int chacha20poly1305_setiv(chacha20poly1305_state *st, const unsigned char *iv, unsigned long ivlen);
|
|
||||||
int chacha20poly1305_setiv_rfc7905(chacha20poly1305_state *st, const unsigned char *iv, unsigned long ivlen, ulong64 sequence_number);
|
|
||||||
int chacha20poly1305_add_aad(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen);
|
|
||||||
int chacha20poly1305_encrypt(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
|
|
||||||
int chacha20poly1305_decrypt(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
|
|
||||||
int chacha20poly1305_done(chacha20poly1305_state *st, unsigned char *tag, unsigned long *taglen);
|
|
||||||
int chacha20poly1305_memory(const unsigned char *key, unsigned long keylen,
|
|
||||||
const unsigned char *iv, unsigned long ivlen,
|
|
||||||
const unsigned char *aad, unsigned long aadlen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out,
|
|
||||||
unsigned char *tag, unsigned long *taglen,
|
|
||||||
int direction);
|
|
||||||
int chacha20poly1305_test(void);
|
|
||||||
|
|
||||||
#endif /* LTC_CHACHA20POLY1305_MODE */
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
@ -1,583 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** math functions **/
|
|
||||||
|
|
||||||
#define LTC_MP_LT -1
|
|
||||||
#define LTC_MP_EQ 0
|
|
||||||
#define LTC_MP_GT 1
|
|
||||||
|
|
||||||
#define LTC_MP_NO 0
|
|
||||||
#define LTC_MP_YES 1
|
|
||||||
|
|
||||||
#ifndef LTC_MECC
|
|
||||||
typedef void ecc_point;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LTC_MRSA
|
|
||||||
typedef void rsa_key;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LTC_MILLER_RABIN_REPS
|
|
||||||
/* Number of rounds of the Miller-Rabin test
|
|
||||||
* "Reasonable values of reps are between 15 and 50." c.f. gmp doc of mpz_probab_prime_p()
|
|
||||||
* As of https://security.stackexchange.com/a/4546 we should use 40 rounds */
|
|
||||||
#define LTC_MILLER_RABIN_REPS 40
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int radix_to_bin(const void *in, int radix, void *out, unsigned long *len);
|
|
||||||
|
|
||||||
/** math descriptor */
|
|
||||||
typedef struct {
|
|
||||||
/** Name of the math provider */
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
/** Bits per digit, amount of bits must fit in an unsigned long */
|
|
||||||
int bits_per_digit;
|
|
||||||
|
|
||||||
/* ---- init/deinit functions ---- */
|
|
||||||
|
|
||||||
/** initialize a bignum
|
|
||||||
@param a The number to initialize
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*init)(void **a);
|
|
||||||
|
|
||||||
/** init copy
|
|
||||||
@param dst The number to initialize and write to
|
|
||||||
@param src The number to copy from
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*init_copy)(void **dst, void *src);
|
|
||||||
|
|
||||||
/** deinit
|
|
||||||
@param a The number to free
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
void (*deinit)(void *a);
|
|
||||||
|
|
||||||
/* ---- data movement ---- */
|
|
||||||
|
|
||||||
/** negate
|
|
||||||
@param src The number to negate
|
|
||||||
@param dst The destination
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*neg)(void *src, void *dst);
|
|
||||||
|
|
||||||
/** copy
|
|
||||||
@param src The number to copy from
|
|
||||||
@param dst The number to write to
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*copy)(void *src, void *dst);
|
|
||||||
|
|
||||||
/* ---- trivial low level functions ---- */
|
|
||||||
|
|
||||||
/** set small constant
|
|
||||||
@param a Number to write to
|
|
||||||
@param n Source upto bits_per_digit (actually meant for very small constants)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*set_int)(void *a, ltc_mp_digit n);
|
|
||||||
|
|
||||||
/** get small constant
|
|
||||||
@param a Small number to read,
|
|
||||||
only fetches up to bits_per_digit from the number
|
|
||||||
@return The lower bits_per_digit of the integer (unsigned)
|
|
||||||
*/
|
|
||||||
unsigned long (*get_int)(void *a);
|
|
||||||
|
|
||||||
/** get digit n
|
|
||||||
@param a The number to read from
|
|
||||||
@param n The number of the digit to fetch
|
|
||||||
@return The bits_per_digit sized n'th digit of a
|
|
||||||
*/
|
|
||||||
ltc_mp_digit (*get_digit)(void *a, int n);
|
|
||||||
|
|
||||||
/** Get the number of digits that represent the number
|
|
||||||
@param a The number to count
|
|
||||||
@return The number of digits used to represent the number
|
|
||||||
*/
|
|
||||||
int (*get_digit_count)(void *a);
|
|
||||||
|
|
||||||
/** compare two integers
|
|
||||||
@param a The left side integer
|
|
||||||
@param b The right side integer
|
|
||||||
@return LTC_MP_LT if a < b,
|
|
||||||
LTC_MP_GT if a > b and
|
|
||||||
LTC_MP_EQ otherwise. (signed comparison)
|
|
||||||
*/
|
|
||||||
int (*compare)(void *a, void *b);
|
|
||||||
|
|
||||||
/** compare against int
|
|
||||||
@param a The left side integer
|
|
||||||
@param b The right side integer (upto bits_per_digit)
|
|
||||||
@return LTC_MP_LT if a < b,
|
|
||||||
LTC_MP_GT if a > b and
|
|
||||||
LTC_MP_EQ otherwise. (signed comparison)
|
|
||||||
*/
|
|
||||||
int (*compare_d)(void *a, ltc_mp_digit n);
|
|
||||||
|
|
||||||
/** Count the number of bits used to represent the integer
|
|
||||||
@param a The integer to count
|
|
||||||
@return The number of bits required to represent the integer
|
|
||||||
*/
|
|
||||||
int (*count_bits)(void * a);
|
|
||||||
|
|
||||||
/** Count the number of LSB bits which are zero
|
|
||||||
@param a The integer to count
|
|
||||||
@return The number of contiguous zero LSB bits
|
|
||||||
*/
|
|
||||||
int (*count_lsb_bits)(void *a);
|
|
||||||
|
|
||||||
/** Compute a power of two
|
|
||||||
@param a The integer to store the power in
|
|
||||||
@param n The power of two you want to store (a = 2^n)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*twoexpt)(void *a , int n);
|
|
||||||
|
|
||||||
/* ---- radix conversions ---- */
|
|
||||||
|
|
||||||
/** read ascii string
|
|
||||||
@param a The integer to store into
|
|
||||||
@param str The string to read
|
|
||||||
@param radix The radix the integer has been represented in (2-64)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*read_radix)(void *a, const char *str, int radix);
|
|
||||||
|
|
||||||
/** write number to string
|
|
||||||
@param a The integer to store
|
|
||||||
@param str The destination for the string
|
|
||||||
@param radix The radix the integer is to be represented in (2-64)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*write_radix)(void *a, char *str, int radix);
|
|
||||||
|
|
||||||
/** get size as unsigned char string
|
|
||||||
@param a The integer to get the size (when stored in array of octets)
|
|
||||||
@return The length of the integer in octets
|
|
||||||
*/
|
|
||||||
unsigned long (*unsigned_size)(void *a);
|
|
||||||
|
|
||||||
/** store an integer as an array of octets
|
|
||||||
@param src The integer to store
|
|
||||||
@param dst The buffer to store the integer in
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*unsigned_write)(void *src, unsigned char *dst);
|
|
||||||
|
|
||||||
/** read an array of octets and store as integer
|
|
||||||
@param dst The integer to load
|
|
||||||
@param src The array of octets
|
|
||||||
@param len The number of octets
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*unsigned_read)( void *dst,
|
|
||||||
unsigned char *src,
|
|
||||||
unsigned long len);
|
|
||||||
|
|
||||||
/* ---- basic math ---- */
|
|
||||||
|
|
||||||
/** add two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
@param c The destination of "a + b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*add)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** add two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
(single digit of upto bits_per_digit in length)
|
|
||||||
@param c The destination of "a + b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*addi)(void *a, ltc_mp_digit b, void *c);
|
|
||||||
|
|
||||||
/** subtract two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
@param c The destination of "a - b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*sub)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** subtract two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
(single digit of upto bits_per_digit in length)
|
|
||||||
@param c The destination of "a - b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*subi)(void *a, ltc_mp_digit b, void *c);
|
|
||||||
|
|
||||||
/** multiply two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
(single digit of upto bits_per_digit in length)
|
|
||||||
@param c The destination of "a * b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*mul)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** multiply two integers
|
|
||||||
@param a The first source integer
|
|
||||||
@param b The second source integer
|
|
||||||
(single digit of upto bits_per_digit in length)
|
|
||||||
@param c The destination of "a * b"
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*muli)(void *a, ltc_mp_digit b, void *c);
|
|
||||||
|
|
||||||
/** Square an integer
|
|
||||||
@param a The integer to square
|
|
||||||
@param b The destination
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*sqr)(void *a, void *b);
|
|
||||||
|
|
||||||
/** Divide an integer
|
|
||||||
@param a The dividend
|
|
||||||
@param b The divisor
|
|
||||||
@param c The quotient (can be NULL to signify don't care)
|
|
||||||
@param d The remainder (can be NULL to signify don't care)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*mpdiv)(void *a, void *b, void *c, void *d);
|
|
||||||
|
|
||||||
/** divide by two
|
|
||||||
@param a The integer to divide (shift right)
|
|
||||||
@param b The destination
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*div_2)(void *a, void *b);
|
|
||||||
|
|
||||||
/** Get remainder (small value)
|
|
||||||
@param a The integer to reduce
|
|
||||||
@param b The modulus (upto bits_per_digit in length)
|
|
||||||
@param c The destination for the residue
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*modi)(void *a, ltc_mp_digit b, ltc_mp_digit *c);
|
|
||||||
|
|
||||||
/** gcd
|
|
||||||
@param a The first integer
|
|
||||||
@param b The second integer
|
|
||||||
@param c The destination for (a, b)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*gcd)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** lcm
|
|
||||||
@param a The first integer
|
|
||||||
@param b The second integer
|
|
||||||
@param c The destination for [a, b]
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*lcm)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** Modular multiplication
|
|
||||||
@param a The first source
|
|
||||||
@param b The second source
|
|
||||||
@param c The modulus
|
|
||||||
@param d The destination (a*b mod c)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*mulmod)(void *a, void *b, void *c, void *d);
|
|
||||||
|
|
||||||
/** Modular squaring
|
|
||||||
@param a The first source
|
|
||||||
@param b The modulus
|
|
||||||
@param c The destination (a*a mod b)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*sqrmod)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** Modular inversion
|
|
||||||
@param a The value to invert
|
|
||||||
@param b The modulus
|
|
||||||
@param c The destination (1/a mod b)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*invmod)(void *, void *, void *);
|
|
||||||
|
|
||||||
/* ---- reduction ---- */
|
|
||||||
|
|
||||||
/** setup Montgomery
|
|
||||||
@param a The modulus
|
|
||||||
@param b The destination for the reduction digit
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*montgomery_setup)(void *a, void **b);
|
|
||||||
|
|
||||||
/** get normalization value
|
|
||||||
@param a The destination for the normalization value
|
|
||||||
@param b The modulus
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*montgomery_normalization)(void *a, void *b);
|
|
||||||
|
|
||||||
/** reduce a number
|
|
||||||
@param a The number [and dest] to reduce
|
|
||||||
@param b The modulus
|
|
||||||
@param c The value "b" from montgomery_setup()
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*montgomery_reduce)(void *a, void *b, void *c);
|
|
||||||
|
|
||||||
/** clean up (frees memory)
|
|
||||||
@param a The value "b" from montgomery_setup()
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
void (*montgomery_deinit)(void *a);
|
|
||||||
|
|
||||||
/* ---- exponentiation ---- */
|
|
||||||
|
|
||||||
/** Modular exponentiation
|
|
||||||
@param a The base integer
|
|
||||||
@param b The power (can be negative) integer
|
|
||||||
@param c The modulus integer
|
|
||||||
@param d The destination
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*exptmod)(void *a, void *b, void *c, void *d);
|
|
||||||
|
|
||||||
/** Primality testing
|
|
||||||
@param a The integer to test
|
|
||||||
@param b The number of Miller-Rabin tests that shall be executed
|
|
||||||
@param c The destination of the result (FP_YES if prime)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*isprime)(void *a, int b, int *c);
|
|
||||||
|
|
||||||
/* ---- (optional) ecc point math ---- */
|
|
||||||
|
|
||||||
/** ECC GF(p) point multiplication (from the NIST curves)
|
|
||||||
@param k The integer to multiply the point by
|
|
||||||
@param G The point to multiply
|
|
||||||
@param R The destination for kG
|
|
||||||
@param modulus The modulus for the field
|
|
||||||
@param map Boolean indicated whether to map back to affine or not
|
|
||||||
(can be ignored if you work in affine only)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*ecc_ptmul)( void *k,
|
|
||||||
ecc_point *G,
|
|
||||||
ecc_point *R,
|
|
||||||
void *modulus,
|
|
||||||
int map);
|
|
||||||
|
|
||||||
/** ECC GF(p) point addition
|
|
||||||
@param P The first point
|
|
||||||
@param Q The second point
|
|
||||||
@param R The destination of P + Q
|
|
||||||
@param modulus The modulus
|
|
||||||
@param mp The "b" value from montgomery_setup()
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*ecc_ptadd)(ecc_point *P,
|
|
||||||
ecc_point *Q,
|
|
||||||
ecc_point *R,
|
|
||||||
void *modulus,
|
|
||||||
void *mp);
|
|
||||||
|
|
||||||
/** ECC GF(p) point double
|
|
||||||
@param P The first point
|
|
||||||
@param R The destination of 2P
|
|
||||||
@param modulus The modulus
|
|
||||||
@param mp The "b" value from montgomery_setup()
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*ecc_ptdbl)(ecc_point *P,
|
|
||||||
ecc_point *R,
|
|
||||||
void *modulus,
|
|
||||||
void *mp);
|
|
||||||
|
|
||||||
/** ECC mapping from projective to affine,
|
|
||||||
currently uses (x,y,z) => (x/z^2, y/z^3, 1)
|
|
||||||
@param P The point to map
|
|
||||||
@param modulus The modulus
|
|
||||||
@param mp The "b" value from montgomery_setup()
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
@remark The mapping can be different but keep in mind a
|
|
||||||
ecc_point only has three integers (x,y,z) so if
|
|
||||||
you use a different mapping you have to make it fit.
|
|
||||||
*/
|
|
||||||
int (*ecc_map)(ecc_point *P, void *modulus, void *mp);
|
|
||||||
|
|
||||||
/** Computes kA*A + kB*B = C using Shamir's Trick
|
|
||||||
@param A First point to multiply
|
|
||||||
@param kA What to multiple A by
|
|
||||||
@param B Second point to multiply
|
|
||||||
@param kB What to multiple B by
|
|
||||||
@param C [out] Destination point (can overlap with A or B)
|
|
||||||
@param modulus Modulus for curve
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*ecc_mul2add)(ecc_point *A, void *kA,
|
|
||||||
ecc_point *B, void *kB,
|
|
||||||
ecc_point *C,
|
|
||||||
void *modulus);
|
|
||||||
|
|
||||||
/* ---- (optional) rsa optimized math (for internal CRT) ---- */
|
|
||||||
|
|
||||||
/** RSA Key Generation
|
|
||||||
@param prng An active PRNG state
|
|
||||||
@param wprng The index of the PRNG desired
|
|
||||||
@param size The size of the key in octets
|
|
||||||
@param e The "e" value (public key).
|
|
||||||
e==65537 is a good choice
|
|
||||||
@param key [out] Destination of a newly created private key pair
|
|
||||||
@return CRYPT_OK if successful, upon error all allocated ram is freed
|
|
||||||
*/
|
|
||||||
int (*rsa_keygen)(prng_state *prng,
|
|
||||||
int wprng,
|
|
||||||
int size,
|
|
||||||
long e,
|
|
||||||
rsa_key *key);
|
|
||||||
|
|
||||||
/** RSA exponentiation
|
|
||||||
@param in The octet array representing the base
|
|
||||||
@param inlen The length of the input
|
|
||||||
@param out The destination (to be stored in an octet array format)
|
|
||||||
@param outlen The length of the output buffer and the resulting size
|
|
||||||
(zero padded to the size of the modulus)
|
|
||||||
@param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA
|
|
||||||
@param key The RSA key to use
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*rsa_me)(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen, int which,
|
|
||||||
rsa_key *key);
|
|
||||||
|
|
||||||
/* ---- basic math continued ---- */
|
|
||||||
|
|
||||||
/** Modular addition
|
|
||||||
@param a The first source
|
|
||||||
@param b The second source
|
|
||||||
@param c The modulus
|
|
||||||
@param d The destination (a + b mod c)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*addmod)(void *a, void *b, void *c, void *d);
|
|
||||||
|
|
||||||
/** Modular substraction
|
|
||||||
@param a The first source
|
|
||||||
@param b The second source
|
|
||||||
@param c The modulus
|
|
||||||
@param d The destination (a - b mod c)
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*submod)(void *a, void *b, void *c, void *d);
|
|
||||||
|
|
||||||
/* ---- misc stuff ---- */
|
|
||||||
|
|
||||||
/** Make a pseudo-random mpi
|
|
||||||
@param a The mpi to make random
|
|
||||||
@param size The desired length
|
|
||||||
@return CRYPT_OK on success
|
|
||||||
*/
|
|
||||||
int (*rand)(void *a, int size);
|
|
||||||
} ltc_math_descriptor;
|
|
||||||
|
|
||||||
extern ltc_math_descriptor ltc_mp;
|
|
||||||
|
|
||||||
int ltc_init_multi(void **a, ...);
|
|
||||||
void ltc_deinit_multi(void *a, ...);
|
|
||||||
void ltc_cleanup_multi(void **a, ...);
|
|
||||||
|
|
||||||
#ifdef LTM_DESC
|
|
||||||
extern const ltc_math_descriptor ltm_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TFM_DESC
|
|
||||||
extern const ltc_math_descriptor tfm_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GMP_DESC
|
|
||||||
extern const ltc_math_descriptor gmp_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(DESC_DEF_ONLY) && defined(LTC_SOURCE)
|
|
||||||
|
|
||||||
#define MP_DIGIT_BIT ltc_mp.bits_per_digit
|
|
||||||
|
|
||||||
/* some handy macros */
|
|
||||||
#define mp_init(a) ltc_mp.init(a)
|
|
||||||
#define mp_init_multi ltc_init_multi
|
|
||||||
#define mp_clear(a) ltc_mp.deinit(a)
|
|
||||||
#define mp_clear_multi ltc_deinit_multi
|
|
||||||
#define mp_cleanup_multi ltc_cleanup_multi
|
|
||||||
#define mp_init_copy(a, b) ltc_mp.init_copy(a, b)
|
|
||||||
|
|
||||||
#define mp_neg(a, b) ltc_mp.neg(a, b)
|
|
||||||
#define mp_copy(a, b) ltc_mp.copy(a, b)
|
|
||||||
|
|
||||||
#define mp_set(a, b) ltc_mp.set_int(a, b)
|
|
||||||
#define mp_set_int(a, b) ltc_mp.set_int(a, b)
|
|
||||||
#define mp_get_int(a) ltc_mp.get_int(a)
|
|
||||||
#define mp_get_digit(a, n) ltc_mp.get_digit(a, n)
|
|
||||||
#define mp_get_digit_count(a) ltc_mp.get_digit_count(a)
|
|
||||||
#define mp_cmp(a, b) ltc_mp.compare(a, b)
|
|
||||||
#define mp_cmp_d(a, b) ltc_mp.compare_d(a, b)
|
|
||||||
#define mp_count_bits(a) ltc_mp.count_bits(a)
|
|
||||||
#define mp_cnt_lsb(a) ltc_mp.count_lsb_bits(a)
|
|
||||||
#define mp_2expt(a, b) ltc_mp.twoexpt(a, b)
|
|
||||||
|
|
||||||
#define mp_read_radix(a, b, c) ltc_mp.read_radix(a, b, c)
|
|
||||||
#define mp_toradix(a, b, c) ltc_mp.write_radix(a, b, c)
|
|
||||||
#define mp_unsigned_bin_size(a) ltc_mp.unsigned_size(a)
|
|
||||||
#define mp_to_unsigned_bin(a, b) ltc_mp.unsigned_write(a, b)
|
|
||||||
#define mp_read_unsigned_bin(a, b, c) ltc_mp.unsigned_read(a, b, c)
|
|
||||||
|
|
||||||
#define mp_add(a, b, c) ltc_mp.add(a, b, c)
|
|
||||||
#define mp_add_d(a, b, c) ltc_mp.addi(a, b, c)
|
|
||||||
#define mp_sub(a, b, c) ltc_mp.sub(a, b, c)
|
|
||||||
#define mp_sub_d(a, b, c) ltc_mp.subi(a, b, c)
|
|
||||||
#define mp_mul(a, b, c) ltc_mp.mul(a, b, c)
|
|
||||||
#define mp_mul_d(a, b, c) ltc_mp.muli(a, b, c)
|
|
||||||
#define mp_sqr(a, b) ltc_mp.sqr(a, b)
|
|
||||||
#define mp_div(a, b, c, d) ltc_mp.mpdiv(a, b, c, d)
|
|
||||||
#define mp_div_2(a, b) ltc_mp.div_2(a, b)
|
|
||||||
#define mp_mod(a, b, c) ltc_mp.mpdiv(a, b, NULL, c)
|
|
||||||
#define mp_mod_d(a, b, c) ltc_mp.modi(a, b, c)
|
|
||||||
#define mp_gcd(a, b, c) ltc_mp.gcd(a, b, c)
|
|
||||||
#define mp_lcm(a, b, c) ltc_mp.lcm(a, b, c)
|
|
||||||
|
|
||||||
#define mp_addmod(a, b, c, d) ltc_mp.addmod(a, b, c, d)
|
|
||||||
#define mp_submod(a, b, c, d) ltc_mp.submod(a, b, c, d)
|
|
||||||
#define mp_mulmod(a, b, c, d) ltc_mp.mulmod(a, b, c, d)
|
|
||||||
#define mp_sqrmod(a, b, c) ltc_mp.sqrmod(a, b, c)
|
|
||||||
#define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c)
|
|
||||||
|
|
||||||
#define mp_montgomery_setup(a, b) ltc_mp.montgomery_setup(a, b)
|
|
||||||
#define mp_montgomery_normalization(a, b) ltc_mp.montgomery_normalization(a, b)
|
|
||||||
#define mp_montgomery_reduce(a, b, c) ltc_mp.montgomery_reduce(a, b, c)
|
|
||||||
#define mp_montgomery_free(a) ltc_mp.montgomery_deinit(a)
|
|
||||||
|
|
||||||
#define mp_exptmod(a,b,c,d) ltc_mp.exptmod(a,b,c,d)
|
|
||||||
#define mp_prime_is_prime(a, b, c) ltc_mp.isprime(a, b, c)
|
|
||||||
|
|
||||||
#define mp_iszero(a) (mp_cmp_d(a, 0) == LTC_MP_EQ ? LTC_MP_YES : LTC_MP_NO)
|
|
||||||
#define mp_isodd(a) (mp_get_digit_count(a) > 0 ? (mp_get_digit(a, 0) & 1 ? LTC_MP_YES : LTC_MP_NO) : LTC_MP_NO)
|
|
||||||
#define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0)
|
|
||||||
|
|
||||||
#define mp_tohex(a, b) mp_toradix(a, b, 16)
|
|
||||||
|
|
||||||
#define mp_rand(a, b) ltc_mp.rand(a, b)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
@ -1,133 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ---- LTC_BASE64 Routines ---- */
|
|
||||||
#ifdef LTC_BASE64
|
|
||||||
int base64_encode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int base64_decode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int base64_strict_decode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_BASE64_URL
|
|
||||||
int base64url_encode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int base64url_strict_encode(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int base64url_decode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int base64url_strict_decode(const unsigned char *in, unsigned long len,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ---- BASE32 Routines ---- */
|
|
||||||
#ifdef LTC_BASE32
|
|
||||||
typedef enum {
|
|
||||||
BASE32_RFC4648 = 0,
|
|
||||||
BASE32_BASE32HEX = 1,
|
|
||||||
BASE32_ZBASE32 = 2,
|
|
||||||
BASE32_CROCKFORD = 3
|
|
||||||
} base32_alphabet;
|
|
||||||
int base32_encode(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
base32_alphabet id);
|
|
||||||
int base32_decode(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
base32_alphabet id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===> LTC_HKDF -- RFC5869 HMAC-based Key Derivation Function <=== */
|
|
||||||
#ifdef LTC_HKDF
|
|
||||||
|
|
||||||
int hkdf_test(void);
|
|
||||||
|
|
||||||
int hkdf_extract(int hash_idx,
|
|
||||||
const unsigned char *salt, unsigned long saltlen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int hkdf_expand(int hash_idx,
|
|
||||||
const unsigned char *info, unsigned long infolen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long outlen);
|
|
||||||
|
|
||||||
int hkdf(int hash_idx,
|
|
||||||
const unsigned char *salt, unsigned long saltlen,
|
|
||||||
const unsigned char *info, unsigned long infolen,
|
|
||||||
const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long outlen);
|
|
||||||
|
|
||||||
#endif /* LTC_HKDF */
|
|
||||||
|
|
||||||
/* ---- MEM routines ---- */
|
|
||||||
int mem_neq(const void *a, const void *b, size_t len);
|
|
||||||
void zeromem(volatile void *dst, size_t len);
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
void copy_or_zeromem(const unsigned char* src, unsigned char* dest, unsigned long len, int coz);
|
|
||||||
#endif
|
|
||||||
void burn_stack(unsigned long len);
|
|
||||||
|
|
||||||
const char *error_to_string(int err);
|
|
||||||
|
|
||||||
extern const char *crypt_build_settings;
|
|
||||||
|
|
||||||
/* ---- HMM ---- */
|
|
||||||
int crypt_fsa(void *mp, ...);
|
|
||||||
|
|
||||||
/* ---- Dynamic language support ---- */
|
|
||||||
int crypt_get_constant(const char* namein, int *valueout);
|
|
||||||
int crypt_list_all_constants(char *names_list, unsigned int *names_list_size);
|
|
||||||
|
|
||||||
int crypt_get_size(const char* namein, unsigned int *sizeout);
|
|
||||||
int crypt_list_all_sizes(char *names_list, unsigned int *names_list_size);
|
|
||||||
|
|
||||||
#ifdef LTM_DESC
|
|
||||||
LTC_DEPRECATED void init_LTM(void);
|
|
||||||
#endif
|
|
||||||
#ifdef TFM_DESC
|
|
||||||
LTC_DEPRECATED void init_TFM(void);
|
|
||||||
#endif
|
|
||||||
#ifdef GMP_DESC
|
|
||||||
LTC_DEPRECATED void init_GMP(void);
|
|
||||||
#endif
|
|
||||||
int crypt_mp_init(const char* mpi);
|
|
||||||
|
|
||||||
#ifdef LTC_ADLER32
|
|
||||||
typedef struct adler32_state_s
|
|
||||||
{
|
|
||||||
unsigned short s[2];
|
|
||||||
} adler32_state;
|
|
||||||
|
|
||||||
void adler32_init(adler32_state *ctx);
|
|
||||||
void adler32_update(adler32_state *ctx, const unsigned char *input, unsigned long length);
|
|
||||||
void adler32_finish(adler32_state *ctx, void *hash, unsigned long size);
|
|
||||||
int adler32_test(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_CRC32
|
|
||||||
typedef struct crc32_state_s
|
|
||||||
{
|
|
||||||
ulong32 crc;
|
|
||||||
} crc32_state;
|
|
||||||
|
|
||||||
void crc32_init(crc32_state *ctx);
|
|
||||||
void crc32_update(crc32_state *ctx, const unsigned char *input, unsigned long length);
|
|
||||||
void crc32_finish(crc32_state *ctx, void *hash, unsigned long size);
|
|
||||||
int crc32_test(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which);
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
@ -1,747 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ---- NUMBER THEORY ---- */
|
|
||||||
|
|
||||||
enum {
|
|
||||||
PK_PUBLIC=0,
|
|
||||||
PK_PRIVATE=1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Indicates standard output formats that can be read e.g. by OpenSSL or GnuTLS */
|
|
||||||
#define PK_STD 0x1000
|
|
||||||
|
|
||||||
int rand_prime(void *N, long len, prng_state *prng, int wprng);
|
|
||||||
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng);
|
|
||||||
int rand_bn_upto(void *N, void *limit, prng_state *prng, int wprng);
|
|
||||||
|
|
||||||
enum public_key_algorithms {
|
|
||||||
PKA_RSA,
|
|
||||||
PKA_DSA
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct Oid {
|
|
||||||
unsigned long OID[16];
|
|
||||||
/** Length of DER encoding */
|
|
||||||
unsigned long OIDlen;
|
|
||||||
} oid_st;
|
|
||||||
|
|
||||||
int pk_get_oid(int pk, oid_st *st);
|
|
||||||
#endif /* LTC_SOURCE */
|
|
||||||
|
|
||||||
/* ---- RSA ---- */
|
|
||||||
#ifdef LTC_MRSA
|
|
||||||
|
|
||||||
/** RSA PKCS style key */
|
|
||||||
typedef struct Rsa_key {
|
|
||||||
/** Type of key, PK_PRIVATE or PK_PUBLIC */
|
|
||||||
int type;
|
|
||||||
/** The public exponent */
|
|
||||||
void *e;
|
|
||||||
/** The private exponent */
|
|
||||||
void *d;
|
|
||||||
/** The modulus */
|
|
||||||
void *N;
|
|
||||||
/** The p factor of N */
|
|
||||||
void *p;
|
|
||||||
/** The q factor of N */
|
|
||||||
void *q;
|
|
||||||
/** The 1/q mod p CRT param */
|
|
||||||
void *qP;
|
|
||||||
/** The d mod (p - 1) CRT param */
|
|
||||||
void *dP;
|
|
||||||
/** The d mod (q - 1) CRT param */
|
|
||||||
void *dQ;
|
|
||||||
} rsa_key;
|
|
||||||
|
|
||||||
int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_get_size(rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_exptmod(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen, int which,
|
|
||||||
rsa_key *key);
|
|
||||||
|
|
||||||
void rsa_free(rsa_key *key);
|
|
||||||
|
|
||||||
/* These use PKCS #1 v2.0 padding */
|
|
||||||
#define rsa_encrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, _key) \
|
|
||||||
rsa_encrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, LTC_PKCS_1_OAEP, _key)
|
|
||||||
|
|
||||||
#define rsa_decrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, _stat, _key) \
|
|
||||||
rsa_decrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, LTC_PKCS_1_OAEP, _stat, _key)
|
|
||||||
|
|
||||||
#define rsa_sign_hash(_in, _inlen, _out, _outlen, _prng, _prng_idx, _hash_idx, _saltlen, _key) \
|
|
||||||
rsa_sign_hash_ex(_in, _inlen, _out, _outlen, LTC_PKCS_1_PSS, _prng, _prng_idx, _hash_idx, _saltlen, _key)
|
|
||||||
|
|
||||||
#define rsa_verify_hash(_sig, _siglen, _hash, _hashlen, _hash_idx, _saltlen, _stat, _key) \
|
|
||||||
rsa_verify_hash_ex(_sig, _siglen, _hash, _hashlen, LTC_PKCS_1_PSS, _hash_idx, _saltlen, _stat, _key)
|
|
||||||
|
|
||||||
#define rsa_sign_saltlen_get_max(_hash_idx, _key) \
|
|
||||||
rsa_sign_saltlen_get_max_ex(LTC_PKCS_1_PSS, _hash_idx, _key)
|
|
||||||
|
|
||||||
/* These can be switched between PKCS #1 v2.x and PKCS #1 v1.5 paddings */
|
|
||||||
int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
prng_state *prng, int prng_idx, int hash_idx, int padding, rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
int hash_idx, int padding,
|
|
||||||
int *stat, rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
int padding,
|
|
||||||
prng_state *prng, int prng_idx,
|
|
||||||
int hash_idx, unsigned long saltlen,
|
|
||||||
rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_verify_hash_ex(const unsigned char *sig, unsigned long siglen,
|
|
||||||
const unsigned char *hash, unsigned long hashlen,
|
|
||||||
int padding,
|
|
||||||
int hash_idx, unsigned long saltlen,
|
|
||||||
int *stat, rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_sign_saltlen_get_max_ex(int padding, int hash_idx, 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);
|
|
||||||
|
|
||||||
int rsa_import_x509(const unsigned char *in, unsigned long inlen, rsa_key *key);
|
|
||||||
int rsa_import_pkcs8(const unsigned char *in, unsigned long inlen,
|
|
||||||
const void *passwd, unsigned long passwdlen, rsa_key *key);
|
|
||||||
|
|
||||||
int rsa_set_key(const unsigned char *N, unsigned long Nlen,
|
|
||||||
const unsigned char *e, unsigned long elen,
|
|
||||||
const unsigned char *d, unsigned long dlen,
|
|
||||||
rsa_key *key);
|
|
||||||
int rsa_set_factors(const unsigned char *p, unsigned long plen,
|
|
||||||
const unsigned char *q, unsigned long qlen,
|
|
||||||
rsa_key *key);
|
|
||||||
int rsa_set_crt_params(const unsigned char *dP, unsigned long dPlen,
|
|
||||||
const unsigned char *dQ, unsigned long dQlen,
|
|
||||||
const unsigned char *qP, unsigned long qPlen,
|
|
||||||
rsa_key *key);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ---- Katja ---- */
|
|
||||||
#ifdef LTC_MKAT
|
|
||||||
|
|
||||||
/* Min and Max KAT key sizes (in bits) */
|
|
||||||
#define MIN_KAT_SIZE 1024
|
|
||||||
#define MAX_KAT_SIZE 4096
|
|
||||||
|
|
||||||
/** Katja PKCS style key */
|
|
||||||
typedef struct KAT_key {
|
|
||||||
/** Type of key, PK_PRIVATE or PK_PUBLIC */
|
|
||||||
int type;
|
|
||||||
/** The private exponent */
|
|
||||||
void *d;
|
|
||||||
/** The modulus */
|
|
||||||
void *N;
|
|
||||||
/** The p factor of N */
|
|
||||||
void *p;
|
|
||||||
/** The q factor of N */
|
|
||||||
void *q;
|
|
||||||
/** The 1/q mod p CRT param */
|
|
||||||
void *qP;
|
|
||||||
/** The d mod (p - 1) CRT param */
|
|
||||||
void *dP;
|
|
||||||
/** The d mod (q - 1) CRT param */
|
|
||||||
void *dQ;
|
|
||||||
/** The pq param */
|
|
||||||
void *pq;
|
|
||||||
} katja_key;
|
|
||||||
|
|
||||||
int katja_make_key(prng_state *prng, int wprng, int size, katja_key *key);
|
|
||||||
|
|
||||||
int katja_exptmod(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen, int which,
|
|
||||||
katja_key *key);
|
|
||||||
|
|
||||||
void katja_free(katja_key *key);
|
|
||||||
|
|
||||||
/* These use PKCS #1 v2.0 padding */
|
|
||||||
int katja_encrypt_key(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
prng_state *prng, int prng_idx, int hash_idx, katja_key *key);
|
|
||||||
|
|
||||||
int katja_decrypt_key(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
int hash_idx, int *stat,
|
|
||||||
katja_key *key);
|
|
||||||
|
|
||||||
/* PKCS #1 import/export */
|
|
||||||
int katja_export(unsigned char *out, unsigned long *outlen, int type, katja_key *key);
|
|
||||||
int katja_import(const unsigned char *in, unsigned long inlen, katja_key *key);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ---- DH Routines ---- */
|
|
||||||
#ifdef LTC_MDH
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int type;
|
|
||||||
void *x;
|
|
||||||
void *y;
|
|
||||||
void *base;
|
|
||||||
void *prime;
|
|
||||||
} dh_key;
|
|
||||||
|
|
||||||
int dh_get_groupsize(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_set_pg(const unsigned char *p, unsigned long plen,
|
|
||||||
const unsigned char *g, unsigned long glen,
|
|
||||||
dh_key *key);
|
|
||||||
int dh_set_pg_dhparam(const unsigned char *dhparam, unsigned long dhparamlen, dh_key *key);
|
|
||||||
int dh_set_pg_groupsize(int groupsize, dh_key *key);
|
|
||||||
|
|
||||||
int dh_set_key(const unsigned char *in, unsigned long inlen, int type, dh_key *key);
|
|
||||||
int dh_generate_key(prng_state *prng, int wprng, dh_key *key);
|
|
||||||
|
|
||||||
int dh_shared_secret(dh_key *private_key, dh_key *public_key,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
void dh_free(dh_key *key);
|
|
||||||
|
|
||||||
int dh_export_key(void *out, unsigned long *outlen, int type, dh_key *key);
|
|
||||||
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
typedef struct {
|
|
||||||
int size;
|
|
||||||
const char *name, *base, *prime;
|
|
||||||
} ltc_dh_set_type;
|
|
||||||
|
|
||||||
extern const ltc_dh_set_type ltc_dh_sets[];
|
|
||||||
|
|
||||||
/* internal helper functions */
|
|
||||||
int dh_check_pubkey(dh_key *key);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* LTC_MDH */
|
|
||||||
|
|
||||||
|
|
||||||
/* ---- ECC Routines ---- */
|
|
||||||
#ifdef LTC_MECC
|
|
||||||
|
|
||||||
/* size of our temp buffers for exported keys */
|
|
||||||
#define ECC_BUF_SIZE 256
|
|
||||||
|
|
||||||
/* max private key size */
|
|
||||||
#define ECC_MAXSIZE 66
|
|
||||||
|
|
||||||
/** Structure defines a NIST GF(p) curve */
|
|
||||||
typedef struct {
|
|
||||||
/** The size of the curve in octets */
|
|
||||||
int size;
|
|
||||||
|
|
||||||
/** name of curve */
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
/** The prime that defines the field the curve is in (encoded in hex) */
|
|
||||||
const char *prime;
|
|
||||||
|
|
||||||
/** The fields B param (hex) */
|
|
||||||
const char *B;
|
|
||||||
|
|
||||||
/** The order of the curve (hex) */
|
|
||||||
const char *order;
|
|
||||||
|
|
||||||
/** The x co-ordinate of the base point on the curve (hex) */
|
|
||||||
const char *Gx;
|
|
||||||
|
|
||||||
/** The y co-ordinate of the base point on the curve (hex) */
|
|
||||||
const char *Gy;
|
|
||||||
} ltc_ecc_set_type;
|
|
||||||
|
|
||||||
/** A point on a ECC curve, stored in Jacbobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpretted as affine */
|
|
||||||
typedef struct {
|
|
||||||
/** The x co-ordinate */
|
|
||||||
void *x;
|
|
||||||
|
|
||||||
/** The y co-ordinate */
|
|
||||||
void *y;
|
|
||||||
|
|
||||||
/** The z co-ordinate */
|
|
||||||
void *z;
|
|
||||||
} ecc_point;
|
|
||||||
|
|
||||||
/** An ECC key */
|
|
||||||
typedef struct {
|
|
||||||
/** Type of key, PK_PRIVATE or PK_PUBLIC */
|
|
||||||
int type;
|
|
||||||
|
|
||||||
/** Index into the ltc_ecc_sets[] for the parameters of this curve; if -1, then this key is using user supplied curve in dp */
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
/** pointer to domain parameters; either points to NIST curves (identified by idx >= 0) or user supplied curve */
|
|
||||||
const ltc_ecc_set_type *dp;
|
|
||||||
|
|
||||||
/** The public key */
|
|
||||||
ecc_point pubkey;
|
|
||||||
|
|
||||||
/** The private key */
|
|
||||||
void *k;
|
|
||||||
} ecc_key;
|
|
||||||
|
|
||||||
/** the ECC params provided */
|
|
||||||
extern const ltc_ecc_set_type ltc_ecc_sets[];
|
|
||||||
|
|
||||||
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);
|
|
||||||
int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp);
|
|
||||||
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_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp);
|
|
||||||
|
|
||||||
int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen);
|
|
||||||
int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
|
|
||||||
int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp);
|
|
||||||
|
|
||||||
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 *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
prng_state *prng, int wprng, int hash,
|
|
||||||
ecc_key *key);
|
|
||||||
|
|
||||||
int ecc_decrypt_key(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
ecc_key *key);
|
|
||||||
|
|
||||||
int ecc_sign_hash_rfc7518(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
prng_state *prng, int wprng, 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_rfc7518(const unsigned char *sig, unsigned long siglen,
|
|
||||||
const unsigned char *hash, unsigned long hashlen,
|
|
||||||
int *stat, 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);
|
|
||||||
|
|
||||||
/* low level functions */
|
|
||||||
ecc_point *ltc_ecc_new_point(void);
|
|
||||||
void ltc_ecc_del_point(ecc_point *p);
|
|
||||||
int ltc_ecc_is_valid_idx(int n);
|
|
||||||
|
|
||||||
/* point ops (mp == montgomery digit) */
|
|
||||||
#if !defined(LTC_MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC)
|
|
||||||
/* R = 2P */
|
|
||||||
int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp);
|
|
||||||
|
|
||||||
/* R = P + Q */
|
|
||||||
int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(LTC_MECC_FP)
|
|
||||||
/* optimized point multiplication using fixed point cache (HAC algorithm 14.117) */
|
|
||||||
int ltc_ecc_fp_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map);
|
|
||||||
|
|
||||||
/* functions for saving/loading/freeing/adding to fixed point cache */
|
|
||||||
int ltc_ecc_fp_save_state(unsigned char **out, unsigned long *outlen);
|
|
||||||
int ltc_ecc_fp_restore_state(unsigned char *in, unsigned long inlen);
|
|
||||||
void ltc_ecc_fp_free(void);
|
|
||||||
int ltc_ecc_fp_add_point(ecc_point *g, void *modulus, int lock);
|
|
||||||
|
|
||||||
/* lock/unlock all points currently in fixed point cache */
|
|
||||||
void ltc_ecc_fp_tablelock(int lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* R = kG */
|
|
||||||
int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map);
|
|
||||||
|
|
||||||
#ifdef LTC_ECC_SHAMIR
|
|
||||||
/* kA*A + kB*B = C */
|
|
||||||
int ltc_ecc_mul2add(ecc_point *A, void *kA,
|
|
||||||
ecc_point *B, void *kB,
|
|
||||||
ecc_point *C,
|
|
||||||
void *modulus);
|
|
||||||
|
|
||||||
#ifdef LTC_MECC_FP
|
|
||||||
/* Shamir's trick with optimized point multiplication using fixed point cache */
|
|
||||||
int ltc_ecc_fp_mul2add(ecc_point *A, void *kA,
|
|
||||||
ecc_point *B, void *kB,
|
|
||||||
ecc_point *C, void *modulus);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* map P to affine from projective */
|
|
||||||
int ltc_ecc_map(ecc_point *P, void *modulus, void *mp);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_MDSA
|
|
||||||
|
|
||||||
/* Max diff between group and modulus size in bytes */
|
|
||||||
#define LTC_MDSA_DELTA 512
|
|
||||||
|
|
||||||
/* Max DSA group size in bytes (default allows 4k-bit groups) */
|
|
||||||
#define LTC_MDSA_MAX_GROUP 512
|
|
||||||
|
|
||||||
/** DSA key structure */
|
|
||||||
typedef struct {
|
|
||||||
/** The key type, PK_PRIVATE or PK_PUBLIC */
|
|
||||||
int type;
|
|
||||||
|
|
||||||
/** The order of the sub-group used in octets */
|
|
||||||
int qord;
|
|
||||||
|
|
||||||
/** The generator */
|
|
||||||
void *g;
|
|
||||||
|
|
||||||
/** The prime used to generate the sub-group */
|
|
||||||
void *q;
|
|
||||||
|
|
||||||
/** The large prime that generats the field the contains the sub-group */
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
/** The private key */
|
|
||||||
void *x;
|
|
||||||
|
|
||||||
/** The public key */
|
|
||||||
void *y;
|
|
||||||
} dsa_key;
|
|
||||||
|
|
||||||
int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_set_pqg(const unsigned char *p, unsigned long plen,
|
|
||||||
const unsigned char *q, unsigned long qlen,
|
|
||||||
const unsigned char *g, unsigned long glen,
|
|
||||||
dsa_key *key);
|
|
||||||
int dsa_set_pqg_dsaparam(const unsigned char *dsaparam, unsigned long dsaparamlen, dsa_key *key);
|
|
||||||
int dsa_generate_pqg(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_set_key(const unsigned char *in, unsigned long inlen, int type, dsa_key *key);
|
|
||||||
int dsa_generate_key(prng_state *prng, int wprng, dsa_key *key);
|
|
||||||
|
|
||||||
void dsa_free(dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen,
|
|
||||||
void *r, void *s,
|
|
||||||
prng_state *prng, int wprng, 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_raw( void *r, void *s,
|
|
||||||
const unsigned char *hash, unsigned long hashlen,
|
|
||||||
int *stat, dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
|
|
||||||
const unsigned char *hash, unsigned long hashlen,
|
|
||||||
int *stat, dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_encrypt_key(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
prng_state *prng, int wprng, int hash,
|
|
||||||
dsa_key *key);
|
|
||||||
|
|
||||||
int dsa_decrypt_key(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
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);
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int dsa_int_validate_xy(dsa_key *key, int *stat);
|
|
||||||
int dsa_int_validate_pqg(dsa_key *key, int *stat);
|
|
||||||
int dsa_int_validate_primes(dsa_key *key, int *stat);
|
|
||||||
#endif
|
|
||||||
int dsa_shared_secret(void *private_key, void *base,
|
|
||||||
dsa_key *public_key,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_DER
|
|
||||||
/* DER handling */
|
|
||||||
|
|
||||||
typedef enum ltc_asn1_type_ {
|
|
||||||
/* 0 */
|
|
||||||
LTC_ASN1_EOL,
|
|
||||||
LTC_ASN1_BOOLEAN,
|
|
||||||
LTC_ASN1_INTEGER,
|
|
||||||
LTC_ASN1_SHORT_INTEGER,
|
|
||||||
LTC_ASN1_BIT_STRING,
|
|
||||||
/* 5 */
|
|
||||||
LTC_ASN1_OCTET_STRING,
|
|
||||||
LTC_ASN1_NULL,
|
|
||||||
LTC_ASN1_OBJECT_IDENTIFIER,
|
|
||||||
LTC_ASN1_IA5_STRING,
|
|
||||||
LTC_ASN1_PRINTABLE_STRING,
|
|
||||||
/* 10 */
|
|
||||||
LTC_ASN1_UTF8_STRING,
|
|
||||||
LTC_ASN1_UTCTIME,
|
|
||||||
LTC_ASN1_CHOICE,
|
|
||||||
LTC_ASN1_SEQUENCE,
|
|
||||||
LTC_ASN1_SET,
|
|
||||||
/* 15 */
|
|
||||||
LTC_ASN1_SETOF,
|
|
||||||
LTC_ASN1_RAW_BIT_STRING,
|
|
||||||
LTC_ASN1_TELETEX_STRING,
|
|
||||||
LTC_ASN1_CONSTRUCTED,
|
|
||||||
LTC_ASN1_CONTEXT_SPECIFIC,
|
|
||||||
/* 20 */
|
|
||||||
LTC_ASN1_GENERALIZEDTIME,
|
|
||||||
} ltc_asn1_type;
|
|
||||||
|
|
||||||
/** A LTC ASN.1 list type */
|
|
||||||
typedef struct ltc_asn1_list_ {
|
|
||||||
/** The LTC ASN.1 enumerated type identifier */
|
|
||||||
ltc_asn1_type type;
|
|
||||||
/** The data to encode or place for decoding */
|
|
||||||
void *data;
|
|
||||||
/** The size of the input or resulting output */
|
|
||||||
unsigned long size;
|
|
||||||
/** The used flag, this is used by the CHOICE ASN.1 type to indicate which choice was made */
|
|
||||||
int used;
|
|
||||||
/** prev/next entry in the list */
|
|
||||||
struct ltc_asn1_list_ *prev, *next, *child, *parent;
|
|
||||||
} ltc_asn1_list;
|
|
||||||
|
|
||||||
#define LTC_SET_ASN1(list, index, Type, Data, Size) \
|
|
||||||
do { \
|
|
||||||
int LTC_MACRO_temp = (index); \
|
|
||||||
ltc_asn1_list *LTC_MACRO_list = (list); \
|
|
||||||
LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \
|
|
||||||
LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \
|
|
||||||
LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \
|
|
||||||
LTC_MACRO_list[LTC_MACRO_temp].used = 0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* SEQUENCE */
|
|
||||||
int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen, int type_of);
|
|
||||||
|
|
||||||
#define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE)
|
|
||||||
|
|
||||||
int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen,
|
|
||||||
ltc_asn1_list *list, unsigned long outlen, int ordered);
|
|
||||||
|
|
||||||
#define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 1)
|
|
||||||
|
|
||||||
int der_length_sequence(ltc_asn1_list *list, unsigned long inlen,
|
|
||||||
unsigned long *outlen);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
|
|
||||||
unsigned long *outlen, unsigned long *payloadlen);
|
|
||||||
/* SUBJECT PUBLIC KEY INFO */
|
|
||||||
int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,
|
|
||||||
unsigned int algorithm, void* public_key, unsigned long public_key_len,
|
|
||||||
unsigned long parameters_type, void* parameters, unsigned long parameters_len);
|
|
||||||
|
|
||||||
int der_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned int algorithm, void* public_key, unsigned long* public_key_len,
|
|
||||||
unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len);
|
|
||||||
#endif /* LTC_SOURCE */
|
|
||||||
|
|
||||||
/* SET */
|
|
||||||
#define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 0)
|
|
||||||
#define der_length_set der_length_sequence
|
|
||||||
int der_encode_set(ltc_asn1_list *list, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_encode_setof(ltc_asn1_list *list, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* VA list handy helpers with triplets of <type, size, data> */
|
|
||||||
int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...);
|
|
||||||
int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...);
|
|
||||||
|
|
||||||
/* FLEXI DECODER handle unknown list decoder */
|
|
||||||
int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out);
|
|
||||||
#define der_free_sequence_flexi der_sequence_free
|
|
||||||
void der_sequence_free(ltc_asn1_list *in);
|
|
||||||
void der_sequence_shrink(ltc_asn1_list *in);
|
|
||||||
|
|
||||||
/* BOOLEAN */
|
|
||||||
int der_length_boolean(unsigned long *outlen);
|
|
||||||
int der_encode_boolean(int in,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_boolean(const unsigned char *in, unsigned long inlen,
|
|
||||||
int *out);
|
|
||||||
/* INTEGER */
|
|
||||||
int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num);
|
|
||||||
int der_length_integer(void *num, unsigned long *len);
|
|
||||||
|
|
||||||
/* INTEGER -- handy for 0..2^32-1 values */
|
|
||||||
int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num);
|
|
||||||
int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_short_integer(unsigned long num, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* BIT STRING */
|
|
||||||
int der_encode_bit_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_bit_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_encode_raw_bit_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_raw_bit_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_bit_string(unsigned long nbits, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* OCTET STRING */
|
|
||||||
int der_encode_octet_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_octet_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_octet_string(unsigned long noctets, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* OBJECT IDENTIFIER */
|
|
||||||
int der_encode_object_identifier(unsigned long *words, unsigned long nwords,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_object_identifier(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned long *words, unsigned long *outlen);
|
|
||||||
int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen);
|
|
||||||
unsigned long der_object_identifier_bits(unsigned long x);
|
|
||||||
|
|
||||||
/* IA5 STRING */
|
|
||||||
int der_encode_ia5_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_ia5_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_ia5_char_encode(int c);
|
|
||||||
int der_ia5_value_decode(int v);
|
|
||||||
|
|
||||||
/* TELETEX STRING */
|
|
||||||
int der_decode_teletex_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
|
|
||||||
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int der_teletex_char_encode(int c);
|
|
||||||
int der_teletex_value_decode(int v);
|
|
||||||
#endif /* LTC_SOURCE */
|
|
||||||
|
|
||||||
|
|
||||||
/* PRINTABLE STRING */
|
|
||||||
int der_encode_printable_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_decode_printable_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_printable_char_encode(int c);
|
|
||||||
int der_printable_value_decode(int v);
|
|
||||||
|
|
||||||
/* UTF-8 */
|
|
||||||
#if (defined(SIZE_MAX) || __STDC_VERSION__ >= 199901L || defined(WCHAR_MAX) || defined(__WCHAR_MAX__) || defined(_WCHAR_T) || defined(_WCHAR_T_DEFINED) || defined (__WCHAR_TYPE__)) && !defined(LTC_NO_WCHAR)
|
|
||||||
#include <wchar.h>
|
|
||||||
#if defined(__WCHAR_MAX__)
|
|
||||||
#define LTC_WCHAR_MAX __WCHAR_MAX__
|
|
||||||
#elif defined(WCHAR_MAX)
|
|
||||||
#define LTC_WCHAR_MAX WCHAR_MAX
|
|
||||||
#endif
|
|
||||||
/* please note that it might happen that LTC_WCHAR_MAX is undefined */
|
|
||||||
#else
|
|
||||||
typedef ulong32 wchar_t;
|
|
||||||
#define LTC_WCHAR_MAX 0xFFFFFFFF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_decode_utf8_string(const unsigned char *in, unsigned long inlen,
|
|
||||||
wchar_t *out, unsigned long *outlen);
|
|
||||||
unsigned long der_utf8_charsize(const wchar_t c);
|
|
||||||
#ifdef LTC_SOURCE
|
|
||||||
/* internal helper functions */
|
|
||||||
int der_utf8_valid_char(const wchar_t c);
|
|
||||||
#endif /* LTC_SOURCE */
|
|
||||||
int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen);
|
|
||||||
|
|
||||||
|
|
||||||
/* CHOICE */
|
|
||||||
int der_decode_choice(const unsigned char *in, unsigned long *inlen,
|
|
||||||
ltc_asn1_list *list, unsigned long outlen);
|
|
||||||
|
|
||||||
/* UTCTime */
|
|
||||||
typedef struct {
|
|
||||||
unsigned YY, /* year */
|
|
||||||
MM, /* month */
|
|
||||||
DD, /* day */
|
|
||||||
hh, /* hour */
|
|
||||||
mm, /* minute */
|
|
||||||
ss, /* second */
|
|
||||||
off_dir, /* timezone offset direction 0 == +, 1 == - */
|
|
||||||
off_hh, /* timezone offset hours */
|
|
||||||
off_mm; /* timezone offset minutes */
|
|
||||||
} ltc_utctime;
|
|
||||||
|
|
||||||
int der_encode_utctime(ltc_utctime *utctime,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_decode_utctime(const unsigned char *in, unsigned long *inlen,
|
|
||||||
ltc_utctime *out);
|
|
||||||
|
|
||||||
int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* GeneralizedTime */
|
|
||||||
typedef struct {
|
|
||||||
unsigned YYYY, /* year */
|
|
||||||
MM, /* month */
|
|
||||||
DD, /* day */
|
|
||||||
hh, /* hour */
|
|
||||||
mm, /* minute */
|
|
||||||
ss, /* second */
|
|
||||||
fs, /* fractional seconds */
|
|
||||||
off_dir, /* timezone offset direction 0 == +, 1 == - */
|
|
||||||
off_hh, /* timezone offset hours */
|
|
||||||
off_mm; /* timezone offset minutes */
|
|
||||||
} ltc_generalizedtime;
|
|
||||||
|
|
||||||
int der_encode_generalizedtime(ltc_generalizedtime *gtime,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int der_decode_generalizedtime(const unsigned char *in, unsigned long *inlen,
|
|
||||||
ltc_generalizedtime *out);
|
|
||||||
|
|
||||||
int der_length_generalizedtime(ltc_generalizedtime *gtime, unsigned long *outlen);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
@ -1,108 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* PKCS Header Info */
|
|
||||||
|
|
||||||
/* ===> PKCS #1 -- RSA Cryptography <=== */
|
|
||||||
#ifdef LTC_PKCS_1
|
|
||||||
|
|
||||||
enum ltc_pkcs_1_v1_5_blocks
|
|
||||||
{
|
|
||||||
LTC_PKCS_1_EMSA = 1, /* Block type 1 (PKCS #1 v1.5 signature padding) */
|
|
||||||
LTC_PKCS_1_EME = 2 /* Block type 2 (PKCS #1 v1.5 encryption padding) */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ltc_pkcs_1_paddings
|
|
||||||
{
|
|
||||||
LTC_PKCS_1_V1_5 = 1, /* PKCS #1 v1.5 padding (\sa ltc_pkcs_1_v1_5_blocks) */
|
|
||||||
LTC_PKCS_1_OAEP = 2, /* PKCS #1 v2.0 encryption padding */
|
|
||||||
LTC_PKCS_1_PSS = 3, /* PKCS #1 v2.1 signature padding */
|
|
||||||
LTC_PKCS_1_V1_5_NA1 = 4 /* PKCS #1 v1.5 padding - No ASN.1 (\sa ltc_pkcs_1_v1_5_blocks) */
|
|
||||||
};
|
|
||||||
|
|
||||||
int pkcs_1_mgf1( int hash_idx,
|
|
||||||
const unsigned char *seed, unsigned long seedlen,
|
|
||||||
unsigned char *mask, unsigned long masklen);
|
|
||||||
|
|
||||||
int pkcs_1_i2osp(void *n, unsigned long modulus_len, unsigned char *out);
|
|
||||||
int pkcs_1_os2ip(void *n, unsigned char *in, unsigned long inlen);
|
|
||||||
|
|
||||||
/* *** v1.5 padding */
|
|
||||||
int pkcs_1_v1_5_encode(const unsigned char *msg,
|
|
||||||
unsigned long msglen,
|
|
||||||
int block_type,
|
|
||||||
unsigned long modulus_bitlen,
|
|
||||||
prng_state *prng,
|
|
||||||
int prng_idx,
|
|
||||||
unsigned char *out,
|
|
||||||
unsigned long *outlen);
|
|
||||||
|
|
||||||
int pkcs_1_v1_5_decode(const unsigned char *msg,
|
|
||||||
unsigned long msglen,
|
|
||||||
int block_type,
|
|
||||||
unsigned long modulus_bitlen,
|
|
||||||
unsigned char *out,
|
|
||||||
unsigned long *outlen,
|
|
||||||
int *is_valid);
|
|
||||||
|
|
||||||
/* *** v2.1 padding */
|
|
||||||
int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
unsigned long modulus_bitlen, prng_state *prng,
|
|
||||||
int prng_idx, int hash_idx,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen,
|
|
||||||
const unsigned char *lparam, unsigned long lparamlen,
|
|
||||||
unsigned long modulus_bitlen, int hash_idx,
|
|
||||||
unsigned char *out, unsigned long *outlen,
|
|
||||||
int *res);
|
|
||||||
|
|
||||||
int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen,
|
|
||||||
unsigned long saltlen, prng_state *prng,
|
|
||||||
int prng_idx, int hash_idx,
|
|
||||||
unsigned long modulus_bitlen,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen,
|
|
||||||
const unsigned char *sig, unsigned long siglen,
|
|
||||||
unsigned long saltlen, int hash_idx,
|
|
||||||
unsigned long modulus_bitlen, int *res);
|
|
||||||
|
|
||||||
#endif /* LTC_PKCS_1 */
|
|
||||||
|
|
||||||
/* ===> PKCS #5 -- Password Based Cryptography <=== */
|
|
||||||
#ifdef LTC_PKCS_5
|
|
||||||
|
|
||||||
/* Algorithm #1 (PBKDF1) */
|
|
||||||
int pkcs_5_alg1(const unsigned char *password, unsigned long password_len,
|
|
||||||
const unsigned char *salt,
|
|
||||||
int iteration_count, int hash_idx,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* Algorithm #1 (PBKDF1) - OpenSSL-compatible variant for arbitrarily-long keys.
|
|
||||||
Compatible with EVP_BytesToKey() */
|
|
||||||
int pkcs_5_alg1_openssl(const unsigned char *password,
|
|
||||||
unsigned long password_len,
|
|
||||||
const unsigned char *salt,
|
|
||||||
int iteration_count, int hash_idx,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
/* Algorithm #2 (PBKDF2) */
|
|
||||||
int pkcs_5_alg2(const unsigned char *password, unsigned long password_len,
|
|
||||||
const unsigned char *salt, unsigned long salt_len,
|
|
||||||
int iteration_count, int hash_idx,
|
|
||||||
unsigned char *out, unsigned long *outlen);
|
|
||||||
|
|
||||||
int pkcs_5_test (void);
|
|
||||||
#endif /* LTC_PKCS_5 */
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
@ -1,232 +0,0 @@
|
|||||||
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
||||||
*
|
|
||||||
* LibTomCrypt is a library that provides various cryptographic
|
|
||||||
* algorithms in a highly modular and flexible manner.
|
|
||||||
*
|
|
||||||
* The library is free for all purposes without any express
|
|
||||||
* guarantee it works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ---- PRNG Stuff ---- */
|
|
||||||
#ifdef LTC_YARROW
|
|
||||||
struct yarrow_prng {
|
|
||||||
int cipher, hash;
|
|
||||||
unsigned char pool[MAXBLOCKSIZE];
|
|
||||||
symmetric_CTR ctr;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_RC4
|
|
||||||
struct rc4_prng {
|
|
||||||
rc4_state s;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_CHACHA20_PRNG
|
|
||||||
struct chacha20_prng {
|
|
||||||
chacha_state s; /* chacha state */
|
|
||||||
unsigned char ent[40]; /* entropy buffer */
|
|
||||||
unsigned long idx; /* entropy counter */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_FORTUNA
|
|
||||||
struct fortuna_prng {
|
|
||||||
hash_state pool[LTC_FORTUNA_POOLS]; /* the pools */
|
|
||||||
|
|
||||||
symmetric_key skey;
|
|
||||||
|
|
||||||
unsigned char K[32], /* the current key */
|
|
||||||
IV[16]; /* IV for CTR mode */
|
|
||||||
|
|
||||||
unsigned long pool_idx, /* current pool we will add to */
|
|
||||||
pool0_len, /* length of 0'th pool */
|
|
||||||
wd;
|
|
||||||
|
|
||||||
ulong64 reset_cnt; /* number of times we have reset */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_SOBER128
|
|
||||||
struct sober128_prng {
|
|
||||||
sober128_state s; /* sober128 state */
|
|
||||||
unsigned char ent[40]; /* entropy buffer */
|
|
||||||
unsigned long idx; /* entropy counter */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
union {
|
|
||||||
char dummy[1];
|
|
||||||
#ifdef LTC_YARROW
|
|
||||||
struct yarrow_prng yarrow;
|
|
||||||
#endif
|
|
||||||
#ifdef LTC_RC4
|
|
||||||
struct rc4_prng rc4;
|
|
||||||
#endif
|
|
||||||
#ifdef LTC_CHACHA20_PRNG
|
|
||||||
struct chacha20_prng chacha;
|
|
||||||
#endif
|
|
||||||
#ifdef LTC_FORTUNA
|
|
||||||
struct fortuna_prng fortuna;
|
|
||||||
#endif
|
|
||||||
#ifdef LTC_SOBER128
|
|
||||||
struct sober128_prng sober128;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
short ready; /* ready flag 0-1 */
|
|
||||||
LTC_MUTEX_TYPE(lock) /* lock */
|
|
||||||
} prng_state;
|
|
||||||
|
|
||||||
/** PRNG descriptor */
|
|
||||||
extern struct ltc_prng_descriptor {
|
|
||||||
/** Name of the PRNG */
|
|
||||||
const char *name;
|
|
||||||
/** size in bytes of exported state */
|
|
||||||
int export_size;
|
|
||||||
/** Start a PRNG state
|
|
||||||
@param prng [out] The state to initialize
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*start)(prng_state *prng);
|
|
||||||
/** Add entropy to the PRNG
|
|
||||||
@param in The entropy
|
|
||||||
@param inlen Length of the entropy (octets)\
|
|
||||||
@param prng The PRNG state
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
/** Ready a PRNG state to read from
|
|
||||||
@param prng The PRNG state to ready
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*ready)(prng_state *prng);
|
|
||||||
/** Read from the PRNG
|
|
||||||
@param out [out] Where to store the data
|
|
||||||
@param outlen Length of data desired (octets)
|
|
||||||
@param prng The PRNG state to read from
|
|
||||||
@return Number of octets read
|
|
||||||
*/
|
|
||||||
unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
/** Terminate a PRNG state
|
|
||||||
@param prng The PRNG state to terminate
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*done)(prng_state *prng);
|
|
||||||
/** Export a PRNG state
|
|
||||||
@param out [out] The destination for the state
|
|
||||||
@param outlen [in/out] The max size and resulting size of the PRNG state
|
|
||||||
@param prng The PRNG to export
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
/** Import a PRNG state
|
|
||||||
@param in The data to import
|
|
||||||
@param inlen The length of the data to import (octets)
|
|
||||||
@param prng The PRNG to initialize/import
|
|
||||||
@return CRYPT_OK if successful
|
|
||||||
*/
|
|
||||||
int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
/** Self-test the PRNG
|
|
||||||
@return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
|
|
||||||
*/
|
|
||||||
int (*test)(void);
|
|
||||||
} prng_descriptor[];
|
|
||||||
|
|
||||||
#ifdef LTC_YARROW
|
|
||||||
int yarrow_start(prng_state *prng);
|
|
||||||
int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int yarrow_ready(prng_state *prng);
|
|
||||||
unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int yarrow_done(prng_state *prng);
|
|
||||||
int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int yarrow_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor yarrow_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_FORTUNA
|
|
||||||
int fortuna_start(prng_state *prng);
|
|
||||||
int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int fortuna_ready(prng_state *prng);
|
|
||||||
unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int fortuna_done(prng_state *prng);
|
|
||||||
int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int fortuna_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor fortuna_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_RC4
|
|
||||||
int rc4_start(prng_state *prng);
|
|
||||||
int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int rc4_ready(prng_state *prng);
|
|
||||||
unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int rc4_done(prng_state *prng);
|
|
||||||
int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int rc4_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor rc4_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_CHACHA20_PRNG
|
|
||||||
int chacha20_prng_start(prng_state *prng);
|
|
||||||
int chacha20_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int chacha20_prng_ready(prng_state *prng);
|
|
||||||
unsigned long chacha20_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int chacha20_prng_done(prng_state *prng);
|
|
||||||
int chacha20_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int chacha20_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int chacha20_prng_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor chacha20_prng_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_SPRNG
|
|
||||||
int sprng_start(prng_state *prng);
|
|
||||||
int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int sprng_ready(prng_state *prng);
|
|
||||||
unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int sprng_done(prng_state *prng);
|
|
||||||
int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int sprng_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor sprng_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LTC_SOBER128
|
|
||||||
int sober128_start(prng_state *prng);
|
|
||||||
int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int sober128_ready(prng_state *prng);
|
|
||||||
unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);
|
|
||||||
int sober128_done(prng_state *prng);
|
|
||||||
int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
|
|
||||||
int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
|
|
||||||
int sober128_test(void);
|
|
||||||
extern const struct ltc_prng_descriptor sober128_desc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int find_prng(const char *name);
|
|
||||||
int register_prng(const struct ltc_prng_descriptor *prng);
|
|
||||||
int unregister_prng(const struct ltc_prng_descriptor *prng);
|
|
||||||
int register_all_prngs(void);
|
|
||||||
int prng_is_valid(int idx);
|
|
||||||
LTC_MUTEX_PROTO(ltc_prng_mutex)
|
|
||||||
|
|
||||||
/* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this
|
|
||||||
* might not work on all platforms as planned
|
|
||||||
*/
|
|
||||||
unsigned long rng_get_bytes(unsigned char *out,
|
|
||||||
unsigned long outlen,
|
|
||||||
void (*callback)(void));
|
|
||||||
|
|
||||||
int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
|
|
||||||
|
|
||||||
#ifdef LTC_PRNG_ENABLE_LTC_RNG
|
|
||||||
extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen,
|
|
||||||
void (*callback)(void));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* ref: $Format:%D$ */
|
|
||||||
/* git commit: $Format:%H$ */
|
|
||||||
/* commit time: $Format:%ai$ */
|
|
Loading…
x
Reference in New Issue
Block a user