mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-07-09 21:50:51 +02:00
AES-GCM-SIV: Add implementation in C and assembly
Added assembly for Intel x64, ARM64, ARM32, Thumb2.
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
name: AES-GCM-SIV (RFC 8452) tests
|
||||
|
||||
# START OF COMMON SECTION
|
||||
on:
|
||||
push:
|
||||
branches: [ 'release/**' ]
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches: [ '*' ]
|
||||
# Weekday-morning cron (10:00 UTC) seeds the master-scoped ccache that PR runs
|
||||
# restore (cross job only); re-runs --build-only on the default branch.
|
||||
schedule:
|
||||
- cron: '40 10 * * 1-5'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
# END OF COMMON SECTION
|
||||
|
||||
jobs:
|
||||
# Native x86_64 'make check'. These are --enable-cryptonly (WOLFCRYPT_ONLY)
|
||||
# builds, so check runs testwolfcrypt - which includes aesgcm_siv_test (the
|
||||
# RFC 8452 KATs) - but not the TLS-only tests/unit.test (the tests/api group,
|
||||
# test_wc_AesGcmSivEncryptDecrypt, needs a non-cryptonly build). One runner
|
||||
# per config:
|
||||
# - siv-c-only : no asm, software word64-table POLYVAL + C CTR.
|
||||
# - siv-word32 : GCM_WORD32 forces the word32-table software POLYVAL multiply.
|
||||
# - siv-small : GCM_SMALL forces the table-free software POLYVAL multiply.
|
||||
# - siv-intelasm : PCLMUL/AVX/VAES/AVX512 POLYVAL + pipelined CTR, whichever
|
||||
# the runner CPU selects at runtime.
|
||||
# - siv-all : SIV alongside --enable-all to catch integration regressions.
|
||||
# - siv-smallstack : SIV's key schedules / derived keys live on the stack.
|
||||
make_check:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- '--enable-cryptonly --enable-aesgcm-siv'
|
||||
- '--enable-cryptonly --enable-aesgcm-siv CPPFLAGS=-DGCM_WORD32'
|
||||
- '--enable-cryptonly --enable-aesgcm-siv CPPFLAGS=-DGCM_SMALL'
|
||||
- '--enable-cryptonly --enable-intelasm --enable-sp-asm --enable-aesgcm-siv'
|
||||
- '--enable-cryptonly --enable-all-crypto --enable-intelasm --enable-sp-asm --enable-aesgcm-siv'
|
||||
- '--enable-cryptonly --enable-aesgcm-siv --enable-smallstack'
|
||||
name: make check (${{ matrix.config }})
|
||||
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 12
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
name: Checkout wolfSSL
|
||||
|
||||
- name: Build and test AES-GCM-SIV
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure ${{ matrix.config }}
|
||||
make -j 4
|
||||
make check
|
||||
|
||||
- name: Print errors
|
||||
if: ${{ failure() }}
|
||||
run: |
|
||||
for file in scripts/*.log test-suite.log
|
||||
do
|
||||
if [ -f "$file" ]; then
|
||||
echo "${file}:"
|
||||
cat "$file"
|
||||
echo "========================================================================"
|
||||
fi
|
||||
done
|
||||
|
||||
# Cross-compiled AES-GCM-SIV asm paths, built out-of-tree in parallel and run
|
||||
# under qemu-user (binfmt). Covers:
|
||||
# - arm64-pmull : AArch64 PMULL POLYVAL (gcm_siv_arm64_crypto).
|
||||
# - arm64-no-hw-crypto : AArch64 NEON 8-bit-pmul + table POLYVAL
|
||||
# (gcm_siv_arm64_neon / _base) via WOLFSSL_ARMASM_NO_HW_CRYPTO.
|
||||
# - armhf-crypto : ARMv8-A 32-bit vmull.p64 POLYVAL (gcm_siv_arm32_crypto);
|
||||
# QEMU_CPU=max enables the crypto extensions.
|
||||
# - armhf-base : AArch32 software-table POLYVAL/CTR (gcm_siv_arm32_base)
|
||||
# via NO_HW_CRYPTO, run under the default (non-crypto) CPU.
|
||||
# Known gaps (a defect here would not be caught): the AArch64 base variant
|
||||
# (AES_GCMSIV_polyval_base) is compiled in every aarch64 armasm build but only
|
||||
# selected at runtime with NEON+HW-crypto both disabled, a config unsupported
|
||||
# upstream on aarch64 (no base SHA/ChaCha armasm); and Thumb-2 (gcm_siv_thumb2,
|
||||
# armv7-m) which qemu-user cannot run. Both are noted for release notes.
|
||||
cross_check:
|
||||
name: Cross-arch test
|
||||
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
name: Checkout wolfSSL
|
||||
|
||||
- name: Install dependencies
|
||||
uses: ./.github/actions/install-apt-deps
|
||||
with:
|
||||
packages: autoconf automake libtool build-essential crossbuild-essential-arm64 crossbuild-essential-armhf qemu-user
|
||||
ghcr-debs-tag: ubuntu-22.04-minimal
|
||||
|
||||
- name: Set up ccache
|
||||
uses: ./.github/actions/ccache-setup
|
||||
with:
|
||||
workflow-id: aesgcm-siv
|
||||
read-only: ${{ github.event_name == 'pull_request' }}
|
||||
max-size: 300M
|
||||
|
||||
- name: Build all configs (parallel, out-of-tree)
|
||||
run: |
|
||||
cat > "$RUNNER_TEMP/aesgcm-siv-configs.json" <<'EOF'
|
||||
[
|
||||
{"name": "arm64-pmull", "minutes": 6,
|
||||
"cc": "ccache aarch64-linux-gnu-gcc",
|
||||
"configure": ["--host=aarch64-linux-gnu", "--enable-cryptonly",
|
||||
"--enable-all-crypto", "--disable-examples", "--enable-armasm",
|
||||
"--enable-aesgcm-siv", "CFLAGS=-O2"],
|
||||
"check": false,
|
||||
"run": [["env", "QEMU_LD_PREFIX=/usr/aarch64-linux-gnu", "QEMU_CPU=max",
|
||||
"./wolfcrypt/test/testwolfcrypt"]]},
|
||||
{"name": "arm64-no-hw-crypto", "minutes": 6,
|
||||
"cc": "ccache aarch64-linux-gnu-gcc",
|
||||
"configure": ["--host=aarch64-linux-gnu", "--enable-cryptonly",
|
||||
"--enable-all-crypto", "--disable-examples", "--enable-armasm",
|
||||
"--enable-aesgcm-siv", "CPPFLAGS=-DWOLFSSL_ARMASM_NO_HW_CRYPTO",
|
||||
"CFLAGS=-O2"],
|
||||
"check": false,
|
||||
"run": [["env", "QEMU_LD_PREFIX=/usr/aarch64-linux-gnu", "QEMU_CPU=max",
|
||||
"./wolfcrypt/test/testwolfcrypt"]]},
|
||||
{"name": "armhf-crypto", "minutes": 6,
|
||||
"cc": "ccache arm-linux-gnueabihf-gcc",
|
||||
"comment": "--disable-aesgcm-stream: WOLFSSL_AESGCM_STREAM's software GHASH only defines its macros for __aarch64__ armasm, not 32-bit __arm__ armasm, so all-crypto + armasm otherwise fails to build aes.c (pre-existing, unrelated to SIV).",
|
||||
"configure": ["--host=arm-linux-gnueabihf", "--enable-cryptonly",
|
||||
"--enable-all-crypto", "--disable-examples", "--enable-armasm",
|
||||
"--enable-aesgcm-siv", "--disable-aesgcm-stream", "CFLAGS=-O2"],
|
||||
"check": false,
|
||||
"run": [["env", "QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf", "QEMU_CPU=max",
|
||||
"./wolfcrypt/test/testwolfcrypt"]]},
|
||||
{"name": "armhf-base", "minutes": 6,
|
||||
"cc": "ccache arm-linux-gnueabihf-gcc",
|
||||
"comment": "WOLFSSL_ARMASM_NO_HW_CRYPTO selects the AArch32 software-table POLYVAL/CTR (AES_GCMSIV_polyval_base/ctr_base). Run under the DEFAULT qemu CPU (no QEMU_CPU=max) so the crypto path is not taken - this is the only job exercising the base variant at runtime.",
|
||||
"configure": ["--host=arm-linux-gnueabihf", "--enable-cryptonly",
|
||||
"--enable-all-crypto", "--disable-examples", "--enable-armasm",
|
||||
"--enable-aesgcm-siv", "--disable-aesgcm-stream",
|
||||
"CPPFLAGS=-DWOLFSSL_ARMASM_NO_HW_CRYPTO", "CFLAGS=-O2"],
|
||||
"check": false,
|
||||
"run": [["env", "QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf",
|
||||
"./wolfcrypt/test/testwolfcrypt"]]}
|
||||
]
|
||||
EOF
|
||||
.github/scripts/parallel-make-check.py \
|
||||
${{ github.event_name == 'schedule' && '--build-only' || '' }} \
|
||||
"$RUNNER_TEMP/aesgcm-siv-configs.json"
|
||||
|
||||
- name: ccache stats
|
||||
if: always()
|
||||
run: ccache -s || true
|
||||
|
||||
- name: Upload logs on failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
retention-days: 7
|
||||
name: aesgcm-siv-cross-logs
|
||||
path: |
|
||||
build-*/make-check.log
|
||||
build-*/test-suite.log
|
||||
build-*/config.log
|
||||
if-no-files-found: ignore
|
||||
|
||||
# Windows MSVC/MASM: build wolfssl64.sln (AES-NI on by default => the MASM
|
||||
# aes_gcm_asm.asm POLYVAL/CTR is assembled with ml64) with WOLFSSL_AESGCM_SIV
|
||||
# enabled, and run testsuite.exe - which calls wolfcrypt_test() -> the RFC 8452
|
||||
# KATs incl. the 128-byte multi-block vector. This is the ONLY job that
|
||||
# exercises the Windows MASM SIV path; its absence let a High-severity
|
||||
# AES_GCMSIV_ctr register-clobber (wrong ciphertext + a 16-byte wild write)
|
||||
# ship undetected. x64 only: the AES-NI .asm is x86_64.
|
||||
windows_masm:
|
||||
name: Windows MASM AES-GCM-SIV (x64)
|
||||
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
|
||||
runs-on: windows-latest
|
||||
timeout-minutes: 12
|
||||
env:
|
||||
SOLUTION_FILE_PATH: wolfssl64.sln
|
||||
BUILD_CONFIGURATION: Release
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
name: Checkout wolfSSL
|
||||
|
||||
- name: Enable AES-GCM-SIV in user_settings.h
|
||||
shell: bash
|
||||
run: |
|
||||
# Add the define once, right after the first HAVE_AESGCM (AES-NI is
|
||||
# already enabled for x64 in this header).
|
||||
sed -i '0,/#define HAVE_AESGCM/s//#define HAVE_AESGCM\n#define WOLFSSL_AESGCM_SIV/' \
|
||||
IDE/WIN/user_settings.h
|
||||
grep -n 'WOLFSSL_AESGCM_SIV' IDE/WIN/user_settings.h
|
||||
|
||||
- name: Add MSBuild to PATH
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Restore NuGet packages
|
||||
run: nuget restore ${{ env.SOLUTION_FILE_PATH }}
|
||||
|
||||
- name: Build (x64, MASM)
|
||||
run: msbuild /m /p:PlatformToolset=v142 /p:Platform=x64 /p:Configuration=${{ env.BUILD_CONFIGURATION }} ${{ env.SOLUTION_FILE_PATH }}
|
||||
|
||||
- name: Run wolfCrypt KATs (incl. AES-GCM-SIV)
|
||||
run: Release/x64/testsuite.exe
|
||||
Reference in New Issue
Block a user