1
0
mirror of https://github.com/wolfSSL/wolfssl.git synced 2026-10-24 04:09:07 +03:00
Files
wolfssl/.github/workflows/wolfCrypt-Wconversion.yml
Tobias Frauenschläger 198b09a093 Transform each polynomial of y once when signing with small memory
Small memory signing walked matrix A a row at a time and copied and
transformed the polynomial of y it needed for every element of the row.
Each polynomial of y was therefore transformed k times with an identical
result: 156 transforms per ML-DSA-65 signature where 31 are needed.

Walk the matrix a column at a time instead. Every row of the matrix uses
the same column of y, so the transform is done once and the products are
accumulated down the column into w0, which is already a vector of k
polynomials. Inverting, decomposing and encoding then run as a second
pass over the rows, with w0 replaced in place and the scratch polynomial
holding w1. w is reduced before the inverse transform on both column
accumulating paths.

Vector y stays resident, so unlike the smallest memory implementation
this does not have to regenerate it, and it keeps generating y as a whole
vector so the assembly generators are still used.

With WOLFSSL_MLDSA_SIGN_SMALL_MEM_PRECALC_A the pre-calculated rows are
multiplied as a vector, and w is sized for all k rows: the ML-DSA-44
decompose kernels take no dimension and touch every row, so the rows above
the pre-calculated ones are cleared, and mldsa_vec_encode_w1() now honours
the dimension it is given. The whole-vector helpers that path drives are
gated on a new MLDSA_SIGN_VEC_HELPERS, which names the set of callers.
Under WC_MLDSA_FAULT_HARDEN the column loop checks that the polynomial of
y it reads, walked independently of the column index, lies inside y.

Memory is unchanged: w0 was already held for the hints and the row
accumulator becomes the scratch the transform runs in.
WOLFSSL_MLDSA_SMALL_MEM_POLY64 no longer applies to signing as a 64-bit
accumulator would now be needed for every row of w, which also returns
the 2KB it was allocating. The option now only affects small memory key
generation and verification; the option list says so.

Signatures are unchanged. Signing is 12 to 29 percent quicker with the C
code and 6 to 12 percent quicker with AVX-512, which makes it faster than
the smallest memory implementation on every target rather than only where
the assembly runs. Add pq-all rows for PRECALC_A split part way, saturated
past k, and on the Intel assembly paths, and a -Wconversion row.
2026-10-06 16:07:38 +02:00

195 lines
11 KiB
YAML

name: wolfCrypt conversion warnings
# 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: re-runs --build-only (compile only, no tests) on the
# default branch. PR runs are read-only (see ccache-setup).
schedule:
- cron: '48 10 * * 1-5'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
# END OF COMMON SECTION
jobs:
# All former runner-per-config matrix entries build on one runner via
# .github/scripts/parallel-make-check.py (see os-check.yml for the full
# pattern): each config builds in its own out-of-tree ("VPATH") build
# directory off one checkout/autogen, on a pool of one-per-CPU worker
# threads, longest first.
build_library:
name: build library
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
runs-on: ubuntu-24.04
# Generous for a cold ccache; warm reruns finish in a fraction.
timeout-minutes: 15
steps:
- uses: actions/checkout@v5
name: Checkout wolfSSL
- name: Install dependencies
uses: ./.github/actions/install-apt-deps
with:
packages: autoconf automake libtool build-essential gcc-multilib
ghcr-debs-tag: ubuntu-24.04-minimal
# ccache via the cross-platform composite; the script passes the
# compiler to configure as CC="ccache gcc" (or a per-config "cc").
- name: Set up ccache
uses: ./.github/actions/ccache-setup
with:
workflow-id: wconversion
read-only: ${{ github.event_name == 'pull_request' }}
max-size: 300M
# The JSON list below is the former runner-per-config matrix. These
# are compile-only warning checks ("check": false): the -Wconversion
# family must come out clean, nothing is executed.
- name: Build all configs (parallel, out-of-tree)
run: |
cat > "$RUNNER_TEMP/wconversion-configs.json" <<'EOF'
[
{"name": "noasm-mldsa-align0", "minutes": 1,
"configure": ["--disable-asm", "--enable-cryptonly",
"--enable-all-crypto", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem", "--enable-slhdsa",
"--enable-mldsa=yes,small", "--enable-lms", "--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_ALIGNMENT=0 -DWC_XMSS_FULL_HASH -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual"],
"check": false},
{"name": "intelasm-lms-full-hash", "minutes": 1,
"configure": ["--enable-intelasm", "--enable-cryptonly",
"--enable-all-crypto", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa=yes,draft",
"--enable-lms", "--enable-xmss",
"CPPFLAGS=-DWC_LMS_FULL_HASH -DWOLFSSL_LMS_LARGE_CACHES -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual"],
"check": false},
{"name": "smallstack-noasm-small-mem", "minutes": 1,
"configure": ["--enable-smallstack", "--disable-asm",
"--enable-cryptonly", "--enable-all-crypto", "--disable-examples",
"--disable-benchmark", "--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa", "--enable-mldsa=yes,no-ctx",
"--enable-lms=yes,small", "--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALL_MEM -DWOLFSSL_MLDSA_VERIFY_SMALL_MEM -DWOLFSSL_MLDSA_MAKE_KEY_SMALL_MEM -DWOLFSSL_XMSS_LARGE_SECRET_KEY -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual"],
"check": false},
{"name": "smallstack-intelasm-precalc", "minutes": 1,
"configure": ["--enable-smallstack", "--enable-intelasm",
"--enable-cryptonly", "--enable-all-crypto", "--disable-examples",
"--disable-benchmark", "--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa", "--enable-lms",
"--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALL_MEM -DWOLFSSL_MLDSA_SIGN_SMALL_MEM_PRECALC -DWOLFSSL_WC_LMS_SERIALIZE_STATE -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual"],
"check": false},
{"name": "smallest-mem", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa", "--enable-lms",
"--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALLEST_MEM -DWOLFSSL_MLDSA_VERIFY_SMALLEST_MEM -DWOLFSSL_MLDSA_MAKE_KEY_SMALL_MEM -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -Wdeclaration-after-statement"],
"check": false},
{"name": "smallest-mem-no-verify", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa", "--enable-lms",
"--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALLEST_MEM -DWOLFSSL_MLDSA_NO_VERIFY -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -Wdeclaration-after-statement"],
"check": false},
{"name": "precalc-a-intelasm", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--enable-intelasm", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa", "--enable-lms",
"--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALL_MEM_PRECALC_A=1 -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -Wdeclaration-after-statement"],
"check": false},
{"name": "precalc-a-no-int128", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa", "--enable-lms",
"--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_SIGN_SMALL_MEM -DWOLFSSL_MLDSA_SIGN_SMALL_MEM_PRECALC_A -DWOLFSSL_WC_XMSS_NO_SHA512 -DWOLFSSL_LMS_NO_SIG_CACHE -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -DNO_INT128 -Wcast-qual"],
"check": false},
{"name": "cache-matrix-no-smoothing", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem=yes,small",
"--enable-slhdsa=yes,small", "--enable-mldsa", "--enable-lms",
"--enable-xmss=yes,small",
"CPPFLAGS=-DWC_MLDSA_CACHE_MATRIX_A -DWOLFSSL_LMS_NO_SIGN_SMOOTHING -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -DNO_INT128"],
"check": false},
{"name": "no-large-code-lms192", "minutes": 1,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem=yes,no-large-code",
"--enable-slhdsa=yes,small-mem", "--enable-mldsa",
"--enable-lms=yes,sha256-192,shake256", "--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLDSA_NO_LARGE_CODE -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -DNO_INT128"],
"check": false},
{"name": "smallstack-mldsa-dynamic", "minutes": 1,
"configure": ["--enable-smallstack", "--enable-cryptonly",
"--enable-all-crypto", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem", "--enable-slhdsa",
"--enable-mldsa", "--enable-lms=yes,verify-only", "--enable-xmss",
"CPPFLAGS=-DWC_MLDSA_CACHE_PRIV_VECTORS -DWC_MLDSA_CACHE_PUB_VECTORS -DWOLFSSL_MLDSA_DYNAMIC_KEYS -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -DNO_INT128"],
"check": false},
{"name": "mlkem-small-no-int128", "minutes": 1,
"configure": ["--disable-intelasm", "--enable-cryptonly",
"--enable-all-crypto", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem=yes,small",
"--enable-slhdsa", "--enable-lms", "--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual -DNO_INT128"],
"check": false},
{"name": "verify-only-m32", "minutes": 0.8,
"configure": ["--enable-cryptonly", "--enable-all-crypto",
"--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,sha2", "--enable-mldsa=yes,verify-only",
"--enable-lms=yes,small,sha256-192,shake256",
"--enable-xmss=yes,verify-only",
"CPPFLAGS=-DWOLFSSL_MLDSA_VERIFY_SMALL_MEM -DWOLFSSL_MLDSA_VERIFY_NO_MALLOC -DWOLFSSL_MLDSA_SMALL_MEM_POLY64 -DWOLFSSL_WC_XMSS_NO_SHAKE128 -DWOLFSSL_WC_XMSS_NO_SHAKE256 -Wdeclaration-after-statement -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual",
"--enable-32bit", "CFLAGS=-m32"],
"check": false},
{"name": "m32-mlkem-small-mem", "minutes": 0.8,
"configure": ["--disable-intelasm", "--enable-cryptonly",
"--enable-all-crypto", "--disable-examples", "--disable-benchmark",
"--disable-crypttests", "--enable-mlkem",
"--enable-slhdsa=yes,verify-only", "--enable-mldsa",
"--enable-lms", "--enable-xmss",
"CPPFLAGS=-DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM -DWOLFSSL_MLDSA_NO_ASN1 -DWOLFSSL_MLDSA_ALIGNMENT=0 -Wdeclaration-after-statement -Wconversion -Warith-conversion -Wenum-conversion -Wfloat-conversion -Wsign-conversion -Wcast-qual",
"--enable-32bit", "CFLAGS=-m32"],
"check": false}
]
EOF
.github/scripts/parallel-make-check.py \
${{ github.event_name == 'schedule' && '--build-only' || '' }} \
"$RUNNER_TEMP/wconversion-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: wconversion-logs
path: |
build-*/make-check.log
build-*/test-suite.log
build-*/config.log
if-no-files-found: ignore