| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- /* ---- SYMMETRIC KEY STUFF -----
- *
- * We put each of the ciphers scheduled keys in their own structs then we put all of
- * the key formats in one union. This makes the function prototypes easier to use.
- */
- #ifdef BLOWFISH
- struct blowfish_key {
- ulong32 S[4][256];
- ulong32 K[18];
- };
- #endif
- #ifdef RC5
- struct rc5_key {
- int rounds;
- ulong32 K[50];
- };
- #endif
- #ifdef RC6
- struct rc6_key {
- ulong32 K[44];
- };
- #endif
- #ifdef SAFERP
- struct saferp_key {
- unsigned char K[33][16];
- long rounds;
- };
- #endif
- #ifdef RIJNDAEL
- struct rijndael_key {
- ulong32 eK[64], dK[64];
- int Nr;
- };
- #endif
- #ifdef XTEA
- struct xtea_key {
- unsigned long A[32], B[32];
- };
- #endif
- #ifdef TWOFISH
- #ifndef TWOFISH_SMALL
- struct twofish_key {
- ulong32 S[4][256], K[40];
- };
- #else
- struct twofish_key {
- ulong32 K[40];
- unsigned char S[32], start;
- };
- #endif
- #endif
- #ifdef SAFER
- #define SAFER_K64_DEFAULT_NOF_ROUNDS 6
- #define SAFER_K128_DEFAULT_NOF_ROUNDS 10
- #define SAFER_SK64_DEFAULT_NOF_ROUNDS 8
- #define SAFER_SK128_DEFAULT_NOF_ROUNDS 10
- #define SAFER_MAX_NOF_ROUNDS 13
- #define SAFER_BLOCK_LEN 8
- #define SAFER_KEY_LEN (1 + SAFER_BLOCK_LEN * (1 + 2 * SAFER_MAX_NOF_ROUNDS))
- typedef unsigned char safer_block_t[SAFER_BLOCK_LEN];
- typedef unsigned char safer_key_t[SAFER_KEY_LEN];
- struct safer_key { safer_key_t key; };
- #endif
- #ifdef RC2
- struct rc2_key { unsigned xkey[64]; };
- #endif
- #ifdef DES
- struct des_key {
- ulong32 ek[32], dk[32];
- };
- struct des3_key {
- ulong32 ek[3][32], dk[3][32];
- };
- #endif
- #ifdef CAST5
- struct cast5_key {
- ulong32 K[32], keylen;
- };
- #endif
- #ifdef NOEKEON
- struct noekeon_key {
- ulong32 K[4], dK[4];
- };
- #endif
- #ifdef SKIPJACK
- struct skipjack_key {
- unsigned char key[10];
- };
- #endif
- typedef union Symmetric_key {
- #ifdef DES
- struct des_key des;
- struct des3_key des3;
- #endif
- #ifdef RC2
- struct rc2_key rc2;
- #endif
- #ifdef SAFER
- struct safer_key safer;
- #endif
- #ifdef TWOFISH
- struct twofish_key twofish;
- #endif
- #ifdef BLOWFISH
- struct blowfish_key blowfish;
- #endif
- #ifdef RC5
- struct rc5_key rc5;
- #endif
- #ifdef RC6
- struct rc6_key rc6;
- #endif
- #ifdef SAFERP
- struct saferp_key saferp;
- #endif
- #ifdef RIJNDAEL
- struct rijndael_key rijndael;
- #endif
- #ifdef XTEA
- struct xtea_key xtea;
- #endif
- #ifdef CAST5
- struct cast5_key cast5;
- #endif
- #ifdef NOEKEON
- struct noekeon_key noekeon;
- #endif
- #ifdef SKIPJACK
- struct skipjack_key skipjack;
- #endif
- } symmetric_key;
- /* A block cipher ECB structure */
- typedef struct {
- int cipher, blocklen;
- symmetric_key key;
- } symmetric_ECB;
- /* A block cipher CFB structure */
- typedef struct {
- int cipher, blocklen, padlen;
- unsigned char IV[MAXBLOCKSIZE], pad[MAXBLOCKSIZE];
- symmetric_key key;
- } symmetric_CFB;
- /* A block cipher OFB structure */
- typedef struct {
- int cipher, blocklen, padlen;
- unsigned char IV[MAXBLOCKSIZE];
- symmetric_key key;
- } symmetric_OFB;
- /* A block cipher CBC structure */
- typedef struct Symmetric_CBC {
- int cipher, blocklen;
- unsigned char IV[MAXBLOCKSIZE];
- symmetric_key key;
- } symmetric_CBC;
- /* A block cipher CTR structure */
- typedef struct Symmetric_CTR {
- int cipher, blocklen, padlen, mode;
- unsigned char ctr[MAXBLOCKSIZE], pad[MAXBLOCKSIZE];
- symmetric_key key;
- } symmetric_CTR;
- /* cipher descriptor table, last entry has "name == NULL" to mark the end of table */
- extern struct _cipher_descriptor {
- char *name;
- unsigned char ID;
- int min_key_length, max_key_length, block_length, default_rounds;
- int (*setup)(const unsigned char *key, int keylength, int num_rounds, symmetric_key *skey);
- void (*ecb_encrypt)(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void (*ecb_decrypt)(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int (*test)(void);
- int (*keysize)(int *desired_keysize);
- } cipher_descriptor[];
- #ifdef BLOWFISH
- int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int blowfish_test(void);
- int blowfish_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor blowfish_desc;
- #endif
- #ifdef RC5
- int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int rc5_test(void);
- int rc5_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor rc5_desc;
- #endif
- #ifdef RC6
- int rc6_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int rc6_test(void);
- int rc6_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor rc6_desc;
- #endif
- #ifdef RC2
- int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int rc2_test(void);
- int rc2_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor rc2_desc;
- #endif
- #ifdef SAFERP
- int saferp_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void saferp_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int saferp_test(void);
- int saferp_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor saferp_desc;
- #endif
- #ifdef SAFER
- int safer_k64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- int safer_sk64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- int safer_k128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- int safer_sk128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void safer_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void safer_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int safer_k64_test(void);
- int safer_sk64_test(void);
- int safer_sk128_test(void);
- int safer_64_keysize(int *desired_keysize);
- int safer_128_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor safer_k64_desc, safer_k128_desc, safer_sk64_desc, safer_sk128_desc;
- #endif
- #ifdef RIJNDAEL
- /* make aes an alias */
- #define aes_setup rijndael_setup
- #define aes_ecb_encrypt rijndael_ecb_encrypt
- #define aes_ecb_decrypt rijndael_ecb_decrypt
- #define aes_test rijndael_test
- #define aes_keysize rijndael_keysize
- #define aes_enc_setup rijndael_enc_setup
- #define aes_enc_ecb_encrypt rijndael_enc_ecb_encrypt
- #define aes_enc_keysize rijndael_enc_keysize
- int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int rijndael_test(void);
- int rijndael_keysize(int *desired_keysize);
- int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- int rijndael_enc_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor rijndael_desc, aes_desc;
- extern const struct _cipher_descriptor rijndael_enc_desc, aes_enc_desc;
- #endif
- #ifdef XTEA
- int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int xtea_test(void);
- int xtea_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor xtea_desc;
- #endif
- #ifdef TWOFISH
- int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int twofish_test(void);
- int twofish_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor twofish_desc;
- #endif
- #ifdef DES
- int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int des_test(void);
- int des_keysize(int *desired_keysize);
- int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int des3_test(void);
- int des3_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor des_desc, des3_desc;
- #endif
- #ifdef CAST5
- int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int cast5_test(void);
- int cast5_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor cast5_desc;
- #endif
- #ifdef NOEKEON
- int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int noekeon_test(void);
- int noekeon_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor noekeon_desc;
- #endif
- #ifdef SKIPJACK
- int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
- void skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
- void skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
- int skipjack_test(void);
- int skipjack_keysize(int *desired_keysize);
- extern const struct _cipher_descriptor skipjack_desc;
- #endif
- #ifdef ECB
- int ecb_start(int cipher, const unsigned char *key,
- int keylen, int num_rounds, symmetric_ECB *ecb);
- int ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_ECB *ecb);
- int ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_ECB *ecb);
- #endif
- #ifdef CFB
- int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key,
- int keylen, int num_rounds, symmetric_CFB *cfb);
- int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CFB *cfb);
- int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CFB *cfb);
- int cfb_getiv(unsigned char *IV, unsigned long *len, symmetric_CFB *cfb);
- int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb);
- #endif
- #ifdef OFB
- int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key,
- int keylen, int num_rounds, symmetric_OFB *ofb);
- int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb);
- int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb);
- int ofb_getiv(unsigned char *IV, unsigned long *len, symmetric_OFB *ofb);
- int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb);
- #endif
- #ifdef CBC
- int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key,
- int keylen, int num_rounds, symmetric_CBC *cbc);
- int cbc_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_CBC *cbc);
- int cbc_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_CBC *cbc);
- int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc);
- int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc);
- #endif
- #ifdef CTR
- int ctr_start(int cipher, const unsigned char *IV, const unsigned char *key,
- int keylen, int num_rounds, symmetric_CTR *ctr);
- int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr);
- int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr);
- int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr);
- int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr);
- #endif
-
- int find_cipher(const char *name);
- int find_cipher_any(const char *name, int blocklen, int keylen);
- int find_cipher_id(unsigned char ID);
- int register_cipher(const struct _cipher_descriptor *cipher);
- int unregister_cipher(const struct _cipher_descriptor *cipher);
- int cipher_is_valid(int idx);
|