Skip to content

Commit b2e9d4d

Browse files
committed
hostap workflow
1 parent 2a9d13d commit b2e9d4d

File tree

1 file changed

+253
-0
lines changed

1 file changed

+253
-0
lines changed

.github/workflows/hostap.yml

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
name: hostap and wpa supplicant Tests
2+
3+
# START OF COMMON SECTION
4+
on:
5+
push:
6+
branches: [ '*' ] # [ 'master', 'main', 'release/**' ]
7+
pull_request:
8+
branches: [ '*' ]
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
# END OF COMMON SECTION
14+
15+
jobs:
16+
build_wolfprovider:
17+
uses: ./.github/workflows/build-wolfprovider.yml
18+
with:
19+
wolfssl_ref: ${{ matrix.wolfssl_ref }}
20+
openssl_ref: ${{ matrix.openssl_ref }}
21+
strategy:
22+
matrix:
23+
wolfssl_ref: [ 'master', 'v5.8.0-stable' ]
24+
openssl_ref: [ 'openssl-3.5.0' ]
25+
26+
test_hostap:
27+
runs-on: ubuntu-22.04
28+
needs: build_wolfprovider
29+
# This should be a safe limit for the tests to run.
30+
timeout-minutes: 90
31+
strategy:
32+
matrix:
33+
hostap_ref: [ 'main' ]
34+
wolfssl_ref: [ 'master', 'v5.8.0-stable' ]
35+
openssl_ref: [ 'openssl-3.5.0' ]
36+
force_fail: [ 'WOLFPROV_FORCE_FAIL=1', '', 'OPENSSL' ]
37+
38+
steps:
39+
# Checkout the source so we can run the check-workflow-result script.
40+
- name: Checkout wolfProvider
41+
uses: actions/checkout@v4
42+
with:
43+
fetch-depth: 1
44+
45+
- name: Retrieving wolfProvider from cache
46+
uses: actions/cache/restore@v4
47+
id: wolfprov-cache-restore
48+
with:
49+
path: |
50+
wolfssl-install
51+
wolfprov-install
52+
openssl-install/lib64
53+
openssl-install/include
54+
openssl-install/bin
55+
key: wolfprov-${{ matrix.wolfssl_ref }}-${{ matrix.openssl_ref }}-${{ github.sha }}
56+
fail-on-cache-miss: true
57+
58+
- name: Install hostap dependencies
59+
env:
60+
LD_LIBRARY_PATH: "$GITHUB_WORKSPACE/openssl-install/lib64:$GITHUB_WORKSPACE/wolfprov-install/lib:$LD_LIBRARY_PATH"
61+
LDFLAGS: "-L$GITHUB_WORKSPACE/openssl-install/lib64"
62+
CFLAGS: "-I$GITHUB_WORKSPACE/openssl-install/include"
63+
PKG_CONFIG_PATH: "$GITHUB_WORKSPACE/openssl-install/lib64/pkgconfig"
64+
run: |
65+
sudo apt-get update
66+
sudo apt-get install -y libpcap0.8 libpcap-dev curl libcurl4-openssl-dev \
67+
libnl-3-dev binutils-dev libssl-dev libiberty-dev libnl-genl-3-dev \
68+
libnl-route-3-dev libdbus-1-dev bridge-utils tshark python3-pycryptodome \
69+
libsqlite3-dev libzstd1 wireless-tools iw
70+
# Uninstall system cryptography and reinstall with custom OpenSSL
71+
sudo apt-get remove -y python3-cryptography
72+
pip install --no-cache-dir --force-reinstall cryptography
73+
- name: Checkout hostap
74+
run: |
75+
test -d hostap || git clone https://w1.fi/hostap.git
76+
77+
- name: Apply hostap patches for wolfProvider
78+
run: |
79+
# Apply the patches we made to fix OpenSSL provider references
80+
cd hostap
81+
82+
echo "Applying hostap patches for wolfProvider compatibility..."
83+
84+
# Patch crypto_openssl.c to use libwolfprov instead of default/legacy providers
85+
sed -i 's/OSSL_PROVIDER_try_load(NULL, "default", 1)/OSSL_PROVIDER_try_load(NULL, "libwolfprov", 1)/g' src/crypto/crypto_openssl.c
86+
sed -i 's/OSSL_PROVIDER_try_load(NULL, "legacy", 1)/OSSL_PROVIDER_try_load(NULL, "libwolfprov", 1)/g' src/crypto/crypto_openssl.c
87+
88+
# Patch tls_openssl.c to use libwolfprov instead of pkcs11 provider
89+
sed -i 's/OSSL_PROVIDER_try_load(NULL, "pkcs11", 1)/OSSL_PROVIDER_try_load(NULL, "libwolfprov", 1)/g' src/crypto/tls_openssl.c
90+
91+
# Patch inside.sh to handle crda command failure gracefully
92+
sed -i 's/COUNTRY=00 crda/COUNTRY=00 crda || true/g' tests/hwsim/vm/inside.sh
93+
94+
echo "Applied hostap patches for wolfProvider compatibility"
95+
96+
- name: Checkout linux
97+
uses: actions/checkout@v4
98+
with:
99+
repository: torvalds/linux
100+
path: linux
101+
ref: master
102+
103+
- name: Compile linux
104+
run: |
105+
cp $GITHUB_WORKSPACE/hostap/tests/hwsim/vm/kernel-config.uml linux/.config
106+
cd linux
107+
yes "" | ARCH=um make -j $(nproc)
108+
- name: Update config
109+
working-directory: hostap/tests/hwsim
110+
run: |
111+
cat << EOF >> example-hostapd.config
112+
# Custom OpenSSL installation paths
113+
CFLAGS += -I$GITHUB_WORKSPACE/openssl-install/include
114+
LDFLAGS += -L$GITHUB_WORKSPACE/openssl-install/lib64
115+
# Override OpenSSL libraries to use custom installation with rpath
116+
LIBS += -L$GITHUB_WORKSPACE/openssl-install/lib64 -Wl,-rpath,$GITHUB_WORKSPACE/openssl-install/lib64
117+
EOF
118+
cat << EOF >> example-wpa_supplicant.config
119+
# Custom OpenSSL installation paths
120+
CFLAGS += -I$GITHUB_WORKSPACE/openssl-install/include
121+
LDFLAGS += -L$GITHUB_WORKSPACE/openssl-install/lib64
122+
# Override OpenSSL libraries to use custom installation with rpath
123+
LIBS += -L$GITHUB_WORKSPACE/openssl-install/lib64 -Wl,-rpath,$GITHUB_WORKSPACE/openssl-install/lib64
124+
EOF
125+
- name: Setup non-WPFF environment
126+
working-directory: hostap/tests/hwsim
127+
if: matrix.force_fail == ''
128+
run: |
129+
sed -i '115r /dev/stdin' vm/inside.sh << EOF
130+
echo "setting env variables"
131+
# Set up wolfSSL environment variables
132+
# In UML mode, we can access the host filesystem directly
133+
echo "Setting up wolfSSL environment in UML mode"
134+
# Use the host filesystem paths directly
135+
export LD_LIBRARY_PATH="$GITHUB_WORKSPACE/openssl-install/lib64:$GITHUB_WORKSPACE/wolfprov-install/lib:$LD_LIBRARY_PATH"
136+
export OPENSSL_CONF="$GITHUB_WORKSPACE/provider.conf"
137+
export OPENSSL_MODULES="$GITHUB_WORKSPACE/wolfprov-install/lib"
138+
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
139+
echo "wolfSSL environment variables set:"
140+
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
141+
echo "OPENSSL_CONF: $OPENSSL_CONF"
142+
echo "OPENSSL_MODULES: $OPENSSL_MODULES"
143+
# Test if wolfProvider is available
144+
echo "Testing OpenSSL providers:"
145+
$GITHUB_WORKSPACE/openssl-install/bin/openssl list -providers
146+
EOF
147+
- name: Setup WPFF environment
148+
working-directory: hostap/tests/hwsim
149+
if: matrix.force_fail == 'WOLFPROV_FORCE_FAIL=1'
150+
run: |
151+
sed -i '115r /dev/stdin' vm/inside.sh << EOF
152+
echo "setting env variables"
153+
# Set up wolfSSL environment variables
154+
# In UML mode, we can access the host filesystem directly
155+
echo "Setting up wolfSSL environment in UML mode"
156+
# Use the host filesystem paths directly
157+
export LD_LIBRARY_PATH="$GITHUB_WORKSPACE/openssl-install/lib64:$GITHUB_WORKSPACE/wolfprov-install/lib:$LD_LIBRARY_PATH"
158+
export OPENSSL_CONF="$GITHUB_WORKSPACE/provider.conf"
159+
export OPENSSL_MODULES="$GITHUB_WORKSPACE/wolfprov-install/lib"
160+
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
161+
export WOLFPROV_FORCE_FAIL=1
162+
echo "wolfSSL environment variables set:"
163+
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
164+
echo "OPENSSL_CONF: $OPENSSL_CONF"
165+
echo "OPENSSL_MODULES: $OPENSSL_MODULES"
166+
# Test if wolfProvider is available
167+
echo "Testing OpenSSL providers:"
168+
$GITHUB_WORKSPACE/openssl-install/bin/openssl list -providers
169+
EOF
170+
- name: Update certs
171+
working-directory: hostap/tests/hwsim/auth_serv
172+
run: ./update.sh
173+
174+
- name: Build hostap and wpa_supplicant
175+
working-directory: hostap/tests/hwsim/
176+
run: ./build.sh
177+
178+
- name: Verify openssl binaries linked
179+
working-directory: hostap
180+
run: |
181+
ldd hostapd/hostapd | grep ssl
182+
ldd wpa_supplicant/wpa_supplicant | grep ssl
183+
- name: Run focused tests
184+
id: testing
185+
working-directory: hostap/tests/hwsim/
186+
continue-on-error: true
187+
run: |
188+
set +e
189+
cat << EOF >> vm/vm-config
190+
KERNELDIR=$GITHUB_WORKSPACE/linux
191+
KVMARGS="-cpu host"
192+
EOF
193+
194+
SMOKE_TIMEOUT="3m"
195+
TLS_TIMEOUT="5m"
196+
197+
# Run only the focused tests similar to hostap-uml-tests-test2
198+
echo "=== Running focused smoke tests ==="
199+
SMOKE_TESTS="ap_open ap_wpa2_psk p2p_device_discovery"
200+
echo "Running smoke tests with timeout $SMOKE_TIMEOUT: $SMOKE_TESTS"
201+
timeout $SMOKE_TIMEOUT ./vm/parallel-vm.py --nocurses $(nproc) $SMOKE_TESTS || SMOKE_RES=$?
202+
203+
echo "=== Running TLS/EAP tests ==="
204+
TLS_EAP_TESTS="ap_wpa2_eap_tls ap_wpa2_eap_peap_eap_mschapv2 ap_wpa2_eap_ttls_mschapv2"
205+
echo "Running TLS/EAP tests with timeout $TLS_TIMEOUT: $TLS_EAP_TESTS"
206+
timeout $TLS_TIMEOUT ./vm/parallel-vm.py --nocurses $(nproc) $TLS_EAP_TESTS || TLS_RES=$?
207+
208+
# Check for timeout conditions (exit code 124)
209+
SMOKE_TIMEOUT_FLAG=false
210+
TLS_TIMEOUT_FLAG=false
211+
if [ "${SMOKE_RES:-0}" -eq "124" ]; then
212+
echo "Smoke tests timed out"
213+
SMOKE_TIMEOUT_FLAG=true
214+
fi
215+
if [ "${TLS_RES:-0}" -eq "124" ]; then
216+
echo "TLS/EAP tests timed out"
217+
TLS_TIMEOUT_FLAG=true
218+
fi
219+
220+
# Combine results
221+
FINAL_RES=0
222+
if [ "${SMOKE_RES:-0}" -ne "0" ] || [ "${TLS_RES:-0}" -ne "0" ]; then
223+
FINAL_RES=1
224+
fi
225+
226+
# For force fail tests, we expect failures (including timeouts)
227+
if [ "${{ matrix.force_fail }}" == "WOLFPROV_FORCE_FAIL=1" ]; then
228+
if [ $FINAL_RES -ne 0 ]; then
229+
if [ "$SMOKE_TIMEOUT_FLAG" = true ] || [ "$TLS_TIMEOUT_FLAG" = true ]; then
230+
echo "EXPECTED TIMEOUT/STALL: Tests timed out as expected with WOLFPROV_FORCE_FAIL=1"
231+
echo "This confirms wolfProvider force fail is working correctly (causing stalls)"
232+
else
233+
echo "EXPECTED FAILURE: Tests failed as expected with WOLFPROV_FORCE_FAIL=1"
234+
echo "This confirms wolfProvider is being used correctly"
235+
fi
236+
exit 0
237+
else
238+
echo "UNEXPECTED SUCCESS: Tests passed when they should have failed/timed out with force_fail"
239+
exit 1
240+
fi
241+
else
242+
if [ $FINAL_RES -eq 0 ]; then
243+
echo "SUCCESS: Tests passed without force fail"
244+
exit 0
245+
else
246+
if [ "$SMOKE_TIMEOUT_FLAG" = true ] || [ "$TLS_TIMEOUT_FLAG" = true ]; then
247+
echo "UNEXPECTED TIMEOUT: Tests timed out without force fail"
248+
else
249+
echo "FAILURE: Tests failed without force fail"
250+
fi
251+
exit 1
252+
fi
253+
fi

0 commit comments

Comments
 (0)