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
7struct blowfish_key {
8   ulong32 S[4][256];
9   ulong32 K[18];
10};
11#endif
12
13#ifdef RC5
14struct rc5_key {
15   int rounds;
16   ulong32 K[50];
17};
18#endif
19
20#ifdef RC6
21struct rc6_key {
22   ulong32 K[44];
23};
24#endif
25
26#ifdef SAFERP
27struct saferp_key {
28   unsigned char K[33][16];
29   long rounds;
30};
31#endif
32
33#ifdef RIJNDAEL
34struct rijndael_key {
35   ulong32 eK[60], dK[60];
36   int Nr;
37};
38#endif
39
40#ifdef KSEED
41struct kseed_key {
42    ulong32 K[32], dK[32];
43};
44#endif
45
46#ifdef LTC_KASUMI
47struct 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
55struct 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))
81typedef unsigned char safer_block_t[SAFER_BLOCK_LEN];
82typedef unsigned char safer_key_t[SAFER_KEY_LEN];
83struct safer_key { safer_key_t key; };
84#endif
85
86#ifdef RC2
87struct rc2_key { unsigned xkey[64]; };
88#endif
89
90#ifdef DES
91struct des_key {
92    ulong32 ek[32], dk[32];
93};
94
95struct des3_key {
96    ulong32 ek[3][32], dk[3][32];
97};
98#endif
99
100#ifdef CAST5
101struct cast5_key {
102    ulong32 K[32], keylen;
103};
104#endif
105
106#ifdef NOEKEON
107struct noekeon_key {
108    ulong32 K[4], dK[4];
109};
110#endif
111
112#ifdef SKIPJACK
113struct skipjack_key {
114    unsigned char key[10];
115};
116#endif
117
118#ifdef KHAZAD
119struct khazad_key {
120   ulong64 roundKeyEnc[8 + 1];
121   ulong64 roundKeyDec[8 + 1];
122};
123#endif
124
125#ifdef ANUBIS
126struct anubis_key {
127   int keyBits;
128   int R;
129   ulong32 roundKeyEnc[18 + 1][4];
130   ulong32 roundKeyDec[18 + 1][4];
131};
132#endif
133
134typedef 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 */
192typedef 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 */
204typedef 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 */
222typedef 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 */
238typedef 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 */
253typedef 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 */
274typedef 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 */
299typedef 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 */
318extern 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
536int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
537int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
538int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
539int blowfish_test(void);
540void blowfish_done(symmetric_key *skey);
541int blowfish_keysize(int *keysize);
542extern const struct ltc_cipher_descriptor blowfish_desc;
543#endif
544
545#ifdef RC5
546int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
547int rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
548int rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
549int rc5_test(void);
550void rc5_done(symmetric_key *skey);
551int rc5_keysize(int *keysize);
552extern const struct ltc_cipher_descriptor rc5_desc;
553#endif
554
555#ifdef RC6
556int rc6_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
557int rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
558int rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
559int rc6_test(void);
560void rc6_done(symmetric_key *skey);
561int rc6_keysize(int *keysize);
562extern const struct ltc_cipher_descriptor rc6_desc;
563#endif
564
565#ifdef RC2
566int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
567int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
568int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
569int rc2_test(void);
570void rc2_done(symmetric_key *skey);
571int rc2_keysize(int *keysize);
572extern const struct ltc_cipher_descriptor rc2_desc;
573#endif
574
575#ifdef SAFERP
576int saferp_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
577int saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
578int saferp_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
579int saferp_test(void);
580void saferp_done(symmetric_key *skey);
581int saferp_keysize(int *keysize);
582extern const struct ltc_cipher_descriptor saferp_desc;
583#endif
584
585#ifdef SAFER
586int safer_k64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
587int safer_sk64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
588int safer_k128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
589int safer_sk128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
590int safer_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key);
591int safer_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key);
592int safer_k64_test(void);
593int safer_sk64_test(void);
594int safer_sk128_test(void);
595void safer_done(symmetric_key *skey);
596int safer_64_keysize(int *keysize);
597int safer_128_keysize(int *keysize);
598extern 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
615int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
616int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
617int rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
618int rijndael_test(void);
619void rijndael_done(symmetric_key *skey);
620int rijndael_keysize(int *keysize);
621int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
622int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
623void rijndael_enc_done(symmetric_key *skey);
624int rijndael_enc_keysize(int *keysize);
625extern const struct ltc_cipher_descriptor rijndael_desc, aes_desc;
626extern const struct ltc_cipher_descriptor rijndael_enc_desc, aes_enc_desc;
627#endif
628
629#ifdef XTEA
630int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
631int xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
632int xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
633int xtea_test(void);
634void xtea_done(symmetric_key *skey);
635int xtea_keysize(int *keysize);
636extern const struct ltc_cipher_descriptor xtea_desc;
637#endif
638
639#ifdef TWOFISH
640int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
641int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
642int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
643int twofish_test(void);
644void twofish_done(symmetric_key *skey);
645int twofish_keysize(int *keysize);
646extern const struct ltc_cipher_descriptor twofish_desc;
647#endif
648
649#ifdef DES
650int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
651int des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
652int des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
653int des_test(void);
654void des_done(symmetric_key *skey);
655int des_keysize(int *keysize);
656int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
657int des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
658int des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
659int des3_test(void);
660void des3_done(symmetric_key *skey);
661int des3_keysize(int *keysize);
662extern const struct ltc_cipher_descriptor des_desc, des3_desc;
663#endif
664
665#ifdef CAST5
666int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
667int cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
668int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
669int cast5_test(void);
670void cast5_done(symmetric_key *skey);
671int cast5_keysize(int *keysize);
672extern const struct ltc_cipher_descriptor cast5_desc;
673#endif
674
675#ifdef NOEKEON
676int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
677int noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
678int noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
679int noekeon_test(void);
680void noekeon_done(symmetric_key *skey);
681int noekeon_keysize(int *keysize);
682extern const struct ltc_cipher_descriptor noekeon_desc;
683#endif
684
685#ifdef SKIPJACK
686int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
687int skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
688int skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
689int skipjack_test(void);
690void skipjack_done(symmetric_key *skey);
691int skipjack_keysize(int *keysize);
692extern const struct ltc_cipher_descriptor skipjack_desc;
693#endif
694
695#ifdef KHAZAD
696int khazad_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
697int khazad_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
698int khazad_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
699int khazad_test(void);
700void khazad_done(symmetric_key *skey);
701int khazad_keysize(int *keysize);
702extern const struct ltc_cipher_descriptor khazad_desc;
703#endif
704
705#ifdef ANUBIS
706int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
707int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
708int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
709int anubis_test(void);
710void anubis_done(symmetric_key *skey);
711int anubis_keysize(int *keysize);
712extern const struct ltc_cipher_descriptor anubis_desc;
713#endif
714
715#ifdef KSEED
716int kseed_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
717int kseed_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
718int kseed_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
719int kseed_test(void);
720void kseed_done(symmetric_key *skey);
721int kseed_keysize(int *keysize);
722extern const struct ltc_cipher_descriptor kseed_desc;
723#endif
724
725#ifdef LTC_KASUMI
726int kasumi_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
727int kasumi_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
728int kasumi_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
729int kasumi_test(void);
730void kasumi_done(symmetric_key *skey);
731int kasumi_keysize(int *keysize);
732extern const struct ltc_cipher_descriptor kasumi_desc;
733#endif
734
735#ifdef LTC_ECB_MODE
736int ecb_start(int cipher, const unsigned char *key,
737              int keylen, int num_rounds, symmetric_ECB *ecb);
738int ecb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_ECB *ecb);
739int ecb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_ECB *ecb);
740int ecb_done(symmetric_ECB *ecb);
741#endif
742
743#ifdef LTC_CFB_MODE
744int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key,
745              int keylen, int num_rounds, symmetric_CFB *cfb);
746int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CFB *cfb);
747int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CFB *cfb);
748int cfb_getiv(unsigned char *IV, unsigned long *len, symmetric_CFB *cfb);
749int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb);
750int cfb_done(symmetric_CFB *cfb);
751#endif
752
753#ifdef LTC_OFB_MODE
754int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key,
755              int keylen, int num_rounds, symmetric_OFB *ofb);
756int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb);
757int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb);
758int ofb_getiv(unsigned char *IV, unsigned long *len, symmetric_OFB *ofb);
759int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb);
760int ofb_done(symmetric_OFB *ofb);
761#endif
762
763#ifdef LTC_CBC_MODE
764int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key,
765               int keylen, int num_rounds, symmetric_CBC *cbc);
766int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc);
767int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc);
768int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc);
769int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc);
770int 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
779int 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);
784int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr);
785int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr);
786int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr);
787int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr);
788int ctr_done(symmetric_CTR *ctr);
789int ctr_test(void);
790#endif
791
792#ifdef LTC_LRW_MODE
793
794#define LRW_ENCRYPT 0
795#define LRW_DECRYPT 1
796
797int 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);
803int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw);
804int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw);
805int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw);
806int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw);
807int lrw_done(symmetric_LRW *lrw);
808int lrw_test(void);
809
810/* don't call */
811int 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
815int 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);
819int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8);
820int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8);
821int f8_getiv(unsigned char *IV, unsigned long *len, symmetric_F8 *f8);
822int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8);
823int f8_done(symmetric_F8 *f8);
824int f8_test_mode(void);
825#endif
826
827
828int find_cipher(const char *name);
829int find_cipher_any(const char *name, int blocklen, int keylen);
830int find_cipher_id(unsigned char ID);
831int register_cipher(const struct ltc_cipher_descriptor *cipher);
832int unregister_cipher(const struct ltc_cipher_descriptor *cipher);
833int cipher_is_valid(int idx);
834
835LTC_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