Make some more buffer sizes dynamic.

This commit is contained in:
Romain Tartiere 2010-10-29 12:44:12 +00:00
parent a0b9df6ece
commit 3eb8d37d08
2 changed files with 48 additions and 15 deletions

View file

@ -120,6 +120,7 @@ void *mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes,
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, int mac); void mifare_cbc_des (MifareDESFireKey key, uint8_t *ivect, uint8_t *data, size_t data_size, MifareDirection direction, int mac);
void rol (uint8_t *data, const size_t len); void rol (uint8_t *data, const size_t len);
size_t key_block_size (const MifareDESFireKey key);
void *assert_crypto_buffer_size (MifareTag tag, size_t nbytes); void *assert_crypto_buffer_size (MifareTag tag, size_t nbytes);
#define MIFARE_ULTRALIGHT_PAGE_COUNT 16 #define MIFARE_ULTRALIGHT_PAGE_COUNT 16

View file

@ -30,9 +30,9 @@
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, int mac, size_t block_size); static void mifare_des (MifareDESFireKey key, uint8_t *data, uint8_t *ivect, MifareDirection direction, int mac, size_t block_size);
static size_t padded_data_length (size_t nbytes); static size_t padded_data_length (size_t nbytes, const size_t block_size);
static size_t maced_data_length (size_t nbytes); static size_t maced_data_length (const MifareDESFireKey key, size_t nbytes);
static size_t enciphered_data_length (size_t nbytes); static size_t enciphered_data_length (const MifareDESFireKey key, size_t nbytes);
static void static void
xor (const uint8_t *ivect, uint8_t *data, const size_t len) xor (const uint8_t *ivect, uint8_t *data, const size_t len)
@ -52,14 +52,29 @@ rol(uint8_t *data, const size_t len)
data[len-1] = first; data[len-1] = first;
} }
size_t
key_block_size (const MifareDESFireKey key)
{
size_t block_size;
switch (key->type) {
case T_DES:
case T_3DES:
block_size = 8;
break;
}
return block_size;
}
/* /*
* Size required to store nbytes of data in a buffer of size n*8. * Size required to store nbytes of data in a buffer of size n*block_size.
*/ */
static size_t static size_t
padded_data_length (size_t nbytes) padded_data_length (const size_t nbytes, const size_t block_size)
{ {
if (nbytes % 8) if (nbytes % block_size)
return ((nbytes / 8) + 1) * 8; return ((nbytes / block_size) + 1) * block_size;
else else
return nbytes; return nbytes;
} }
@ -68,17 +83,34 @@ padded_data_length (size_t nbytes)
* Buffer size required to MAC nbytes of data * Buffer size required to MAC nbytes of data
*/ */
static size_t static size_t
maced_data_length (size_t nbytes) maced_data_length (const MifareDESFireKey key, const size_t nbytes)
{ {
return nbytes + 4; size_t mac_length;
switch (key->type) {
case T_DES:
case T_3DES:
mac_length = 4;
break;
}
return nbytes + mac_length;
} }
/* /*
* Buffer size required to encipher nbytes of data and a two bytes CRC. * Buffer size required to encipher nbytes of data and a two bytes CRC.
*/ */
static size_t static size_t
enciphered_data_length (size_t nbytes) enciphered_data_length (const MifareDESFireKey key, const size_t nbytes)
{ {
return padded_data_length (nbytes + 2); size_t crc_length;
switch (key->type) {
case T_DES:
case T_3DES:
crc_length = 2;
break;
}
size_t block_size = key_block_size (key);
return padded_data_length (nbytes + crc_length, block_size);
} }
@ -111,7 +143,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, int com
res = data; res = data;
break; break;
case 1: case 1:
edl = padded_data_length (*nbytes); edl = padded_data_length (*nbytes, key_block_size (MIFARE_DESFIRE (tag)->session_key));
if (!(res = assert_crypto_buffer_size (tag, edl))) if (!(res = assert_crypto_buffer_size (tag, edl)))
abort(); abort();
@ -124,7 +156,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, int com
memcpy (mac, (uint8_t *)res + edl - 8, 4); memcpy (mac, (uint8_t *)res + edl - 8, 4);
mdl = maced_data_length (*nbytes); mdl = maced_data_length (MIFARE_DESFIRE (tag)->session_key, *nbytes);
if (!(res = assert_crypto_buffer_size (tag, mdl))) if (!(res = assert_crypto_buffer_size (tag, mdl)))
abort(); abort();
@ -135,7 +167,7 @@ mifare_cryto_preprocess_data (MifareTag tag, void *data, size_t *nbytes, int com
break; break;
case 3: case 3:
edl = enciphered_data_length (*nbytes); edl = enciphered_data_length (MIFARE_DESFIRE (tag)->session_key, *nbytes);
if (!(res = assert_crypto_buffer_size (tag, edl))) if (!(res = assert_crypto_buffer_size (tag, edl)))
abort(); abort();
@ -173,7 +205,7 @@ mifare_cryto_postprocess_data (MifareTag tag, void *data, ssize_t *nbytes, int c
case 1: case 1:
*nbytes -= 4; *nbytes -= 4;
edl = enciphered_data_length (*nbytes); edl = enciphered_data_length (MIFARE_DESFIRE (tag)->session_key, *nbytes);
edata = malloc (edl); edata = malloc (edl);
memcpy (edata, data, *nbytes); memcpy (edata, data, *nbytes);