Как рассчитать AES CMAC с помощью функций OpenSSL CMAC_xxx?

Есть ли способ вычислить AES CMAC с помощью OpenSSL/libcrypto?

Желательно таким образом, чтобы использовать преимущества AES-NI (или любого другого аппаратного ускорения).

См. также Сбой создания ключа CMAC с помощью OpenSSL EVP_DigestSign*


person RubenLaguna    schedule 05.02.2015    source источник
comment
Также см. Подписание и проверка EVP на вики OpenSSL. Интерфейсы EVP являются рекомендуемыми интерфейсами для этой операции.   -  person jww    schedule 08.02.2015
comment
Но можно ли использовать EVP для CMAC? Я пытался найти способ, но какая комбинация дайджеста/знака создаст настоящий CMAC AES 128?   -  person RubenLaguna    schedule 18.02.2015
comment
ecerulm Я также хочу использовать OpenSSL для CMAC с использованием интерфейсов EVP. Есть новости по этому поводу? Вы добились успеха?   -  person user907810    schedule 13.01.2016
comment
Последний раз я проверял год назад, и я не мог заставить его работать.   -  person RubenLaguna    schedule 25.01.2016
comment
ecerlum: ты знаешь, где ты застрял? У меня проблемы с созданием ключей CMAC...   -  person user489152    schedule 27.01.2016


Ответы (1)


Как указано в моем сообщении в блоге вы можете использовать CMAC_CTX_new, CMAC_Init, CMAC_Update и CMAC_Final из lib crypto для расчета AES-128-CBC CMAC. Вот пример:

#include <stdio.h>
#include <openssl/cmac.h>

void printBytes(unsigned char *buf, size_t len) {
  for(int i=0; i<len; i++) {
    printf("%02x ", buf[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[])
{
  // https://tools.ietf.org/html/rfc4493

  // K, M and T from 
  // http://csrc.nist.gov/publications/nistpubs/800-38B/Updated_CMAC_Examples.pdf
  // D.1 AES-128

  // K: 2b7e1516 28aed2a6 abf71588 09cf4f3c
  unsigned char key[] = { 0x2b,0x7e,0x15,0x16, 
                          0x28,0xae,0xd2,0xa6,
                          0xab,0xf7,0x15,0x88,
                          0x09,0xcf,0x4f,0x3c};

  // M: 6bc1bee2 2e409f96 e93d7e11 7393172a Mlen: 128
  unsigned char message[] = { 0x6b,0xc1,0xbe,0xe2, 
                              0x2e,0x40,0x9f,0x96, 
                              0xe9,0x3d,0x7e,0x11, 
                              0x73,0x93,0x17,0x2a };

  unsigned char mact[16] = {0}; 
  size_t mactlen;

  CMAC_CTX *ctx = CMAC_CTX_new();
  CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL);
  printf("message length = %lu bytes (%lu bits)\n",sizeof(message), sizeof(message)*8);

  CMAC_Update(ctx, message, sizeof(message));
  CMAC_Final(ctx, mact, &mactlen);

  printBytes(mact, mactlen);
  /* expected result T = 070a16b4 6b4d4144 f79bdd9d d04a287c */

  CMAC_CTX_free(ctx);
  return 0;
}
person RubenLaguna    schedule 05.02.2015