Summary
Calculation the CMAC value in different way, the value is same, but not as same as the openssl CMAC value.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "mbedtls/cmac.h"
#include "mbedtls/platform.h"
#include <openssl/cmac.h>
#include <openssl/evp.h>
uint8_t key[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, };
uint8_t input[32] = {0};
uint8_t output[16] = {0};
void dump_buf(char *info, const uint8_t *buf, uint32_t len);
int mbedtls_cmac_step(void);
int openssl_cmac_step(void);
int main(int argc, char *argv[])
{
for (int i = 0; i < sizeof(input); i++) {
input[i] = i;
}
// mbedtls-1
mbedtls_aes_cmac_prf_128(key, sizeof(key), input, sizeof(input), output);
dump_buf("mbedtls_aes_cmac_prf_128():", output, sizeof(output));
// mbedtls-2
mbedtls_cipher_cmac(mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB ),key, sizeof(key) * 8, input, sizeof(input), output);
dump_buf("mbedtls_cipher_cmac():", output, sizeof(output));
// mbedtls-3
mbedtls_cmac_step();
dump_buf("mbedtls_cmac_step():", output, sizeof(output));
// openssl-1
openssl_cmac_step();
dump_buf("openssl_cmac_step(): ", output, olen);
return 0;
}
void dump_buf(char *info, const uint8_t *buf, uint32_t len)
{
mbedtls_printf("%s", info);
for (int i = 0; i < len; i++) {
mbedtls_printf("%s%02x ", i % 16 == 0 ? "\n\t" : " ", buf[i]);
}
mbedtls_printf("\n");
}
int mbedtls_cmac_step(void)
{
const mbedtls_cipher_info_t *cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );;
if (cipher_info == NULL) {
mbedtls_printf("mbedtls_cipher_info_from_type() error\r\n");
return -1;
}
mbedtls_cipher_context_t cctx;
mbedtls_cipher_init(&cctx);
if (mbedtls_cipher_setup(&cctx, cipher_info) != 0) {
mbedtls_printf("mbedtls_cipher_setup() error\r\n");
return -1;
}
if (mbedtls_cipher_cmac_starts(&cctx, key, sizeof(key) * 8) != 0) {
mbedtls_printf("mbedtls_cipher_cmac_starts() error\r\n");
return -1;
}
if (mbedtls_cipher_cmac_update(&cctx, input, sizeof(input)) != 0) {
mbedtls_printf("mbedtls_cipher_cmac_update() error\r\n");
mbedtls_cipher_free(&cctx);
return -1;
}
if (mbedtls_cipher_cmac_finish(&cctx, output) != 0) {
mbedtls_printf("mbedtls_cipher_cmac_update() error\r\n");
mbedtls_cipher_free(&cctx);
return -1;
}
mbedtls_cipher_free(&cctx);
return 0;
}
int openssl_cmac_step(void)
{
CMAC_CTX *cmac_ctx = CMAC_CTX_new();
if (!cmac_ctx) {
printf("CMAC_CTX_new() error.\r\n");
return -1;
}
if (!CMAC_Init(cmac_ctx, key, 16, EVP_aes_128_ecb(), 0)) {
CMAC_CTX_free(cmac_ctx);
printf("CMAC_Init() error.\r\n");
return -1;
}
if (!CMAC_Update(cmac_ctx, input, sizeof(input))) {
printf("CMAC_Update() error.\r\n");
return -1;
}
int olen = 0;
if (!CMAC_Final(cmac_ctx, output, &olen)) {
printf("CMAC_Final() error.\r\n");
return -1;
}
CMAC_CTX_free(cmac_ctx);
return 0;
}
System information
Mbed TLS version (number or commit id): mbed TLS 3.0.0
Operating system and version: windows7 mingw
Actual behavior
the output:
mbedtls_aes_cmac_prf_128():
85 c8 6e c8 6d 50 8d 8a cc f9 07 97 2f da 04 36
mbedtls_cipher_cmac():
85 c8 6e c8 6d 50 8d 8a cc f9 07 97 2f da 04 36
mbedtls_cmac_step():
85 c8 6e c8 6d 50 8d 8a cc f9 07 97 2f da 04 36
openssl_cmac_step():
33 09 88 6f c1 0f f0 71 20 32 2f 85 f5 b8 b3 58
Additional information
When the input
size is 16
, the CMAC values of mbedtls and openssl are same, <16
or >16
all not same.