AES128-GCM с использованием mbedtls при расшифровке ESP32 не работает

В настоящее время я работаю над проектом по расшифровке потока байтов, поступающего от интеллектуального счетчика, с использованием ESP32 с набором инструментов ESP-IDF. (Спецификация интеллектуального счетчика здесь для заинтересованных: P1PortSpecification.pdf, глава 2.6 стр.9).

Я использую конечный автомат, чтобы разделить поток на различные части, как указано в документации, и при их выводе на терминал я получаю ожидаемые результаты, поэтому считаю, что введенные данные верны.

Приступая к финальному этапу расшифровки полезной нагрузки, я не уверен, правильно ли я использую библиотеку mbedtls, так как я не могу заставить ее работать должным образом. Используемое шифрование - AES128-GCM, поэтому я использую gcm.h. Вот моя текущая функция:

int decrypt_next_telegram(unsigned char *output) {
    //Run the state machine, and get pointers to the IV, cipher and length, GCM tag
    Encrypted_Data ed = get_next_telegram(); 

    //Key specific to my smart meter I use for testing purposes and the Auth data
    const unsigned char key[] = {0xD4, 0x91, 0x47, 0x0F, 0x47, 0x12, 0x63,
            0x32, 0xB0, 0x7D, 0x19, 0x23, 0xB3, 0x50, 0x41, 0x88};
    const unsigned char aad[] = {0x30, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55,
            0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}

    mbedtls_gcm_context ctx;
    mbedtls_gcm_init(&ctx);
    int err1 = mbedtls_gcm_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, key, 128);
    int err2 = mbedtls_gcm_auth_decrypt(&ctx, ed.payload_length, ed.initial_value, 12, aad, 17, ed.gcm_tag, 12, ed.payload, output);
    mbedtls_gcm_free(&ctx);
    return err1 + err2;
}

Чтобы дать вам дополнительную информацию о том, как выглядит Encrypted_Data:

typedef struct Encrypted_Data Encrypted_Data;

struct Encrypted_Data {
        unsigned char * initial_value;
        unsigned char * payload;
        unsigned int payload_length;
        unsigned char * gcm_tag;
};

При выводе обеих ошибок на терминал я вижу err1 = 0 и err2 = -0x0012, то есть:

#define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */

Итак, я покопался в файле gcm.c и заметил, что есть только одно место, где используется это определение (здесь), но кое-что еще привлекло мое внимание. Я сомневаюсь, что это ошибка, но я не могу понять причину этой части в

int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,
                    mbedtls_cipher_id_t cipher,
                    const unsigned char *key,
                    unsigned int keybits )
{
    int ret;
    const mbedtls_cipher_info_t *cipher_info;

    cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB );
    ... 
}

нашел здесь. Почему он использует этот режим? Если я просматриваю содержимое cipher_info, он говорит мне, что он использует MBEDTLS_CIPHER_AES_128_ECB как mbedtls_cipher_type_t вместо того, что я ожидал сначала MBEDTLS_CIPHER_AES_128_GCM. Это проблема?

Подытоживая мои основные вопросы:

  • Это неожиданная mbedtls_cipher_type_t проблема?
  • Правильно ли я использую функции mbedtls?
  • Открыт для предложений по поиску проблемы, так как я еще не знаком с этой платформой.

Спасибо за прочтение.


person Netsky    schedule 18.07.2018    source источник


Ответы (1)


Что ж, я нашел решение своей личной проблемы. Я использовал заранее записанные телеграммы, которые отправлял по USB на вывод UART. К сожалению, USB-контроллер моего ПК кое-где не работает.

Жесткое кодирование телеграммы в код работает отлично ...

person Netsky    schedule 19.07.2018