<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>