Skip to content

Commit cb2d0e5

Browse files
committed
Add Altera Agilex 5 SDM crypto offload port via libfcs
1 parent 5b22fa9 commit cb2d0e5

26 files changed

Lines changed: 6193 additions & 16 deletions

.github/workflows/altera-fcs.yml

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
name: Altera Agilex 5 FCS port tests
2+
3+
# START OF COMMON SECTION
4+
on:
5+
push:
6+
branches: [ 'release/**' ]
7+
pull_request:
8+
types: [opened, synchronize, reopened, ready_for_review]
9+
branches: [ '*' ]
10+
11+
concurrency:
12+
group: ${{ github.workflow }}-${{ github.ref }}
13+
cancel-in-progress: true
14+
15+
permissions:
16+
contents: read
17+
# END OF COMMON SECTION
18+
19+
# The stub exposes only the libfcs interface and always reports unavailable
20+
# hardware. This checks port compilation, build guards, linkage, and software
21+
# fallback without treating host output as SDM cryptographic validation.
22+
# Functional offload remains covered by wolfcrypttest on Agilex 5 hardware.
23+
24+
jobs:
25+
build:
26+
name: ${{ matrix.name }}
27+
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
28+
runs-on: ubuntu-24.04
29+
timeout-minutes: 15
30+
strategy:
31+
fail-fast: false
32+
matrix:
33+
include:
34+
- name: Autotools all algorithms
35+
system: autotools
36+
option: all
37+
extra: --enable-aesctr
38+
- name: Autotools RNG only
39+
system: autotools
40+
option: rng
41+
extra: ''
42+
- name: Autotools without ECC
43+
system: autotools
44+
option: all
45+
extra: --enable-aesctr --disable-ecc
46+
- name: CMake all algorithms
47+
system: cmake
48+
option: all
49+
extra: ''
50+
- name: CMake RNG only
51+
system: cmake
52+
option: rng
53+
extra: ''
54+
55+
steps:
56+
- uses: actions/checkout@v5
57+
name: Checkout wolfSSL
58+
59+
- name: Install dependencies
60+
uses: ./.github/actions/install-apt-deps
61+
with:
62+
packages: autoconf automake libtool build-essential cmake
63+
ghcr-debs-tag: ubuntu-24.04-minimal
64+
65+
- name: Build no-hardware dependency stubs
66+
run: |
67+
stub="$RUNNER_TEMP/altera-fcs-stub"
68+
mkdir -p "$stub/include" "$stub/lib"
69+
cp tests/altera-fcs-stub/libfcs.h \
70+
tests/altera-fcs-stub/libfcs_osal_types.h "$stub/include/"
71+
cc -I"$stub/include" -c \
72+
tests/altera-fcs-stub/libfcs_stub.c -o "$stub/libfcs_stub.o"
73+
ar rcs "$stub/lib/libFCS.a" "$stub/libfcs_stub.o"
74+
cc -c tests/altera-fcs-stub/fdt_stub.c -o "$stub/fdt_stub.o"
75+
ar rcs "$stub/lib/libfdt.a" "$stub/fdt_stub.o"
76+
echo "ALTERA_FCS_STUB=$stub" >> "$GITHUB_ENV"
77+
78+
- name: Build and test with Autotools
79+
if: matrix.system == 'autotools'
80+
run: |
81+
set -o pipefail
82+
./autogen.sh
83+
CPPFLAGS="-I$ALTERA_FCS_STUB/include" \
84+
LDFLAGS="-L$ALTERA_FCS_STUB/lib" \
85+
./configure --enable-alterafcs=${{ matrix.option }} \
86+
--disable-shared ${{ matrix.extra }}
87+
make -j"$(nproc)"
88+
./wolfcrypt/test/testwolfcrypt | tee altera-fcs-test.log
89+
grep -q 'ALTERA-FCS test skipped: hardware unavailable' \
90+
altera-fcs-test.log
91+
92+
- name: Build and test with CMake
93+
if: matrix.system == 'cmake'
94+
run: |
95+
set -o pipefail
96+
cmake -S . -B build \
97+
-DWOLFSSL_ALTERA_FCS=${{ matrix.option }} \
98+
-DALTERA_FCS_INCLUDE_DIR="$ALTERA_FCS_STUB/include" \
99+
-DALTERA_FCS_OSAL_INCLUDE_DIR="$ALTERA_FCS_STUB/include" \
100+
-DALTERA_FCS_LIBRARY="$ALTERA_FCS_STUB/lib/libFCS.a" \
101+
-DALTERA_FDT_LIBRARY="$ALTERA_FCS_STUB/lib/libfdt.a"
102+
cmake --build build --target wolfcrypttest -j"$(nproc)"
103+
./build/wolfcrypt/test/testwolfcrypt | tee altera-fcs-test.log
104+
grep -q 'ALTERA-FCS test skipped: hardware unavailable' \
105+
altera-fcs-test.log

CMakeLists.txt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2762,10 +2762,39 @@ endif()
27622762

27632763
# TODO: - Session export
27642764

2765+
add_option("WOLFSSL_ALTERA_FCS"
2766+
"Enable Altera Agilex 5 SDM crypto offload via libfcs (default: disabled)"
2767+
"no" "all;rng;yes;no")
2768+
27652769
add_option("WOLFSSL_CRYPTOCB"
27662770
"Enable crypto callbacks (default: disabled)"
27672771
"no" "yes;no")
27682772

2773+
if(WOLFSSL_ALTERA_FCS)
2774+
find_path(ALTERA_FCS_INCLUDE_DIR NAMES libfcs.h)
2775+
find_path(ALTERA_FCS_OSAL_INCLUDE_DIR
2776+
NAMES libfcs_osal_types.h)
2777+
find_library(ALTERA_FCS_LIBRARY NAMES FCS)
2778+
find_library(ALTERA_FDT_LIBRARY NAMES fdt)
2779+
if(ALTERA_FCS_INCLUDE_DIR AND ALTERA_FCS_OSAL_INCLUDE_DIR AND
2780+
ALTERA_FCS_LIBRARY AND ALTERA_FDT_LIBRARY)
2781+
list(APPEND WOLFSSL_INCLUDE_DIRS
2782+
${ALTERA_FCS_INCLUDE_DIR}
2783+
${ALTERA_FCS_OSAL_INCLUDE_DIR})
2784+
list(APPEND WOLFSSL_LINK_LIBS
2785+
${ALTERA_FCS_LIBRARY}
2786+
${ALTERA_FDT_LIBRARY})
2787+
list(APPEND PC_LIBS_PRIVATE "-lFCS" "-lfdt")
2788+
else()
2789+
message(FATAL_ERROR "Altera FCS requires libfcs and libfdt headers "
2790+
"and libraries")
2791+
endif()
2792+
endif()
2793+
2794+
if(WOLFSSL_ALTERA_FCS)
2795+
override_cache(WOLFSSL_CRYPTOCB "yes")
2796+
endif()
2797+
27692798
add_option("WOLFSSL_CRYPTOCB_NO_SW_TEST"
27702799
"Disable crypto callback SW testing (default: disabled)"
27712800
"no" "yes;no")
@@ -3989,6 +4018,39 @@ wolfssl_warn_unconsumed_forces()
39894018
# the library. A series of AM_CONDITIONALs handle this in configure.ac.
39904019
generate_build_flags()
39914020

4021+
# FCS depends on algorithm options declared throughout this file. Derive its
4022+
# compile definitions only after all options and BUILD_* selections are final.
4023+
if(WOLFSSL_ALTERA_FCS)
4024+
list(APPEND WOLFSSL_DEFINITIONS
4025+
"-DWOLFSSL_ALTERA_FCS"
4026+
"-DWOLF_CRYPTO_CB_COPY"
4027+
"-DWOLF_CRYPTO_CB_FREE"
4028+
"-DWOLF_CRYPTO_CB_SETKEY")
4029+
if(WOLFSSL_ALTERA_FCS STREQUAL "rng")
4030+
if(BUILD_ALTERA_FCS_RNG)
4031+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_RNG")
4032+
endif()
4033+
else()
4034+
if(BUILD_ALTERA_FCS_RNG)
4035+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_RNG")
4036+
endif()
4037+
if(BUILD_ALTERA_FCS_HASH)
4038+
list(APPEND WOLFSSL_DEFINITIONS
4039+
"-DWOLFSSL_ALTERA_FCS_HASH"
4040+
"-DWOLFSSL_SHA512_HASHTYPE")
4041+
endif()
4042+
if(BUILD_ALTERA_FCS_AES)
4043+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_AES")
4044+
endif()
4045+
if(BUILD_ALTERA_FCS_ECC)
4046+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_ECC")
4047+
endif()
4048+
if(BUILD_ALTERA_FCS_HMAC)
4049+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_HMAC")
4050+
endif()
4051+
endif()
4052+
endif()
4053+
39924054
# TODO: - Bit of logic after optimization flags option (above)
39934055
# - Check for build-type conflicts section
39944056

cmake/functions.cmake

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,31 @@ function(generate_build_flags)
365365
if(WOLFSSL_CRYPTOCB OR WOLFSSL_USER_SETTINGS)
366366
set(BUILD_CRYPTOCB "yes" PARENT_SCOPE)
367367
endif()
368+
if(WOLFSSL_ALTERA_FCS OR WOLFSSL_USER_SETTINGS)
369+
set(BUILD_ALTERA_FCS "yes" PARENT_SCOPE)
370+
if(WOLFSSL_ALTERA_FCS STREQUAL "rng")
371+
if(WOLFSSL_RNG OR WOLFSSL_USER_SETTINGS)
372+
set(BUILD_ALTERA_FCS_RNG "yes" PARENT_SCOPE)
373+
endif()
374+
else()
375+
if(WOLFSSL_RNG OR WOLFSSL_USER_SETTINGS)
376+
set(BUILD_ALTERA_FCS_RNG "yes" PARENT_SCOPE)
377+
endif()
378+
if(WOLFSSL_SHA256 OR WOLFSSL_USER_SETTINGS)
379+
set(BUILD_ALTERA_FCS_HASH "yes" PARENT_SCOPE)
380+
endif()
381+
if(WOLFSSL_AES OR WOLFSSL_USER_SETTINGS)
382+
set(BUILD_ALTERA_FCS_AES "yes" PARENT_SCOPE)
383+
endif()
384+
if((WOLFSSL_ECC AND WOLFSSL_ASN) OR WOLFSSL_USER_SETTINGS)
385+
set(BUILD_ALTERA_FCS_ECC "yes" PARENT_SCOPE)
386+
endif()
387+
if(WOLFSSL_SHA256 OR WOLFSSL_SHA384 OR WOLFSSL_SHA512 OR
388+
WOLFSSL_USER_SETTINGS)
389+
set(BUILD_ALTERA_FCS_HMAC "yes" PARENT_SCOPE)
390+
endif()
391+
endif()
392+
endif()
368393
set(BUILD_PSK ${WOLFSSL_PSK} PARENT_SCOPE)
369394
set(BUILD_TRUST_PEER_CERT ${WOLFSSL_TRUSTED_PEER_CERT} PARENT_SCOPE)
370395
set(BUILD_PKI ${WOLFSSL_PKI} PARENT_SCOPE)
@@ -1285,6 +1310,32 @@ function(generate_lib_src_list LIB_SOURCES)
12851310
list(APPEND LIB_SOURCES wolfcrypt/src/cryptocb.c)
12861311
endif()
12871312

1313+
if(BUILD_ALTERA_FCS)
1314+
list(APPEND LIB_SOURCES
1315+
wolfcrypt/src/port/altera/altera_fcs_glue.c
1316+
wolfcrypt/src/port/altera/altera_fcs_cryptocb.c)
1317+
if(BUILD_ALTERA_FCS_RNG)
1318+
list(APPEND LIB_SOURCES
1319+
wolfcrypt/src/port/altera/altera_fcs_rng.c)
1320+
endif()
1321+
if(BUILD_ALTERA_FCS_HASH)
1322+
list(APPEND LIB_SOURCES
1323+
wolfcrypt/src/port/altera/altera_fcs_hash.c)
1324+
endif()
1325+
if(BUILD_ALTERA_FCS_AES)
1326+
list(APPEND LIB_SOURCES
1327+
wolfcrypt/src/port/altera/altera_fcs_aes.c)
1328+
endif()
1329+
if(BUILD_ALTERA_FCS_ECC)
1330+
list(APPEND LIB_SOURCES
1331+
wolfcrypt/src/port/altera/altera_fcs_ecc.c)
1332+
endif()
1333+
if(BUILD_ALTERA_FCS_HMAC)
1334+
list(APPEND LIB_SOURCES
1335+
wolfcrypt/src/port/altera/altera_fcs_hmac.c)
1336+
endif()
1337+
endif()
1338+
12881339
if(BUILD_SHE)
12891340
list(APPEND LIB_SOURCES wolfcrypt/src/wc_she.c)
12901341
endif()

cmake/options.h.in

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,10 @@ extern "C" {
261261
#cmakedefine WC_RSA_PSS
262262
#undef WOLF_CRYPTO_CB
263263
#cmakedefine WOLF_CRYPTO_CB
264+
#undef WOLF_CRYPTO_CB_COPY
265+
#cmakedefine WOLF_CRYPTO_CB_COPY
266+
#undef WOLF_CRYPTO_CB_FREE
267+
#cmakedefine WOLF_CRYPTO_CB_FREE
264268
#undef WOLF_CRYPTO_CB_RSA_PAD
265269
#cmakedefine WOLF_CRYPTO_CB_RSA_PAD
266270
#undef WOLFSSL_AARCH64_BUILD
@@ -289,6 +293,20 @@ extern "C" {
289293
#cmakedefine WOLFSSL_BASE64_ENCODE
290294
#undef WOLFSSL_CAAM
291295
#cmakedefine WOLFSSL_CAAM
296+
#undef WOLFSSL_ALTERA_FCS
297+
#cmakedefine WOLFSSL_ALTERA_FCS
298+
#undef WOLFSSL_ALTERA_FCS_RNG
299+
#cmakedefine WOLFSSL_ALTERA_FCS_RNG
300+
#undef WOLFSSL_ALTERA_FCS_HASH
301+
#cmakedefine WOLFSSL_ALTERA_FCS_HASH
302+
#undef WOLFSSL_ALTERA_FCS_AES
303+
#cmakedefine WOLFSSL_ALTERA_FCS_AES
304+
#undef WOLFSSL_ALTERA_FCS_ECC
305+
#cmakedefine WOLFSSL_ALTERA_FCS_ECC
306+
#undef WOLFSSL_ALTERA_FCS_HMAC
307+
#cmakedefine WOLFSSL_ALTERA_FCS_HMAC
308+
#undef WOLFSSL_SHA512_HASHTYPE
309+
#cmakedefine WOLFSSL_SHA512_HASHTYPE
292310
#undef WOLFSSL_CERT_EXT
293311
#cmakedefine WOLFSSL_CERT_EXT
294312
#undef WOLFSSL_CERT_GEN

0 commit comments

Comments
 (0)