Skip to content

Commit a571446

Browse files
authored
Merge pull request #184 from vdukhovni/openssl-3.5-2025-03-12
OpenSSL 3.5 artefacts for IETF 122
2 parents 8fd09f3 + afbfee5 commit a571446

File tree

8 files changed

+464
-0
lines changed

8 files changed

+464
-0
lines changed

.gitattributes

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*.zip binary
2+
*.bin binary
3+
*.der binary
394 KB
Binary file not shown.

providers/ossl35/artifacts_cms_v3.zip

373 KB
Binary file not shown.

providers/ossl35/check_certs.sh

+196
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
#! /usr/bin/env bash
2+
3+
die() { printf "$@" >&2; exit 1; }
4+
if [[ $# != 1 ]]; then die 'Usage: %s <zipfile>\n' "$0"; fi
5+
6+
tmp=$(mktemp -t -d)
7+
trap 'e=$?; rm -rf ${tmp}; exit $e' EXIT HUP INT TERM
8+
unzip -qq -j -d "$tmp" "$1" || die 'Error unzipping %s\n' "$1"
9+
10+
ptext="${tmp}/plaintext"
11+
printf "Attack at dawn\n" > "$ptext"
12+
sigfile="${tmp}/sig.dat"
13+
14+
mldsa_oids=(2.16.840.1.101.3.4.3.{17,18,19})
15+
mlkem_oids=(2.16.840.1.101.3.4.4.{1,2,3})
16+
slh2s_oids=(2.16.840.1.101.3.4.3.{20,22,24})
17+
slh2f_oids=(2.16.840.1.101.3.4.3.{21,23,25})
18+
slh3s_oids=(2.16.840.1.101.3.4.3.{26,28,30})
19+
slh3f_oids=(2.16.840.1.101.3.4.3.{27,29,31})
20+
while [[ ${#mldsa_oids[@]} -gt 0 ]]
21+
do
22+
#
23+
# ML-DSA
24+
#
25+
(
26+
set -e
27+
set -o pipefail
28+
shopt -s nullglob
29+
pubs=()
30+
for form in seed expandedkey both ta
31+
do
32+
pubout="$tmp/${mldsa_oids[0]}_${form}_pub.der"
33+
/bin/rm -f "$pubout"
34+
count=0
35+
for obj in "$tmp"/*-"${mldsa_oids[0]}_${form}"*.der
36+
do
37+
if [[ $count > 0 ]]; then
38+
die 'Too many inputs match %s for %s\n'
39+
"$form" "${mldsa_oids[0]}"
40+
fi
41+
case $form in
42+
ta) openssl x509 -in "$obj" -pubkey -noout |
43+
openssl pkey -pubin -pubout -outform DER -out "$pubout"
44+
openssl verify -verify_depth 0 -trusted "$obj" "$obj" >/dev/null
45+
;;
46+
*) openssl pkey -in "$obj" -pubout -outform DER -out "$pubout"
47+
openssl pkeyutl -sign -rawin -inkey "$obj" -in "$ptext" -out "$sigfile"
48+
openssl pkeyutl -verify -rawin -in "$ptext" -pubin -inkey "$pubout" \
49+
-sigfile "$sigfile" >/dev/null ||
50+
die 'Signature verification failed for %s %s\n' \
51+
"$form" "${mldsa_oids[0]}"
52+
;;
53+
esac
54+
dgst=$(openssl dgst -sha256 -binary < "$pubout" | xxd -p -c32)
55+
pubs=("${pubs[@]}" "$dgst")
56+
count=$((count + 1))
57+
done
58+
if [[ $count -ne 1 ]]; then
59+
die 'Missing key form %s for %s\n' \
60+
"$form" "${mldsa_oids[0]}"
61+
fi
62+
done
63+
uniq=$(for dgst in "${pubs[@]}"; do printf "%s\n" "$dgst"; done | sort -u | wc -l)
64+
if [[ $uniq -ne 1 ]]; then
65+
die 'Multiple distinct pubkeys for %s\n' \
66+
"${mldsa_oids[0]}"
67+
fi
68+
)
69+
if [[ $? -ne 0 ]]; then ok=N; else ok=Y; fi
70+
printf "%s,%s\n" "${mldsa_oids[0]}" "$ok"
71+
72+
#
73+
# SLH-DSA
74+
#
75+
for oid in \
76+
"${slh2f_oids[0]}" "${slh2s_oids[0]}" \
77+
"${slh3f_oids[0]}" "${slh3s_oids[0]}"
78+
do
79+
(
80+
set -e
81+
set -o pipefail
82+
shopt -s nullglob
83+
count=0
84+
for obj in "$tmp"/*-"${oid}_ta.der"
85+
do
86+
if [[ $count > 0 ]]; then
87+
die 'Too many inputs for %s\n' "${oid}"
88+
fi
89+
openssl verify -verify_depth 0 -trusted "$obj" "$obj" >/dev/null
90+
count=$((count + 1))
91+
done
92+
if [[ $count -ne 1 ]]; then
93+
die 'Missing TA for %s\n' "${oid}"
94+
fi
95+
)
96+
if [[ $? -ne 0 ]]; then ok=N; else ok=Y; fi
97+
printf "%s,%s\n" "${oid}" "$ok"
98+
done
99+
100+
#
101+
# ML-KEM
102+
#
103+
(
104+
set -e
105+
set -o pipefail
106+
shopt -s nullglob
107+
count=0; for ta in "$tmp"/*-"${mldsa_oids[0]}_ta.der"
108+
do
109+
if [[ $count > 0 ]]; then
110+
die 'Too many TA files for %s\n' \
111+
"${mldsa_oids[0]}"
112+
fi
113+
count=$((count + 1))
114+
done
115+
if [[ $count -ne 1 ]]; then
116+
die 'No TA file for %s\n' \
117+
"${mldsa_oids[0]}"
118+
fi
119+
count=0; for ct in "$tmp"/*-"${mlkem_oids[0]}_ciphertext.bin"
120+
do
121+
if [[ $count > 0 ]]; then
122+
die 'Too many ciphertext files for %s\n' \
123+
"${mlkem_oids[0]}"
124+
fi
125+
count=$((count + 1))
126+
done
127+
if [[ $count -ne 1 ]]; then
128+
die 'No ciphertext file for %s\n' \
129+
"${mlkem_oids[0]}"
130+
fi
131+
count=0; for ss in "$tmp"/*-"${mlkem_oids[0]}_ss.bin"
132+
do
133+
if [[ $count > 0 ]]; then
134+
die 'Too many shared secret files for %s\n' \
135+
"${mlkem_oids[0]}"
136+
fi
137+
count=$((count + 1))
138+
done
139+
if [[ $count -ne 1 ]]; then
140+
die 'No shared secret file for %s\n' \
141+
"${mlkem_oids[0]}"
142+
fi
143+
pubs=()
144+
for form in seed expandedkey both ee
145+
do
146+
pubout="$tmp/${mlkem_oids[0]}_${form}_pub.der"
147+
/bin/rm -f "$pubout"
148+
count=0; for obj in "$tmp"/*-"${mlkem_oids[0]}_${form}"*.der
149+
do
150+
if [[ $count > 0 ]]; then
151+
die 'Too many inputs match %s for %s\n' \
152+
"$form" "${mlkem_oids[0]}"
153+
fi
154+
case $form in
155+
ee) openssl x509 -in "$obj" -pubkey -noout |
156+
openssl pkey -pubin -pubout -outform DER -out "$pubout"
157+
openssl verify -verify_depth 0 -trusted "$ta" "$obj" >/dev/null
158+
;;
159+
*) openssl pkey -in "$obj" -pubout -outform DER -out "$pubout"
160+
cmp -s "$ss" <(
161+
openssl pkeyutl -decap -inkey "$obj" -in "$ct" -secret /dev/stdout) ||
162+
die 'Shared secret mismatch for %s of %s\n' \
163+
"$form" "${mlkem_names[0]}"
164+
;;
165+
esac
166+
dgst=$(openssl dgst -sha256 -binary < "$pubout" | xxd -p -c32)
167+
pubs=("${pubs[@]}" "$dgst")
168+
count=$((count + 1))
169+
done
170+
if [[ $count -ne 1 ]]; then
171+
die 'Missing key form %s for %s\n' \
172+
"$form" "${mlkem_oids[0]}"
173+
fi
174+
done
175+
uniq=$(for dgst in "${pubs[@]}"; do printf "%s\n" "$dgst"; done | sort -u | wc -l)
176+
if [[ $uniq -ne 1 ]]; then
177+
die 'Multiple distinct pubkeys for %s\n' \
178+
"${mlkem_oids[0]}"
179+
fi
180+
)
181+
if [[ $? -ne 0 ]]; then ok=N; else ok=Y; fi
182+
printf "%s,%s\n" "${mlkem_oids[0]}" "$ok"
183+
184+
unset "mldsa_oids[0]"
185+
unset "mlkem_oids[0]"
186+
unset "slh2f_oids[0]"
187+
unset "slh2s_oids[0]"
188+
unset "slh3f_oids[0]"
189+
unset "slh3s_oids[0]"
190+
mldsa_oids=( "${mldsa_oids[@]}")
191+
mlkem_oids=( "${mlkem_oids[@]}")
192+
slh2f_oids=( "${slh2f_oids[@]}")
193+
slh2s_oids=( "${slh2s_oids[@]}")
194+
slh3f_oids=( "${slh3f_oids[@]}")
195+
slh3s_oids=( "${slh3s_oids[@]}")
196+
done

providers/ossl35/check_cms.sh

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#! /usr/bin/env bash
2+
3+
die() { printf "$@" >&2; exit 1; }
4+
if [[ $# != 1 ]]; then die 'Usage: %s <zipfile>\n' "$0"; fi
5+
6+
tmp=$(mktemp -t -d)
7+
trap 'e=$?; rm -rf ${tmp}; exit $e' EXIT HUP INT TERM
8+
unzip -qq -j -d "$tmp" "$1" || die 'Error unzipping %s\n' "$1"
9+
10+
if [[ ! -f "$tmp/ta.der" ]]; then
11+
die 'Missing Trust anchor file\n'
12+
fi
13+
/bin/rm -f "$tmp/ta.pem"
14+
openssl x509 -in "$tmp/ta.der" -inform DER -out "$tmp/ta.pem" ||
15+
die 'Error decoding TA certificate\n'
16+
17+
check_cms() {
18+
local oid=$1
19+
if [[ $# -ne 1 ]]; then die 'Usage: check_cms <oid>\n'; fi
20+
(
21+
set -e
22+
set -o pipefail
23+
shopt -s nullglob
24+
pubs=()
25+
26+
count=0
27+
for obj in "$tmp"/*-"${oid}_signed_attrs.der"
28+
do
29+
if [[ $count > 0 ]]; then
30+
die 'Too many inputs match %s\n' "${oid}"
31+
fi
32+
openssl cms -verify -CAfile "$tmp/ta.pem" -in "$obj" -inform DER >/dev/null 2>&1 || exit 1
33+
count=$((count + 1))
34+
done
35+
if [[ $count -eq 0 ]]; then exit 2; fi
36+
)
37+
case $? in
38+
0) printf "%s,%s\n" "${oid}" "Y";;
39+
1) printf "%s,%s\n" "${oid}" "N";;
40+
*) : ignored;;
41+
esac
42+
}
43+
44+
mldsa_oids=(2.16.840.1.101.3.4.3.{17,18,19})
45+
slh2s_oids=(2.16.840.1.101.3.4.3.{20,22,24})
46+
slh2f_oids=(2.16.840.1.101.3.4.3.{21,23,25})
47+
slh3s_oids=(2.16.840.1.101.3.4.3.{26,28,30})
48+
slh3f_oids=(2.16.840.1.101.3.4.3.{27,29,31})
49+
while [[ ${#mldsa_oids[@]} -gt 0 ]]
50+
do
51+
check_cms "${mldsa_oids[0]}"
52+
check_cms "${slh2f_oids[0]}"
53+
check_cms "${slh2s_oids[0]}"
54+
check_cms "${slh3f_oids[0]}"
55+
check_cms "${slh3s_oids[0]}"
56+
57+
unset "mldsa_oids[0]"; mldsa_oids=("${mldsa_oids[@]}")
58+
unset "slh2f_oids[0]"; slh2f_oids=("${slh2f_oids[@]}")
59+
unset "slh2s_oids[0]"; slh2s_oids=("${slh2s_oids[@]}")
60+
unset "slh3f_oids[0]"; slh3f_oids=("${slh3f_oids[@]}")
61+
unset "slh3s_oids[0]"; slh3s_oids=("${slh3s_oids[@]}")
62+
done
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
key_algorithm_oid,test_result
2+
2.16.840.1.101.3.4.3.17,Y
3+
2.16.840.1.101.3.4.3.21,Y
4+
2.16.840.1.101.3.4.3.20,Y
5+
2.16.840.1.101.3.4.3.27,Y
6+
2.16.840.1.101.3.4.3.26,Y
7+
2.16.840.1.101.3.4.4.1,Y
8+
2.16.840.1.101.3.4.3.18,Y
9+
2.16.840.1.101.3.4.3.23,Y
10+
2.16.840.1.101.3.4.3.22,Y
11+
2.16.840.1.101.3.4.3.29,Y
12+
2.16.840.1.101.3.4.3.28,Y
13+
2.16.840.1.101.3.4.4.2,Y
14+
2.16.840.1.101.3.4.3.19,Y
15+
2.16.840.1.101.3.4.3.25,Y
16+
2.16.840.1.101.3.4.3.24,Y
17+
2.16.840.1.101.3.4.3.31,Y
18+
2.16.840.1.101.3.4.3.30,Y
19+
2.16.840.1.101.3.4.4.3,Y
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
key_algorithm_oid,test_result
2+
2.16.840.1.101.3.4.3.17,Y
3+
2.16.840.1.101.3.4.3.21,Y
4+
2.16.840.1.101.3.4.3.20,Y
5+
2.16.840.1.101.3.4.3.27,Y
6+
2.16.840.1.101.3.4.3.26,Y
7+
2.16.840.1.101.3.4.3.18,Y
8+
2.16.840.1.101.3.4.3.23,Y
9+
2.16.840.1.101.3.4.3.22,Y
10+
2.16.840.1.101.3.4.3.29,Y
11+
2.16.840.1.101.3.4.3.28,Y
12+
2.16.840.1.101.3.4.3.19,Y
13+
2.16.840.1.101.3.4.3.25,Y
14+
2.16.840.1.101.3.4.3.24,Y
15+
2.16.840.1.101.3.4.3.31,Y
16+
2.16.840.1.101.3.4.3.30,Y

0 commit comments

Comments
 (0)