Fix MAD manipulation for Mifare Classic 4K.
- Allocate large blocks on Mifare Classic 4K in unit tests; - Constraints sector number in mad_set_aid(); - Fix location of AID storage in mad_set_aid() (wrong variable name and offset, ECOPYPASTETOOFAST); - New API function mad_sector_reserved(); - Use mad_sector_reserved() to avoid trying to use reserved sectors.
This commit is contained in:
parent
541292505a
commit
f83918ee41
5 changed files with 36 additions and 4 deletions
1
NEWS
1
NEWS
|
@ -4,4 +4,5 @@ Changes between 0.1.0 and x.x.x [xx XXX xxxx]
|
||||||
list.
|
list.
|
||||||
*) The mifare_application_alloc() size parameter is now expressed in bytes
|
*) The mifare_application_alloc() size parameter is now expressed in bytes
|
||||||
and not in sectors.
|
and not in sectors.
|
||||||
|
*) New API function mad_sector_reserved().
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,7 @@ MifareSectorNumber mad_get_card_publisher_sector (Mad mad);
|
||||||
int mad_set_card_publisher_sector (Mad mad, MifareSectorNumber cps);
|
int mad_set_card_publisher_sector (Mad mad, MifareSectorNumber cps);
|
||||||
int mad_get_aid (Mad mad, MifareSectorNumber sector, MadAid *aid);
|
int mad_get_aid (Mad mad, MifareSectorNumber sector, MadAid *aid);
|
||||||
int mad_set_aid (Mad mad, MifareSectorNumber sector, MadAid aid);
|
int mad_set_aid (Mad mad, MifareSectorNumber sector, MadAid aid);
|
||||||
|
bool mad_sector_reserved (MifareSectorNumber sector);
|
||||||
void mad_free (Mad mad);
|
void mad_free (Mad mad);
|
||||||
|
|
||||||
MifareSectorNumber *mifare_application_alloc (Mad mad, MadAid aid, size_t size);
|
MifareSectorNumber *mifare_application_alloc (Mad mad, MadAid aid, size_t size);
|
||||||
|
|
|
@ -391,7 +391,7 @@ mad_get_aid(Mad mad, MifareSectorNumber sector, MadAid *aid)
|
||||||
int
|
int
|
||||||
mad_set_aid(Mad mad, MifareSectorNumber sector, MadAid aid)
|
mad_set_aid(Mad mad, MifareSectorNumber sector, MadAid aid)
|
||||||
{
|
{
|
||||||
if (sector > 0x27) {
|
if ((sector < 1) || (sector == 0x10) || (sector > 0x27)) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -401,8 +401,8 @@ mad_set_aid(Mad mad, MifareSectorNumber sector, MadAid aid)
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mad->sector_0x00.aids[sector - 0x0f - 1].function_cluster_code = aid.function_cluster_code;
|
mad->sector_0x10.aids[sector - 0x0f - 2].function_cluster_code = aid.function_cluster_code;
|
||||||
mad->sector_0x00.aids[sector - 0x0f - 1].application_code = aid.application_code;
|
mad->sector_0x10.aids[sector - 0x0f - 2].application_code = aid.application_code;
|
||||||
} else {
|
} else {
|
||||||
mad->sector_0x00.aids[sector - 1].function_cluster_code = aid.function_cluster_code;
|
mad->sector_0x00.aids[sector - 1].function_cluster_code = aid.function_cluster_code;
|
||||||
mad->sector_0x00.aids[sector - 1].application_code = aid.application_code;
|
mad->sector_0x00.aids[sector - 1].application_code = aid.application_code;
|
||||||
|
@ -411,6 +411,12 @@ mad_set_aid(Mad mad, MifareSectorNumber sector, MadAid aid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
mad_sector_reserved (MifareSectorNumber sector)
|
||||||
|
{
|
||||||
|
return ((0x00 == sector) || (0x10 == sector));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free memory allocated by mad_new() and mad_read().
|
* Free memory allocated by mad_new() and mad_read().
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -114,6 +114,8 @@ mifare_application_alloc (Mad mad, MadAid aid, size_t size)
|
||||||
sector = FIRST_SECTOR;
|
sector = FIRST_SECTOR;
|
||||||
MifareSectorNumber s_max = (mad_get_version (mad) == 1) ? 15 : 31;
|
MifareSectorNumber s_max = (mad_get_version (mad) == 1) ? 15 : 31;
|
||||||
while ((s > 0) && (sector <= s_max)) {
|
while ((s > 0) && (sector <= s_max)) {
|
||||||
|
if (mad_sector_reserved (sector))
|
||||||
|
continue;
|
||||||
mad_get_aid (mad, sector, §or_aid);
|
mad_get_aid (mad, sector, §or_aid);
|
||||||
if (0 == aidcmp (sector_aid, free_aid)) {
|
if (0 == aidcmp (sector_aid, free_aid)) {
|
||||||
sector_map[sector] = 1;
|
sector_map[sector] = 1;
|
||||||
|
|
|
@ -36,12 +36,34 @@ test_mifare_classic_application (void)
|
||||||
cut_assert_not_null (s_found, cut_message ("mifare_application_alloc() failed"));
|
cut_assert_not_null (s_found, cut_message ("mifare_application_alloc() failed"));
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
cut_assert_equal_int (s_alloc[i], s_found[i], cut_message ("Allocated and found blocks don't match"));
|
cut_assert_equal_int (s_alloc[i], s_found[i], cut_message ("Allocated and found blocks don't match at position %d", i));
|
||||||
}
|
}
|
||||||
|
|
||||||
cut_assert_equal_int (0, s_alloc[3], cut_message ("Invalid size"));
|
cut_assert_equal_int (0, s_alloc[3], cut_message ("Invalid size"));
|
||||||
cut_assert_equal_int (0, s_found[3], cut_message ("Invalid size"));
|
cut_assert_equal_int (0, s_found[3], cut_message ("Invalid size"));
|
||||||
|
|
||||||
|
mifare_application_free (mad, aid);
|
||||||
|
|
||||||
|
free (s_alloc);
|
||||||
|
free (s_found);
|
||||||
|
|
||||||
|
s_found = mifare_application_find (mad, aid);
|
||||||
|
cut_assert_null (s_found, cut_message ("mifare_application_free() failed"));
|
||||||
|
|
||||||
|
s_alloc = mifare_application_alloc (mad, aid, 15*16 + 1*16 + 1);
|
||||||
|
cut_assert_not_null (s_alloc, cut_message ("mifare_application_alloc() failed"));
|
||||||
|
|
||||||
|
s_found = mifare_application_find (mad, aid);
|
||||||
|
cut_assert_not_null (s_found, cut_message ("mifare_application_alloc() failed"));
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
cut_assert_equal_int (s_alloc[i], s_found[i], cut_message ("Allocated and found blocks don't match at position %d", i));
|
||||||
|
}
|
||||||
|
|
||||||
|
cut_assert_equal_int (0, s_alloc[3], cut_message ("Invalid size"));
|
||||||
|
cut_assert_equal_int (0, s_found[3], cut_message ("Invalid size"));
|
||||||
|
|
||||||
|
|
||||||
mifare_application_free (mad, aid);
|
mifare_application_free (mad, aid);
|
||||||
|
|
||||||
free (s_alloc);
|
free (s_alloc);
|
||||||
|
|
Loading…
Reference in a new issue