*/
#include "desfire_crypto.h"
-static void xor (const uint8_t *ivect, uint8_t *data, const size_t len);
-
-static size_t key_macing_length (desfirekey_t key);
+static void xor (const uint8_t *ivect, uint8_t *data, const size_t len);
+static size_t key_macing_length (desfirekey_t key);
static void xor (const uint8_t *ivect, uint8_t *data, const size_t len) {
for (size_t i = 0; i < len; i++) {
mifare_cypher_blocks_chained (NULL, key, ivect, buffer, len, MCD_SEND, MCO_ENCYPHER);
memcpy (cmac, ivect, kbs);
+ free(buffer);
}
size_t key_block_size (const desfirekey_t key) {
size_t block_size = 8;
-
switch (key->type) {
case T_DES:
case T_3DES:
block_size = 16;
break;
}
-
return block_size;
}
*/
static size_t key_macing_length (const desfirekey_t key) {
size_t mac_length = MAC_LENGTH;
-
switch (key->type) {
case T_DES:
case T_3DES:
mac_length = CMAC_LENGTH;
break;
}
-
return mac_length;
}
return padded_data_length (nbytes + crc_length, block_size);
}
-void* mifare_cryto_preprocess_data (desfiretag_t tag, void *data, size_t *nbytes, off_t offset, int communication_settings) {
+void* mifare_cryto_preprocess_data (desfiretag_t tag, void *data, size_t *nbytes, size_t offset, int communication_settings) {
uint8_t *res = data;
uint8_t mac[4];
size_t edl;
cmac (key, DESFIRE (tag)->ivect, res, *nbytes, DESFIRE (tag)->cmac);
if (append_mac) {
- maced_data_length (key, *nbytes);
-
+ size_t len = maced_data_length (key, *nbytes);
+ ++len;
memcpy (res, data, *nbytes);
memcpy (res + *nbytes, DESFIRE (tag)->cmac, CMAC_LENGTH);
*nbytes += CMAC_LENGTH;
}
-void* mifare_cryto_postprocess_data (desfiretag_t tag, void *data, ssize_t *nbytes, int communication_settings)
+void* mifare_cryto_postprocess_data (desfiretag_t tag, void *data, size_t *nbytes, int communication_settings)
{
void *res = data;
size_t edl;
*nbytes = -1;
res = NULL;
#ifdef WITH_DEBUG
- printf ("No room for MAC!");
+ Dbprintf ("No room for MAC!");
#endif
break;
}
if (0 != memcmp ((uint8_t *)data + *nbytes - 1, (uint8_t *)edata + edl - 8, 4)) {
#ifdef WITH_DEBUG
- printf ("MACing not verified");
+ Dbprintf ("MACing not verified");
hexdump ((uint8_t *)data + *nbytes - 1, key_macing_length (key), "Expect ", 0);
hexdump ((uint8_t *)edata + edl - 8, key_macing_length (key), "Actual ", 0);
#endif
((uint8_t *)data)[*nbytes - 9] = first_cmac_byte;
if (0 != memcmp (DESFIRE (tag)->cmac, (uint8_t *)data + *nbytes - 9, 8)) {
#ifdef WITH_DEBUG
- printf ("CMAC NOT verified :-(");
+ Dbprintf ("CMAC NOT verified :-(");
hexdump ((uint8_t *)data + *nbytes - 9, 8, "Expect ", 0);
hexdump (DESFIRE (tag)->cmac, 8, "Actual ", 0);
#endif
break;
case AS_NEW:
end_crc_pos = crc_pos + 4;
- crc32 (res, end_crc_pos, (uint8_t *)&crc);
+ crc32_ex (res, end_crc_pos, (uint8_t *)&crc);
break;
}
if (!crc) {
{
AesCtx ctx;
AesCtxIni(&ctx, ivect, key->data, KEY128,CBC);
- AesEncrypt(&ctx, data, edata, sizeof(data) );
+ AesEncrypt(&ctx, data, edata, sizeof(edata) );
break;
}
case MCO_DECYPHER: