<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/23404">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils: osmo-aka-verify to verify UMTS AKA (SIM side)<br><br>This new utility implements the UMTS AKA procedures of the SIM<br>side.  It can be used to manually verify the correctness of<br>authentication tuples received from the network.<br><br>Change-Id: I497747fbf09f633dcd7c592bd9af7fca9a820645<br>---<br>M debian/libosmocore-utils.install<br>M utils/Makefile.am<br>A utils/osmo-aka-verify.c<br>3 files changed, 247 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/debian/libosmocore-utils.install b/debian/libosmocore-utils.install</span><br><span>index d23cc73..9501bec 100644</span><br><span>--- a/debian/libosmocore-utils.install</span><br><span>+++ b/debian/libosmocore-utils.install</span><br><span>@@ -1,3 +1,4 @@</span><br><span> usr/bin/osmo-arfcn</span><br><span> usr/bin/osmo-auc-gen</span><br><span style="color: hsl(120, 100%, 40%);">+usr/bin/osmo-aka-verify</span><br><span> usr/bin/osmo-config-merge</span><br><span>diff --git a/utils/Makefile.am b/utils/Makefile.am</span><br><span>index 4e54a78..3f2b13f 100644</span><br><span>--- a/utils/Makefile.am</span><br><span>+++ b/utils/Makefile.am</span><br><span>@@ -8,12 +8,14 @@</span><br><span> if ENABLE_UTILITIES</span><br><span> EXTRA_DIST = conv_gen.py conv_codes_gsm.py</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS += osmo-arfcn osmo-auc-gen osmo-config-merge</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS += osmo-arfcn osmo-auc-gen osmo-config-merge osmo-aka-verify</span><br><span> </span><br><span> osmo_arfcn_SOURCES = osmo-arfcn.c</span><br><span> </span><br><span> osmo_auc_gen_SOURCES = osmo-auc-gen.c</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+osmo_aka_verify_SOURCES = osmo-aka-verify.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> osmo_config_merge_SOURCES = osmo-config-merge.c</span><br><span> osmo_config_merge_LDADD = $(LDADD) $(TALLOC_LIBS)</span><br><span> osmo_config_merge_CFLAGS = $(TALLOC_CFLAGS)</span><br><span>diff --git a/utils/osmo-aka-verify.c b/utils/osmo-aka-verify.c</span><br><span>new file mode 100644</span><br><span>index 0000000..5134d79</span><br><span>--- /dev/null</span><br><span>+++ b/utils/osmo-aka-verify.c</span><br><span>@@ -0,0 +1,243 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bit64gen.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Utility program for implementing the SIM-side procedures of 3GPP Authentication and Key Agreement</span><br><span style="color: hsl(120, 100%, 40%);">+ * as specified by 3GPP TS 33.102 Section 6.3.3</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Milenage library code used from libosmocore, which inherited it from wpa_supplicant</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: libosmogsm implements those, but doesn't declare them */</span><br><span style="color: hsl(120, 100%, 40%);">+int milenage_f1(const uint8_t *opc, const uint8_t *k, const uint8_t *_rand,</span><br><span style="color: hsl(120, 100%, 40%);">+             const uint8_t *sqn, const uint8_t *amf, uint8_t *mac_a, uint8_t *mac_s);</span><br><span style="color: hsl(120, 100%, 40%);">+int milenage_f2345(const uint8_t *opc, const uint8_t *k, const uint8_t *_rand,</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint8_t *res, uint8_t *ck, uint8_t *ik, uint8_t *ak, uint8_t *akstar);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int milenage_check(const uint8_t *opc, const uint8_t *k, const uint8_t *sqn, const uint8_t *_rand,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const uint8_t *autn, uint8_t *ik, uint8_t *ck, uint8_t *res, size_t *res_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                         uint8_t *auts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t xmac[8], ak[6], rx_sqn_bin[6];</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned long long rx_sqn;</span><br><span style="color: hsl(120, 100%, 40%);">+    const uint8_t *amf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("=== Static SIM parameters:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Milenage SIM K: %s\n", osmo_hexdump_nospc(k, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("Milenage SIM OPc: %s\n", osmo_hexdump_nospc(opc, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Milenage SIM SQN: %s\n", osmo_hexdump_nospc(sqn, 6));</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("=== Authentication Tuple as received from Network:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Milenage Input RAND: %s\n", osmo_hexdump_nospc(_rand, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Milenage Input AUTN: %s\n", osmo_hexdump_nospc(autn, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("\tAUTN(+)AK: %s\n", osmo_hexdump_nospc(autn, 6));</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("\tAMF: %s\n", osmo_hexdump_nospc(autn+6, 2));</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("\tMAC: %s\n", osmo_hexdump_nospc(autn+8, 8));</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (milenage_f2345(opc, k, _rand, res, ck, ik, ak, NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  *res_len = 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Milenage f2-Computed RES: %s\n", osmo_hexdump_nospc(res, *res_len));</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("Milenage f3-Computed CK: %s\n", osmo_hexdump_nospc(ck, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("Milenage f4-Computed IK: %s\n", osmo_hexdump_nospc(ik, 16));</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("Milenage f5-Computed AK: %s\n", osmo_hexdump_nospc(ak, 6));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* AUTN = (SQN ^ AK) || AMF || MAC */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            rx_sqn_bin[i] = autn[i] ^ ak[i];</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_sqn = osmo_load64be_ext(rx_sqn_bin, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Milenage Computed SQN: %s (%llu)\n", osmo_hexdump_nospc(rx_sqn_bin, 6), rx_sqn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (memcmp(rx_sqn_bin, sqn, 6) <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("Milenage: RX-SQN differs from SIM SQN: Re-Sync!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t auts_amf[2] = { 0x00, 0x00 }; /* TS 33.102 v7.0.0, 6.3.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (milenage_f2345(opc, k, _rand, NULL, NULL, NULL, NULL, ak))</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Milenage Computed AK*: %s", osmo_hexdump_nospc(ak, 6));</span><br><span style="color: hsl(120, 100%, 40%);">+             for (i = 0; i < 6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                    auts[i] = sqn[i] ^ ak[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             if (milenage_f1(opc, k, _rand, sqn, auts_amf, NULL, auts + 6))</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Milenage AUTS: %s\n", osmo_hexdump_nospc(auts, 14));</span><br><span style="color: hsl(120, 100%, 40%);">+                return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   amf = autn + 6;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (milenage_f1(opc, k, _rand, rx_sqn_bin, amf, xmac, NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("Milenage f1-Computed XMAC: %s\n", osmo_hexdump_nospc(xmac, 8));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (memcmp(xmac, autn + 8, 8) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(stderr, "Milenage: MAC mismatch!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void help()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       printf( "Static SIM card parameters:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "-k  --key\tSpecify Ki / K\n"</span><br><span style="color: hsl(120, 100%, 40%);">+               "-o  --opc\tSpecify OPC\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "-O  --op\tSpecify OP\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "-f  --amf\tSpecify AMF\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "-s  --sqn\tSpecify SQN\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "Authentication Tuple by network:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                //"-i  --ind\tSpecify IND slot for new SQN after AUTS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            //"-l  --ind-len\tSpecify IND bit length (default=5)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "-r  --rand\tSpecify RAND random value\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "-A  --autn\tSpecify AUTN authentication nonce\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_k[16];</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_opc[16];</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_rand[16];</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_autn[16];</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_amf[16];</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned long long g_sqn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc, option_index;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool rand_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     bool autn_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     bool sqn_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool k_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool opc_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool amf_is_set = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool opc_is_op = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int c;</span><br><span style="color: hsl(120, 100%, 40%);">+                static struct option long_options[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "key", 1, 0, 'k' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "opc", 1, 0, 'o' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "op", 1, 0, 'O' },</span><br><span style="color: hsl(120, 100%, 40%);">+                        { "amf", 1, 0, 'f' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "sqn", 1, 0, 's' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "rand", 1, 0, 'r' },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { "autn", 1, 0, 'A' },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { "help", 0, 0, 'h' },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { 0, 0, 0, 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             c = getopt_long(argc, argv, "k:o:O:f:s:r:A:h", long_options, &option_index);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (c == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'k':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_k, sizeof(g_k));</span><br><span style="color: hsl(120, 100%, 40%);">+                 k_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'o':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_opc, sizeof(g_opc));</span><br><span style="color: hsl(120, 100%, 40%);">+                     opc_is_op = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                    opc_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'O':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_opc, sizeof(g_opc));</span><br><span style="color: hsl(120, 100%, 40%);">+                     opc_is_op = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                     opc_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'A':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_autn, sizeof(g_autn));</span><br><span style="color: hsl(120, 100%, 40%);">+                   autn_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'f':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_amf, sizeof(g_amf));</span><br><span style="color: hsl(120, 100%, 40%);">+                     amf_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 's':</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_sqn = strtoull(optarg, 0, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+                      sqn_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'r':</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc = osmo_hexparse(optarg, g_rand, sizeof(g_rand));</span><br><span style="color: hsl(120, 100%, 40%);">+                   rand_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+                     help();</span><br><span style="color: hsl(120, 100%, 40%);">+                       exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+              default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      help();</span><br><span style="color: hsl(120, 100%, 40%);">+                       exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      help();</span><br><span style="color: hsl(120, 100%, 40%);">+                       fprintf(stderr, "\nError parsing argument of option `%c'\n", c);</span><br><span style="color: hsl(120, 100%, 40%);">+                        exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!k_is_set || !opc_is_set || !autn_is_set || !rand_is_set) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Error: K, OP[c], AUTN and RAND are mandatory arguments\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              help();</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!sqn_is_set)</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Warning: You may want to specify SQN\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!amf_is_set)</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Warning: You may want to specify AMF\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (opc_is_op) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("osmo-aka-check (C) 2021 by Harald Welte\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t ck[16];</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t ik[16];</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t res[16];</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t res_len;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t auts[14];</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t sqn_bin[6];</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_store64be_ext(g_sqn, sqn_bin, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = milenage_check(g_opc, g_k, sqn_bin, g_rand, g_autn, ck, ik, res, &res_len, auts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Authentication FAILED!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Authentication SUCCEEDED\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/23404">change 23404</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/23404"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I497747fbf09f633dcd7c592bd9af7fca9a820645 </div>
<div style="display:none"> Gerrit-Change-Number: 23404 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>