
إطار عمل للتحكم في أجهزة QKD وإدارة المفاتيح المتناظرة. انظر [صفحة المشروع هنا](https://qcomms.gitlab.io/cqptoolkit/)
يوفر النظام مكونات متنوعة لدمج 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" عن طريق بدء site agent وتوصيل Alice "dummy driver" به: (إذا تم تثبيت الملفات الثنائية، فاحذف المسارات إلى الأوامر من التعليمات.)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a
Please provide the Markdown content to translate.```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"
}
]
}
- الآن، يمكن الآن إجراء الاتصال عن طريق الاستدعاء:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -j localhost:8001
سيؤدي هذا إلى إنشاء قفزة واحدة من موقع إلى آخر، ويمكن تعريف مسارات أكثر تعقيدًا باستخدام الخيار -a مع سلسلة JSON تحدد المسار.
بعد بضع ثوانٍ، يجب أن يكون هناك مفتاح متاح يمكن اختباره عن طريق طلب مفتاح.
ملاحظة: يجب أن تكون المعلمة
-kهي عنوان URL الموضح في تفاصيل الموقع الثاني، وليس "localhost:8001"```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -khostname:8001
يمكن إيقاف الرابط باستخدام أمر unjoin:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001
لاحظ أن المفتاح لا يزال متاحًا على الرغم من توقف التوليد، طالما أن عوامل الموقع قيد التشغيل. يمكن طلبه باستخدام أمر طلب المفتاح نفسه أعلاه.
مثال التشفير
بعد تشغيل عوامل الموقع وبرامج التشغيل على نفس الكمبيوتر المحلي كما هو موضح أعلاه وبعد بدء رابط تبادل المفاتيح، يمكن أيضًا اختبار ميزات التشفير.
hostname:8001الآن ابدأ جانب Alice من 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 على المضيف المحلي | | 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. |
الميزات المخطط لها والمكتملة
نأمل أن يكون هذا المشروع مفيدًا لكل من العمل البحثي العلمي والمشاريع الكبيرة. يمكن العثور على مزيد من التفاصيل حول المشروع في هذه الورقة.
للمساهمة في هذا المشروع، يُرجى الاطلاع على ملف المساهمة.
النظام يعمل حاليًا على لينكس - ويندوز مخطط له في المستقبل. أسهل طريقة حاليًا هي البناء من المصدر
توجد صورة 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
### 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 بدلاً من ذلك.
بالطبع، إذا كنت لا تريد تغيير إصدارات مكتبات النظام والتبعيات، يمكنك البناء داخل حاوية دوكر والتي تحتوي بالفعل على جميع التبعيات المثبتة باستخدام:```bash sudo docker run -it registry.gitlab.com/qcomms/cqptoolkit/buildenv
خلاف ذلك، يتطلب البناء من المصدر تثبيت التبعيات المدرجة في `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
الآن، يمكنك الذهاب إلى المستودع المحلي الخاص بك وتثبيت التبعيات باستخدام السكريبت (ربما تحتاج إلى تغيير صلاحيات الملف):```bash
cd cqptoolkit/setup
./setupbuild.sh
ثم، يمكنك بناء المشروع في مجلد جديد:```bash mkdir build-cqptoolkit cd build-cqptoolkit cmake ../cqptoolkit && nice make -s -j
sudo make install
يستخدم البناء [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<number>` إلى معلمات الأداة، انظر [so](https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator). بعد البناء، تكون الملفات افتراضيًا في نفس مستوى مجلد المشروع باسم `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 شكلاً من أشكال الاتصال [غير المستنسخ](https://en.wikipedia.org/wiki/No-cloning_theorem)، عادةً باستخدام فوتونات فردية عبر كابل ألياف بصرية. يمكنها العمل نقطة إلى نقطة أو واحد إلى متعدد ولكنها بطبيعتها لها موقع مادي (حيث تنتهي الألياف) - لا يمكن افتراضيتها! النقطة التي يتم عندها إرسال الفوتون أو اكتشافه هي حدود النظام الآمن - تقريبًا مثل [جدار الحماية](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" />
هذا القسم هو مجرد تعليق على الوظيفة المفيدة لـ DummyQKDDriver لمحاكاة مخرجات جهاز QKD. يرجى الرجوع إلى القسم التالي للحصول على مثال إرشادي لإعداد رابط بسيط باستخدامها.
كما هو الحال مع معظم البرامج، فإن تمرير `-h` إليه سيعرض الخيارات المتاحة. يقوم DummyQKDDriver بتشغيل مجموعة قياسية من خطوات المعالجة اللاحقة على اكتشافات الفوتون المحاكاة باستخدام فئة cqp::DummyQKD. يجب أن يكون هناك مثيلان للبرنامج قيد التشغيل، واحد لـ Alice وآخر لـ Bob.
قم بتشغيل Bob أولاً على المنفذ 8000 عن طريق استدعاء:```bash
DummyQKDDriver -b -k 0.0.0.0:8000
الآن قم بتشغيل Alice، مع إخبارها بالاتصال بـ Bob وبدء تبادل المفتاح (في الوضع اليدوي):```bash DummyQKDDriver -a -m localhost:8000
إذا نجح الأمر، فستحصل على فيض من رسائل الخطأ مثل هذه: `ERROR: OnKeyGeneration No listener for generated key`. وذلك لأنه عند تشغيل النظام بهذه الطريقة، من الجيد رؤيته يقوم بشيء ما، لكنه ليس مفيدًا جدًا، فلا يوجد مكان لوضع المفتاح الذي تم إنشاؤه. صُممت المشغلات لاستخدامها بواسطة شيء ما.
يحتوي المشروع على نظام لإدارة المفاتيح يُسمى [وكلاء الموقع](#SiteAgents) أو يمكنك التواصل مع المشغلات مباشرة باستخدام [واجهة IDevice](#IDeviceInterface)
### تكوين وكلاء الموقع <a name="SiteAgents" />
يحتاج وكلاء الموقع والمشغلات وأنفاق VPN إلى تحديد معايير لكل عقدة في الشبكة باستخدام ملفات سلسلة JSON، حيث أن الأمر الافتراضي بدون وسائط لا يحدد جميع الحقول الضرورية افتراضيًا ولا يعمل إلا للاختبار على نفس الجهاز المحلي.
يمكن تشغيل وكلاء الموقع باستخدام SiteAgentRunner، يمكننا تشغيل موقعين باستخدام:```bash
SiteAgentRunner -c site-a.json
و:```bash SiteAgentRunner -c site-b.json
مع كل ملف JSON يشير بشكل مناسب إلى منفذ مختلف لـ Alice و Bob (على سبيل المثال 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 يشير بشكل مناسب إلى منفذ مختلف لـ 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"
},
}
> يمكن أن يكون حقل عنوان التحكم 0.0.0.0:0 إذا لم يكن هناك جدار ناري للتعامل معه. إذا كان الأمر كذلك، فيجب الإشارة إلى عنوان IP الفعلي للمضيف واختيار منفذ مناسب لن يقوم جدار النار بحظره.
لن يحدث شيء بعد لأن عوامل الموقع لا تعرف ماذا تفعل بهذه الأجهزة. يمكننا توجيههم لبدء إنشاء المفاتيح (-b كبداية) عن طريق إرسال الأمر 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"}}]}'
يجب أن تكون أجهزة الكمبيوتر قادرة على تحليل أسماء المضيفات ويجب استخدام هذا بدلاً من عنوان 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"}}]}'
> لاحظ استخدام `-e` بدلاً من `-b` لـ *إنهاء* الرابط بدلاً من *بدئه*.
يمكن تحقيق إعدادات أكثر تعقيداً من خلال تنفيذ واجهة cqp::remote::INetworkManager بنفسك لإصدار الأوامر. تأتي التعليقات من الأجهزة عبر واجهة cqp::remote::IReporting على نفس المقبس بحيث يمكنك التفاعل مع التغييرات في النظام. [هنا](#Reporting) يمكنك رؤية كيفية استخراج البيانات من واجهة التقارير باستخدام أداة StatsDump.
### إنشاء برامج التشغيل <a name="CreatingDrivers" />
تطبيق برنامج التشغيل هو جسر بين واجهات الجهاز الداخلية (cqp::IQKDDevice) والواجهة الخارجية cqp::remote::IDevice. تقوم فئة cqp::RemoteQKDDevice بمعالجة معظم العمل نيابة عنك، ويجب على التطبيق التعامل مع تكوين الجهاز وإنشائه.
العمل الحقيقي هو في إنشاء برنامج تشغيل لإعداد الجهاز وقراءة المفتاح. إذا كان جهازك ينتج اكتشافات خام فقط، فستحتاج إلى تكوين [خط أنابيب معالجة](#ProcessingPipelines) مثل cqp::DummyQKD أو cqp::PhotonDetectorMk1 و cqp::LEDAliceMk1. إذا كان جهازك يولد مفتاحًا جاهزًا للاستخدام مثل 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::remote::ISiteAgent::RegisterDevice على cqp::SiteAgent، ثم يستخدم واجهة cqp::remote::ISession لبدء/إيقاف الجهاز.
### واجهة IDevice <a name="IDeviceInterface" />
تتيح هذه الواجهة وصولاً أكثر مباشرة إلى الجهاز بدلاً من المرور عبر وكلاء الموقع. يتم إرجاع المفاتيح التي يولدها الجهاز فوراً إلى المتصل. قم أولاً باستدعاء cqp::remote::IDevice::WaitForSession، ثم cqp::remote::IDevice::RunSession. اتصل بـ cqp::remote::IDevice::EndSession لإيقاف توليد المفاتيح.
### وحدات أمان الأجهزة (HSMs) <a name="HSMs" />
[وحدات أمان الأجهزة (HSMs)](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" />
يمكن العثور على مزيد من التفاصيل حول التطبيقات المحددة في:
* [Tunnels](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Tunnels.md)
### التقارير <a name="Reporting" />
يتم نشر التغييرات في القيم في النظام خارجياً عبر واجهة cqp::remote::IReporting وداخلياً باستخدام فئة cqp::stats::Stat. يمكنك التسجيل للحصول على جميع الإحصائيات عن طريق استدعاء cqp::remote::IReporting::GetStatistics مع تعيين حقل cqp::remote::ReportingFilter::listIsExclude على `true` أو يمكن تحديد عوامل تصفية محددة.
### خطوط أنابيب المعالجة <a name="ProcessingPipelines" />
يتطلب بروتوكول [BB84 QKD](https://en.wikipedia.org/wiki/BB84) القياسي خطوات معالجة لاحقة لتحويل الاكتشافات الخام إلى مفاتيح قابلة للاستخدام.
- **المحاذاة** إيجاد بداية ونهاية الإرسال الحقيقي.
+ ضبط فروق التوقيت/الانحراف إلخ.
+ تعويض الفروق في الطور أو غيرها بين المرسل والمستقبل، إلخ
- **الغربلة** التخلص من الاكتشافات غير الصالحة
- **تصحيح الأخطاء** تصحيح الاكتشافات غير الصحيحة - دون الكشف عن القيم
- **تكثيف الخصوصية** تجزئة المفتاح لجعل أي بتات تم الكشف عنها غير مجدية
يمكن رؤية مثال على خط أنابيب المعالجة في cqp::DummyQKD::ProcessingChain.
## Building
تتم إدارة عمليات البناء بواسطة [نظام التكامل المستمر](https://about.gitlab.com/product/continuous-integration/) في GitLab المعرفة في ملف `.gitlab-ci.yml`.
يمكن بناء صور Docker يدويًا عن طريق تشغيل `setup/makeDocker.sh`.
### Windows
هذا العمل قيد التقدم. تم اختبار هذا الإعداد على Windows 10 و Windows Server 2016 مع Visual Studio 15 (2016). التكوينات التالية مدعومة:
| نظام التشغيل | 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) مرة واحدة لتثبيت 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)
+ اختر Build->Solution
- [QT Creator for windows][]
+ يمكن لـ QT Creator استخدام إما مترجم Microsoft الأصلي أو MSYS2. قم بتثبيت MSYS2 بشكل منفصل، لا تحتاج إلى تثبيت مترجم minGW الذي يأتي مع مثبت QTCreator. أو قم بتثبيت [Windows 10 SDK][]
+ ضمن قائمة المكونات، حدد المكونات للمترجم الذي تستخدمه. على سبيل المثال msvc2017
+ باستخدام "Open Project"، حدد ملف `CMakeLists.txt` في قاعدة شجرة المصادر.
- [MSYS2][] and [Codeblocks][]
+ قم بتثبيت حزمة [MSYS2][].
+ قم بتشغيل البرنامج النصي [installMSYS2Dependencies.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/installMSYS2Dependencies.bat)
+ ضمن Settings->Debugger -> "Create config" باسم "MSYS2 GDB"
- قم بتغيير المصحح ليشير إلى gdb.exe (مثال: C:\\msys64\\mingw64\\bin\\gdb.exe)
+ ضمن Settings->Compiler
+ انسخ إعدادات مترجم GCC، أطلق عليه "GCC - Old"
+ قم بتغيير دليل تثبيت سلسلة الأدوات إلى موقع تثبيت mingw64 الخاص بـ MSYS2 (مثال: C:\\msys64\\mingw64)
+ في كل حقل ضمن "Program Files" باستثناء برنامج "make"، قم بإزالة البادئة `mingw32-`.
+ في حقل make، أضف المفتاح -j للسماح بالبناء متعدد النوى: `mingw32-make.exe -j`
+ حدد المصحح "MSYS2 GDB" الذي تم إنشاؤه سابقاً
+ إذا كنت تفضل مخرجات قابلة للقراءة من المترجم، قم بتعيين "Other Settings"->"Compiler Logging" إلى "Task description"
+ في دليل بناء CodeBlock (\build\CodeBlocks)
+ قم بتشغيل ملف `SetupCodeBlocks-MSYS2.bat`
+ افتح ملف مشروع CodeBlocks "CQP.cbp".
إذا كان ملف مشروعك يحتوي على هيكل مجلدات عميق (هذا خلل)، يمكن تحسينه عن طريق النقر بزر الماوس الأيمن على مساحة العمل و:
- إلغاء تحديد "Display folders as on disk"
- تحديد "Hide Folder Name"
## الاستشهاد بهذا البرنامج```
@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}
}
لمزيد من التفاصيل حول كتابة الكود لمجموعة الأدوات، اطلع على دليل البرمجة للأسئلة والمشاكل، راجع الأسئلة الشائعة