]> err.no Git - yubikey-personalization/commitdiff
change signature of ykp_construct_ndef_text()
authorKlas Lindfors <klas@yubico.com>
Fri, 27 Apr 2012 06:23:57 +0000 (08:23 +0200)
committerKlas Lindfors <klas@yubico.com>
Fri, 27 Apr 2012 06:23:57 +0000 (08:23 +0200)
include language and encoding, follow the ndef specification for encoding text in ndef.

tests/test_ndef_construction.c
ykpers.c
ykpers.h
ykpersonalize.c

index f591018939433db4242409b5387e8dc4fb7114b9..ee27db1a9a531b8a86ff3710f7f831a60188419e 100644 (file)
@@ -76,20 +76,38 @@ void _test_exact_text()
 {
        YKNDEF ndef;
        memset(&ndef, 0, sizeof(YKNDEF));
-       char text[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
-       int rc = ykp_construct_ndef_text(&ndef, text);
+       char text[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+       int rc = ykp_construct_ndef_text(&ndef, text, "en", false);
        assert(rc == 0);
        assert(ndef.type == 'T');
-       assert(strncmp(ndef.data, text, NDEF_DATA_SIZE) == 0);
+  assert(ndef.data[0] == 2);
+  assert(strncmp(ndef.data + 1, "en", 2) == 0);
+       assert(strncmp(ndef.data + 3, text, NDEF_DATA_SIZE - 3) == 0);
        assert(ndef.len == NDEF_DATA_SIZE);
 }
 
+void _test_other_lang_text()
+{
+  YKNDEF ndef;
+  memset(&ndef, 0, sizeof(YKNDEF));
+  char text[] = "aaaaaaaaaaaaaaa";
+  size_t text_len = strlen(text);
+  int rc = ykp_construct_ndef_text(&ndef, text, "sv-SE", true);
+  assert(rc == 0);
+  assert(ndef.type == 'T');
+  assert(ndef.data[0] == (0x80 & 5));
+  assert(strncmp(ndef.data + 1, "sv-SE", 5) == 0);
+  assert(strncmp(ndef.data + 6, text, text_len) == 0);
+  assert(ndef.len == text_len + 6);
+}
+
 int main (void)
 {
        _test_https_uri();
        _test_to_long_uri();
        _test_exact_uri();
        _test_exact_text();
+  _test_other_lang_text();
 
        return 0;
 }
index f913c52fb4609a2a78fd6ff9c821bbde7cebd3fc..de9b36c1acc6220f35366127d59e0370d5fbf23b 100644 (file)
--- a/ykpers.c
+++ b/ykpers.c
@@ -402,15 +402,22 @@ int ykp_construct_ndef_uri(YKNDEF *ndef, const char *uri)
 }
 
 /* Fill in the data and len parts of the YKNDEF struct based on supplied text. */
-int ykp_construct_ndef_text(YKNDEF *ndef, const char *text)
+int ykp_construct_ndef_text(YKNDEF *ndef, const char *text, const char *lang, bool isutf16)
 {
        size_t data_length = strlen(text);
-       if(data_length > NDEF_DATA_SIZE) {
+       size_t lang_length = strlen(lang);
+       char status = lang_length;
+       if(isutf16) {
+               status &= 0x80;
+       }
+       if((data_length + lang_length + 1) > NDEF_DATA_SIZE) {
                ykp_errno = YKP_EINVAL;
                return 1;
        }
-       memcpy(ndef->data, text, data_length);
-       ndef->len = data_length;
+       ndef->data[0] = status;
+       memcpy(ndef->data + 1, lang, lang_length);
+       memcpy(ndef->data + lang_length + 1, text, data_length);
+       ndef->len = data_length + lang_length + 1;
        ndef->type = 'T';
        return 0;
 }
index a72a3ecc75d114dbc6cbe4856ef4992ea7402396..4d98ddc062283e3168bd1d8b1d5960bb3de30517 100644 (file)
--- a/ykpers.h
+++ b/ykpers.h
@@ -68,7 +68,7 @@ int ykp_HMAC_key_from_hex(YKP_CONFIG *cfg, const char *hexkey);
 
 /* Functions for constructing the YKNDEF struct before writing it to a neo */
 int ykp_construct_ndef_uri(YKNDEF *ndef, const char *uri);
-int ykp_construct_ndef_text(YKNDEF *ndef, const char *text);
+int ykp_construct_ndef_text(YKNDEF *ndef, const char *text, const char *lang, bool isutf16);
 
 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);
index c5320d272b4087778742e4029f91c743ce5d138d..910fb4319786af45f7c025136fb80bb939a90f28 100644 (file)
@@ -233,7 +233,7 @@ int main(int argc, char **argv)
                                if(ndef_type == 'U') {
                                        ykp_construct_ndef_uri(&ndef, ndef_string);
                                } else if(ndef_type == 'T') {
-                                       ykp_construct_ndef_text(&ndef, ndef_string);
+                                       ykp_construct_ndef_text(&ndef, ndef_string, "en", false);
                                }
                                if(use_access_code) {
                                        memcpy(ndef.curAccCode, access_code, ACC_CODE_SIZE);