1 /* $NetBSD: evp-cc.c,v 1.3 2023/06/19 21:41:43 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2008 Kungliga Tekniska Hgskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 21 * 3. Neither the name of the Institute nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 */ 37 38 /* CommonCrypto provider */ 39 40 #ifdef __APPLE__ 41 42 #include <config.h> 43 #include <krb5/roken.h> 44 45 #include <assert.h> 46 47 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 48 #include <CommonCrypto/CommonDigest.h> 49 #endif 50 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 51 #include <CommonCrypto/CommonCryptor.h> 52 #endif 53 54 #include <evp.h> 55 #include <evp-hcrypto.h> 56 #include <evp-cc.h> 57 58 /* 59 * 60 */ 61 62 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 63 64 struct cc_key { 65 CCCryptorRef href; 66 }; 67 68 static int 69 cc_do_cipher(EVP_CIPHER_CTX *ctx, 70 unsigned char *out, 71 const unsigned char *in, 72 unsigned int size) 73 { 74 struct cc_key *cc = ctx->cipher_data; 75 CCCryptorStatus ret; 76 size_t moved; 77 78 memcpy(out, in, size); 79 80 ret = CCCryptorUpdate(cc->href, in, size, out, size, &moved); 81 if (ret) 82 return 0; 83 84 if (moved != size) 85 return 0; 86 87 return 1; 88 } 89 90 static int 91 cc_cleanup(EVP_CIPHER_CTX *ctx) 92 { 93 struct cc_key *cc = ctx->cipher_data; 94 if (cc->href) 95 CCCryptorRelease(cc->href); 96 return 1; 97 } 98 99 static int 100 init_cc_key(int encp, unsigned long flags, 101 CCAlgorithm alg, const void *key, size_t keylen, 102 const void *iv, CCCryptorRef *ref) 103 { 104 CCOperation op = encp ? kCCEncrypt : kCCDecrypt; 105 CCMode mode; 106 CCModeOptions options = 0; 107 CCCryptorStatus ret; 108 109 if (*ref) { 110 if (key == NULL && iv) { 111 CCCryptorReset(*ref, iv); 112 return 1; 113 } 114 CCCryptorRelease(*ref); 115 } 116 117 if (key) { 118 switch (flags & EVP_CIPH_MODE) { 119 case EVP_CIPH_STREAM_CIPHER: 120 mode = kCCModeRC4; 121 break; 122 case EVP_CIPH_CFB8_MODE: 123 mode = kCCModeCFB8; 124 break; 125 default: 126 mode = kCCModeCBC; 127 break; 128 } 129 130 ret = CCCryptorCreateWithMode(op, mode, alg, ccNoPadding, 131 iv, key, keylen, NULL, 0, 0, 132 options, ref); 133 if (ret) 134 return 0; 135 } 136 137 return 1; 138 } 139 140 static int 141 cc_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, 142 const unsigned char * key, 143 const unsigned char * iv, 144 int encp) 145 { 146 struct cc_key *cc = ctx->cipher_data; 147 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithm3DES, 148 key, kCCKeySize3DES, iv, &cc->href); 149 } 150 151 #endif /* HAVE_COMMONCRYPTO_COMMONCRYPTOR_H */ 152 153 /** 154 * The triple DES cipher type (Apple CommonCrypto provider) 155 * 156 * @return the DES-EDE3-CBC EVP_CIPHER pointer. 157 * 158 * @ingroup hcrypto_evp 159 */ 160 161 const EVP_CIPHER * 162 EVP_cc_des_ede3_cbc(void) 163 { 164 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 165 static const EVP_CIPHER des_ede3_cbc = { 166 0, 167 8, 168 24, 169 8, 170 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 171 cc_des_ede3_cbc_init, 172 cc_do_cipher, 173 cc_cleanup, 174 sizeof(struct cc_key), 175 NULL, 176 NULL, 177 NULL, 178 NULL 179 }; 180 return &des_ede3_cbc; 181 #elif HCRYPTO_FALLBACK 182 return EVP_hcrypto_des_ede3_cbc(); 183 #else 184 return NULL; 185 #endif 186 } 187 188 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 189 /* 190 * 191 */ 192 193 static int 194 cc_des_cbc_init(EVP_CIPHER_CTX *ctx, 195 const unsigned char * key, 196 const unsigned char * iv, 197 int encp) 198 { 199 struct cc_key *cc = ctx->cipher_data; 200 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmDES, 201 key, kCCBlockSizeDES, iv, &cc->href); 202 } 203 #endif 204 205 /** 206 * The DES cipher type (Apple CommonCrypto provider) 207 * 208 * @return the DES-CBC EVP_CIPHER pointer. 209 * 210 * @ingroup hcrypto_evp 211 */ 212 213 const EVP_CIPHER * 214 EVP_cc_des_cbc(void) 215 { 216 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 217 static const EVP_CIPHER des_ede3_cbc = { 218 0, 219 kCCBlockSizeDES, 220 kCCBlockSizeDES, 221 kCCBlockSizeDES, 222 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 223 cc_des_cbc_init, 224 cc_do_cipher, 225 cc_cleanup, 226 sizeof(struct cc_key), 227 NULL, 228 NULL, 229 NULL, 230 NULL 231 }; 232 return &des_ede3_cbc; 233 #elif HCRYPTO_FALLBACK 234 return EVP_hcrypto_des_cbc(); 235 #else 236 return NULL; 237 #endif 238 } 239 240 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 241 /* 242 * 243 */ 244 245 static int 246 cc_aes_cbc_init(EVP_CIPHER_CTX *ctx, 247 const unsigned char * key, 248 const unsigned char * iv, 249 int encp) 250 { 251 struct cc_key *cc = ctx->cipher_data; 252 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmAES128, 253 key, ctx->cipher->key_len, iv, &cc->href); 254 } 255 #endif 256 257 /** 258 * The AES-128 cipher type (Apple CommonCrypto provider) 259 * 260 * @return the AES-128-CBC EVP_CIPHER pointer. 261 * 262 * @ingroup hcrypto_evp 263 */ 264 265 const EVP_CIPHER * 266 EVP_cc_aes_128_cbc(void) 267 { 268 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 269 static const EVP_CIPHER c = { 270 0, 271 kCCBlockSizeAES128, 272 kCCKeySizeAES128, 273 kCCBlockSizeAES128, 274 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 275 cc_aes_cbc_init, 276 cc_do_cipher, 277 cc_cleanup, 278 sizeof(struct cc_key), 279 NULL, 280 NULL, 281 NULL, 282 NULL 283 }; 284 return &c; 285 #elif HCRYPTO_FALLBACK 286 return EVP_hcrypto_aes_128_cbc(); 287 #else 288 return NULL; 289 #endif 290 } 291 292 /** 293 * The AES-192 cipher type (Apple CommonCrypto provider) 294 * 295 * @return the AES-192-CBC EVP_CIPHER pointer. 296 * 297 * @ingroup hcrypto_evp 298 */ 299 300 const EVP_CIPHER * 301 EVP_cc_aes_192_cbc(void) 302 { 303 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 304 static const EVP_CIPHER c = { 305 0, 306 kCCBlockSizeAES128, 307 kCCKeySizeAES192, 308 kCCBlockSizeAES128, 309 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 310 cc_aes_cbc_init, 311 cc_do_cipher, 312 cc_cleanup, 313 sizeof(struct cc_key), 314 NULL, 315 NULL, 316 NULL, 317 NULL 318 }; 319 return &c; 320 #elif HCRYPTO_FALLBACK 321 return EVP_hcrypto_aes_192_cbc(); 322 #else 323 return NULL; 324 #endif 325 } 326 327 /** 328 * The AES-256 cipher type (Apple CommonCrypto provider) 329 * 330 * @return the AES-256-CBC EVP_CIPHER pointer. 331 * 332 * @ingroup hcrypto_evp 333 */ 334 335 const EVP_CIPHER * 336 EVP_cc_aes_256_cbc(void) 337 { 338 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 339 static const EVP_CIPHER c = { 340 0, 341 kCCBlockSizeAES128, 342 kCCKeySizeAES256, 343 kCCBlockSizeAES128, 344 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 345 cc_aes_cbc_init, 346 cc_do_cipher, 347 cc_cleanup, 348 sizeof(struct cc_key), 349 NULL, 350 NULL, 351 NULL, 352 NULL 353 }; 354 return &c; 355 #elif HCRYPTO_FALLBACK 356 return EVP_hcrypto_aes_256_cbc(); 357 #else 358 return NULL; 359 #endif 360 } 361 362 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 363 /* 364 * 365 */ 366 367 static int 368 cc_aes_cfb8_init(EVP_CIPHER_CTX *ctx, 369 const unsigned char * key, 370 const unsigned char * iv, 371 int encp) 372 { 373 struct cc_key *cc = ctx->cipher_data; 374 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmAES128, 375 key, ctx->cipher->key_len, NULL, &cc->href); 376 } 377 #endif 378 379 /** 380 * The AES-128 CFB8 cipher type (Apple CommonCrypto provider) 381 * 382 * @return the AES-128-CFB8 EVP_CIPHER pointer. 383 * 384 * @ingroup hcrypto_evp 385 */ 386 387 const EVP_CIPHER * 388 EVP_cc_aes_128_cfb8(void) 389 { 390 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 391 static const EVP_CIPHER c = { 392 0, 393 1, 394 kCCKeySizeAES128, 395 kCCBlockSizeAES128, 396 EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 397 cc_aes_cfb8_init, 398 cc_do_cipher, 399 cc_cleanup, 400 sizeof(struct cc_key), 401 NULL, 402 NULL, 403 NULL, 404 NULL 405 }; 406 return &c; 407 #elif HCRYPTO_FALLBACK 408 return EVP_hcrypto_aes_128_cfb8(); 409 #else 410 return NULL; 411 #endif 412 } 413 414 /** 415 * The AES-192 CFB8 cipher type (Apple CommonCrypto provider) 416 * 417 * @return the AES-192-CFB8 EVP_CIPHER pointer. 418 * 419 * @ingroup hcrypto_evp 420 */ 421 422 const EVP_CIPHER * 423 EVP_cc_aes_192_cfb8(void) 424 { 425 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 426 static const EVP_CIPHER c = { 427 0, 428 1, 429 kCCKeySizeAES192, 430 kCCBlockSizeAES128, 431 EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 432 cc_aes_cfb8_init, 433 cc_do_cipher, 434 cc_cleanup, 435 sizeof(struct cc_key), 436 NULL, 437 NULL, 438 NULL, 439 NULL 440 }; 441 return &c; 442 #elif HCRYPTO_FALLBACK 443 return EVP_hcrypto_aes_192_cfb8(); 444 #else 445 return NULL; 446 #endif 447 } 448 449 /** 450 * The AES-256 CFB8 cipher type (Apple CommonCrypto provider) 451 * 452 * @return the AES-256-CFB8 EVP_CIPHER pointer. 453 * 454 * @ingroup hcrypto_evp 455 */ 456 457 const EVP_CIPHER * 458 EVP_cc_aes_256_cfb8(void) 459 { 460 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 461 static const EVP_CIPHER c = { 462 0, 463 kCCBlockSizeAES128, 464 kCCKeySizeAES256, 465 kCCBlockSizeAES128, 466 EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 467 cc_aes_cfb8_init, 468 cc_do_cipher, 469 cc_cleanup, 470 sizeof(struct cc_key), 471 NULL, 472 NULL, 473 NULL, 474 NULL 475 }; 476 return &c; 477 #elif HCRYPTO_FALLBACK 478 return EVP_hcrypto_aes_256_cfb8(); 479 #else 480 return NULL; 481 #endif 482 } 483 484 /* 485 * 486 */ 487 488 #ifdef COMMONCRYPTO_SUPPORTS_RC2 489 static int 490 cc_rc2_cbc_init(EVP_CIPHER_CTX *ctx, 491 const unsigned char * key, 492 const unsigned char * iv, 493 int encp) 494 { 495 struct cc_key *cc = ctx->cipher_data; 496 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmRC2, 497 key, ctx->cipher->key_len, iv, &cc->href); 498 } 499 #endif 500 501 /** 502 * The RC2 cipher type - common crypto 503 * 504 * @return the RC2 EVP_CIPHER pointer. 505 * 506 * @ingroup hcrypto_evp 507 */ 508 509 510 const EVP_CIPHER * 511 EVP_cc_rc2_cbc(void) 512 { 513 #ifdef COMMONCRYPTO_SUPPORTS_RC2 514 static const EVP_CIPHER rc2_cbc = { 515 0, 516 kCCBlockSizeRC2, 517 16, 518 kCCBlockSizeRC2, 519 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 520 cc_rc2_cbc_init, 521 cc_do_cipher, 522 cc_cleanup, 523 sizeof(struct cc_key), 524 NULL, 525 NULL, 526 NULL, 527 NULL 528 }; 529 return &rc2_cbc; 530 #elif HCRYPTO_FALLBACK 531 return EVP_hcrypto_rc2_cbc(); 532 #else 533 return NULL; 534 #endif 535 } 536 537 /** 538 * The RC2-40 cipher type - common crypto 539 * 540 * @return the RC2-40 EVP_CIPHER pointer. 541 * 542 * @ingroup hcrypto_evp 543 */ 544 545 546 const EVP_CIPHER * 547 EVP_cc_rc2_40_cbc(void) 548 { 549 #ifdef COMMONCRYPTO_SUPPORTS_RC2 550 static const EVP_CIPHER rc2_40_cbc = { 551 0, 552 kCCBlockSizeRC2, 553 5, 554 kCCBlockSizeRC2, 555 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 556 cc_rc2_cbc_init, 557 cc_do_cipher, 558 cc_cleanup, 559 sizeof(struct cc_key), 560 NULL, 561 NULL, 562 NULL, 563 NULL 564 }; 565 return &rc2_40_cbc; 566 #elif HCRYPTO_FALLBACK 567 return EVP_hcrypto_rc2_40_cbc(); 568 #else 569 return NULL; 570 #endif 571 } 572 573 574 /** 575 * The RC2-64 cipher type - common crypto 576 * 577 * @return the RC2-64 EVP_CIPHER pointer. 578 * 579 * @ingroup hcrypto_evp 580 */ 581 582 583 const EVP_CIPHER * 584 EVP_cc_rc2_64_cbc(void) 585 { 586 #ifdef COMMONCRYPTO_SUPPORTS_RC2 587 static const EVP_CIPHER rc2_64_cbc = { 588 0, 589 kCCBlockSizeRC2, 590 8, 591 kCCBlockSizeRC2, 592 EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, 593 cc_rc2_cbc_init, 594 cc_do_cipher, 595 cc_cleanup, 596 sizeof(struct cc_key), 597 NULL, 598 NULL, 599 NULL, 600 NULL 601 }; 602 return &rc2_64_cbc; 603 #elif HCRYPTO_FALLBACK 604 return EVP_hcrypto_rc2_64_cbc(); 605 #else 606 return NULL; 607 #endif 608 } 609 610 611 /** 612 * The CommonCrypto md4 provider 613 * 614 * @ingroup hcrypto_evp 615 */ 616 617 const EVP_MD * 618 EVP_cc_md4(void) 619 { 620 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 621 static const struct hc_evp_md md4 = { 622 CC_MD4_DIGEST_LENGTH, 623 CC_MD4_BLOCK_BYTES, 624 sizeof(CC_MD4_CTX), 625 (hc_evp_md_init)CC_MD4_Init, 626 (hc_evp_md_update)CC_MD4_Update, 627 (hc_evp_md_final)CC_MD4_Final, 628 (hc_evp_md_cleanup)NULL 629 }; 630 return &md4; 631 #elif HCRYPTO_FALLBACK 632 return EVP_hcrypto_md4(); 633 #else 634 return NULL; 635 #endif 636 } 637 638 /** 639 * The CommonCrypto md5 provider 640 * 641 * @ingroup hcrypto_evp 642 */ 643 644 const EVP_MD * 645 EVP_cc_md5(void) 646 { 647 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 648 static const struct hc_evp_md md5 = { 649 CC_MD5_DIGEST_LENGTH, 650 CC_MD5_BLOCK_BYTES, 651 sizeof(CC_MD5_CTX), 652 (hc_evp_md_init)CC_MD5_Init, 653 (hc_evp_md_update)CC_MD5_Update, 654 (hc_evp_md_final)CC_MD5_Final, 655 (hc_evp_md_cleanup)NULL 656 }; 657 return &md5; 658 #elif HCRYPTO_FALLBACK 659 return EVP_hcrypto_md5(); 660 #else 661 return NULL; 662 #endif 663 } 664 665 /** 666 * The CommonCrypto sha1 provider 667 * 668 * @ingroup hcrypto_evp 669 */ 670 671 const EVP_MD * 672 EVP_cc_sha1(void) 673 { 674 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 675 static const struct hc_evp_md sha1 = { 676 CC_SHA1_DIGEST_LENGTH, 677 CC_SHA1_BLOCK_BYTES, 678 sizeof(CC_SHA1_CTX), 679 (hc_evp_md_init)CC_SHA1_Init, 680 (hc_evp_md_update)CC_SHA1_Update, 681 (hc_evp_md_final)CC_SHA1_Final, 682 (hc_evp_md_cleanup)NULL 683 }; 684 return &sha1; 685 #elif HCRYPTO_FALLBACK 686 return EVP_hcrypto_sha1(); 687 #else 688 return NULL; 689 #endif 690 } 691 692 /** 693 * The CommonCrypto sha256 provider 694 * 695 * @ingroup hcrypto_evp 696 */ 697 698 const EVP_MD * 699 EVP_cc_sha256(void) 700 { 701 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 702 static const struct hc_evp_md sha256 = { 703 CC_SHA256_DIGEST_LENGTH, 704 CC_SHA256_BLOCK_BYTES, 705 sizeof(CC_SHA256_CTX), 706 (hc_evp_md_init)CC_SHA256_Init, 707 (hc_evp_md_update)CC_SHA256_Update, 708 (hc_evp_md_final)CC_SHA256_Final, 709 (hc_evp_md_cleanup)NULL 710 }; 711 return &sha256; 712 #elif HCRYPTO_FALLBACK 713 return EVP_hcrypto_sha256(); 714 #else 715 return NULL; 716 #endif 717 } 718 719 /** 720 * The CommonCrypto sha384 provider 721 * 722 * @ingroup hcrypto_evp 723 */ 724 725 const EVP_MD * 726 EVP_cc_sha384(void) 727 { 728 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 729 static const struct hc_evp_md sha384 = { 730 CC_SHA384_DIGEST_LENGTH, 731 CC_SHA384_BLOCK_BYTES, 732 sizeof(CC_SHA512_CTX), 733 (hc_evp_md_init)CC_SHA384_Init, 734 (hc_evp_md_update)CC_SHA384_Update, 735 (hc_evp_md_final)CC_SHA384_Final, 736 (hc_evp_md_cleanup)NULL 737 }; 738 return &sha384; 739 #elif HCRYPTO_FALLBACK 740 return EVP_hcrypto_sha384(); 741 #else 742 return NULL; 743 #endif 744 } 745 746 /** 747 * The CommonCrypto sha512 provider 748 * 749 * @ingroup hcrypto_evp 750 */ 751 752 const EVP_MD * 753 EVP_cc_sha512(void) 754 { 755 #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H 756 static const struct hc_evp_md sha512 = { 757 CC_SHA512_DIGEST_LENGTH, 758 CC_SHA512_BLOCK_BYTES, 759 sizeof(CC_SHA512_CTX), 760 (hc_evp_md_init)CC_SHA512_Init, 761 (hc_evp_md_update)CC_SHA512_Update, 762 (hc_evp_md_final)CC_SHA512_Final, 763 (hc_evp_md_cleanup)NULL 764 }; 765 return &sha512; 766 #elif HCRYPTO_FALLBACK 767 return EVP_hcrypto_sha512(); 768 #else 769 return NULL; 770 #endif 771 } 772 773 /** 774 * The Camellia-128 cipher type - CommonCrypto 775 * 776 * @return the Camellia-128 EVP_CIPHER pointer. 777 * 778 * @ingroup hcrypto_evp 779 */ 780 781 const EVP_CIPHER * 782 EVP_cc_camellia_128_cbc(void) 783 { 784 #if HCRYPTO_FALLBACK 785 return EVP_hcrypto_camellia_128_cbc(); 786 #else 787 return NULL; 788 #endif 789 } 790 791 /** 792 * The Camellia-198 cipher type - CommonCrypto 793 * 794 * @return the Camellia-198 EVP_CIPHER pointer. 795 * 796 * @ingroup hcrypto_evp 797 */ 798 799 const EVP_CIPHER * 800 EVP_cc_camellia_192_cbc(void) 801 { 802 #if HCRYPTO_FALLBACK 803 return EVP_hcrypto_camellia_192_cbc(); 804 #else 805 return NULL; 806 #endif 807 } 808 809 /** 810 * The Camellia-256 cipher type - CommonCrypto 811 * 812 * @return the Camellia-256 EVP_CIPHER pointer. 813 * 814 * @ingroup hcrypto_evp 815 */ 816 817 const EVP_CIPHER * 818 EVP_cc_camellia_256_cbc(void) 819 { 820 #if HCRYPTO_FALLBACK 821 return EVP_hcrypto_camellia_256_cbc(); 822 #else 823 return NULL; 824 #endif 825 } 826 827 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 828 829 /* 830 * 831 */ 832 833 static int 834 cc_rc4_init(EVP_CIPHER_CTX *ctx, 835 const unsigned char * key, 836 const unsigned char * iv, 837 int encp) 838 { 839 struct cc_key *cc = ctx->cipher_data; 840 return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmRC4, 841 key, ctx->key_len, iv, &cc->href); 842 } 843 844 #endif 845 846 /** 847 848 * The RC4 cipher type (Apple CommonCrypto provider) 849 * 850 * @return the RC4 EVP_CIPHER pointer. 851 * 852 * @ingroup hcrypto_evp 853 */ 854 855 const EVP_CIPHER * 856 EVP_cc_rc4(void) 857 { 858 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 859 static const EVP_CIPHER rc4 = { 860 0, 861 1, 862 16, 863 0, 864 EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, 865 cc_rc4_init, 866 cc_do_cipher, 867 cc_cleanup, 868 sizeof(struct cc_key), 869 NULL, 870 NULL, 871 NULL, 872 NULL 873 }; 874 return &rc4; 875 #elif HCRYPTO_FALLBACK 876 return EVP_hcrypto_rc4(); 877 #else 878 return NULL; 879 #endif 880 } 881 882 883 /** 884 * The RC4-40 cipher type (Apple CommonCrypto provider) 885 * 886 * @return the RC4 EVP_CIPHER pointer. 887 * 888 * @ingroup hcrypto_evp 889 */ 890 891 const EVP_CIPHER * 892 EVP_cc_rc4_40(void) 893 { 894 #ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 895 static const EVP_CIPHER rc4_40 = { 896 0, 897 1, 898 5, 899 0, 900 EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, 901 cc_rc4_init, 902 cc_do_cipher, 903 cc_cleanup, 904 sizeof(struct cc_key), 905 NULL, 906 NULL, 907 NULL, 908 NULL 909 }; 910 return &rc4_40; 911 #elif HCRYPTO_FALLBACK 912 return EVP_hcrypto_rc4_40(); 913 #else 914 return NULL; 915 #endif 916 } 917 918 #endif /* __APPLE__ */ 919 920