Files
2025-01-08 20:11:09 +01:00

397 lines
13 KiB
C

/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*****************************************************************************
Source usim_api.h
Version 0.1
Date 2012/10/09
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Implements the API used by the NAS layer to read/write
data to/from the USIM application
*****************************************************************************/
#ifndef __USIM_API_H__
#define __USIM_API_H__
#include "commonDef.h"
#include "networkDef.h"
#include "OctetString.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/*
* Subscriber authentication security key
*/
#define USIM_API_K_SIZE 16
#define USIM_API_K_VALUE "fec86ba6eb707ed08905757b1bb44b8f"
/*
* The name of the file where are stored data of the USIM application
*/
#define USIM_API_NVRAM_FILENAME ".usim.nvram"
/*
* The name of the environment variable which defines the directory
* where the USIM application file is located
*/
#define USIM_API_NVRAM_DIRNAME "USIM_DIR"
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/*
* USIM TLV parameter structure
* ----------------------------
*/
#define USIM_TLV_T(SIZE) \
struct { \
uint8_t type; \
uint8_t length; \
uint8_t value[SIZE]; \
}
/*
* Non Access Stratum Configuration
* --------------------------------
* TODO: To be encoded as BER-TLV
*/
typedef struct {
/* Determines the NAS signalling priority included in NAS
* messages */
#define USIM_NAS_SIGNALLING_PRIORITY_TAG 0x80U
USIM_TLV_T(1) NAS_SignallingPriority;
/* Indicates whether the "NMO I, Network Mode of Operation I"
* indication is applied by the UE */
#define USIM_NMO_I_BEHAVIOUR_TAG 0x81U
USIM_TLV_T(1) NMO_I_Behaviour;
/* Indicates whether attach with IMSI is performed when moving
* to a non-equivalent PLMN */
#define USIM_ATTACH_WITH_IMSI_TAG 0x82U
USIM_TLV_T(1) AttachWithImsi;
/* Minimum value in minutes for the timer T controlling the
* periodic search for higher prioritized PLMNs */
#define USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG 0x83U
USIM_TLV_T(1) MinimumPeriodicSearchTimer;
/* Indicates whether the extended access barring is applicable
* for the UE */
#define USIM_EXTENDED_ACCESS_BARRING_TAG 0x84U
USIM_TLV_T(1) ExtendedAccessBarring;
/* Indicates whether the timer T3245 and the related
* functionality is used by the UE */
#define USIM_TIMER_T3245_BEHAVIOUR_TAG 0x85U
USIM_TLV_T(1) Timer_T3245_Behaviour;
} usim_nasconfig_t;
/*
* Ciphering and Integrity Keys
* ----------------------------
*/
typedef struct {
/* Key set identifier */
#define USIM_KSI_MIN 0b000
#define USIM_KSI_MAX 0b110
#define USIM_KSI_NOT_AVAILABLE 0b111
uint8_t ksi;
/* Cyphering key */
#define USIM_CK_SIZE 16
uint8_t ck[USIM_CK_SIZE];
/* Integrity key */
#define USIM_IK_SIZE 16
uint8_t ik[USIM_IK_SIZE];
uint8_t usim_api_k[USIM_API_K_SIZE];
uint8_t opc[16];
} usim_keys_t;
/*
* List of last used Sequence Numbers SQN
*/
#define USIM_API_AK_SIZE 6
#define USIM_API_SQN_SIZE USIM_API_AK_SIZE
#define USIM_API_SQNMS_SIZE USIM_API_SQN_SIZE
typedef struct {
/* Highest sequence number the USIM has ever accepted */
uint8_t sqn_ms[USIM_API_SQNMS_SIZE];
/* List of the last used sequence numbers */
#define USIM_API_SQN_LIST_SIZE 32
uint8_t n_sqns;
uint32_t sqn[USIM_API_SQN_LIST_SIZE];
} usim_sqn_data_t;
/*
* EPS NAS Security Context
* ------------------------
* TODO: To be encoded as BER-TLV
*/
typedef struct {
/* Length of all subsequent data */
#define USIM_EPS_NAS_SECURITY_CONTEXT_TAG 0xA0U
uint8_t length;
/* Key set identifier KSI_ASME */
#define USIM_KSI_ASME_TAG 0x80U
USIM_TLV_T(1) KSIasme;
/* ASME key (K_ASME) */
#define USIM_K_ASME_TAG 0x81U
#define USIM_K_ASME_SIZE 32
USIM_TLV_T(USIM_K_ASME_SIZE) Kasme;
/* Uplink NAS count */
#define USIM_UL_NAS_COUNT_TAG 0x82U
#define USIM_UL_NAS_COUNT_SIZE 4
USIM_TLV_T(USIM_UL_NAS_COUNT_SIZE) ulNAScount;
/* Downlink NAS count */
#define USIM_DL_NAS_COUNT_TAG 0x83U
#define USIM_DL_NAS_COUNT_SIZE 4
USIM_TLV_T(USIM_DL_NAS_COUNT_SIZE) dlNAScount;
/* Identifiers of selected NAS integrity and encryption
* algorithms */
#define USIM_INT_ENC_ALGORITHMS_TAG 0x84U
#define USIM_INT_EIA0 0x00
#define USIM_INT_EIA1 0x01
#define USIM_INT_EIA2 0x02
#define USIM_INT_EIA3 0x03
#define USIM_INT_EIA4 0x04
#define USIM_INT_EIA5 0x05
#define USIM_INT_EIA6 0x06
#define USIM_INT_EIA7 0x07
#define USIM_ENC_EEA0 0x00
#define USIM_ENC_EEA1 0x10
#define USIM_ENC_EEA2 0x20
#define USIM_ENC_EEA3 0x30
#define USIM_ENC_EEA4 0x40
#define USIM_ENC_EEA5 0x50
#define USIM_ENC_EEA6 0x60
#define USIM_ENC_EEA7 0x70
USIM_TLV_T(1) algorithmID;
} usim_securityctx_t;
/*
* Subcriber's Number structure
* ----------------------------
*/
typedef struct {
uint8_t length; /* Length of BCD number/SSC contents */
msisdn_t number; /* Mobile subscriber dialing number */
uint8_t conf1_record_id; /* Configuration1 Record Identifier */
uint8_t ext1_record_id; /* Extension1 Record Identifier */
} usim_msisdn_t;
/*
* PLMN Network Name structure
* ---------------------------
*/
typedef struct {
/* PLMN Full Name */
#define USIM_PNN_FULLNAME_TAG 0x43U
#define USIM_PNN_FULLNAME_SIZE NET_FORMAT_LONG_SIZE
USIM_TLV_T(USIM_PNN_FULLNAME_SIZE) fullname;
/* PLMN Short Name */
#define USIM_PNN_SHORTNAME_TAG 0x45U
#define USIM_PNN_SHORTNAME_SIZE NET_FORMAT_SHORT_SIZE
USIM_TLV_T(USIM_PNN_SHORTNAME_SIZE) shortname;
} usim_pnn_t;
/*
* Operator PLMN List structure
* ----------------------------
*/
typedef struct {
/* Tracking Area Identity range */
plmn_t plmn;
tac_t start;
tac_t end;
/* PLMN Network Name Record Identifier */
uint8_t record_id;
} usim_opl_t;
/*
* PLMN with Access Technology structure
* -------------------------------------
*/
typedef struct {
plmn_t plmn;
#define USIM_ACT_GSM 0x8000
#define USIM_ACT_COMPACT 0x4000
#define USIM_ACT_CDMA_HRPD 0x2000
#define USIM_ACT_CDMA_1xRTT 0x1000
#define USIM_ACT_UTRAN 0x0080
#define USIM_ACT_EUTRAN 0x0040
uint16_t AcT;
} usim_plmn_act_t;
/*
* Location information structure
* ------------------------------
*/
typedef struct {
uint32_t tmsi; /* Temporary Mobile Subscriber Identity */
lai_t lai; /* Location Area Identity */
uint8_t reserved; /* Reserved for future use */
#define USIM_LOCI_UPDATED 0x00
#define USIM_LOCI_NOT_UPDATED 0x01
#define USIM_LOCI_PLMN_NOT_ALLOWED 0x02
#define USIM_LOCI_LA_NOT_ALLOWED 0x03
uint8_t status; /* Location update status */
} usim_loci_t;
/*
* Packet Switched location information structure
* ----------------------------------------------
*/
typedef struct {
uint32_t p_tmsi; /* Packet Temporary Mobile Subscriber Identity */
uint8_t signature[3]; /* P-TMSI signature value */
RAI_t rai; /* Routing Area Identity */
#define USIM_PSLOCI_UPDATED 0x00
#define USIM_PSLOCI_NOT_UPDATED 0x01
#define USIM_PSLOCI_PLMN_NOT_ALLOWED 0x02
#define USIM_PSLOCI_LA_NOT_ALLOWED 0x03
uint8_t status; /* Routing Area update status */
} usim_psloci_t;
/*
* EPS location information structure
* ----------------------------------
*/
typedef struct {
GUTI_t guti; /* Globally Unique Temporary UE Identity */
tai_t tai; /* Last visited registered Tracking Area Id */
#define USIM_EPSLOCI_UPDATED 0x00
#define USIM_EPSLOCI_NOT_UPDATED 0x01
#define USIM_EPSLOCI_ROAMING_NOT_ALLOWED 0x02
uint8_t status; /* EPS update status */
} usim_epsloci_t;
/*
* Administrative Data
* -------------------
* Defines information concerning the mode of operation according to the
* type of USIM, such as normal (to be used by PLMN subscribers for 3G
* operations), type approval (to allow specific use of the ME during
* type approval procedures of e.g. the radio equipment), cell testing
* (to allow testing of a cell before commercial use of this cell),
* manufacturer specific (to allow the ME manufacturer to perform specific
* proprietary auto-test in its ME during e.g. maintenance phases).
* It also provides an indication about how some ME features shall work
* during normal operation as well as information about the length of the
* MNC, which is part of the International Mobile Subscriber Identity (IMSI).
*/
typedef struct {
#define USIM_NORMAL_MODE 0x00U
#define USIM_TYPE_APPROVAL_MODE 0x80U
#define USIM_NORMAL_SPECIFIC_MODE 0x01U
#define USIM_TYPE_APPROVAL_SPECIFIC_MODE 0x81U
#define USIM_MAINTENANCE_MODE 0x02U
#define USIM_CELL_TEST_MODE 0x04U
uint8_t UE_Operation_Mode; /* Mode of operation for the UE */
uint16_t Additional_Info; /* Additional information depending on
* the UE operation mode */
uint8_t MNC_Length; /* Number of digits used for extracting
* the MNC from the IMSI */
} usim_ad_t;
/*
*---------------------------------------------------------------------------
* Structure of the data handled by the USIM application
*---------------------------------------------------------------------------
*/
typedef struct {
/*
* Mandatory USIM configuration parameters
* ---------------------------------------
*/
imsi_t imsi; /* International Mobile Subscriber Identity */
usim_keys_t keys; /* Ciphering and Integrity Keys */
uint8_t hpplmn; /* Higher Priority PLMN search period */
#define USIM_FPLMN_MAX 4
plmn_t fplmn[USIM_FPLMN_MAX]; /* List of Forbidden PLMNs */
usim_loci_t loci; /* Location Information */
usim_psloci_t psloci; /* PS Location Information */
usim_ad_t ad; /* Administrative Data */
/*
* Optional USIM configuration parameters
* --------------------------------------
*/
/* EPS NAS security context */
usim_securityctx_t securityctx;
/* Subcriber's Number */
usim_msisdn_t msisdn;
/* PLMN Network Name */
#define USIM_PNN_MAX 8
usim_pnn_t pnn[USIM_PNN_MAX];
/* Operator PLMN List */
#define USIM_OPL_MAX USIM_PNN_MAX
usim_opl_t opl[USIM_OPL_MAX];
/* List of Equivalent HPLMNs */
#define USIM_EHPLMN_MAX 2
plmn_t ehplmn[USIM_EHPLMN_MAX];
/* Home PLMN Selector with Access Technology */
usim_plmn_act_t hplmn;
/* User controlled PLMN Selector with Access Technology */
#define USIM_PLMN_MAX 8
usim_plmn_act_t plmn[USIM_PLMN_MAX];
/* Operator controlled PLMN Selector with Access Technology */
#define USIM_OPLMN_MAX 8
usim_plmn_act_t oplmn[USIM_OPLMN_MAX];
/* EPS Location Information */
usim_epsloci_t epsloci;
/* Non-Access Stratum configuration */
usim_nasconfig_t nasconfig;
/* usim test mode */
uint8_t usimtestmode;
usim_sqn_data_t usim_sqn_data;
} usim_data_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
int usim_api_read(const char *filename, usim_data_t* data);
int usim_api_write(const char *filename, const usim_data_t* data);
int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, const OctetString* autn_pP,
OctetString* auts, OctetString* res,
OctetString* ck, OctetString* ik);
int usim_api_authenticate_test(usim_data_t *usim_data,
const OctetString* rand, const OctetString* autn,
OctetString* auts, OctetString* res,
OctetString* ck, OctetString* ik);
#endif /* __USIM_API_H__*/