From 1e892cee217f68f146fa45b407501369f2c63396 Mon Sep 17 00:00:00 2001 From: jordan Date: Sun, 9 Aug 2026 22:25:21 -0500 Subject: [PATCH 1/5] bsdkm: wolfkmod_fpu_kern_enter and leave macro wrap. --- bsdkm/x86_vecreg.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bsdkm/x86_vecreg.c b/bsdkm/x86_vecreg.c index b789619c61a..ea14eb7c131 100644 --- a/bsdkm/x86_vecreg.c +++ b/bsdkm/x86_vecreg.c @@ -129,11 +129,13 @@ void wolfkmod_vecreg_exit(void) fpu_kern_leave(curthread, NULL); \ } while (0) #else - #define wolfkmod_fpu_kern_enter() \ - fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX); + #define wolfkmod_fpu_kern_enter() do { \ + fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX); \ + } while (0) - #define wolfkmod_fpu_kern_leave() \ - fpu_kern_leave(curthread, NULL); + #define wolfkmod_fpu_kern_leave() do { \ + fpu_kern_leave(curthread, NULL); \ + } while (0) #endif /* WOLFSSL_BSDKM_FPU_DEBUG */ int wolfkmod_vecreg_save(int flags_unused) From ca292d8ac6f35fab6bc558c0c2d14aa8d2b9615e Mon Sep 17 00:00:00 2001 From: jordan Date: Sun, 9 Aug 2026 22:36:42 -0500 Subject: [PATCH 2/5] bsdkm driver: add missing CipherLifecycleInit call. --- bsdkm/wolfkmod.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/bsdkm/wolfkmod.c b/bsdkm/wolfkmod.c index d7a55b1462b..faa570e87b2 100644 --- a/bsdkm/wolfkmod.c +++ b/bsdkm/wolfkmod.c @@ -763,6 +763,19 @@ static int wolfkdriv_cbc_work(device_t dev, wolfkdriv_session_t * session, is_encrypt = 0; memcpy(&aes, &session->aes_ctx.aes_decrypt, sizeof(aes)); } +#if defined(WOLFSSL_AESGCM_STREAM) && defined(WOLFSSL_SMALL_STACK) && \ + !defined(WOLFSSL_AESNI) + aes.streamData = NULL; +#endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + error = wc_debug_CipherLifecycleInit(&aes.CipherLifecycleTag, NULL); + if (error) { + error = EINVAL; + goto cbc_work_out; + } + } +#endif /* must be multiple of block size */ if (data_len % WC_AES_BLOCK_SIZE) { @@ -911,6 +924,15 @@ static int wolfkdriv_gcm_work(device_t dev, wolfkdriv_session_t * session, !defined(WOLFSSL_AESNI) aes.streamData = NULL; #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + error = wc_debug_CipherLifecycleInit(&aes.CipherLifecycleTag, NULL); + if (error) { + error = EINVAL; + goto gcm_work_out; + } + } +#endif data_len = crp->crp_payload_length; if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op)) { From 41c19f6aa0284bd5afa8c1d2be747e067f538165 Mon Sep 17 00:00:00 2001 From: jordan Date: Sun, 9 Aug 2026 22:53:40 -0500 Subject: [PATCH 3/5] bsdkm driver: wolfkdriv_aes_ctx_clear cleanup. --- bsdkm/wolfkmod.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/bsdkm/wolfkmod.c b/bsdkm/wolfkmod.c index faa570e87b2..32df739eb46 100644 --- a/bsdkm/wolfkmod.c +++ b/bsdkm/wolfkmod.c @@ -383,16 +383,19 @@ static void km_AesFree(Aes * aes) { #endif } -static void wolfkdriv_aes_ctx_clear(km_aes_ctx * ctx) +/* clean up allocated km_aes_ctx struct. + * - cbc allocates both encrypt and decrypt, and frees both. + * - gcm uses only aes_encrypt. + * */ +static void wolfkdriv_aes_ctx_clear(km_aes_ctx * ctx, int free_decrypt) { if (ctx != NULL) { km_AesFree(&ctx->aes_encrypt); - km_AesFree(&ctx->aes_decrypt); - } - #ifdef WOLFKM_DEBUG_AES - printf("info: exiting km_AesExitCommon\n"); - #endif /* WOLFKM_DEBUG_AES */ + if (free_decrypt) { + km_AesFree(&ctx->aes_decrypt); + } + } } static void wolfkdriv_identify(driver_t * driver, device_t parent) @@ -671,7 +674,16 @@ static int wolfkdriv_newsession_aes(device_t dev, newsession_cipher_out: if (error != 0) { - wolfkdriv_aes_ctx_clear(&session->aes_ctx); + switch (csp->csp_cipher_alg) { + case CRYPTO_AES_NIST_GCM_16: + wolfkdriv_aes_ctx_clear(&session->aes_ctx, 0); + break; + case CRYPTO_AES_CBC: + wolfkdriv_aes_ctx_clear(&session->aes_ctx, 1); + default: + break; + } + return (EINVAL); } @@ -713,13 +725,27 @@ static void wolfkdriv_freesession(device_t dev, crypto_session_t cses) { wolfkdriv_session_t * session = NULL; + const struct crypto_session_params * csp = NULL; (void)dev; /* get the wolfkdriv_session_t context */ session = crypto_get_driver_session(cses); + csp = crypto_get_params(cses); /* clean it up */ - wolfkdriv_aes_ctx_clear(&session->aes_ctx); + switch (csp->csp_mode) { + case CSP_MODE_CIPHER: + wolfkdriv_aes_ctx_clear(&session->aes_ctx, 1); + break; + case CSP_MODE_DIGEST: + case CSP_MODE_ETA: + break; + case CSP_MODE_AEAD: + wolfkdriv_aes_ctx_clear(&session->aes_ctx, 0); + break; + default: + __assert_unreachable(); + } #if defined(WOLFSSL_BSDKM_VERBOSE_DEBUG) device_printf(dev, "info: exiting freesession\n"); From ecb213687c45334dc999e2173281efeb6519ce96 Mon Sep 17 00:00:00 2001 From: jordan Date: Mon, 10 Aug 2026 10:15:52 -0500 Subject: [PATCH 4/5] bsdkm: XATOI macro cleanup. --- bsdkm/bsdkm_wc_port.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bsdkm/bsdkm_wc_port.h b/bsdkm/bsdkm_wc_port.h index 99c7d011d52..f98d691c045 100644 --- a/bsdkm/bsdkm_wc_port.h +++ b/bsdkm/bsdkm_wc_port.h @@ -63,10 +63,11 @@ static inline time_t wolfkmod_time(time_t * tloc) { /* str and char utility functions */ #define XATOI(s) ({ \ - char * endptr = NULL; \ - long _xatoi_ret = strtol(s, &endptr, 10); \ - if ((s) == endptr || *endptr != '\0') { \ - _xatoi_ret = 0; \ + const char * _str = (s); \ + char * _endptr = NULL; \ + long _xatoi_ret = strtol(_str, &_endptr, 10); \ + if ((_str) == _endptr || *_endptr != '\0') { \ + _xatoi_ret = 0; \ } \ (int)_xatoi_ret; \ }) From 55e14559bb36af8a65a892125a6f19baa94afff4 Mon Sep 17 00:00:00 2001 From: jordan Date: Mon, 10 Aug 2026 12:09:31 -0500 Subject: [PATCH 5/5] bsdkm: no M_WAITOK with crypto driver. --- bsdkm/bsdkm_wc_port.h | 64 ++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/bsdkm/bsdkm_wc_port.h b/bsdkm/bsdkm_wc_port.h index f98d691c045..ee67d4d4a0b 100644 --- a/bsdkm/bsdkm_wc_port.h +++ b/bsdkm/bsdkm_wc_port.h @@ -80,27 +80,53 @@ static inline time_t wolfkmod_time(time_t * tloc) { extern struct malloc_type M_WOLFSSL[1]; #if defined(WOLFSSL_BSDKM_MEMORY_DEBUG) - #define XMALLOC(s, h, t) ({ \ - (void)(h); (void)(t); \ - size_t _sz = (size_t)(s); \ - int _wait_flag = curthread->td_critnest == 0 ? M_WAITOK : M_NOWAIT; \ - void * _ptr = malloc(_sz, M_WOLFSSL, _wait_flag | M_ZERO); \ - printf("info: malloc: %p, M_WOLFSSL, %zu\n", _ptr, _sz); \ - (void *)_ptr; \ - }) - - #define XFREE(p, h, t) ({ \ - void* _xp; (void)(h); (void)(t); _xp = (p); \ - printf("info: free: %p, M_WOLFSSL\n", _xp); \ - if(_xp) free(_xp, M_WOLFSSL); \ + #if defined(BSDKM_CRYPTO_REGISTER) + /* cryptodev work functions must not sleep.see man CRYPTO_DRIVER(9) */ + #define XMALLOC(s, h, t) ({ \ + (void)(h); (void)(t); \ + size_t _sz; void * _ptr; \ + _sz = (size_t)(s); \ + _ptr = malloc(_sz, M_WOLFSSL, M_NOWAIT | M_ZERO); \ + printf("info: malloc: %p, M_WOLFSSL, %zu, 0x%02x\n", _ptr, _sz, \ + M_NOWAIT | M_ZERO); \ + (void *)_ptr; \ + }) + #else + #define XMALLOC(s, h, t) ({ \ + (void)(h); (void)(t); \ + size_t _sz; int _wait_flag; void * _ptr; \ + _sz = (size_t)(s); \ + _wait_flag = curthread->td_critnest == 0 ? M_WAITOK : M_NOWAIT; \ + _ptr = malloc(_sz, M_WOLFSSL, _wait_flag | M_ZERO); \ + printf("info: malloc: %p, M_WOLFSSL, %zu, 0x%02x\n", _ptr, _sz, \ + _wait_flag); \ + (void *)_ptr; \ + }) + #endif /* BSDKM_CRYPTO_REGISTER */ + + #define XFREE(p, h, t) ({ \ + void* _xp; (void)(h); (void)(t); _xp = (p); \ + printf("info: free: %p, M_WOLFSSL\n", _xp); \ + if(_xp) free(_xp, M_WOLFSSL); \ }) #else - #define XMALLOC(s, h, t) ({ \ - (void)(h); (void)(t); \ - int _wait_flag = curthread->td_critnest == 0 ? M_WAITOK : M_NOWAIT; \ - void * _ptr = malloc((s), M_WOLFSSL, _wait_flag | M_ZERO); \ - (void *)_ptr; \ - }) + #if defined(BSDKM_CRYPTO_REGISTER) + /* cryptodev work functions must not sleep.see man CRYPTO_DRIVER(9) */ + #define XMALLOC(s, h, t) ({ \ + (void)(h); (void)(t); \ + void * _ptr; \ + _ptr = malloc((s), M_WOLFSSL, M_NOWAIT | M_ZERO); \ + (void *)_ptr; \ + }) + #else + #define XMALLOC(s, h, t) ({ \ + (void)(h); (void)(t); \ + int _wait_flag; void * _ptr; \ + _wait_flag = curthread->td_critnest == 0 ? M_WAITOK : M_NOWAIT; \ + _ptr = malloc((s), M_WOLFSSL, _wait_flag | M_ZERO); \ + (void *)_ptr; \ + }) + #endif /* BSDKM_CRYPTO_REGISTER */ #define XFREE(p, h, t) ({ \ void* _xp; (void)(h); (void)(t); _xp = (p); \