]> err.no Git - yubikey-personalization/commitdiff
add ykp_ndef_as_text() to get the text back from YK_NDEF
authorKlas Lindfors <klas@yubico.com>
Fri, 9 Nov 2012 14:08:50 +0000 (15:08 +0100)
committerKlas Lindfors <klas@yubico.com>
Fri, 9 Nov 2012 14:08:50 +0000 (15:08 +0100)
libykpers-1.map
ykpers.c
ykpers.h

index 6bdf7d24fcf8d4d7a478a4a67939e6e0a765ddb9..0ea98e62236d2ffa4f2b825454a0407ac1a88121 100644 (file)
@@ -166,5 +166,6 @@ LIBYKPERS_1.10 {
   global:
 # Functions:
   yk_write_ndef2;
+  ykp_ndef_as_text;
 # Variables:
 } LIBYKPERS_1.9;
index 52aee8238bebcf62b2734560818b4cbe2a26ba06..12ead7d69958c3164c30fb5c0e35da2bd6b3d606 100644 (file)
--- a/ykpers.c
+++ b/ykpers.c
@@ -445,6 +445,43 @@ int ykp_construct_ndef_text(YK_NDEF *ndef, const char *text, const char *lang, b
        return 1;
 }
 
+int ykp_ndef_as_text(YK_NDEF *ndef, char *text, size_t len)
+{
+       if(ndef->type == 'U') {
+               const char *part = NULL;
+               size_t offset = 0;
+               if(ndef->data[0] > 0) {
+                       part = ndef_identifiers[ndef->data[0] - 1];
+                       offset = strlen(part);
+               }
+               if(offset + ndef->len - 1 > len) {
+                       ykp_errno = YKP_EINVAL;
+                       return 0;
+               }
+               if(part) {
+                       memcpy(text, part, offset);
+               }
+               memcpy(text + offset, ndef->data + 1, ndef->len - 1);
+               text[ndef->len + offset] = 0;
+               return 1;
+       }
+       else if(ndef->type == 'T') {
+               unsigned char status = ndef->data[0];
+               if(status & 0x80)
+                       status ^= 0x80;
+               if(ndef->len - status - 1 > len) {
+                       ykp_errno = YKP_EINVAL;
+                       return 0;
+               }
+               memcpy(text, ndef->data + status + 1, ndef->len - status - 1);
+               text[ndef->len - status] = 0;
+               return 1;
+       }
+       else {
+               return 0;
+       }
+}
+
 int ykp_set_ndef_access_code(YK_NDEF *ndef, unsigned char *access_code)
 {
        if(ndef)
index 9a142f013be7556657bc9149f2b53db597d122cf..4eeec6a5eb64dc5fd9b605de341ff5de6c14ce3f 100644 (file)
--- a/ykpers.h
+++ b/ykpers.h
@@ -72,6 +72,7 @@ int ykp_free_ndef(YK_NDEF *ndef);
 int ykp_construct_ndef_uri(YK_NDEF *ndef, const char *uri);
 int ykp_construct_ndef_text(YK_NDEF *ndef, const char *text, const char *lang, bool isutf16);
 int ykp_set_ndef_access_code(YK_NDEF *ndef, unsigned char *access_code);
+int ykp_ndef_as_text(YK_NDEF *ndef, char *text, size_t len);
 
 int ykp_set_access_code(YKP_CONFIG *cfg, unsigned char *access_code, size_t len);
 int ykp_set_fixed(YKP_CONFIG *cfg, unsigned char *fixed, size_t len);