|
| 1 | +# wolfHSM DTLS Client Example |
| 2 | +# |
| 3 | +# Usage: |
| 4 | +# make download_repos # Clone wolfSSL and wolfHSM repos |
| 5 | +# make all # Build everything (wolfSSL server, wolfHSM server, client) |
| 6 | +# make run_hsm_server # Start wolfHSM server |
| 7 | +# make run_dtls_server # Start wolfSSL DTLS server |
| 8 | +# make run_client # Run the DTLS client |
| 9 | +# make clean # Clean build artifacts |
| 10 | +# make clean_repos # Remove cloned repositories |
| 11 | + |
| 12 | +BIN = wh_dtls_client |
| 13 | + |
| 14 | +WOLFSSL_DIR ?= ./wolfssl |
| 15 | +WOLFHSM_DIR ?= ./wolfhsm |
| 16 | +WOLFHSM_PORT_DIR = $(WOLFHSM_DIR)/port/posix |
| 17 | +WOLFHSM_SERVER_DIR = $(WOLFHSM_DIR)/examples/posix/wh_posix_server |
| 18 | + |
| 19 | +PROJECT_DIR = . |
| 20 | +BUILD_DIR = $(PROJECT_DIR)/Build |
| 21 | + |
| 22 | +# Compiler settings |
| 23 | +CC = gcc |
| 24 | +CSTD = -std=c99 |
| 25 | +CFLAGS_EXTRA = -Werror -Wall -Wextra -ffunction-sections -fdata-sections |
| 26 | +CFLAGS = $(CSTD) $(CFLAGS_EXTRA) |
| 27 | +DEF = -D_POSIX_C_SOURCE=200809L -DWOLFSSL_USER_SETTINGS -DWOLFHSM_CFG |
| 28 | +DEF += -DWC_USE_DEVID=0x5748534D |
| 29 | +# Several wolfSSL sources (asn_orig.c, pk_ec.c, ssl_*.c, ...) are meant to be |
| 30 | +# #included by a parent translation unit and #warning when built standalone, which |
| 31 | +# -Werror turns into an error. This macro silences only those, leaving genuine |
| 32 | +# configuration warnings (e.g. random.c's insecure-seed warning) still fatal. |
| 33 | +DEF += -DWOLFSSL_IGNORE_FILE_WARN |
| 34 | + |
| 35 | +INC = -I$(PROJECT_DIR) -I$(WOLFSSL_DIR) -I$(WOLFHSM_DIR) -I$(WOLFHSM_PORT_DIR) |
| 36 | + |
| 37 | +# Linker settings |
| 38 | +LDFLAGS = -Wl,--gc-sections |
| 39 | +LIBS = -lm -lpthread |
| 40 | + |
| 41 | +# Source files (wolfCrypt, wolfSSL, wolfHSM, port, project) |
| 42 | +WOLFCRYPT_SRC := $(wildcard $(WOLFSSL_DIR)/wolfcrypt/src/*.c) |
| 43 | +SRC_C = $(filter-out %/evp.c %/misc.c,$(WOLFCRYPT_SRC)) |
| 44 | +WOLFSSL_SRC := $(wildcard $(WOLFSSL_DIR)/src/*.c) |
| 45 | +SRC_C += $(filter-out %/bio.c %/conf.c %/pk.c %/ssl_asn1.c %/ssl_bn.c %/ssl_certman.c %/ssl_crypto.c %/ssl_load.c %/ssl_misc.c %/ssl_p7p12.c %/ssl_sess.c %/ssl_sk.c %/x509.c %/x509_str.c,$(WOLFSSL_SRC)) |
| 46 | +SRC_C += $(wildcard $(WOLFHSM_DIR)/src/*.c) |
| 47 | +SRC_C += $(wildcard $(WOLFHSM_PORT_DIR)/*.c) |
| 48 | +SRC_C += $(wildcard $(PROJECT_DIR)/*.c) |
| 49 | + |
| 50 | +# Debug support |
| 51 | +ifeq ($(DEBUG),1) |
| 52 | + CFLAGS += -ggdb -g3 |
| 53 | + LDFLAGS += -ggdb -g3 |
| 54 | + DEF += -DWOLFHSM_CFG_DEBUG |
| 55 | +endif |
| 56 | + |
| 57 | +# Object files |
| 58 | +FILENAMES_C = $(notdir $(SRC_C)) |
| 59 | +OBJS_C = $(addprefix $(BUILD_DIR)/, $(FILENAMES_C:.c=.o)) |
| 60 | +vpath %.c $(dir $(SRC_C)) |
| 61 | + |
| 62 | +# Phony targets |
| 63 | +.PHONY: all download_repos check_repos build_wolfssl build_wolfhsm_server build_app run_hsm_server run_dtls_server run_client clean clean_repos |
| 64 | + |
| 65 | +# Default target |
| 66 | +all: check_repos build_wolfssl build_wolfhsm_server build_app |
| 67 | + @echo "Build complete. See README.md for usage instructions." |
| 68 | + |
| 69 | +# Clone repositories |
| 70 | +download_repos: |
| 71 | + @echo "=== Cloning repositories ===" |
| 72 | + @if [ ! -d "$(WOLFSSL_DIR)" ]; then \ |
| 73 | + git clone --depth 1 https://github.com/wolfssl/wolfssl.git $(WOLFSSL_DIR); \ |
| 74 | + else \ |
| 75 | + echo "wolfssl already exists, skipping clone"; \ |
| 76 | + fi |
| 77 | + @if [ ! -d "$(WOLFHSM_DIR)" ]; then \ |
| 78 | + git clone --depth 1 https://github.com/wolfssl/wolfhsm.git $(WOLFHSM_DIR); \ |
| 79 | + else \ |
| 80 | + echo "wolfhsm already exists, skipping clone"; \ |
| 81 | + fi |
| 82 | + |
| 83 | +# Check that repos exist |
| 84 | +check_repos: |
| 85 | + @if [ ! -d "$(WOLFSSL_DIR)" ] || [ ! -d "$(WOLFHSM_DIR)" ]; then \ |
| 86 | + echo "Error: Repositories not found. Run 'make download_repos' first."; \ |
| 87 | + exit 1; \ |
| 88 | + fi |
| 89 | + |
| 90 | +# Build wolfSSL |
| 91 | +# Note: The DTLS client uses its own user_settings.h to build wolfSSL statically, |
| 92 | +# so this configure is only for the wolfSSL example server/client binaries. |
| 93 | +build_wolfssl: check_repos |
| 94 | + @echo "=== Building wolfSSL ===" |
| 95 | + @if [ ! -f "$(WOLFSSL_DIR)/examples/server/server" ]; then \ |
| 96 | + cd $(WOLFSSL_DIR) && \ |
| 97 | + ./autogen.sh && \ |
| 98 | + ./configure --enable-dtls --enable-dtls13 --enable-ecc && \ |
| 99 | + make -j; \ |
| 100 | + else \ |
| 101 | + echo "wolfSSL already built, skipping"; \ |
| 102 | + fi |
| 103 | + |
| 104 | +# Build wolfHSM POSIX server |
| 105 | +# Note: The wolfHSM server Makefile expects WOLFSSL_DIR relative to its location |
| 106 | +# Server is at ./wolfhsm/examples/posix/wh_posix_server/ |
| 107 | +# wolfssl is at ./wolfssl/ |
| 108 | +# So from server: ../../../../wolfssl |
| 109 | +build_wolfhsm_server: check_repos |
| 110 | + @echo "=== Building wolfHSM server ===" |
| 111 | + @if [ ! -f "$(WOLFHSM_SERVER_DIR)/Build/wh_posix_server.elf" ]; then \ |
| 112 | + $(MAKE) -C $(WOLFHSM_SERVER_DIR) clean || true; \ |
| 113 | + $(MAKE) -C $(WOLFHSM_SERVER_DIR) WOLFSSL_DIR=../../../../wolfssl -j; \ |
| 114 | + else \ |
| 115 | + echo "wolfHSM server already built, skipping"; \ |
| 116 | + fi |
| 117 | + |
| 118 | +# Build DTLS client |
| 119 | +build_app: $(BUILD_DIR)/$(BIN).elf |
| 120 | + @echo "DTLS client built: $(BUILD_DIR)/$(BIN).elf" |
| 121 | + |
| 122 | +$(BUILD_DIR): |
| 123 | + mkdir -p $(BUILD_DIR) |
| 124 | + |
| 125 | +$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR) |
| 126 | + @echo "Compiling: $(notdir $<)" |
| 127 | + $(CC) $(CFLAGS) $(DEF) $(INC) -c -o $@ $< |
| 128 | + |
| 129 | +$(BUILD_DIR)/$(BIN).elf: $(OBJS_C) | $(BUILD_DIR) |
| 130 | + @echo "Linking: $(notdir $@)" |
| 131 | + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) |
| 132 | + |
| 133 | +# Convenience targets for running each component in separate terminals |
| 134 | + |
| 135 | +run_hsm_server: all |
| 136 | + @echo "Starting wolfHSM server..." |
| 137 | + @echo "Press Ctrl+C to stop" |
| 138 | + @echo "" |
| 139 | + $(WOLFHSM_SERVER_DIR)/Build/wh_posix_server.elf --type tcp \ |
| 140 | + --key $(WOLFSSL_DIR)/certs/ecc-client-key.der \ |
| 141 | + --id 1 --client 12 |
| 142 | + |
| 143 | +run_dtls_server: all |
| 144 | + @echo "Starting wolfSSL DTLS server..." |
| 145 | + @echo "Press Ctrl+C to stop" |
| 146 | + @echo "" |
| 147 | + cd $(WOLFSSL_DIR) && ./examples/server/server -u -v d \ |
| 148 | + -c ./certs/server-ecc.pem \ |
| 149 | + -k ./certs/ecc-key.pem \ |
| 150 | + -A ./certs/client-ecc-cert.pem \ |
| 151 | + -p 11111 -i |
| 152 | + |
| 153 | +run_client: all |
| 154 | + $(BUILD_DIR)/$(BIN).elf 127.0.0.1 |
| 155 | + |
| 156 | +# Clean build artifacts |
| 157 | +clean: |
| 158 | + @echo "Cleaning build files" |
| 159 | + rm -rf $(BUILD_DIR) |
| 160 | + @# Clean wolfHSM server build |
| 161 | + @if [ -d "$(WOLFHSM_SERVER_DIR)" ]; then \ |
| 162 | + $(MAKE) -C $(WOLFHSM_SERVER_DIR) clean 2>/dev/null || true; \ |
| 163 | + fi |
| 164 | + @# Clean wolfSSL build |
| 165 | + @if [ -f "$(WOLFSSL_DIR)/Makefile" ]; then \ |
| 166 | + $(MAKE) -C $(WOLFSSL_DIR) clean 2>/dev/null || true; \ |
| 167 | + fi |
| 168 | + |
| 169 | +clean_repos: clean |
| 170 | + @echo "Removing cloned repositories" |
| 171 | + rm -rf $(WOLFSSL_DIR) $(WOLFHSM_DIR) |
0 commit comments