From 0f5c6005d1413b9a5dfcd2a03364f1df317787a6 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Fri, 28 Jan 2022 17:30:31 +0200 Subject: [PATCH] transactions --- client/src/cipurse/cipursecore.c | 13 +++++++++++++ client/src/cipurse/cipursecore.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/client/src/cipurse/cipursecore.c b/client/src/cipurse/cipursecore.c index 956b220f7..357cf9645 100644 --- a/client/src/cipurse/cipursecore.c +++ b/client/src/cipurse/cipursecore.c @@ -173,6 +173,7 @@ int CIPURSESelectMF(uint8_t *result, size_t max_result_len, size_t *result_len, } int CIPURSESelectFileEx(bool activate_field, bool leave_field_on, uint16_t fileid, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw) { + CipurseCClearContext(&cipurseContext); uint8_t fileIdBin[] = {fileid >> 8, fileid & 0xff}; return CIPURSEExchangeEx(activate_field, leave_field_on, (sAPDU_t) {0x00, 0xa4, 0x00, 0x00, 02, fileIdBin}, true, 0, result, max_result_len, result_len, sw); } @@ -200,6 +201,18 @@ int CIPURSEUpdateBinary(uint16_t offset, uint8_t *data, uint16_t datalen, uint8_ return CIPURSEExchange((sAPDU_t) {0x00, 0xd6, (offset >> 8) & 0x7f, offset & 0xff, datalen, data}, result, max_result_len, result_len, sw); } +int CIPURSECommitTransaction(uint16_t *sw) { + uint8_t result[APDU_RES_LEN] = {0}; + size_t result_len = 0; + return CIPURSEExchange((sAPDU_t) {0x80, 0x7e, 0x00, 0x00, 0, NULL}, result, sizeof(result), &result_len, sw); +} + +int CIPURSECancelTransaction(uint16_t *sw) { + uint8_t result[APDU_RES_LEN] = {0}; + size_t result_len = 0; + return CIPURSEExchange((sAPDU_t) {0x80, 0x7c, 0x00, 0x00, 0, NULL}, result, sizeof(result), &result_len, sw); +} + bool CIPURSEChannelAuthenticate(uint8_t keyindex, uint8_t *key, bool verbose) { uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; diff --git a/client/src/cipurse/cipursecore.h b/client/src/cipurse/cipursecore.h index cd7096205..6be49e74c 100644 --- a/client/src/cipurse/cipursecore.h +++ b/client/src/cipurse/cipursecore.h @@ -51,6 +51,9 @@ int CIPURSEReadFileAttributes(uint8_t *result, size_t max_result_len, size_t *re int CIPURSEReadBinary(uint16_t offset, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); int CIPURSEUpdateBinary(uint16_t offset, uint8_t *data, uint16_t datalen, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); +int CIPURSECommitTransaction(uint16_t *sw); +int CIPURSECancelTransaction(uint16_t *sw); + bool CIPURSEChannelAuthenticate(uint8_t keyindex, uint8_t *key, bool verbose); void CIPURSECSetActChannelSecurityLevels(CipurseChannelSecurityLevel req, CipurseChannelSecurityLevel resp);