该系统提供了多种组件,用于将QKD集成到安全系统中。它使用C++11编写,但采用[GRPC][]接口,因此可以与多种不同语言进行集成。
要在本地运行该软件,请:
要克隆包含子模块的源代码:```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
(无输入内容,故输出空白)```bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8001 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8001 -b
这不会立即开始生成密钥,因为该系统设计为由管理系统控制,需要使用命令 SiteAgentCtl 建立连接。
默认情况下,如果 *SiteAgentRunner* 和 *DummyQKDDriver* 在未指定配置文件 JSON 字符串参数的情况下启动,应该会产生类似以下的结果:```json
{
"url": "<hostname>:8000",
"devices": [
{
"config": {
"id": "dummyqkd__0__16_alice",
"kind": "dummyqkd"
},
"controlAddress": "<hostname>:34219"
}
]
}
并且端口 8001 应该产生类似的结果```json
{
"url": ":8001",
"devices": [
{
"config": {
"id": "dummyqkd__0__16_bob",
"side": "Bob",
"kind": "dummyqkd"
},
"controlAddress": ":38367"
}
]
}
- 现在,可以通过调用以下代码来建立连接:
```py```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -j localhost:8001
This will create a single hop from one site to the next, again more complex routes can be defined by using the -a option with a JSON string specifying the path.
After a few seconds there should be key available which can be tested by requesting a key.
NOTE: The -k parameter must be the url shown in the details of the second site, not "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
请注意,即使密钥生成已停止,只要站点代理仍在运行,该密钥仍然可用。 可以使用上述相同的密钥请求命令来请求它。
加密示例
如上所述,在启动同一本地计算机上的站点代理和驱动程序后,并开始用于密钥交换的链接后,还可以测试加密功能。
hostname:8001现在启动 VPN 的 Alice 端,定义要创建的隧道。将打开两个端口,分别对应两侧的 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
在一侧输入的任何内容在按下回车后都会显示在另一侧。使用诸如 Wireshark 之类的工具检查通过端口 9000 和 9001 传输的数据包,将显示加密的数据以及使用的密钥 ID。
除了 tcpserv 之外,还可以创建其他形式的连接:
| 示例 | 描述 | | ============================= | ===================================================== | | tcpserv://0.0.0.0:1234 | 在端口 1234 上创建监听端口 | | tcp://127.0.01:1234 | 建立到本地主机 TCP 端口 1234 的连接 | | 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 设备 | | eth://eth0/?level=tcp | 创建原始套接字,级别可以是 tcp、ip 或 eth。 |
计划及已完成功能
希望这个项目能对科学研究和大型项目都有用。关于该项目的更多细节可在本文中找到。
若要为该项目做出贡献,请参阅贡献文件。
该系统目前适用于 Linux——未来计划支持 Windows。目前最简单的方式是从源码构建
在 [gitlab 镜像仓库][] 中有一个可直接运行的 Docker 镜像。你可以使用 sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime 运行。在末尾添加命令可直接运行某些内容,例如使用 QKDSim 运行 QKD 密钥生成模拟:```bash
sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime AlignmentTests
### Ubuntu 18.04+
你可以从 [Gitlab](https://gitlab.com/QComms/cqptoolkit/-/jobs/artifacts/master/download?job=package%3Adeb) 安装二进制包。解压 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 容器 中构建,该容器已经包含了所有依赖:```bash sudo docker run -it registry.gitlab.com/qcomms/cqptoolkit/buildenv
否则,从源代码构建需要安装 `setup/setupbuild.sh` 中列出的依赖项,目前它适用于 Ubuntu 和 Arch Linux。
使用 [git][] 从 [gitlab](https://gitlab.com/QComms/cqptoolkit.git) 克隆源代码,然后使用 [CMake][] 和 [gnu make](https://www.gnu.org/software/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
sudo make install
构建使用 [CMake][] 为不同平台生成 makefiles/解决方案等,并从空构建文件夹中调用,该文件夹将包含所有输出文件。调试构建会生成带有 "D" 后缀的包。
可以通过向 cmake 传递选项来控制构建,例如 `-DBUILD_TESTING=OFF`。运行 cmake 时使用 `-LH` 选项可列出可用开关。
要进行更改并开发库,建议安装 [QT Creator](http://doc.qt.io/qtcreator/),并通过 [选择 CMakeLists.txt 文件](https://codeyarns.com/2016/01/26/how-to-import-cmake-project-in-qt-creator/) 打开项目。建议启用并行构建,方法是进入 Projects->Build Steps->Details,并在工具参数中添加 `-j<number>`,参见 [so](https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator)。
构建完成后,默认情况下,文件位于与项目文件夹同级的 `build-<项目名称>-<平台>-<目标>` 文件夹中。
> **关于 Ubuntu 上 protobuf + QT 的说明**
> 库 `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