blob: 59535b40b806f3c7dc0473470a5bbaae3d283962 [file] [log] [blame]
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* custom_nvram_sec.c
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
* This file is intends for NVRAM security customization.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#if !defined(NVRAM_NOT_PRESENT)
#include <string.h>
#include <stdio.h>
#include "kal_general_types.h"
#include "custom_nvram_sec.h"
#include "kal_public_api.h"
#include "SST_secure.h"
#include "nvram_lid_statistics.h" /* NVRAM_SECUPACK_SIZE */
#include "sml_public_def.h"
#include "cust_chl_interface.h"
#include "che_api.h"
#ifndef __OPTR_NONE__
#include "op_custom_nvram_sec.h"
#endif
#include "custom_nvram_extra.h" /* SML_STATE_UNLOCK */
#ifdef NVRAM_AUTO_GEN
// fake API for nvram_auto_gen compile
#define memcpy(...)
#define memset(...)
#endif
#if defined(NVRAM_AUTO_GEN)
/********************************************************************************
* This key is used to encrypt (software) the data with NVRAM_ATTR_CONFIDENTIAL
* in NVRAM , we suggest custom must change this key and make it secretly if possible
*************************************************************/
const kal_uint8 custom_secret_key[NVRAM_SECRET_KEY_SIZE] = {0x31, 0x32, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
const kal_uint8 custom_key_seed[NVRAM_CUSTOM_KEY_SEED_SIZE]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12,013,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C};
const kal_uint8 NVRAM_SECURE_PARA[SEC_RO_PARA_TOTAL] =
{
0x01
};
/********************************************************************
* This configuration is used to configure NVRAM checksum algorithm
********************************************************************/
/*
* typedef struct
* {
* kal_uint32 enhance_algo_size;
* kal_uint32 enhance_algo_type;
* kal_uint32 default_algo_size;
* kal_uint32 default_algo_type;
* } nvram_checksum_config;
*
*/
const nvram_checksum_config CUSTOM_CHK_ALGO_CONFIG =
{
32, NVRAM_HMAC_SHA256, 16, NVRAM_MD5
};
#ifdef __SECURE_USB_DOWNLOAD__
const kal_uint8 custom_symmetric_key[NVRAM_SECRET_KEY_MAX_SIZE] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
};
const T_Customer_Public_Key custom_asymmetric_key =
{
2, 64, 0x0051, 8,
{0x0001, 0x0001},
{
0x002A, 0x178D, 0xBCB4, 0xC985, 0xD21E, 0x2A71, 0xDBE4, 0x1E27,
0x29CD, 0x2285, 0x65B3, 0x6596, 0x2B4C, 0x8266, 0x057B, 0xB911,
0x283D, 0x1912, 0xB02D, 0x2B15, 0xB61D, 0x8DB9, 0xC1D9, 0x069C,
0xA352, 0xD7F6, 0x0EAB, 0x46EB, 0xB0CE, 0xAEC5, 0x842C, 0x92B1,
0x94FC, 0xD410, 0x60F5, 0x8F2C, 0x186A, 0x9527, 0xF40A, 0x4DF9,
0xA31D, 0x86C0, 0x7464, 0xB57C, 0x600A, 0xB37A, 0x02FB, 0xD0A6,
0x6399, 0xB779, 0x96A7, 0x9B5E, 0x2E8D, 0x0247, 0xA844, 0x28EE,
0x26B6, 0xAF64, 0x7C49, 0xC924, 0xD8DF, 0x5FBA, 0xEBAA, 0xB74F
}
};
#endif /* __SECURE_USB_DOWNLOAD__ */
/* --Boundry - Custom SecuPack Default Values-- */
/* --Boundry - Custom SecuPack Default Values-- */
#else /* NVRAM_AUTO_GEN */
#include "nvram_sec.h"
/*
* Local variable
*/
static int X;
static int hashIndex = 0;
/*****************************************************************************
* FUNCTION
* custom_nvram_sec_ro_size
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint32 custom_nvram_sec_ro_size(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return 0;
}
/*****************************************************************************
* FUNCTION
* custom_nvram_sec_ro_size
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint32 custom_nvram_secupack_size(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return NVRAM_SECUPACK_SIZE;
}
/*****************************************************************************
* FUNCTION
* custom_nvram_secupack_total
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint32 custom_nvram_secupack_total(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return NVRAM_SECUPACK_TOTAL;
}
/*****************************************************************************
* FUNCTION
* custom_nvram_sec_ro_size
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint32 custom_nvram_key_len(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return NVRAM_SECRET_KEY_SIZE;
}
/*****************************************************************************
* FUNCTION
* IV_generator
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
int custom_nvram_IV_generator(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
/*
* f(x)=A*|X-B|+C
* if(X>B)
* hashIndex = (A*(X-B)+C)%256;
* else
* hashIndex = (A*(B-X)+C)%256;
*/
return hashIndex;
}
/*****************************************************************************
* FUNCTION
* custom_nvram_get_key
* DESCRIPTION
*
* PARAMETERS
* init_key [?]
* keys [?]
* RETURNS
* void
*****************************************************************************/
void custom_nvram_get_key(char *init_key, unsigned char *keys)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
nvram_get_key(init_key, keys);
}
/*****************************************************************************
* FUNCTION
* custom_nvram_encrypt
* DESCRIPTION
*
* PARAMETERS
* keys [?]
* buffer [?]
* length [IN]
* scrambleIndex [IN]
* RETURNS
* void
*****************************************************************************/
void custom_nvram_encrypt(unsigned char const *keys, unsigned char *buffer, unsigned int length, int scrambleIndex)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_int32 ret;
kal_uint8 key_buffer[256] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,256,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
if(ret!=GET_NVRAM_KEY_ERROR_NONE )
{
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
X = scrambleIndex;
nvram_encrypt(key_buffer, buffer, length, custom_nvram_IV_generator);
}
void nvram_AES_encrypt(unsigned char *buffer, unsigned int length)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_int32 ret;
#if defined(__AES256_SUPPORT__)
kal_uint8 key_buffer[NVRAM_AES_KEY_LEN_256BIT] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,NVRAM_AES_KEY_LEN_256BIT,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
#else
kal_uint8 key_buffer[NVRAM_AES_KEY_LEN_128BIT] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,NVRAM_AES_KEY_LEN_128BIT,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
#endif
if(ret!=GET_NVRAM_KEY_ERROR_NONE )
{
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
#if defined(__AES256_SUPPORT__)
ret=nvram_AES_cipher_encrypt(key_buffer, NVRAM_AES_KEY_LEN_256BIT, buffer, buffer, length);
#else
ret=nvram_AES_cipher_encrypt(key_buffer, NVRAM_AES_KEY_LEN_128BIT, buffer, buffer, length);
#endif
if(ret != NVRAM_AES_ERROR_NONE){
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
}
/*****************************************************************************
* FUNCTION
* nvram_calculate_checksum
* DESCRIPTION
*
* PARAMETERS
* type [IN]
* source [IN]
* source_length [IN]
* dest [OUT]
* RETURNS
* void
*****************************************************************************/
void nvram_calculate_checksum(NVRAM_ALGO_TYPE type, kal_uint8 *source, kal_uint32 source_length, kal_uint8 *dest)
{
kal_uint32 ret = 0;
if (source == NULL || dest == NULL) EXT_ASSERT(KAL_FALSE, ret, 0, 0);
kal_uint32 dest_length;
switch(type)
{
case NVRAM_MD5:
{
ret = che_calculate_exc_ext(CHE_MD5, CHE_MODE_NULL, CHE_HASH, NULL, 0, source, source_length, dest, &dest_length);
if (ret != CHE_NO_ERROR) EXT_ASSERT(KAL_FALSE, ret, 0, 0);
break;
}
case NVRAM_HMAC_SHA256:
{
t_cust_chl_sym_key hmac_key;
ret = CustCHL_Gen_Root_Key(&hmac_key);
if (ret != CUST_CHL_ERROR_NONE) EXT_ASSERT(KAL_FALSE, ret, 0, 0);
ret = che_calculate_exc_ext(CHE_MAC_SHA256, CHE_MODE_NULL, CHE_HASH, hmac_key.m_key, hmac_key.m_key_len, source, source_length, dest, &dest_length);
if (ret != CHE_NO_ERROR) EXT_ASSERT(KAL_FALSE, ret, 0, 0);
break;
}
default:
{
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
break;
}
}
}
void nvram_AES_decrypt(unsigned char *buffer, unsigned int length)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_int32 ret;
#if defined(__AES256_SUPPORT__)
kal_uint8 key_buffer[NVRAM_AES_KEY_LEN_256BIT] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,NVRAM_AES_KEY_LEN_256BIT,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
#else
kal_uint8 key_buffer[NVRAM_AES_KEY_LEN_128BIT] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,NVRAM_AES_KEY_LEN_128BIT,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
#endif
if(ret!=GET_NVRAM_KEY_ERROR_NONE )
{
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
#if defined(__AES256_SUPPORT__)
ret=nvram_AES_cipher_decrypt(key_buffer, NVRAM_AES_KEY_LEN_256BIT, buffer, buffer, length);
#else
ret=nvram_AES_cipher_decrypt(key_buffer, NVRAM_AES_KEY_LEN_128BIT, buffer, buffer, length);
#endif
if(ret != NVRAM_AES_ERROR_NONE){
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
}
/*****************************************************************************
* FUNCTION
* custom_nvram_decrypt
* DESCRIPTION
*
* PARAMETERS
* keys [?]
* buffer [?]
* length [IN]
* scrambleIndex [IN]
* RETURNS
* void
*****************************************************************************/
void custom_nvram_decrypt(unsigned char const *keys, unsigned char *buffer, unsigned int length, int scrambleIndex)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_int32 ret;
kal_uint8 key_buffer[256] = {0};
ret=SST_Get_NVRAM_SW_Key((void*)key_buffer,256,(void *)NVRAM_CUSTOM_KEY_SEED,NVRAM_CUSTOM_KEY_SEED_SIZE);
if(ret!=GET_NVRAM_KEY_ERROR_NONE )
{
EXT_ASSERT(KAL_FALSE, ret, 0, 0);
}
X = scrambleIndex;
nvram_decrypt(key_buffer, buffer, length, custom_nvram_IV_generator);
}
/*****************************************************************************
* FUNCTION
* mmi_sml_auto_key_gen_implemetation
* DESCRIPTION
* automatic key generation
* PARAMETERS
* key [IN]
* RETURNS
* void
*****************************************************************************/
void mmi_sml_auto_key_gen_implemetation(unsigned char *key)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
/* return 1234 as default key */
/* please implement this function for automatic key generation */
/* the generated key length should at least 8 digits and also has null-terminator */
key[0] = 0x31;
key[1] = 0x32;
key[2] = 0x33;
key[3] = 0x34;
key[4] = 0x35;
key[5] = 0x36;
key[6] = 0x37;
key[7] = 0x38;
key[8] = 0;
}
#endif /* NVRAM_AUTO_GEN */
/*
* typedef struct {
* kal_uint32 magic_head; -> 4
* sml_category_meta_struct cat[SML_SUPPORT_CAT_SIZE]; -> ( 4 * 7)
* sml_control_key_struct key[SML_SUPPORT_CAT_SIZE]; -> ( 9 * 7)
* kal_uint8 code_cat_n[SML_CFG_CAT_N_SIZE]; -> (30 * 3)
* kal_uint8 code_cat_ns[SML_CFG_CAT_NS_SIZE]; -> (30 * 4)
* kal_uint8 code_cat_sp[SML_CFG_CAT_SP_SIZE]; -> (30 * 4)
* kal_uint8 code_cat_c[SML_CFG_CAT_C_SIZE]; -> (30 * 5)
* kal_uint8 code_cat_sim[SML_CFG_CAT_SIM_SIZE]; -> (30 * 8)
* kal_uint8 code_cat_ns_sp[SML_CFG_CAT_NS_SP_SIZE]; -> ( 5 * 10)
* kal_uint8 code_cat_sim_c[SML_CFG_CAT_SIM_C_SIZE]; -> (10 * 10)
* kal_uint8 range_cat_ns[SML_CAT_NS_RANGE_SIZE]; -> 2
* kal_uint32 magic_tail; -> 4
* } sml_context_struct; -> 971
*/
const nvram_sml_context_struct NVRAM_EF_SML_DEFAULT =
{
SML_MAGIC_HEAD_VALUE,
#ifdef CUSTOM_SML_DEFAULT
CUSTOM_SML_DEFAULT
#else /* CUSTOM_SML_DEFAULT */
{{SML_STATE_UNLOCK,SML_RETRY_COUNT_N_CAT,0,0}, /* Category N */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_NS_CAT ,0,0}, /* Category NS */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_SP_CAT ,0,0}, /* Category SP */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_C_CAT ,0,0}, /* Category C */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_SIM_CAT ,0,0}, /* Category SIM */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_NS_CAT ,0,0}, /* Link NS-SP */
{SML_STATE_UNLOCK,SML_RETRY_COUNT_C_CAT ,0,0}}, /* Link SIM-C */
{{SML_KEY_EMPTY,{0x21,0x43,0x65,0x87,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x65,0x87,0x21,0x43,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x11,0x11,0x22,0x22,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x33,0x33,0x44,0x44,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x55,0x55,0x66,0x66,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x77,0x77,0x88,0x88,0xFF,0xFF,0xFF,0xFF}},
{SML_KEY_EMPTY,{0x99,0x99,0x00,0x00,0xFF,0xFF,0xFF,0xFF}}},
/* Category N code */
{0xc1,0xc1,0xc1,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF},
/* Category NS code */
{0xc2,0xc2,0xc2,0xc2,
0xFF,0xFF,0xFF,0xFF},
/* Category SP code */
{0xc3,0xc3,0xc3,0xc3,
0xFF,0xFF,0xFF,0xFF},
/* Category C code */
{0xc4,0xc4,0xc4,0xc4,0xc4,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category SIM code */
{0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* Link Category NS-SP */
{0xc6,0xc6,0xc6,0xc6,0xc6,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Link Category SIM-C */
{0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* NS Range size */
{0xFF,0xFF},
#endif /* CUSTOM_SML_DEFAULT */
SML_MAGIC_TAIL_VALUE
};
const nvram_sml_tmo_context_struct NVRAM_EF_SML_TMO_DEFAULT =
{
{0x00,0x01,0x00,0x05}, /* version */
SML_PROTECTION_SCHEME_HMAC_SHA256, /* protection scheme */
SML_TMO_STATE_PERMANENT_LOCK, /* state */
{0x00, 0x5C}, /* length (92=42+32+16+2) */
{0x00, 0x04}, /* num of mcc-mnc */
{0x31, 0x02, 0x60, 0x00, /* mcc-mnc list */
0x31, 0x03, 0x10, 0x00,
0x31, 0x03, 0x00, 0x00,
0x00, 0x10, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
},
{0x00, 0x01}, /* num of gid */
{0x54, 0x4D, /* gid lst */
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00},
{0,0}, /* reserved */
{0,0,0,0,0,0,0,0}, /* start time */
{0,0,0,0}, /* end time */
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* imei */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC or signature */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0,0,0,0} /* unlock time */
};
const nvram_sml_att_context_struct NVRAM_EF_L4_SML_ATT_DEFAULT =
{
{0x00,0x01,0x00,0x05}, /* version */
SML_PROTECTION_SCHEME_HMAC_SHA256, /* protection scheme */
SML_ATT_STATE_PERMANENT_LOCK, /* state */
{0x00, 0x52}, /* length (82) */
{0x00, 0x02}, /* num of mcc-mnc */
{0x31, 0x01, 0x50, 0x00, /* mcc-mnc list */
0x00, 0x10, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
},
{0x00, 0x00}, /* num of gid */
{0x00, 0x00, /* gid lst */
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00},
{0,0}, /* reserved */
{0,0,0,0,0,0,0,0}, /* start time */
{0,0,0,0}, /* end time */
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* imei */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC or signature */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0,0,0,0} /* unlock time */
};
#ifndef __MTK_INTERNAL_ENG_USER__
/* --------------------------------------------------------- */
/* For customer's project, use hashed control key in default */
/* --------------------------------------------------------- */
const nvram_sml_context_s_struct NVRAM_EF_SML_S_DEFAULT =
{
SML_MAGIC_HEAD_VALUE,
#ifdef CUSTOM_SML_DEFAULT
CUSTOM_SML_DEFAULT
#else /* CUSTOM_SML_DEFAULT */
{{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_N_CAT,0,0}, /* Category N */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_NS_CAT,0,0}, /* Category NS */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_SP_CAT,0,0}, /* Category SP */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_C_CAT,0,0}, /* Category C */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_SIM_CAT,0,0}, /* Category SIM */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_NS_CAT,0,0}, /* Category NS-SP */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_C_CAT,0,0}}, /* Category SIM-C */
/* Category N Key: 12345678 */
{{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0xEB,0xDE,0x3A,0x82,0xC1,0xFD,0xBD,0x6C,0xC9,0xA7,0x8F,0x56,0xD3,0x32,0x30,0xA1,
0x1F,0x8B,0x3B,0xE6,0x0B,0x11,0x82,0x63,0xD0,0x79,0xB1,0xD8,0x09,0x06,0x5E,0x12,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS Key: 56781234 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x31,0xB0,0x62,0xB3,0x3D,0x8D,0x1D,0xBC,0x6F,0xF1,0x7E,0x78,0x88,0x02,0x4F,0x71,
0x73,0x12,0x55,0x9A,0x6F,0x81,0xDD,0x58,0xF6,0x9D,0x77,0xC0,0x62,0x01,0x84,0x4C,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SP Key: 11112222 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0xAB,0x60,0x7E,0x6D,0x16,0x59,0xA6,0x03,0x90,0xBC,0x89,0x84,0x69,0xBE,0x98,0xBE,
0x32,0xCF,0xA6,0xE3,0x7E,0x87,0x65,0xC8,0xA0,0x4D,0x68,0x14,0x35,0x9D,0xD9,0x10,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category C Key: 33334444 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x7B,0x31,0x28,0xE9,0x81,0xCE,0x5D,0x8C,0x8F,0xF9,0x29,0x5A,0xA3,0x58,0x8B,0xDC,
0xD7,0xFE,0x31,0x27,0x80,0xFB,0x72,0x83,0xFC,0x12,0xD8,0x6D,0x67,0xCC,0xF6,0x30,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM Key: 55556666 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x1B,0x46,0x92,0x9D,0x8C,0xD3,0x83,0x01,0xD3,0x4E,0x36,0x24,0x1F,0x24,0x00,0x1B,
0x03,0x67,0x57,0x88,0x46,0x1A,0x90,0xCC,0xDB,0xFE,0x59,0x1D,0x69,0x63,0x78,0xB5,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS-SP Key: 77778888 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x54,0x87,0x4F,0xD2,0x86,0x21,0xAF,0xE1,0xB4,0xAD,0x88,0xBC,0x26,0x83,0x72,0x43,
0x5E,0x79,0x2B,0x25,0x40,0x1A,0x4D,0x86,0x62,0x96,0x3E,0x20,0x53,0x8F,0xA0,0x31,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM-C Key: 99990000 */
{SML_KEY_EMPTY,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x43,0xBE,0x90,0x63,0xB8,0x3A,0xAB,0xD5,0x94,0x8B,0x8B,0x28,0x38,0xA4,0xCD,0x59,
0x01,0xE5,0x74,0xCC,0xC1,0x64,0x8D,0xD7,0x44,0x3C,0x49,0xE2,0x16,0x05,0x15,0xE6,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}},
#if SML_S_LID_VER >= 2
/* Category N PUK Key: 12345678 */
{{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0xEB,0xDE,0x3A,0x82,0xC1,0xFD,0xBD,0x6C,0xC9,0xA7,0x8F,0x56,0xD3,0x32,0x30,0xA1,
0x1F,0x8B,0x3B,0xE6,0x0B,0x11,0x82,0x63,0xD0,0x79,0xB1,0xD8,0x09,0x06,0x5E,0x12,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS PUK Key: 56781234 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x31,0xB0,0x62,0xB3,0x3D,0x8D,0x1D,0xBC,0x6F,0xF1,0x7E,0x78,0x88,0x02,0x4F,0x71,
0x73,0x12,0x55,0x9A,0x6F,0x81,0xDD,0x58,0xF6,0x9D,0x77,0xC0,0x62,0x01,0x84,0x4C,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SP PUK Key: 11112222 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0xAB,0x60,0x7E,0x6D,0x16,0x59,0xA6,0x03,0x90,0xBC,0x89,0x84,0x69,0xBE,0x98,0xBE,
0x32,0xCF,0xA6,0xE3,0x7E,0x87,0x65,0xC8,0xA0,0x4D,0x68,0x14,0x35,0x9D,0xD9,0x10,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category C PUK Key: 33334444 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x7B,0x31,0x28,0xE9,0x81,0xCE,0x5D,0x8C,0x8F,0xF9,0x29,0x5A,0xA3,0x58,0x8B,0xDC,
0xD7,0xFE,0x31,0x27,0x80,0xFB,0x72,0x83,0xFC,0x12,0xD8,0x6D,0x67,0xCC,0xF6,0x30,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM PUK Key: 55556666 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x1B,0x46,0x92,0x9D,0x8C,0xD3,0x83,0x01,0xD3,0x4E,0x36,0x24,0x1F,0x24,0x00,0x1B,
0x03,0x67,0x57,0x88,0x46,0x1A,0x90,0xCC,0xDB,0xFE,0x59,0x1D,0x69,0x63,0x78,0xB5,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS-SP PUK Key: 77778888 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x54,0x87,0x4F,0xD2,0x86,0x21,0xAF,0xE1,0xB4,0xAD,0x88,0xBC,0x26,0x83,0x72,0x43,
0x5E,0x79,0x2B,0x25,0x40,0x1A,0x4D,0x86,0x62,0x96,0x3E,0x20,0x53,0x8F,0xA0,0x31,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM-C PUK Key: 99990000 */
{SML_PUK_KEY_DISABLE, 5, 5,
1,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x03,0xe8},
{0x43,0xBE,0x90,0x63,0xB8,0x3A,0xAB,0xD5,0x94,0x8B,0x8B,0x28,0x38,0xA4,0xCD,0x59,
0x01,0xE5,0x74,0xCC,0xC1,0x64,0x8D,0xD7,0x44,0x3C,0x49,0xE2,0x16,0x05,0x15,0xE6,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}},
#endif
/* Category N code */
{0xc1,0xc1,0xc1,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF},
/* Category NS code */
{0xc2,0xc2,0xc2,0xc2,
0xFF,0xFF,0xFF,0xFF},
/* Category SP code */
{0xc3,0xc3,0xc3,0xc3,
0xFF,0xFF,0xFF,0xFF},
/* Category C code */
{0xc4,0xc4,0xc4,0xc4,0xc4,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category SIM code */
{0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category NS-SP */
{0xc6,0xc6,0xc6,0xc6,0xc6,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category SIM-C */
{0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* NS Range size */
{0xFF,0xFF},
#endif /* CUSTOM_SML_DEFAULT */
SML_MAGIC_TAIL_VALUE
};
#else /* not __MTK_INTERNAL_ENG_USER__ */
/* --------------------------------------------------------- */
/* For MTK internal usage only */
/* --------------------------------------------------------- */
const nvram_sml_context_s_struct NVRAM_EF_SML_S_DEFAULT =
{
SML_MAGIC_HEAD_VALUE,
{{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_N_CAT,0,0}, /* Category N */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_NS_CAT,0,0}, /* Category NS */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_SP_CAT,0,0}, /* Category SP */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_C_CAT,0,0}, /* Category C */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_SIM_CAT,0,0}, /* Category SIM */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_NS_CAT,0,0}, /* Category NS-SP */
{SML_STATE_UNLOCK,5,SML_RETRY_COUNT_C_CAT,0,0}}, /* Category SIM-C */
/* Category N Key: 12345678 */
{{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x21,0x43,0x65,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS Key: 56781234 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x65,0x87,0x21,0x43,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SP Key: 11112222 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x11,0x11,0x22,0x22,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category C Key: 33334444 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x33,0x33,0x44,0x44,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM Key: 55556666 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x55,0x55,0x66,0x66,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS-SP Key: 77778888 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x77,0x77,0x88,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM-C Key: 99990000 */
{SML_KEY_EMPTY,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x99,0x99,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}},
#if SML_S_LID_VER >= 2
/* Category N PUK Key: 12345678 */
{{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x21,0x43,0x65,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS PUK Key: 56781234 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x65,0x87,0x21,0x43,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SP PUK Key: 11112222 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x11,0x11,0x22,0x22,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category C PUK Key: 33334444 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x33,0x33,0x44,0x44,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM PUK Key: 55556666 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x55,0x55,0x66,0x66,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category NS-SP PUK Key: 77778888 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x77,0x77,0x88,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}},
/* Category SIM-C PUK Key: 99990000 */
{SML_PUK_KEY_DISABLE, 5, 5,
0,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00},
{0x99,0x99,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}},
#endif
/* Category N code */
{0xc1,0xc1,0xc1,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF},
/* Category NS code */
{0xc2,0xc2,0xc2,0xc2,
0xFF,0xFF,0xFF,0xFF},
/* Category SP code */
{0xc3,0xc3,0xc3,0xc3,
0xFF,0xFF,0xFF,0xFF},
/* Category C code */
{0xc4,0xc4,0xc4,0xc4,0xc4,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category SIM code */
{0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category NS-SP */
{0xc6,0xc6,0xc6,0xc6,0xc6,
0xFF,0xFF,0xFF,0xFF,0xFF},
/* Category SIM-C */
{0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
/* NS Range size */
{0xFF,0xFF},
SML_MAGIC_TAIL_VALUE
};
#endif /* not __MTK_INTERNAL_ENG_USER__ */
/*****************************************************************************
* FUNCTION
* nvram_sml_ota_converter
* DESCRIPTION
* After LR12A.R1, SML key length is extended to 16.
* So we have to convert the SML context manually.
* PARAMETERS
*
* RETURNS
* void
*****************************************************************************/
void nvram_sml_ota_converter(kal_uint8 *old_value_buffer, kal_uint32 ota_hdr_record_size, kal_uint8 *new_value_buffer, kal_uint32 new_record_size)
{
kal_bool is_small_to_big;
kal_uint8 reset_sml_size;
kal_uint32 record_idx, sml_cat_idx;
if (ota_hdr_record_size == new_record_size)
{
// Same size, just copy whole structure
memcpy(new_value_buffer, old_value_buffer, NVRAM_EF_SML_TOTAL * ota_hdr_record_size);
return;
}
// R1 -> R2, small sml structure -> big sml structure
if (ota_hdr_record_size < new_record_size)
{
is_small_to_big = KAL_TRUE;
}
else // R2 -> R1, big sml structure -> small sml structure
{
is_small_to_big = KAL_FALSE;
}
reset_sml_size = is_small_to_big ? 16 : 8;
for (record_idx = 0; record_idx < NVRAM_EF_SML_TOTAL; record_idx++)
{
if (is_small_to_big)
{
sml_r1_context_struct *old_sml_ptr = (sml_r1_context_struct*) (old_value_buffer + (record_idx * sizeof(sml_r1_context_struct)));
sml_context_struct *new_sml_ptr = (sml_context_struct*) (new_value_buffer + (record_idx * sizeof(sml_context_struct)));
// Handle different key length
for (sml_cat_idx = 0; sml_cat_idx < SML_SUPPORT_CAT_SIZE; sml_cat_idx++)
{
new_sml_ptr->key[sml_cat_idx].state = old_sml_ptr->key[sml_cat_idx].state;
memset(new_sml_ptr->key[sml_cat_idx].key, 0xFF, reset_sml_size);
memcpy(new_sml_ptr->key[sml_cat_idx].key, old_sml_ptr->key[sml_cat_idx].key, 8);
}
// Copy the same part
for (sml_cat_idx = 0; sml_cat_idx < SML_SUPPORT_CAT_SIZE; sml_cat_idx++)
{
memcpy(&new_sml_ptr->cat[sml_cat_idx], &old_sml_ptr->cat[sml_cat_idx], sizeof(sml_category_meta_struct));
}
new_sml_ptr->magic_head = sizeof(sml_context_struct);
//memcpy(new_sml_ptr->cat, old_sml_ptr->cat, SML_SUPPORT_CAT_SIZE);
memcpy(new_sml_ptr->code_cat_n, old_sml_ptr->code_cat_n, SML_CFG_CAT_N_SIZE);
memcpy(new_sml_ptr->code_cat_ns, old_sml_ptr->code_cat_ns, SML_CFG_CAT_NS_SIZE);
memcpy(new_sml_ptr->code_cat_sp, old_sml_ptr->code_cat_sp, SML_CFG_CAT_SP_SIZE);
memcpy(new_sml_ptr->code_cat_c, old_sml_ptr->code_cat_c, SML_CFG_CAT_C_SIZE);
memcpy(new_sml_ptr->code_cat_sim, old_sml_ptr->code_cat_sim, SML_CFG_CAT_SIM_SIZE);
memcpy(new_sml_ptr->code_cat_ns_sp, old_sml_ptr->code_cat_ns_sp, SML_CFG_CAT_NS_SP_SIZE);
memcpy(new_sml_ptr->code_cat_sim_c, old_sml_ptr->code_cat_sim_c, SML_CFG_CAT_SIM_C_SIZE);
memcpy(new_sml_ptr->range_cat_ns, old_sml_ptr->range_cat_ns, SML_CAT_NS_RANGE_SIZE);
new_sml_ptr->magic_tail = old_sml_ptr->magic_tail;
}
else
{
sml_context_struct *old_sml_ptr = (sml_context_struct*) (old_value_buffer + record_idx * sizeof(sml_context_struct));
sml_r1_context_struct *new_sml_ptr = (sml_r1_context_struct*) (new_value_buffer + record_idx * sizeof(sml_r1_context_struct));
// Handle different key length
for (sml_cat_idx = 0; sml_cat_idx < SML_SUPPORT_CAT_SIZE; sml_cat_idx++)
{
new_sml_ptr->key[sml_cat_idx].state = old_sml_ptr->key[sml_cat_idx].state;
memset(new_sml_ptr->key[sml_cat_idx].key, 0xFF, reset_sml_size);
memcpy(new_sml_ptr->key[sml_cat_idx].key, old_sml_ptr->key[sml_cat_idx].key, 8);
}
// Copy the same part
for (sml_cat_idx = 0; sml_cat_idx < SML_SUPPORT_CAT_SIZE; sml_cat_idx++)
{
memcpy(&new_sml_ptr->cat[sml_cat_idx], &old_sml_ptr->cat[sml_cat_idx], sizeof(sml_category_meta_struct));
}
new_sml_ptr->magic_head = sizeof(sml_r1_context_struct);
//memcpy(new_sml_ptr->cat, old_sml_ptr->cat, SML_SUPPORT_CAT_SIZE);
memcpy(new_sml_ptr->code_cat_n, old_sml_ptr->code_cat_n, SML_CFG_CAT_N_SIZE);
memcpy(new_sml_ptr->code_cat_ns, old_sml_ptr->code_cat_ns, SML_CFG_CAT_NS_SIZE);
memcpy(new_sml_ptr->code_cat_sp, old_sml_ptr->code_cat_sp, SML_CFG_CAT_SP_SIZE);
memcpy(new_sml_ptr->code_cat_c, old_sml_ptr->code_cat_c, SML_CFG_CAT_C_SIZE);
memcpy(new_sml_ptr->code_cat_sim, old_sml_ptr->code_cat_sim, SML_CFG_CAT_SIM_SIZE);
memcpy(new_sml_ptr->code_cat_ns_sp, old_sml_ptr->code_cat_ns_sp, SML_CFG_CAT_NS_SP_SIZE);
memcpy(new_sml_ptr->code_cat_sim_c, old_sml_ptr->code_cat_sim_c, SML_CFG_CAT_SIM_C_SIZE);
memcpy(new_sml_ptr->range_cat_ns, old_sml_ptr->range_cat_ns, SML_CAT_NS_RANGE_SIZE);
new_sml_ptr->magic_tail = old_sml_ptr->magic_tail;
}
}
}
#if defined(__NVRAM_CRITICAL_DATA_SIGN_SUPPORT__) && !defined(NVRAM_AUTO_GEN)
#include "nvram_interface.h"
#include "cust_chl_interface.h"
#include "custom_sec_key.h"
#include "psw_nvram.h" // For MEID Structure
#include "c2k_nvram_def.h" // For NVRAM_EF_C2K_MOBILE_ID_LID
#include "customer_nvram_def.h"
#include "kal_trace.h"
#include "ccci_rpc_if.h"
#define EXPONENT_DAT "\x01\x00\x01"
#define EXPONENT_LEN 3
//#define DBG_FIXED_CPUID_AND_PRODUCT
typedef enum {
OEM_DATA_TAG_CPUID = 1,
OEM_DATA_TAG_IMEI1 = 2,
OEM_DATA_TAG_IMEI2 = 3,
OEM_DATA_TAG_MEID = 4,
OEM_DATA_WIFI_MAC = 5,
OEM_DATA_BT_MAC = 6,
} nvram_oem_data_tag_enum;
static kal_uint8 val_of_hex(kal_char ch)
{
if (ch >= '0' && ch <= '9') {
return ch - '0';
}
if (ch >= 'A' && ch <= 'F') {
ch |= (0x1<<5); // to lower-case
}
EXT_ASSERT(ch >= 'a' && ch <= 'f', ch, 0, 0);
return ch - 'a' + 10;
}
static void str_to_mem(kal_char *str, kal_uint8 *mem, kal_uint32 str_len)
{
while (str_len > 0) {
kal_uint8 ch;
ch = (val_of_hex(*str++)<<4);
ch |= val_of_hex(*str++);
*mem++ = ch;
str_len -= 2;
}
}
static kal_bool custom_nvram_check_cpuid(kal_uint8 *val, kal_uint8 len)
{
kal_uint32 cpuid[4] = {0};
kal_uint32 ret;
kal_uint32 idx;
kal_uint32 temp;
// Step 1. Read Current CPUID
ret = SST_Get_HRID(cpuid, sizeof(cpuid));
EXT_ASSERT(ret>0, ret, 0, 0);
val += 2; // skip "0x"
len -= 2;
str_to_mem((kal_char *)val, val, len);
len /= 2;
// Step 2. Compare
for (idx = 0; idx < len/4; idx++) {
temp = *val++;
temp = (temp<<8)|(*val++);
temp = (temp<<8)|(*val++);
temp = (temp<<8)|(*val++);
if (temp != cpuid[idx]) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_cpuid not identical %x != %x", temp, cpuid[idx]);
return KAL_FALSE;
}
}
return KAL_TRUE;
}
static kal_bool custom_nvram_check_imei(kal_uint32 imei_idx, kal_uint8 *val, kal_uint8 len, kal_bool chk_rd)
{
kal_uint8 stored_imei[NVRAM_EF_IMEI_IMEISV_SIZE] = {0};
kal_uint8 signed_imei[NVRAM_EF_IMEI_IMEISV_SIZE] = {0};
kal_uint8 idx;
if (chk_rd == KAL_FALSE) {
return KAL_TRUE; // don't check IMEI before for write, only check CPUID
}
// Step 1. Get MTK Format IMEI from val string
// For IMEI: 86233702135540 2 ((15 decimal digits))
// MTK Format: 0x68 32 73 20 31 55 04 f2 (8 bytes hex digits)
// API input String Format: "862337021355402" (15 ascii code string)
EXT_ASSERT(len==15, len, 0, 0);
for (idx = 0; idx < 8; idx ++) {
signed_imei[idx] = val_of_hex(*val++); // low 4bit first
if (idx != 7) {
signed_imei[idx] |= (val_of_hex(*val++)<<4); // High 4bit next
}
}
signed_imei[7] |= 0xF0;
signed_imei[8] = 0;
signed_imei[9] = 0;
// Step 2. Read Stored IMEI
nvram_external_read_data(NVRAM_EF_IMEI_IMEISV_LID, imei_idx, stored_imei, sizeof(stored_imei));
// Step 3. Compare
if (memcmp(stored_imei, signed_imei, 8) != 0) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_imei%d not identical", imei_idx);
if (chk_rd) {
// Write signed IMEI to replace stored IMEI, only check CPUID
if (!nvram_secure_write_imei(sizeof(signed_imei), signed_imei, imei_idx, NULL)) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_imei%d re-write imei fail", imei_idx);
return KAL_FALSE;
} else {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_imei%d re-write with signed data", imei_idx);
return KAL_TRUE;
}
} else {
return KAL_FALSE;
}
}
return KAL_TRUE;
}
static kal_bool custom_nvram_check_meid(kal_uint8 *val, kal_uint8 len, kal_bool chk_rd)
{
PswMobileIDT stored_meid = {0,0};
PswMobileIDT signed_meid = {2,0};
kal_uint8 idx;
if (chk_rd == KAL_FALSE) {
return KAL_TRUE; // don't check MEID before for write
}
// Step 1. Get MTK Format MEID from val string
// For MEID: A000007D8E567C ((14 decimal digits))
// MTK Format: 0xF2A000007D8E567C (64bit long)
// Input String Format: "A000007D8E567C" (14 ascii code string)
EXT_ASSERT(len==14, len, 0, 0);
for (idx = 0; idx < 14; idx ++) {
signed_meid.value <<= 4;
signed_meid.value |= val_of_hex(*val++);
}
signed_meid.value |= ((kal_uint64)0xF2<<56);
// Step 2. Read Stored MEID
nvram_external_read_data(NVRAM_EF_C2K_MOBILE_ID_LID, 1, (kal_uint8 *)&stored_meid, sizeof(stored_meid));
// Step 3. Compare
if (memcmp(&stored_meid, &signed_meid, sizeof(stored_meid)) != 0) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_meid not identical");
if (chk_rd) {
// Write signed IMEI to replace stored IMEI
if (!nvram_external_write_data(NVRAM_EF_C2K_MOBILE_ID_LID, 1, (kal_uint8 *)&signed_meid, sizeof(signed_meid))) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_meid re-write meid fail");
return KAL_FALSE;
} else {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_meid re-write with signed data");
return KAL_TRUE;
}
} else {
return KAL_FALSE;
}
}
return KAL_TRUE;
}
static kal_bool custom_nvram_check_critical_item(kal_uint8 tag, kal_uint8 len, kal_uint8 *val, kal_bool chk_rd)
{
kal_bool ret = KAL_TRUE;
switch(tag) {
case OEM_DATA_TAG_CPUID:
ret = custom_nvram_check_cpuid(val, len);
break;
case OEM_DATA_TAG_IMEI1:
ret = custom_nvram_check_imei(1, val, len, chk_rd);
break;
case OEM_DATA_TAG_IMEI2:
ret = custom_nvram_check_imei(2, val, len, chk_rd);
break;
case OEM_DATA_TAG_MEID:
ret = custom_nvram_check_meid(val, len, chk_rd);
break;
default:
break;
}
return ret;
}
static kal_bool custom_nvram_check_critical_data(void *raw_data, kal_uint32 raw_len, kal_bool chk_rd)
{
kal_uint8 *ptr = (kal_uint8 *)raw_data;
kal_uint8 *data_end;
kal_int16 data_len = 0; // crital data length
nvram_oem_data_tag_enum tag;
kal_uint8 len, *val;
// skip ver, 2 bytes
ptr += 2;
// get length
data_len = (*ptr++)<<8; // high byte
data_len |= (*ptr++); // low byte
if (data_len > raw_len-4) {
return KAL_FALSE;
}
data_end = ptr + data_len;
while (ptr < data_end) {
tag = *ptr++;
len = *ptr++;
val = ptr;
if (custom_nvram_check_critical_item(tag, len, val, chk_rd) == KAL_FALSE) {
// check fail
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_critical_data tag:%d len%d check fail", tag, len);
return KAL_FALSE;
}
ptr += len;
}
return KAL_TRUE;
}
static kal_uint32 custom_nvram_check_sign(t_cust_chl_asym_key *key, void *data, kal_uint32 data_len, void *sign, kal_uint32 sign_len)
{
kal_uint32 ret_val;
ret_val = CustCHL_Verify_RSA_Signature(CUST_CHL_ALG_RSA_PKCS1_V15_SHA256,
data,
data_len,
sign,
sign_len,
key
);
return ret_val;
}
static kal_int32 custom_nvram_get_product_name(kal_char *buff, kal_uint32 len)
{
kal_int32 ret = 0;
kal_char prop_name[] = "ro.product.name";
memset(buff, 0, len);
ret = IPC_RPC_General_Query(IPC_RPC_QUERY_AP_SYS_PROPERTY, prop_name, sizeof(prop_name), buff, len);
if (ret <= 0) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_get_product got error:%d", ret);
}
EXT_ASSERT(ret>0, ret, 0, 0);
buff[ret]='\0';
#if defined(DBG_FIXED_CPUID_AND_PRODUCT)
kal_prompt_trace(MOD_NVRAM, "custom_nvram_get_product get %s", buff);
strcpy(buff, "cactus");
#endif
return ret;
}
static nvram_errno_enum custom_nvram_check_signed_critical_data(kal_uint8 *all_data, kal_uint32 all_data_len, kal_bool chk_rd)
{
kal_char *key = NULL; /* 1024-bits 128-bytes 256-hexs */
kal_uint32 key_len = 0;
kal_char *data = NULL;
kal_uint32 data_len = 0;
kal_char *sign = NULL;
kal_uint32 sign_len = 0;
kal_char *end = NULL;
kal_uint32 chk_ret = 0;
t_cust_chl_asym_key *asym_key = NULL;
kal_uint8 *raw_data = NULL;
kal_uint8 *raw_sign = NULL;
kal_uint8 *tmp_buff = NULL;
nvram_errno_enum final_ret = NVRAM_ERRNO_SUCCESS;
kal_char product[32] = {0};
// protect_data: IMEI1+IMEI2+MEID+CPUID+Model
// NV content: protect_data + signed(protect_data) + Device Type RSA Pub Key + signed(Device Type RSA Pub Key)
asym_key = get_ctrl_buffer(sizeof(t_cust_chl_asym_key));
raw_data = get_ctrl_buffer(NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE/2);
raw_sign = get_ctrl_buffer(NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE/2);
ASSERT(asym_key != NULL);
ASSERT(raw_data != NULL);
ASSERT(raw_sign != NULL);
memset(asym_key, 0, sizeof(t_cust_chl_asym_key));
// Step 1. Check signed(Device Type RSA Pub Key) with ROOT Type RSA Pub Key to get Device Type RSA Pub Key
ASSERT(cust_sec_get_asym_key(1, asym_key) == 0); // key index is 1
data = strstr((kal_char *)all_data, "devPubKeyModulus:");
if (data == NULL) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data devPubKeyModulus not found");
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
data += strlen("devPubKeyModulus:");
end = strstr(data, "\\n");
data_len = end-data;
sign = strstr((kal_char *)all_data, "devPubKeySign:");
if (sign == NULL) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data devPubKeySign not found");
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
sign += strlen("devPubKeySign:");
end = strstr(sign, "\\n");
sign_len = end-sign;
str_to_mem(sign, raw_sign, sign_len);
// signature = rsa_encrypt(root_priv_key, sha256(exponent+modulus+product))
custom_nvram_get_product_name(product, sizeof(product));
tmp_buff = get_ctrl_buffer(NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE/2);
memcpy(tmp_buff, "10001", 5); // fixed 5 bytes exponent
memcpy(tmp_buff+5, data, data_len);
memcpy(tmp_buff+5+data_len, product, strlen(product));
chk_ret = custom_nvram_check_sign(asym_key, tmp_buff, 5+data_len+strlen(product), raw_sign, sign_len/2);
free_ctrl_buffer(tmp_buff);
if (chk_ret != 0) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data dev_pub_key verify fail %d", chk_ret);
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
// Step 2. Check signed(protect_data) with Device Type RSA Pub Key to get protect_data
key = data;
key_len = data_len;
data = strstr((kal_char *)all_data, "criticalData:");
if (data == NULL) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data criticalData not found");
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
data += strlen("criticalData:");
end = strstr(data, "\\n");
data_len = end-data;
sign = strstr((kal_char *)all_data, "crticalDataSign:");
if (sign == NULL) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data criticalDataSign not found");
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
sign += strlen("crticalDataSign:");
//end = strstr(data, "\\n");
//data_len = end-data;
sign_len = key_len;
memset(asym_key, 0, sizeof(t_cust_chl_asym_key));
memcpy(asym_key->m_E_key, EXPONENT_DAT, EXPONENT_LEN); // Exponent is fixed to 10001
asym_key->m_E_len = EXPONENT_LEN;
str_to_mem(key, asym_key->m_N_key, key_len);
asym_key->m_N_len = key_len/2;
str_to_mem(data, raw_data, data_len);
str_to_mem(sign, raw_sign, sign_len);
// signature = rsa_encrypt(dev_priv_key, sha256(nv_data))
chk_ret = custom_nvram_check_sign(asym_key, data, data_len, raw_sign, sign_len/2);
if (chk_ret != 0) {
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data ciritical_data verify fail %d", chk_ret);
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
// Step 3. Check protect_data
if (custom_nvram_check_critical_data(raw_data, data_len/2, chk_rd) == KAL_FALSE) {
final_ret = NVRAM_ERRNO_SIG_CHK_FAIL;
goto end;
}
end:
free_ctrl_buffer(asym_key);
free_ctrl_buffer(raw_data);
free_ctrl_buffer(raw_sign);
kal_prompt_trace(MOD_NVRAM, "custom_nvram_check_signed_critical_data return %d", final_ret);
return final_ret;
}
nvram_lid_enum custom_nvram_get_signed_critical_data_lid()
{
return NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_LID;
}
kal_bool custom_nvram_check_signed_critical_data_before_write(kal_uint8 *wr_dat, kal_uint32 len)
{
if (custom_nvram_check_signed_critical_data(wr_dat, len, KAL_FALSE) != 0) {
return KAL_FALSE;
} else {
return KAL_TRUE;
}
}
kal_bool custom_nvram_read_and_check_signed_critical_data()
{
kal_bool ret_val;
kal_int32 idx = 0, chk_val = 0;
kal_uint8 *data_buff = get_ctrl_buffer(NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE);
ASSERT(data_buff != NULL);
// Only check when IMEI is not empty
ret_val = nvram_external_read_data(NVRAM_EF_IMEI_IMEISV_LID, 1, data_buff, NVRAM_EF_IMEI_IMEISV_SIZE);
if (ret_val != KAL_TRUE) {
free_ctrl_buffer(data_buff);
kal_prompt_trace(MOD_NVRAM, "custom_nvram_read_and_check_signed_critical_data read imei fail");
return KAL_FALSE;
}
// check if default value, default value is all FF
chk_val = 0xFF;
for (idx = 0; idx < NVRAM_EF_IMEI_IMEISV_SIZE; idx++) {
chk_val &= data_buff[idx];
}
if (chk_val == 0xFF) {
free_ctrl_buffer(data_buff);
kal_prompt_trace(MOD_NVRAM, "custom_nvram_read_and_check_signed_critical_data imei is default value, bypass check");
return KAL_TRUE;
}
// Read critical data from nvram
ret_val = nvram_external_read_data(NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_LID, 1, data_buff, NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE);
if (ret_val != KAL_TRUE) {
free_ctrl_buffer(data_buff);
kal_prompt_trace(MOD_NVRAM, "custom_nvram_read_and_check_signed_critical_data read critical data fail");
return KAL_FALSE;
}
// check if default value, default value is all zeros
chk_val = 0;
for (idx = 0; idx < NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE; idx++) {
chk_val |= data_buff[idx];
}
if (chk_val == 0) {
free_ctrl_buffer(data_buff);
kal_prompt_trace(MOD_NVRAM, "custom_nvram_read_and_check_signed_critical_data sign data is default value, check fail");
return KAL_FALSE;
}
// check validation of critical data
if (custom_nvram_check_signed_critical_data(data_buff, NVRAM_EF_CUSTOMER_SIGNED_CRITICAL_DATA_SIZE, KAL_TRUE) != 0) {
ret_val = KAL_FALSE;
} else {
ret_val = KAL_TRUE;
}
free_ctrl_buffer(data_buff);
return ret_val;
}
#endif
#endif /* !defined(NVRAM_NOT_PRESENT) */