subkeys K1 and K2 generation for CMAC */
| 598 | |
| 599 | /* subkeys K1 and K2 generation for CMAC */ |
| 600 | static int |
| 601 | generate_cmac_subkeys(struct ccp_session *sess) |
| 602 | { |
| 603 | const EVP_CIPHER *algo; |
| 604 | EVP_CIPHER_CTX *ctx; |
| 605 | unsigned char *ccp_ctx; |
| 606 | size_t i; |
| 607 | int dstlen, totlen; |
| 608 | unsigned char zero_iv[AES_BLOCK_SIZE] = {0}; |
| 609 | unsigned char dst[2 * AES_BLOCK_SIZE] = {0}; |
| 610 | unsigned char k1[AES_BLOCK_SIZE] = {0}; |
| 611 | unsigned char k2[AES_BLOCK_SIZE] = {0}; |
| 612 | |
| 613 | if (sess->auth.ut.aes_type == CCP_AES_TYPE_128) |
| 614 | algo = EVP_aes_128_cbc(); |
| 615 | else if (sess->auth.ut.aes_type == CCP_AES_TYPE_192) |
| 616 | algo = EVP_aes_192_cbc(); |
| 617 | else if (sess->auth.ut.aes_type == CCP_AES_TYPE_256) |
| 618 | algo = EVP_aes_256_cbc(); |
| 619 | else { |
| 620 | CCP_LOG_ERR("Invalid CMAC type length"); |
| 621 | return -1; |
| 622 | } |
| 623 | |
| 624 | ctx = EVP_CIPHER_CTX_new(); |
| 625 | if (!ctx) { |
| 626 | CCP_LOG_ERR("ctx creation failed"); |
| 627 | return -1; |
| 628 | } |
| 629 | if (EVP_EncryptInit(ctx, algo, (unsigned char *)sess->auth.key, |
| 630 | (unsigned char *)zero_iv) <= 0) |
| 631 | goto key_generate_err; |
| 632 | if (EVP_CIPHER_CTX_set_padding(ctx, 0) <= 0) |
| 633 | goto key_generate_err; |
| 634 | if (EVP_EncryptUpdate(ctx, dst, &dstlen, zero_iv, |
| 635 | AES_BLOCK_SIZE) <= 0) |
| 636 | goto key_generate_err; |
| 637 | if (EVP_EncryptFinal_ex(ctx, dst + dstlen, &totlen) <= 0) |
| 638 | goto key_generate_err; |
| 639 | |
| 640 | memset(sess->auth.pre_compute, 0, CCP_SB_BYTES * 2); |
| 641 | |
| 642 | ccp_ctx = (unsigned char *)(sess->auth.pre_compute + CCP_SB_BYTES - 1); |
| 643 | prepare_key(k1, dst, AES_BLOCK_SIZE); |
| 644 | for (i = 0; i < AES_BLOCK_SIZE; i++, ccp_ctx--) |
| 645 | *ccp_ctx = k1[i]; |
| 646 | |
| 647 | ccp_ctx = (unsigned char *)(sess->auth.pre_compute + |
| 648 | (2 * CCP_SB_BYTES) - 1); |
| 649 | prepare_key(k2, k1, AES_BLOCK_SIZE); |
| 650 | for (i = 0; i < AES_BLOCK_SIZE; i++, ccp_ctx--) |
| 651 | *ccp_ctx = k2[i]; |
| 652 | |
| 653 | EVP_CIPHER_CTX_free(ctx); |
| 654 | |
| 655 | return 0; |
| 656 | |
| 657 | key_generate_err: |
no test coverage detected