Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CQPToolkit — QKDデバイスを制御し、対称鍵を管理するためのフレームワーク。 [プロジェクトページはこちら](https://qcomms.gitlab.io/cqptoolkit/) | Kitploit
ツール/GitLabGitLab/qcomms/cqptoolkit
組み込みシステムセキュリティ暗号化/復号化ツールネットワークセキュリティ暗号化ハードウェアセキュリティ
GitLabqcomms/cqptoolkit

CQPToolkit

QKDデバイスを制御し、対称鍵を管理するためのフレームワーク。 [プロジェクトページはこちら](https://qcomms.gitlab.io/cqptoolkit/)

リポジトリを見る
614年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
ウェブサイト

CQP Tool kit

このシステムは、QKDをセキュリティシステムに統合するための様々なコンポーネントを提供します。C++11で記述されていますが、GRPCインターフェースを使用しているため、多くの異なる言語と統合できます。

クイックスタート

ソフトウェアをネイティブで実行するには、以下のいずれかの方法を実行します:

  • Ubuntu debパッケージをダウンロードしてインストールする
  • サブモジュールが更新されていることを確認しながらソースをクローンし、ローカルでビルドする

サブモジュールを含むソースをクローンするには:```bash git clone --recurse-submodules [email protected]:QComms/cqptoolkit.git

root@kitploit:~
> `--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

クイックテスト

ビルドフォルダから、2つのサイト(同一ローカルコンピュータ上)をそれぞれQKDデバイスで実行するには、まず、サイトエージェントを起動し、それにAliceの「ダミードライバ」を接続してサイト「A」を起動します: (バイナリがインストールされている場合は、指示にあるコマンドへのパスを省略してください。)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a

root@kitploit:~
以下のパッケージが必要です:

- [Python3](https://www.python.org/downloads/release/python-397/) - Python インタプリタ、YAML と Jinja2 の組み込みサポート
- [rsync](https://rsync.samba.org/) - リモートのファイルとフォルダの同期
- [aria2c](https://aria2.github.io/) - 高速ダウンロードユーティリティ
- [fzf](https://github.com/junegunn/fzf) - コマンドラインのあいまいファインダー
- [md5sum](http://www.microbrew.org/tools/md5sum/)

これらは任意ですが推奨します:

- [rofi](https://github.com/davatorium/rofi) - アプリケーションランチャー、ウィンドウスイッチャー、および dmenu 代替
- [tmux](https://github.com/tmux/tmux) - ターミナルマルチプレクサ
- [megatools](https://megatools.megous.com/) - Mega 向けコマンドラインクライアントアプリケーション
- [gallery-dl](https://github.com/mikf/gallery-dl) - イメージギャラリーやコレクションをダウンロードするためのコマンドラインプログラム

すべての機能を利用するには、上記のすべてのパッケージが必要です。```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
root@kitploit:~
これにより、デフォルトでは、*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" } ] }

root@kitploit:~
- これで、呼び出して接続できるようになりました:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -j localhost:8001

これにより、あるサイトから次のサイトへのシングルホップが作成されます。より複雑なルートは、パスを指定したJSON文字列を-aオプションで使用することで定義できます。

数秒後、キーが利用可能になるはずです。これはキーを要求してテストできます。

注: -k パラメータは、2番目のサイトの詳細に表示されるURLでなければなりません。"localhost:8001" ではありません。```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -k hostname:8001

root@kitploit:~
リンクは unjoin コマンドで停止できます:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001

なお、鍵の生成が停止しても、サイトエージェントが実行中である限り、その鍵は引き続き利用可能です。 同じ鍵要求コマンドを使用して要求することができます。

暗号化の例

  • まず、bob側で「VPN」の一端を起動します。これによりポート9010で待機し、Bobのキーストアに接続します。``` ./src/Tools/QTunnelServer/QTunnelServer -p 9010 --keystore-url=hostname:8001
root@kitploit:~
では、VPNのAlice側を起動し、作成するトンネルを定義します。2つのポートが開かれ、各側に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

root@kitploit:~
そしてもう一方には:```
nc localhost 9001

一方に入力されたものは、エンターキーを押すともう一方に表示されます。ポート9000および9001を通過するパケットをWiresharkなどのツールで検査すると、データが暗号化されていることと、使用されているキーIDが確認できます。

tcpservの代わりに、他の形式の接続を作成できます:

| Example | 説明 | | ============================= | ===================================================== | | 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 | イーサネットレベルのタップデバイスが作成されます | | eth://eth0/?level=tcp | 生のソケットを作成します。レベルはtcp、ip、ethのいずれかです。 |

進捗

計画済みおよび完了済みの機能

  • Device Drivers
    • Compatibility drivers for IDQ Clavis 2
      • Device feedback
    • Compatibility drivers for IDQ Clavis 3
    • University of Bristol handheld free space device
    • University of Bristol on chip device
  • Post processing
    • Alignment for asynchronous systems
    • Sifting for synchronous systems
    • Error correction
    • Privacy amplification
  • Multi-site key management (Site Agents)
    • Control QKD devices to exchange key
    • Provide pre-shared key on a standard Interface: cqp::remote::IKey
      • Keys can be restricted for use by specific users

このプロジェクトが科学研究と大規模プロジェクトの両方に有用であることが期待されています。プロジェクトの詳細はこの論文をご覧ください。

このプロジェクトに貢献するには、Contributionファイルを参照してください。

インストール

現在のシステムはLinux上で動作します。Windowsは将来対応予定です。現時点ではソースからビルドするのが最も簡単です

Dockerイメージ

すぐに実行可能なDockerイメージがgitlab registryにあります。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

root@kitploit:~
### Ubuntu 18.04+

[Gitlab](https://gitlab.com/QComms/cqptoolkit/-/jobs/artifacts/master/download?job=package%3Adeb) からバイナリパッケージをインストールできます。zip ファイルを展開し、`dpkg` でツールをインストールします。依存関係が不足していると警告されますが、心配はいりません。2行目で修正されます。```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

root@kitploit:~
そうでなければ、ソースからビルドするには `setup/setupbuild.sh` にリストされた依存関係をインストールする必要があります。現在はUbuntuとArch Linuxで動作します。

ソースを [gitlab](https://gitlab.com/QComms/cqptoolkit.git) から [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

root@kitploit:~
これで、ローカルリポジトリに移動し、スクリプトを使って依存関係をインストールできます(ファイルのパーミッションを変更する必要があるかもしれません):```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

root@kitploit:~
ビルドは[CMake][]を使用して、さまざまなプラットフォーム向けのmakefile/ソリューションなどを生成し、空のビルドフォルダから実行されます。このフォルダにはすべての出力ファイルが含まれます。デバッグビルドでは、パッケージ名の末尾に「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<数値>`を追加することをお勧めします([参考](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

    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には、何らかの[非クローン](https://en.wikipedia.org/wiki/No-cloning_theorem)通信が必要であり、通常は光ファイバーケーブルを介して単一光子を使用します。ポイントツーポイントまたは1対多で動作できますが、本質的に物理的な位置(光ファイバーが終端する場所)を持ちます。仮想化することはできません!光子が送信または検出されるポイントが、セキュアシステムの境界であり、ネットワークの[ファイアウォール](https://en.wikipedia.org/wiki/Firewall_(computing))にほぼ相当します。分割不可能な光子がビット列に変換され、[対称鍵](https://en.wikipedia.org/wiki/Key_(cryptography))を形成すると、認証、アクセス制御などの標準的なコンピュータセキュリティのルールが適用されます。違いは、それらの鍵が生成されると、各QKDデバイスには[他の誰も知らない](https://en.wikipedia.org/wiki/Shared_secret)[科学的に証明された](https://arxiv.org/pdf/quant-ph/0003004.pdf)数値が含まれることです。

この「ファイアウォール」効果の性質上、QKDデバイスを制御するシステムは安全であり、信頼できるもの(「トラステッドノード」とも呼ばれる)と見なされる必要があります。どこでどのように線を引くかは、武装した警備員から[サーバールームのドアに鍵をかけるだけ](https://www.youtube.com/watch?v=rnmcRTnTNC8)までさまざまです。

以下の図が表示されない場合は、[オンラインドキュメント](https://qcomms.gitlab.io/cqptoolkit/)を参照してください。`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の実行 <a name="RunningDummyQKDDriver" />

このセクションでは、QKDデバイスの出力をシミュレートするためのDummyQKDDriverの便利な機能についてコメントします。次のセクションでは、それらを使用してシンプルなリンクをセットアップするためのガイド付き例を参照してください。
ほとんどのプログラムと同様に、`-h`を渡すと利用可能なオプションが表示されます。DummyQKDDriverは、cqp::DummyQKDクラスを使用して、シミュレートされた光子検出に対して一連の標準的な後処理手順を実行します。プログラムの2つのインスタンス(Alice用とBob用)を実行する必要があります。

最初にBobをポート8000で実行します。以下のコマンドを呼び出します:```bash
DummyQKDDriver -b -k 0.0.0.0:8000

それではAliceを実行し、Bobに接続して手動モードで鍵交換を開始するように指示します:```bash DummyQKDDriver -a -m localhost:8000

root@kitploit:~
正常に動作すると、次のようなエラーメッセージが大量に表示されます: `ERROR: OnKeyGeneration No listener for generated key`。これは、このようにシステムを実行すると動作していることが確認できる点では便利ですが、生成された鍵の格納先がないためあまり有用ではないからです。ドライバーは何かによって使用されるように設計されています。
このプロジェクトには、[Site Agents](#SiteAgents) と呼ばれる鍵を管理するシステムがあるか、[IDevice interface](#IDeviceInterface) を使用してドライバーと直接通信することもできます。

### Site Agents の設定 <a name="SiteAgents" />

Site Agents、ドライバー、VPNトンネルは、ネットワークの各ノードに対してJSON文字列ファイルでパラメータ化する必要があります。デフォルトのコマンド(引数なし)は、必要なすべてのフィールドを既定で指定せず、同じローカルマシンでのテストにのみ機能します。

Site Agents は SiteAgentRunner で実行できます。2つのサイトを実行するには、次のようにします:```bash
SiteAgentRunner -c site-a.json

and:```bash SiteAgentRunner -c site-b.json

root@kitploit:~
各JSONファイルがAliceとBobに異なるポート(例:9000/9001)を適切に示している。JSON文字列は次のようになります:```json
		{
		    "name":"",
		    "id":"",
		    "netManUri":"",
		    "bindAddress":"0.0.0.0",
		    "listenPort":9000,
		    "connectionAddress":"",
		    "credentials": {},
		    "useAutoDiscover":false,
		    "backingStoreUrl":"",
		    "fallbackKey":""
		}

これで、各サイトに1つずつ、DummyQKDDriver'sを接続できます:```bash DummyQKDDriver -c driver_config-a.json # run as Alice, register with site agent

root@kitploit:~
そして:```bash
DummyQKDDriver -c driver_config-b.json # run as Bob, register with site agent

各JSONファイルがAliceとBobに対して適切に異なるポート(例: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" }, }

root@kitploit:~
> 制御アドレスフィールドは、ファイアウォールが存在しない場合は0.0.0.0:0に設定できます。その場合、ホストの実際のIPを指定し、ファイアウォールがブロックしない適切なポートを選択する必要があります。

まだ何も起こりません。サイトエージェントはこれらのデバイスの扱い方を知らないためです。cqp::ISiteAgent::StartNode コマンドを送信することで、キーの生成を開始するよう指示できます(-b は開始を意味します)。```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"}}]}'

コンピュータはホスト名を解決できる必要があり、ハード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"}}]}'

root@kitploit:~
> リンクを*開始*する代わりに*終了*するために、`-b`ではなく`-e`を使用することに注意してください。

より複雑なセットアップは、cqp::remote::INetworkManagerインターフェースを自分で実装してコマンドを発行することで実現できます。デバイスからのフィードバックは、同じソケット上のcqp::remote::IReportingインターフェースを介して送られるため、システムの変更に反応できます。[こちら](#Reporting)で、StatsDumpツールを使用してレポートインターフェースから情報を抽出する方法を確認できます。

### ドライバーの作成 <a name="CreatingDrivers" />

ドライバーアプリケーションは、内部デバイスインターフェース(cqp::IQKDDevice)と外部cqp::remote::IDeviceインターフェースの間のブリッジです。cqp::RemoteQKDDeviceクラスはほとんどの作業を処理しますが、アプリケーションはデバイスの設定と作成を処理する必要があります。

実際の作業は、デバイスをセットアップして鍵を読み取るドライバーを作成することです。デバイスが生の検出値のみを生成する場合は、cqp::DummyQKDやcqp::PhotonDetectorMk1、cqp::LEDAliceMk1のような[処理パイプライン](#ProcessingPipelines)を設定する必要があります。cqp::Clavis3Deviceのように使用可能な鍵を生成するデバイスの場合は、鍵を読み取り、cqp::IKeyCallbackインターフェース(cqp::KeyPublisherを使用)を介して公開する必要があります。

これらの両方のアプローチには、cqp::session::SessionControllerおよびcqp::session::AliceSessionControllerによって提供されるセッション管理の形式が必要です。これらはcqp::ISessionControllerおよびcqp::remote::ISessionインターフェースを実装し、cqp::RemoteQKDDeviceによってデバイスとそのピアを開始および停止するために使用されます。通常はこれで十分ですが、状況によってはデバイスの要件に対応するために特化する必要があります。

    @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

### ドライバーの登録 <a name="Registering" />

執筆時点では、すべてのドライバーは`-r`スイッチを使用してサイトエージェントに登録できます。これにより、cqp::RemoteQKDDeviceはcqp::SiteAgentのcqp::remote::ISiteAgent::RegisterDeviceを呼び出し、その後cqp::remote::ISessionインターフェースを使用してデバイスを開始/停止します。

### IDeviceインターフェース <a name="IDeviceInterface" />

このインターフェースは、サイトエージェントを経由するよりもデバイスへのより直接的なアクセスを可能にします。デバイスによって生成された鍵は、呼び出し元に即座にフィードバックされます。最初にcqp::remote::IDevice::WaitForSessionを呼び出し、次にcqp::remote::IDevice::RunSessionを呼び出します。鍵の生成を停止するにはcqp::remote::IDevice::EndSessionを呼び出します。

### HSM <a name="HSMs" />

[HSM](https://en.wikipedia.org/wiki/Hardware_security_module)は、物理的に安全なデジタル金庫であるストレージデバイスです。これらには[PKCS#11](https://en.wikipedia.org/wiki/PKCS_11)と呼ばれる標準インターフェースがあります。各メーカーは独自のインターフェースを持ち、PKCS#11のサポートは不完全ですが、リファレンスとして使用する[SoftHSM2](https://www.opendnssec.org/softhsm/)というソフトウェア実装があります。cqp::keygen::HSMStoreクラスは、cqp::SiteAgentとcqp::IBackingStoreインターフェースをリンクする実装を提供します。

### IKeyインターフェース <a name="IKeyInterface" />

サイトは多くのエンドポイントに鍵を提供します(利用可能な鍵ストアはcqp::remote::IKey::GetKeyStoresを呼び出すことで取得できます)。鍵はcqp::remote::IKeyインターフェースを使用して要求できます。新しい鍵が要求されると、相手側は既存の鍵としてのみ取得できます。これにより鍵の競合や誤用を防ぎます。

### 暗号化 <a name="Encryption" />

特定の実装の詳細は以下を参照してください:
* [トンネル](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Tunnels.md)

### レポート <a name="Reporting" />

システム内の値の変更は、外部にはcqp::remote::IReportingインターフェースを介して、内部にはcqp::stats::Statクラスを使用して公開されます。すべての統計情報を登録するには、cqp::remote::ReportingFilter::listIsExcludeフィールドを`true`に設定してcqp::remote::IReporting::GetStatisticsを呼び出すか、特定のフィルターを指定できます。

### 処理パイプライン <a name="ProcessingPipelines" />

標準の[BB84 QKDプロトコル](https://en.wikipedia.org/wiki/BB84)では、生の検出値を使用可能な鍵に変換するために後処理ステップが必要です。

- **アライメント** 実際の送信の開始と終了を見つける
    + タイミングの差異/ドリフトなどを調整する
    + 送信機と受信機間の位相やその他の差異を補償するなど
- **シフティング** 無効な検出値を捨てる
- **誤り訂正** 間違った検出値を訂正する(値を漏洩させずに)
- **秘密増幅** 鍵をハッシュ化して、漏洩したビットを役に立たなくする

処理パイプラインの例は、cqp::DummyQKD::ProcessingChainで確認できます。

## ビルド

ビルドは、`.gitlab-ci.yml`ファイルで定義されたgitlab[継続的インテグレーションシステム](https://about.gitlab.com/product/continuous-integration/)によって管理されています。

Dockerイメージは、`setup/makeDocker.sh`を実行して手動でビルドできます。

### Windows

これは作業中です。このセットアップは、Visual Studio 15(2016)を使用してWindows 10およびWindows Server 2016でテストされています。以下の構成がサポートされています。

| OS        | VS 2017   | QT Creator    | Codeblocks    |
|:----------|-----------|---------------|---------------|
| Linux     |           | gcc           | gcc           |
| Windows   | MSVC      | MSVC / MSYS2  | MSYS2-Mingw   |

#### IDE

- [Visual Studio 2016][]
    + [InstallVcPkg.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/InstallVcPkg.bat)スクリプトを1回実行して、vcpkgをC:\vcpkgにインストールします。
    + [SetupMSBuild.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/SetupMSBuild.bat)スクリプトを実行します。
    + [cqp.sln](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/cqp.sln)ソリューションを開きます。
    + ビルド→ソリューションのビルドを選択します。
- [QT Creator for windows][]
    + QT Creatorは、ネイティブのMicrosoftコンパイラまたはMSYS2のいずれかを使用できます。MSYS2は別途インストールしてください。QT Creatorインストーラに付属のminGWコンパイラをインストールする必要はありません。または[Windows 10 SDK][]をインストールします。
    + コンポーネントメニューで、使用するコンパイラのコンポーネントを選択します。例:msvc2017
    + 「プロジェクトを開く」を使用して、ソースツリーのルートにある`CMakeLists.txt`ファイルを選択します。
- [MSYS2][] and [Codeblocks][]
    + [MSYS2][]パッケージをインストールします。
    + [installMSYS2Dependencies.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/installMSYS2Dependencies.bat)スクリプトを実行します。
    + 設定→デバッガーで、「MSYS2 GDB」という名前の「Create config」(設定を作成)をクリックします。
        - デバッガーをgdb.exeの場所に変更します(例:C:\\msys64\\mingw64\\bin\\gdb.exe)。
    + 設定→コンパイラで、
        + GCCコンパイラ設定をコピーし、「GCC - Old」という名前を付けます。
        + ツールチェーンインストールディレクトリをMSYS2のmingw64インストール場所に変更します(例:C:\\msys64\\mingw64)。
        + 「Program Files」以下の各フィールドで、「make」プログラムを除いて、`mingw32-`プレフィックスを削除します。
        + makeフィールドで、マルチコアビルドを可能にするために-jスイッチを追加します:`mingw32-make.exe -j`
        + 先ほど作成した「MSYS2 GDB」デバッガーを選択します。
        + コンパイラの出力を読みやすくしたい場合は、「その他の設定」→「コンパイラログ」を「タスクの説明」に変更します。
    + CodeBlockビルドディレクトリ(\\build\\CodeBlocks)で、
    + `SetupCodeBlocks-MSYS2.bat`ファイルを実行します。
    + 「CQP.cbp」CodeBlocksプロジェクトファイルを開きます。

プロジェクトファイルのフォルダ構造が深すぎる場合(これはバグです)、ワークスペースを右クリックして以下の操作で改善できます:

- 「ディスク上のフォルダとして表示」のチェックを外す
- 「フォルダ名を隠す」にチェックを入れる

## このソフトウェアの引用```
@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}
}

参考文献

ツールキットのコード作成の詳細については、Coding Guide を参照してください。 質問や問題については、FAQ を参照してください。

ツールをダウンロード
  • Creation of indirect key based on XOR'ing key from other sites
  • Configuration through config file, command line arguments or network interface.
  • Automatic Site Agent discovery using Zeroconf
  • Resolve keys across links between trusted sites (issue #8)
  • Network Management of site agents
    • Sites can be controlled through interfaces
    • Static/Dynamic control of site agents to create keys between sites based on rules
  • Encrypted tunnel controller (like stunnel)
    • Uses the IKey interface to get shared keys.
    • Setup of encryption tunnels using
      • TCP/UDP socket
      • TUN/TAP device (aka VPN)
      • Dedicated physical interface
    • Configuration through config file, command line arguments or network interface.
    • Automatic Site Agent and Tunnel Controller discovery using Zeroconf
  • Multiple Platforms
    • Linux
    • Windows (see issue #2)