tomcrypt_cipher.h revision 29698e296e3fd1474a362fbd229bca888175bb66
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