add non-default key option to mifare-desfire-* examples
This commit is contained in:
parent
0a9eb8fbf2
commit
acf5180177
9 changed files with 184 additions and 48 deletions
|
@ -3,8 +3,8 @@ set(EXAMPLES-SOURCES
|
||||||
mifare-classic-format
|
mifare-classic-format
|
||||||
mifare-classic-write-ndef
|
mifare-classic-write-ndef
|
||||||
mifare-desfire-access
|
mifare-desfire-access
|
||||||
|
mifare-desfire-create-ndef
|
||||||
mifare-desfire-format
|
mifare-desfire-format
|
||||||
mifare-desfire-format-ndef
|
|
||||||
mifare-desfire-info
|
mifare-desfire-info
|
||||||
mifare-desfire-write-ndef
|
mifare-desfire-write-ndef
|
||||||
mifare-desfire-ev1-configure-ats
|
mifare-desfire-ev1-configure-ats
|
||||||
|
|
|
@ -7,11 +7,11 @@ bin_PROGRAMS = mifare-classic-format \
|
||||||
mifare-classic-write-ndef \
|
mifare-classic-write-ndef \
|
||||||
mifare-classic-read-ndef \
|
mifare-classic-read-ndef \
|
||||||
mifare-desfire-access \
|
mifare-desfire-access \
|
||||||
|
mifare-desfire-create-ndef \
|
||||||
mifare-desfire-ev1-configure-ats \
|
mifare-desfire-ev1-configure-ats \
|
||||||
mifare-desfire-ev1-configure-default-key \
|
mifare-desfire-ev1-configure-default-key \
|
||||||
mifare-desfire-ev1-configure-random-uid \
|
mifare-desfire-ev1-configure-random-uid \
|
||||||
mifare-desfire-format \
|
mifare-desfire-format \
|
||||||
mifare-desfire-format-ndef \
|
|
||||||
mifare-desfire-info \
|
mifare-desfire-info \
|
||||||
mifare-desfire-write-ndef
|
mifare-desfire-write-ndef
|
||||||
|
|
||||||
|
@ -27,6 +27,9 @@ mifare_classic_write_ndef_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.
|
||||||
mifare_desfire_access_SOURCES = mifare-desfire-access.c
|
mifare_desfire_access_SOURCES = mifare-desfire-access.c
|
||||||
mifare_desfire_access_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
mifare_desfire_access_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
||||||
|
|
||||||
|
mifare_desfire_create_ndef_SOURCES = mifare-desfire-create-ndef.c
|
||||||
|
mifare_desfire_create_ndef_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
||||||
|
|
||||||
mifare_desfire_ev1_configure_ats_SOURCES = mifare-desfire-ev1-configure-ats.c
|
mifare_desfire_ev1_configure_ats_SOURCES = mifare-desfire-ev1-configure-ats.c
|
||||||
mifare_desfire_ev1_configure_ats_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
mifare_desfire_ev1_configure_ats_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
||||||
|
|
||||||
|
@ -39,9 +42,6 @@ mifare_desfire_ev1_configure_random_uid_LDADD = -lnfc $(top_builddir)/libfreefar
|
||||||
mifare_desfire_format_SOURCES = mifare-desfire-format.c
|
mifare_desfire_format_SOURCES = mifare-desfire-format.c
|
||||||
mifare_desfire_format_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
mifare_desfire_format_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
||||||
|
|
||||||
mifare_desfire_format_ndef_SOURCES = mifare-desfire-format-ndef.c
|
|
||||||
mifare_desfire_format_ndef_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la
|
|
||||||
|
|
||||||
mifare_desfire_info_SOURCES = mifare-desfire-info.c
|
mifare_desfire_info_SOURCES = mifare-desfire-info.c
|
||||||
mifare_desfire_info_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la -lm
|
mifare_desfire_info_LDADD = -lnfc $(top_builddir)/libfreefare/libfreefare.la -lm
|
||||||
|
|
||||||
|
|
|
@ -159,8 +159,7 @@ main(int argc, char *argv[])
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,12 @@
|
||||||
* $Id$
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <freefare.h>
|
#include <freefare.h>
|
||||||
|
|
||||||
|
@ -36,17 +40,58 @@
|
||||||
uint8_t key_data_picc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t key_data_picc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
uint8_t key_data_app[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t key_data_app[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
struct {
|
||||||
|
bool interactive;
|
||||||
|
} create_options = {
|
||||||
|
.interactive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
usage(char *progname)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "usage: %s [-y]\n", progname);
|
||||||
|
fprintf (stderr, "\nOptions:\n");
|
||||||
|
fprintf (stderr, " -y Do not ask for confirmation\n");
|
||||||
|
fprintf (stderr, " -K 11223344AABBCCDD Provide another PICC key than the default one\n");
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int ch;
|
||||||
int error = EXIT_SUCCESS;
|
int error = EXIT_SUCCESS;
|
||||||
nfc_device *device = NULL;
|
nfc_device *device = NULL;
|
||||||
MifareTag *tags = NULL;
|
MifareTag *tags = NULL;
|
||||||
|
|
||||||
printf ("NOTE: This application turns Mifare DESFire targets into NFC Forum Type 4 Tags.\n");
|
while ((ch = getopt (argc, argv, "hyK:")) != -1) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'h':
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
create_options.interactive = false;
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
if (strlen(optarg) != 16) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
uint64_t n = strtoull(optarg, NULL, 16);
|
||||||
|
int i;
|
||||||
|
for (i=7; i>=0; i--) {
|
||||||
|
key_data_picc[i] = (uint8_t) n;
|
||||||
|
n >>= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
|
|
||||||
if (argc > 1)
|
printf ("NOTE: This application turns Mifare DESFire targets into NFC Forum Type 4 Tags.\n");
|
||||||
errx (EXIT_FAILURE, "usage: %s", argv[0]);
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
@ -79,11 +124,17 @@ main(int argc, char *argv[])
|
||||||
char *tag_uid = freefare_get_tag_uid (tags[i]);
|
char *tag_uid = freefare_get_tag_uid (tags[i]);
|
||||||
char buffer[BUFSIZ];
|
char buffer[BUFSIZ];
|
||||||
|
|
||||||
printf ("Found %s with UID %s. Format as NDEF [yN] ", freefare_get_tag_friendly_name (tags[i]), tag_uid);
|
printf ("Found %s with UID %s. ", freefare_get_tag_friendly_name (tags[i]), tag_uid);
|
||||||
fgets (buffer, BUFSIZ, stdin);
|
bool create_ndef = true;
|
||||||
bool write_ndef = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
|
if (create_options.interactive) {
|
||||||
|
printf ("Create NDEF app [yN] ");
|
||||||
|
fgets (buffer, BUFSIZ, stdin);
|
||||||
|
create_ndef = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
|
||||||
|
} else {
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (write_ndef) {
|
if (create_ndef) {
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = mifare_desfire_connect (tags[i]);
|
res = mifare_desfire_connect (tags[i]);
|
|
@ -29,8 +29,9 @@
|
||||||
|
|
||||||
#include <freefare.h>
|
#include <freefare.h>
|
||||||
|
|
||||||
uint8_t null_key_data[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t key_data_picc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
// TODO: Allow to pass another ATS as option
|
||||||
// Default Mifare DESFire ATS
|
// Default Mifare DESFire ATS
|
||||||
uint8_t new_ats[] = { 0x06, 0x75, 0x77, 0x81, 0x02, 0x80 };
|
uint8_t new_ats[] = { 0x06, 0x75, 0x77, 0x81, 0x02, 0x80 };
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ usage(char *progname)
|
||||||
fprintf (stderr, "usage: %s [-y]\n", progname);
|
fprintf (stderr, "usage: %s [-y]\n", progname);
|
||||||
fprintf (stderr, "\nOptions:\n");
|
fprintf (stderr, "\nOptions:\n");
|
||||||
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
||||||
|
fprintf (stderr, " -K 11223344AABBCCDD Provide another PICC key than the default one\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -56,7 +58,7 @@ main(int argc, char *argv[])
|
||||||
nfc_device *device = NULL;
|
nfc_device *device = NULL;
|
||||||
MifareTag *tags = NULL;
|
MifareTag *tags = NULL;
|
||||||
|
|
||||||
while ((ch = getopt (argc, argv, "hy")) != -1) {
|
while ((ch = getopt (argc, argv, "hyK:")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -65,13 +67,24 @@ main(int argc, char *argv[])
|
||||||
case 'y':
|
case 'y':
|
||||||
configure_options.interactive = false;
|
configure_options.interactive = false;
|
||||||
break;
|
break;
|
||||||
|
case 'K':
|
||||||
|
if (strlen(optarg) != 16) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
uint64_t n = strtoull(optarg, NULL, 16);
|
||||||
|
int i;
|
||||||
|
for (i=7; i>=0; i--) {
|
||||||
|
key_data_picc[i] = (uint8_t) n;
|
||||||
|
n >>= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
@ -124,14 +137,14 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MifareDESFireKey default_key = mifare_desfire_des_key_new_with_version (null_key_data);
|
MifareDESFireKey key_picc = mifare_desfire_des_key_new_with_version (key_data_picc);
|
||||||
res = mifare_desfire_authenticate (tags[i], 0, default_key);
|
res = mifare_desfire_authenticate (tags[i], 0, key_picc);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
||||||
error = EXIT_FAILURE;
|
error = EXIT_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mifare_desfire_key_free (default_key);
|
mifare_desfire_key_free (key_picc);
|
||||||
|
|
||||||
res = mifare_desfire_set_ats (tags[i], new_ats);
|
res = mifare_desfire_set_ats (tags[i], new_ats);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
|
|
|
@ -70,8 +70,7 @@ main(int argc, char *argv[])
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
#include <freefare.h>
|
#include <freefare.h>
|
||||||
|
|
||||||
uint8_t null_key_data[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t key_data_picc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool interactive;
|
bool interactive;
|
||||||
|
@ -43,6 +43,7 @@ usage(char *progname)
|
||||||
fprintf (stderr, "usage: %s [-y]\n", progname);
|
fprintf (stderr, "usage: %s [-y]\n", progname);
|
||||||
fprintf (stderr, "\nOptions:\n");
|
fprintf (stderr, "\nOptions:\n");
|
||||||
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
||||||
|
fprintf (stderr, " -K 11223344AABBCCDD Provide another PICC key than the default one\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -53,7 +54,7 @@ main(int argc, char *argv[])
|
||||||
nfc_device *device = NULL;
|
nfc_device *device = NULL;
|
||||||
MifareTag *tags = NULL;
|
MifareTag *tags = NULL;
|
||||||
|
|
||||||
while ((ch = getopt (argc, argv, "hy")) != -1) {
|
while ((ch = getopt (argc, argv, "hyK:")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -62,13 +63,24 @@ main(int argc, char *argv[])
|
||||||
case 'y':
|
case 'y':
|
||||||
configure_options.interactive = false;
|
configure_options.interactive = false;
|
||||||
break;
|
break;
|
||||||
|
case 'K':
|
||||||
|
if (strlen(optarg) != 16) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
uint64_t n = strtoull(optarg, NULL, 16);
|
||||||
|
int i;
|
||||||
|
for (i=7; i>=0; i--) {
|
||||||
|
key_data_picc[i] = (uint8_t) n;
|
||||||
|
n >>= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
@ -124,14 +136,14 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MifareDESFireKey default_key = mifare_desfire_des_key_new_with_version (null_key_data);
|
MifareDESFireKey key_picc = mifare_desfire_des_key_new_with_version (key_data_picc);
|
||||||
res = mifare_desfire_authenticate (tags[i], 0, default_key);
|
res = mifare_desfire_authenticate (tags[i], 0, key_picc);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
||||||
error = EXIT_FAILURE;
|
error = EXIT_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mifare_desfire_key_free (default_key);
|
mifare_desfire_key_free (key_picc);
|
||||||
|
|
||||||
res = mifare_desfire_set_configuration (tags[i], false, true);
|
res = mifare_desfire_set_configuration (tags[i], false, true);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
|
@ -152,14 +164,14 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MifareDESFireKey default_key = mifare_desfire_des_key_new_with_version (null_key_data);
|
MifareDESFireKey key_picc = mifare_desfire_des_key_new_with_version (key_data_picc);
|
||||||
res = mifare_desfire_authenticate (tags[i], 0, default_key);
|
res = mifare_desfire_authenticate (tags[i], 0, key_picc);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
freefare_perror (tags[i], "mifare_desfire_authenticate");
|
||||||
error = EXIT_FAILURE;
|
error = EXIT_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mifare_desfire_key_free (default_key);
|
mifare_desfire_key_free (key_picc);
|
||||||
|
|
||||||
char *old_tag_uid;
|
char *old_tag_uid;
|
||||||
res = mifare_desfire_get_card_uid (tags[i], &old_tag_uid);
|
res = mifare_desfire_get_card_uid (tags[i], &old_tag_uid);
|
||||||
|
|
|
@ -29,8 +29,7 @@
|
||||||
|
|
||||||
#include <freefare.h>
|
#include <freefare.h>
|
||||||
|
|
||||||
// TODO: allow to read non-default key from options, also for the other mifare-desfire* tools
|
uint8_t key_data_picc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
uint8_t null_key_data[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool interactive;
|
bool interactive;
|
||||||
|
@ -44,6 +43,7 @@ usage(char *progname)
|
||||||
fprintf (stderr, "usage: %s [-y]\n", progname);
|
fprintf (stderr, "usage: %s [-y]\n", progname);
|
||||||
fprintf (stderr, "\nOptions:\n");
|
fprintf (stderr, "\nOptions:\n");
|
||||||
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
fprintf (stderr, " -y Do not ask for confirmation (dangerous)\n");
|
||||||
|
fprintf (stderr, " -K 11223344AABBCCDD Provide another PICC key than the default one\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -54,7 +54,7 @@ main(int argc, char *argv[])
|
||||||
nfc_device *device = NULL;
|
nfc_device *device = NULL;
|
||||||
MifareTag *tags = NULL;
|
MifareTag *tags = NULL;
|
||||||
|
|
||||||
while ((ch = getopt (argc, argv, "hy")) != -1) {
|
while ((ch = getopt (argc, argv, "hyK:")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -63,13 +63,24 @@ main(int argc, char *argv[])
|
||||||
case 'y':
|
case 'y':
|
||||||
format_options.interactive = false;
|
format_options.interactive = false;
|
||||||
break;
|
break;
|
||||||
|
case 'K':
|
||||||
|
if (strlen(optarg) != 16) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
uint64_t n = strtoull(optarg, NULL, 16);
|
||||||
|
int i;
|
||||||
|
for (i=7; i>=0; i--) {
|
||||||
|
key_data_picc[i] = (uint8_t) n;
|
||||||
|
n >>= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
@ -121,14 +132,14 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MifareDESFireKey default_key = mifare_desfire_des_key_new_with_version (null_key_data);
|
MifareDESFireKey key_picc = mifare_desfire_des_key_new_with_version (key_data_picc);
|
||||||
res = mifare_desfire_authenticate (tags[i], 0, default_key);
|
res = mifare_desfire_authenticate (tags[i], 0, key_picc);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
warnx ("Can't authenticate on Mifare DESFire target.");
|
warnx ("Can't authenticate on Mifare DESFire target.");
|
||||||
error = EXIT_FAILURE;
|
error = EXIT_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mifare_desfire_key_free (default_key);
|
mifare_desfire_key_free (key_picc);
|
||||||
|
|
||||||
res = mifare_desfire_format_picc (tags[i]);
|
res = mifare_desfire_format_picc (tags[i]);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
|
|
|
@ -17,8 +17,12 @@
|
||||||
* $Id$
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <freefare.h>
|
#include <freefare.h>
|
||||||
|
|
||||||
|
@ -45,17 +49,58 @@ const uint8_t ndef_msg[35] = {
|
||||||
0x67
|
0x67
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct {
|
||||||
|
bool interactive;
|
||||||
|
} write_options = {
|
||||||
|
.interactive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
usage(char *progname)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "usage: %s [-y]\n", progname);
|
||||||
|
fprintf (stderr, "\nOptions:\n");
|
||||||
|
fprintf (stderr, " -y Do not ask for confirmation\n");
|
||||||
|
fprintf (stderr, " -k 11223344AABBCCDD Provide another NDEF Tag Application key than the default one\n");
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int ch;
|
||||||
int error = EXIT_SUCCESS;
|
int error = EXIT_SUCCESS;
|
||||||
nfc_device *device = NULL;
|
nfc_device *device = NULL;
|
||||||
MifareTag *tags = NULL;
|
MifareTag *tags = NULL;
|
||||||
|
|
||||||
printf ("NOTE: This application writes a NDEF payload into a Mifare DESFire formatted as NFC Forum Type 4 Tag.\n");
|
while ((ch = getopt (argc, argv, "hyk:")) != -1) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'h':
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
write_options.interactive = false;
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
if (strlen(optarg) != 16) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
uint64_t n = strtoull(optarg, NULL, 16);
|
||||||
|
int i;
|
||||||
|
for (i=7; i>=0; i--) {
|
||||||
|
key_data_app[i] = (uint8_t) n;
|
||||||
|
n >>= 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(argv[0]);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remaining args, if any, are in argv[optind .. (argc-1)]
|
||||||
|
|
||||||
if (argc > 1)
|
printf ("NOTE: This application writes a NDEF payload into a Mifare DESFire formatted as NFC Forum Type 4 Tag.\n");
|
||||||
errx (EXIT_FAILURE, "usage: %s", argv[0]);
|
|
||||||
|
|
||||||
nfc_connstring devices[8];
|
nfc_connstring devices[8];
|
||||||
size_t device_count;
|
size_t device_count;
|
||||||
|
@ -88,9 +133,15 @@ main(int argc, char *argv[])
|
||||||
char *tag_uid = freefare_get_tag_uid (tags[i]);
|
char *tag_uid = freefare_get_tag_uid (tags[i]);
|
||||||
char buffer[BUFSIZ];
|
char buffer[BUFSIZ];
|
||||||
|
|
||||||
printf ("Found %s with UID %s. Write NDEF [yN] ", freefare_get_tag_friendly_name (tags[i]), tag_uid);
|
printf ("Found %s with UID %s. ", freefare_get_tag_friendly_name (tags[i]), tag_uid);
|
||||||
fgets (buffer, BUFSIZ, stdin);
|
bool write_ndef = true;
|
||||||
bool write_ndef = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
|
if (write_options.interactive) {
|
||||||
|
printf ("Write NDEF [yN] ");
|
||||||
|
fgets (buffer, BUFSIZ, stdin);
|
||||||
|
write_ndef = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
|
||||||
|
} else {
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (write_ndef) {
|
if (write_ndef) {
|
||||||
int res;
|
int res;
|
||||||
|
@ -109,7 +160,7 @@ main(int argc, char *argv[])
|
||||||
MifareDESFireAID aid = mifare_desfire_aid_new(0xEEEE10);
|
MifareDESFireAID aid = mifare_desfire_aid_new(0xEEEE10);
|
||||||
res = mifare_desfire_select_application(tags[i], aid);
|
res = mifare_desfire_select_application(tags[i], aid);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
errx (EXIT_FAILURE, "Application selection failed. Try mifare-desfire-format-ndef before running %s.", argv[0]);
|
errx (EXIT_FAILURE, "Application selection failed. Try mifare-desfire-create-ndef before running %s.", argv[0]);
|
||||||
free (aid);
|
free (aid);
|
||||||
|
|
||||||
// Authentication with NDEF Tag Application master key (Authentication with key 0)
|
// Authentication with NDEF Tag Application master key (Authentication with key 0)
|
||||||
|
|
Loading…
Reference in a new issue