Skip to content

Commit 7f4eea5

Browse files
committed
Add support for crypto backend selection
Fixes: #295 Signed-off-by: Siddharth Chandrasekaran <sidcha.dev@gmail.com>
1 parent f0990cd commit 7f4eea5

5 files changed

Lines changed: 82 additions & 12 deletions

File tree

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ option(OPT_OSDP_STATIC "Build without dynamic memory allocation" OFF)
3737
option(OPT_OSDP_LIB_ONLY "Only build the library" OFF)
3838
option(OPT_BUILD_BARE_METAL "Build library for bare metal targets" OFF)
3939
option(OPT_USE_32BIT_TICK_T "Use uint32_t tick_t on bare-metal targets" OFF)
40+
set(OPT_OSDP_CRYPTO_BACKEND "auto" CACHE STRING
41+
"Crypto backend selection: auto, openssl, mbedtls, or tinyaes")
42+
set_property(CACHE OPT_OSDP_CRYPTO_BACKEND PROPERTY STRINGS
43+
auto openssl mbedtls tinyaes)
4044

4145
## Includes
4246
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

configure.sh

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ usage() {
1919
--skip-mark Don't send the leading mark byte (0xFF)
2020
--zero-copy Enable zero-copy RX buffers (requires recv_pkt/release_pkt)
2121
--log-minimal Minimize logger RAM/stack usage
22-
--crypto LIB Use methods from LIB (openssl/mbedtls/*tinyaes)
22+
--crypto LIB Crypto backend: auto|openssl|mbedtls|tinyaes (default: auto)
2323
--crypto-include-dir DIR Include directory for crypto LIB if not in system path
2424
--crypto-ld-flags Args to pass to linker for the crypto LIB
2525
--no-colours Don't colourize log ouputs
@@ -149,15 +149,43 @@ if [[ -d .git ]]; then
149149
GIT_DIFF=$(git diff --quiet --exit-code || echo +)
150150
fi
151151

152-
if [[ "${CRYPTO}" == "openssl" ]]; then
152+
## Crypto backend selection: auto probes openssl → mbedtls → tinyaes by
153+
## looking for the backend's public header through the compiler's default
154+
## include path. Explicit names skip the probe and are used as-is.
155+
probe_header() {
156+
echo "#include <$1>" | ${CC} -xc -E - > /dev/null 2>&1
157+
}
158+
159+
CRYPTO=${CRYPTO:-auto}
160+
if [[ "${CRYPTO}" == "auto" ]]; then
161+
if probe_header openssl/evp.h; then
162+
CRYPTO=openssl
163+
elif probe_header mbedtls/aes.h; then
164+
CRYPTO=mbedtls
165+
else
166+
CRYPTO=tinyaes
167+
fi
168+
fi
169+
170+
case "${CRYPTO}" in
171+
openssl)
172+
echo "Crypto backend: OpenSSL"
153173
LIBOSDP_SOURCES+=" src/crypto/openssl.c"
154-
elif [[ "${CRYPTO}" == "mbedtls" ]]; then
174+
;;
175+
mbedtls)
176+
echo "Crypto backend: MbedTLS"
155177
LIBOSDP_SOURCES+=" src/crypto/mbedtls.c"
156178
LDFLAGS+=" -lmbedcrypto -lmbedtls"
157-
else
158-
echo "Using in-tree AES methods. Consider using openssl/mbedtls (see --crypto)"
179+
;;
180+
tinyaes)
181+
echo "Crypto backend: TinyAES (bundled)"
159182
LIBOSDP_SOURCES+=" src/crypto/tinyaes_src.c src/crypto/tinyaes.c"
160-
fi
183+
;;
184+
*)
185+
echo "--crypto must be one of: auto, openssl, mbedtls, tinyaes (got '${CRYPTO}')"
186+
exit 1
187+
;;
188+
esac
161189

162190
if [[ ! -z "${CRYPTO_INCLUDE_DIR}" ]]; then
163191
CCFLAGS+=" -I${CRYPTO_INCLUDE_DIR}"

src/CMakeLists.txt

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,35 @@ if (OPT_OSDP_STATIC)
3636
list(APPEND LIB_OSDP_DEFINITIONS "-DOPT_OSDP_STATIC=1")
3737
endif()
3838

39-
# optionally, find and use OpenSSL or MbedTLS
40-
find_package(OpenSSL)
39+
# Crypto backend selection driven by OPT_OSDP_CRYPTO_BACKEND:
40+
# auto - probe openssl, then mbedtls, else fall back to bundled tinyaes
41+
# openssl - require OpenSSL (hard-fail if missing)
42+
# mbedtls - require MbedTLS (hard-fail if missing)
43+
# tinyaes - force bundled implementation; skip find_package entirely
44+
set(OpenSSL_FOUND FALSE)
45+
set(MbedTLS_FOUND FALSE)
46+
47+
if (OPT_OSDP_CRYPTO_BACKEND STREQUAL "auto")
48+
find_package(OpenSSL)
49+
if (NOT OpenSSL_FOUND)
50+
find_package(MbedTLS)
51+
endif()
52+
elseif (OPT_OSDP_CRYPTO_BACKEND STREQUAL "openssl")
53+
find_package(OpenSSL REQUIRED)
54+
elseif (OPT_OSDP_CRYPTO_BACKEND STREQUAL "mbedtls")
55+
find_package(MbedTLS REQUIRED)
56+
elseif (NOT OPT_OSDP_CRYPTO_BACKEND STREQUAL "tinyaes")
57+
message(FATAL_ERROR
58+
"OPT_OSDP_CRYPTO_BACKEND must be one of: auto, openssl, mbedtls, tinyaes "
59+
"(got '${OPT_OSDP_CRYPTO_BACKEND}')")
60+
endif()
4161

42-
if (NOT OpenSSL_FOUND)
43-
find_package(MbedTLS)
62+
if (OpenSSL_FOUND)
63+
message(STATUS "libosdp crypto backend: OpenSSL")
64+
elseif (MbedTLS_FOUND)
65+
message(STATUS "libosdp crypto backend: MbedTLS")
4466
else()
45-
set(MbedTLS_FOUND FALSE)
67+
message(STATUS "libosdp crypto backend: TinyAES (bundled)")
4668
endif()
4769

4870
# Generate osdp_config.h in build dir.

zephyr/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,22 @@ if (CONFIG_LIBOSDP)
112112
)
113113
endif()
114114

115-
# Crypto backend
115+
# Crypto backend (driven by the LIBOSDP_CRYPTO_BACKEND Kconfig choice)
116116
if (CONFIG_LIBOSDP_CRYPTO_MBEDTLS)
117+
message(STATUS "libosdp crypto backend: MbedTLS")
117118
zephyr_library_compile_definitions(OPT_OSDP_USE_MBEDTLS)
118119
zephyr_library_sources(${OSDP_ROOT}/src/crypto/mbedtls.c)
119120
target_include_directories(modules_osdp PRIVATE ${ZEPHYR_MBEDTLS_MODULE_DIR}/include)
120121
zephyr_link_libraries(mbedTLS)
121122
elseif(CONFIG_LIBOSDP_CRYPTO_TINYAES)
123+
message(STATUS "libosdp crypto backend: TinyAES (bundled)")
122124
zephyr_library_sources(
123125
${OSDP_ROOT}/src/crypto/tinyaes.c
124126
${OSDP_ROOT}/src/crypto/tinyaes_src.c
125127
)
128+
else()
129+
message(FATAL_ERROR
130+
"No LibOSDP crypto backend selected. "
131+
"Enable CONFIG_LIBOSDP_CRYPTO_MBEDTLS or CONFIG_LIBOSDP_CRYPTO_TINYAES.")
126132
endif()
127133
endif()

zephyr/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,26 @@ if LIBOSDP
1313
choice LIBOSDP_CRYPTO_BACKEND
1414
prompt "LibOSDP crypto backend"
1515
default LIBOSDP_CRYPTO_MBEDTLS
16+
help
17+
Select which AES implementation LibOSDP uses for secure
18+
channel crypto. Pick MbedTLS if the application already
19+
pulls it in; TinyAES otherwise for smallest footprint.
1620

1721
config LIBOSDP_CRYPTO_MBEDTLS
1822
bool "MbedTLS"
1923
select CRYPTO_MBEDTLS_SHIM
2024
select MBEDTLS
2125
select MBEDTLS_CIPHER_AES_ENABLED
2226
select MBEDTLS_CIPHER_CCM_ENABLED
27+
help
28+
Use Zephyr's MbedTLS module for AES. Shares code with
29+
the rest of the system if MbedTLS is already linked.
2330

2431
config LIBOSDP_CRYPTO_TINYAES
2532
bool "TinyAES (in-tree)"
33+
help
34+
Use the bundled TinyAES implementation. No external
35+
crypto dependency; smallest code size.
2636

2737
endchoice
2838

0 commit comments

Comments
 (0)