• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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'
 
Сверху Снизу