Skip to content

Commit

Permalink
Reintroduce the possibility to hexdump(3) PCD <=> PICC transmissions.
Browse files Browse the repository at this point in the history
Not a hack this time:
  - Use the hexdump(3) function of the system if it exists;
  - Build the subpart of FreeBSD's libutil if not (contrib);
  - Do this only if configured --with-debug.

The Mifare Classic / Ultralight code will be eventually changed to also provide this functionality.
  • Loading branch information
smortex committed Jul 29, 2010
1 parent 1f1db86 commit 61a5ff4
Show file tree
Hide file tree
Showing 9 changed files with 195 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = libfreefare test examples
SUBDIRS = contrib libfreefare test examples

pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libfreefare.pc
Expand Down
10 changes: 10 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ AM_INIT_AUTOMAKE

m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])

# Debug support (default:no)
AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],[Enable debug output]),[enable_debug=$enableval],[enable_debug="no"])
if test x"$enable_debug" = xyes; then
AC_CHECK_LIB([util], [hexdump], [has_libutil=yes], [has_libutil=no])
fi
AM_CONDITIONAL(WITH_DEBUG, [test x"$enable_debug" = xyes])
AM_CONDITIONAL(HAS_LIBUTIL, [test x"$has_libutil" = xyes])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_HEADER_STDBOOL
Expand Down Expand Up @@ -69,6 +77,8 @@ if test x$ac_cv_enable_coverage = xyes; then
fi

AC_OUTPUT([Makefile
contrib/Makefile
contrib/libutil/Makefile
examples/Makefile
libfreefare/Makefile
libfreefare.pc
Expand Down
3 changes: 3 additions & 0 deletions contrib/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# $Id$

SUBDIRS = libutil
10 changes: 10 additions & 0 deletions contrib/libutil/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# $Id$

if WITH_DEBUG
if !HAS_LIBUTIL
noinst_LTLIBRARIES = libutil.la
noinst_HEADERS = libutil.h

libutil_la_SOURCES = hexdump.c
endif # !HAS_LIBUTIL
endif # WITH_DEBUG
97 changes: 97 additions & 0 deletions contrib/libutil/hexdump.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*-
* Copyright (c) 1986, 1988, 1991, 1993
* The Regents of the University of California. All rights reserved.
* (c) UNIX System Laboratories, Inc.
* All or some portions of this file are derived from material licensed
* to the University of California by American Telephone and Telegraph
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
* the permission of UNIX System Laboratories, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)subr_prf.c 8.3 (Berkeley) 1/21/94
* $Id$
*/

//#include <sys/cdefs.h>
//__FBSDID("$FreeBSD: stable/8/lib/libutil/hexdump.c 180161 2008-07-01 22:30:57Z jhb $");

#include <sys/types.h>
#include <libutil.h>
#include <stdio.h>

void
hexdump(const void *ptr, int length, const char *hdr, int flags)
{
int i, j, k;
int cols;
const unsigned char *cp;
char delim;

if ((flags & HD_DELIM_MASK) != 0)
delim = (flags & HD_DELIM_MASK) >> 8;
else
delim = ' ';

if ((flags & HD_COLUMN_MASK) != 0)
cols = flags & HD_COLUMN_MASK;
else
cols = 16;

cp = ptr;
for (i = 0; i < length; i+= cols) {
if (hdr != NULL)
printf("%s", hdr);

if ((flags & HD_OMIT_COUNT) == 0)
printf("%04x ", i);

if ((flags & HD_OMIT_HEX) == 0) {
for (j = 0; j < cols; j++) {
k = i + j;
if (k < length)
printf("%c%02x", delim, cp[k]);
else
printf(" ");
}
}

if ((flags & HD_OMIT_CHARS) == 0) {
printf(" |");
for (j = 0; j < cols; j++) {
k = i + j;
if (k >= length)
printf(" ");
else if (cp[k] >= ' ' && cp[k] <= '~')
printf("%c", cp[k]);
else
printf(".");
}
printf("|");
}
printf("\n");
}
}

52 changes: 52 additions & 0 deletions contrib/libutil/libutil.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright (c) 1996 Peter Wemm <[email protected]>.
* All rights reserved.
* Copyright (c) 2002 Networks Associates Technology, Inc.
* All rights reserved.
*
* Portions of this software were developed for the FreeBSD Project by
* ThinkSec AS and NAI Labs, the Security Research Division of Network
* Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
* ("CBOSS"), as part of the DARPA CHATS research program.
*
* Redistribution and use in source and binary forms, with or without
* modification, is permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD: stable/8/lib/libutil/libutil.h 185548 2008-12-02 06:50:26Z peter $
* $Id$
*/

#ifndef _LIBUTIL_H_
#define _LIBUTIL_H_

void hexdump(const void *ptr, int length, const char *hdr, int flags);

/* hexdump(3) */
#define HD_COLUMN_MASK 0xff
#define HD_DELIM_MASK 0xff00
#define HD_OMIT_COUNT (1 << 16)
#define HD_OMIT_HEX (1 << 17)
#define HD_OMIT_CHARS (1 << 18)

#endif /* !_LIBUTIL_H_ */
10 changes: 10 additions & 0 deletions libfreefare/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ libfreefare_la_SOURCES = freefare.c \
desfire_error.c \
mifare_application.c \
tlv.c
libfreefare_la_LIBADD =

if WITH_DEBUG
if HAS_LIBUTIL
libfreefare_la_LIBADD += -lutil
else # HAS_LIBUTIL
libfreefare_la_LIBADD += $(top_builddir)/contrib/libutil/libutil.la
AM_CFLAGS += -I$(top_builddir)/contrib/libutil/ -DWITH_DEBUG
endif # !HAS_LIBUTIL
endif # WITH_DEBUG

libfreefare_la_HEADERS = freefare.h
libfreefare_ladir = $(includedir)
Expand Down
6 changes: 6 additions & 0 deletions libfreefare/freefare_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,10 @@ struct mifare_ultralight_tag {
#define DB_AB(ab) ((ab == C_DEFAULT) ? C_000 : ab)
#define TB_AB(ab) ((ab == C_DEFAULT) ? C_100 : ab)

#ifdef WITH_DEBUG
#define DEBUG_XFER(data, nbytes, hint) do { hexdump (data, nbytes, hint, 0); } while (0)
#else
#define DEBUG_XFER(data, nbytes, hint) do {} while (0)
#endif

#endif /* !__FREEFARE_INTERNAL_H__ */
6 changes: 6 additions & 0 deletions libfreefare/mifare_desfire.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@
#include <string.h>
#include <strings.h>

#ifdef WITH_DEBUG
# include "libutil.h"
#endif

#include <freefare.h>
#include "freefare_internal.h"

Expand Down Expand Up @@ -179,8 +183,10 @@ static ssize_t read_data (MifareTag tag, uint8_t command, uint8_t file_no, off_
do { \
errno = 0; \
MIFARE_DESFIRE (tag)->last_picc_error = OPERATION_OK; \
DEBUG_XFER (msg, __##msg##_n, "===> "); \
if (!(nfc_initiator_transceive_dep_bytes (tag->device, msg, __##msg##_n, res, &__##res##_n))) \
return errno = EIO, -1; \
DEBUG_XFER (res, __##res##_n, "<=== "); \
if ((1 == __##res##_n) && (OPERATION_OK != res[0]) && (ADDITIONAL_FRAME != res[0])) \
return MIFARE_DESFIRE (tag)->last_picc_error = res[0], -1; \
} while (0)
Expand Down

0 comments on commit 61a5ff4

Please sign in to comment.