You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.0 KiB
5.0 KiB
Config Updater (config_updater.c/h)
1. Назначение
Утилита автоматической инициализации и обновления ключей в конфигурационном файле uTun.
Основная задача — гарантировать, что в конфиге всегда присутствуют корректные и согласованные:
my_private_key(X25519, 64 hex символа)my_public_key(производный от private, 64 hex)my_node_id(SHA256-идентификатор узла, 16 hex символов, вычисляется из private key)
Если чего-то нет или значение неконсистентно — модуль генерирует недостающее через secure_channel.h и атомарно перезаписывает конфиг, сохраняя всё остальное содержимое файла нетронутым.
2. Как пользоваться
#include "config_updater.h"
int ret = config_ensure_keys_and_node_id("/etc/utun/config.ini");
if (ret == 0) {
// Конфиг готов: ключи и node_id гарантированно на месте
} else {
// Ошибка — смотри DEBUG_*(DEBUG_CATEGORY_CONFIG)
}
Типовой сценарий (первый запуск):
- Файла нет → создаётся минимальный
[global]сmy_node_name, сгенерированными ключами иmy_node_id. - Файл есть, но нет
my_private_key→ генерируется новая X25519-пара, записываются все три поля. - Файл есть с
my_private_key, но нетmy_public_keyилиmy_node_id→ вычисляются из private key, дописываются. - Все поля есть, но
my_public_keyне соответствуетmy_private_keyилиmy_node_idне совпадает → перезаписываются на корректные.
Нюансы:
- Вычисление pubkey:
sc_compute_public_key_from_private(priv_bin, pub_bin). - Вычисление node_id:
sc_derive_node_id(priv_bin). - Генерация новой пары ключей:
sc_generate_keypair(&mykeys). - Файл читается целиком в память, модифицируется через
insert_or_replace_option, затем пишется обратно. Это атомарно: либо файл полностью перезаписан, либо остался нетронутым (при ошибке). - Редактирование in-place через
memmove: строки не сдвигают остальной конфиг, только вставляются/заменяются нужные опции внутри секции[global]. - Для нового файла создаётся минимальный
[global]с именем узла изmy_node_name(или"utun"если не задано).
3. API
Функции
| Функция | Назначение |
|---|---|
config_ensure_keys_and_node_id(filename) |
Основная функция. Читает конфиг, проверяет/генерирует ключи и node_id, записывает обратно. Возвращает 0 при успехе, -1 при ошибке. |
bytes_to_hex(bytes, len, hex_str, hex_len) |
Вспомогательная: конвертация бинарного массива в hex-строку. Безопасна для нулевых указателей и маленьких буферов. |
Внутренние функции (static)
| Функция | Назначение |
|---|---|
is_valid_priv_key(key) |
Проверяет, что строка — 64 hex-символа |
is_valid_pub_key(key) |
То же для публичного ключа |
is_valid_node_id(node_id) |
Проверяет node_id != 0 |
write_mem_to_file(filename, buffer, size) |
Пишет буфер в файл (одной операцией) |
find_section_global(buf, buf_len) |
Ищет позицию после [global] в текстовом буфере |
find_option(buf, buf_len, option) |
Ищет строку option=... в буфере |
insert_or_replace_option(buf, buf_len, buf_capacity, option, value) |
Заменяет значение опции при наличии, либо вставляет новую строку после [global]. Работает с memmove/memcpy, перевыделяет буфер при необходимости. |
Зависимости
secure_channel.h—sc_generate_keypair(),sc_compute_public_key_from_private(),sc_derive_node_id()config_parser.h—parse_config_from_buf(),free_config(), структурыutun_config/global_configlib/mem.h—u_malloc,u_realloc,u_freelib/debug_config.h—DEBUG_*