From 26538bb9e22df20416f8f4a1bd93e0f0fcdbc292 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Leroy?= <frederic.leroy@b-com.com>
Date: Tue, 19 Jul 2016 08:12:56 +0200
Subject: [PATCH] UE/API/USIM: move OP to usim_keys_t

---
 openair3/NAS/UE/API/USIM/aka_functions.c | 55 +++++++-----------------
 openair3/NAS/UE/API/USIM/aka_functions.h | 12 +++---
 openair3/NAS/UE/API/USIM/usim_api.c      | 20 +++++++--
 openair3/NAS/UE/API/USIM/usim_api.h      |  1 +
 4 files changed, 38 insertions(+), 50 deletions(-)

diff --git a/openair3/NAS/UE/API/USIM/aka_functions.c b/openair3/NAS/UE/API/USIM/aka_functions.c
index 415ba695f2..68efb2b24a 100644
--- a/openair3/NAS/UE/API/USIM/aka_functions.c
+++ b/openair3/NAS/UE/API/USIM/aka_functions.c
@@ -39,26 +39,6 @@
 #include "aka_functions.h"
 #include "nas_log.h"
 
-/*--------- Operator Variant Algorithm Configuration Field --------*/
-/*------- Insert your value of OP here -------*/
-/* PFT OP used currently in HSS (OPENAIRHSS/auc/kdf.c) */
-#define OAI_LTEBOX
-
-#ifdef OAI_LTEBOX
-//1006020f0a478bf6b699f15c062e42b3
-/*u8 OP[16] = {0xb3, 0x42, 0x2e, 0x06, 0x5c, 0xf1, 0x99, 0xb6,
-             0xf6, 0x8b, 0x47, 0x0a, 0x0f, 0x02, 0x06, 0x10
-	     };*/
-u8 OP[16] = {0x10, 0x06, 0x02, 0x0f, 0x0a, 0x47, 0x8b, 0xf6,
-             0xb6, 0x99, 0xf1, 0x5c, 0x06, 0x2e, 0x42, 0xb3
-};
-#else
-u8 OP[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
-             0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
-            };
-#endif
-/*------- Insert your value of OP here -------*/
-
 /*-------------------------------------------------------------------
  *                            Algorithm f1
  *-------------------------------------------------------------------
@@ -69,7 +49,7 @@ u8 OP[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
  *
  *-----------------------------------------------------------------*/
 void f1    ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
-             u8 mac_a_pP[8] )
+             u8 mac_a_pP[8], const u8 op[16])
 {
   u8 op_c[16];
   u8 temp[16];
@@ -78,7 +58,7 @@ void f1    ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
   u8 rijndaelInput[16];
   u8 i;
   RijndaelKeySchedule( k_pP );
-  ComputeOPc( op_c );
+  ComputeOPc(op, op_c);
 
   for (i=0; i<16; i++)
     rijndaelInput[i] = rand_pP[i] ^ op_c[i];
@@ -124,7 +104,7 @@ void f1    ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
  *
  *-----------------------------------------------------------------*/
 void f2345 ( u8 k_pP[16], u8 rand_pP[16],
-             u8 res_pP[8], u8 ck_pP[16], u8 ik_pP[16], u8 ak_pP[6] )
+             u8 res_pP[8], u8 ck_pP[16], u8 ik_pP[16], u8 ak_pP[6],const u8 op[16])
 {
   u8 op_c[16];
   u8 temp[16];
@@ -142,7 +122,7 @@ void f2345 ( u8 k_pP[16], u8 rand_pP[16],
             rand_pP[8],rand_pP[9],rand_pP[10],rand_pP[11],rand_pP[12],rand_pP[13],rand_pP[14],rand_pP[15]);
 
   RijndaelKeySchedule( k_pP );
-  ComputeOPc( op_c );
+  ComputeOPc(op, op_c);
 
   for (i=0; i<16; i++)
     rijndaelInput[i] = rand_pP[i] ^ op_c[i];
@@ -225,7 +205,7 @@ void f2345 ( u8 k_pP[16], u8 rand_pP[16],
  *
  *-----------------------------------------------------------------*/
 void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
-             u8 mac_s_pP[8] )
+             u8 mac_s_pP[8],const u8 op[16])
 {
   u8 op_c[16];
   u8 temp[16];
@@ -234,7 +214,7 @@ void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
   u8 rijndaelInput[16];
   u8 i;
   RijndaelKeySchedule( k_pP );
-  ComputeOPc( op_c );
+  ComputeOPc(op, op_c);
 
   for (i=0; i<16; i++)
     rijndaelInput[i] = rand_pP[i] ^ op_c[i];
@@ -280,7 +260,7 @@ void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
  *
  *-----------------------------------------------------------------*/
 void f5star( u8 k_pP[16], u8 rand_pP[16],
-             u8 ak_pP[6] )
+             u8 ak_pP[6], const u8 op[16])
 {
   u8 op_c[16];
   u8 temp[16];
@@ -288,7 +268,7 @@ void f5star( u8 k_pP[16], u8 rand_pP[16],
   u8 rijndaelInput[16];
   u8 i;
   RijndaelKeySchedule( k_pP );
-  ComputeOPc( op_c );
+  ComputeOPc(op, op_c);
 
   for (i=0; i<16; i++)
     rijndaelInput[i] = rand_pP[i] ^ op_c[i];
@@ -316,22 +296,17 @@ void f5star( u8 k_pP[16], u8 rand_pP[16],
  * Function to compute OPc from OP and K. Assumes key schedule has
     already been performed.
  *-----------------------------------------------------------------*/
-void ComputeOPc( u8 op_c_pP[16] )
+void ComputeOPc(const u8 op[16], u8 op_c_pP[16])
 {
   u8 i;
   LOG_TRACE(DEBUG,
-            "USIM-API  - ComputeOPc : OP[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
-            OP[0],OP[1],OP[2], OP[3], OP[4], OP[5], OP[6], OP[7],
-            OP[8],OP[9],OP[10],OP[11],OP[12],OP[13],OP[14],OP[15]);
-  RijndaelEncrypt( OP, op_c_pP );
+            "USIM-API  - ComputeOPc : op[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+            op[0],op[1],op[2], op[3], op[4], op[5], op[6], op[7],
+            op[8],op[9],op[10],op[11],op[12],op[13],op[14],op[15]);
+  RijndaelEncrypt( op, op_c_pP );
 
   for (i=0; i<16; i++)
-    op_c_pP[i] ^= OP[i];
-  LOG_TRACE(DEBUG,
-            "USIM-API  - OPc[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
-            op_c_pP[0],op_c_pP[1],op_c_pP[2], op_c_pP[3], op_c_pP[4], op_c_pP[5], op_c_pP[6], op_c_pP[7],
-            op_c_pP[8],op_c_pP[9],op_c_pP[10],op_c_pP[11],op_c_pP[12],op_c_pP[13],op_c_pP[14],op_c_pP[15]);
-
+    op_c_pP[i] ^= op[i];
 
   return;
 } /* end of function ComputeOPc */
@@ -489,7 +464,7 @@ void MixColumn(u8 state[4][4])
  * 16-byte output (using round keys already derived from 16-byte
  * key).
  *-----------------------------------------------------------------*/
-void RijndaelEncrypt( u8 input[16], u8 output[16] )
+void RijndaelEncrypt(const u8 input[16], u8 output[16] )
 {
   u8 state[4][4];
   int i, r;
diff --git a/openair3/NAS/UE/API/USIM/aka_functions.h b/openair3/NAS/UE/API/USIM/aka_functions.h
index 66b5a90fbc..8c370bb76c 100644
--- a/openair3/NAS/UE/API/USIM/aka_functions.h
+++ b/openair3/NAS/UE/API/USIM/aka_functions.h
@@ -23,13 +23,13 @@ typedef unsigned char u8;
 
 /*--------------------------- prototypes --------------------------*/
 void f1    ( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
-             u8 mac_a[8] );
+             u8 mac_a[8], const u8 op[16]);
 void f2345 ( u8 k[16], u8 rand[16],
-             u8 res[8], u8 ck[16], u8 ik[16], u8 ak[6] );
+             u8 res[8], u8 ck[16], u8 ik[16], u8 ak[6], const u8 op[16]);
 void f1star( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
-             u8 mac_s[8] );
+             u8 mac_s[8], const u8 op[16]);
 void f5star( u8 k[16], u8 rand[16],
-             u8 ak[6] );
-void ComputeOPc( u8 op_c[16] );
+             u8 ak[6], const u8 op[16]);
+void ComputeOPc(const u8 op[16], u8 op_c_pP[16] );
 void RijndaelKeySchedule( u8 key[16] );
-void RijndaelEncrypt( u8 input[16], u8 output[16] );
+void RijndaelEncrypt(const u8 input[16], u8 output[16] );
diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c
index fc362e2461..73aeda709d 100644
--- a/openair3/NAS/UE/API/USIM/usim_api.c
+++ b/openair3/NAS/UE/API/USIM/usim_api.c
@@ -112,6 +112,18 @@ int usim_api_read(usim_data_t* data)
   /* initialize the subscriber authentication security key */
   _usim_api_hex_string_to_hex_value(data->keys.usim_api_k, USIM_API_K_VALUE, USIM_API_K_SIZE);
 
+  // initialize OP
+  /* PFT OP used currently in HSS (OPENAIRHSS/auc/kdf.c) */
+  #define OAI_LTEBOX
+
+  #ifdef OAI_LTEBOX
+  u8 _op[16] = {0x10, 0x06, 0x02, 0x0f, 0x0a, 0x47, 0x8b, 0xf6,
+             0xb6, 0x99, 0xf1, 0x5c, 0x06, 0x2e, 0x42, 0xb3 };
+  #else
+  u8 _op[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+             0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
+  #endif
+  memcpy(data->keys.op, _op, sizeof(_op));
   free(path);
   LOG_FUNC_RETURN (RETURNok);
 }
@@ -387,7 +399,7 @@ int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, co
 
   u8 ak[USIM_API_AK_SIZE];
   f2345(usim_data->keys.usim_api_k, rand_pP->value,
-        res_pP->value, ck_pP->value, ik_pP->value, ak);
+        res_pP->value, ck_pP->value, ik_pP->value, ak, usim_data->keys.op);
   LOG_TRACE(INFO, "USIM-API  - res(f2)  :%s",dump_octet_string(res_pP));
   LOG_TRACE(INFO, "USIM-API  - ck(f3)   :%s",dump_octet_string(ck_pP));
   LOG_TRACE(INFO, "USIM-API  - ik(f4)   :%s",dump_octet_string(ik_pP));
@@ -408,7 +420,7 @@ int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, co
   /* Compute XMAC = f1K (SQN || RAND || AMF) */
 #define USIM_API_XMAC_SIZE 8
   u8 xmac[USIM_API_XMAC_SIZE];
-  f1(usim_data->keys.usim_api_k, rand_pP->value, sqn, &autn_pP->value[USIM_API_SQN_SIZE], xmac);
+  f1(usim_data->keys.usim_api_k, rand_pP->value, sqn, &autn_pP->value[USIM_API_SQN_SIZE], xmac, usim_data->keys.op);
   LOG_TRACE(DEBUG,
             "USIM-API  - Computed XMAC %02X%02X%02X%02X%02X%02X%02X%02X",
             xmac[0],xmac[1],xmac[2],xmac[3],
@@ -436,7 +448,7 @@ int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, co
 
     /* Concealed value of the counter SQNms in the USIM:
      * Conc(SQNMS) = SQNMS ⊕ f5*K(RAND) */
-    f5star(usim_data->keys.usim_api_k, rand_pP->value, ak);
+    f5star(usim_data->keys.usim_api_k, rand_pP->value, ak, usim_data->keys.op);
 
 
     u8 sqn_ms[USIM_API_SQNMS_SIZE];
@@ -465,7 +477,7 @@ int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, co
 #define USIM_API_MACS_SIZE USIM_API_XMAC_SIZE
     u8 macs[USIM_API_MACS_SIZE];
     f1star(usim_data->keys.usim_api_k, rand_pP->value, sqn_ms,
-           &rand_pP->value[USIM_API_SQN_SIZE], macs);
+           &rand_pP->value[USIM_API_SQN_SIZE], macs, usim_data->keys.op);
     LOG_TRACE(DEBUG, "USIM-API  - MACS %02X%02X%02X%02X%02X%02X%02X%02X",
               macs[0],macs[1],macs[2],macs[3],
               macs[4],macs[5],macs[6],macs[7]);
diff --git a/openair3/NAS/UE/API/USIM/usim_api.h b/openair3/NAS/UE/API/USIM/usim_api.h
index 5939de019f..9114150396 100644
--- a/openair3/NAS/UE/API/USIM/usim_api.h
+++ b/openair3/NAS/UE/API/USIM/usim_api.h
@@ -113,6 +113,7 @@ typedef struct {
 #define USIM_IK_SIZE  16
   Byte_t ik[USIM_IK_SIZE];
   uint8_t usim_api_k[USIM_API_K_SIZE];
+  uint8_t op[16];
 } usim_keys_t;
 
 /*
-- 
GitLab