From cf81a82645de336464bfad944945d7c98cf072f1 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 4 Apr 2022 15:48:04 +0200 Subject: [PATCH] Added a new custom APDU (88h) for setting and retrieving datetime. Signed-off-by: Pol Henarejos --- src/hsm/hsm2040.c | 17 ++++++++++++++++- src/hsm/sc_hsm.c | 39 +++++++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/hsm/hsm2040.c b/src/hsm/hsm2040.c index 228b1d5..93d2cd6 100644 --- a/src/hsm/hsm2040.c +++ b/src/hsm/hsm2040.c @@ -1605,6 +1605,21 @@ void led_off_all() #endif } +void init_rtc() { + + rtc_init(); + datetime_t dt = { + .year = 2020, + .month = 1, + .day = 1, + .dotw = 3, // 0 is Sunday, so 5 is Friday + .hour = 00, + .min = 00, + .sec = 00 + }; + rtc_set_datetime(&dt); +} + extern void neug_task(); pico_unique_board_id_t unique_id; @@ -1641,7 +1656,7 @@ int main(void) low_flash_init(); - rtc_init(); + init_rtc(); while (1) { diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index 21c6ee6..24a0c3c 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -1717,18 +1717,33 @@ static int cmd_derive_asym() { static int cmd_datetime() { if (P1(apdu) != 0x0 || P2(apdu) != 0x0) return SW_INCORRECT_P1P2(); - if (apdu.cmd_apdu_data_len != 8) - return SW_WRONG_LENGTH(); - datetime_t dt; - dt.year = (apdu.cmd_apdu_data[0] << 8) | (apdu.cmd_apdu_data[1]); - dt.month = apdu.cmd_apdu_data[2]; - dt.day = apdu.cmd_apdu_data[3]; - dt.dotw = apdu.cmd_apdu_data[4]; - dt.hour = apdu.cmd_apdu_data[5]; - dt.min = apdu.cmd_apdu_data[6]; - dt.sec = apdu.cmd_apdu_data[7]; - if (!rtc_set_datetime(&dt)) - return SW_WRONG_DATA(); + if (apdu.cmd_apdu_data_len == 0) { + datetime_t dt; + if (!rtc_get_datetime(&dt)) + return SW_EXEC_ERROR(); + res_APDU[res_APDU_size++] = dt.year >> 8; + res_APDU[res_APDU_size++] = dt.year & 0xff; + res_APDU[res_APDU_size++] = dt.month; + res_APDU[res_APDU_size++] = dt.day; + res_APDU[res_APDU_size++] = dt.dotw; + res_APDU[res_APDU_size++] = dt.hour; + res_APDU[res_APDU_size++] = dt.min; + res_APDU[res_APDU_size++] = dt.sec; + } + else { + if (apdu.cmd_apdu_data_len != 8) + return SW_WRONG_LENGTH(); + datetime_t dt; + dt.year = (apdu.cmd_apdu_data[0] << 8) | (apdu.cmd_apdu_data[1]); + dt.month = apdu.cmd_apdu_data[2]; + dt.day = apdu.cmd_apdu_data[3]; + dt.dotw = apdu.cmd_apdu_data[4]; + dt.hour = apdu.cmd_apdu_data[5]; + dt.min = apdu.cmd_apdu_data[6]; + dt.sec = apdu.cmd_apdu_data[7]; + if (!rtc_set_datetime(&dt)) + return SW_WRONG_DATA(); + } return SW_OK(); }