From 92ae6036d26d95b6f117b12b55abca041f36d527 Mon Sep 17 00:00:00 2001 From: Romain Tartiere Date: Thu, 1 Jul 2010 14:10:09 +0000 Subject: [PATCH] Add unit tests for mad_read() and mad_write(). --- test/Makefile.am | 1 + test/test_mifare_classic.c | 8 -- test/test_mifare_classic_mad.c | 178 +++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 8 deletions(-) create mode 100644 test/test_mifare_classic_mad.c diff --git a/test/Makefile.am b/test/Makefile.am index 163e11e..4830a0d 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -26,6 +26,7 @@ test_mad_la_SOURCES = test_mad.c test_mad_la_LIBADD = $(top_builddir)/libfreefare/libfreefare.la test_mifare_classic_la_SOURCES = test_mifare_classic.c \ + test_mifare_classic_mad.c \ mifare_classic_fixture.c \ mifare_classic_fixture.h test_mifare_classic_la_LIBADD = $(top_builddir)/libfreefare/libfreefare.la diff --git a/test/test_mifare_classic.c b/test/test_mifare_classic.c index d6e803b..eeaa064 100644 --- a/test/test_mifare_classic.c +++ b/test/test_mifare_classic.c @@ -98,14 +98,6 @@ test_mifare_classic_get_trailer_permission (void) cut_assert_equal_int (0, mifare_classic_get_trailer_block_permission(tag, 0x07, MCAB_WRITE_KEYB, MFC_KEY_B), cut_message ("Wrong permission")); } -void -test_mifare_classic_read_mad (void) -{ - cut_omit ("A blank MIFARE Classic does not have a MAD. This test has to be moved in an appropriate test case."); - Mad mad = mad_read (tag); - cut_assert_not_null (mad, cut_message ("mad_read() failed")); -} - void test_mifare_classic_format (void) { diff --git a/test/test_mifare_classic_mad.c b/test/test_mifare_classic_mad.c new file mode 100644 index 0000000..20204f1 --- /dev/null +++ b/test/test_mifare_classic_mad.c @@ -0,0 +1,178 @@ +/*- + * Copyright (C) 2010, Romain Tartiere. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see + * + * $Id: mifare_ultralight_fixture.c 264 2010-04-26 09:11:28Z romain.tartiere $ + */ + +#include + +#include + +#include "mifare_classic_fixture.h" + +void +test_mifare_classic_mad (void) +{ + MifareClassicKey key_a_transport = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + MifareClassicKey key_b_sector_00 = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; + MifareClassicKey key_b_sector_10 = { 0x1a, 0x98, 0x2c, 0x7e, 0x45 ,0x9a }; + MifareClassicBlock tb; + Mad mad; + int res; + + /* __ __ _ ___ _ + * | \/ | /_\ | \__ _/ | + * | |\/| |/ _ \| |) \ V / | + * |_| |_/_/ \_\___/ \_/|_| + */ + + mad = mad_new (1); + cut_assert_not_null (mad, cut_message ("mad_new() failed")); + + // Prepare sector 0x00 for writing a MAD. + res = mifare_classic_authenticate (tag, 0x00, key_a_transport, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + mifare_classic_trailer_block (&tb, key_a_transport, 00, 00, 00, 06, 0x00, key_b_sector_00); + + res = mifare_classic_write (tag, 0x03, tb); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_write() failed")); + + // Write the empty MAD + res = mad_write (tag, mad, key_b_sector_00, NULL); + cut_assert_equal_int (0, res, cut_message ("mad_write() failed")); + + + // Check the empty MAD + MifareClassicBlock ref_01 = { 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MifareClassicBlock ref_02 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MifareClassicBlock data; + + res = mifare_classic_authenticate (tag, 0x01, mad_public_key_a, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + res = mifare_classic_read (tag, 0x01, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_01, sizeof (ref_01), data, sizeof (data), cut_message ("Wrong data")); + + res = mifare_classic_read (tag, 0x02, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_02, sizeof (ref_02), data, sizeof (data), cut_message ("Wrong data")); + + Mad mad2 = mad_read (tag); + cut_assert_not_null (mad2, cut_message ("mad_read() failed")); + cut_assert_equal_memory (mad, sizeof (mad), mad2, sizeof (mad2), cut_message ("Wrong MAD")); + + mad_free (mad); + mad_free (mad2); + + // Revert to the transport configuration + res = mifare_classic_authenticate (tag, 0x00, key_b_sector_00, MFC_KEY_B); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + res = mifare_classic_format_sector (tag, 0x00); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_format_sector() failed")); + + /* __ __ _ ___ ___ + * | \/ | /_\ | \__ _|_ ) + * | |\/| |/ _ \| |) \ V // / + * |_| |_/_/ \_\___/ \_//___| + */ + if (freefare_get_tag_type (tag) != CLASSIC_4K) { + cut_omit ("MADv2 requires a MIFARE Classic 4K to be tested"); + } + + mad = mad_new (2); + cut_assert_not_null (mad, cut_message ("mad_new() failed")); + + // Prepare sector 0x00 for writing a MAD. + res = mifare_classic_authenticate (tag, 0x00, key_a_transport, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + mifare_classic_trailer_block (&tb, key_a_transport, 00, 00, 00, 06, 0x00, key_b_sector_00); + + res = mifare_classic_write (tag, 0x03, tb); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_write() failed")); + + // Prepare sector 0x10 for writing a MAD. + res = mifare_classic_authenticate (tag, 0x40, key_a_transport, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + mifare_classic_trailer_block (&tb, key_a_transport, 00, 00, 00, 06, 0x00, key_b_sector_10); + + res = mifare_classic_write (tag, 0x43, tb); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_write() failed")); + + // Write the empty MAD + res = mad_write (tag, mad, key_b_sector_00, key_b_sector_10); + cut_assert_equal_int (0, res, cut_message ("mad_write() failed")); + + // Check the empty MAD + + res = mifare_classic_authenticate (tag, 0x01, mad_public_key_a, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + res = mifare_classic_read (tag, 0x01, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_01, sizeof (ref_01), data, sizeof (data), cut_message ("Wrong data")); + + res = mifare_classic_read (tag, 0x02, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_02, sizeof (ref_02), data, sizeof (data), cut_message ("Wrong data")); + + MifareClassicBlock ref_40 = { 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MifareClassicBlock ref_41 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MifareClassicBlock ref_42 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + res = mifare_classic_authenticate (tag, 0x40, mad_public_key_a, MFC_KEY_A); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + + res = mifare_classic_read (tag, 0x40, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_40, sizeof (ref_01), data, sizeof (data), cut_message ("Wrong data")); + + res = mifare_classic_read (tag, 0x41, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_41, sizeof (ref_02), data, sizeof (data), cut_message ("Wrong data")); + + res = mifare_classic_read (tag, 0x42, &data); + cut_assert_equal_int (0, res, cut_message ("mad_read() failed")); + cut_assert_equal_memory (ref_42, sizeof (ref_02), data, sizeof (data), cut_message ("Wrong data")); + + + mad2 = mad_read (tag); + cut_assert_not_null (mad2, cut_message ("mad_read() failed")); + cut_assert_equal_memory (mad, sizeof (mad), mad2, sizeof (mad2), cut_message ("Wrong MAD")); + + mad_free (mad); + mad_free (mad2); + + // Revert to the transport configuration + res = mifare_classic_authenticate (tag, 0x00, key_b_sector_00, MFC_KEY_B); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + res = mifare_classic_format_sector (tag, 0x00); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_format_sector() failed")); + + res = mifare_classic_authenticate (tag, 0x40, key_b_sector_10, MFC_KEY_B); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_authenticate() failed")); + res = mifare_classic_format_sector (tag, 0x40); + cut_assert_equal_int (0, res, cut_message ("mifare_classic_format_sector() failed")); + +}