|
| 1 | +# Inherit our settings for wolfBoot, TARGET, ARCH, etc. |
| 2 | +-include sim.config |
| 3 | + |
| 4 | +# Make sure environment variables do not corrupt the binary output for MacOS users |
| 5 | +LANG= |
| 6 | +LC_COLLATE="C" |
| 7 | +LC_CTYPE="C" |
| 8 | +LC_MESSAGES="C" |
| 9 | +LC_MONETARY="C" |
| 10 | +LC_NUMERIC="C" |
| 11 | +LC_TIME="C" |
| 12 | +LC_ALL= |
| 13 | + |
| 14 | +APPSRC:=./app |
| 15 | +SEVSRC:=./fwserver |
| 16 | +WOLFBOOT_ROOT:=./wolfBoot |
| 17 | +WOLFSSL_ROOT:=./wolfBoot/lib/wolfssl |
| 18 | +WOLFTPM_ROOT:=/usr/local/include/wolftpm/ |
| 19 | +WOLFMQTT_ROOT:=./wolfMQTT |
| 20 | +DEBUG:=0 |
| 21 | + |
| 22 | +include $(WOLFBOOT_ROOT)/tools/config.mk |
| 23 | +export WOLFBOOT_ROOT |
| 24 | + |
| 25 | + |
| 26 | +ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/keygen)","") |
| 27 | + KEYGEN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/keygen |
| 28 | +else |
| 29 | + ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/keygen.exe)","") |
| 30 | + KEYGEN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/keygen.exe |
| 31 | + else |
| 32 | + KEYGEN_TOOL:=python3 $(WOLFBOOT_ROOT)/tools/keytools/keygen.py |
| 33 | + endif |
| 34 | +endif |
| 35 | + |
| 36 | +ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/sign)","") |
| 37 | + SIGN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/sign |
| 38 | +else |
| 39 | + ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/sign.exe)","") |
| 40 | + SIGN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/sign.exe |
| 41 | + else |
| 42 | + SIGN_TOOL:=python3 $(WOLFBOOT_ROOT)/tools/keytools/sign.py |
| 43 | + endif |
| 44 | +endif |
| 45 | + |
| 46 | +# Signing and test variables (used by test-sim-internal-flash-with-update) |
| 47 | +PRIVATE_KEY:=$(WOLFBOOT_ROOT)/wolfboot_signing_private_key.der |
| 48 | +SIGN_ENV=IMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE) \ |
| 49 | + WOLFBOOT_PARTITION_SIZE=$(WOLFBOOT_PARTITION_SIZE) \ |
| 50 | + WOLFBOOT_SECTOR_SIZE=$(WOLFBOOT_SECTOR_SIZE) \ |
| 51 | + NVM_FLASH_WRITEONCE=$(NVM_FLASH_WRITEONCE) \ |
| 52 | + ML_DSA_LEVEL=$(ML_DSA_LEVEL) \ |
| 53 | + IMAGE_SIGNATURE_SIZE=$(IMAGE_SIGNATURE_SIZE) \ |
| 54 | + LMS_LEVELS=$(LMS_LEVELS) \ |
| 55 | + LMS_HEIGHT=$(LMS_HEIGHT) \ |
| 56 | + LMS_WINTERNITZ=$(LMS_WINTERNITZ) \ |
| 57 | + XMSS_PARAMS=$(XMSS_PARAMS) |
| 58 | +SIGN_OPTIONS?=--ecc256 |
| 59 | +TEST_UPDATE_VERSION?=2 |
| 60 | +OTA_UPDATE_VERSION?=10 |
| 61 | +BINASSEMBLE:=$(WOLFBOOT_ROOT)/tools/bin-assemble/bin-assemble |
| 62 | +DELTA_UPDATE_OPTIONS?= |
| 63 | +ifeq ($(NVM_FLASH_WRITEONCE),1) |
| 64 | + INVERSION=| tr "\000" "\377" |
| 65 | +else |
| 66 | + INVERSION= |
| 67 | +endif |
| 68 | + |
| 69 | +CFLAGS:=-Wall -Wstack-usage=1024 -ffreestanding -Wno-unused -DPLATFORM_$(TARGET) \ |
| 70 | + -I$(WOLFBOOT_ROOT)/include -I$(WOLFBOOT_ROOT) -I$(WOLFSSL_ROOT) \ |
| 71 | + -I$(WOLFTPM_ROOT) -I$(APPSRC) -I$(WOLFMQTT_ROOT) -DWOLFBOOT_MEASURED_PCR_A \ |
| 72 | + -DSIM_OTA=1 |
| 73 | +CFLAGS+=-DWOLFBOOT_HASH_SHA256 |
| 74 | + |
| 75 | +# fwserver CFLAGS |
| 76 | +CFLAGS_SEV:=-g -ggdb -Wall -Wstack-usage=1024 -ffreestanding -Wno-unused \ |
| 77 | + -I$(WOLFSSL_ROOT) -I$(SEVSRC) -I$(WOLFMQTT_ROOT) |
| 78 | + |
| 79 | +APP_OBJS:= \ |
| 80 | + $(APPSRC)/app_$(TARGET).o \ |
| 81 | + $(APPSRC)/tpm_handler.o \ |
| 82 | + $(APPSRC)/fwclient.o \ |
| 83 | + $(APPSRC)/mqttexample.o \ |
| 84 | + $(APPSRC)/mqttnet.o \ |
| 85 | + $(WOLFBOOT_ROOT)/hal/$(TARGET).o \ |
| 86 | + $(WOLFBOOT_ROOT)/src/libwolfboot.o |
| 87 | + |
| 88 | +# Add objects for wolfMQTT support |
| 89 | +APP_OBJS+= \ |
| 90 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_client.o \ |
| 91 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_packet.o \ |
| 92 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_socket.o |
| 93 | + |
| 94 | +# Add objects for fwserver |
| 95 | +SEV_OBJS+= \ |
| 96 | + $(SEVSRC)/fwpush.o \ |
| 97 | + $(SEVSRC)/mqttexample.o \ |
| 98 | + $(SEVSRC)/mqttnet.o \ |
| 99 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_client.o \ |
| 100 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_packet.o \ |
| 101 | + $(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_socket.o |
| 102 | + |
| 103 | +# Link libwolfssl (full SSL + wolfCrypt) and macOS frameworks when needed |
| 104 | +WOLFSSL_LDFLAGS := -L$(WOLFSSL_ROOT)/src/.libs -lwolfssl |
| 105 | +ifeq ($(shell uname -s),Darwin) |
| 106 | + WOLFSSL_LDFLAGS += -Wl,-rpath,$(WOLFSSL_ROOT)/src/.libs |
| 107 | + WOLFSSL_LDFLAGS += -framework CoreFoundation -framework Security |
| 108 | +else |
| 109 | + WOLFSSL_LDFLAGS += -lm |
| 110 | +endif |
| 111 | + |
| 112 | +# Link libwolfTPM (full TPM support) and macOS frameworks when needed |
| 113 | +WOLFTPM_LDFLAGS := -L/usr/local/lib -lwolftpm |
| 114 | +ifeq ($(shell uname -s),Darwin) |
| 115 | + WOLFTPM_LDFLAGS += -Wl,-rpath,/usr/local/lib |
| 116 | + WOLFTPM_LDFLAGS += -framework CoreFoundation -framework Security |
| 117 | +else |
| 118 | + WOLFTPM_LDFLAGS += -lm |
| 119 | +endif |
| 120 | + |
| 121 | + |
| 122 | +# Inherit cross-compiler and similar settings from wolfBoot |
| 123 | +include $(WOLFBOOT_ROOT)/arch.mk |
| 124 | +# arch.mk sets OBJCOPY only when USE_GCC=1 (from wolfBoot options.mk); sim-OTA does not include it |
| 125 | +OBJCOPY ?= objcopy |
| 126 | + |
| 127 | +ifeq ($(DEBUG),0) |
| 128 | + CFLAGS+=-Os -DNDEBUG -flto |
| 129 | +else |
| 130 | + CFLAGS+=-g -ggdb3 |
| 131 | +endif |
| 132 | + |
| 133 | +vpath %.c $(dir $(WOLFSSL_ROOT)/src) |
| 134 | +vpath %.c $(dir $(WOLFSSL_ROOT)/wolfcrypt/src) |
| 135 | +vpath %.c $(dir $(WOLFBOOT_ROOT))/lib/wolfTPM/wolftpm |
| 136 | + |
| 137 | +LDFLAGS:=$(CFLAGS) |
| 138 | +LDFLAGS_SEV:=$(CFLAGS_SEV) |
| 139 | + |
| 140 | +all: $(WOLFBOOT_ROOT)/wolfboot.elf app/image.elf fwserver/fwserver |
| 141 | + |
| 142 | +$(WOLFBOOT_ROOT)/wolfboot.elf: wolfboot_target |
| 143 | + cd $(WOLFBOOT_ROOT) && $(MAKE) WOLFBOOT_ROOT=$$(pwd) wolfboot.elf |
| 144 | + |
| 145 | +app/image.bin: wolfboot_target app/image.elf |
| 146 | + $(OBJCOPY) -O binary app/image.elf $@ |
| 147 | + $(SIZE) app/image.elf |
| 148 | + |
| 149 | +app/image.elf: wolfboot_target $(APP_OBJS) |
| 150 | + @echo "\t[LD] $@" |
| 151 | + $(Q)$(LD) $(LDFLAGS) $(APP_OBJS) $(WOLFSSL_LDFLAGS) $(WOLFTPM_LDFLAGS) -o $@ |
| 152 | + @echo |
| 153 | + |
| 154 | +fwserver/fwserver: wolfboot_target $(SEV_OBJS) |
| 155 | + @echo "\t[LD] $@" |
| 156 | + $(Q)$(LD) $(LDFLAGS_SEV) $(SEV_OBJS) $(WOLFSSL_LDFLAGS) -o $@ |
| 157 | + @echo |
| 158 | + |
| 159 | +wolfboot_target: FORCE |
| 160 | + cp -f sim.config $(WOLFBOOT_ROOT)/.config |
| 161 | + cp ./hal-sim/sim.c $(WOLFBOOT_ROOT)/hal/sim.c |
| 162 | + cp ./hal-sim/user_settings.h $(WOLFBOOT_ROOT)/include/user_settings.h |
| 163 | + make -C $(WOLFBOOT_ROOT) include/target.h |
| 164 | + |
| 165 | +wolfboot.bin: wolfBoot/wolfboot.elf |
| 166 | + @echo "\t[BIN] $@" |
| 167 | + $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) -O binary $^ $@ |
| 168 | + @echo |
| 169 | + |
| 170 | +%.o:%.c |
| 171 | + @echo "\t[CC-$(ARCH)] $@" |
| 172 | + $(Q)$(CC) $(CFLAGS) -c -o $@ $^ |
| 173 | + |
| 174 | +%.o:%.S |
| 175 | + @echo "\t[AS-$(ARCH)] $@" |
| 176 | + $(Q)$(CC) $(CFLAGS) -c -o $@ $^ |
| 177 | + |
| 178 | +test-sim-internal-flash-with-update: wolfboot.bin app/image.elf FORCE |
| 179 | + $(Q)cp app/image.elf app/image.bak.elf |
| 180 | + $(Q)dd if=/dev/urandom bs=1k count=16 >> app/image.elf |
| 181 | + # Create version 1 of the application (base image) |
| 182 | + $(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) app/image.elf $(PRIVATE_KEY) 1 |
| 183 | + $(Q)cp app/image.bak.elf app/image.elf |
| 184 | + $(Q)dd if=/dev/urandom bs=1k count=16 >> app/image.elf |
| 185 | + $(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) app/image.elf $(PRIVATE_KEY) $(TEST_UPDATE_VERSION) |
| 186 | + $(Q)dd if=/dev/zero bs=$$(($(WOLFBOOT_SECTOR_SIZE))) count=1 2>/dev/null $(INVERSION) > erased_sec.dd |
| 187 | + # Sign the update image (version 2 by default) |
| 188 | + # This command handles both standard and delta update modes based on DELTA_UPDATE_OPTIONS |
| 189 | + # empty DELTA_UPDATE_OPTIONS (Without --delta): Produces image_v2_signed.bin |
| 190 | + # DELTA_UPDATE_OPTIONS="--delta app/image_v1_signed.bin": Produces image_v2_signed_diff.bin |
| 191 | + $(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) $(DELTA_UPDATE_OPTIONS) \ |
| 192 | + app/image.elf $(PRIVATE_KEY) $(TEST_UPDATE_VERSION) |
| 193 | + # Sign the update image for OTA example |
| 194 | + $(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) $(DELTA_UPDATE_OPTIONS) \ |
| 195 | + app/image.elf $(PRIVATE_KEY) $(OTA_UPDATE_VERSION) |
| 196 | + $(Q)$(BINASSEMBLE) internal_flash.dd \ |
| 197 | + 0 wolfboot.bin \ |
| 198 | + $$(($(WOLFBOOT_PARTITION_BOOT_ADDRESS) - $(ARCH_FLASH_OFFSET))) app/image_v1_signed.bin \ |
| 199 | + $$(($(WOLFBOOT_PARTITION_UPDATE_ADDRESS)-$(ARCH_FLASH_OFFSET))) app/image_v$(TEST_UPDATE_VERSION)_signed.bin \ |
| 200 | + $$(($(WOLFBOOT_PARTITION_SWAP_ADDRESS)-$(ARCH_FLASH_OFFSET))) erased_sec.dd |
| 201 | + |
| 202 | +clean: |
| 203 | + make -C $(WOLFBOOT_ROOT) clean |
| 204 | + @rm -f *.bin *.elf $(OBJS) wolfboot.map *.bin *.hex src/*.o tags *.map |
| 205 | + @rm -f app/*.elf app/*.bin app/image.map app/*.o fwserver/*.o fwserver/fwserver |
| 206 | + |
| 207 | +FORCE: |
| 208 | + |
| 209 | +.PHONY: FORCE clean all |
0 commit comments