63#include "mbedtls/net_sockets.h"
64#include "mbedtls/platform.h"
65#include "mbedtls/ssl.h"
68#include "psa/crypto.h"
80typedef enum : uint32_t {
108typedef enum : uint8_t {
119typedef enum : uint8_t {
130typedef enum : uint8_t {
143typedef enum : uint16_t {
156typedef enum : uint8_t {
166static const uint8_t
k_demo_mac[6] = {0x02U, 0x00U, 0x00U, 0x00U, 0x00U, 0x03U};
192#ifndef RA8_OFF_TARGET
226 __asm__
volatile(
"wfi");
241 uint32_t cpuclk0_hz = 0U;
276 if (s == (
const char*)0) {
283#ifndef RA8_OFF_TARGET
351 size_t* output_length)
354 if (output ==
nullptr || output_length ==
nullptr) {
355 return PSA_ERROR_INVALID_ARGUMENT;
358 return PSA_ERROR_HARDWARE_FAILURE;
360 *output_length = output_size;
387 if ((n == 0U) || (size == 0U)) {
390 if (n > (SIZE_MAX / size)) {
393 const size_t total = n * size;
398 (void)
memset((
void*)p, 0, total);
417 (void)tx_byte_release(p);
437 if (buf ==
nullptr || len == 0U) {
440 NX_PACKET* pkt = NX_NULL;
441 UINT s = nx_packet_allocate(&
s_packet_pool, &pkt, NX_TCP_PACKET, NX_WAIT_FOREVER);
442 if (s != NX_SUCCESS || pkt == NX_NULL) {
443 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
446 nx_packet_data_append(pkt, (VOID*)(uintptr_t)buf, (
ULONG)len, &
s_packet_pool, NX_WAIT_FOREVER);
447 if (s != NX_SUCCESS) {
448 (void)nx_packet_release(pkt);
449 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
452 if (s != NX_SUCCESS) {
453 (void)nx_packet_release(pkt);
454 if (s == NX_NO_PACKET || s == NX_WINDOW_OVERFLOW) {
455 return MBEDTLS_ERR_SSL_WANT_WRITE;
457 return MBEDTLS_ERR_NET_SEND_FAILED;
480 if (buf ==
nullptr || len == 0U) {
483 NX_PACKET* pkt = NX_NULL;
485 if (s == NX_NO_PACKET) {
486 return MBEDTLS_ERR_SSL_WANT_READ;
488 if (s != NX_SUCCESS || pkt == NX_NULL) {
489 return MBEDTLS_ERR_NET_RECV_FAILED;
492 (void)nx_packet_data_retrieve(pkt, (VOID*)buf, &copied);
493 (void)nx_packet_release(pkt);
494 if (copied > (
ULONG)len) {
517 if (s != NX_SUCCESS) {
522 s = nx_ip_create(&
s_ip,
531 if (s != NX_SUCCESS) {
537 (void)nx_ip_interface_physical_address_set(&
s_ip, 0U, msw, lsw, NX_TRUE);
541 if (s != NX_SUCCESS) {
544 s = nx_tcp_enable(&
s_ip);
545 if (s != NX_SUCCESS) {
548 (void)nx_icmp_enable(&
s_ip);
550 (void)nx_ip_fragment_enable(&
s_ip);
566 UINT s = nx_tcp_socket_create(&
s_ip,
575 if (s != NX_SUCCESS) {
578 s = nx_tcp_client_socket_bind(&
s_tls_socket, NX_ANY_PORT, NX_WAIT_FOREVER);
579 if (s != NX_SUCCESS) {
628 if (got ==
nullptr || got_cap == 0U) {
667 demo_print((flags == 0U) ?
" verify=OK\r\n" :
" verify=UNVERIFIED\r\n");
734 if (psa_crypto_init() != PSA_SUCCESS) {
735 demo_print(
"[tls] psa_crypto_init failed\r\n");
738 demo_print(
"[tls] bringing NetX Duo up...\r\n");
743 demo_print(
"[tls] connecting to 192.168.1.1:4433\r\n");
766 (void)first_unused_memory;
774 nx_system_initialize();
801 demo_print(
"[tls] booting ThreadX + NetX Duo + ra8_tls...\r\n");
803#ifndef RA8_OFF_TARGET
void main(void)
Secure fallback main entry point.
static CHAR s_socket_name[]
demo_ip_octet_t
Octet indices into a packed IPv4 address.
@ k_demo_ip_oct_d
Demo IP oct d.
@ k_demo_ip_oct_c
Demo IP oct c.
@ k_demo_ip_oct_b
Demo IP oct b.
@ k_demo_ip_oct_a
Demo IP oct a.
demo_ipv4_t
Demo IPv4 addresses (board, gateway, host) as octet enums.
@ k_demo_ipaddr_0
192.168.1.42 board.
@ k_demo_ipaddr_2
Demo ipaddr 2.
@ k_demo_netmask_b
255.255.255.0 (first three octets).
@ k_demo_ipaddr_3
Demo ipaddr 3.
@ k_demo_ipaddr_1
Demo ipaddr 1.
static TX_THREAD s_demo_thread
demo_ip_shift_t
Bit shifts that pack a 4-octet IPv4 into NetX's ULONG.
@ k_demo_ip_shift_a
Demo IP shift a.
@ k_demo_ip_shift_d
Demo IP shift d.
@ k_demo_ip_shift_b
Demo IP shift b.
@ k_demo_ip_shift_c
Demo IP shift c.
demo_mac_word_shift_t
Shifts that pack the 6-byte MAC into msw/lsw ULONG pairs.
@ k_demo_mac_lsw_shift_b2
Demo MAC lsw shift b2.
@ k_demo_mac_lsw_shift_b4
Demo MAC lsw shift b4.
@ k_demo_mac_lsw_shift_b3
Demo MAC lsw shift b3.
@ k_demo_mac_lsw_shift_b5
Demo MAC lsw shift b5.
@ k_demo_mac_msw_shift_b0
Demo MAC msw shift b0.
@ k_demo_mac_msw_shift_b1
Demo MAC msw shift b1.
static ULONG s_ip_stack[k_demo_ip_stack/sizeof(ULONG)]
demo_mac_idx_t
MAC-address byte indices.
@ k_demo_mac_idx_0
Demo MAC index 0.
@ k_demo_mac_idx_3
Demo MAC index 3.
@ k_demo_mac_idx_5
Demo MAC index 5.
@ k_demo_mac_idx_2
Demo MAC index 2.
@ k_demo_mac_idx_1
Demo MAC index 1.
@ k_demo_mac_idx_4
Demo MAC index 4.
static NX_PACKET_POOL s_packet_pool
demo_config_t
Compile-time settings for the HTTPS client demo.
@ k_demo_recv_timeout
Ticks; ~2 s at TX_TIMER_TICKS_PER_SECOND=100.
@ k_demo_socket_ttl
Demo socket ttl.
@ k_demo_app_thread_pri
Demo app thread priority.
@ k_demo_thread_stack
Demo thread stack.
@ k_demo_handshake_max
Max ticks waiting for handshake.
@ k_demo_ip_thread_pri
Demo IP thread priority.
@ k_demo_packet_size
Demo packet size.
@ k_demo_byte_pool_size
Demo byte pool size.
@ k_demo_arp_cache
Demo arp cache.
@ k_demo_pool_bytes
Demo pool bytes.
@ k_demo_recv_window
Demo recv window.
@ k_demo_ip_stack
Demo IP stack.
static UCHAR s_byte_pool_memory[k_demo_byte_pool_size]
static UCHAR s_demo_stack[k_demo_thread_stack]
static TX_BYTE_POOL s_byte_pool
static NX_TCP_SOCKET s_tls_socket
static ULONG s_arp_cache[k_demo_arp_cache/sizeof(ULONG)]
static UCHAR s_pool_memory[k_demo_pool_bytes]
void tx_application_define(void *first_unused_memory)
ThreadX system-define hook: build worker thread + byte pool.
static void demo_print(const char *msg)
Print a NUL-terminated string on the demo's UART stream.
static void demo_setup_or_halt(void)
Bring up CGC + SysTick + the SCI8 console; halt forever on any failure.
static void demo_panic_halt(void)
Halt forever in WFI – used as a panic stop on init failure.
static UINT demo_tcp_connect(void)
Open a NetX TCP socket and connect to the TLS endpoint.
static void demo_free(void *p)
mbedtls_free hook backed by the ThreadX byte pool.
static ra8_err_t demo_exchange(ra8_tls_session_t session, uint8_t *got, size_t got_cap)
Send one record and read one back over the TLS session.
@ k_demo_gw_3
192.168.1.1 gateway + TLS endpoint.
static void demo_report(ra8_tls_session_t session)
Print the negotiated cipher + verification result to the console.
static const uint8_t k_demo_mask[4]
Subnet mask: 255.255.255.0.
static int tls_bio_recv(void *ctx, uint8_t *buf, size_t len)
ra8_tls BIO recv callback bound to nx_tcp_socket_receive.
static int tls_bio_send(void *ctx, const uint8_t *buf, size_t len)
ra8_tls BIO send callback bound to nx_tcp_socket_send.
psa_status_t mbedtls_psa_external_get_random(mbedtls_psa_external_random_context_t *context, uint8_t *output, size_t output_size, size_t *output_length)
PSA external RNG hook – feeds the RSIP TRNG straight into PSA.
static void * demo_calloc(size_t n, size_t size)
mbedtls_calloc hook backed by the ThreadX byte pool.
static const uint8_t k_demo_ip[4]
IPv4 address: 192.168.1.42.
static const uint8_t k_demo_mac[6]
Locally-administered unicast MAC for this board.
static ra8_err_t demo_handshake(ra8_tls_session_t session)
Drive the ra8_tls handshake to completion (bounded poll loop).
static void demo_pack_mac(ULONG *msw, ULONG *lsw)
Pack the local MAC into the msw/lsw fields NetX expects.
static const char k_demo_server_name[]
SNI hostname advertised in the ClientHello.
@ k_demo_io_max
Bounded send/recv poll count.
@ k_demo_mtu
#21 pinned link MTU.
@ k_demo_verify_unset
Fail-closed verify sentinel: nonzero until the getter fills it.
@ k_demo_line_buf
Result line buffer bytes.
@ k_demo_connect_ticks
Max ticks waiting for connect.
@ k_demo_record_cap
Inbound record buffer bytes.
@ k_demo_tls_port
Default TLS endpoint port.
static CHAR s_packet_pool_name[]
Persistent mutable names retained by NetX Duo and ThreadX objects.
static UINT demo_netx_bring_up(void)
Bring NetX Duo up: pool, IP, gateway, ARP, TCP, ICMP.
static ra8_err_t demo_run_tls(void)
Run the whole TLS session: open, handshake, exchange, report.
static ULONG demo_pack_ip(const uint8_t *octets)
Pack a 4-octet IPv4 array into NetX's host-order ULONG.
static CHAR s_thread_name[]
static void demo_thread_entry(ULONG thread_input)
ThreadX worker entry: PSA + NetX up, connect, run the TLS session.
static const uint8_t k_demo_gw[4]
Default gateway + TLS endpoint: 192.168.1.1.
static CHAR s_byte_pool_name[]
static const uint8_t k_demo_record[]
The one application record this demo sends after the handshake.
NetX Duo network driver shim that bridges onto the RA8 ra8_eth HAL.
void nx_ether_driver_ra8_eth_set_mac(const uint8_t mac[6])
Install the local MAC address used by the driver at NX_LINK_INITIALIZE.
void nx_ether_driver_ra8_eth(NX_IP_DRIVER *driver_req)
NetX Duo network-driver entry point bridging onto ra8_eth_*.
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_ethernet_init(void)
Bring up the on-board RGMII Ethernet PHY and RMAC1/ETHA1.
ra8_err_t ra8_board_uart_console_write(const uint8_t *data, size_t len)
Polled blocking write to the J-Link OB VCOM console.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
Boot entry points shared between a vector table and its startup code.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_get_clock_hz(ra8_clock_id_t id, uint32_t *out_hz)
Query the current frequency of a clock-tree domain.
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_would_block
Non-blocking operation would have blocked.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_timeout
Operation exceeded its time budget.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
size_t strlen(const char *s)
Calculate string length.
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Renesas Secure IP (RSIP-E50D) HAL driver – public API.
ra8_err_t ra8_rsip_init(const ra8_rsip_config_t *cfg)
Power on the RSIP engine and (optionally) run BIST.
ra8_err_t ra8_rsip_trng_read(uint8_t *buf, uint32_t len)
Drain len bytes from the RSIP true RNG – fail-closed, no backend.
SysTick-based tick counter, delay and timestamp helpers.
ra8_err_t ra8_time_init(uint32_t cpu_hz)
Initialise SysTick for a 1 kHz tick interrupt.
Tiny TLS facade over the vendored Mbed TLS 4.x stack.
ra8_err_t ra8_tls_get_verify_result(ra8_tls_session_t session, uint32_t *out_flags)
Report the peer-certificate verification result for a session.
struct ra8_tls_session_handle * ra8_tls_session_t
Opaque TLS session handle (typed pointer into the static pool).
ra8_err_t ra8_tls_send(ra8_tls_session_t session, const uint8_t *buf, size_t len, size_t *out_sent)
Encrypt and send application data.
ra8_err_t ra8_tls_recv(ra8_tls_session_t session, uint8_t *buf, size_t len, size_t *out_received)
Decrypt and receive application data.
@ k_ra8_tls_cipher_name_cap
Capacity (bytes) a caller must reserve for a cipher-suite name.
ra8_err_t ra8_tls_session_open(ra8_tls_session_t *out_session, const ra8_tls_session_cfg_t *cfg)
Allocate a TLS session from the static pool.
ra8_err_t ra8_tls_session_close(ra8_tls_session_t session)
Release a TLS session back to the pool.
@ k_ra8_tls_verify_optional
Verify but do not abort on failure.
ra8_err_t ra8_tls_handshake(ra8_tls_session_t session)
Iterative TLS handshake driver.
ra8_err_t ra8_tls_get_cipher_suite(ra8_tls_session_t session, uint16_t *out_id, char *out_name, size_t name_cap)
Report the negotiated cipher suite for a session.
ra8_err_t ra8_tls_mss_clamp(uint16_t mtu, uint16_t *out_mss)
Compute the TCP MSS that keeps a segment inside one MTU frame.
ra8_err_t ra8_tls_global_deinit(void)
Symmetric tear-down for ra8_tls_global_init.
ra8_err_t ra8_tls_global_init(void)
One-shot facade initialisation.
unsigned int UINT
ThreadX-compatible unsigned int (host stub).
char CHAR
ThreadX-compatible CHAR (host stub).
unsigned long ULONG
ThreadX-compatible unsigned long (host stub).
Opaque thread stand-in for the host build.
Initial configuration for ra8_rsip_init.
Per-session configuration handed to ra8_tls_session_open.