Update the MifareDirection structure for consistency.

This commit is contained in:
Romain Tartiere 2010-12-18 03:11:05 +00:00
parent ebd98b32e0
commit b300ef5fcf
4 changed files with 22 additions and 25 deletions

View file

@ -115,9 +115,9 @@ uint8_t sector_0x00_crc8 (Mad mad);
uint8_t sector_0x10_crc8 (Mad mad); uint8_t sector_0x10_crc8 (Mad mad);
typedef enum { typedef enum {
MD_SEND, MCD_SEND,
MD_RECEIVE MCD_RECEIVE
} MifareDirection; } MifareCryptoDirection;
typedef enum { typedef enum {
MCO_ENCYPHER, MCO_ENCYPHER,
@ -146,7 +146,7 @@ typedef enum {
void *mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t offset, int communication_settings); void *mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t offset, int communication_settings);
void *mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int communication_settings); void *mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int communication_settings);
void mifare_cbc_des (MifareDESFireKey key, uint8_t *ivect, uint8_t *data, size_t data_size, MifareDirection direction, MifareCryptoOperation operation); void mifare_cbc_des (MifareDESFireKey key, uint8_t *ivect, uint8_t *data, size_t data_size, MifareCryptoDirection direction, MifareCryptoOperation operation);
void rol (uint8_t *data, const size_t len); void rol (uint8_t *data, const size_t len);
void desfire_crc32 (const uint8_t *data, const size_t len, uint8_t *crc); void desfire_crc32 (const uint8_t *data, const size_t len, uint8_t *crc);
void desfire_crc32_append (uint8_t *data, const size_t len); void desfire_crc32_append (uint8_t *data, const size_t len);

View file

@ -349,7 +349,7 @@ authenticate (MifareTag tag, uint8_t cmd, uint8_t key_no, MifareDESFireKey key)
uint8_t PICC_RndB[16]; uint8_t PICC_RndB[16];
memcpy (PICC_RndB, PICC_E_RndB, key_length); memcpy (PICC_RndB, PICC_E_RndB, key_length);
mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, PICC_RndB, key_length, MD_RECEIVE, MCO_DECYPHER); mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, PICC_RndB, key_length, MCD_RECEIVE, MCO_DECYPHER);
uint8_t PCD_RndA[16]; uint8_t PCD_RndA[16];
RAND_bytes (PCD_RndA, 16); RAND_bytes (PCD_RndA, 16);
@ -362,7 +362,7 @@ authenticate (MifareTag tag, uint8_t cmd, uint8_t key_no, MifareDESFireKey key)
memcpy (token, PCD_RndA, key_length); memcpy (token, PCD_RndA, key_length);
memcpy (token+key_length, PCD_r_RndB, key_length); memcpy (token+key_length, PCD_r_RndB, key_length);
mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, token, 2 * key_length, MD_SEND, (0x0A == cmd) ? MCO_DECYPHER : MCO_ENCYPHER); mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, token, 2 * key_length, MCD_SEND, (0x0A == cmd) ? MCO_DECYPHER : MCO_ENCYPHER);
BUFFER_INIT (cmd2, 33); BUFFER_INIT (cmd2, 33);
@ -376,7 +376,7 @@ authenticate (MifareTag tag, uint8_t cmd, uint8_t key_no, MifareDESFireKey key)
uint8_t PICC_RndA_s[16]; uint8_t PICC_RndA_s[16];
memcpy (PICC_RndA_s, PICC_E_RndA_s, key_length); memcpy (PICC_RndA_s, PICC_E_RndA_s, key_length);
mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, PICC_RndA_s, key_length, MD_RECEIVE, MCO_DECYPHER); mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, PICC_RndA_s, key_length, MCD_RECEIVE, MCO_DECYPHER);
uint8_t PCD_RndA_s[key_length]; uint8_t PCD_RndA_s[key_length];
memcpy (PCD_RndA_s, PCD_RndA, key_length); memcpy (PCD_RndA_s, PCD_RndA, key_length);

View file

@ -71,7 +71,7 @@
#define CMAC_LENGTH 8 #define CMAC_LENGTH 8
static void xor (const uint8_t *ivect, uint8_t *data, const size_t len); static void xor (const uint8_t *ivect, uint8_t *data, const size_t len);
static void mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareDirection direction, MifareCryptoOperation operation, size_t block_size); static void mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareCryptoDirection direction, MifareCryptoOperation operation, size_t block_size);
static void desfire_crc32_byte (uint32_t *crc, const uint8_t value); static void desfire_crc32_byte (uint32_t *crc, const uint8_t value);
static size_t key_macing_length (MifareDESFireKey key); static size_t key_macing_length (MifareDESFireKey key);
@ -114,7 +114,7 @@ cmac_generate_subkeys (MifareDESFireKey key)
uint8_t ivect[kbs]; uint8_t ivect[kbs];
bzero (ivect, kbs); bzero (ivect, kbs);
mifare_cbc_des (key, ivect, l, kbs, MD_RECEIVE, MCO_ENCYPHER); mifare_cbc_des (key, ivect, l, kbs, MCD_RECEIVE, MCO_ENCYPHER);
bool xor = false; bool xor = false;
@ -154,7 +154,7 @@ cmac (const MifareDESFireKey key, uint8_t *ivect, const uint8_t *data, size_t le
xor (key->cmac_sk1, buffer + len - kbs, kbs); xor (key->cmac_sk1, buffer + len - kbs, kbs);
} }
mifare_cbc_des (key, ivect, buffer, len, MD_SEND, MCO_ENCYPHER); mifare_cbc_des (key, ivect, buffer, len, MCD_SEND, MCO_ENCYPHER);
memcpy (cmac, ivect, kbs); memcpy (cmac, ivect, kbs);
@ -345,7 +345,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t o
// ... and 0 padding // ... and 0 padding
memset ((uint8_t *)res + *nbytes, 0, edl - *nbytes); memset ((uint8_t *)res + *nbytes, 0, edl - *nbytes);
mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *) res + offset, edl - offset, MD_SEND, MCO_ENCYPHER); mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *) res + offset, edl - offset, MCD_SEND, MCO_ENCYPHER);
memcpy (mac, (uint8_t *)res + edl - 8, 4); memcpy (mac, (uint8_t *)res + edl - 8, 4);
@ -433,7 +433,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t o
*nbytes = edl; *nbytes = edl;
mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *) res + offset, *nbytes - offset, MD_SEND, (key->type == T_3K3DES) ? MCO_ENCYPHER : MCO_DECYPHER); mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *) res + offset, *nbytes - offset, MCD_SEND, (key->type == T_3K3DES) ? MCO_ENCYPHER : MCO_DECYPHER);
break; break;
case T_AES: case T_AES:
@ -452,7 +452,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, off_t o
pdl = padded_data_length (*nbytes - offset, key_block_size (MIFARE_DESFIRE (tag)->session_key)); pdl = padded_data_length (*nbytes - offset, key_block_size (MIFARE_DESFIRE (tag)->session_key));
bzero ((uint8_t *)res + *nbytes, (offset + pdl) - (*nbytes)); bzero ((uint8_t *)res + *nbytes, (offset + pdl) - (*nbytes));
} }
mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *)res + offset, pdl, MD_SEND, MCO_ENCYPHER); mifare_cbc_des (key, MIFARE_DESFIRE (tag)->ivect, (uint8_t *)res + offset, pdl, MCD_SEND, MCO_ENCYPHER);
*nbytes = offset + pdl; *nbytes = offset + pdl;
break; break;
@ -509,10 +509,7 @@ mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int c
memcpy (edata, data, *nbytes - 1); memcpy (edata, data, *nbytes - 1);
memset ((uint8_t *)edata + *nbytes - 1, 0, edl - *nbytes + 1); memset ((uint8_t *)edata + *nbytes - 1, 0, edl - *nbytes + 1);
mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, edata, edl, MD_SEND, MCO_ENCYPHER); mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, edata, edl, MCD_SEND, MCO_ENCYPHER);
/* ,^^^^^^^
* No! This is not a typo! --------------------------------------------------------------'
*/
if (0 != memcmp ((uint8_t *)data + *nbytes - 1, (uint8_t *)edata + edl - 8, 4)) { if (0 != memcmp ((uint8_t *)data + *nbytes - 1, (uint8_t *)edata + edl - 8, 4)) {
warnx ("MACing not verified"); warnx ("MACing not verified");
@ -569,7 +566,7 @@ mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int c
case T_DES: case T_DES:
case T_3DES: case T_3DES:
(*nbytes)--; (*nbytes)--;
mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, res, *nbytes, MD_RECEIVE, MCO_DECYPHER); mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, res, *nbytes, MCD_RECEIVE, MCO_DECYPHER);
/* /*
* Look for the CRC and ensure it is followed by NULL padding. We * Look for the CRC and ensure it is followed by NULL padding. We
@ -611,7 +608,7 @@ mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int c
case T_3K3DES: case T_3K3DES:
case T_AES: case T_AES:
(*nbytes)--; (*nbytes)--;
mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, res, *nbytes, MD_RECEIVE, MCO_DECYPHER); mifare_cbc_des (MIFARE_DESFIRE (tag)->session_key, MIFARE_DESFIRE (tag)->ivect, res, *nbytes, MCD_RECEIVE, MCO_DECYPHER);
uint8_t *p = ((uint8_t *)res) + *nbytes - 1; uint8_t *p = ((uint8_t *)res) + *nbytes - 1;
while (!*p) { while (!*p) {
p--; p--;
@ -654,12 +651,12 @@ mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int c
} }
static void static void
mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareDirection direction, MifareCryptoOperation operation, size_t block_size) mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareCryptoDirection direction, MifareCryptoOperation operation, size_t block_size)
{ {
AES_KEY k; AES_KEY k;
uint8_t ovect[MAX_CRYPTO_BLOCK_SIZE]; uint8_t ovect[MAX_CRYPTO_BLOCK_SIZE];
if (direction == MD_SEND) { if (direction == MCD_SEND) {
xor (ivect, data, block_size); xor (ivect, data, block_size);
} else { } else {
memcpy (ovect, data, block_size); memcpy (ovect, data, block_size);
@ -722,7 +719,7 @@ mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareDirection
memcpy (data, edata, block_size); memcpy (data, edata, block_size);
if (direction == MD_SEND) { if (direction == MCD_SEND) {
memcpy (ivect, data, block_size); memcpy (ivect, data, block_size);
} else { } else {
xor (ivect, data, block_size); xor (ivect, data, block_size);
@ -731,7 +728,7 @@ mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareDirection
} }
void void
mifare_cbc_des (MifareDESFireKey key, uint8_t *ivect, uint8_t *data, size_t data_size, MifareDirection direction, MifareCryptoOperation operation) mifare_cbc_des (MifareDESFireKey key, uint8_t *ivect, uint8_t *data, size_t data_size, MifareCryptoDirection direction, MifareCryptoOperation operation)
{ {
size_t block_size; size_t block_size;

View file

@ -45,7 +45,7 @@ test_mifare_desfire_des_receive (void)
uint8_t expected_data[8] = { 0x73, 0x0d, 0xdf, 0xad, 0xa4, 0xd2, 0x07, 0x89 }; uint8_t expected_data[8] = { 0x73, 0x0d, 0xdf, 0xad, 0xa4, 0xd2, 0x07, 0x89 };
uint8_t expected_key[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; uint8_t expected_key[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
mifare_cbc_des (key, null_ivect, data, 8, MD_RECEIVE, MCO_DECYPHER); mifare_cbc_des (key, null_ivect, data, 8, MCD_RECEIVE, MCO_DECYPHER);
cut_assert_equal_memory (&expected_data, 8, &data, 8, cut_message ("Wrong data")); cut_assert_equal_memory (&expected_data, 8, &data, 8, cut_message ("Wrong data"));
cut_assert_equal_memory (&expected_key, 8, key->data, 8, cut_message ("Wrong key")); cut_assert_equal_memory (&expected_key, 8, key->data, 8, cut_message ("Wrong key"));
@ -64,7 +64,7 @@ test_mifare_desfire_des_send (void)
uint8_t expected_data[8] = { 0xd6, 0x59, 0xe1, 0x70, 0x43, 0xa8, 0x40, 0x68 }; uint8_t expected_data[8] = { 0xd6, 0x59, 0xe1, 0x70, 0x43, 0xa8, 0x40, 0x68 };
uint8_t expected_key[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; uint8_t expected_key[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
mifare_cbc_des (key, null_ivect, data, 8, MD_SEND, MCO_DECYPHER); mifare_cbc_des (key, null_ivect, data, 8, MCD_SEND, MCO_DECYPHER);
cut_assert_equal_memory (&expected_data, 8, &data, 8, cut_message ("Wrong data")); cut_assert_equal_memory (&expected_data, 8, &data, 8, cut_message ("Wrong data"));
cut_assert_equal_memory (&expected_key, 8, key->data, 8, cut_message ("Wrong key")); cut_assert_equal_memory (&expected_key, 8, key->data, 8, cut_message ("Wrong key"));