From 7abfff4095c3d2eae9eb85d243e3ea7f1a030a33 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 19:19:15 +0100 Subject: [PATCH] moved and unified some reverse array fct --- client/src/cmdhf15.c | 38 ++++++++++------------------------ client/src/mifare/mifarehost.c | 22 +++++++++++--------- client/src/util.c | 1 - common/commonutil.c | 24 +++++++++++++++++++++ common/commonutil.h | 4 ++++ 5 files changed, 51 insertions(+), 38 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index d1b7289e8..c80f8cac4 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -223,16 +223,6 @@ static const productName_t uidmapping[] = { { 0, 0, "no tag-info available" } // must be the last entry }; -static inline void reverse(uint8_t *buff, uint8_t length) { - uint8_t upper_bound = (length % 2 == 0) ? length / 2 : (length / 2) + 1; - uint8_t tmp = 0; - for (int start = 0, end = length - 1; end >= upper_bound; ++start, --end) { - tmp = buff[end]; - buff[end] = buff[start]; - buff[start] = tmp; - } -} - static int CmdHF15Help(const char *Cmd); static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { @@ -287,16 +277,14 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { } }; */ - uint8_t i; - uint8_t revuid[8]; - for (i = 0; i < sizeof(revuid); i++) { - revuid[i] = uid[7 - i]; - } - uint8_t revsign[32]; - for (i = 0; i < sizeof(revsign); i++) { - revsign[i] = signature[31 - i]; - } + uint8_t revuid[8] = {0}; + reverse_array_copy(uid, sizeof(revuid), revuid); + + uint8_t revsign[32] = {0}; + reverse_array_copy(signature, sizeof(revsign), revsign); + + uint8_t i; int reason = 0; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_15693_public_keys); i++) { @@ -1823,7 +1811,7 @@ static int CmdHF15Readmulti(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -1953,7 +1941,7 @@ static int CmdHF15Readblock(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -2129,7 +2117,7 @@ static int CmdHF15Write(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -2356,11 +2344,7 @@ static int CmdHF15CSetUID(const char *Cmd) { // reverse cardUID to compare uint8_t revuid[8] = {0}; - uint8_t i = 0; - while (i < sizeof(revuid)) { - revuid[i] = carduid[7 - i]; - i++; - } + reverse_array_copy(carduid, sizeof(carduid), revuid); if (memcmp(revuid, payload.uid, 8) != 0) { PrintAndLogEx(FAILED, "setting new UID ( " _RED_("fail") " )"); diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 56d10c608..fe2cd1897 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1493,13 +1493,9 @@ const char *vigik_get_service(uint16_t service_code) { return vigik_rsa_pk[ARRAYLEN(vigik_rsa_pk) - 1].desc; } -static void reverse_array(const uint8_t *src, int src_len, uint8_t *dest) { - for (int i = 0; i < src_len; i++) { - dest[i] = src[(src_len - 1) - i]; - } -}; int vigik_verify(mfc_vigik_t *d) { +#define PUBLIC_VIGIK_KEYLEN 128 // iso9796 // Exponent V = 2 @@ -1512,8 +1508,18 @@ int vigik_verify(mfc_vigik_t *d) { PrintAndLogEx(INFO, "Raw signature"); print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); } + +/* + int dl = 0; + + param_gethex_to_eol("1C07D46DA3849326D24B3468BD76673F4F3C41827DC413E81E4F3C7804FAC727213059B21D047510D6432448643A92EBFC67FBEDDAB468D13D948B172F5EBC79A0E3FEFDFAF4E81FC7108E070F1E3CD0", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + + param_gethex_to_eol("1AB86FE0C17FFFFE4379D5E15A4B2FAFFEFCFA0F1F3F7FA03E7DDDF1E3C78FFFB1F0E23F7FFF51584771C5C18307FEA36CA74E60AA6B0409ACA66A9EC155F4E9112345708A2B8457E722608EE1157408", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + signature_len = dl; + */ + uint8_t rev_sig[128]; - reverse_array(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); + reverse_array_copy(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); PrintAndLogEx(INFO, "Raw signature reverse"); print_hex_noascii_break(rev_sig, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); @@ -1532,10 +1538,6 @@ int vigik_verify(mfc_vigik_t *d) { // sha1 hash H = 20 bytes, 160 bits // padding = 20 bytes, 96 bits - -// ref: MIFARE Classic EV1 Originality Signature Validation -#define PUBLIC_VIGIK_KEYLEN 128 - uint8_t i; bool is_valid = false; diff --git a/client/src/util.c b/client/src/util.c index b13c5e3a9..ea33de446 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -300,7 +300,6 @@ void print_hex_noascii_break(const uint8_t *data, const size_t len, uint8_t brea } } - static void print_buffer_ex(const uint8_t *data, const size_t len, int level, uint8_t breaks) { // sanity checks diff --git a/common/commonutil.c b/common/commonutil.c index 601dc20e4..c346d7bf7 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -269,3 +269,27 @@ uint16_t get_sw(const uint8_t *d, uint16_t n) { n -= 2; return (d[n] << 8 | d[n + 1]); } + +// reverse same array +void reverse_array(uint8_t *d, size_t n) { + if (d == NULL || n < 2) { + return; + } + + for (int i = 0, j = n - 1; i < j; ++i, --j) { + d[i] ^= d[j]; + d[j] ^= d[i]; + d[i] ^= d[j]; + } +} + +// reverse src array into dest array +void reverse_array_copy(const uint8_t *src, int src_len, uint8_t *dest) { + if (src == NULL || src_len == 0 || dest == NULL) { + return; + } + + for (int i = 0; i < src_len; i++) { + dest[i] = src[(src_len - 1) - i]; + } +} \ No newline at end of file diff --git a/common/commonutil.h b/common/commonutil.h index 8e800f25f..7beb95355 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -86,4 +86,8 @@ uint32_t rotl(uint32_t a, uint8_t n); uint32_t rotr(uint32_t a, uint8_t n); uint16_t get_sw(const uint8_t *d, uint16_t n); + +void reverse_array(uint8_t *d, size_t n); +void reverse_array_copy(const uint8_t *src, int src_len, uint8_t *dest); + #endif