Merge pull request #10942 from LinuxJedi/add-agents-md

Add integrator-focused AGENTS.md and CLAUDE.md
This commit is contained in:
Tobias Frauenschläger
2026-08-05 14:19:25 +02:00
committed by GitHub
3 changed files with 242 additions and 2 deletions
+3 -2
View File
@@ -517,8 +517,9 @@ wrapper/Ada/obj/
wolfssl/debug-trace-error-codes.h
wolfssl/debug-untrace-error-codes.h
AGENTS.md
CLAUDE.md
# Local (untracked) agent instruction files
AGENTS.local.md
CLAUDE.local.md
# Code navigation files
compile_commands.json
+238
View File
@@ -0,0 +1,238 @@
# wolfSSL Integration Guide for Agents
wolfSSL is a lightweight ANSI C (C90) TLS/DTLS library (up to TLS 1.3 and DTLS 1.3)
built on the wolfCrypt cryptography engine. It targets everything from bare-metal
microcontrollers and RTOSes to desktop/server systems. Dual licensed: GPLv3
(GPLv2 may be elected only for specific exception projects) or a commercial
license from wolfSSL Inc. (see `LICENSING`).
This file is for agents helping users *integrate wolfSSL into their own projects*.
If `AGENTS.local.md` or `CLAUDE.local.md` exists in the repository root, read
it before starting work. Those files are gitignored, carry maintainer- and
machine-specific instructions, and take precedence over this file.
## Choose an integration path
| Situation | Path |
|---|---|
| Unix-like host or cross-compile with a toolchain | Autotools (canonical, most tested) |
| CMake-based project (find_package, add_subdirectory, FetchContent) | CMake |
| IDE, RTOS, or bare-metal build with no configure step | `user_settings.h` + `-DWOLFSSL_USER_SETTINGS` |
| Zephyr | `zephyr/` (module.yml, Kconfig) |
| ESP-IDF | `IDE/Espressif/ESP-IDF/` (also published as a managed component) |
| Arduino / PlatformIO | `IDE/ARDUINO/`, `IDE/PlatformIO/` |
| Visual Studio | `wolfssl64.sln`, `wolfssl-VS2022.vcxproj`, `IDE/WIN*/` |
| Linux/BSD kernel module | `linuxkm/`, `bsdkm/` |
| Python / Rust / C# / Ada bindings | `wrapper/` |
| Other IDEs/platforms (Keil, IAR, STM32Cube, Renesas, Xcode, QNX, ...) | `IDE/` (~60 subdirectories, each with a README) |
## The one rule that prevents most integration bugs
The application must be compiled with the **same feature defines** as the library.
Feature macros change struct layouts and API availability; a mismatch compiles fine
and corrupts memory at runtime.
- Autotools/CMake builds generate `wolfssl/options.h` recording every define.
Include `<wolfssl/options.h>` before any other wolfSSL header, or build the app
with `-DWOLFSSL_USE_OPTIONS_H` so headers pull it in automatically.
- `user_settings.h` builds: define `WOLFSSL_USER_SETTINGS` for **both** the library
and the application, and keep one shared `user_settings.h` on the include path.
- Never commit a generated `wolfssl/options.h` (it is per-configure output).
## Autotools build (primary)
```sh
./autogen.sh # git checkouts only; needs autoconf/automake/libtool.
# Release tarballs from wolfssl.com ship a prebuilt configure.
./configure [options]
make -j
make check # optional but recommended
sudo make install # installs lib, headers, wolfssl.pc, cmake package files
```
- `./configure --help` lists all options (~374 `--enable-*`, ~29 `--with-*`).
`configure.ac` is the source of truth for what each option defines.
- Extra defines: `./configure CFLAGS="-DWOLFSSL_DTLS_NO_HVR_ON_RESUME"` or
`EXTRA_CFLAGS`. (`C_EXTRA_FLAGS` is deprecated but still works.)
- Cross-compile with the usual `--host=<triple>` plus `CC=...`.
- Consumption after install: `pkg-config --cflags --libs wolfssl`, or CMake
`find_package(wolfssl)` (autotools installs the CMake package files too;
disable with `--disable-cmake-install`).
### Commonly used configure options
Defaults already on: TLS 1.2/1.3, ECC, RSA, AES(+GCM), SHA-2, ChaCha20-Poly1305,
Curve25519/Ed25519, hardening (`--enable-harden`: timing resistance + blinding),
SP math. Most work is *adding* protocols/features or *shrinking* the build.
| Group | Options |
|---|---|
| Bundles | `--enable-all`, `--enable-all-crypto`, `--enable-distro`, `--enable-cryptonly` (wolfCrypt only, no TLS) |
| Small builds | `--enable-leanpsk`, `--enable-leantls`, `--enable-lowresource`, `--enable-tinytls13`, `--enable-smallstack`, `--enable-staticmemory`, `--disable-errorstrings` |
| Protocols | `--enable-dtls`, `--enable-dtls13`, `--enable-quic`, `--enable-sctp`, `--enable-srtp`, `--enable-oldtls` (TLS 1.0/1.1), `--disable-tls13` |
| TLS features | `--enable-sni`, `--enable-alpn`, `--enable-session-ticket`, `--enable-earlydata`, `--enable-secure-renegotiation`, `--enable-maxfragment`, `--enable-ocsp`, `--enable-ocspstapling`, `--enable-crl`, `--enable-hrrcookie` |
| Extra crypto | `--enable-aesccm`, `--enable-aesctr`, `--enable-aesxts`, `--enable-curve448`, `--enable-ed448`, `--enable-sha3`, `--enable-rsapss`, `--enable-cmac`, `--enable-sm2 --enable-sm3 --enable-sm4-gcm` (ShangMi) |
| Post-quantum | `--enable-mlkem` (alias `--enable-kyber`), `--enable-mldsa` (alias `--enable-dilithium`), `--enable-falcon`, `--enable-lms`, `--enable-xmss` |
| Performance | `--enable-sp --enable-sp-asm` (default on x86_64/aarch64), `--enable-aesni`, `--enable-intelasm`, `--enable-armasm`, `--enable-riscv-asm`, `--enable-fastmath` |
| OpenSSL compat | `--enable-opensslextra` (common subset), `--enable-opensslall` (maximum), `--enable-opensslcoexist` (link both libraries) |
| App recipes | `--enable-curl`, `--enable-nginx`, `--enable-openssh`, `--enable-openvpn`, `--enable-haproxy`, `--enable-stunnel`, `--enable-wpas`, ... (each sets exactly the flags that project needs) |
| Platform | `--enable-singlethreaded`, `--disable-filesystem`, `--enable-usersettings` (read root `user_settings.h` instead of option defines) |
| Hardware/secure elements | `--enable-pkcs11`, `--enable-psa`, `--with-cryptoauthlib`, `--with-se050`, `--enable-caam`, `--enable-devcrypto`, `--enable-kcapi`, ... |
| Debug | `--enable-debug` (defines `DEBUG_WOLFSSL`, enables logging), `--enable-debug-trace-errcodes`, `--enable-valgrind` |
| FIPS | `--enable-fips=<ver>` (v2, v5, v6, ready, dev, ...). Certified versions need a licensed FIPS source bundle from wolfSSL Inc.; `ready`/`dev` build with the free FIPS Ready bundle from wolfssl.com. None configure from a plain git tree |
Option-to-macro mapping: nearly every `--enable-foo` maps 1:1 to a CMake
`-DWOLFSSL_FOO=yes` and to one or more C macros usable in `user_settings.h`.
To find the macro behind an option, grep `configure.ac` for the option name
and look at the `AM_CFLAGS="$AM_CFLAGS -D..."` lines, or grep `cmake/options.h.in`.
## CMake build
```sh
cmake -B build -DWOLFSSL_TLS13=yes -DWOLFSSL_DTLS=yes # in-source builds are rejected
cmake --build build
ctest --test-dir build --output-on-failure
cmake --install build
```
- Minimum CMake 3.16. Option rule: `--enable-foo` == `-DWOLFSSL_FOO=yes`,
`--disable-foo` == `-DWOLFSSL_FOO=no`. Plus standard `-DBUILD_SHARED_LIBS=ON/OFF`,
`-DCMAKE_BUILD_TYPE=Debug|Release`, `-DWOLFSSL_EXAMPLES=no`, `-DWOLFSSL_CRYPT_TESTS=no`.
- CMake generates its own `<build>/wolfssl/options.h` (template: `cmake/options.h.in`).
- Consume installed package: `find_package(wolfssl CONFIG REQUIRED)` and link
`wolfssl::wolfssl`. Working example: `cmake/consumer/`.
- Embedding the source tree with `add_subdirectory()`/`FetchContent` also works;
link the `wolfssl` target.
- `-DWOLFSSL_USER_SETTINGS=yes` drops all option defines in favor of your
`user_settings.h`.
## user_settings.h build (IDE / RTOS / bare-metal)
1. Pick a template from `examples/configs/` (26 of them, documented in its README):
- `user_settings_template.h` -- modular starting point
- `user_settings_all.h` (== `--enable-all`), `user_settings_tls12.h`,
`user_settings_tls13.h`, `user_settings_tinytls13.h`, `user_settings_dtls13.h`
- `user_settings_baremetal.h` (no filesystem, static memory),
`user_settings_min_ecc.h`, `user_settings_rsa_only.h`
- `user_settings_pq.h` (ML-KEM + ML-DSA), `user_settings_openssl_compat.h`
- platform ones: `user_settings_stm32.h`, `user_settings_espressif.h`,
`user_settings_arduino.h`, `user_settings_platformio.h`
- `user_settings_fipsv2.h`, `user_settings_fipsv5.h`
2. Copy it into your project as `user_settings.h`, put its directory on the include
path, and add `-DWOLFSSL_USER_SETTINGS` to all compilations (library and app).
3. Add sources to your build: `src/*.c` and `wolfcrypt/src/*.c`, **except** files
that are `#include`d into others rather than compiled standalone:
`src/ssl_*.c` (inlined into `src/ssl.c`), `wolfcrypt/src/evp.c` and
`wolfcrypt/src/misc.c` (inlined unless `NO_INLINE` is defined). Add files from
`wolfcrypt/src/port/<vendor>/` only for your hardware.
4. Include `<wolfssl/wolfcrypt/settings.h>` (or any wolfSSL header, which pulls it
in) -- it reads `user_settings.h` first.
Sanity-check a config against this repo: copy it to the repo root as
`user_settings.h`, then `./configure --enable-usersettings --disable-examples && make`.
`wolfssl/wolfcrypt/settings.h` is the platform switchboard: it reacts to target
macros (`WOLFSSL_ESPIDF`, `FREERTOS`, `WOLFSSL_ZEPHYR`, `WOLFSSL_STM32F4`,
`MICROCHIP_PIC32`, `THREADX`, `MICRIUM`, `WOLFSSL_VXWORKS`, `EBSNET`, ...) and sets
up threading, memory, time, and filesystem primitives. Never edit `settings.h`;
set the macros in `user_settings.h` or your build flags.
## Where to look
| Path | Contents |
|---|---|
| `wolfssl/ssl.h` | Main TLS/DTLS API (`wolfSSL_*`) |
| `wolfssl/wolfcrypt/*.h` | Crypto APIs (`wc_*`): aes.h, ecc.h, rsa.h, sha256.h, random.h, ... |
| `wolfssl/openssl/*.h` | OpenSSL compatibility headers (with `--enable-opensslextra`) |
| `wolfssl/wolfio.h` | Transport I/O callback API |
| `wolfssl/wolfcrypt/settings.h` | Platform/feature switchboard (read-only) |
| `wolfssl/certs_test.h` | Test certs/keys as C arrays (for `NO_FILESYSTEM` demos only) |
| `wolfssl/internal.h` | Internal -- do not use from applications |
| `src/` | TLS implementation (ssl.c, tls13.c, dtls13.c, internal.c) |
| `wolfcrypt/src/` | Crypto implementations |
| `wolfcrypt/src/port/` | ~30 hardware/OS crypto ports: arm, intel, Espressif, Renesas, st, nxp, atmel, silabs, psa, kcapi, caam, liboqs, ... |
| `examples/client/`, `examples/server/` | Full-featured reference apps; run with `-h` for all flags |
| `examples/tls13/` | Minimal TLS 1.3 samples, incl. in-memory I/O (no sockets) |
| `examples/configs/` | The `user_settings_*.h` templates |
| `certs/` | Test certificates for examples/tests -- never use in production |
| `IDE/` | Per-IDE/platform project files and READMEs |
| `zephyr/`, `linuxkm/`, `bsdkm/`, `wrapper/` | Zephyr module, kernel modules, language bindings |
| `INSTALL` | Platform-by-platform build notes (iOS, Windows, Yocto, MQX, ...) |
| `doc/` | Pointers to the manual and Doxygen API docs |
## Minimal TLS client flow
```c
#include <wolfssl/options.h> /* or user_settings.h scheme; must be first */
#include <wolfssl/ssl.h>
wolfSSL_Init();
WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method());
wolfSSL_CTX_load_verify_locations(ctx, "ca-cert.pem", NULL);
WOLFSSL* ssl = wolfSSL_new(ctx);
wolfSSL_set_fd(ssl, sockfd); /* connected TCP socket */
wolfSSL_connect(ssl); /* handshake (server: wolfSSL_accept) */
wolfSSL_write(ssl, msg, msgSz);
wolfSSL_read(ssl, buf, sizeof(buf));
wolfSSL_shutdown(ssl);
wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); wolfSSL_Cleanup();
```
With `NO_FILESYSTEM`, use the buffer variants: `wolfSSL_CTX_load_verify_buffer()`,
`wolfSSL_CTX_use_certificate_buffer()`, `wolfSSL_CTX_use_PrivateKey_buffer()`.
On error, get details with `wolfSSL_get_error(ssl, ret)` and
`wolfSSL_ERR_error_string()`.
## Porting hooks
| Need | Hook | Where |
|---|---|---|
| Custom transport (no BSD sockets) | `wolfSSL_CTX_SetIORecv()` / `wolfSSL_CTX_SetIOSend()` + `wolfSSL_SetIOReadCtx()` / `wolfSSL_SetIOWriteCtx()` | `wolfssl/wolfio.h` |
| Custom allocator | `XMALLOC_USER` (your xmalloc/xfree/xrealloc), or `wolfSSL_SetAllocators()`, or `WOLFSSL_STATIC_MEMORY` (no heap) | `wolfssl/wolfcrypt/types.h`, `memory.h` |
| Entropy source | implement `wc_GenerateSeed()`, or define `CUSTOM_RAND_GENERATE_SEED` / `CUSTOM_RAND_GENERATE_BLOCK`, or `WC_RNG_SEED_CB` | `wolfssl/wolfcrypt/random.h`, `wolfcrypt/src/random.c` |
| Time source | `XTIME`/`XGMTIME` overrides, `NO_ASN_TIME` (`wc_port.h`); `USER_TICKS` low-res timer (`settings.h`) | `wolfssl/wolfcrypt/wc_port.h` |
| No RTOS / one thread | define `SINGLE_THREADED` (drops mutex deps) | `wolfssl/wolfcrypt/wc_port.h` |
| No filesystem | define `NO_FILESYSTEM`, use `*_buffer()` APIs | `wolfssl/wolfcrypt/wc_port.h` |
| Logging | build with `DEBUG_WOLFSSL` (`--enable-debug`), then `wolfSSL_Debugging_ON()`; redirect with `wolfSSL_SetLoggingCb()` (e.g. to a UART) | `wolfssl/wolfcrypt/logging.h` |
| Crypto offload / secure element | PKCS#11 (`--enable-pkcs11`), crypto callbacks (`wc_CryptoCb_RegisterDevice`, `WOLF_CRYPTO_CB`), or a `wolfcrypt/src/port/` driver | `wolfssl/wolfcrypt/cryptocb.h` |
## Verifying an integration
- `./wolfcrypt/test/testwolfcrypt` -- crypto self-test; `wolfcrypt/test/test.c` is
portable and commonly compiled into embedded targets as a smoke test
(call `wolfcrypt_test()`).
- `./wolfcrypt/benchmark/benchmark` -- crypto benchmark (also portable).
- `./examples/server/server` + `./examples/client/client` -- loopback TLS smoke
test using `certs/`.
- Full suite in-repo: `make check` (autotools) or `ctest` (CMake).
## Gotchas
- Feature-define mismatch between lib and app is the #1 integration bug (see
"The one rule" above). Symptoms: crashes or corruption inside otherwise-correct
calls.
- `wolfSSL_Debugging_ON()` is a silent no-op unless the build defined
`DEBUG_WOLFSSL`.
- Certificate loading fails (`ASN_NO_SIGNER_E`, error -188) when the CA is not
loaded: wolfSSL verifies peers by default; load the CA chain or (dev only!)
`wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL)`.
- `certs/` and `wolfssl/certs_test.h` are shared test credentials -- never ship
them.
- Hardening (timing resistance/blinding) is on by default; `--disable-harden` is
a security decision, not a build convenience.
- No `--enable-fips` variant builds from the plain git tree: configure errors out
while `wolfcrypt/src/fips.c` is the empty stub. Certified FIPS (v2/v5/v6)
requires a licensed source bundle from wolfSSL Inc.; `--enable-fips=ready` or
`=dev` works with the free FIPS Ready download from wolfssl.com, running the
full module machinery (integrity check, self-tests) but without a FIPS
certificate.
- OpenSSL compat is source-level, not ABI-level: recompile the app against
`wolfssl/openssl/*.h`; you cannot swap shared libraries under an
OpenSSL-linked binary.
## Further documentation
- wolfSSL manual: https://www.wolfssl.com/documentation/manuals/wolfssl/
- API reference (wolfSSL + wolfCrypt Doxygen): `doc/dox_comments` directory
- Standalone example projects: https://github.com/wolfSSL/wolfssl-examples
- Support / commercial licensing: support@wolfssl.com
+1
View File
@@ -0,0 +1 @@
@AGENTS.md