Skip to content

Commit 0ffd850

Browse files
committed
Add Altera Agilex 5 SDM crypto offload port via libfcs
1 parent db34722 commit 0ffd850

27 files changed

Lines changed: 6201 additions & 18 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

.wolfssl_known_macro_extras

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ WOLFSSL_ALLOW_NO_CN_IN_SAN
815815
WOLFSSL_ALLOW_NO_SUITES
816816
WOLFSSL_ALLOW_SERVER_SC_EXT
817817
WOLFSSL_ALLOW_TLS_SHA1
818+
WOLFSSL_ALTERA_FCS_RAW_RNG
818819
WOLFSSL_ALTERNATIVE_DOWNGRADE
819820
WOLFSSL_ALT_NAMES_NO_REV
820821
WOLFSSL_ARM32_BUILD
@@ -1034,7 +1035,6 @@ WOLFSSL_SHA256_ALT_CH_MAJ
10341035
WOLFSSL_SHA3_AVX2
10351036
WOLFSSL_SHA3_NO_AVX2
10361037
WOLFSSL_SHA3_PPC64_BLOCKS_N
1037-
WOLFSSL_SHA512_HASHTYPE
10381038
WOLFSSL_SHUTDOWNONCE
10391039
WOLFSSL_SILABS_TRNG
10401040
WOLFSSL_SLHDSA_FULL_HASH
@@ -1112,7 +1112,6 @@ WOLFSSL_XILINX_PATCH
11121112
WOLFSSL_XIL_MSG_NO_SLEEP
11131113
WOLFSSL_ZEPHYR
11141114
WOLF_ALLOW_BUILTIN
1115-
WOLF_CRYPTO_CB_CMD
11161115
WOLF_CRYPTO_CB_ONLY_FALCON
11171116
WOLF_CRYPTO_DEV
11181117
WOLF_CRYPT_FIPS_H

CMakeLists.txt

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

27732773
# TODO: - Session export
27742774

2775+
add_option("WOLFSSL_ALTERA_FCS"
2776+
"Enable Altera Agilex 5 SDM crypto offload via libfcs (default: disabled)"
2777+
"no" "all;rng;yes;no")
2778+
27752779
add_option("WOLFSSL_CRYPTOCB"
27762780
"Enable crypto callbacks (default: disabled)"
27772781
"no" "yes;no")
27782782

2783+
if(WOLFSSL_ALTERA_FCS)
2784+
find_path(ALTERA_FCS_INCLUDE_DIR NAMES libfcs.h)
2785+
find_path(ALTERA_FCS_OSAL_INCLUDE_DIR
2786+
NAMES libfcs_osal_types.h)
2787+
find_library(ALTERA_FCS_LIBRARY NAMES FCS)
2788+
find_library(ALTERA_FDT_LIBRARY NAMES fdt)
2789+
if(ALTERA_FCS_INCLUDE_DIR AND ALTERA_FCS_OSAL_INCLUDE_DIR AND
2790+
ALTERA_FCS_LIBRARY AND ALTERA_FDT_LIBRARY)
2791+
list(APPEND WOLFSSL_INCLUDE_DIRS
2792+
${ALTERA_FCS_INCLUDE_DIR}
2793+
${ALTERA_FCS_OSAL_INCLUDE_DIR})
2794+
list(APPEND WOLFSSL_LINK_LIBS
2795+
${ALTERA_FCS_LIBRARY}
2796+
${ALTERA_FDT_LIBRARY})
2797+
list(APPEND PC_LIBS_PRIVATE "-lFCS" "-lfdt")
2798+
else()
2799+
message(FATAL_ERROR "Altera FCS requires libfcs and libfdt headers "
2800+
"and libraries")
2801+
endif()
2802+
endif()
2803+
2804+
if(WOLFSSL_ALTERA_FCS)
2805+
override_cache(WOLFSSL_CRYPTOCB "yes")
2806+
endif()
2807+
27792808
add_option("WOLFSSL_CRYPTOCB_NO_SW_TEST"
27802809
"Disable crypto callback SW testing (default: disabled)"
27812810
"no" "yes;no")
@@ -3999,6 +4028,39 @@ wolfssl_warn_unconsumed_forces()
39994028
# the library. A series of AM_CONDITIONALs handle this in configure.ac.
40004029
generate_build_flags()
40014030

4031+
# FCS depends on algorithm options declared throughout this file. Derive its
4032+
# compile definitions only after all options and BUILD_* selections are final.
4033+
if(WOLFSSL_ALTERA_FCS)
4034+
list(APPEND WOLFSSL_DEFINITIONS
4035+
"-DWOLFSSL_ALTERA_FCS"
4036+
"-DWOLF_CRYPTO_CB_COPY"
4037+
"-DWOLF_CRYPTO_CB_FREE"
4038+
"-DWOLF_CRYPTO_CB_SETKEY")
4039+
if(WOLFSSL_ALTERA_FCS STREQUAL "rng")
4040+
if(BUILD_ALTERA_FCS_RNG)
4041+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_RNG")
4042+
endif()
4043+
else()
4044+
if(BUILD_ALTERA_FCS_RNG)
4045+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_RNG")
4046+
endif()
4047+
if(BUILD_ALTERA_FCS_HASH)
4048+
list(APPEND WOLFSSL_DEFINITIONS
4049+
"-DWOLFSSL_ALTERA_FCS_HASH"
4050+
"-DWOLFSSL_SHA512_HASHTYPE")
4051+
endif()
4052+
if(BUILD_ALTERA_FCS_AES)
4053+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_AES")
4054+
endif()
4055+
if(BUILD_ALTERA_FCS_ECC)
4056+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_ECC")
4057+
endif()
4058+
if(BUILD_ALTERA_FCS_HMAC)
4059+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALTERA_FCS_HMAC")
4060+
endif()
4061+
endif()
4062+
endif()
4063+
40024064
# TODO: - Bit of logic after optimization flags option (above)
40034065
# - Check for build-type conflicts section
40044066

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
if(WOLFSSL_VAULTIC)
369394
set(BUILD_VAULTIC "yes" PARENT_SCOPE)
370395
endif()
@@ -1288,6 +1313,32 @@ function(generate_lib_src_list LIB_SOURCES)
12881313
list(APPEND LIB_SOURCES wolfcrypt/src/cryptocb.c)
12891314
endif()
12901315

1316+
if(BUILD_ALTERA_FCS)
1317+
list(APPEND LIB_SOURCES
1318+
wolfcrypt/src/port/altera/altera_fcs_glue.c
1319+
wolfcrypt/src/port/altera/altera_fcs_cryptocb.c)
1320+
if(BUILD_ALTERA_FCS_RNG)
1321+
list(APPEND LIB_SOURCES
1322+
wolfcrypt/src/port/altera/altera_fcs_rng.c)
1323+
endif()
1324+
if(BUILD_ALTERA_FCS_HASH)
1325+
list(APPEND LIB_SOURCES
1326+
wolfcrypt/src/port/altera/altera_fcs_hash.c)
1327+
endif()
1328+
if(BUILD_ALTERA_FCS_AES)
1329+
list(APPEND LIB_SOURCES
1330+
wolfcrypt/src/port/altera/altera_fcs_aes.c)
1331+
endif()
1332+
if(BUILD_ALTERA_FCS_ECC)
1333+
list(APPEND LIB_SOURCES
1334+
wolfcrypt/src/port/altera/altera_fcs_ecc.c)
1335+
endif()
1336+
if(BUILD_ALTERA_FCS_HMAC)
1337+
list(APPEND LIB_SOURCES
1338+
wolfcrypt/src/port/altera/altera_fcs_hmac.c)
1339+
endif()
1340+
endif()
1341+
12911342
if(BUILD_SHE)
12921343
list(APPEND LIB_SOURCES wolfcrypt/src/wc_she.c)
12931344
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)