14#include <mbedtls/config.h>
15#include <mbedtls/platform.h>
16#include <mbedtls/pk.h>
17#include <mbedtls/rsa.h>
18#include <mbedtls/sha256.h>
19#include <mbedtls/error.h>
22#if defined(UDS_TP_ISOTP_SOCK)
24#elif defined(UDS_TP_ISOTP_C_SOCKETCAN)
27#error "no transport defined"
29static bool done =
false;
30static uint8_t seed[32] = {0};
32void sigint_handler(
int signum) {
33 printf(
"SIGINT received\n");
37int rsa_verify(
const uint8_t *key,
size_t key_len,
bool *valid) {
39 mbedtls_pk_context pk;
40 const char *pubkey =
"public_key.pem";
43 if ((ret = mbedtls_pk_parse_public_keyfile(&pk, pubkey) != 0)) {
44 mbedtls_printf(
" failed\n ! Could not read key from '%s'\n", pubkey);
45 mbedtls_printf(
" ! mbedtls_pk_parse_public_keyfile returned %d\n\n", ret);
49 if ((ret = mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256, seed,
sizeof(seed), key, key_len)) != 0) {
50 mbedtls_printf(
" failed\n ! mbedtls_pk_verify returned %d\n\n", ret);
59 mbedtls_strerror(ret, buf,
sizeof(buf));
60 printf(
"mbedtls error: %s\n", buf);
66 UDS_LOGI(__FILE__,
"Server event: %s (%d)", UDSEventToStr(ev), ev);
70 UDS_LOGI(__FILE__,
"Generating seed for level %d", req->level);
72 FILE *f = fopen(
"/dev/urandom",
"r");
74 UDS_LOGE(__FILE__,
"Failed to open /dev/urandom");
75 return UDS_NRC_GeneralReject;
77 fread(seed,
sizeof(seed), 1, f);
79 return req->
copySeed(srv, seed,
sizeof(seed));
85 UDS_LOGI(__FILE__,
"Validating key, level=%d, len=%u", req->level, req->
len);
87 if (0 != rsa_verify(req->
key, req->
len, &valid)) {
88 UDS_LOGE(__FILE__,
"rsa_verify failed");
89 return UDS_NRC_GeneralReject;
92 UDS_LOGI(__FILE__,
"Security level %d unlocked", req->level);
93 return UDS_PositiveResponse;
95 UDS_LOGE(__FILE__,
"Security access denied");
96 return UDS_NRC_SecurityAccessDenied;
101 UDS_LOGW(__FILE__,
"Unhandled event: %d", ev);
106static int sleep_ms(uint32_t tms) {
109 ts.tv_sec = tms / 1000;
110 ts.tv_nsec = (tms % 1000) * 1000000;
112 ret = nanosleep(&ts, &ts);
113 }
while (ret && errno == EINTR);
117int main(
int ac,
char **av) {
119 memset(&sa, 0,
sizeof(sa));
120 sa.sa_handler = sigint_handler;
121 sigaction(SIGINT, &sa, NULL);
123#if defined(UDS_TP_ISOTP_SOCK)
124 if (UDSTpIsoTpSockInitServer(&tp,
"vcan0", 0x7E0, 0x7E8, 0x7DF)) {
125 fprintf(stderr,
"UDSTpIsoTpSockInitServer failed\n");
128#elif defined(UDS_TP_ISOTP_C_SOCKETCAN)
129 if (UDSTpISOTpCInit((
UDSTpISOTpC_t *)&tp,
"vcan0", 0x7E0, 0x7E8, 0x7DF, 0x7FF)) {
130 fprintf(stderr,
"UDSTpISOTpCInit failed\n");
134#error "no transport defined"
137 if (UDSServerInit(&srv)) {
138 fprintf(stderr,
"UDSServerInit failed\n");
144 printf(
"server up, polling . . .\n");
149 printf(
"server exiting\n");
ISO14229-1 (UDS) library.
@ UDS_EVT_SecAccessRequestSeed
@ UDS_EVT_SecAccessValidateKey
Security access request seed arguments.
uint8_t(* copySeed)(UDSServer_t *srv, const void *src, uint16_t len)
Security access validate key arguments.
UDSErr_t(* fn)(struct UDSServer *srv, UDSEvent_t event, void *arg)