• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

TLSR8251 + LCD + термометр = LYWSD03MMC XIAOMI Bluetooth термометр

pvvx

Активный участник сообщества
Для сверх оптимизации можно выкинуть из ccm.c/ccm.h
C:
    /*
     * If there is additional data, update CBC-MAC with
     * add_len, add, 0 (padding to a block boundary)
     */
    if (add_len > 0) {
        size_t use_len;
        len_left = add_len;
        src = add;
        memset(b, 0, 16);
        b[0] = (unsigned char) ((add_len >> 8) & 0xFF);
        b[1] = (unsigned char) ((add_len) & 0xFF);
        use_len = len_left < 16 - 2 ? len_left : 16 - 2;
        memcpy(b + 2, src, use_len);
        len_left -= use_len;
        src += use_len;
        UPDATE_CBC_MAC;
        while (len_left > 0) {
            use_len = len_left > 16 ? 16 : len_left;
            memset(b, 0, 16);
            memcpy(b, src, use_len);
            UPDATE_CBC_MAC;
            len_left -= use_len;
            src += use_len;
        }
    }
Но термометрам всё равно желательно работать с mijia форматом, а там используется "add"...
 

Slacky

Member
А я правильно понимаю, что в каждом рекламном пакете счетчик в nonce каждый раз увеличивается? И нужно ли его хранить или при сбросе модуля можно с начала начать, например с 1?
 

pvvx

Активный участник сообщества
У меня в SDK нет такой функции - tn_aes_128 ...
У вас урезанный SDK, что-то из новых огрызков типа "B85M...".
Не очень то сложно глянуть дизасм и слепить void tn_aes_128(unsigned char *key, unsigned char *plaintext, unsigned char *result)
C:
#include "aes_ccm.h" // used: void aes_ll_encryption(unsigned char* key, unsigned char* plaintext, unsigned char *encrypted_data);
#include "utility.h" // used: swapX(const u8 *src, u8 *dst, int len)
/*
void swapX(const u8 *src, u8 *dst, int len) {
    int i;
    for (i = 0; i < len; i++)
        dst[len - 1 - i] = src[i];
}
*/

/* tn_aes_128():
    tpush    {r4, r5, r6, r7, lr}
    tsub    sp, #32
    tadds    r6, r1, #0 // r6 = plaintext
    tadds    r7, r2, #0 // r7 = result
    tadd    r5, sp, #16
    tadds    r1, r5, #0  // r1 = sp+16 -> swapX_key
    tmovs    r2, #16 // r0 = key, r1 = sp+16, 16
    tjl    swapX
    tadds    r0, r6, #0 // plaintext
    tmov    r1, sp     // r1 = sp -> swapX_plaintext
    tmovs    r2, #16 
    tjl    swapX // r0 = key, r1 = sp, 16
    tadds    r0, r5, #0 // swapX_key
    tmov    r1, sp       // swapX_plaintext
    tadds    r2, r7, #0
    tjl    aes_ll_encryption
    tadd    sp, #32
    tpop    {r4, r5, r6, r7, pc}
*/

void tn_aes_128(unsigned char *key, unsigned char *plaintext, unsigned char *result) {
    unsigned char skey[16];
    unsigned char splaintext[16];
    swapX(key, &skey, sizeof(skey));
    swapX(plaintext, &splaintext, sizeof(splaintext));
    aes_ll_encryption(&skey, &splaintext, result);
}
 

Slacky

Member
У вас урезанный SDK, что-то из новых огрызков типа "B85M...".
Взят на официально сайте telink'а. Где тогда взять не урезанную? Вот у Вас, кстати, в ATC_MiThermometer что за SDK используется?

Не получилось. Точнее не совсем получилось. Если зашифровать, а потом расшифровать функцией из ccm.c c mode 1
Код:
int ccm_auth_crypt( int mode, const unsigned char *key,
                           const unsigned char *iv, size_t iv_len,
                           const unsigned char *add, size_t add_len,
                           const unsigned char *input, size_t length,
                           unsigned char *output,
                           unsigned char *tag, size_t tag_len )
То все прекрасно засшифровывается.

Но при регистрации датчика в BTHOME HA, ключ не принимается и пишет, что не обнаружено ни одного датчика bthome формата ...
 

pvvx

Активный участник сообщества
Но при регистрации датчика в BTHOME HA, ключ не принимается и пишет, что не обнаружено ни одного датчика bthome формата ...
Дык для начала сравните с данными из скрипта Питона
Я ещё не переходил и не переводил поддерживаемые термометры на BTHome2 (причины описаны ранее).
 

pvvx

Активный участник сообщества
Взят на официально сайте telink'а. Где тогда взять не урезанную? Вот у Вас, кстати, в ATC_MiThermometer что за SDK используется?
Не урезанной версией являются SDK к которым Telink прикручивал Mijia или Tuya (отдельно выкладывали полные исходники, а сами SDK уже раздельно ещё лежат). Там необходима кучка шифрации и стыковка по функциям с другими API и SDK расширен на это.
А в B85M.. SDK вырезали из общей либы шифрацию и оставили только нужную для BLE часть.
 

Slacky

Member
Не урезанной версией являются SDK к которым Telink прикручивал Mijia или Tuya (отдельно выкладывали полные исходники, а сами SDK уже раздельно ещё лежат). Там необходима кучка шифрации и стыковка по функциям с другими API и SDK расширен на это.
Т.е. я могу взять за основу SDK из Вашего проекта?
 

pvvx

Активный участник сообщества
Т.е. я могу взять за основу SDK из Вашего проекта?
Можно - это копия от https://github.com/Ai-Thinker-Open/Telink_825X_SDK но с мелкими исправлениями нужными мне. Этот SDK был (и есть?) у Telink, но Ai-Thinker исправил пути к некоторым include"" и слепил маке файлы. Изначально проект был портирован с этим SDK, но я собирал его на аналоге SDK от Telink. Потом вставил искареженный под свои условия.
Т.е. SDK одинаково - что от Telink, что от Ai-Thinker.

И во всех SDK за последние пару лет вырезана либа libesb_ll.a для работы с форматом ESB.
В более новых пытаются её описать по другому, но не все функции есть - есть только куски. А ESB либа имеет всё сразу готовое и найти её ныне можно в старых SDK для других чипов (но она совместима и там есть упоминание о 825x). ESB - это в простонародии = RF24.
И т.д.
 

pvvx

Активный участник сообщества
Вот это https://github.com/Ai-Thinker-Open/Telink_SIG_Mesh - содержит исходники для Mijia BLE MESH (MiHome).
А так-же в сети есть tuya_ble_sdk_Demo_Project_tlsr8253 с Kite BLE SDK 3.4.0 Patch, там все исходники port под API Tuya и SDK tuya.
Это уже старое - новое не искал, т.к. и этого достаточно...
 

Slacky

Member
Дык для начала сравните с данными из скрипта Питона
Я ещё не переходил и не переводил поддерживаемые термометры на BTHome2 (причины описаны ранее).
Я вообще в питоне ни бум-бум ...

Но. Вот этот скрипт я немного модифицировал и подсунул ему свои данные. И облом. Он ругается на мас-адрес. Я уж его (mac) и напрямую подсовывал и наоборот. Все равно не работает. А еще, если им зашифровать, получается другой MIC.

Есть где-то проверить, мож прога какая? Сервисы онлайн, что нашел поисковик, полная лажа ...
Код:
key - '231d39c1d7cc1ab1aee224cd096db932'
MAC - '7c894538c1a4'
orig ptext - '01640ce40c3eb31500003e0a1a0000'
adv_crypt_data - '0201061b16d2fc4194274cf80759da214003bd8fec6d560f000000fd9e620f'
Без шифрации BTHome все прекрасно видит, и батарею и вольтаж и два счетчика ...
 

pvvx

Активный участник сообщества
А есть исходники, чтобы не калякать самому с нуля, и чтобы он прямо в рекламу давал итого? (у меня есть всевозможные сканеры BLE и т.д.)
Можно кинуть в github, не включая в проект (makefile)?
 

Slacky

Member
А есть исходники, чтобы не калякать самому с нуля, и чтобы он прямо в рекламу давал итого? (у меня есть всевозможные сканеры BLE и т.д.)
Можно кинуть в github, не включая в проект (makefile)?
Сейчас подумаю, как лучше сделать. Не хочу выкладывать исправления в проект на github'е, пока все не обкатаю. А тут еще обновление свалилось HA, в интеграцию Bluetooth добавили галку passive scanning. Теперь HA вообще перестал видеть мое устройство ...

О, а давайте я Вам в личку ссылочку на архив скину?
 

pvvx

Активный участник сообщества
Но. Вот этот скрипт я немного модифицировал и подсунул ему свои данные. И облом.
Там ещё какие-то странности... Всё "сырое" в BTHome v2 и особенно в интеграциях к 'bluetooth' с Bluez.
Буду пробовать разгрести, возможно сегодня разберемся...
В HA только признали, что с Bluez работают только древние адаптеры CSR A10 (BT4.0), а остальные, не имеющие USB2.0 HS ничего не тянут. Но и это четко не описали в списках поддерживаемых адаптеров :)
 

pvvx

Активный участник сообщества
Сейчас подумаю, как лучше сделать.
У вас не заполнено 'Nonce', естественно и выход шифрации крив.
При старте прошивка пишет (дополнен вывод данных):
Код:
Start user_init_normal()
Read config from flash address - 0x40800
MAC - '000000000000'
counter - 1
Bindkey - '00000000000000000000000000000000'
Adv Data - '01640ce40c3eb31500003e0a1a0000'
Nonce - '00000000000000000001000000'
Adv Crypt Data - '000000000000000034acbccbfda6f93eb358222b326dc1010000009dcdb633'
ret - 0x0, decrypt data - '01640ce40c3eb31500003e0a1a0000'
 

pvvx

Активный участник сообщества
Значит такие дела:
В моем используемом SDK, тестовый проход:
Код:
Bindkey - '000102030405060708090a0b0c0d0e0f'
Adv Data - '01640ce40c3eb31500003e0a1a0000'
Nonce - '2415342d585ad2fc4101000000'
Adv Crypt Data  - '02353d4f95800e4dca11e7e935b39e'
MIC - '5cefa691'
При вводе этих данных в bthome_v2_encryption.py получаем:
Код:
====== Test encode -----------------------------------------
Preparing data for encryption
MAC: 2415342d585a
Binkey: 000102030405060708090a0b0c0d0e0f
Data: 01640ce40c3eb31500003e0a1a0000
Nonce: 2415342d585ad2fc4101000000
Ciphertext: 02353d4f95800e4dca11e7e935b39e
MIC: 5cefa691
Encrypted data: d2fc4102353d4f95800e4dca11e7e935b39e010000005cefa691
====== Test decode -----------------------------------------
MAC: 2415342d585a
Bindkey: 000102030405060708090a0b0c0d0e0f
Nonce: 2415342d585ad2fc4101000000
Ciphertext: 02353d4f95800e4dca11e7e935b39e
MIC: 5cefa691
Starting Decryption data
Decryption succeeded, decrypted data: 01640ce40c3eb31500003e0a1a0000
Т.е. всё хорошо.

Тестовая функция приложена:
 

Вложения

pvvx

Активный участник сообщества
Далее надо её впихнуть в ваш SDK... Скоро впихну...
 

Slacky

Member
MIC другой.
Код:
Bindkey - '000102030405060708090a0b0c0d0e0f'
Adv Data - '01640ce40c3eb31500003e0a1a0000'
Nonce - '2415342d585ad2fc4101000000'
Adv Crypt Data  - '6dfabfcbefe7a2df58bd8093b13151'
MIC - 'fec249ec'
 
Сверху Снизу