Skip to content

Commit 051b83b

Browse files
authored
Merge pull request #9999 from sebastian-carpenter/hpke-fix
Fix: Improved support for combinations of HPKE algos
2 parents 3b90841 + 25dcc00 commit 051b83b

11 files changed

Lines changed: 698 additions & 414 deletions

File tree

.github/scripts/openssl-ech.sh

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
cleanup() {
6+
if [ -f "$TMP_LOG" ]; then
7+
cat "$TMP_LOG"
8+
rm -f "$TMP_LOG"
9+
fi
10+
}
11+
trap cleanup EXIT
12+
13+
usage() {
14+
echo "Usage: $0 <client|server> [--suite <KEM,KDF,AEAD>] [--workspace <path>]"
15+
exit 1
16+
}
17+
18+
MODE=""
19+
SUITE=""
20+
21+
WORKSPACE=${GITHUB_WORKSPACE:-"."}
22+
23+
if [ $# -lt 1 ]; then
24+
usage
25+
fi
26+
27+
case "$1" in
28+
client|server) MODE="$1" ;;
29+
*) usage ;;
30+
esac
31+
shift
32+
33+
while [ $# -gt 0 ]; do
34+
case "$1" in
35+
--suite)
36+
[ -z "$2" ] && { echo "ERROR: --suite requires a value"; exit 1; }
37+
SUITE="$2"
38+
shift 2
39+
echo ""
40+
echo "Using suite: $SUITE"
41+
echo ""
42+
;;
43+
--workspace)
44+
[ -z "$2" ] && { echo "ERROR: --workspace requires a value"; exit 1; }
45+
WORKSPACE="$2"
46+
shift 2
47+
;;
48+
*) echo "Unknown argument: $1"; usage ;;
49+
esac
50+
done
51+
52+
OPENSSL=${OPENSSL:-"openssl"}
53+
WOLFSSL_CLIENT=${WOLFSSL_CLIENT:-"$WORKSPACE/examples/client/client"}
54+
WOLFSSL_SERVER=${WOLFSSL_SERVER:-"$WORKSPACE/examples/server/server"}
55+
CERT_DIR=${CERT_DIR:-"$WORKSPACE/certs"}
56+
57+
TMP_LOG="$WORKSPACE/tmp_file.log"
58+
PRIV_NAME="ech-private-name.com"
59+
PUB_NAME="ech-public-name.com"
60+
MAX_WAIT=50
61+
62+
openssl_server(){
63+
local ech_file="$WORKSPACE/ech_config.pem"
64+
local ech_config=""
65+
local port=""
66+
67+
rm -f "$ech_file"
68+
69+
$OPENSSL ech -public_name "$PUB_NAME" -out "$ech_file" $SUITE &>> "$TMP_LOG"
70+
71+
# parse ECH config from file
72+
ech_config=$(sed -n '/BEGIN ECHCONFIG/,/END ECHCONFIG/{/BEGIN ECHCONFIG\|END ECHCONFIG/d;p}' "$ech_file" | tr -d '\n')
73+
echo "parsed ech config: $ech_config" &>> "$TMP_LOG"
74+
75+
# start OpenSSL ECH server with ephemeral port and make sure it is
76+
# line-buffered
77+
stdbuf -oL $OPENSSL s_server \
78+
-tls1_3 \
79+
-cert "$CERT_DIR/server-cert.pem" \
80+
-key "$CERT_DIR/server-key.pem" \
81+
-cert2 "$CERT_DIR/server-cert.pem" \
82+
-key2 "$CERT_DIR/server-key.pem" \
83+
-ech_key "$ech_file" \
84+
-servername "$PRIV_NAME" \
85+
-accept 0 \
86+
-naccept 1 \
87+
&>> "$TMP_LOG" <<< "wolfssl!" &
88+
89+
# wait for server port to be ready and capture it
90+
counter=0
91+
while [ -z "$port" ]; do
92+
port=$(grep -m1 "ACCEPT" "$TMP_LOG" | sed 's/.*:\([0-9]*\)$/\1/')
93+
sleep 0.1
94+
counter=$((counter + 1))
95+
if [ "$counter" -gt "$MAX_WAIT" ]; then
96+
echo "ERROR: server port not found" &>> "$TMP_LOG"
97+
exit 1
98+
fi
99+
done
100+
echo "parsed port: $port" &>> "$TMP_LOG"
101+
102+
# test with wolfssl client
103+
$WOLFSSL_CLIENT -v 4 \
104+
-p "$port" \
105+
-S "$PRIV_NAME" \
106+
--ech "$ech_config" \
107+
&>> "$TMP_LOG"
108+
109+
rm -f "$ech_file"
110+
111+
grep -q "ech_success=1" "$TMP_LOG"
112+
}
113+
114+
openssl_client(){
115+
local ready_file="$WORKSPACE/wolfssl_tls13_ready$$"
116+
local ech_config=""
117+
local port=0
118+
119+
rm -f "$ready_file"
120+
121+
# start server with ephemeral port + ready file
122+
# also set server to be line buffered so the log can be grepped
123+
stdbuf -oL $WOLFSSL_SERVER \
124+
-v 4 \
125+
-R "$ready_file" \
126+
-p "$port" \
127+
-S "$PRIV_NAME" \
128+
--ech "$PUB_NAME" \
129+
$SUITE \
130+
&>> "$TMP_LOG" &
131+
132+
# wait for server to be ready, then get port
133+
counter=0
134+
while [ ! -s "$ready_file" ]; do
135+
sleep 0.1
136+
counter=$((counter + 1))
137+
if [ "$counter" -gt "$MAX_WAIT" ]; then
138+
echo "ERROR: no ready file" &>> "$TMP_LOG"
139+
exit 1
140+
fi
141+
done
142+
port="$(cat "$ready_file")"
143+
rm -f "$ready_file"
144+
echo "parsed port: $port" &>> "$TMP_LOG"
145+
146+
# get ECH config from server
147+
counter=0
148+
while [ -z "$ech_config" ]; do
149+
ech_config=$(grep -m1 "ECH config (base64): " "$TMP_LOG" \
150+
2>/dev/null | sed 's/ECH config (base64): //g')
151+
sleep 0.1
152+
counter=$((counter + 1))
153+
if [ "$counter" -gt "$MAX_WAIT" ]; then
154+
echo "ERROR: no ECH configs" &>> "$TMP_LOG"
155+
exit 1
156+
fi
157+
done
158+
echo "parsed ech config: $ech_config" &>> "$TMP_LOG"
159+
160+
# Test with OpenSSL s_client using ECH
161+
echo "wolfssl" | $OPENSSL s_client \
162+
-tls1_3 \
163+
-connect "localhost:$port" \
164+
-cert "$CERT_DIR/client-cert.pem" \
165+
-key "$CERT_DIR/client-key.pem" \
166+
-CAfile "$CERT_DIR/ca-cert.pem" \
167+
-servername "$PRIV_NAME" \
168+
-ech_config_list "$ech_config" \
169+
&>> "$TMP_LOG"
170+
171+
grep -q "ECH: success: 1" "$TMP_LOG"
172+
}
173+
174+
rm -f "$TMP_LOG"
175+
176+
case "$MODE" in
177+
server)
178+
if [ -n "$SUITE" ]; then
179+
SUITE="-suite $SUITE"
180+
fi
181+
openssl_server
182+
;;
183+
client)
184+
if [ -n "$SUITE" ]; then
185+
SUITE="--ech-suite $SUITE"
186+
fi
187+
openssl_client
188+
;;
189+
*)
190+
exit 1
191+
;;
192+
esac

0 commit comments

Comments
 (0)