Skip to content

Commit 6d327ef

Browse files
committed
test: Add tests for signing and verifying with ML-DSA keys
Create ML-DSA-44 & ML-DSA-65 keys if ML-DSA-44 can be created with the installed version of OpenSSL. Add test cases for signing and verifying with these types of keys. Do not test with ML-DSA-87 keys since the signatures they create may be too large for some filesystems' xattrs. On Btrfs, however, it would be possible to store the large signatures. Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
1 parent 2435ed3 commit 6d327ef

2 files changed

Lines changed: 47 additions & 4 deletions

File tree

tests/gen-keys.sh

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,28 @@ if [ -x /opt/openssl3/bin/openssl ]; then
148148
done)
149149
fi
150150

151+
# If creating mldsa44 key works, create all ML-DSA sizes
152+
if openssl genpkey -algorithm mldsa44 &>/dev/null; then
153+
for mldsa in mldsa44 mldsa65; do
154+
if [ "$1" = clean ] || [ "$1" = force ]; then
155+
rm -f test-$mldsa.cer test-$mldsa.key test-$mldsa.pub
156+
fi
157+
if [ "$1" = clean ]; then
158+
continue
159+
fi
160+
if [ ! -e test-$mldsa.key ]; then
161+
log openssl req -verbose -new -nodes -utf8 -sha256 -days 10000 -batch -x509 \
162+
-config test-ca.conf \
163+
-newkey "$mldsa" \
164+
-out test-$mldsa.cer -outform DER \
165+
-keyout test-$mldsa.key
166+
if [ -s test-$mldsa.key ]; then
167+
log openssl pkey -in test-$mldsa.key -out test-$mldsa.pub -pubout
168+
fi
169+
fi
170+
done
171+
fi
172+
151173
# This script leaves test-ca.conf, *.cer, *.pub, *.key files for sing/verify tests.
152174
# They are never deleted except by `make distclean'.
153175

tests/sign_verify.test

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,14 @@ check_sign() {
166166
fi
167167

168168
# Can openssl sign with this digest and key?
169-
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -$ALG -sign $key -hex $FILE"
170-
echo - "$cmd"
169+
case "${KEY:0:10}" in
170+
"test-mldsa")
171+
cmd="openssl pkeyutl -sign -inkey $key -in $FILE"
172+
echo >> "$FILE" # need at least 1 byte in the file for signing to work
173+
;;
174+
*)
175+
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -$ALG -sign $key -hex $FILE"
176+
esac
171177
if ! $cmd >/dev/null; then
172178
echo "${CYAN}$ALG ($key) test is skipped (openssl is unable to sign)$NORM"
173179
return "$SKIP"
@@ -219,8 +225,18 @@ check_sign() {
219225
echo -en "\x${PREFIX:2:2}\x${PREFIX:6:2}" > "$FILE.tmp"
220226
# shellcheck disable=SC2086
221227
openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -"$ALG" -binary "$FILE" >> "$FILE.tmp"
222-
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -$ALG -verify ${verifykey} \
223-
-signature $FILE.sig2 $FILE.tmp"
228+
229+
case "${KEY:0:10}" in
230+
"test-mldsa")
231+
# ML-DSA needs the ima_file_id as input
232+
openssl dgst -$ALG -binary $FILE > $FILE.hash
233+
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -verify ${verifykey} \
234+
-signature $FILE.sig2 $FILE.tmp"
235+
;;
236+
*)
237+
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -$ALG -verify ${verifykey} \
238+
-signature $FILE.sig2 $FILE.tmp"
239+
esac
224240
sigver=3
225241
else
226242
cmd="openssl dgst $OPENSSL_ENGINE $OPENSSL_KEYFORM -$ALG -verify ${verifykey} \
@@ -424,6 +440,11 @@ sign_verify_ima prime256v1 sha256 0x030304:K:004[345678] --v3
424440
sign_verify_ima prime256v1 sha384 0x030305:K:004[345678] --v3
425441
sign_verify_ima prime256v1 sha512 0x030306:K:004[345678] --v3
426442

443+
sign_verify mldsa44 sha256 0x030304:K:0974 --v3
444+
sign_verify mldsa44 sha512 0x030306:K:0974 --v3
445+
sign_verify mldsa65 sha256 0x030304:K:0ced --v3
446+
sign_verify mldsa65 sha512 0x030306:K:0ced --v3
447+
427448
# If openssl 3.0 is installed, test the SM2/3 algorithm combination
428449
ssl_major_version=$(openssl version | sed -n 's/^OpenSSL \([^\.]\).*/\1/p')
429450
if [ "${ssl_major_version}" = 3 ]; then

0 commit comments

Comments
 (0)