From f067cd88a292c7876de0ae1cfb7f08db522b9336 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 9 Jul 2026 12:34:36 -0700 Subject: [PATCH] types/ci: scope 16-bit word64 to WIDE_BYTE and add portable split-64 Keccak host test --- .github/workflows/ti-c2000-compile.yml | 24 +++++++++++++++++++++++- wolfssl/wolfcrypt/types.h | 19 +++++++++++-------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ti-c2000-compile.yml b/.github/workflows/ti-c2000-compile.yml index 9c01f974dd..d63aac547b 100644 --- a/.github/workflows/ti-c2000-compile.yml +++ b/.github/workflows/ti-c2000-compile.yml @@ -19,7 +19,7 @@ on: - '.github/workflows/ti-c2000-compile.yml' pull_request: types: [opened, synchronize, reopened, ready_for_review] - branches: [ '*' ] + branches: [ '**' ] paths: - 'wolfcrypt/src/**' - 'wolfssl/wolfcrypt/**' @@ -105,3 +105,25 @@ jobs: run: | CGT_ROOT="${{ steps.find-cl.outputs.cgt_root }}" \ IDE/C2000/compile.sh + + # Portable regression guard for the WC_SHA3_SPLIT64 Keccak permutation added + # for CHAR_BIT != 8 targets. It is pure C and runs on any host, so force it + # on a normal x86-64 build and run the crypto KATs (SHA-3/SHAKE plus the + # SHAKE-heavy ML-DSA/ML-KEM) that exercise it. No hardware or TI CGT needed, + # so unlike the compile-only guard above this always runs. + sha3_split64_host: + name: SHA-3 split-64 host test + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.draft == false }} + runs-on: ubuntu-22.04 + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + name: Checkout wolfSSL + + - name: Build + run crypto KATs with WC_SHA3_SPLIT64 forced + run: | + ./autogen.sh + ./configure --enable-dilithium --enable-mlkem --enable-experimental \ + --enable-shake128 --enable-shake256 CPPFLAGS="-DWC_SHA3_SPLIT64" + make + ./wolfcrypt/test/testwolfcrypt diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index 406f17e211..6a6b09ec49 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -443,15 +443,18 @@ typedef const char wcchar[]; #elif defined(WC_16BIT_CPU) /* WC_16BIT_CPU selects 16-bit int (word16=unsigned int, word32=unsigned - * long). It historically also assumes no native 64-bit type, but targets - * like the TI C2000 C28x are 16-bit-int yet have a 64-bit long long, so - * keep WORD64_AVAILABLE when one genuinely exists. Porting note: any other - * 16-bit-int target with a 64-bit long/long long now keeps the 64-bit paths - * (SHA-512, word64 rotates) that were previously force-disabled here. */ + * long). Historically every WC_16BIT_CPU build (except MICROCHIP_PIC24) + * force-disabled WORD64_AVAILABLE. The TI C2000 C28x is 16-bit-int yet has + * a 64-bit long long and needs the 64-bit paths (SHA-512, ML-DSA/ML-KEM), + * so keep WORD64_AVAILABLE for CHAR_BIT != 8 (WOLFSSL_WIDE_BYTE) targets + * that genuinely have a 64-bit type. All other 16-bit-int targets (e.g. + * MSP430) retain the historical behavior, so this is not a silent ABI or + * code-path change for existing non-C28x ports. */ #if !defined(MICROCHIP_PIC24) && \ - !(defined(SIZEOF_LONG) && (SIZEOF_LONG == 8)) && \ - !(defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8)) && \ - !(defined(__SIZEOF_LONG_LONG__) && (__SIZEOF_LONG_LONG__ == 8)) + !(defined(WOLFSSL_WIDE_BYTE) && \ + ((defined(SIZEOF_LONG) && (SIZEOF_LONG == 8)) || \ + (defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8)) || \ + (defined(__SIZEOF_LONG_LONG__) && (__SIZEOF_LONG_LONG__ == 8)))) #undef WORD64_AVAILABLE #endif typedef word16 wolfssl_word;