
Фреймворк для управления устройствами QKD и управления симметричными ключами. См. [страницу проекта здесь](https://qcomms.gitlab.io/cqptoolkit/)
Система предоставляет различные компоненты для интеграции QKD в систему безопасности. Она написана на C++11, но использует интерфейсы [GRPC][], поэтому может быть интегрирована с множеством различных языков.
Для запуска программного обеспечения нативно, либо:
Для клонирования исходного кода, включая подмодули:
git clone --recurse-submodules https://gitlab.com/QComms/cqptoolkit.git
``````bash
git clone --recurse-submodules [email protected]:QComms/cqptoolkit.git
Если вы клонировали без использования
--recurse-submodules, подмодули можно обновить, выполнивgit submodule update --initиз папки исходного кода.
Вот список зависимостей, необходимых для компиляции проекта (пожалуйста, ознакомьтесь с подробностями установки ниже):```bash
sudo apt install pkg-config ca-certificates file build-essential cmake ninja-build libusb-1.0-0-dev libcurl4-openssl-dev
libcrypto++-dev libcap-dev uuid-dev libssl-dev libsqlite3-dev libprotobuf-dev libgrpc++-dev
libssl-dev protobuf-compiler protobuf-compiler-grpc checkinstall
mkdir build-cqptoolkit
cd build-cqptoolkit
cmake -G Ninja ../cqptoolkit && ninja
**Быстрый тест**
Из папки сборки, чтобы запустить два сайта (на одном локальном компьютере) каждый с устройством QKD, сначала запустите сайт «A», запустив агент сайта и подключив к нему «фиктивный драйвер» Alice:
*(Если бинарные файлы установлены, опустите пути к командам из инструкций.)*```bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a
-n, --ipv4 / --ipv6 / --pkt)
и затем запустите сканирование:
флаг тип пример использования
tcp/1000 tcp/1000
tcp/open `tcp/Open````bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8001 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8001 -b
Это не начнет сразу создавать ключ, поскольку эта система предназначена для управления через систему управления, соединение должно быть установлено с помощью команды *SiteAgentCtl*.
- Во-первых, вы можете проверить список доступных устройств с помощью:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -d -c localhost:8000
что по умолчанию должно дать нечто подобное этому, если SiteAgentRunner и DummyQKDDriver были запущены без указания аргумента конфигурационного файла строки JSON:```json { "url": ":8000", "devices": [ { "config": { "id": "dummyqkd__0__16_alice", "kind": "dummyqkd" }, "controlAddress": ":34219" } ] }
и порт `8001` должен выдать что-то похожее на```json
{
"url": "<hostname>:8001",
"devices": [
{
"config": {
"id": "dummyqkd__0__16_bob",
"side": "Bob",
"kind": "dummyqkd"
},
"controlAddress": "<hostname>:38367"
}
]
}
Это создаст один переход от одного сайта к другому, более сложные маршруты могут быть определены с помощью опции `-a` с JSON-строкой, определяющей путь.
Через несколько секунд должен быть доступен ключ, который можно проверить, запросив ключ.
> ПРИМЕЧАНИЕ: Параметр -k должен быть URL-адресом, указанным в деталях второго сайта, а не "localhost:8001"```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -k `hostname`:8001
Ссылку можно остановить командой unjoin:```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001
> Несмотря на то, что генерация остановлена, ключ по-прежнему доступен, пока агенты сайта работают.
> Его можно запросить с помощью той же команды запроса ключа, указанной выше.
**Пример шифрования**
Запустив агенты сайта и драйверы на одном локальном компьютере, как описано выше, и после запуска ссылки для обмена ключами, можно также протестировать функции шифрования.
- Сначала запустите одну сторону "VPN" на bob, который будет слушать порт 9010 и подключаться к хранилищу ключей Bob:```
./src/Tools/QTunnelServer/QTunnelServer -p 9010 --keystore-url=`hostname`:8001
Теперь запустите сторону Алисы VPN, определив туннель для создания. Будут открыты два порта, по одному для каждой стороны на 9000 и 9001. Всё, что поступает на эти порты, будет зашифровано, передано на другую сторону, расшифровано и выведено на другой порт.```
./src/Tools/QTunnelServer/QTunnelServer --keystore-url=hostname:8000 --remote=localhost:9010 --start-node=tcpsrv://0.0.0.0:9000 --end-node=tcpsrv://0.0.0.0:9001
Любое приложение, использующее TCP-соединения, может затем использовать этот порт. Netcat — это простая программа, которая будет отправлять данные через порты. Запустите одну на одной стороне:```
nc localhost 9000
и один на другом:``` nc localhost 9001
Все, что вводится на одной стороне, появится на другой после нажатия Enter. Проверка пакетов, проходящих через порты `9000` и `9001`, с помощью такого инструмента, как Wireshark, покажет, что данные зашифрованы и используется идентификатор ключа.
Могут быть созданы другие формы соединения, вместо `tcpserv`:
| Пример | Описание |
| ============================= | ===================================================== |
| tcpserv://0.0.0.0:1234 | Создается порт прослушивания на порту 1234 |
| tcp://127.0.01:1234 | Устанавливается соединение с TCP-портом 1234 на localhost |
| udp://0.0.0.0:1234 | UDP-пакеты отправляются с этого порта |
| tun://192.168.101.1/?netmask=255.255.255.0 | Создается туннельное устройство на уровне IP с IP-адресом |
| tap://192.168.101.1/?netmask=255.255.255.0 | Создается tap-устройство на уровне Ethernet |
| eth://eth0/?level=tcp | Создается сырой сокет, уровень может быть tcp, ip или eth. |
# Прогресс
Запланированные и реализованные функции
- [ ] Драйверы устройств
+ [x] Драйверы совместимости для IDQ Clavis 2
- [ ] Обратная связь устройства
+ [x] Драйверы совместимости для IDQ Clavis 3
+ [x] Портативное устройство свободного пространства Университета Бристоля
+ [ ] Устройство на чипе Университета Бристоля
- [ ] Постобработка
+ [x] Выравнивание для асинхронных систем
+ [x] Просеивание для синхронных систем
+ [ ] Исправление ошибок
+ [ ] Усиление конфиденциальности
- [x] Многосайтовое управление ключами (Site Agents)
+ [x] Управление QKD-устройствами для обмена ключами
+ [x] Предоставление предварительно распределенного ключа через стандартный интерфейс: cqp::remote::IKey
- [x] Ключи могут быть ограничены для использования конкретными пользователями
+ [x] Создание косвенного ключа на основе XOR-операции с ключами с других сайтов
+ [x] Конфигурация через файл конфигурации, аргументы командной строки или сетевой интерфейс.
+ [x] Автоматическое обнаружение Site Agent с помощью [Zeroconf][]
+ [ ] Разрешение ключей по каналам между доверенными сайтами (issue #8)
- [x] Сетевое управление site agents
+ [x] Сайтами можно управлять через интерфейсы
+ [ ] Статическое/динамическое управление site agents для создания ключей между сайтами на основе правил
- [x] Контроллер зашифрованных туннелей (как stunnel)
+ [x] Использует интерфейс IKey для получения общих ключей.
+ [x] Настройка туннелей шифрования с использованием
- [x] TCP/UDP сокет
- [x] TUN/TAP устройство (aka VPN)
- [x] Выделенный физический интерфейс
+ [x] Конфигурация через файл конфигурации, аргументы командной строки или сетевой интерфейс.
+ [x] Автоматическое обнаружение Site Agent и Tunnel Controller с помощью [Zeroconf][]
- [ ] Несколько платформ
+ [x] Linux
+ [ ] Windows (см. issue #2)
Надеемся, что этот проект окажется полезным как для научных исследований, так и для крупных проектов. Более подробную информацию о проекте можно найти в [этой статье](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/paper.md).
Чтобы внести свой вклад в проект, пожалуйста, ознакомьтесь с файлом [Contribution](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Contribution.md).
## Установка
Система в настоящее время работает на Linux — Windows запланирован на будущее. **Проще всего собрать из исходников прямо сейчас**
### Docker образ
Готовый к запуску Docker-образ доступен в [реестре gitlab][]. Вы можете запустить его с помощью `sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime`. Добавьте команду в конце, чтобы запустить что-то напрямую, например, для запуска симуляции генерации QKD-ключей с помощью `QKDSim`:```bash
sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime AlignmentTests
Вы можете установить бинарные пакеты из Gitlab. Распакуйте zip-файл и установите инструменты с помощью dpkg, он будет жаловаться на отсутствующие зависимости, но не волнуйтесь, вторая строка исправит их.```bash
sudo dpkg -i setup/.deb build/gcc/CQP--Linux-{Algorithms,Networking,CQPToolkit,KeyManagement,QKDInterfaces,CQPUI,Simulate,Tools,UI,Drivers,IDQDevices}.deb
sudo apt install -fy
Чтобы установить файлы для разработки (заголовочные файлы и статические библиотеки), выполните `sudo dpkg -i build/gcc/CQP-*-Linux-*-dev.deb ; sudo apt install -fy`.
### Из исходного кода
Конечно, если вы не хотите изменять версии системных библиотек и зависимостей, вы можете выполнить сборку внутри [docker-контейнера](https://www.docker.com/resources/what-container), в котором уже установлены все зависимости, с помощью:```bash
sudo docker run -it registry.gitlab.com/qcomms/cqptoolkit/buildenv
В противном случае сборка из исходного кода требует установки зависимостей, перечисленных в файле setup/setupbuild.sh. В настоящее время это работает для Ubuntu и Arch Linux. Клонируйте исходный код из gitlab с помощью [git][] и соберите с помощью [CMake][] и gnu make: Опция --recurse-submodules добавляет дополнительные компоненты, доступ к некоторым из них ограничен для UoB и её партнёров, но сборка будет работать и без них.```bash
git clone --recurse-submodules https://gitlab.com/QComms/cqptoolkit.git
Если вы хотите получить все подмодули и у вас есть соответствующие логины, выполните:```bash
git submodule update --checkout
Теперь вы можете перейти в свой локальный репозиторий и установить зависимости с помощью скрипта (возможно, потребуется изменить права доступа к файлу):```bash cd cqptoolkit/setup ./setupbuild.sh
Затем вы можете собрать проект в новую папку:```bash
mkdir build-cqptoolkit
cd build-cqptoolkit
cmake ../cqptoolkit && nice make -s -j
# this can be installed with
sudo make install
Сборка использует [CMake][] для создания makefile'ов/решений и т.д. для многих различных платформ и запускается из пустой папки сборки, которая будет содержать все выходные файлы. Отладочные сборки создают пакеты с постфиксом 'D'.
Сборкой можно управлять, передавая параметры cmake, например, -DBUILD_TESTING=OFF. Запустите cmake с опцией -LH, чтобы вывести список доступных переключателей.
Для внесения изменений и разработки библиотеки рекомендуется установить QT Creator и открыть проект, выбрав файл CMakeLists.txt. Рекомендуется использовать параллельную сборку, перейдя в Projects->Build Steps-> Details и добавив -j<число> в параметры инструмента, см. здесь.
После сборки файлы по умолчанию находятся на том же уровне, что и папка проекта, с именем build-<имя проекта>-<платформа>-<цель>.
Примечание о protobuf + QT на Ubuntu Библиотека
qt5-gtk-platformthemeслинкована со старой версией protobuf, что помешает работе наших QT-программ. Эту необязательную зависимость можно удалить с помощьюapt-get remove qt5-gtk-platformtheme
@startuml
title Applicaiton Overview
component "QKD Device Drivers" as drv
interface IDevice as idev
drv - idev
component "Device contol and\n Key storage" as sa
interface IKey as ikey
sa - ikey
sa ..> idev
package "Key consumers" as kc {
component "Custom VPN" as tun
component "Custom\nWeb Server" as nginx
component "HSM bridge" as hsm
}
tun ..> ikey
nginx ..> ikey
hsm ..> ikey
package Utilities {
component "Config/Control GUI" as gui
component "Simulators/Testing" as sim
component "Data extraction" as stats
gui -[hidden]down- sim
sim -[hidden]down- stats
}
@enduml
Ниже представлена блок-схема, которая поможет найти область, актуальную для вас, поскольку проект охватывает множество различных аспектов QKD и управления ключами — участники приветствуются для более специализированного развития этого проекта. QKD требует некоторой формы неклонирующей связи, обычно с использованием одиночных фотонов по оптоволоконному кабелю. Они могут работать точка-точка или один-ко-многим, но по своей сути имеют физическое местоположение (где заканчивается оптоволокно) — их невозможно виртуализировать! Точка, в которой фотон передается или обнаруживается, является границей защищенной системы — почти как межсетевой экран для сети. После того, как неделимые фотоны превращены в строку битов для формирования симметричного ключа, применяются стандартные правила компьютерной безопасности, такие как аутентификация, контроль доступа и т.д. Разница в том, что после создания этих ключей каждое из устройств QKD имеет число, которое никто другой не знает, доказанное наукой.
Природа этого эффекта "межсетевого экрана" заключается в том, что системы, управляющие устройствами QKD, должны быть защищены и считаться доверенными — также называемые "доверенным узлом" — где и как провести границу может варьироваться от вооруженной охраны до простого запирания двери серверной.
Если вы не видите диаграмму ниже, перейдите к онлайн-документации, её также можно собрать с помощью цели doc.
@startuml
title Where to start \n
skinparam activity {
StartColor #EF476F
BarColor #FFD166
EndColor #EF476F
BackgroundColor #06D6A0
BorderColor #118AB2
}
start
if (Do you have a QKD Device?) then (Yes)
if (Does your QKD device have a driver?) then (No)
:You will need to [[./index.html#CreatingDrivers create a driver]] which implements the
<b>IDriver</b> and <b>IReporting</b> interfaces.;
if (Use the library?) then (Yes)
:See the [[./index.html#RunningDummyQKDDriver DummyQKDDriver]] for an example.;
else (No)
endif
else (Yes)
endif
else (No)
:Check out how to run the
[[./index.html#RunningDummyQKDDriver DummyQKDDriver]];
endif
if (Do you want keys for multiple
locations in a network?) then (Yes: Sites)
:[[./index.html#Registering Register your driver]] with the site agent
using the <b>ISiteAgent</b> Interface
Keys can be obtained by using the [[./index.html#IKeyInterface IKey]] interface;
if(Do you want keys to be stored/persist between restarts?) then (Yes)
if (Do the keys need to be secured?) then (Yes)
:Use the [[./index.html#HSMs HSM storage]] options;
if (Is your HSM supported?) then (No)
:Create a driver that implements
the <b>IBackingStore</b> interface.
Add the driver creation to the
<b>BackingStoreFactory</b>;
else (Yes)
endif
else (No)
: When running SiteAgentRunner,
use the option ""-b file"" or
set ""backingStoreUrl"" to
""file:///filename.db"";
endif
else (No)
endif
else (No: Point-to-Point)
:Use the [[./index.html#IDeviceInterface IDevice interface]] to
control the driver for your system.
As keys become available they will
be sent via the call to <b>WaitForSession</b>.;
endif
if (Do you want to use the key for anything?) then (Yes)
:See the [[./index.html#Encryption encryption section]]
for an example of using the [[./index.html#IKeyInterface IKey interface]];
else (No)
endif
stop
@enduml
Этот раздел является лишь комментарием к полезной функциональности DummyQKDDriver для имитации вывода устройства QKD. Пожалуйста, обратитесь к следующему разделу для пошагового примера настройки простого соединения с их помощью.
Как и в большинстве программ, передача -h отобразит доступные параметры. DummyQKDDriver выполняет стандартный набор этапов постобработки для смоделированных обнаружений фотонов с использованием класса cqp::DummyQKD. Необходимо запустить два экземпляра программы: один для Алисы и один для Боба.
Запустите Боба первым на порту 8000, вызвав:```bash
DummyQKDDriver -b -k 0.0.0.0:8000
Теперь запустите Алису, указав ей подключиться к Бобу и начать обмен ключами в ручном режиме:```bash
DummyQKDDriver -a -m localhost:8000
Если это сработало, вы получите поток сообщений об ошибках, подобных этому: ERROR: OnKeyGeneration No listener for generated key. Это связано с тем, что при запуске системы таким образом приятно видеть, что она что-то делает, но это не очень полезно — сгенерированному ключу некуда попасть. Драйверы предназначены для использования чем-то.
В проекте есть система управления ключами, называемая Site Agents, или вы можете напрямую взаимодействовать с драйверами, используя интерфейс IDevice
Site agents, драйверы и VPN-туннели необходимо параметризовать для каждого узла сети с помощью JSON-строковых файлов, поскольку команда по умолчанию без аргументов не задает все необходимые поля и работает только для тестирования на одной локальной машине.
Site agents можно запускать с помощью SiteAgentRunner, мы можем запустить два сайта с:```bash SiteAgentRunner -c site-a.json
и:```bash
SiteAgentRunner -c site-b.json
с каждым JSON-файлом, соответствующим образом указывающим разные порты для Алисы и Боба (например, 9000/9001). Строка JSON выглядит так:```json { "name":"", "id":"", "netManUri":"", "bindAddress":"0.0.0.0", "listenPort":9000, "connectionAddress":"", "credentials": {}, "useAutoDiscover":false, "backingStoreUrl":"", "fallbackKey":"" }
Теперь мы можем подключить наши DummyQKDDriver's, по одному на каждый сайт:```bash
DummyQKDDriver -c driver_config-a.json # run as Alice, register with site agent
и:```bash DummyQKDDriver -c driver_config-b.json # run as Bob, register with site agent
при этом каждый JSON-файл соответствующим образом указывает разный порт для Алисы и Боба (например, 9000/9001). JSON-строка выглядит следующим образом:```json
{
"controlParams": {
"config": {
"id": "dummyqkd__0__16_alice",
"side": "Alice",
"switchName": "",
"switchPort": "",
"kind": "dummyqkd",
"bytesPerKey": 0
},
"controlAddress": "'hostnameIP':4423",
"siteAgentAddress": "127.0.0.1:9000"
},
}
Поле управляющего адреса может быть 0.0.0.0:0, если нет брандмауэра, с которым нужно иметь дело. В таком случае необходимо указать фактический IP хоста и выбрать подходящий порт, который брандмауэр не заблокирует.
Ничего не произойдет, пока агенты сайта не знают, что делать с этими устройствами. Мы можем дать им инструкцию начать создание ключа (-b as begin), отправив команду cqp::ISiteAgent::StartNode:```bash SiteAgentCtl -c localhost:9000 -b '{"hops":[{"first":{"site":"'hostname':9000","deviceId":"dummyqkd__0__16_alice"},"second":{"site":"'hostname':9001","deviceId":"dummyqkd__0__16_bob"}}]}'
More complex setups can be achieved by implementing the cqp::remote::INetworkManager interface yourself to issue the commands. Feedback from the devices comes over the cqp::remote::IReporting interface on the same socket so that you can react to changes in the system. Here you can see how to extract things from the reporting interface with the StatsDump tool.
The driver application is a bridge between the internal device interfaces (cqp::IQKDDevice) and the external cqp::remote::IDevice interface. The cqp::RemoteQKDDevice class handles most of the work for you, the application must handle the configuration and creation of the device.
The real work is in creating a driver to setup the device and read the key. If your device just produces raw detections then you will need to configure a processing pipeline like cqp::DummyQKD or cqp::PhotonDetectorMk1 and cqp::LEDAliceMk1. If your device generates ready to use key like the cqp::Clavis3Device you need to read it and publish it over the cqp::IKeyCallback interface (use cqp::KeyPublisher).
Both these approaches require a form of session management, provided by cqp::session::SessionController and cqp::session::AliceSessionController, these implement the cqp::ISessionController and cqp::remote::ISession interface and are used by cqp::RemoteQKDDevice to start and stop the device and it's peer. These are usually all that's needed but in some situations they need to be specialised to cope with device requirements
@startuml Readme_Drivers
title Anatomy of a driver
package Application {
namespace cqp #DDDDDD {
class RemoteQKD
interface IQKDDevice {
GetSessionController()
}
class "SessionController" as session
interface "IDetector::Service" as detServ {
StartDetecting()
StopDetecting()
}
class "Provider<IDetectionEventCallback>" as provider {
Attach()
Dettach()
Emit()
}
RemoteQKD .r.> IQKDDevice : uses
IQKDDevice -r[hidden]-> session
}
class Main {
main()
}
class MyDriver
class Detector
MyDriver .u.|> cqp.IQKDDevice
MyDriver o-u-> cqp.session
Detector .u.|> cqp.detServ
Detector -u-|> cqp.provider
Main o-> MyDriver
MyDriver o-> Detector
Main o-u-> cqp.RemoteQKD
note bottom of MyDriver
In this case the driver is a simple detector
which produces detection. Post processing detail not shown.
MyDriver pull together all the parts to run the driver.
end note
note bottom of Detector
The detector controls the device
and outputs the data using the Provider
end note
}
@enduml
At the time of writing, all the drivers can be registered with a site agent by using the -r switch. This causes the cqp::RemoteQKDDevice to call cqp::remote::ISiteAgent::RegisterDevice on the cqp::SiteAgent, it will then use the cqp::remote::ISession interface to start/stop the device.
This interface allows a more direct access to the device than going through the site agents. Key generated by the device are immediately fed back to the caller. First call cqp::remote::IDevice::WaitForSession, then cqp::remote::IDevice::RunSession. Call cqp::remote::IDevice::EndSession to stop generating key.
HSMs are storage devices which are physically secure digital vaults. There is a standard interface for them called PKCS#11. Each manufacturer has their own interfaces and support for PKCS#11 is sketchy, however there is a software implementation which we use as a reference called SoftHSM2. The cqp::keygen::HSMStore class proves an implementation that links the cqp::SiteAgent with the cqp::IBackingStore interface.
Sites provide keys more many endpoints (the available key stores can be retrieved by calling cqp::remote::IKey::GetKeyStores), they can be requested by using the cqp::remote::IKey interface. Once a new key has been requested, the other side can only retrieve it as an existing key - this prevents clashing and misuse of keys.
More details on specific implementations can be found in:
Changes to values in the system are published externally via the cqp::remote::IReporting interface and internally with the cqp::stats::Stat class.
You can register for all stats by calling cqp::remote::IReporting::GetStatistics with the cqp::remote::ReportingFilter::listIsExclude field set to true or specific filters can be specified.
Standard BB84 QKD protocol requires post processing steps to turn the raw detections into usable keys.
An example of a processing pipeline can be seen in cqp::DummyQKD::ProcessingChain.
The builds are managed by the gitlab continuous integration system defined in the .gitlab-ci.yml file.
The docker images can by built manually by running setup/makeDocker.sh.
This is work in progress. This setup has be tested on Window 10 and Windows Server 2016 with Visual studio 15 (2016). The following configurations are supported
| OS | VS 2017 | QT Creator | Codeblocks |
|---|---|---|---|
| Linux | gcc | gcc | |
| Windows | MSVC | MSVC / MSYS2 | MSYS2-Mingw |
CMakeLists.txt file at the base of the source tree.mingw32- prefix.mingw32-make.exe -jSetupCodeBlocks-MSYS2.bat fileIf your project file has deep folder structure (this is a bug), it can be improved by right clicking on the workspace and:
@Manual{, title = {CQPToolkit: A QKD toolkit library}, author = {{Richard Collins, University of Bristol, UK}}, organization = {University of Bristol}, address = {Bristol, UK}, year = 2018, url = {https://gitlab.com/QComms} }
## Дополнительная литература
Для получения дополнительных сведений о написании кода для набора инструментов см. [Руководство по написанию кода](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Coding.md)
Вопросы и проблемы см. в [FAQ](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/FAQ.md)
[//]: https://gitlab.com/qcomms/cqptoolkit/-/raw/master/##Footnotes
[gitlab registry]: https://gitlab.com/QComms/cqptoolkit/container_registry
[MSYS2]: https://sourceforge.net/projects/msys2/
[Doxygen]: http://www.stack.nl/~dimitri/doxygen/download.html#srcbin
[CMake]: https://cmake.org/download/
[CodeBlocks]: http://www.codeblocks.org/
[git]: https://git-scm.com/
[.Net 3.5]: https://www.microsoft.com/en-gb/download/details.aspx?id=22
[Visual Studio 2016]: https://www.visualstudio.com/downloads/
[QT Creator for windows]: https://info.qt.io/download-qt-for-application-development
[GoogleTest Runner for visual studio]: https://marketplace.visualstudio.com/items?itemName=ChristianSoltenborn.GoogleTestAdapter
[Windows 10 SDK]: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
[Grpc]: https://grpc.io/docs/
[Zeroconf]: https://en.wikipedia.org/wiki/Zero-configuration_networking
> Для разрешения имён компьютеры должны поддерживать определение узлов, и вместо жёстко заданных IP-адресов следует использовать именно имена. Поэтому, если это ещё не сделано, необходимо изменить файлы /etc/hostnames на обеих машинах.
Это пространное описание соединения A с B, однако оно очень мощное: позволяет указать несколько пересылок, чтобы создать сквозной защищённый ключ из цепочки устройств. Эту JSON-строку можно указать в поле конфигурации "staticHops" агента сайта, чтобы соединение устанавливалось автоматически, как только все устройства станут доступны.
Затем связь можно остановить командой:```bash
SiteAgentCtl -c localhost:9000 -e '{"hops":[{"first":{"site":"'hostname':9000","deviceId":"dummyqkd__0__16_alice"},"second":{"site":"'hostname':9001","deviceId":"dummyqkd__0__16_bob"}}]}'
Note the
-einstead of-bto end the link instead of beginning it.