Home | History | Annotate | Download | only in headers
      1 /* ---- SYMMETRIC KEY STUFF -----
      2  *
      3  * We put each of the ciphers scheduled keys in their own structs then we put all of
      4  * the key formats in one union.  This makes the function prototypes easier to use.
      5  */
      6 #ifdef BLOWFISH
      7 struct blowfish_key {
      8    ulong32 S[4][256];
      9    ulong32 K[18];
     10 };
     11 #endif
     12 
     13 #ifdef RC5
     14 struct rc5_key {
     15    int rounds;
     16    ulong32 K[50];
     17 };
     18 #endif
     19 
     20 #ifdef RC6
     21 struct rc6_key {
     22    ulong32 K[44];
     23 };
     24 #endif
     25 
     26 #ifdef SAFERP
     27 struct saferp_key {
     28    unsigned char K[33][16];
     29    long rounds;
     30 };
     31 #endif
     32 
     33 #ifdef RIJNDAEL
     34 struct rijndael_key {
     35    ulong32 eK[60], dK[60];
     36    int Nr;
     37 };
     38 #endif
     39 
     40 #ifdef KSEED
     41 struct kseed_key {
     42     ulong32 K[32], dK[32];
     43 };
     44 #endif
     45 
     46 #ifdef LTC_KASUMI
     47 struct kasumi_key {
     48     ulong32 KLi1[8], KLi2[8],
     49             KOi1[8], KOi2[8], KOi3[8],
     50             KIi1[8], KIi2[8], KIi3[8];
     51 };
     52 #endif
     53 
     54 #ifdef XTEA
     55 struct xtea_key {
     56    unsigned long A[32], B[32];
     57 };
     58 #endif
     59 
     60 #ifdef TWOFISH
     61 #ifndef TWOFISH_SMALL
     62    struct twofish_key {
     63       ulong32 S[4][256], K[40];
     64    };
     65 #else
     66    struct twofish_key {
     67       ulong32 K[40];
     68       unsigned char S[32], start;
     69    };
     70 #endif
     71 #endif
     72 
     73 #ifdef SAFER
     74 #define SAFER_K64_DEFAULT_NOF_ROUNDS     6
     75 #define SAFER_K128_DEFAULT_NOF_ROUNDS   10
     76 #define SAFER_SK64_DEFAULT_NOF_ROUNDS    8
     77 #define SAFER_SK128_DEFAULT_NOF_ROUNDS  10
     78 #define SAFER_MAX_NOF_ROUNDS            13
     79 #define SAFER_BLOCK_LEN                  8
     80 #define SAFER_KEY_LEN     (1 + SAFER_BLOCK_LEN * (1 + 2 * SAFER_MAX_NOF_ROUNDS))
     81 typedef unsigned char safer_block_t[SAFER_BLOCK_LEN];
     82 typedef unsigned char safer_key_t[SAFER_KEY_LEN];
     83 struct safer_key { safer_key_t key; };
     84 #endif
     85 
     86 #ifdef RC2
     87 struct rc2_key { unsigned xkey[64]; };
     88 #endif
     89 
     90 #ifdef DES
     91 struct des_key {
     92     ulong32 ek[32], dk[32];
     93 };
     94 
     95 struct des3_key {
     96     ulong32 ek[3][32], dk[3][32];
     97 };
     98 #endif
     99 
    100 #ifdef CAST5
    101 struct cast5_key {
    102     ulong32 K[32], keylen;
    103 };
    104 #endif
    105 
    106 #ifdef NOEKEON
    107 struct noekeon_key {
    108     ulong32 K[4], dK[4];
    109 };
    110 #endif
    111 
    112 #ifdef SKIPJACK
    113 struct skipjack_key {
    114     unsigned char key[10];
    115 };
    116 #endif
    117 
    118 #ifdef KHAZAD
    119 struct khazad_key {
    120    ulong64 roundKeyEnc[8 + 1];
    121    ulong64 roundKeyDec[8 + 1];
    122 };
    123 #endif
    124 
    125 #ifdef ANUBIS
    126 struct anubis_key {
    127    int keyBits;
    128    int R;
    129    ulong32 roundKeyEnc[18 + 1][4];
    130    ulong32 roundKeyDec[18 + 1][4];
    131 };
    132 #endif
    133 
    134 typedef union Symmetric_key {
    135 #ifdef DES
    136    struct des_key des;
    137    struct des3_key des3;
    138 #endif
    139 #ifdef RC2
    140    struct rc2_key rc2;
    141 #endif
    142 #ifdef SAFER
    143    struct safer_key safer;
    144 #endif
    145 #ifdef TWOFISH
    146    struct twofish_key  twofish;
    147 #endif
    148 #ifdef BLOWFISH
    149    struct blowfish_key blowfish;
    150 #endif
    151 #ifdef RC5
    152    struct rc5_key      rc5;
    153 #endif
    154 #ifdef RC6
    155    struct rc6_key      rc6;
    156 #endif
    157 #ifdef SAFERP
    158    struct saferp_key   saferp;
    159 #endif
    160 #ifdef RIJNDAEL
    161    struct rijndael_key rijndael;
    162 #endif
    163 #ifdef XTEA
    164    struct xtea_key     xtea;
    165 #endif
    166 #ifdef CAST5
    167    struct cast5_key    cast5;
    168 #endif
    169 #ifdef NOEKEON
    170    struct noekeon_key  noekeon;
    171 #endif
    172 #ifdef SKIPJACK
    173    struct skipjack_key skipjack;
    174 #endif
    175 #ifdef KHAZAD
    176    struct khazad_key   khazad;
    177 #endif
    178 #ifdef ANUBIS
    179    struct anubis_key   anubis;
    180 #endif
    181 #ifdef KSEED
    182    struct kseed_key    kseed;
    183 #endif
    184 #ifdef LTC_KASUMI
    185    struct kasumi_key   kasumi;
    186 #endif
    187    void   *data;
    188 } symmetric_key;
    189 
    190 #ifdef LTC_ECB_MODE
    191 /** A block cipher ECB structure */
    192 typedef struct {
    193    /** The index of the cipher chosen */
    194    int                 cipher,
    195    /** The block size of the given cipher */
    196                        blocklen;
    197    /** The scheduled key */
    198    symmetric_key       key;
    199 } symmetric_ECB;
    200 #endif
    201 
    202 #ifdef LTC_CFB_MODE
    203 /** A block cipher CFB structure */
    204 typedef struct {
    205    /** The index of the cipher chosen */
    206    int                 cipher,
    207    /** The block size of the given cipher */
    208                        blocklen,
    209    /** The padding offset */
    210                        padlen;
    211    /** The current IV */
    212    unsigned char       IV[MAXBLOCKSIZE],
    213    /** The pad used to encrypt/decrypt */
    214                        pad[MAXBLOCKSIZE];
    215    /** The scheduled key */
    216    symmetric_key       key;
    217 } symmetric_CFB;
    218 #endif
    219 
    220 #ifdef LTC_OFB_MODE
    221 /** A block cipher OFB structure */
    222 typedef struct {
    223    /** The index of the cipher chosen */
    224    int                 cipher,
    225    /** The block size of the given cipher */
    226                        blocklen,
    227    /** The padding offset */
    228                        padlen;
    229    /** The current IV */
    230    unsigned char       IV[MAXBLOCKSIZE];
    231    /** The scheduled key */
    232    symmetric_key       key;
    233 } symmetric_OFB;
    234 #endif
    235 
    236 #ifdef LTC_CBC_MODE
    237 /** A block cipher CBC structure */
    238 typedef struct {
    239    /** The index of the cipher chosen */
    240    int                 cipher,
    241    /** The block size of the given cipher */
    242                        blocklen;
    243    /** The current IV */
    244    unsigned char       IV[MAXBLOCKSIZE];
    245    /** The scheduled key */
    246    symmetric_key       key;
    247 } symmetric_CBC;
    248 #endif
    249 
    250 
    251 #ifdef LTC_CTR_MODE
    252 /** A block cipher CTR structure */
    253 typedef struct {
    254    /** The index of the cipher chosen */
    255    int                 cipher,
    256    /** The block size of the given cipher */
    257                        blocklen,
    258    /** The padding offset */
    259                        padlen,
    260    /** The mode (endianess) of the CTR, 0==little, 1==big */
    261                        mode;
    262    /** The counter */
    263    unsigned char       ctr[MAXBLOCKSIZE],
    264    /** The pad used to encrypt/decrypt */
    265                        pad[MAXBLOCKSIZE];
    266    /** The scheduled key */
    267    symmetric_key       key;
    268 } symmetric_CTR;
    269 #endif
    270 
    271 
    272 #ifdef LTC_LRW_MODE
    273 /** A LRW structure */
    274 typedef struct {
    275     /** The index of the cipher chosen (must be a 128-bit block cipher) */
    276     int               cipher;
    277 
    278     /** The current IV */
    279     unsigned char     IV[16],
    280 
    281     /** the tweak key */
    282                       tweak[16],
    283 
    284     /** The current pad, it's the product of the first 15 bytes against the tweak key */
    285                       pad[16];
    286 
    287     /** The scheduled symmetric key */
    288     symmetric_key     key;
    289 
    290 #ifdef LRW_TABLES
    291     /** The pre-computed multiplication table */
    292     unsigned char     PC[16][256][16];
    293 #endif
    294 } symmetric_LRW;
    295 #endif
    296 
    297 #ifdef LTC_F8_MODE
    298 /** A block cipher F8 structure */
    299 typedef struct {
    300    /** The index of the cipher chosen */
    301    int                 cipher,
    302    /** The block size of the given cipher */
    303                        blocklen,
    304    /** The padding offset */
    305                        padlen;
    306    /** The current IV */
    307    unsigned char       IV[MAXBLOCKSIZE],
    308                        MIV[MAXBLOCKSIZE];
    309    /** Current block count */
    310    ulong32             blockcnt;
    311    /** The scheduled key */
    312    symmetric_key       key;
    313 } symmetric_F8;
    314 #endif
    315 
    316 
    317 /** cipher descriptor table, last entry has "name == NULL" to mark the end of table */
    318 extern struct ltc_cipher_descriptor {
    319    /** name of cipher */
    320    char *name;
    321    /** internal ID */
    322    unsigned char ID;
    323    /** min keysize (octets) */
    324    int  min_key_length,
    325    /** max keysize (octets) */
    326         max_key_length,
    327    /** block size (octets) */
    328         block_length,
    329    /** default number of rounds */
    330         default_rounds;
    331    /** Setup the cipher
    332       @param key         The input symmetric key
    333       @param keylen      The length of the input key (octets)
    334       @param num_rounds  The requested number of rounds (0==default)
    335       @param skey        [out] The destination of the scheduled key
    336       @return CRYPT_OK if successful
    337    */
    338    int  (*setup)(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    339    /** Encrypt a block
    340       @param pt      The plaintext
    341       @param ct      [out] The ciphertext
    342       @param skey    The scheduled key
    343       @return CRYPT_OK if successful
    344    */
    345    int (*ecb_encrypt)(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    346    /** Decrypt a block
    347       @param ct      The ciphertext
    348       @param pt      [out] The plaintext
    349       @param skey    The scheduled key
    350       @return CRYPT_OK if successful
    351    */
    352    int (*ecb_decrypt)(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    353    /** Test the block cipher
    354        @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
    355    */
    356    int (*test)(void);
    357 
    358    /** Terminate the context
    359       @param skey    The scheduled key
    360    */
    361    void (*done)(symmetric_key *skey);
    362 
    363    /** Determine a key size
    364        @param keysize    [in/out] The size of the key desired and the suggested size
    365        @return CRYPT_OK if successful
    366    */
    367    int  (*keysize)(int *keysize);
    368 
    369 /** Accelerators **/
    370    /** Accelerated ECB encryption
    371        @param pt      Plaintext
    372        @param ct      Ciphertext
    373        @param blocks  The number of complete blocks to process
    374        @param skey    The scheduled key context
    375        @return CRYPT_OK if successful
    376    */
    377    int (*accel_ecb_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, symmetric_key *skey);
    378 
    379    /** Accelerated ECB decryption
    380        @param pt      Plaintext
    381        @param ct      Ciphertext
    382        @param blocks  The number of complete blocks to process
    383        @param skey    The scheduled key context
    384        @return CRYPT_OK if successful
    385    */
    386    int (*accel_ecb_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, symmetric_key *skey);
    387 
    388    /** Accelerated CBC encryption
    389        @param pt      Plaintext
    390        @param ct      Ciphertext
    391        @param blocks  The number of complete blocks to process
    392        @param IV      The initial value (input/output)
    393        @param skey    The scheduled key context
    394        @return CRYPT_OK if successful
    395    */
    396    int (*accel_cbc_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, symmetric_key *skey);
    397 
    398    /** Accelerated CBC decryption
    399        @param pt      Plaintext
    400        @param ct      Ciphertext
    401        @param blocks  The number of complete blocks to process
    402        @param IV      The initial value (input/output)
    403        @param skey    The scheduled key context
    404        @return CRYPT_OK if successful
    405    */
    406    int (*accel_cbc_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, symmetric_key *skey);
    407 
    408    /** Accelerated CTR encryption
    409        @param pt      Plaintext
    410        @param ct      Ciphertext
    411        @param blocks  The number of complete blocks to process
    412        @param IV      The initial value (input/output)
    413        @param mode    little or big endian counter (mode=0 or mode=1)
    414        @param skey    The scheduled key context
    415        @return CRYPT_OK if successful
    416    */
    417    int (*accel_ctr_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, int mode, symmetric_key *skey);
    418 
    419    /** Accelerated LRW
    420        @param pt      Plaintext
    421        @param ct      Ciphertext
    422        @param blocks  The number of complete blocks to process
    423        @param IV      The initial value (input/output)
    424        @param tweak   The LRW tweak
    425        @param skey    The scheduled key context
    426        @return CRYPT_OK if successful
    427    */
    428    int (*accel_lrw_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey);
    429 
    430    /** Accelerated LRW
    431        @param ct      Ciphertext
    432        @param pt      Plaintext
    433        @param blocks  The number of complete blocks to process
    434        @param IV      The initial value (input/output)
    435        @param tweak   The LRW tweak
    436        @param skey    The scheduled key context
    437        @return CRYPT_OK if successful
    438    */
    439    int (*accel_lrw_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey);
    440 
    441    /** Accelerated CCM packet (one-shot)
    442        @param key        The secret key to use
    443        @param keylen     The length of the secret key (octets)
    444        @param uskey      A previously scheduled key [optional can be NULL]
    445        @param nonce      The session nonce [use once]
    446        @param noncelen   The length of the nonce
    447        @param header     The header for the session
    448        @param headerlen  The length of the header (octets)
    449        @param pt         [out] The plaintext
    450        @param ptlen      The length of the plaintext (octets)
    451        @param ct         [out] The ciphertext
    452        @param tag        [out] The destination tag
    453        @param taglen     [in/out] The max size and resulting size of the authentication tag
    454        @param direction  Encrypt or Decrypt direction (0 or 1)
    455        @return CRYPT_OK if successful
    456    */
    457    int (*accel_ccm_memory)(
    458        const unsigned char *key,    unsigned long keylen,
    459        symmetric_key       *uskey,
    460        const unsigned char *nonce,  unsigned long noncelen,
    461        const unsigned char *header, unsigned long headerlen,
    462              unsigned char *pt,     unsigned long ptlen,
    463              unsigned char *ct,
    464              unsigned char *tag,    unsigned long *taglen,
    465                        int  direction);
    466 
    467    /** Accelerated GCM packet (one shot)
    468        @param key        The secret key
    469        @param keylen     The length of the secret key
    470        @param IV         The initial vector
    471        @param IVlen      The length of the initial vector
    472        @param adata      The additional authentication data (header)
    473        @param adatalen   The length of the adata
    474        @param pt         The plaintext
    475        @param ptlen      The length of the plaintext (ciphertext length is the same)
    476        @param ct         The ciphertext
    477        @param tag        [out] The MAC tag
    478        @param taglen     [in/out] The MAC tag length
    479        @param direction  Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT)
    480        @return CRYPT_OK on success
    481    */
    482    int (*accel_gcm_memory)(
    483        const unsigned char *key,    unsigned long keylen,
    484        const unsigned char *IV,     unsigned long IVlen,
    485        const unsigned char *adata,  unsigned long adatalen,
    486              unsigned char *pt,     unsigned long ptlen,
    487              unsigned char *ct,
    488              unsigned char *tag,    unsigned long *taglen,
    489                        int direction);
    490 
    491    /** Accelerated one shot OMAC
    492        @param key            The secret key
    493        @param keylen         The key length (octets)
    494        @param in             The message
    495        @param inlen          Length of message (octets)
    496        @param out            [out] Destination for tag
    497        @param outlen         [in/out] Initial and final size of out
    498        @return CRYPT_OK on success
    499    */
    500    int (*omac_memory)(
    501        const unsigned char *key, unsigned long keylen,
    502        const unsigned char *in,  unsigned long inlen,
    503              unsigned char *out, unsigned long *outlen);
    504 
    505    /** Accelerated one shot XCBC
    506        @param key            The secret key
    507        @param keylen         The key length (octets)
    508        @param in             The message
    509        @param inlen          Length of message (octets)
    510        @param out            [out] Destination for tag
    511        @param outlen         [in/out] Initial and final size of out
    512        @return CRYPT_OK on success
    513    */
    514    int (*xcbc_memory)(
    515        const unsigned char *key, unsigned long keylen,
    516        const unsigned char *in,  unsigned long inlen,
    517              unsigned char *out, unsigned long *outlen);
    518 
    519    /** Accelerated one shot F9
    520        @param key            The secret key
    521        @param keylen         The key length (octets)
    522        @param in             The message
    523        @param inlen          Length of message (octets)
    524        @param out            [out] Destination for tag
    525        @param outlen         [in/out] Initial and final size of out
    526        @return CRYPT_OK on success
    527        @remark Requires manual padding
    528    */
    529    int (*f9_memory)(
    530        const unsigned char *key, unsigned long keylen,
    531        const unsigned char *in,  unsigned long inlen,
    532              unsigned char *out, unsigned long *outlen);
    533 } cipher_descriptor[];
    534 
    535 #ifdef BLOWFISH
    536 int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    537 int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    538 int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    539 int blowfish_test(void);
    540 void blowfish_done(symmetric_key *skey);
    541 int blowfish_keysize(int *keysize);
    542 extern const struct ltc_cipher_descriptor blowfish_desc;
    543 #endif
    544 
    545 #ifdef RC5
    546 int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    547 int rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    548 int rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    549 int rc5_test(void);
    550 void rc5_done(symmetric_key *skey);
    551 int rc5_keysize(int *keysize);
    552 extern const struct ltc_cipher_descriptor rc5_desc;
    553 #endif
    554 
    555 #ifdef RC6
    556 int rc6_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    557 int rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    558 int rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    559 int rc6_test(void);
    560 void rc6_done(symmetric_key *skey);
    561 int rc6_keysize(int *keysize);
    562 extern const struct ltc_cipher_descriptor rc6_desc;
    563 #endif
    564 
    565 #ifdef RC2
    566 int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    567 int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    568 int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    569 int rc2_test(void);
    570 void rc2_done(symmetric_key *skey);
    571 int rc2_keysize(int *keysize);
    572 extern const struct ltc_cipher_descriptor rc2_desc;
    573 #endif
    574 
    575 #ifdef SAFERP
    576 int saferp_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    577 int saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    578 int saferp_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    579 int saferp_test(void);
    580 void saferp_done(symmetric_key *skey);
    581 int saferp_keysize(int *keysize);
    582 extern const struct ltc_cipher_descriptor saferp_desc;
    583 #endif
    584 
    585 #ifdef SAFER
    586 int safer_k64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    587 int safer_sk64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    588 int safer_k128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    589 int safer_sk128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    590 int safer_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
    591 int safer_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
    592 int safer_k64_test(void);
    593 int safer_sk64_test(void);
    594 int safer_sk128_test(void);
    595 void safer_done(symmetric_key *skey);
    596 int safer_64_keysize(int *keysize);
    597 int safer_128_keysize(int *keysize);
    598 extern const struct ltc_cipher_descriptor safer_k64_desc, safer_k128_desc, safer_sk64_desc, safer_sk128_desc;
    599 #endif
    600 
    601 #ifdef RIJNDAEL
    602 
    603 /* make aes an alias */
    604 #define aes_setup           rijndael_setup
    605 #define aes_ecb_encrypt     rijndael_ecb_encrypt
    606 #define aes_ecb_decrypt     rijndael_ecb_decrypt
    607 #define aes_test            rijndael_test
    608 #define aes_done            rijndael_done
    609 #define aes_keysize         rijndael_keysize
    610 
    611 #define aes_enc_setup           rijndael_enc_setup
    612 #define aes_enc_ecb_encrypt     rijndael_enc_ecb_encrypt
    613 #define aes_enc_keysize         rijndael_enc_keysize
    614 
    615 int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    616 int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    617 int rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    618 int rijndael_test(void);
    619 void rijndael_done(symmetric_key *skey);
    620 int rijndael_keysize(int *keysize);
    621 int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    622 int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    623 void rijndael_enc_done(symmetric_key *skey);
    624 int rijndael_enc_keysize(int *keysize);
    625 extern const struct ltc_cipher_descriptor rijndael_desc, aes_desc;
    626 extern const struct ltc_cipher_descriptor rijndael_enc_desc, aes_enc_desc;
    627 #endif
    628 
    629 #ifdef XTEA
    630 int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    631 int xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    632 int xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    633 int xtea_test(void);
    634 void xtea_done(symmetric_key *skey);
    635 int xtea_keysize(int *keysize);
    636 extern const struct ltc_cipher_descriptor xtea_desc;
    637 #endif
    638 
    639 #ifdef TWOFISH
    640 int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    641 int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    642 int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    643 int twofish_test(void);
    644 void twofish_done(symmetric_key *skey);
    645 int twofish_keysize(int *keysize);
    646 extern const struct ltc_cipher_descriptor twofish_desc;
    647 #endif
    648 
    649 #ifdef DES
    650 int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    651 int des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    652 int des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    653 int des_test(void);
    654 void des_done(symmetric_key *skey);
    655 int des_keysize(int *keysize);
    656 int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    657 int des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    658 int des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    659 int des3_test(void);
    660 void des3_done(symmetric_key *skey);
    661 int des3_keysize(int *keysize);
    662 extern const struct ltc_cipher_descriptor des_desc, des3_desc;
    663 #endif
    664 
    665 #ifdef CAST5
    666 int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    667 int cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    668 int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    669 int cast5_test(void);
    670 void cast5_done(symmetric_key *skey);
    671 int cast5_keysize(int *keysize);
    672 extern const struct ltc_cipher_descriptor cast5_desc;
    673 #endif
    674 
    675 #ifdef NOEKEON
    676 int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    677 int noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    678 int noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    679 int noekeon_test(void);
    680 void noekeon_done(symmetric_key *skey);
    681 int noekeon_keysize(int *keysize);
    682 extern const struct ltc_cipher_descriptor noekeon_desc;
    683 #endif
    684 
    685 #ifdef SKIPJACK
    686 int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    687 int skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    688 int skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    689 int skipjack_test(void);
    690 void skipjack_done(symmetric_key *skey);
    691 int skipjack_keysize(int *keysize);
    692 extern const struct ltc_cipher_descriptor skipjack_desc;
    693 #endif
    694 
    695 #ifdef KHAZAD
    696 int khazad_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    697 int khazad_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    698 int khazad_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    699 int khazad_test(void);
    700 void khazad_done(symmetric_key *skey);
    701 int khazad_keysize(int *keysize);
    702 extern const struct ltc_cipher_descriptor khazad_desc;
    703 #endif
    704 
    705 #ifdef ANUBIS
    706 int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    707 int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    708 int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    709 int anubis_test(void);
    710 void anubis_done(symmetric_key *skey);
    711 int anubis_keysize(int *keysize);
    712 extern const struct ltc_cipher_descriptor anubis_desc;
    713 #endif
    714 
    715 #ifdef KSEED
    716 int kseed_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    717 int kseed_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    718 int kseed_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    719 int kseed_test(void);
    720 void kseed_done(symmetric_key *skey);
    721 int kseed_keysize(int *keysize);
    722 extern const struct ltc_cipher_descriptor kseed_desc;
    723 #endif
    724 
    725 #ifdef LTC_KASUMI
    726 int kasumi_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
    727 int kasumi_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
    728 int kasumi_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
    729 int kasumi_test(void);
    730 void kasumi_done(symmetric_key *skey);
    731 int kasumi_keysize(int *keysize);
    732 extern const struct ltc_cipher_descriptor kasumi_desc;
    733 #endif
    734 
    735 #ifdef LTC_ECB_MODE
    736 int ecb_start(int cipher, const unsigned char *key,
    737               int keylen, int num_rounds, symmetric_ECB *ecb);
    738 int ecb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_ECB *ecb);
    739 int ecb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_ECB *ecb);
    740 int ecb_done(symmetric_ECB *ecb);
    741 #endif
    742 
    743 #ifdef LTC_CFB_MODE
    744 int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key,
    745               int keylen, int num_rounds, symmetric_CFB *cfb);
    746 int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CFB *cfb);
    747 int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CFB *cfb);
    748 int cfb_getiv(unsigned char *IV, unsigned long *len, symmetric_CFB *cfb);
    749 int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb);
    750 int cfb_done(symmetric_CFB *cfb);
    751 #endif
    752 
    753 #ifdef LTC_OFB_MODE
    754 int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key,
    755               int keylen, int num_rounds, symmetric_OFB *ofb);
    756 int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb);
    757 int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb);
    758 int ofb_getiv(unsigned char *IV, unsigned long *len, symmetric_OFB *ofb);
    759 int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb);
    760 int ofb_done(symmetric_OFB *ofb);
    761 #endif
    762 
    763 #ifdef LTC_CBC_MODE
    764 int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key,
    765                int keylen, int num_rounds, symmetric_CBC *cbc);
    766 int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc);
    767 int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc);
    768 int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc);
    769 int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc);
    770 int cbc_done(symmetric_CBC *cbc);
    771 #endif
    772 
    773 #ifdef LTC_CTR_MODE
    774 
    775 #define CTR_COUNTER_LITTLE_ENDIAN    0
    776 #define CTR_COUNTER_BIG_ENDIAN       1
    777 #define LTC_CTR_RFC3686              2
    778 
    779 int ctr_start(               int   cipher,
    780               const unsigned char *IV,
    781               const unsigned char *key,       int keylen,
    782                              int  num_rounds, int ctr_mode,
    783                    symmetric_CTR *ctr);
    784 int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr);
    785 int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr);
    786 int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr);
    787 int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr);
    788 int ctr_done(symmetric_CTR *ctr);
    789 int ctr_test(void);
    790 #endif
    791 
    792 #ifdef LTC_LRW_MODE
    793 
    794 #define LRW_ENCRYPT 0
    795 #define LRW_DECRYPT 1
    796 
    797 int lrw_start(               int   cipher,
    798               const unsigned char *IV,
    799               const unsigned char *key,       int keylen,
    800               const unsigned char *tweak,
    801                              int  num_rounds,
    802                    symmetric_LRW *lrw);
    803 int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw);
    804 int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw);
    805 int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw);
    806 int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw);
    807 int lrw_done(symmetric_LRW *lrw);
    808 int lrw_test(void);
    809 
    810 /* don't call */
    811 int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw);
    812 #endif
    813 
    814 #ifdef LTC_F8_MODE
    815 int f8_start(                int  cipher, const unsigned char *IV,
    816              const unsigned char *key,                    int  keylen,
    817              const unsigned char *salt_key,               int  skeylen,
    818                              int  num_rounds,   symmetric_F8  *f8);
    819 int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8);
    820 int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8);
    821 int f8_getiv(unsigned char *IV, unsigned long *len, symmetric_F8 *f8);
    822 int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8);
    823 int f8_done(symmetric_F8 *f8);
    824 int f8_test_mode(void);
    825 #endif
    826 
    827 
    828 int find_cipher(const char *name);
    829 int find_cipher_any(const char *name, int blocklen, int keylen);
    830 int find_cipher_id(unsigned char ID);
    831 int register_cipher(const struct ltc_cipher_descriptor *cipher);
    832 int unregister_cipher(const struct ltc_cipher_descriptor *cipher);
    833 int cipher_is_valid(int idx);
    834 
    835 LTC_MUTEX_PROTO(ltc_cipher_mutex)
    836 
    837 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_cipher.h,v $ */
    838 /* $Revision: 1.46 $ */
    839 /* $Date: 2006/11/13 23:09:38 $ */
    840