Skip to content

Commit 671d870

Browse files
author
Alex J Lennon
committed
oqs-provider: add OpenSSL provider + ptests and enable in test image
1 parent 2d9d564 commit 671d870

3 files changed

Lines changed: 152 additions & 0 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#!/bin/bash
2+
3+
set -euo pipefail
4+
5+
fail() {
6+
echo "FAIL: oqs-provider"
7+
exit "${1:-1}"
8+
}
9+
10+
pass() {
11+
echo "PASS: oqs-provider"
12+
exit 0
13+
}
14+
15+
echo "INFO: uname: $(uname -a || true)"
16+
echo "INFO: ptest dir: $(pwd)"
17+
18+
if ! command -v openssl >/dev/null 2>&1; then
19+
echo "ERROR: openssl command not found"
20+
fail 1
21+
fi
22+
23+
openssl version || true
24+
25+
modules_dir=""
26+
for d in /usr/lib/ossl-modules /usr/lib64/ossl-modules; do
27+
if [ -d "$d" ]; then
28+
modules_dir="$d"
29+
break
30+
fi
31+
done
32+
33+
if [ -z "${modules_dir}" ]; then
34+
echo "ERROR: could not find OpenSSL module directory (/usr/lib*/ossl-modules)"
35+
fail 1
36+
fi
37+
38+
if [ ! -e "${modules_dir}/oqsprovider.so" ] && [ ! -e "${modules_dir}/oqsprovider.dll" ]; then
39+
echo "ERROR: oqsprovider module not found in ${modules_dir}"
40+
echo "INFO: contents of ${modules_dir}:"
41+
ls -la "${modules_dir}" || true
42+
fail 1
43+
fi
44+
45+
echo "INFO: OPENSSL_MODULES=${modules_dir}"
46+
47+
providers_out="$(
48+
openssl list -providers \
49+
-provider-path "${modules_dir}" \
50+
-provider oqsprovider \
51+
-provider default 2>&1 || true
52+
)"
53+
echo "${providers_out}"
54+
55+
if ! echo "${providers_out}" | grep -qi "oqsprovider"; then
56+
echo "ERROR: oqsprovider did not load (output above)"
57+
fail 1
58+
fi
59+
60+
# Pick a signature algorithm that oqsprovider actually exposes in this build.
61+
# Names vary slightly across oqs-provider/liboqs versions, so try a small preference list.
62+
sig_list="$(
63+
openssl list -signature-algorithms \
64+
-provider-path "${modules_dir}" \
65+
-provider oqsprovider \
66+
-provider default 2>/dev/null || true
67+
)"
68+
69+
pick_sig_alg() {
70+
local preferred=("$@")
71+
local a
72+
for a in "${preferred[@]}"; do
73+
if echo "${sig_list}" | grep -qiE "(^|[[:space:]])${a}([[:space:]]|$)"; then
74+
echo "${a}"
75+
return 0
76+
fi
77+
done
78+
# Fallback: take the first token on the first non-empty line.
79+
echo "${sig_list}" | awk 'NF{print $1; exit}'
80+
}
81+
82+
SIGALG="$(pick_sig_alg dilithium2 Dilithium2 ML-DSA-44 dilithium3 Dilithium3)"
83+
if [ -z "${SIGALG}" ]; then
84+
echo "ERROR: could not determine any signature algorithm from oqsprovider"
85+
echo "INFO: openssl list -signature-algorithms output:"
86+
echo "${sig_list}"
87+
fail 1
88+
fi
89+
echo "INFO: using signature algorithm: ${SIGALG}"
90+
91+
tmpdir="$(mktemp -d)"
92+
trap 'rm -rf "${tmpdir}"' EXIT
93+
94+
echo "hello oqs-provider" > "${tmpdir}/msg.bin"
95+
96+
openssl genpkey \
97+
-provider-path "${modules_dir}" \
98+
-provider oqsprovider \
99+
-provider default \
100+
-algorithm "${SIGALG}" \
101+
-out "${tmpdir}/sk.pem" || fail $?
102+
103+
openssl pkey -in "${tmpdir}/sk.pem" -pubout -out "${tmpdir}/pk.pem" || fail $?
104+
105+
openssl pkeyutl -sign -inkey "${tmpdir}/sk.pem" -in "${tmpdir}/msg.bin" -out "${tmpdir}/sig.bin" || fail $?
106+
107+
openssl pkeyutl -verify -pubin -inkey "${tmpdir}/pk.pem" -in "${tmpdir}/msg.bin" -sigfile "${tmpdir}/sig.bin" || fail $?
108+
109+
pass
110+
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
2+
3+
DESCRIPTION = "Open Quantum Safe provider module for OpenSSL 3 (adds PQ algorithms via liboqs)"
4+
SUMMARY = "OpenSSL 3 provider for post-quantum algorithms backed by liboqs"
5+
SECTION = "crypto"
6+
HOMEPAGE = "https://openquantumsafe.org/"
7+
8+
LICENSE = "MIT"
9+
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ab9b4308908ace39992d3080dd26824a"
10+
11+
SRC_URI = "git://github.com/open-quantum-safe/oqs-provider.git;protocol=https;branch=main \
12+
file://run-ptest \
13+
"
14+
SRCREV = "848b4e6abaa89e769c4db46ca78f91000f67ca52"
15+
16+
S = "${WORKDIR}/git"
17+
18+
DEPENDS = "openssl liboqs"
19+
20+
inherit cmake pkgconfig ptest
21+
22+
# Ensure the provider installs to the *target* module dir (not a sysroot-derived path).
23+
EXTRA_OECMAKE = " \
24+
-DBUILD_SHARED_LIBS=ON \
25+
-DOQS_PROVIDER_BUILD_STATIC=OFF \
26+
-DOPENSSL_MODULES_PATH=${libdir}/ossl-modules \
27+
"
28+
29+
do_install_ptest() {
30+
install -d ${D}${PTEST_PATH}
31+
install -m 0755 ${WORKDIR}/run-ptest ${D}${PTEST_PATH}/run-ptest
32+
echo "${PV}" > ${D}${PTEST_PATH}/meta-quantum-safe-oqs-provider-version.txt
33+
}
34+
35+
# The module lives under OpenSSL's module directory, which isn't in default FILES for ${PN}.
36+
FILES:${PN} += "${libdir}/ossl-modules/*"
37+
38+
RDEPENDS:${PN}-ptest += "bash openssl"
39+

recipes-samples/images/core-image-qs.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
IMAGE_INSTALL += "\
77
python3-pyyaml \
88
ptest-runner \
9+
openssl \
910
liboqs \
1011
liboqs-ptest \
12+
oqs-provider \
13+
oqs-provider-ptest \
1114
"
1215

1316
DEFAULT_TEST_SUITES:pn-${PN} = "ssh ping ptest"

0 commit comments

Comments
 (0)