# wolfSSL Post-Quantum Cryptography Example This directory contains: - A simple example of using the wolfSSL CertManager to verify a falcon certificate chain in a standalone manner, separate from an SSL/TLS connection. - A simple example of using wolfCrypt APIs to sign a message with a SPHINCS+ private key and verify that message using the corresponding SPHINCS+ public key from a an X.509 certificate. certificate chain in a standalone manner, separate from an SSL/TLS connection. - A server application that perform a completely quantum-safe TLS 1.3 connection. - A client application that perform a completely quantum-safe TLS 1.3 connection with the server above. - An STM32CubeIDE project for doing quantum-safe TLS 1.3 connection over UART and some applications that run on the Linux side to connect with it. # Prerequisites Please see the wolfSSL repo's INSTALL file: https://github.com/wolfSSL/wolfssl/blob/master/INSTALL Item 15 (Building with liboqs for TLS 1.3 [EXPERIMENTAL]) has instructions on how to configure and build: - liboqs - wolfssl - patched OQS's OpenSSL fork ## Building the Applications ``` $ make ``` ## Verification of OQS Falcon Certificates The `generate_falcon_chains.sh` script in the `oqs` directory in the `osp` repo will allow you to use a patched version of OQS's OpenSSL fork in order to generate a self-signed CA certificate and entity certificate that uses the Falcon signature scheme. In the OpenSSL directory, run the script to generate the certificates and then copy them into this directory. Please see https://github.com/wolfSSL/osp/tree/master/oqs/README.md for further instructions about certificate generation. Once that is complete, execute `falcon_certverify`: ``` $ ./falcon_certverify ``` ## Signing and Verifying a Message with SPHINCS+ The `generate_sphincs_chains.sh` script in the `oqs` directory in the `osp` repo will allow you to use a patched version of OQS's OpenSSL fork in order to generate a self-signed CA certificate and entity certificate that uses the SPHINCS+ signature scheme. In the OpenSSL directory, run the script to generate the certificates and then copy them into this directory. Please see https://github.com/wolfSSL/osp/tree/master/oqs/README.md for further instructions about certificate generation. Once that is complete, execute `sphincs_sign_verify`: ``` $ ./sphincs_sign_verify ``` ## Quantum safe TLS 1.3 Connection `client-pq-tls13` will connect with `server-pq-tls13` via a completely quantum- safe connection. Authentication will be done via the FALCON signature scheme. Ephemeral key establishment will be done via kYBER KEM. Both are NIST PQC competition round 3 finalists. Please see https://github.com/wolfSSL/osp/tree/master/oqs/README.md for further instructions about certificate generation. In a terminal, execute the server: ```sh ./server-pq-tls13 ``` In another terminal, execute the client: ```sh ./client-pq-tls13 127.0.0.1 ``` The client will be prompted for a message to send to the server. Once you see this prompt, a quantum-safe connection has already been established. Use the client to send the message "shutdown" in order to end the execution of the server.