1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3 
4 /* ---- SYMMETRIC KEY STUFF -----
5  *
6  * We put each of the ciphers scheduled keys in their own structs then we put all of
7  * the key formats in one union.  This makes the function prototypes easier to use.
8  */
9 #ifdef LTC_BLOWFISH
10 struct blowfish_key {
11    ulong32 S[4][256];
12    ulong32 K[18];
13 };
14 #endif
15 
16 #ifdef LTC_RC5
17 struct rc5_key {
18    int rounds;
19    ulong32 K[50];
20 };
21 #endif
22 
23 #ifdef LTC_RC6
24 struct rc6_key {
25    ulong32 K[44];
26 };
27 #endif
28 
29 #ifdef LTC_SAFERP
30 struct saferp_key {
31    unsigned char K[33][16];
32    long rounds;
33 };
34 #endif
35 
36 #ifdef LTC_RIJNDAEL
37 struct rijndael_key {
38    unsigned char K[(60 + 60 + 4) * sizeof(ulong32)];
39    ulong32 *eK;
40    ulong32 *dK;
41    int Nr;
42 };
43 #endif
44 
45 #ifdef LTC_KSEED
46 struct kseed_key {
47     ulong32 K[32], dK[32];
48 };
49 #endif
50 
51 #ifdef LTC_KASUMI
52 struct kasumi_key {
53     ulong32 KLi1[8], KLi2[8],
54             KOi1[8], KOi2[8], KOi3[8],
55             KIi1[8], KIi2[8], KIi3[8];
56 };
57 #endif
58 
59 #ifdef LTC_XTEA
60 struct xtea_key {
61    unsigned long A[32], B[32];
62 };
63 #endif
64 
65 #ifdef LTC_TWOFISH
66 #ifndef LTC_TWOFISH_SMALL
67    struct twofish_key {
68       ulong32 S[4][256], K[40];
69    };
70 #else
71    struct twofish_key {
72       ulong32 K[40];
73       unsigned char S[32], start;
74    };
75 #endif
76 #endif
77 
78 #ifdef LTC_SAFER
79 #define LTC_SAFER_K64_DEFAULT_NOF_ROUNDS     6
80 #define LTC_SAFER_K128_DEFAULT_NOF_ROUNDS   10
81 #define LTC_SAFER_SK64_DEFAULT_NOF_ROUNDS    8
82 #define LTC_SAFER_SK128_DEFAULT_NOF_ROUNDS  10
83 #define LTC_SAFER_MAX_NOF_ROUNDS            13
84 #define LTC_SAFER_BLOCK_LEN                  8
85 #define LTC_SAFER_KEY_LEN     (1 + LTC_SAFER_BLOCK_LEN * (1 + 2 * LTC_SAFER_MAX_NOF_ROUNDS))
86 typedef unsigned char safer_block_t[LTC_SAFER_BLOCK_LEN];
87 typedef unsigned char safer_key_t[LTC_SAFER_KEY_LEN];
88 struct safer_key { safer_key_t key; };
89 #endif
90 
91 #ifdef LTC_RC2
92 struct rc2_key { unsigned xkey[64]; };
93 #endif
94 
95 #ifdef LTC_DES
96 struct des_key {
97     ulong32 ek[32], dk[32];
98 };
99 
100 struct des3_key {
101     ulong32 ek[3][32], dk[3][32];
102 };
103 #endif
104 
105 #ifdef LTC_CAST5
106 struct cast5_key {
107     ulong32 K[32], keylen;
108 };
109 #endif
110 
111 #ifdef LTC_NOEKEON
112 struct noekeon_key {
113     ulong32 K[4], dK[4];
114 };
115 #endif
116 
117 #ifdef LTC_SKIPJACK
118 struct skipjack_key {
119     unsigned char key[10];
120 };
121 #endif
122 
123 #ifdef LTC_KHAZAD
124 struct khazad_key {
125    ulong64 roundKeyEnc[8 + 1];
126    ulong64 roundKeyDec[8 + 1];
127 };
128 #endif
129 
130 #ifdef LTC_ANUBIS
131 struct anubis_key {
132    ulong32 roundKeyEnc[18 + 1][4];
133    ulong32 roundKeyDec[18 + 1][4];
134    int keyBits;
135    int R;
136 };
137 #endif
138 
139 #ifdef LTC_MULTI2
140 struct multi2_key {
141     ulong32 uk[8];
142     int N;
143 };
144 #endif
145 
146 #ifdef LTC_CAMELLIA
147 struct camellia_key {
148     ulong64 kw[4], k[24], kl[6];
149     int R;
150 };
151 #endif
152 
153 #ifdef LTC_IDEA
154 /* rounds */
155 #define LTC_IDEA_ROUNDS 8
156 /* key schedule length in # of unsigned shorts */
157 #define LTC_IDEA_KEYLEN 6*LTC_IDEA_ROUNDS+4
158 struct idea_key {
159    unsigned short int ek[LTC_IDEA_KEYLEN]; /* enc key */
160    unsigned short int dk[LTC_IDEA_KEYLEN]; /* dec key */
161 };
162 #endif
163 
164 #ifdef LTC_SERPENT
165 struct serpent_key {
166    ulong32 k[33*4];
167 };
168 #endif
169 
170 #ifdef LTC_TEA
171 struct tea_key {
172    ulong32 k[4];
173 };
174 #endif
175 
176 typedef union Symmetric_key {
177 #ifdef LTC_DES
178    struct des_key des;
179    struct des3_key des3;
180 #endif
181 #ifdef LTC_RC2
182    struct rc2_key rc2;
183 #endif
184 #ifdef LTC_SAFER
185    struct safer_key safer;
186 #endif
187 #ifdef LTC_TWOFISH
188    struct twofish_key  twofish;
189 #endif
190 #ifdef LTC_BLOWFISH
191    struct blowfish_key blowfish;
192 #endif
193 #ifdef LTC_RC5
194    struct rc5_key      rc5;
195 #endif
196 #ifdef LTC_RC6
197    struct rc6_key      rc6;
198 #endif
199 #ifdef LTC_SAFERP
200    struct saferp_key   saferp;
201 #endif
202 #ifdef LTC_RIJNDAEL
203    struct rijndael_key rijndael;
204 #endif
205 #ifdef LTC_XTEA
206    struct xtea_key     xtea;
207 #endif
208 #ifdef LTC_CAST5
209    struct cast5_key    cast5;
210 #endif
211 #ifdef LTC_NOEKEON
212    struct noekeon_key  noekeon;
213 #endif
214 #ifdef LTC_SKIPJACK
215    struct skipjack_key skipjack;
216 #endif
217 #ifdef LTC_KHAZAD
218    struct khazad_key   khazad;
219 #endif
220 #ifdef LTC_ANUBIS
221    struct anubis_key   anubis;
222 #endif
223 #ifdef LTC_KSEED
224    struct kseed_key    kseed;
225 #endif
226 #ifdef LTC_KASUMI
227    struct kasumi_key   kasumi;
228 #endif
229 #ifdef LTC_MULTI2
230    struct multi2_key   multi2;
231 #endif
232 #ifdef LTC_CAMELLIA
233    struct camellia_key camellia;
234 #endif
235 #ifdef LTC_IDEA
236    struct idea_key     idea;
237 #endif
238 #ifdef LTC_SERPENT
239    struct serpent_key  serpent;
240 #endif
241 #ifdef LTC_TEA
242    struct tea_key      tea;
243 #endif
244    void   *data;
245 } symmetric_key;
246 
247 #ifdef LTC_ECB_MODE
248 /** A block cipher ECB structure */
249 typedef struct {
250    /** The scheduled key */
251    symmetric_key       key;
252    /** The index of the cipher chosen */
253    int                 cipher,
254    /** The block size of the given cipher */
255                        blocklen;
256 } symmetric_ECB;
257 #endif
258 
259 #ifdef LTC_CFB_MODE
260 /** A block cipher CFB structure */
261 typedef struct {
262    /** The current IV */
263    unsigned char       IV[MAXBLOCKSIZE],
264    /** The pad used to encrypt/decrypt */
265                        pad[MAXBLOCKSIZE];
266    /** The scheduled key */
267    symmetric_key       key;
268    /** The index of the cipher chosen */
269    int                 cipher,
270    /** The block size of the given cipher */
271                        blocklen,
272    /** The padding offset */
273                        padlen;
274 } symmetric_CFB;
275 #endif
276 
277 #ifdef LTC_OFB_MODE
278 /** A block cipher OFB structure */
279 typedef struct {
280    /** The current IV */
281    unsigned char       IV[MAXBLOCKSIZE];
282    /** The scheduled key */
283    symmetric_key       key;
284    /** The index of the cipher chosen */
285    int                 cipher,
286    /** The block size of the given cipher */
287                        blocklen,
288    /** The padding offset */
289                        padlen;
290 } symmetric_OFB;
291 #endif
292 
293 #ifdef LTC_CBC_MODE
294 /** A block cipher CBC structure */
295 typedef struct {
296    /** The current IV */
297    unsigned char       IV[MAXBLOCKSIZE];
298    /** The scheduled key */
299    symmetric_key       key;
300    /** The index of the cipher chosen */
301    int                 cipher,
302    /** The block size of the given cipher */
303                        blocklen;
304 } symmetric_CBC;
305 #endif
306 
307 
308 #ifdef LTC_CTR_MODE
309 /** A block cipher CTR structure */
310 typedef struct {
311    /** The counter */
312    unsigned char       ctr[MAXBLOCKSIZE];
313    /** The pad used to encrypt/decrypt */
314    unsigned char       pad[MAXBLOCKSIZE];
315    /** The scheduled key */
316    symmetric_key       key;
317 
318    /** The index of the cipher chosen */
319    int                 cipher,
320    /** The block size of the given cipher */
321                        blocklen,
322    /** The padding offset */
323                        padlen,
324    /** The mode (endianess) of the CTR, 0==little, 1==big */
325                        mode,
326    /** counter width */
327                        ctrlen;
328 } symmetric_CTR;
329 #endif
330 
331 
332 #ifdef LTC_LRW_MODE
333 /** A LRW structure */
334 typedef struct {
335     /** The current IV */
336     unsigned char     IV[16],
337 
338     /** the tweak key */
339                       tweak[16],
340 
341     /** The current pad, it's the product of the first 15 bytes against the tweak key */
342                       pad[16];
343 
344     /** The scheduled symmetric key */
345     symmetric_key     key;
346 
347 #ifdef LTC_LRW_TABLES
348     /** The pre-computed multiplication table */
349     unsigned char     PC[16][256][16];
350 #endif
351 
352     /** The index of the cipher chosen (must be a 128-bit block cipher) */
353     int               cipher;
354 } symmetric_LRW;
355 #endif
356 
357 #ifdef LTC_F8_MODE
358 /** A block cipher F8 structure */
359 typedef struct {
360    /** The current IV */
361    unsigned char       IV[MAXBLOCKSIZE],
362                        MIV[MAXBLOCKSIZE];
363    /** The scheduled key */
364    symmetric_key       key;
365    /** The index of the cipher chosen */
366    int                 cipher,
367    /** The block size of the given cipher */
368                        blocklen,
369    /** The padding offset */
370                        padlen;
371    /** Current block count */
372    ulong32             blockcnt;
373 } symmetric_F8;
374 #endif
375 
376 
377 /** cipher descriptor table, last entry has "name == NULL" to mark the end of table */
378 extern const struct ltc_cipher_descriptor {
379    /** name of cipher */
380    const char *name;
381    /** internal ID */
382    unsigned char ID;
383    /** min keysize (octets) */
384    int  min_key_length,
385    /** max keysize (octets) */
386         max_key_length,
387    /** block size (octets) */
388         block_length,
389    /** default number of rounds */
390         default_rounds;
391    /** Setup the cipher
392       @param key         The input symmetric key
393       @param keylen      The length of the input key (octets)
394       @param num_rounds  The requested number of rounds (0==default)
395       @param skey        [out] The destination of the scheduled key
396       @return CRYPT_OK if successful
397    */
398    int  (*setup)(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
399    /** Encrypt a block
400       @param pt      The plaintext
401       @param ct      [out] The ciphertext
402       @param skey    The scheduled key
403       @return CRYPT_OK if successful
404    */
405    int (*ecb_encrypt)(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
406    /** Decrypt a block
407       @param ct      The ciphertext
408       @param pt      [out] The plaintext
409       @param skey    The scheduled key
410       @return CRYPT_OK if successful
411    */
412    int (*ecb_decrypt)(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
413    /** Test the block cipher
414        @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
415    */
416    int (*test)(void);
417 
418    /** Terminate the context
419       @param skey    The scheduled key
420    */
421    void (*done)(symmetric_key *skey);
422 
423    /** Determine a key size
424        @param keysize    [in/out] The size of the key desired and the suggested size
425        @return CRYPT_OK if successful
426    */
427    int  (*keysize)(int *keysize);
428 
429 /** Accelerators **/
430    /** Accelerated ECB encryption
431        @param pt      Plaintext
432        @param ct      Ciphertext
433        @param blocks  The number of complete blocks to process
434        @param skey    The scheduled key context
435        @return CRYPT_OK if successful
436    */
437    int (*accel_ecb_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, const symmetric_key *skey);
438 
439    /** Accelerated ECB decryption
440        @param pt      Plaintext
441        @param ct      Ciphertext
442        @param blocks  The number of complete blocks to process
443        @param skey    The scheduled key context
444        @return CRYPT_OK if successful
445    */
446    int (*accel_ecb_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, const symmetric_key *skey);
447 
448    /** Accelerated CBC encryption
449        @param pt      Plaintext
450        @param ct      Ciphertext
451        @param blocks  The number of complete blocks to process
452        @param IV      The initial value (input/output)
453        @param skey    The scheduled key context
454        @return CRYPT_OK if successful
455    */
456    int (*accel_cbc_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, symmetric_key *skey);
457 
458    /** Accelerated CBC decryption
459        @param pt      Plaintext
460        @param ct      Ciphertext
461        @param blocks  The number of complete blocks to process
462        @param IV      The initial value (input/output)
463        @param skey    The scheduled key context
464        @return CRYPT_OK if successful
465    */
466    int (*accel_cbc_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, symmetric_key *skey);
467 
468    /** Accelerated CTR encryption
469        @param pt      Plaintext
470        @param ct      Ciphertext
471        @param blocks  The number of complete blocks to process
472        @param IV      The initial value (input/output)
473        @param mode    little or big endian counter (mode=0 or mode=1)
474        @param skey    The scheduled key context
475        @return CRYPT_OK if successful
476    */
477    int (*accel_ctr_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, int mode, symmetric_key *skey);
478 
479    /** Accelerated LRW
480        @param pt      Plaintext
481        @param ct      Ciphertext
482        @param blocks  The number of complete blocks to process
483        @param IV      The initial value (input/output)
484        @param tweak   The LRW tweak
485        @param skey    The scheduled key context
486        @return CRYPT_OK if successful
487    */
488    int (*accel_lrw_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey);
489 
490    /** Accelerated LRW
491        @param ct      Ciphertext
492        @param pt      Plaintext
493        @param blocks  The number of complete blocks to process
494        @param IV      The initial value (input/output)
495        @param tweak   The LRW tweak
496        @param skey    The scheduled key context
497        @return CRYPT_OK if successful
498    */
499    int (*accel_lrw_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey);
500 
501    /** Accelerated CCM packet (one-shot)
502        @param key        The secret key to use
503        @param keylen     The length of the secret key (octets)
504        @param uskey      A previously scheduled key [optional can be NULL]
505        @param nonce      The session nonce [use once]
506        @param noncelen   The length of the nonce
507        @param header     The header for the session
508        @param headerlen  The length of the header (octets)
509        @param pt         [out] The plaintext
510        @param ptlen      The length of the plaintext (octets)
511        @param ct         [out] The ciphertext
512        @param tag        [out] The destination tag
513        @param taglen     [in/out] The max size and resulting size of the authentication tag
514        @param direction  Encrypt or Decrypt direction (0 or 1)
515        @return CRYPT_OK if successful
516    */
517    int (*accel_ccm_memory)(
518        const unsigned char *key,    unsigned long keylen,
519        symmetric_key       *uskey,
520        const unsigned char *nonce,  unsigned long noncelen,
521        const unsigned char *header, unsigned long headerlen,
522              unsigned char *pt,     unsigned long ptlen,
523              unsigned char *ct,
524              unsigned char *tag,    unsigned long *taglen,
525                        int  direction);
526 
527    /** Accelerated GCM packet (one shot)
528        @param key        The secret key
529        @param keylen     The length of the secret key
530        @param IV         The initialization vector
531        @param IVlen      The length of the initialization vector
532        @param adata      The additional authentication data (header)
533        @param adatalen   The length of the adata
534        @param pt         The plaintext
535        @param ptlen      The length of the plaintext (ciphertext length is the same)
536        @param ct         The ciphertext
537        @param tag        [out] The MAC tag
538        @param taglen     [in/out] The MAC tag length
539        @param direction  Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT)
540        @return CRYPT_OK on success
541    */
542    int (*accel_gcm_memory)(
543        const unsigned char *key,    unsigned long keylen,
544        const unsigned char *IV,     unsigned long IVlen,
545        const unsigned char *adata,  unsigned long adatalen,
546              unsigned char *pt,     unsigned long ptlen,
547              unsigned char *ct,
548              unsigned char *tag,    unsigned long *taglen,
549                        int direction);
550 
551    /** Accelerated one shot LTC_OMAC
552        @param key            The secret key
553        @param keylen         The key length (octets)
554        @param in             The message
555        @param inlen          Length of message (octets)
556        @param out            [out] Destination for tag
557        @param outlen         [in/out] Initial and final size of out
558        @return CRYPT_OK on success
559    */
560    int (*omac_memory)(
561        const unsigned char *key, unsigned long keylen,
562        const unsigned char *in,  unsigned long inlen,
563              unsigned char *out, unsigned long *outlen);
564 
565    /** Accelerated one shot XCBC
566        @param key            The secret key
567        @param keylen         The key length (octets)
568        @param in             The message
569        @param inlen          Length of message (octets)
570        @param out            [out] Destination for tag
571        @param outlen         [in/out] Initial and final size of out
572        @return CRYPT_OK on success
573    */
574    int (*xcbc_memory)(
575        const unsigned char *key, unsigned long keylen,
576        const unsigned char *in,  unsigned long inlen,
577              unsigned char *out, unsigned long *outlen);
578 
579    /** Accelerated one shot F9
580        @param key            The secret key
581        @param keylen         The key length (octets)
582        @param in             The message
583        @param inlen          Length of message (octets)
584        @param out            [out] Destination for tag
585        @param outlen         [in/out] Initial and final size of out
586        @return CRYPT_OK on success
587        @remark Requires manual padding
588    */
589    int (*f9_memory)(
590        const unsigned char *key, unsigned long keylen,
591        const unsigned char *in,  unsigned long inlen,
592              unsigned char *out, unsigned long *outlen);
593 
594    /** Accelerated XTS encryption
595        @param pt      Plaintext
596        @param ct      Ciphertext
597        @param blocks  The number of complete blocks to process
598        @param tweak   The 128-bit encryption tweak (input/output).
599                       The tweak should not be encrypted on input, but
600                       next tweak will be copied encrypted on output.
601        @param skey1   The first scheduled key context
602        @param skey2   The second scheduled key context
603        @return CRYPT_OK if successful
604     */
605     int (*accel_xts_encrypt)(const unsigned char *pt, unsigned char *ct,
606         unsigned long blocks, unsigned char *tweak,
607         const symmetric_key *skey1, const symmetric_key *skey2);
608 
609     /** Accelerated XTS decryption
610         @param ct      Ciphertext
611         @param pt      Plaintext
612         @param blocks  The number of complete blocks to process
613         @param tweak   The 128-bit encryption tweak (input/output).
614                        The tweak should not be encrypted on input, but
615                        next tweak will be copied encrypted on output.
616         @param skey1   The first scheduled key context
617         @param skey2   The second scheduled key context
618         @return CRYPT_OK if successful
619      */
620      int (*accel_xts_decrypt)(const unsigned char *ct, unsigned char *pt,
621          unsigned long blocks, unsigned char *tweak,
622          const symmetric_key *skey1, const symmetric_key *skey2);
623 } *cipher_descriptor[];
624 
625 #ifdef LTC_BLOWFISH
626 int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
627 int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
628 int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
629 int blowfish_test(void);
630 void blowfish_done(symmetric_key *skey);
631 int blowfish_keysize(int *keysize);
632 extern const struct ltc_cipher_descriptor blowfish_desc;
633 #endif
634 
635 #ifdef LTC_RC5
636 int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
637 int rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
638 int rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
639 int rc5_test(void);
640 void rc5_done(symmetric_key *skey);
641 int rc5_keysize(int *keysize);
642 extern const struct ltc_cipher_descriptor rc5_desc;
643 #endif
644 
645 #ifdef LTC_RC6
646 int rc6_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
647 int rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
648 int rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
649 int rc6_test(void);
650 void rc6_done(symmetric_key *skey);
651 int rc6_keysize(int *keysize);
652 extern const struct ltc_cipher_descriptor rc6_desc;
653 #endif
654 
655 #ifdef LTC_RC2
656 int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
657 int rc2_setup_ex(const unsigned char *key, int keylen, int bits, int num_rounds, symmetric_key *skey);
658 int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
659 int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
660 int rc2_test(void);
661 void rc2_done(symmetric_key *skey);
662 int rc2_keysize(int *keysize);
663 extern const struct ltc_cipher_descriptor rc2_desc;
664 #endif
665 
666 #ifdef LTC_SAFERP
667 int saferp_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
668 int saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
669 int saferp_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
670 int saferp_test(void);
671 void saferp_done(symmetric_key *skey);
672 int saferp_keysize(int *keysize);
673 extern const struct ltc_cipher_descriptor saferp_desc;
674 #endif
675 
676 #ifdef LTC_SAFER
677 int safer_k64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
678 int safer_sk64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
679 int safer_k128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
680 int safer_sk128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
681 int safer_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
682 int safer_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
683 int safer_k64_test(void);
684 int safer_sk64_test(void);
685 int safer_sk128_test(void);
686 void safer_done(symmetric_key *skey);
687 int safer_64_keysize(int *keysize);
688 int safer_128_keysize(int *keysize);
689 extern const struct ltc_cipher_descriptor safer_k64_desc, safer_k128_desc, safer_sk64_desc, safer_sk128_desc;
690 #endif
691 
692 #ifdef LTC_RIJNDAEL
693 /* declare aes properly now */
694 int aes_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
695 int aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
696 int aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
697 int aes_test(void);
698 void aes_done(symmetric_key *skey);
699 int aes_keysize(int *keysize);
700 int aes_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
701 int aes_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
702 int aes_enc_test(void);
703 void aes_enc_done(symmetric_key *skey);
704 int aes_enc_keysize(int *keysize);
705 extern const struct ltc_cipher_descriptor aes_desc;
706 extern const struct ltc_cipher_descriptor aes_enc_desc;
707 
708 int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
709 int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
710 int rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
711 int rijndael_test(void);
712 void rijndael_done(symmetric_key *skey);
713 int rijndael_keysize(int *keysize);
714 int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
715 int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
716 void rijndael_enc_done(symmetric_key *skey);
717 int rijndael_enc_keysize(int *keysize);
718 extern const struct ltc_cipher_descriptor rijndael_desc;
719 extern const struct ltc_cipher_descriptor rijndael_enc_desc;
720 #endif
721 
722 #if defined(LTC_AES_NI) && defined(LTC_AMD64_SSE4_1)
723 int aesni_is_supported(void);
724 int aesni_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
725 int aesni_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
726 int aesni_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
727 int aesni_test(void);
728 void aesni_done(symmetric_key *skey);
729 int aesni_keysize(int *keysize);
730 extern const struct ltc_cipher_descriptor aesni_desc;
731 #endif
732 
733 #ifdef LTC_XTEA
734 int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
735 int xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
736 int xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
737 int xtea_test(void);
738 void xtea_done(symmetric_key *skey);
739 int xtea_keysize(int *keysize);
740 extern const struct ltc_cipher_descriptor xtea_desc;
741 #endif
742 
743 #ifdef LTC_TWOFISH
744 int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
745 int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
746 int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
747 int twofish_test(void);
748 void twofish_done(symmetric_key *skey);
749 int twofish_keysize(int *keysize);
750 extern const struct ltc_cipher_descriptor twofish_desc;
751 #endif
752 
753 #ifdef LTC_DES
754 int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
755 int des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
756 int des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
757 int des_test(void);
758 void des_done(symmetric_key *skey);
759 int des_keysize(int *keysize);
760 int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
761 int des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
762 int des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
763 int des3_test(void);
764 void des3_done(symmetric_key *skey);
765 int des3_keysize(int *keysize);
766 extern const struct ltc_cipher_descriptor des_desc, des3_desc;
767 #endif
768 
769 #ifdef LTC_CAST5
770 int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
771 int cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
772 int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
773 int cast5_test(void);
774 void cast5_done(symmetric_key *skey);
775 int cast5_keysize(int *keysize);
776 extern const struct ltc_cipher_descriptor cast5_desc;
777 #endif
778 
779 #ifdef LTC_NOEKEON
780 int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
781 int noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
782 int noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
783 int noekeon_test(void);
784 void noekeon_done(symmetric_key *skey);
785 int noekeon_keysize(int *keysize);
786 extern const struct ltc_cipher_descriptor noekeon_desc;
787 #endif
788 
789 #ifdef LTC_SKIPJACK
790 int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
791 int skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
792 int skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
793 int skipjack_test(void);
794 void skipjack_done(symmetric_key *skey);
795 int skipjack_keysize(int *keysize);
796 extern const struct ltc_cipher_descriptor skipjack_desc;
797 #endif
798 
799 #ifdef LTC_KHAZAD
800 int khazad_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
801 int khazad_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
802 int khazad_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
803 int khazad_test(void);
804 void khazad_done(symmetric_key *skey);
805 int khazad_keysize(int *keysize);
806 extern const struct ltc_cipher_descriptor khazad_desc;
807 #endif
808 
809 #ifdef LTC_ANUBIS
810 int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
811 int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
812 int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
813 int anubis_test(void);
814 void anubis_done(symmetric_key *skey);
815 int anubis_keysize(int *keysize);
816 extern const struct ltc_cipher_descriptor anubis_desc;
817 #endif
818 
819 #ifdef LTC_KSEED
820 int kseed_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
821 int kseed_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
822 int kseed_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
823 int kseed_test(void);
824 void kseed_done(symmetric_key *skey);
825 int kseed_keysize(int *keysize);
826 extern const struct ltc_cipher_descriptor kseed_desc;
827 #endif
828 
829 #ifdef LTC_KASUMI
830 int kasumi_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
831 int kasumi_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
832 int kasumi_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
833 int kasumi_test(void);
834 void kasumi_done(symmetric_key *skey);
835 int kasumi_keysize(int *keysize);
836 extern const struct ltc_cipher_descriptor kasumi_desc;
837 #endif
838 
839 
840 #ifdef LTC_MULTI2
841 int multi2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
842 int multi2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
843 int multi2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
844 int multi2_test(void);
845 void multi2_done(symmetric_key *skey);
846 int multi2_keysize(int *keysize);
847 extern const struct ltc_cipher_descriptor multi2_desc;
848 #endif
849 
850 #ifdef LTC_CAMELLIA
851 int camellia_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
852 int camellia_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
853 int camellia_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
854 int camellia_test(void);
855 void camellia_done(symmetric_key *skey);
856 int camellia_keysize(int *keysize);
857 extern const struct ltc_cipher_descriptor camellia_desc;
858 #endif
859 
860 #ifdef LTC_IDEA
861 int idea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
862 int idea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
863 int idea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
864 int idea_test(void);
865 void idea_done(symmetric_key *skey);
866 int idea_keysize(int *keysize);
867 extern const struct ltc_cipher_descriptor idea_desc;
868 #endif
869 
870 #ifdef LTC_SERPENT
871 int serpent_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
872 int serpent_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
873 int serpent_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
874 int serpent_test(void);
875 void serpent_done(symmetric_key *skey);
876 int serpent_keysize(int *keysize);
877 extern const struct ltc_cipher_descriptor serpent_desc;
878 #endif
879 
880 #ifdef LTC_TEA
881 int tea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
882 int tea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey);
883 int tea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey);
884 int tea_test(void);
885 void tea_done(symmetric_key *skey);
886 int tea_keysize(int *keysize);
887 extern const struct ltc_cipher_descriptor tea_desc;
888 #endif
889 
890 #ifdef LTC_ECB_MODE
891 int ecb_start(int cipher, const unsigned char *key,
892               int keylen, int num_rounds, symmetric_ECB *ecb);
893 int ecb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_ECB *ecb);
894 int ecb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_ECB *ecb);
895 int ecb_done(symmetric_ECB *ecb);
896 #endif
897 
898 #ifdef LTC_CFB_MODE
899 int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key,
900               int keylen, int num_rounds, symmetric_CFB *cfb);
901 int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CFB *cfb);
902 int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CFB *cfb);
903 int cfb_getiv(unsigned char *IV, unsigned long *len, const symmetric_CFB *cfb);
904 int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb);
905 int cfb_done(symmetric_CFB *cfb);
906 #endif
907 
908 #ifdef LTC_OFB_MODE
909 int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key,
910               int keylen, int num_rounds, symmetric_OFB *ofb);
911 int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb);
912 int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb);
913 int ofb_getiv(unsigned char *IV, unsigned long *len, const symmetric_OFB *ofb);
914 int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb);
915 int ofb_done(symmetric_OFB *ofb);
916 #endif
917 
918 #ifdef LTC_CBC_MODE
919 int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key,
920                int keylen, int num_rounds, symmetric_CBC *cbc);
921 int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc);
922 int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc);
923 int cbc_getiv(unsigned char *IV, unsigned long *len, const symmetric_CBC *cbc);
924 int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc);
925 int cbc_done(symmetric_CBC *cbc);
926 #endif
927 
928 #ifdef LTC_CTR_MODE
929 
930 #define CTR_COUNTER_LITTLE_ENDIAN    0x0000
931 #define CTR_COUNTER_BIG_ENDIAN       0x1000
932 #define LTC_CTR_RFC3686              0x2000
933 
934 int ctr_start(               int   cipher,
935               const unsigned char *IV,
936               const unsigned char *key,       int keylen,
937                              int  num_rounds, int ctr_mode,
938                    symmetric_CTR *ctr);
939 int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr);
940 int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr);
941 int ctr_getiv(unsigned char *IV, unsigned long *len, const symmetric_CTR *ctr);
942 int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr);
943 int ctr_done(symmetric_CTR *ctr);
944 int ctr_test(void);
945 #endif
946 
947 #ifdef LTC_LRW_MODE
948 
949 #define LRW_ENCRYPT LTC_ENCRYPT
950 #define LRW_DECRYPT LTC_DECRYPT
951 
952 int lrw_start(               int   cipher,
953               const unsigned char *IV,
954               const unsigned char *key,       int keylen,
955               const unsigned char *tweak,
956                              int  num_rounds,
957                    symmetric_LRW *lrw);
958 int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw);
959 int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw);
960 int lrw_getiv(unsigned char *IV, unsigned long *len, const symmetric_LRW *lrw);
961 int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw);
962 int lrw_done(symmetric_LRW *lrw);
963 int lrw_test(void);
964 
965 /* don't call */
966 int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw);
967 #endif
968 
969 #ifdef LTC_F8_MODE
970 int f8_start(                int  cipher, const unsigned char *IV,
971              const unsigned char *key,                    int  keylen,
972              const unsigned char *salt_key,               int  skeylen,
973                              int  num_rounds,   symmetric_F8  *f8);
974 int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8);
975 int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8);
976 int f8_getiv(unsigned char *IV, unsigned long *len, const symmetric_F8 *f8);
977 int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8);
978 int f8_done(symmetric_F8 *f8);
979 int f8_test_mode(void);
980 #endif
981 
982 #ifdef LTC_XTS_MODE
983 typedef struct {
984    symmetric_key  key1, key2;
985    int            cipher;
986 } symmetric_xts;
987 
988 int xts_start(                int  cipher,
989               const unsigned char *key1,
990               const unsigned char *key2,
991                     unsigned long  keylen,
992                               int  num_rounds,
993                     symmetric_xts *xts);
994 
995 int xts_encrypt(
996    const unsigned char *pt, unsigned long ptlen,
997          unsigned char *ct,
998          unsigned char *tweak,
999    const symmetric_xts *xts);
1000 int xts_decrypt(
1001    const unsigned char *ct, unsigned long ptlen,
1002          unsigned char *pt,
1003          unsigned char *tweak,
1004    const symmetric_xts *xts);
1005 
1006 void xts_done(symmetric_xts *xts);
1007 int  xts_test(void);
1008 void xts_mult_x(unsigned char *I);
1009 #endif
1010 
1011 int find_cipher(const char *name);
1012 int find_cipher_any(const char *name, int blocklen, int keylen);
1013 int find_cipher_id(unsigned char ID);
1014 int register_cipher(const struct ltc_cipher_descriptor *cipher);
1015 int unregister_cipher(const struct ltc_cipher_descriptor *cipher);
1016 int register_all_ciphers(void);
1017 int cipher_is_valid(int idx);
1018 
1019 LTC_MUTEX_PROTO(ltc_cipher_mutex)
1020 
1021 /* ---- stream ciphers ---- */
1022 
1023 #ifdef LTC_CHACHA
1024 
1025 typedef struct {
1026    ulong32 input[16];
1027    unsigned char kstream[64];
1028    unsigned long ksleft;
1029    unsigned long ivlen;
1030    int rounds;
1031 } chacha_state;
1032 
1033 int chacha_setup(chacha_state *st, const unsigned char *key, unsigned long keylen, int rounds);
1034 int chacha_ivctr32(chacha_state *st, const unsigned char *iv, unsigned long ivlen, ulong32 counter);
1035 int chacha_ivctr64(chacha_state *st, const unsigned char *iv, unsigned long ivlen, ulong64 counter);
1036 int chacha_crypt(chacha_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1037 int chacha_keystream(chacha_state *st, unsigned char *out, unsigned long outlen);
1038 int chacha_done(chacha_state *st);
1039 int chacha_test(void);
1040 int chacha_memory(const unsigned char *key,    unsigned long keylen,  unsigned long rounds,
1041                   const unsigned char *iv,     unsigned long ivlen,   ulong64 counter,
1042                   const unsigned char *datain, unsigned long datalen, unsigned char *dataout);
1043 
1044 #endif /* LTC_CHACHA */
1045 
1046 #ifdef LTC_SALSA20
1047 
1048 typedef struct {
1049    ulong32 input[16];
1050    unsigned char kstream[64];
1051    unsigned long ksleft;
1052    unsigned long ivlen;
1053    int rounds;
1054 } salsa20_state;
1055 
1056 int salsa20_setup(salsa20_state *st, const unsigned char *key, unsigned long keylen, int rounds);
1057 int salsa20_ivctr64(salsa20_state *st, const unsigned char *iv, unsigned long ivlen, ulong64 counter);
1058 int salsa20_crypt(salsa20_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1059 int salsa20_keystream(salsa20_state *st, unsigned char *out, unsigned long outlen);
1060 int salsa20_done(salsa20_state *st);
1061 int salsa20_test(void);
1062 int salsa20_memory(const unsigned char *key,    unsigned long keylen,  unsigned long rounds,
1063                    const unsigned char *iv,     unsigned long ivlen,   ulong64 counter,
1064                    const unsigned char *datain, unsigned long datalen, unsigned char *dataout);
1065 
1066 #endif /* LTC_SALSA20 */
1067 
1068 #ifdef LTC_XSALSA20
1069 
1070 int xsalsa20_setup(salsa20_state *st, const unsigned char *key,   unsigned long keylen,
1071                                       const unsigned char *nonce, unsigned long noncelen,
1072                                       int rounds);
1073 int xsalsa20_test(void);
1074 int xsalsa20_memory(const unsigned char *key,    unsigned long keylen,   unsigned long rounds,
1075                     const unsigned char *nonce,  unsigned long noncelen,
1076                     const unsigned char *datain, unsigned long datalen,  unsigned char *dataout);
1077 
1078 #endif /* LTC_XSALSA20 */
1079 
1080 #ifdef LTC_SOSEMANUK
1081 
1082 typedef struct {
1083     ulong32 kc[100];    /* key_context */
1084     ulong32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09;
1085     ulong32 r1, r2;
1086     /*
1087      * Buffering: the stream cipher produces output data by
1088      * blocks of 640 bits. buf[] contains such a block, and
1089      * "ptr" is the index of the next output byte.
1090      */
1091     unsigned char buf[80];
1092     unsigned ptr;
1093 } sosemanuk_state;
1094 
1095 int sosemanuk_setup(sosemanuk_state *st, const unsigned char *key, unsigned long keylen);
1096 int sosemanuk_setiv(sosemanuk_state *st, const unsigned char *iv, unsigned long ivlen);
1097 int sosemanuk_crypt(sosemanuk_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1098 int sosemanuk_keystream(sosemanuk_state *st, unsigned char *out, unsigned long outlen);
1099 int sosemanuk_done(sosemanuk_state *st);
1100 int sosemanuk_test(void);
1101 int sosemanuk_memory(const unsigned char *key,    unsigned long keylen,
1102                      const unsigned char *iv,     unsigned long ivlen,
1103                      const unsigned char *datain, unsigned long datalen,
1104                      unsigned char *dataout);
1105 
1106 #endif /* LTC_SOSEMANUK */
1107 
1108 #ifdef LTC_RABBIT
1109 
1110 typedef struct {
1111    ulong32 x[8];
1112    ulong32 c[8];
1113    ulong32 carry;
1114 } rabbit_ctx;
1115 
1116 typedef struct {
1117    rabbit_ctx master_ctx;
1118    rabbit_ctx work_ctx;
1119    unsigned char block[16];     /* last keystream block containing unused bytes */
1120    ulong32       unused;        /* count fm right */
1121 } rabbit_state;
1122 
1123 int rabbit_setup(rabbit_state* st, const unsigned char *key, unsigned long keylen);
1124 int rabbit_setiv(rabbit_state* st, const unsigned char *iv, unsigned long ivlen);
1125 int rabbit_crypt(rabbit_state* st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1126 int rabbit_keystream(rabbit_state* st, unsigned char *out, unsigned long outlen);
1127 int rabbit_done(rabbit_state *st);
1128 int rabbit_test(void);
1129 int rabbit_memory(const unsigned char *key,    unsigned long keylen,
1130                   const unsigned char *iv,     unsigned long ivlen,
1131                   const unsigned char *datain, unsigned long datalen,
1132                   unsigned char *dataout);
1133 
1134 #endif /* LTC_RABBIT */
1135 
1136 #ifdef LTC_RC4_STREAM
1137 
1138 typedef struct {
1139    unsigned int x, y;
1140    unsigned char buf[256];
1141 } rc4_state;
1142 
1143 int rc4_stream_setup(rc4_state *st, const unsigned char *key, unsigned long keylen);
1144 int rc4_stream_crypt(rc4_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1145 int rc4_stream_keystream(rc4_state *st, unsigned char *out, unsigned long outlen);
1146 int rc4_stream_done(rc4_state *st);
1147 int rc4_stream_test(void);
1148 int rc4_stream_memory(const unsigned char *key,    unsigned long keylen,
1149                       const unsigned char *datain, unsigned long datalen,
1150                       unsigned char *dataout);
1151 
1152 #endif /* LTC_RC4_STREAM */
1153 
1154 #ifdef LTC_SOBER128_STREAM
1155 
1156 typedef struct {
1157    ulong32 R[17],       /* Working storage for the shift register */
1158            initR[17],   /* saved register contents */
1159            konst,       /* key dependent constant */
1160            sbuf;        /* partial word encryption buffer */
1161    int     nbuf;        /* number of part-word stream bits buffered */
1162 } sober128_state;
1163 
1164 int sober128_stream_setup(sober128_state *st, const unsigned char *key, unsigned long keylen);
1165 int sober128_stream_setiv(sober128_state *st, const unsigned char *iv, unsigned long ivlen);
1166 int sober128_stream_crypt(sober128_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);
1167 int sober128_stream_keystream(sober128_state *st, unsigned char *out, unsigned long outlen);
1168 int sober128_stream_done(sober128_state *st);
1169 int sober128_stream_test(void);
1170 int sober128_stream_memory(const unsigned char *key,    unsigned long keylen,
1171                            const unsigned char *iv,     unsigned long ivlen,
1172                            const unsigned char *datain, unsigned long datalen,
1173                            unsigned char *dataout);
1174 
1175 #endif /* LTC_SOBER128_STREAM */
1176