Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CQPToolkit — Framework para controlar dispositivos QKD y gestionar claves simétricas. Vea la [página del proyecto aquí](https://qcomms.gitlab.io/cqptoolkit/) | Kitploit
Herramientas/GitLabGitLab/qcomms/cqptoolkit
Seguridad de Sistemas EmbebidosHerramientas de Cifrado/DescifradoSeguridad de RedesCriptografíaSeguridad de Hardware
GitLabqcomms/cqptoolkit

CQPToolkit

Framework para controlar dispositivos QKD y gestionar claves simétricas. Vea la [página del proyecto aquí](https://qcomms.gitlab.io/cqptoolkit/)

Ver Repositorio
614hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Sitio web

CQP Tool kit

El sistema proporciona varios componentes para integrar QKD en un sistema de seguridad. Está escrito en C++11 pero utiliza interfaces GRPC por lo que puede integrarse con muchos lenguajes diferentes.

Inicio rápido

Para ejecutar el software de forma nativa, ya sea:

  • descargar e instalar los paquetes deb de Ubuntu o
  • clonar el código fuente, asegurándose de que los submódulos estén actualizados y compilar localmente

Para clonar el código fuente incluyendo los submódulos:```bash git clone --recurse-submodules [email protected]:QComms/cqptoolkit.git

root@kitploit:~
> Si clonaste sin usar `--recurse-submodules`, los submódulos pueden actualizarse ejecutando `git submodule update --init` desde dentro de la carpeta fuente.

Aquí tienes una lista de dependencias que necesitas para compilar el proyecto (lee más abajo para más detalles sobre la instalación):```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

Prueba rápida

Desde la carpeta de compilación, para ejecutar dos sitios (en la misma computadora local) cada uno con un dispositivo QKD, primero inicie el sitio "A" iniciando un agente de sitio y conectando un controlador simulado de Alice a él: (Si los binarios han sido instalados, omita las rutas a los comandos de las instrucciones.)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a

root@kitploit:~
INPUT:```bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8001 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8001 -b

Esto no comenzará a producir clave inmediatamente, ya que este sistema está diseñado para ser controlado por un sistema de gestión; la conexión debe establecerse con el comando SiteAgentCtl.

  • Primero, puede verificar la lista de dispositivos disponibles con:```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -d -c localhost:8000
root@kitploit:~
lo que debería producir algo similar a esto por defecto, si *SiteAgentRunner* y *DummyQKDDriver* se lanzaran sin especificar un argumento de archivo de cadena JSON de configuración:```json
{
 "url": "<hostname>:8000",
 "devices": [
  {
   "config": {
    "id": "dummyqkd__0__16_alice",
    "kind": "dummyqkd"
   },
   "controlAddress": "<hostname>:34219"
  }
 ]
}

y el puerto 8001 debería producir algo similar a```json { "url": ":8001", "devices": [ { "config": { "id": "dummyqkd__0__16_bob", "side": "Bob", "kind": "dummyqkd" }, "controlAddress": ":38367" } ] }

root@kitploit:~
- Ahora, la conexión se puede realizar llamando a:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -j localhost:8001

Esto creará un único salto de un sitio al siguiente; de nuevo, se pueden definir rutas más complejas usando la opción -a con una cadena JSON que especifique la ruta.

Después de unos segundos, debería haber una clave disponible que se puede probar solicitando una clave.

NOTA: El parámetro -k debe ser la URL que se muestra en los detalles del segundo sitio, no "localhost:8001"```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -k hostname:8001

root@kitploit:~
El enlace puede detenerse con el comando unjoin:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001

La clave aún está disponible aunque la generación se haya detenido, siempre que los agentes del sitio estén en ejecución. Se puede solicitar con el mismo comando de solicitud de clave anterior.

Ejemplo de cifrado

  • Primero, inicie un lado de la "VPN" en Bob que escuchará en el puerto 9010 y se conectará al almacén de claves de Bob:``` ./src/Tools/QTunnelServer/QTunnelServer -p 9010 --keystore-url=hostname:8001
root@kitploit:~
- Ahora inicia el lado de Alice de la VPN, definiendo el túnel a crear. Se abrirán dos puertos, uno para cada lado en 9000 y 9001, cualquier cosa que entre por estos puertos será encriptada, transferida al otro lado, descifrada y producida en el otro puerto.```
./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

Cualquier cosa que use comunicaciones tcp puede entonces usar este puerto, netcat es un programa simple que enviará datos a través de los puertos, inicie uno en un lado:``` nc localhost 9000

root@kitploit:~
y uno en el otro:```
nc localhost 9001

Cualquier texto escrito en un lado aparecerá en el otro al presionar Enter. Inspeccionar los paquetes que viajan a través de los puertos 9000 y 9001 con una herramienta como Wireshark mostrará los datos siendo cifrados y el ID de clave utilizado.

Se pueden crear otras formas de conexión, en lugar de tcpserv:

| Ejemplo | Descripción | | ============================= | ===================================================== | | tcpserv://0.0.0.0:1234 | Se crea un puerto de escucha en el puerto 1234 | | tcp://127.0.01:1234 | Se realiza una conexión al puerto tcp 1234 en localhost | | udp://0.0.0.0:1234 | Los paquetes UDP se envían desde este puerto | | tun://192.168.101.1/?netmask=255.255.255.0 | Se crea un dispositivo de túnel a nivel IP con una dirección IP | | tap://192.168.101.1/?netmask=255.255.255.0 | Se crea un dispositivo de tap a nivel Ethernet | | eth://eth0/?level=tcp | Crear un socket raw, el nivel puede ser tcp, ip o eth. |

Progreso

Características planificadas y completadas

  • Controladores de Dispositivos
    • Controladores de compatibilidad para IDQ Clavis 2
      • Retroalimentación del dispositivo
    • Controladores de compatibilidad para IDQ Clavis 3
    • Dispositivo portátil de espacio libre de la Universidad de Bristol
    • Dispositivo en chip de la Universidad de Bristol
  • Postprocesamiento
    • Alineación para sistemas asíncronos
    • Cribado para sistemas síncronos
    • Corrección de errores
    • Amplificación de privacidad
  • Gestión de claves multi-sitio (Agentes de Sitio)
    • Controlar dispositivos QKD para intercambiar clave
    • Proporcionar clave precompartida en una interfaz estándar: cqp::remote::IKey

Se espera que este proyecto sea útil tanto para trabajos de investigación científica como para proyectos grandes. Se pueden encontrar más detalles del proyecto en este documento.

Para contribuir a este proyecto, consulte el archivo Contribución.

Instalación

El sistema actualmente funciona en Linux; Windows está planeado para el futuro. Lo más fácil es construir desde el código fuente por ahora

Imagen Docker

Hay una imagen Docker lista para ejecutar en el gitlab registry. Puede ejecutarla con sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime. Agregue un comando al final para ejecutar algo directamente, por ejemplo, para ejecutar una simulación de la generación de claves QKD con QKDSim:```bash sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime AlignmentTests

root@kitploit:~
### Ubuntu 18.04+

Puedes instalar paquetes binarios desde [Gitlab](https://gitlab.com/QComms/cqptoolkit/-/jobs/artifacts/master/download?job=package%3Adeb). Extrae el archivo zip e instala las herramientas con `dpkg`, se quejará de dependencias faltantes pero no te preocupes, la segunda línea las solucionará.```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

Para instalar los archivos de desarrollo (encabezados y bibliotecas estáticas) ejecute sudo dpkg -i build/gcc/CQP-*-Linux-*-dev.deb ; sudo apt install -fy en su lugar.

Desde el código fuente

Por supuesto, si no desea cambiar las versiones de las bibliotecas y dependencias de su sistema, puede compilar dentro de un contenedor docker que ya tiene todas las dependencias instaladas con:```bash sudo docker run -it registry.gitlab.com/qcomms/cqptoolkit/buildenv

root@kitploit:~
De lo contrario, compilar desde el código fuente requiere que instales las dependencias listadas en `setup/setupbuild.sh`; actualmente funciona para Ubuntu y Arch Linux.

Clona el código fuente desde [gitlab](https://gitlab.com/QComms/cqptoolkit.git) con [git][] y compílalo con [CMake][] y [gnu make](https://www.gnu.org/software/make/):
La opción `--recurse-submodules` añade los extras opcionales: el acceso a algunos de ellos está restringido a la UoB y sus socios; la compilación funcionará sin ellos.```bash
git clone --recurse-submodules https://gitlab.com/QComms/cqptoolkit.git

Si deseas obtener todos los submódulos y tienes las credenciales adecuadas, ejecuta:```bash git submodule update --checkout

root@kitploit:~
Ahora, puedes ir a tu repositorio local e instalar las dependencias con el script (quizás sea necesario cambiar los permisos del archivo):```bash
cd cqptoolkit/setup
./setupbuild.sh

Luego, puedes construir el proyecto en una nueva carpeta:```bash mkdir build-cqptoolkit cd build-cqptoolkit cmake ../cqptoolkit && nice make -s -j

this can be installed with

sudo make install

root@kitploit:~
La compilación utiliza [CMake][] para generar archivos make/soluciones/etc para muchas plataformas diferentes y se invoca desde una carpeta de compilación vacía que contendrá todos los archivos de salida. Las compilaciones de depuración producen paquetes con el sufijo 'D'.
La compilación se puede controlar pasando opciones a cmake, por ejemplo `-DBUILD_TESTING=OFF`. Ejecute cmake con las opciones `-LH` para listar los interruptores disponibles.

Para hacer cambios y desarrollar la biblioteca, se recomienda instalar [QT Creator](http://doc.qt.io/qtcreator/) y abrir el proyecto [seleccionando el archivo CMakeLists.txt](https://codeyarns.com/2016/01/26/how-to-import-cmake-project-in-qt-creator/). Es aconsejable usar compilaciones paralelas yendo a Projects->Build Steps-> Details y agregando `-j<número>` a los parámetros de la herramienta, consulte [so](https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator).
Una vez compilados, los archivos, por defecto, están al mismo nivel que la carpeta del proyecto llamada `build-<nombre del proyecto>-<plataforma>-<destino>`.

> **Nota sobre protobuf + QT en Ubuntu**
> La biblioteca `qt5-gtk-platformtheme` está enlazada contra una versión antigua de protobuf que impedirá que nuestros programas QT se ejecuten.
> Esta dependencia opcional se puede eliminar con `apt-get remove qt5-gtk-platformtheme`

## Explorando la Biblioteca

    @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

A continuación se muestra un diagrama de flujo para ayudarle a encontrar el área relevante para usted, ya que el proyecto abarca muchos aspectos diferentes de QKD y la gestión de claves; los colaboradores son bienvenidos para impulsar este proyecto a ser más especializado.
QKD requiere alguna forma de comunicación [no clonable](https://en.wikipedia.org/wiki/No-cloning_theorem), usualmente usando fotones individuales a través de un cable de fibra óptica. Pueden operar punto a punto o como uno-a-muchos pero inherentemente tienen una ubicación física (donde termina la fibra); ¡no pueden virtualizarse! El punto en el que se transmite o detecta el fotón es el límite del sistema seguro, casi como el [firewall](https://en.wikipedia.org/wiki/Firewall_(computing)) de una red. Una vez que los fotones indivisibles se han convertido en una cadena de bits para formar una [clave simétrica](https://en.wikipedia.org/wiki/Key_(cryptography)), se aplican las reglas estándar de seguridad informática como autenticación, control de acceso, etc. La diferencia es que una vez que se han producido esas claves, cada uno de los dispositivos QKD tiene un número que [nadie más conoce](https://en.wikipedia.org/wiki/Shared_secret) [probado por la ciencia](https://arxiv.org/pdf/quant-ph/0003004.pdf).

La naturaleza de este efecto de "firewall" es que los sistemas que controlan los dispositivos QKD deben ser seguros y considerados de confianza - también llamado "nodo de confianza" - dónde y cómo se traza la línea puede variar desde guardias armados hasta simplemente [cerrar la puerta de la sala de servidores](https://www.youtube.com/watch?v=rnmcRTnTNC8).

Si no puede ver el diagrama a continuación, vaya a la [documentación en línea](https://qcomms.gitlab.io/cqptoolkit/), también se puede compilar con el objetivo `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


### Ejecutando DummyQKDDriver <a name="RunningDummyQKDDriver" />

Esta sección es solo un comentario sobre la funcionalidad útil de DummyQKDDriver para simular la salida de un dispositivo QKD. Por favor, consulte la siguiente sección para ver un ejemplo guiado de cómo configurar un enlace simple con ellos.
Como con la mayoría de los programas, pasarle `-h` mostrará las opciones disponibles. El DummyQKDDriver ejecuta un conjunto estándar de pasos de postprocesamiento en detecciones de fotones simuladas utilizando la clase cqp::DummyQKD. Es necesario que se ejecuten dos instancias del programa, una para Alice y otra para Bob.

Ejecute Bob primero en el puerto 8000 llamando a:```bash
DummyQKDDriver -b -k 0.0.0.0:8000

Ahora ejecuta Alice, indicándole que se conecte a Bob y comience a intercambiar la clave (en modo manual):```bash DummyQKDDriver -a -m localhost:8000

root@kitploit:~
Si funcionó, obtendrás una avalancha de mensajes de error como este: `ERROR: OnKeyGeneration No listener for generated key`. Esto se debe a que, aunque ejecutar el sistema de esta manera es agradable para verlo hacer algo, no es muy útil; no hay un lugar donde poner la clave generada. Los controladores están diseñados para ser utilizados por algo.
El proyecto tiene un sistema para gestionar las claves llamado [Site Agents](#SiteAgents) o puedes hablar directamente con los controladores usando la [interfaz IDevice](#IDeviceInterface)

### Configuring the Site Agents <a name="SiteAgents" />

Los Site agents, controladores y túneles VPN deben ser parametrizados para cada nodo de la red con archivos de cadenas JSON, ya que el comando predeterminado sin argumentos no especifica todos los campos necesarios por defecto y solo funciona para pruebas en la misma máquina local.

Los Site agents pueden ejecutarse con SiteAgentRunner; podemos ejecutar dos sitios con:```bash
SiteAgentRunner -c site-a.json

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

root@kitploit:~
con cada archivo JSON indicando apropiadamente un puerto diferente para Alice y Bob (ej. 9000/9001). La cadena JSON se ve así:```json
		{
		    "name":"",
		    "id":"",
		    "netManUri":"",
		    "bindAddress":"0.0.0.0",
		    "listenPort":9000,
		    "connectionAddress":"",
		    "credentials": {},
		    "useAutoDiscover":false,
		    "backingStoreUrl":"",
		    "fallbackKey":""
		}

Ahora podemos adjuntar nuestros DummyQKDDriver's, uno a cada sitio:```bash DummyQKDDriver -c driver_config-a.json # run as Alice, register with site agent

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

con cada archivo JSON indicando adecuadamente un puerto diferente para Alice y Bob (p. ej., 9000/9001). La cadena JSON se ve así:```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:~
> El campo de dirección de control puede ser 0.0.0.0:0 si no hay firewall que gestionar. Si es así, se debe indicar la IP real del host y elegir un puerto apropiado que el firewall no bloquee.

Nada sucederá todavía porque los agentes del sitio no saben qué hacer con estos dispositivos. Podemos instruirlos para que comiencen a generar claves (-b como begin) enviando el comando 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"}}]}'

Los ordenadores deben ser capaces de resolver nombres de host y esto debería usarse aquí en lugar de la dirección IP fija. Por lo tanto, se deben modificar los archivos /etc/hostnames en ambas máquinas si no es el caso.

Esta es una forma complicada de decir conectar A con B, pero es muy potente, permitiendo especificar múltiples saltos para producir una clave segura de extremo a extremo a partir de una cadena de dispositivos. Esta cadena JSON se puede especificar en el campo de configuración "staticHops" de los agentes del sitio para que esto ocurra automáticamente una vez que todos los dispositivos estén disponibles. El enlace se puede detener entonces con:```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:~
> Nota: se usa `-e` en lugar de `-b` para *finalizar* el enlace en lugar de *iniciarlo*.

Se pueden lograr configuraciones más complejas implementando usted mismo la interfaz cqp::remote::INetworkManager para emitir los comandos. La retroalimentación de los dispositivos llega a través de la interfaz cqp::remote::IReporting en el mismo socket para que pueda reaccionar a los cambios en el sistema. [Aquí](#Reporting) puede ver cómo extraer información de la interfaz de reportes con la herramienta StatsDump.

### Creación de controladores <a name="CreatingDrivers" />

La aplicación controladora es un puente entre las interfaces internas del dispositivo (cqp::IQKDDevice) y la interfaz externa cqp::remote::IDevice. La clase cqp::RemoteQKDDevice maneja la mayor parte del trabajo por usted; la aplicación debe manejar la configuración y creación del dispositivo.

El trabajo real consiste en crear un controlador para configurar el dispositivo y leer la clave. Si su dispositivo solo produce detecciones brutas, entonces necesitará configurar una [tubería de procesamiento](#ProcessingPipelines) como cqp::DummyQKD o cqp::PhotonDetectorMk1 y cqp::LEDAliceMk1. Si su dispositivo genera claves listas para usar como el cqp::Clavis3Device, necesita leerlas y publicarlas a través de la interfaz cqp::IKeyCallback (use cqp::KeyPublisher).

Ambos enfoques requieren una forma de gestión de sesiones, proporcionada por cqp::session::SessionController y cqp::session::AliceSessionController; estos implementan las interfaces cqp::ISessionController y cqp::remote::ISession y son utilizados por cqp::RemoteQKDDevice para iniciar y detener el dispositivo y su par. Normalmente esto es todo lo que se necesita, pero en algunas situaciones es necesario especializarlos para satisfacer los requisitos del dispositivo.

    @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

### Registro de un controlador <a name="Registering" />

En el momento de redactar este documento, todos los controladores se pueden registrar con un agente de sitio utilizando el modificador `-r`. Esto hace que cqp::RemoteQKDDevice llame a cqp::remote::ISiteAgent::RegisterDevice en cqp::SiteAgent, que luego usará la interfaz cqp::remote::ISession para iniciar/detener el dispositivo.

### Interfaz IDevice <a name="IDeviceInterface" />

Esta interfaz permite un acceso más directo al dispositivo que a través de los agentes de sitio. Las claves generadas por el dispositivo se devuelven inmediatamente a la persona que llama. Primero llame a cqp::remote::IDevice::WaitForSession, luego a cqp::remote::IDevice::RunSession. Llame a cqp::remote::IDevice::EndSession para detener la generación de claves.

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

Los [HSM](https://en.wikipedia.org/wiki/Hardware_security_module) son dispositivos de almacenamiento que actúan como bóvedas digitales físicamente seguras. Existe una interfaz estándar para ellos llamada [PKCS#11](https://en.wikipedia.org/wiki/PKCS_11). Cada fabricante tiene sus propias interfaces y el soporte para PKCS#11 es irregular, sin embargo, existe una implementación de software que usamos como referencia llamada [SoftHSM2](https://www.opendnssec.org/softhsm/). La clase cqp::keygen::HSMStore proporciona una implementación que vincula el cqp::SiteAgent con la interfaz cqp::IBackingStore.

### Interfaz IKey <a name="IKeyInterface" />

Los sitios proporcionan claves para muchos puntos finales (los almacenes de claves disponibles se pueden obtener llamando a cqp::remote::IKey::GetKeyStores); se pueden solicitar utilizando la interfaz cqp::remote::IKey. Una vez que se ha solicitado una nueva clave, el otro lado solo puede recuperarla como una clave existente; esto evita conflictos y mal uso de las claves.

### Cifrado <a name="Encryption" />

Se pueden encontrar más detalles sobre implementaciones específicas en:
* [Tunnels](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Tunnels.md)

### Reportes <a name="Reporting" />

Los cambios en los valores del sistema se publican externamente a través de la interfaz cqp::remote::IReporting e internamente con la clase cqp::stats::Stat.
Puede registrarse para todas las estadísticas llamando a cqp::remote::IReporting::GetStatistics con el campo cqp::remote::ReportingFilter::listIsExclude establecido en `true` o se pueden especificar filtros específicos.

### Tuberías de procesamiento <a name="ProcessingPipelines" />

El protocolo QKD [BB84](https://en.wikipedia.org/wiki/BB84) estándar requiere pasos de posprocesamiento para convertir las detecciones brutas en claves utilizables.

- **Alineación** Encontrar el inicio y el final de la transmisión real.
    + Ajustes por diferencias de tiempo/deriva, etc.
    + Compensación de diferencias de fase u otras entre el transmisor y el receptor, etc.
- **Cribado** Descartar detecciones no válidas
- **Corrección de errores** Corregir detecciones incorrectas - sin revelar los valores
- **Amplificación de privacidad** Hashing de la clave para que cualquier bit revelado sea inútil

Se puede ver un ejemplo de una tubería de procesamiento en cqp::DummyQKD::ProcessingChain.

## Compilación

Las compilaciones son gestionadas por el [sistema de integración continua](https://about.gitlab.com/product/continuous-integration/) de gitlab definido en el archivo `.gitlab-ci.yml`.

Las imágenes docker se pueden compilar manualmente ejecutando `setup/makeDocker.sh`.

### Windows

Esto es un trabajo en curso.
Esta configuración se ha probado en Windows 10 y Windows Server 2016 con Visual Studio 15 (2016).
Se admiten las siguientes configuraciones

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

#### IDE

- [Visual Studio 2016][]
    + Ejecute el script [InstallVcPkg.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/InstallVcPkg.bat) una vez para instalar vcpkg en C:\vcpkg
    + Ejecute el script [SetupMSBuild.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/SetupMSBuild.bat)
    + Abra la solución [cqp.sln](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/cqp.sln)
    + Seleccione Compilación -> Solución
- [QT Creator for windows][]
    + QT Creator puede usar tanto el compilador nativo de Microsoft como MSYS2. Instale MSYS2 por separado, no necesita instalar el compilador MinGW que viene con el instalador de QTCreator. O instale el [SDK de Windows 10][]
    + En el menú de componentes, seleccione los componentes para el compilador que esté usando. Por ejemplo, msvc2017
    + Usando "Abrir proyecto", seleccione el archivo `CMakeLists.txt` en la raíz del árbol de fuente.
- [MSYS2][] y [Codeblocks][]
    + Instale el paquete [MSYS2][].
    + Ejecute el script [installMSYS2Dependencies.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/installMSYS2Dependencies.bat)
    + En Configuración -> Depurador -> "Crear configuración" llamada "MSYS2 GDB"
        - Cambie el depurador para que apunte a gdb.exe (ej. C:\\msys64\\mingw64\\bin\\gdb.exe)
    + En Configuración -> Compilador
        + Copie la configuración del compilador GCC, llámela "GCC - Old"
        + Cambie el directorio de instalación de la cadena de herramientas a la ubicación de instalación mingw64 de MSYS2 (ej. C:\\msys64\\mingw64)
        + En cada uno de los campos bajo "Program Files" excepto el programa "make", elimine el prefijo `mingw32-`.
        + En el campo make, agregue el modificador -j para permitir compilación multinúcleo: `mingw32-make.exe -j`
        + Seleccione el depurador "MSYS2 GDB" creado anteriormente
        + Si prefiere una salida legible del compilador, en "Otras configuraciones" -> "Registro del compilador" seleccione "Descripción de tarea"
    + En el directorio de compilación de CodeBlock (\\build\\CodeBlocks)
    + Ejecute el archivo `SetupCodeBlocks-MSYS2.bat`
    + Abra el archivo de proyecto "CQP.cbp" de CodeBlocks.

Si su archivo de proyecto tiene una estructura de carpetas profunda (esto es un error), se puede mejorar haciendo clic derecho en el espacio de trabajo y:

- Desmarcando "Mostrar carpetas como en el disco"
- Marcando "Ocultar nombre de carpeta"

## Cómo citar este software```
@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}
}

Lecturas adicionales

Para más detalles sobre cómo escribir código para el kit de herramientas, consulta la Guía de codificación Para preguntas y problemas, consulta las Preguntas frecuentes

Descargar herramienta
  • Las claves pueden restringirse para uso por usuarios específicos
  • Creación de clave indirecta basada en XOR de claves de otros sitios
  • Configuración a través de archivo de configuración, argumentos de línea de comandos o interfaz de red.
  • Descubrimiento automático de Agentes de Sitio usando Zeroconf
  • Resolver claves a través de enlaces entre sitios de confianza (issue #8)
  • Gestión de red de agentes de sitio
    • Los sitios pueden controlarse a través de interfaces
    • Control estático/dinámico de agentes de sitio para crear claves entre sitios basado en reglas
  • Controlador de túnel cifrado (como stunnel)
    • Usa la interfaz IKey para obtener claves compartidas.
    • Configuración de túneles de cifrado usando
      • Socket TCP/UDP
      • Dispositivo TUN/TAP (también conocido como VPN)
      • Interfaz física dedicada
    • Configuración a través de archivo de configuración, argumentos de línea de comandos o interfaz de red.
    • Descubrimiento automático de Agentes de Sitio y Controladores de Túnel usando Zeroconf
  • Múltiples Plataformas
    • Linux
    • Windows (ver issue #2)