- crypto: KDF Ayla (двойной HMAC, suffix 0x30/31/32; app/dev направления),
AES-256-CBC с непрерывной цепочкой (iv обновляется mbedtls на месте),
Java-паддинг >=1 NUL; mode-latch против misuse (encrypt|decrypt);
zeroize ключей при повторном init; векторы из APK (4 сессии × 4 сообщения,
включая legacy-приём без NUL) — scripts/gen_kdf_vectors.py.
- envelope: pack/unpack {"enc","sign"}; расшифровка (движение цепочки)
ДО проверки подписи; сравнение подписи в константном времени;
extract_seq_no — depth-1 сканер без лимита токенов (OOB после escape
исправлен, регресс-тесты по ASan-репро ревьюера).
- json: Writer (фикс. буфер, стек глубин, escape, ok()=false при
переполнении) + Doc на jsmn (64 токена, unescape, overflow-guard).
- httpc: блокирующий POST/PUT для local_reg (статус 200-599, дренаж,
shutdown перед close).
- third_party/jsmn (MIT, JSMN_STATIC).
- CMake: mbedtls системный (/usr/include/mbedtls3) или FetchContent;
IDF: PRIV_REQUIRES mbedtls.
- CI: 3 конфигурации — gcc-Release, gcc-Debug+ASan/UBSan, clang-Release;
6/6 тестов стабильно; ESP-IDF esp32 build complete.
Ревью под-агентом: 3 круга (OOB-блокер + тестовые флаки закрыты), APPROVED.
33 lines
1.3 KiB
C++
33 lines
1.3 KiB
C++
// Минимальный HTTP-клиент для исходящих запросов к модулю (local_reg).
|
||
// Один запрос — одно соединение; достаточно для keep-alive-цикла протокола
|
||
// (проверено на приборе: модуль принимает local_reg на новых соединениях).
|
||
#pragma once
|
||
|
||
#include <cstddef>
|
||
#include <cstdint>
|
||
|
||
namespace fgl::ayla {
|
||
|
||
struct HttpcRequest {
|
||
const char* method = "PUT"; // "POST" | "PUT"
|
||
const char* host = nullptr; // dotted-quad или DNS-имя
|
||
uint16_t port = 80;
|
||
const char* path = "/local_reg.json";
|
||
const char* query = nullptr; // без '?', может быть nullptr
|
||
const char* content_type = "application/json";
|
||
const uint8_t* body = nullptr;
|
||
size_t body_len = 0;
|
||
uint32_t timeout_ms = 10000;
|
||
};
|
||
|
||
struct HttpcResponse {
|
||
int status = 0; // HTTP-код или 0 при ошибке транспорта
|
||
bool transport_ok = false;
|
||
};
|
||
|
||
// Выполняет запрос блокирующе. Тело ответа не читается (у local_reg оно
|
||
// пусто), но соединение закрывается корректно (shutdown перед close).
|
||
bool httpc_perform(const HttpcRequest& req, HttpcResponse* resp);
|
||
|
||
} // namespace fgl::ayla
|