|
3 | 3 |
|
4 | 4 | #include "common.h" |
5 | 5 | #include "flash.h" |
| 6 | +#include "irq.h" |
6 | 7 | #include "memzero.h" |
7 | 8 | #include "secbool.h" |
8 | 9 |
|
@@ -263,15 +264,30 @@ static secbool se_transmit_mac_ex(uint8_t addr, uint8_t *session_key, |
263 | 264 |
|
264 | 265 | secbool se_transmit_mac(uint8_t ins, uint8_t p1, uint8_t p2, uint8_t *data, |
265 | 266 | uint16_t data_len, uint8_t *recv, uint16_t *recv_len) { |
266 | | - return se_transmit_mac_ex(THD89_MASTER_ADDRESS, se_session_key, ins, p1, p2, |
267 | | - data, data_len, recv, recv_len); |
| 267 | + uint32_t irq = disable_irq(); |
| 268 | + thd89_irq_nest++; |
| 269 | + secbool result = se_transmit_mac_ex(THD89_MASTER_ADDRESS, se_session_key, ins, |
| 270 | + p1, p2, data, data_len, recv, recv_len); |
| 271 | + thd89_irq_nest--; |
| 272 | + if (thd89_irq_nest == 0) { |
| 273 | + enable_irq(irq); |
| 274 | + } |
| 275 | + return result; |
268 | 276 | } |
269 | 277 |
|
270 | 278 | secbool se_fp_transmit_mac(uint8_t ins, uint8_t p1, uint8_t p2, uint8_t *data, |
271 | 279 | uint16_t data_len, uint8_t *recv, |
272 | 280 | uint16_t *recv_len) { |
273 | | - return se_transmit_mac_ex(THD89_FINGER_ADDRESS, se_fp_session_key, ins, p1, |
274 | | - p2, data, data_len, recv, recv_len); |
| 281 | + uint32_t irq = disable_irq(); |
| 282 | + thd89_irq_nest++; |
| 283 | + secbool result = |
| 284 | + se_transmit_mac_ex(THD89_FINGER_ADDRESS, se_fp_session_key, ins, p1, p2, |
| 285 | + data, data_len, recv, recv_len); |
| 286 | + thd89_irq_nest--; |
| 287 | + if (thd89_irq_nest == 0) { |
| 288 | + enable_irq(irq); |
| 289 | + } |
| 290 | + return result; |
275 | 291 | } |
276 | 292 |
|
277 | 293 | secbool se_random_encrypted(uint8_t *rand, uint16_t len) { |
@@ -1478,6 +1494,47 @@ secbool se_get_pin_passphrase_space(uint8_t *space) { |
1478 | 1494 | return sectrue; |
1479 | 1495 | } |
1480 | 1496 |
|
| 1497 | +secbool se_change_pin_passphrase_ex(uint8_t addr, uint8_t *session_key, |
| 1498 | + const char *old_pin, const char *new_pin) { |
| 1499 | + uint8_t buf[128]; |
| 1500 | + uint8_t resp[1]; |
| 1501 | + uint16_t resp_len = 1; |
| 1502 | + |
| 1503 | + if (strlen(old_pin) < 6 || strlen(old_pin) > PIN_MAX_LENGTH || |
| 1504 | + strlen(new_pin) < 6 || strlen(new_pin) > PIN_MAX_LENGTH) { |
| 1505 | + return secfalse; |
| 1506 | + } |
| 1507 | + |
| 1508 | + buf[0] = strlen(old_pin); |
| 1509 | + memcpy(buf + 1, (uint8_t *)old_pin, strlen(old_pin)); |
| 1510 | + buf[1 + strlen(old_pin)] = strlen(new_pin); |
| 1511 | + memcpy(buf + 1 + strlen(old_pin) + 1, (uint8_t *)new_pin, strlen(new_pin)); |
| 1512 | + |
| 1513 | + if (!se_transmit_mac_ex(addr, session_key, SE_INS_PIN, 0x00, 0x0E, buf, |
| 1514 | + 1 + strlen(old_pin) + 1 + strlen(new_pin), resp, |
| 1515 | + &resp_len)) { |
| 1516 | + return secfalse; |
| 1517 | + } |
| 1518 | + if (resp[0] == PIN_SUCCESS) { |
| 1519 | + return sectrue; |
| 1520 | + } |
| 1521 | + return secfalse; |
| 1522 | +} |
| 1523 | + |
| 1524 | +secbool se_change_pin_passphrase(const char *old_pin, const char *new_pin) { |
| 1525 | + secbool result = se_change_pin_passphrase_ex( |
| 1526 | + THD89_MASTER_ADDRESS, se_session_key, old_pin, new_pin); |
| 1527 | + if (result == sectrue) { |
| 1528 | + secbool fp_result = se_change_pin_passphrase_ex( |
| 1529 | + THD89_FINGER_ADDRESS, se_fp_session_key, old_pin, new_pin); |
| 1530 | + if (fp_result == sectrue) { |
| 1531 | + return sectrue; |
| 1532 | + } |
| 1533 | + return secfalse; |
| 1534 | + } |
| 1535 | + return secfalse; |
| 1536 | +} |
| 1537 | + |
1481 | 1538 | pin_result_t se_get_pin_result_type(void) { return pin_result_type; } |
1482 | 1539 | pin_result_t se_get_pin_passphrase_ret(void) { return pin_passphrase_ret; } |
1483 | 1540 |
|
@@ -1959,6 +2016,14 @@ secbool se_session_get_type(uint8_t *type) { |
1959 | 2016 | return sectrue; |
1960 | 2017 | } |
1961 | 2018 |
|
| 2019 | +secbool se_session_get_current_id(uint8_t id[32]) { |
| 2020 | + uint16_t recv_len = 32; |
| 2021 | + if (!se_transmit_mac(SE_INS_SESSION, 0x00, 0x0A, NULL, 0, id, &recv_len)) { |
| 2022 | + return secfalse; |
| 2023 | + } |
| 2024 | + return sectrue; |
| 2025 | +} |
| 2026 | + |
1962 | 2027 | secbool se_node_sign_digest(const uint8_t *hash, uint8_t *sig, uint8_t *by) { |
1963 | 2028 | uint8_t resp[68]; |
1964 | 2029 | uint16_t resp_len = sizeof(resp); |
|
0 commit comments