TPM closed system further efforts
This commit is contained in:
parent
5a7148cf39
commit
0e0117288f
76
src/tpm.c
76
src/tpm.c
|
|
@ -13,6 +13,12 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
static char* tts(int type) {
|
||||||
|
static char* stype[] = {"null", "entry", "exit", "single"};
|
||||||
|
if (type < 1 || type > 3) return stype[0];
|
||||||
|
else return stype[type];
|
||||||
|
}
|
||||||
|
|
||||||
int tpm_is_inside_zone(void* fc, tolling_info_t* ti) {
|
int tpm_is_inside_zone(void* fc, tolling_info_t* ti) {
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
|
|
@ -37,6 +43,15 @@ int tpm_pay(void* fc, tolling_info_t* info, void* security_socket, uint8_t* neig
|
||||||
facilities_t* facilities = (facilities_t*) fc;
|
facilities_t* facilities = (facilities_t*) fc;
|
||||||
tolling_t* tolling = (tolling_t*) &facilities->tolling;
|
tolling_t* tolling = (tolling_t*) &facilities->tolling;
|
||||||
|
|
||||||
|
const size_t buf_len = 2048;
|
||||||
|
uint8_t tpm_uper[buf_len];
|
||||||
|
uint8_t buf[buf_len];
|
||||||
|
|
||||||
|
if (!tolling->enabled) {
|
||||||
|
syslog_debug("[facilities] [tolling] tolling is disabled");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&facilities->epv.time.lock);
|
pthread_mutex_lock(&facilities->epv.time.lock);
|
||||||
tolling->tz = it2s_tender_get_now(TIME_MICROSECONDS) ;
|
tolling->tz = it2s_tender_get_now(TIME_MICROSECONDS) ;
|
||||||
pthread_mutex_unlock(&facilities->epv.time.lock);
|
pthread_mutex_unlock(&facilities->epv.time.lock);
|
||||||
|
|
@ -47,19 +62,10 @@ int tpm_pay(void* fc, tolling_info_t* info, void* security_socket, uint8_t* neig
|
||||||
SecurityReply_t* srep = NULL;
|
SecurityReply_t* srep = NULL;
|
||||||
FacilitiesIndication_t* fi = NULL;
|
FacilitiesIndication_t* fi = NULL;
|
||||||
|
|
||||||
const size_t buf_len = 2048;
|
|
||||||
uint8_t tpm_uper[buf_len];
|
|
||||||
uint8_t buf[buf_len];
|
|
||||||
|
|
||||||
if (!tolling->enabled) {
|
|
||||||
syslog_debug("[facilities] [tolling] tolling is disabled");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
tolling->station.obu.active = true;
|
tolling->station.obu.active = true;
|
||||||
tolling->station.obu.nonce = rand() + 1;
|
tolling->station.obu.nonce = rand() + 1;
|
||||||
|
|
||||||
syslog_info("[facilities] [tolling] issuing toll payment > client: %ld | nonce: %ld", tolling->station.obu.client_id, tolling->station.obu.nonce);
|
syslog_info("[facilities] [tolling] issuing toll %s.request | client: %ld nonce: %ld", tts(info->asn->tollType), tolling->station.obu.client_id, tolling->station.obu.nonce);
|
||||||
|
|
||||||
// TPM
|
// TPM
|
||||||
tpm = calloc(1, sizeof(TPM_t));
|
tpm = calloc(1, sizeof(TPM_t));
|
||||||
|
|
@ -101,15 +107,21 @@ int tpm_pay(void* fc, tolling_info_t* info, void* security_socket, uint8_t* neig
|
||||||
tpm->tpm->tollingType = calloc(1, sizeof(TollingType_t));
|
tpm->tpm->tollingType = calloc(1, sizeof(TollingType_t));
|
||||||
TollingType_t* type = tpm->tpm->tollingType;
|
TollingType_t* type = tpm->tpm->tollingType;
|
||||||
|
|
||||||
tolling->station.obu.toll_type = info->asn->tollType;
|
|
||||||
switch (info->asn->tollType) {
|
switch (info->asn->tollType) {
|
||||||
case TollType_entry:
|
case TollType_entry:
|
||||||
|
if (tolling->station.obu.toll_type != -1) {
|
||||||
|
syslog_err("[facilities] [tolling] trying to issue entry.request but current tolling state is %s",
|
||||||
|
tts(tolling->station.obu.toll_type));
|
||||||
|
rv = 1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
type->present = TollingType_PR_entry;
|
type->present = TollingType_PR_entry;
|
||||||
type->choice.entry.present = TollingEntry_PR_request;
|
type->choice.entry.present = TollingEntry_PR_request;
|
||||||
type->choice.entry.choice.request.clientId = tolling->station.obu.client_id;
|
type->choice.entry.choice.request.clientId = tolling->station.obu.client_id;
|
||||||
type->choice.entry.choice.request.infoId = info->asn->id;
|
type->choice.entry.choice.request.infoId = info->asn->id;
|
||||||
type->choice.entry.choice.request.transactionNonce = tolling->station.obu.nonce;
|
type->choice.entry.choice.request.transactionNonce = tolling->station.obu.nonce;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TollType_exit:
|
case TollType_exit:
|
||||||
type->present = TollingType_PR_exit;
|
type->present = TollingType_PR_exit;
|
||||||
type->choice.exit = calloc(1, sizeof(TollingExit_t));
|
type->choice.exit = calloc(1, sizeof(TollingExit_t));
|
||||||
|
|
@ -118,15 +130,29 @@ int tpm_pay(void* fc, tolling_info_t* info, void* security_socket, uint8_t* neig
|
||||||
type->choice.exit->choice.request->clientId = tolling->station.obu.client_id;
|
type->choice.exit->choice.request->clientId = tolling->station.obu.client_id;
|
||||||
type->choice.exit->choice.request->infoId = info->asn->id;
|
type->choice.exit->choice.request->infoId = info->asn->id;
|
||||||
type->choice.exit->choice.request->transactionNonce = tolling->station.obu.nonce;
|
type->choice.exit->choice.request->transactionNonce = tolling->station.obu.nonce;
|
||||||
|
|
||||||
|
if (tolling->station.obu.toll_type != TollingType_PR_entry) {
|
||||||
|
syslog_err("[facilities] [tolling] trying to issue exit.request but current tolling state is %s - will not provide entry proof",
|
||||||
|
tts(tolling->station.obu.toll_type));
|
||||||
|
} else {
|
||||||
uint8_t b_tep[1024];
|
uint8_t b_tep[1024];
|
||||||
asn_enc_rval_t e_tep = uper_encode_to_buffer(&asn_DEF_TPM, NULL, tolling->station.obu.entry_proof, b_tep, 1024);
|
asn_enc_rval_t e_tep = uper_encode_to_buffer(&asn_DEF_TPM, NULL, tolling->station.obu.entry_proof, b_tep, 1024);
|
||||||
if (e_tep.encoded == -1) {
|
if (e_tep.encoded == -1) {
|
||||||
syslog_err("[facilities] [tolling] error encoding TPM entry proof");
|
syslog_err("[facilities] [tolling] error encoding TPM entry proof");
|
||||||
return 1;
|
rv = 1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
uper_decode_complete(NULL, &asn_DEF_TPM, (void**) &type->choice.exit->choice.request->entryProof, b_tep, (e_tep.encoded+7)/8);
|
uper_decode_complete(NULL, &asn_DEF_TPM, (void**) &type->choice.exit->choice.request->entryProof, b_tep, (e_tep.encoded+7)/8);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TollType_single:
|
case TollType_single:
|
||||||
|
if (tolling->station.obu.toll_type != -1) {
|
||||||
|
syslog_err("[facilities] [tolling] trying to issue single.request but current tolling state is %s",
|
||||||
|
tts(tolling->station.obu.toll_type));
|
||||||
|
rv = 1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
type->present = TollingType_PR_single;
|
type->present = TollingType_PR_single;
|
||||||
type->choice.single.present = TollingSingle_PR_request;
|
type->choice.single.present = TollingSingle_PR_request;
|
||||||
type->choice.single.choice.request.clientId = tolling->station.obu.client_id;
|
type->choice.single.choice.request.clientId = tolling->station.obu.client_id;
|
||||||
|
|
@ -135,6 +161,8 @@ int tpm_pay(void* fc, tolling_info_t* info, void* security_socket, uint8_t* neig
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tolling->station.obu.toll_type = info->asn->tollType;
|
||||||
|
|
||||||
// Encode TollingPaymentMessage
|
// Encode TollingPaymentMessage
|
||||||
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TollingPaymentMessage, NULL, tpm->tpm, buf, buf_len);
|
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TollingPaymentMessage, NULL, tpm->tpm, buf, buf_len);
|
||||||
if (enc.encoded == -1) {
|
if (enc.encoded == -1) {
|
||||||
|
|
@ -411,7 +439,8 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
|
|
||||||
switch (tolling->protocol) {
|
switch (tolling->protocol) {
|
||||||
case TOLLING_PROTOCOL_SIMPLE:
|
case TOLLING_PROTOCOL_SIMPLE:
|
||||||
syslog_info("[facilities] [tolling] received toll payment > client: %lld (certificate id: %02x%02x%02x) | nonce: %lld",
|
syslog_info("[facilities] [tolling] received toll %s.request | client: %lld (certificate id: 0x%02x%02x%02x) nonce: %lld",
|
||||||
|
tts(type_rx->present),
|
||||||
(long long) client_id,
|
(long long) client_id,
|
||||||
neighbour ? neighbour[5] : 0,
|
neighbour ? neighbour[5] : 0,
|
||||||
neighbour ? neighbour[6] : 0,
|
neighbour ? neighbour[6] : 0,
|
||||||
|
|
@ -420,7 +449,8 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case TOLLING_PROTOCOL_TLS:
|
case TOLLING_PROTOCOL_TLS:
|
||||||
syslog_info("[facilities] [tolling] received toll payment > client: %lld | nonce: %lld",
|
syslog_info("[facilities] [tolling] received toll %s.request | client: %lld nonce: %lld",
|
||||||
|
tts(type_rx->present),
|
||||||
(long long) client_id,
|
(long long) client_id,
|
||||||
(long long) nonce
|
(long long) nonce
|
||||||
);
|
);
|
||||||
|
|
@ -672,10 +702,10 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
memcpy(sreq->choice.tlsSend.data.buf, tpm_uper, tpm_uper_len);
|
memcpy(sreq->choice.tlsSend.data.buf, tpm_uper, tpm_uper_len);
|
||||||
id = rand() + 1;
|
id = rand() + 1;
|
||||||
// TODO handle various vehicles
|
// TODO handle various vehicles
|
||||||
if (!tolling->station.obu.tls_conn_id) {
|
if (!tolling->station.rsu.tls_conn_id) {
|
||||||
tolling->station.obu.tls_conn_id = id;
|
tolling->station.rsu.tls_conn_id = id;
|
||||||
}
|
}
|
||||||
sreq->choice.tlsSend.connId = tolling->station.obu.tls_conn_id;
|
sreq->choice.tlsSend.connId = tolling->station.rsu.tls_conn_id;
|
||||||
|
|
||||||
buf[0] = 4;
|
buf[0] = 4;
|
||||||
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sreq, buf+1, buf_len-1);
|
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sreq, buf+1, buf_len-1);
|
||||||
|
|
@ -803,7 +833,7 @@ static void veh_handle_recv(tolling_t* tolling, TPM_t* tpm_rx, void* security_so
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (tolling->station.obu.toll_type != TollingType_PR_entry) {
|
if (tolling->station.obu.toll_type != TollingType_PR_entry) {
|
||||||
syslog_err("[facilities] [tolling] received TPM (%d) is not expected toll type (%d)",
|
syslog_err("[facilities] [tolling] received TPM toll (%d) is not expected toll type (%d)",
|
||||||
TollingType_PR_entry, tolling->station.obu.toll_type);
|
TollingType_PR_entry, tolling->station.obu.toll_type);
|
||||||
}
|
}
|
||||||
client_id = type_rx->choice.entry.choice.reply.clientId;
|
client_id = type_rx->choice.entry.choice.reply.clientId;
|
||||||
|
|
@ -828,7 +858,7 @@ static void veh_handle_recv(tolling_t* tolling, TPM_t* tpm_rx, void* security_so
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (tolling->station.obu.toll_type != TollingType_PR_exit) {
|
if (tolling->station.obu.toll_type != TollingType_PR_exit) {
|
||||||
syslog_err("[facilities] [tolling] received TPM (%d) is not expected toll type (%d)",
|
syslog_err("[facilities] [tolling] received TPM toll (%d) is not expected toll type (%d)",
|
||||||
TollingType_PR_exit, tolling->station.obu.toll_type);
|
TollingType_PR_exit, tolling->station.obu.toll_type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -844,7 +874,7 @@ static void veh_handle_recv(tolling_t* tolling, TPM_t* tpm_rx, void* security_so
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (tolling->station.obu.toll_type != TollingType_PR_single) {
|
if (tolling->station.obu.toll_type != TollingType_PR_single) {
|
||||||
syslog_err("[facilities] [tolling] received TPM (%d) is not expected toll type (%d)",
|
syslog_err("[facilities] [tolling] received TPM type (%d) is not expected toll type (%d)",
|
||||||
TollingType_PR_single, tolling->station.obu.toll_type);
|
TollingType_PR_single, tolling->station.obu.toll_type);
|
||||||
}
|
}
|
||||||
client_id = type_rx->choice.single.choice.reply.clientId;
|
client_id = type_rx->choice.single.choice.reply.clientId;
|
||||||
|
|
@ -932,11 +962,11 @@ static void veh_handle_recv(tolling_t* tolling, TPM_t* tpm_rx, void* security_so
|
||||||
|
|
||||||
switch (type_rx->present) {
|
switch (type_rx->present) {
|
||||||
case TollingType_PR_entry:
|
case TollingType_PR_entry:
|
||||||
syslog_info("[facilities] [tolling] received entry tolling reply | client:%lld nonce:%ld accepted:%s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
syslog_info("[facilities] [tolling] received entry.reply | client: %lld nonce: %ld accepted: %s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TollingType_PR_exit:
|
case TollingType_PR_exit:
|
||||||
syslog_info("[facilities] [tolling] received exit tolling reply | client:%lld nonce:%ld accepted:%s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
syslog_info("[facilities] [tolling] received exit.reply | client: %lld nonce: %ld accepted: %s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
||||||
tolling->station.obu.toll_type = -1;
|
tolling->station.obu.toll_type = -1;
|
||||||
tolling->station.obu.active = false;
|
tolling->station.obu.active = false;
|
||||||
ASN_STRUCT_FREE(asn_DEF_TPM, tolling->station.obu.entry_proof);
|
ASN_STRUCT_FREE(asn_DEF_TPM, tolling->station.obu.entry_proof);
|
||||||
|
|
@ -944,7 +974,7 @@ static void veh_handle_recv(tolling_t* tolling, TPM_t* tpm_rx, void* security_so
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TollingType_PR_single:
|
case TollingType_PR_single:
|
||||||
syslog_info("[facilities] [tolling] received single tolling reply | client:%lld nonce:%ld accepted:%s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
syslog_info("[facilities] [tolling] received single.reply | client: %lld nonce: %ld accepted: %s", (long long) tolling->station.obu.client_id, tolling->station.obu.nonce, accepted ? "yes" : "no");
|
||||||
tolling->station.obu.toll_type = -1;
|
tolling->station.obu.toll_type = -1;
|
||||||
tolling->station.obu.active = false;
|
tolling->station.obu.active = false;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue