13#include "rte/oal/log/rte_log.h"
14#include "km114/km114.h"
45static void install_kmac(
const uint8_t kmac[KM114_MAC_KEY_LEN], uint32_t snum,
const char *role_tag,
55 if ((bytes == NULL) || (km114_decode_header(bytes, len, &hdr) != KM114_STATUS_OK))
57 rte_log_write_event(RTE_LOG_LEVEL_WARNING,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
58 "malformed message header", NULL);
62 switch (hdr.message_type)
64 case KM114_MSG_INSTALL_TRANSPORT_KEY:
67 case KM114_MSG_ADD_AUTHENTICATION_KEY:
74 (void)snprintf(info,
sizeof(info),
"type=0x%02X", (
unsigned int)hdr.message_type);
75 rte_log_write_event(RTE_LOG_LEVEL_INFO,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
76 "message received, not acted on", info);
85 if ((payload == NULL) || (size < (4U + (
size_t)KM114_MAC_KEY_LEN)))
89 s_peer_snum = ((uint32_t)payload[0] << 24) | ((uint32_t)payload[1] << 16) |
90 ((uint32_t)payload[2] << 8) | (uint32_t)payload[3];
91 (void)memcpy(
s_peer_kmac, &payload[4], (
size_t)KM114_MAC_KEY_LEN);
102 km114_install_transport_key_t body;
104 if (km114_parse_install_transport_key(bytes, len, &hdr, &body) != KM114_STATUS_OK)
106 rte_log_write_event(RTE_LOG_LEVEL_WARNING,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
107 "INSTALL_TRANSPORT_KEY MAC/parse failed", NULL);
110 (void)memcpy(
s_ktrans1, body.ktrans1, KM114_MAC_KEY_LEN);
111 (void)memcpy(
s_ktrans2, body.ktrans2, KM114_MAC_KEY_LEN);
117 (void)snprintf(info,
sizeof(info),
"snum=%u", (
unsigned int)body.new_kt_snum);
118 rte_log_write_event(RTE_LOG_LEVEL_INFO,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
119 "KTRANS1/KTRANS2 installed", info);
130 uint16_t installed = 0U;
133 for (i = 0U; (i < ks->peer_num) && (i < (uint16_t)KM114_MAX_PEERS); i++)
140 (void)snprintf(info,
sizeof(info),
"snum=%u peers=%u installed=%u", (
unsigned int)ks->snum,
141 (
unsigned int)ks->peer_num, (
unsigned int)installed);
142 rte_log_write_event((installed == ks->peer_num) ? RTE_LOG_LEVEL_INFO : RTE_LOG_LEVEL_WARNING,
144 "KMAC installed for the train-link safe connection", info);
152 uint8_t kmac[KM114_MAC_KEY_LEN];
156 rte_log_write_event(RTE_LOG_LEVEL_WARNING,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
157 "ADD_AUTHENTICATION_KEY dropped - no KTRANS held", NULL);
160 if (km114_parse_add_authentication_key(bytes, len,
s_ktrans1, &hdr, &ks) != KM114_STATUS_OK)
162 rte_log_write_event(RTE_LOG_LEVEL_WARNING,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
163 "ADD_AUTHENTICATION_KEY MAC/parse failed", NULL);
166 km114_decrypt_kmac(
s_ktrans2, ks.enc_kmac, kmac);
169 (void)memset(kmac, 0,
sizeof(kmac));
185 frame[1] = (uint8_t)(snum >> 24);
186 frame[2] = (uint8_t)(snum >> 16);
187 frame[3] = (uint8_t)(snum >> 8);
188 frame[4] = (uint8_t)snum;
189 (void)memcpy(&frame[5], kmac, (
size_t)KM114_MAC_KEY_LEN);
207 (void)snprintf(info,
sizeof(info),
"snum=%u", (
unsigned int)
s_own_snum);
210 rte_log_write_event(RTE_LOG_LEVEL_INFO,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
211 "KMAC cross-check with A/B sibling: MATCH", info);
216 rte_log_write_event(RTE_LOG_LEVEL_WARNING,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
217 "KMAC cross-check with A/B sibling: MISMATCH", info);
223static void install_kmac(
const uint8_t kmac[KM114_MAC_KEY_LEN], uint32_t snum,
const char *role_tag,
226 const char *out_path = getenv(
"RTE_KM114_KMAC_OUT_FILE");
232 (void)memcpy(
s_own_kmac, kmac, (
size_t)KM114_MAC_KEY_LEN);
237 (void)snprintf(info,
sizeof(info),
"snum=%u", (
unsigned int)snum);
239 if ((out_path == NULL) || (out_path[0] ==
'\0'))
244 rte_log_write_event(RTE_LOG_LEVEL_INFO,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
245 "KMAC decoded, RTE_KM114_KMAC_OUT_FILE unset - not installed", info);
250 FILE *fp = fopen(out_path,
"w");
255 rte_log_write_event(RTE_LOG_LEVEL_ERROR,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
256 "KMAC decoded, keys.kmac_file open failed", info);
259 for (i = 0U; i < (size_t)KM114_MAC_KEY_LEN; i++)
261 (void)fprintf(fp,
"%02x", (
unsigned int)kmac[i]);
263 (void)fprintf(fp,
"\n");
267 rte_log_write_event(RTE_LOG_LEVEL_INFO,
site_config_name(site), 0U, role_tag,
"-",
"KM114_CLIENT",
268 "KMAC installed", info);
rte_status_t ab_gp_channel_send_peer(ab_gp_channel_handle_t handle, const uint8_t *bytes, size_t size)
Sends a frame over the A<->B peer channel.
struct ab_gp_channel_context_s * ab_gp_channel_handle_t
Opaque handle over this component's own static per-process context.
#define PEER_WIRE_FRAME_SIZE
#define PEER_MSG_KIND_KM114_DIGEST
static uint8_t s_own_kmac[KM114_MAC_KEY_LEN]
static uint32_t s_own_snum
static uint8_t s_peer_kmac[KM114_MAC_KEY_LEN]
static int km114_cross_check(const char *role_tag, rte_example_site_t site)
static void handle_install_transport_key(const uint8_t *bytes, size_t len, const char *role_tag, rte_example_site_t site)
static void install_train_link_keys(const km114_kstruct_t *ks, const uint8_t kmac[KM114_MAC_KEY_LEN], const char *role_tag, rte_example_site_t site)
static void install_kmac(const uint8_t kmac[KM114_MAC_KEY_LEN], uint32_t snum, const char *role_tag, rte_example_site_t site, ab_gp_channel_handle_t handle)
static uint8_t s_ktrans1[KM114_MAC_KEY_LEN]
void ab_gp_km114_client_on_message(const uint8_t *bytes, size_t len, const char *role_tag, rte_example_site_t site, ab_gp_channel_handle_t handle)
Processes one complete, reassembled Subset-114 message.
static uint32_t s_peer_snum
static void send_km114_digest(ab_gp_channel_handle_t handle, uint32_t snum, const uint8_t kmac[KM114_MAC_KEY_LEN])
static bool s_have_ktrans
int ab_gp_km114_client_on_peer_digest(const uint8_t *payload, size_t size, const char *role_tag, rte_example_site_t site)
Consumes a PEER_MSG_KIND_KM114_DIGEST frame from the A/B sibling (called from pre_execute....
static void handle_add_authentication_key(const uint8_t *bytes, size_t len, const char *role_tag, rte_example_site_t site, ab_gp_channel_handle_t handle)
static uint8_t s_ktrans2[KM114_MAC_KEY_LEN]
A/B-side Subset-114 KMC message decoder - step 2 of Platform_Protocol_KM114's "Consumption design" (s...
bool ab_gp_saf_keys_install(uint32_t peer_etcs_id, const uint8_t kmac[SAFECOMM_MAC_KEY_LEN])
Installs (or replaces) the KMAC for one train ETCS identity.
Train link safe communication (Subset-037 SaF) terminated inside A and B - REQ-SC-001,...
const char * site_config_name(rte_example_site_t site)