@@ -284,6 +284,7 @@ WOLFIP_ENABLE_PEAP_MSCHAPV2 ?= 0
284284WOLFIP_ENABLE_SAE ?= 1
285285WOLFIP_ENABLE_SAE_H2E ?= 1
286286WOLFIP_ENABLE_SAE_HNP ?= 1
287+ WOLFIP_ENABLE_MACSEC ?= 0
287288
288289ifneq ($(WOLFSSL_PREFIX ) ,)
289290WOLFSSL_CFLAGS := -I$(WOLFSSL_PREFIX ) /include
@@ -335,7 +336,39 @@ $(error WOLFIP_ENABLE_SAE_H2E=1 requires WOLFIP_ENABLE_SAE=1)
335336endif
336337endif
337338
338- SUPPLICANT_OBJ := $(patsubst src/% .c,build/% .o,$(SUPPLICANT_SRC ) )
339+ # MACsec / MKA (IEEE 802.1AE + 802.1X-2010). Standalone module under
340+ # src/macsec/ that reuses the supplicant crypto layer (AES key wrap, secure
341+ # zero). Requires wolfSSL built with --enable-cmac (WOLFSSL_CMAC).
342+ # The software SecY (macsec_crypto/macsec_secy/macsec_sa) is always built with
343+ # MACsec. The MKA control plane is provided by the wolfDen wolfMKA library from
344+ # a local clone (not a submodule): set WOLFMKA_DIR to build it. Without it, only
345+ # the SecY data plane (usable with a static SAK) is built.
346+ WOLFMKA_DIR ?=
347+ WOLFMKA_OBJ :=
348+ WOLFIP_HAVE_WOLFMKA :=
349+
350+ ifeq ($(WOLFIP_ENABLE_MACSEC ) ,1)
351+ SUPPLICANT_SRC += src/macsec/macsec_crypto.c \
352+ src/macsec/macsec_secy.c \
353+ src/macsec/macsec_sa.c
354+ CFLAGS += -DWOLFIP_ENABLE_MACSEC=1 -Isrc/macsec
355+ ifneq ($(WOLFMKA_DIR ) ,)
356+ ifeq ($(wildcard $(WOLFMKA_DIR ) /include/wolfmka/mka_kay.h) ,)
357+ $(error WOLFMKA_DIR is set but does not point at a wolfMKA clone (got '$(WOLFMKA_DIR)'))
358+ endif
359+ WOLFIP_HAVE_WOLFMKA := 1
360+ SUPPLICANT_SRC += src/macsec/mka_wolfmka.c
361+ # WOLFMKA_ICV_L2_ADDR makes wolfMKA include the L2 addresses (DA||SA||EtherType)
362+ # in the MKA ICV, matching wpa_supplicant / the Linux kernel (802.1X-2010
363+ # 11.11.3); required to interoperate with them.
364+ CFLAGS += -DWOLFIP_MKA_WOLFMKA=1 -DWOLFMKA_ICV_L2_ADDR -I$(WOLFMKA_DIR ) /include
365+ # wolfMKA library objects live outside src/, compiled to build/wolfmka/.
366+ WOLFMKA_OBJ := build/wolfmka/mka_crypto.o build/wolfmka/mka_kay.o \
367+ build/wolfmka/mka_pdu.o build/wolfmka/mka_status.o
368+ endif
369+ endif
370+
371+ SUPPLICANT_OBJ := $(patsubst src/% .c,build/% .o,$(SUPPLICANT_SRC ) ) $(WOLFMKA_OBJ )
339372
340373# Header-dependency tracking for the supplicant + its host glue. Without
341374# this, editing a supplicant header (e.g. a struct in supplicant.h) would
@@ -351,6 +384,17 @@ build/supplicant/%.o: src/supplicant/%.c
351384 @echo " [CC] $<"
352385 @$(CC ) $(CFLAGS ) $(WOLFSSL_CFLAGS ) $(NL80211_CFLAGS ) -MMD -MP -Isrc/supplicant -c $< -o $@
353386
387+ build/macsec/% .o : src/macsec/% .c
388+ @mkdir -p ` dirname $@ ` || true
389+ @echo " [CC] $<"
390+ @$(CC ) $(CFLAGS ) $(WOLFSSL_CFLAGS ) -MMD -MP -Isrc/supplicant -Isrc/macsec -c $< -o $@
391+
392+ # wolfMKA library sources from the local clone ($(WOLFMKA_DIR)/src).
393+ build/wolfmka/% .o : $(WOLFMKA_DIR ) /src/% .c
394+ @mkdir -p build/wolfmka || true
395+ @echo " [CC] $<"
396+ @$(CC ) $(CFLAGS ) $(WOLFSSL_CFLAGS ) -I$(WOLFMKA_DIR ) /include -c $< -o $@
397+
354398# WOLFSSL_LIBS / WOLFSSL_CFLAGS may already be set above when
355399# WOLFSSL_PREFIX is provided. Otherwise default to pkg-config detection
356400# and a plain -lwolfssl fallback.
@@ -368,6 +412,58 @@ build/test-wpa-crypto: $(SUPPLICANT_OBJ) build/supplicant/test_wpa_crypto.o
368412 @echo " [LD] $@ "
369413 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
370414
415+ build/test-macsec-crypto : $(SUPPLICANT_OBJ ) build/macsec/test_macsec_crypto.o
416+ @echo " [LD] $@ "
417+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
418+
419+ build/test-macsec-secy : $(SUPPLICANT_OBJ ) build/macsec/test_macsec_secy.o
420+ @echo " [LD] $@ "
421+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
422+
423+ build/test-macsec-sa : $(SUPPLICANT_OBJ ) build/macsec/test_macsec_sa.o
424+ @echo " [LD] $@ "
425+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
426+
427+ # macsec_probe: byte-level SecY cross-check tool used by the kernel-macsec
428+ # interop scripts (tools/macsec/run_macsec_static_test.sh).
429+ build/tools/macsec_probe.o : tools/macsec/macsec_probe.c
430+ @mkdir -p build/tools || true
431+ @echo " [CC] $<"
432+ @$(CC ) $(CFLAGS ) $(WOLFSSL_CFLAGS ) -Isrc/supplicant -Isrc/macsec -c $< -o $@
433+
434+ build/macsec-probe : $(SUPPLICANT_OBJ ) build/tools/macsec_probe.o
435+ @echo " [LD] $@ "
436+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
437+
438+ # macsec_sta: AF_PACKET host harness that runs the wolfMKA participant for
439+ # interop against wpa_supplicant (run_macsec_mka_test.sh). Linux only; requires
440+ # WOLFMKA_DIR (the wolfMKA library provides the MKA control plane).
441+ build/tools/macsec_sta.o : tools/macsec/macsec_sta.c
442+ @mkdir -p build/tools || true
443+ @echo " [CC] $<"
444+ @$(CC ) $(CFLAGS ) $(WOLFSSL_CFLAGS ) -Isrc/supplicant -Isrc/macsec -I$(WOLFMKA_DIR ) /include -c $< -o $@
445+
446+ build/macsec-sta : $(SUPPLICANT_OBJ ) build/tools/macsec_sta.o
447+ @echo " [LD] $@ "
448+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
449+
450+ # libFuzzer harness for the network-facing SecY receive path. Needs clang
451+ # (-fsanitize=fuzzer); the macsec sources are compiled straight into the
452+ # harness so the instrumentation is consistent. Not built by default. Requires
453+ # a CMAC-enabled wolfSSL (WOLFSSL_CFLAGS/LIBS).
454+ FUZZ_CC ?= clang
455+ FUZZ_FLAGS ?= -fsanitize=fuzzer,address,undefined -fno-sanitize-recover=all -g -O1
456+ FUZZ_MACSEC_SRC := src/macsec/macsec_crypto.c src/macsec/macsec_secy.c \
457+ src/macsec/macsec_sa.c src/supplicant/wpa_crypto.c
458+
459+ build/fuzz-macsec-secy : src/macsec/fuzz_macsec_secy.c $(FUZZ_MACSEC_SRC )
460+ @mkdir -p build || true
461+ @echo " [FUZZ] $@ "
462+ @$(FUZZ_CC ) $(FUZZ_FLAGS ) $(WOLFSSL_CFLAGS ) -Isrc/supplicant -Isrc/macsec \
463+ $(^ ) -o $@ $(WOLFSSL_LIBS )
464+
465+ macsec-fuzz : build/fuzz-macsec-secy
466+
371467build/test-supplicant-4way : $(SUPPLICANT_OBJ ) build/supplicant/test_supplicant_4way.o
372468 @echo " [LD] $@ "
373469 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(WOLFSSL_LIBS ) $(END_GROUP )
@@ -535,10 +631,23 @@ endif
535631ifeq ($(WOLFIP_ENABLE_SAE ) ,1)
536632SUPPLICANT_TEST_BINS += build/test-sae-crypto build/test-supplicant-sae
537633endif
634+ ifeq ($(WOLFIP_ENABLE_MACSEC ) ,1)
635+ SUPPLICANT_TEST_BINS += build/test-macsec-crypto build/test-macsec-secy \
636+ build/test-macsec-sa
637+ endif
538638
539639supplicant-tests : $(SUPPLICANT_TEST_BINS )
540640 @for t in $(SUPPLICANT_TEST_BINS ) ; do echo " ==> $$ t" ; $$ t || exit 1; done
541641
642+ # The same in-process unit tests built with AddressSanitizer + UBSan, to catch
643+ # memory / undefined-behaviour bugs in the parsers. Target-specific flags flow
644+ # to the object + link rules of the prerequisite bins. Run from a clean tree
645+ # (sanitizer objects must not be reused by a normal build).
646+ supplicant-tests-sanitize : CFLAGS += -fsanitize=address,undefined \
647+ -fno-sanitize-recover =all -g
648+ supplicant-tests-sanitize : LDFLAGS += -fsanitize=address,undefined
649+ supplicant-tests-sanitize : supplicant-tests
650+
542651# Real-authenticator interop tests. Both require hostapd installed and
543652# root (veth pair + AF_PACKET raw socket). Not part of supplicant-tests
544653# because of those constraints.
0 commit comments