moved and unified some reverse array fct

This commit is contained in:
iceman1001 2023-03-05 19:19:15 +01:00
parent 32a06758bb
commit 7abfff4095
5 changed files with 51 additions and 38 deletions

View file

@ -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") " )");

View file

@ -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;

View file

@ -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

View file

@ -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];
}
}

View file

@ -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