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