dexter has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/onomondo-ipa/+/43413?usp=email )


Change subject: main: load addInitialEimRequest from hex-file
......................................................................

main: load addInitialEimRequest from hex-file

We currently load the addInitialEimRequest binary blob from
a binary file. Unfortunately this is very user-unfriendly
since onomondo-eim generates the eimConfigurationData as
hex string (REST API), which means the user has to convert
this data into a binary file first.

Let's eliminate those extra conversion steps by changing
the input format to a textfile containing a hex-string.
Then users can simply copy+paste the hex string they got
from onomdon-eim.

Related: SYS#8101
Change-Id: Ib2095e5042f42ce77af498831be9c8bd1af32401
---
M README.md
D contrib/sample_eim_cfg.ber
A contrib/sample_eim_cfg.txt
M include/onomondo/ipa/utils.h
M src/ipa/libipa/utils.c
M src/ipa/main.c
M tests/utils/utils_test.c
7 files changed, 84 insertions(+), 23 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/onomondo-ipa refs/changes/13/43413/1

diff --git a/README.md b/README.md
index 2c7ba03..a77d930 100644
--- a/README.md
+++ b/README.md
@@ -106,9 +106,9 @@

 In case the IoT eUICC is not yet provisioned with an eIM configuration, 
onomondo-ipa can be used to perform the
 provisioning. The configuration must be supplied as a file that contains an 
AddInitialEimRequest (see also GSMA SGP.32,
-section 5.9.18) data object in its encoded form. It is up to the user to 
compile the data object using appropriate tools
-and the ASN specification presented in GSMA SGP.32. For testing purposes 
onomondo-ipa ships with a sample configuration
-(contrib/sample_eim_cfg.ber) that expects the eIM to be running at 
127.0.0.1:8000.
+section 5.9.18) data object in its encoded form (as a hex-string). It is up to 
the user to compile the data object using
+appropriate tools (e.g. onomondo-eim). For testing purposes onomondo-ipa ships 
with a sample configuration
+(contrib/sample_eim_cfg.txt) which expects the eIM to be running at 
127.0.0.1:8000.

 Example: load the initial eIM configuration onto the eUICC in PCSC reader 2
 ```
diff --git a/contrib/sample_eim_cfg.ber b/contrib/sample_eim_cfg.ber
deleted file mode 100644
index 0c0d00f..0000000
--- a/contrib/sample_eim_cfg.ber
+++ /dev/null
Binary files differ
diff --git a/contrib/sample_eim_cfg.txt b/contrib/sample_eim_cfg.txt
new file mode 100644
index 0000000..af7d842
--- /dev/null
+++ b/contrib/sample_eim_cfg.txt
@@ -0,0 +1 @@
+BF578183A08180307E800365494D810E3132372E302E302E313A383030308301018401FFA55BA059301306072A8648CE3D020106082A8648CE3D03010703420004FE584A6F450459574AECA195D0299737F74C89BA2D36DF9286EC25D973037A0FBA70D14DF3E1F7D0A305E57B95B731C4DE218D2D7F9F22113ED5D18C2E3DDF1C870207808900
diff --git a/include/onomondo/ipa/utils.h b/include/onomondo/ipa/utils.h
index b01fb6e..2ca4488 100644
--- a/include/onomondo/ipa/utils.h
+++ b/include/onomondo/ipa/utils.h
@@ -38,6 +38,7 @@
        __ptr; \
 })

+struct ipa_buf *ipa_hexparse(char *hexstr);
 char *ipa_hexdump(const uint8_t *data, size_t len);

 struct ipa_buf {
diff --git a/src/ipa/libipa/utils.c b/src/ipa/libipa/utils.c
index 1b50dfb..a3eb77c 100644
--- a/src/ipa/libipa/utils.c
+++ b/src/ipa/libipa/utils.c
@@ -34,6 +34,42 @@
        return def;
 }

+/*! Decode a human readable hexstring to binary.
+ *  \param[in] hexstr pointer to hexstring.
+ *  \returns pointer to ipa_buf containing the decoded binary data. */
+struct ipa_buf *ipa_hexparse(char *hexstr)
+{
+       struct ipa_buf *bin = NULL;
+       size_t i;
+       uint8_t byte;
+       int digit;
+       int digit_counter = 0;
+       size_t hexstr_len = strlen(hexstr);
+
+       bin = ipa_buf_alloc(hexstr_len / 2);
+       for (i = 0; i < hexstr_len; i++) {
+               digit = -1;
+               if (*hexstr >= 0x30 && *hexstr <= 0x39)
+                       digit = *hexstr & 0x0F;
+               else if (*hexstr >= 0x41 && *hexstr <= 0x46)
+                       digit = (*hexstr & 0x0F) + 9;
+               else if (*hexstr >= 0x61 && *hexstr <= 0x66)
+                       digit = (*hexstr & 0x0F) + 9;
+               hexstr++;
+
+               if (digit >= 0) {
+                       if (digit_counter % 2) {
+                               byte |= digit;
+                               bin->data[bin->len] = byte;
+                               bin->len++;
+                       } else
+                               byte = (digit << 4);
+                       digit_counter++;
+               }
+       }
+       return bin;
+}
+
 /*! Generate a hexdump string from the input data.
  *  \param[in] data pointer to binary data.
  *  \param[in] len length of binary data.
diff --git a/src/ipa/main.c b/src/ipa/main.c
index 4312a25..3b26c8f 100644
--- a/src/ipa/main.c
+++ b/src/ipa/main.c
@@ -78,31 +78,31 @@
        printf(" disable-emergency-profile ... Trigger return from emergency 
profile to previous profile\n");
 }

-struct ipa_buf *load_ber_from_file(char *dir, char *file)
+struct ipa_buf *load_ber_from_file(char *file)
 {
-       char path[PATH_MAX] = { 0 };
-       FILE *ber_file = NULL;
-       struct ipa_buf *ber = NULL;
-       size_t ber_size;
+       FILE *hex_file = NULL;
+       struct ipa_buf *hex = NULL;
+       struct ipa_buf *bin = NULL;
+       size_t hex_size;

-       if (dir)
-               strcpy(path, dir);
-       strcat(path, file);
+       hex_file = fopen(file, "r");
+       assert(hex_file);

-       ber_file = fopen(path, "r");
-       assert(ber_file);
+       fseek(hex_file, 0L, SEEK_END);
+       hex_size = ftell(hex_file);
+       rewind(hex_file);

-       fseek(ber_file, 0L, SEEK_END);
-       ber_size = ftell(ber_file);
-       rewind(ber_file);
+       hex = ipa_buf_alloc(hex_size + 1);
+       assert(hex);
+       hex->len = fread(hex->data, sizeof(char), hex->data_len - 1, hex_file);
+       hex->data[hex->len] = '\0';
+       fclose(hex_file);

-       ber = ipa_buf_alloc(ber_size + 1);
-       assert(ber);
+       bin = ipa_hexparse((char *)hex->data);
+       ipa_buf_free(hex);

-       ber->len = fread(ber->data, sizeof(char), ber->data_len, ber_file);
-       fclose(ber_file);
-       IPA_LOGP(SMAIN, LINFO, "loaded BER data from file %s, size: %zu\n", 
path, ber->len);
-       return ber;
+       IPA_LOGP(SMAIN, LINFO, "loaded binary data from hex file %s, size: 
%zu\n", file, bin->len);
+       return bin;
 }

 struct ipa_buf *load_nvstate_from_file(char *path)
@@ -355,7 +355,7 @@
                break;
        case OPER_ADD_INITIAL_EIM:
                /* Load initial eIM configuration */
-               struct ipa_buf *eim_cfg = load_ber_from_file(NULL, 
initial_eim_cfg_file);
+               struct ipa_buf *eim_cfg = 
load_ber_from_file(initial_eim_cfg_file);
                ipa_add_init_eim_cfg(ctx, eim_cfg);
                IPA_FREE(eim_cfg);
                break;
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index 9225e20..c85ff13 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -51,9 +51,32 @@
        IPA_FREE(tag_list);
 }

+void ipa_hexparse_test(void)
+{
+       char hexstr[] =
+           "bf:57:81:83:A0 81 80 30 7E 
80.03.65.494D81////0E31kkk32372En302E302E313A38303oooo0308301018401FFA55BA059301306072A8648CE3D020106082A8648CE3D0301070342...0004FE584A6F450459574A-E-C-A19
  5 
D0299737F74C89BA2D36DFOOOO9286EC25D973037:A0FBA70D14DF3E1F7D0A305E57B95B731C4DE218D2D7F9F22113ed5d18c2e3ddf1c870207808900";
+       char expected_data[] = { 0xBF, 0x57, 0x81, 0x83, 0xA0, 0x81, 0x80, 
0x30, 0x7E, 0x80, 0x03,
+               0x65, 0x49, 0x4D, 0x81, 0x0E, 0x31, 0x32, 0x37, 0x2E, 0x30, 
0x2E, 0x30, 0x2E,
+               0x31, 0x3A, 0x38, 0x30, 0x30, 0x30, 0x83, 0x01, 0x01, 0x84, 
0x01, 0xFF, 0xA5,
+               0x5B, 0xA0, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 
0xCE, 0x3D, 0x02,
+               0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 
0x07, 0x03, 0x42,
+               0x00, 0x04, 0xFE, 0x58, 0x4A, 0x6F, 0x45, 0x04, 0x59, 0x57, 
0x4A, 0xEC, 0xA1,
+               0x95, 0xD0, 0x29, 0x97, 0x37, 0xF7, 0x4C, 0x89, 0xBA, 0x2D, 
0x36, 0xDF, 0x92,
+               0x86, 0xEC, 0x25, 0xD9, 0x73, 0x03, 0x7A, 0x0F, 0xBA, 0x70, 
0xD1, 0x4D, 0xF3,
+               0xE1, 0xF7, 0xD0, 0xA3, 0x05, 0xE5, 0x7B, 0x95, 0xB7, 0x31, 
0xC4, 0xDE, 0x21,
+               0x8D, 0x2D, 0x7F, 0x9F, 0x22, 0x11, 0x3E, 0xD5, 0xD1, 0x8C, 
0x2E, 0x3D, 0xDF,
+               0x1C, 0x87, 0x02, 0x07, 0x80, 0x89, 0x00
+       };
+       struct ipa_buf *bin;
+       bin = ipa_hexparse(hexstr);
+       assert(memcmp(bin->data, expected_data, bin->len) == 0);
+       ipa_buf_free(bin);
+}
+
 int main(int argc, char **argv)
 {
        ipa_tag_in_taglist_test();
+       ipa_hexparse_test();
        return 0;
 }


--
To view, visit https://gerrit.osmocom.org/c/onomondo-ipa/+/43413?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: onomondo-ipa
Gerrit-Branch: master
Gerrit-Change-Id: Ib2095e5042f42ce77af498831be9c8bd1af32401
Gerrit-Change-Number: 43413
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <[email protected]>

Reply via email to