Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding protocol-specific information parsing for NFC tags type A & F #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions demo/demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,20 @@ static void trace_dump_mem (unsigned char *bufToReadP, unsigned int size)
g_string_free(bufTrace, TRUE);
}

/*****************************************************************************
* Get readable string of bytes
****************************************************************************/
static gchar* bytes_to_str(GBytes* bytes)
{
gchar* str = g_malloc0( 2*g_bytes_get_size(bytes) + 1 );
const guint8* data = g_bytes_get_data(bytes, NULL);
for(int i = 0 ; i < g_bytes_get_size(bytes); i++)
{
sprintf(&str[2*i], "%02X", data[i]);
}
return str;
}

static void dump_tag (neardal_tag *tag)
{
char **records;
Expand Down Expand Up @@ -151,6 +165,48 @@ static void dump_tag (neardal_tag *tag)
{
}
printf("---- ReadOnly:\t\t%s\n", tag->readOnly ? "TRUE" : "FALSE");
if(tag->iso14443aAtqa != NULL)
{
gchar *str = bytes_to_str(tag->iso14443aAtqa);
printf("---- ISO14443A ATQA:\t\t'%s'\n", str);
g_free(str);
}
if(tag->iso14443aSak != NULL)
{
gchar *str = bytes_to_str(tag->iso14443aSak);
printf("---- ISO14443A SAK:\t\t'%s'\n", str);
g_free(str);
}
if(tag->iso14443aUid != NULL)
{
gchar *str = bytes_to_str(tag->iso14443aUid);
printf("---- ISO14443A UID:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaManufacturer != NULL)
{
gchar *str = bytes_to_str(tag->felicaManufacturer);
printf("---- Felica Manufacturer:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaCid != NULL)
{
gchar *str = bytes_to_str(tag->felicaCid);
printf("---- Felica CID:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaIc != NULL)
{
gchar *str = bytes_to_str(tag->felicaIc);
printf("---- Felica IC Code:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaMaxRespTimes != NULL)
{
gchar *str = bytes_to_str(tag->felicaMaxRespTimes);
printf("---- Felica Maximum Response times:\t\t'%s'\n", str);
g_free(str);
}
}

static void dump_record (neardal_record *record)
Expand Down
21 changes: 21 additions & 0 deletions lib/interface/org.neard.Tag.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,26 @@
<method name="GetRawNDEF">
<arg name="NDEF" type="ay" direction="out"/>
</method>
<property name="Iso14443aUid" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="Iso14443aAtqa" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="Iso14443aSak" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="FelicaManufacturer" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="FelicaCid" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="FelicaIc" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="FelicaMaxRespTimes" type="ay" access="read">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
</interface>
</node>
26 changes: 26 additions & 0 deletions lib/neardal.c
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,15 @@ void neardal_free_tag(neardal_tag *tag)
g_free(tag->tagType[ct++]);
g_free(tag->tagType);

/* Freeing ISO14443A & Felica-specific properties */
g_clear_pointer(&tag->iso14443aAtqa, g_bytes_unref);
g_clear_pointer(&tag->iso14443aSak, g_bytes_unref);
g_clear_pointer(&tag->iso14443aUid, g_bytes_unref);
g_clear_pointer(&tag->felicaManufacturer, g_bytes_unref);
g_clear_pointer(&tag->felicaCid, g_bytes_unref);
g_clear_pointer(&tag->felicaIc, g_bytes_unref);
g_clear_pointer(&tag->felicaMaxRespTimes, g_bytes_unref);

/* Freeing adapter struct */
g_free(tag);
}
Expand Down Expand Up @@ -765,6 +774,22 @@ errorCode_t neardal_get_tag_properties(const char *tagName,
err = NEARDAL_SUCCESS;
}

/* ISO14443A-specific, Felica-Specific properties */
if(tagProp->iso14443aAtqa != NULL)
tagClient->iso14443aAtqa = g_bytes_ref(tagProp->iso14443aAtqa);
if(tagProp->iso14443aSak != NULL)
tagClient->iso14443aSak = g_bytes_ref(tagProp->iso14443aSak);
if(tagProp->iso14443aUid != NULL)
tagClient->iso14443aUid = g_bytes_ref(tagProp->iso14443aUid);
if(tagProp->felicaManufacturer != NULL)
tagClient->felicaManufacturer = g_bytes_ref(tagProp->felicaManufacturer);
if(tagProp->felicaCid != NULL)
tagClient->felicaCid = g_bytes_ref(tagProp->felicaCid);
if(tagProp->felicaIc != NULL)
tagClient->felicaIc = g_bytes_ref(tagProp->felicaIc);
if(tagProp->felicaMaxRespTimes != NULL)
tagClient->felicaMaxRespTimes = g_bytes_ref(tagProp->felicaMaxRespTimes);

tagClient->nbTagTypes = 0;
tagClient->tagType = NULL;
/* Count TagTypes */
Expand All @@ -784,6 +809,7 @@ errorCode_t neardal_get_tag_properties(const char *tagName,
tagClient->tagType[ct] = g_strdup(tagProp->tagType[ct]);
ct++;
}

err = NEARDAL_SUCCESS;

exit:
Expand Down
17 changes: 17 additions & 0 deletions lib/neardal.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
#define NEARDAL_H
#include "neardal_errors.h"

#include <glib.h>


#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Expand Down Expand Up @@ -88,6 +91,20 @@ typedef struct {
const char *type;
/*! @brief Read-Only flag (is tag writable?) */
short readOnly;
/*! @brief ISO14443A ATQA (if present) */
GBytes *iso14443aAtqa;
/*! @brief ISO14443A SAK (if present) */
GBytes *iso14443aSak;
/*! @brief ISO14443A UID (if present) */
GBytes *iso14443aUid;
/*! @brief Felica Manufacturer info (if present) */
GBytes *felicaManufacturer;
/*! @brief Felica CID (if present) */
GBytes *felicaCid;
/*! @brief Felica IC Code (if present) */
GBytes *felicaIc;
/*! @brief Felica Max reponse times (if present) */
GBytes *felicaMaxRespTimes;
} neardal_tag;

/*!
Expand Down
44 changes: 44 additions & 0 deletions lib/neardal_tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,43 @@ static errorCode_t neardal_tag_prv_read_properties(TagProp *tagProp)
if (tmpOut != NULL)
tagProp->readOnly = g_variant_get_boolean(tmpOut);

/* ISO14443A-specific fields (optional) */
tmpOut = g_variant_lookup_value(tmp, "Iso14443aAtqa",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->iso14443aAtqa = g_variant_get_data_as_bytes(tmpOut);

tmpOut = g_variant_lookup_value(tmp, "Iso14443aSak",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->iso14443aSak = g_variant_get_data_as_bytes(tmpOut);

tmpOut = g_variant_lookup_value(tmp, "Iso14443aUid",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->iso14443aUid = g_variant_get_data_as_bytes(tmpOut);

/* Felica-specific fields (optional) */
tmpOut = g_variant_lookup_value(tmp, "FelicaManufacturer",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->felicaManufacturer = g_variant_get_data_as_bytes(tmpOut);

tmpOut = g_variant_lookup_value(tmp, "FelicaCid",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->felicaCid = g_variant_get_data_as_bytes(tmpOut);

tmpOut = g_variant_lookup_value(tmp, "FelicaIc",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->felicaIc = g_variant_get_data_as_bytes(tmpOut);

tmpOut = g_variant_lookup_value(tmp, "FelicaMaxRespTimes",
G_VARIANT_TYPE_BYTESTRING);
if ( (tmpOut != NULL) && (g_variant_n_children(tmpOut) > 0) )
tagProp->felicaMaxRespTimes = g_variant_get_data_as_bytes(tmpOut);

exit:
return err;
}
Expand Down Expand Up @@ -167,6 +204,13 @@ static void neardal_tag_prv_free(TagProp **tagProp)
g_free((*tagProp)->name);
g_free((*tagProp)->type);
g_strfreev((*tagProp)->tagType);
g_clear_pointer(&((*tagProp)->iso14443aAtqa), g_bytes_unref);
g_clear_pointer(&((*tagProp)->iso14443aSak), g_bytes_unref);
g_clear_pointer(&((*tagProp)->iso14443aUid), g_bytes_unref);
g_clear_pointer(&((*tagProp)->felicaManufacturer), g_bytes_unref);
g_clear_pointer(&((*tagProp)->felicaCid), g_bytes_unref);
g_clear_pointer(&((*tagProp)->felicaIc), g_bytes_unref);
g_clear_pointer(&((*tagProp)->felicaMaxRespTimes), g_bytes_unref);
g_free((*tagProp));
(*tagProp) = NULL;
}
Expand Down
9 changes: 9 additions & 0 deletions lib/neardal_tag.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ typedef struct {
gchar **tagType; /* array of tag types */
gsize tagTypeLen;
gboolean readOnly; /* Read-Only flag */

GBytes *iso14443aAtqa; /* ISO14443A ATQA */
GBytes *iso14443aSak; /* ISO14443A SAK */
GBytes *iso14443aUid; /* ISO14443A UID */

GBytes *felicaManufacturer; /* Felica Manufacturer info */
GBytes *felicaCid; /* Felica CID */
GBytes *felicaIc; /* Felica IC code */
GBytes *felicaMaxRespTimes; /* Felica Max response times */
} TagProp;

/*****************************************************************************
Expand Down
57 changes: 57 additions & 0 deletions ncl/ncl_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ typedef struct {
NCLError ncl_cmd_list(int argc, char *argv[]);

/* Local Utilities functions */
/*****************************************************************************
* Get readable string of bytes
****************************************************************************/
static gchar* ncl_cmd_prv_bytes_to_str(GBytes* bytes)
{
gchar* str = g_malloc0( 2*g_bytes_get_size(bytes) + 1 );
const guint8* data = g_bytes_get_data(bytes, NULL);
for(int i = 0 ; i < g_bytes_get_size(bytes); i++)
{
sprintf(&str[2*i], "%02X", data[i]);
}
return str;
}

/*****************************************************************************
* Tool function : help command to dump parameters command
****************************************************************************/
Expand Down Expand Up @@ -212,6 +226,49 @@ static void ncl_cmd_prv_dump_tag(neardal_tag *tag)
NCL_CMD_PRINT("\n");
NCL_CMD_PRINT(".. ReadOnly:\t\t%s\n" ,
tag->readOnly ? "TRUE" : "FALSE");

if(tag->iso14443aAtqa != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->iso14443aAtqa);
NCL_CMD_PRINT(".. ISO14443A ATQA:\t\t'%s'\n", str);
g_free(str);
}
if(tag->iso14443aSak != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->iso14443aSak);
NCL_CMD_PRINT(".. ISO14443A SAK:\t\t'%s'\n", str);
g_free(str);
}
if(tag->iso14443aUid != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->iso14443aUid);
NCL_CMD_PRINT(".. ISO14443A UID:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaManufacturer != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->felicaManufacturer);
NCL_CMD_PRINT(".. Felica Manufacturer:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaCid != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->felicaCid);
NCL_CMD_PRINT(".. Felica CID:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaIc != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->felicaIc);
NCL_CMD_PRINT(".. Felica IC Code:\t\t'%s'\n", str);
g_free(str);
}
if(tag->felicaMaxRespTimes != NULL)
{
gchar *str = ncl_cmd_prv_bytes_to_str(tag->felicaMaxRespTimes);
NCL_CMD_PRINT(".. Felica Maximum Response times:\t\t'%s'\n", str);
g_free(str);
}
}

/*****************************************************************************
Expand Down