1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file drvNDS_CAM.c
98*53ee8cc1Swenshuai.xi /// @brief NDS CAM Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi // Include Files
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
107*53ee8cc1Swenshuai.xi #include "string.h"
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi #include "drvDSCMB.h"
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi #include "regNDS.h"
113*53ee8cc1Swenshuai.xi #include "drvNDS.h"
114*53ee8cc1Swenshuai.xi #include "halNDS.h"
115*53ee8cc1Swenshuai.xi
116*53ee8cc1Swenshuai.xi //#include "../rasp/halRASP.h"
117*53ee8cc1Swenshuai.xi
118*53ee8cc1Swenshuai.xi #include "../dscmb/drvDSCMB.h" //FIXME: move up or embedded
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.xi #include "ddiNDS_HDI.h"
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi #include "nds.h"
123*53ee8cc1Swenshuai.xi
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
126*53ee8cc1Swenshuai.xi // Driver Compiler Options
127*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
128*53ee8cc1Swenshuai.xi #define CAM_MAX_DSCMB_NUM 6
129*53ee8cc1Swenshuai.xi #define CAM_MAX_CONNECTION 2
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi
132*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi // Local Defines
134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
135*53ee8cc1Swenshuai.xi
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
138*53ee8cc1Swenshuai.xi // Local Structurs
139*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
140*53ee8cc1Swenshuai.xi typedef struct
141*53ee8cc1Swenshuai.xi {
142*53ee8cc1Swenshuai.xi MS_U32 u32DscmbId;
143*53ee8cc1Swenshuai.xi MS_U16 u16Pid;
144*53ee8cc1Swenshuai.xi MS_U8 u8Status;
145*53ee8cc1Swenshuai.xi } CAM_Dscmb;
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi // Global Variables
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
154*53ee8cc1Swenshuai.xi // Local Variables
155*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi static CAM_Dscmb _Dscmb[CAM_MAX_CONNECTION][CAM_MAX_DSCMB_NUM];
158*53ee8cc1Swenshuai.xi static MS_U8 _u8DscmbType[CAM_MAX_CONNECTION];
159*53ee8cc1Swenshuai.xi
160*53ee8cc1Swenshuai.xi #define DSCMB_TYPE_NULL 0xFF
161*53ee8cc1Swenshuai.xi
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi
164*53ee8cc1Swenshuai.xi //static MS_U32 u32ChipPropLen = 0;
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi static MS_U8 u8ChipType[] = // chip type descriptor
167*53ee8cc1Swenshuai.xi {
168*53ee8cc1Swenshuai.xi CHIP_TYPE_DSCR_TAG, 4,
169*53ee8cc1Swenshuai.xi ((NDS_CHIP_TYPE >> 24) & 0xFF), ((NDS_CHIP_TYPE >> 16) & 0xFF), ((NDS_CHIP_TYPE >> 8) & 0xFF), ((NDS_CHIP_TYPE >> 0) & 0xFF),
170*53ee8cc1Swenshuai.xi };
171*53ee8cc1Swenshuai.xi
172*53ee8cc1Swenshuai.xi static MS_U8 u8ChipId[] = // chip id descriptor
173*53ee8cc1Swenshuai.xi {
174*53ee8cc1Swenshuai.xi CHIP_ID_DSCR_TAG, 4,
175*53ee8cc1Swenshuai.xi ((NDS_CHIP_ID >> 24) & 0xFF), ((NDS_CHIP_ID >> 16) & 0xFF), ((NDS_CHIP_ID >> 8) & 0xFF), ((NDS_CHIP_ID >> 0) & 0xFF), // default
176*53ee8cc1Swenshuai.xi };
177*53ee8cc1Swenshuai.xi
178*53ee8cc1Swenshuai.xi static MS_U8 _u8DefaultKey[] =
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F
181*53ee8cc1Swenshuai.xi };
182*53ee8cc1Swenshuai.xi
183*53ee8cc1Swenshuai.xi static MS_U8 u8HashKey[] = // Hash of Key descriptor
184*53ee8cc1Swenshuai.xi {
185*53ee8cc1Swenshuai.xi HASH_KEY_DSCR_TAG, 16,
186*53ee8cc1Swenshuai.xi NDS_HASH_KEY,
187*53ee8cc1Swenshuai.xi // 0xec, 0x04, 0x6d, 0x48, 0x0f, 0xc4, 0xd2, 0x81, 0x32, 0x3e, 0x1f, 0x5d, 0xbe, 0xed, 0x3f, 0x8b, // Hash of Key descriptor
188*53ee8cc1Swenshuai.xi };
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi static MS_U8 u8KLDepth[] = // Hash of Key descriptor
191*53ee8cc1Swenshuai.xi {
192*53ee8cc1Swenshuai.xi KEY_LADDER_DEPTH_DSCR_TAG, 1,
193*53ee8cc1Swenshuai.xi NDS_KL_DEPTH, // key lader depth descriptor
194*53ee8cc1Swenshuai.xi };
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi static MS_U8 u8ChipEnFlags[] = // Chip Enabled Flag Descriptor
197*53ee8cc1Swenshuai.xi {
198*53ee8cc1Swenshuai.xi ENABLE_FLAGS_DSCR_TAG, 1,
199*53ee8cc1Swenshuai.xi NDS_ENFLAGS_DEFAULT,
200*53ee8cc1Swenshuai.xi };
201*53ee8cc1Swenshuai.xi
202*53ee8cc1Swenshuai.xi
203*53ee8cc1Swenshuai.xi
204*53ee8cc1Swenshuai.xi #define NDS_CHIP_PROP_LENGTH (sizeof(u8ChipType)+ sizeof(u8ChipId)+ sizeof(u8HashKey)+ sizeof(u8KLDepth)+ sizeof(u8ChipEnFlags))
205*53ee8cc1Swenshuai.xi // static MS_U8 u8ChipProp[NDS_CHIP_PROP_LENGTH];
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi
208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
209*53ee8cc1Swenshuai.xi // Debug Functions
210*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
214*53ee8cc1Swenshuai.xi // Local Functions
215*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
216*53ee8cc1Swenshuai.xi /*
217*53ee8cc1Swenshuai.xi unsigned long GetXConnection(void)
218*53ee8cc1Swenshuai.xi {
219*53ee8cc1Swenshuai.xi return 0;
220*53ee8cc1Swenshuai.xi }
221*53ee8cc1Swenshuai.xi */
222*53ee8cc1Swenshuai.xi
_NDS_CamMapInit(CAM_Dscmb * pDscmb)223*53ee8cc1Swenshuai.xi static MS_BOOL _NDS_CamMapInit(CAM_Dscmb* pDscmb)
224*53ee8cc1Swenshuai.xi {
225*53ee8cc1Swenshuai.xi pDscmb->u32DscmbId = DRV_DSCMB_FLT_NULL;
226*53ee8cc1Swenshuai.xi pDscmb->u16Pid = 0x1FFF;
227*53ee8cc1Swenshuai.xi pDscmb->u8Status = 0;
228*53ee8cc1Swenshuai.xi return TRUE;
229*53ee8cc1Swenshuai.xi }
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi
232*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
233*53ee8cc1Swenshuai.xi // Global Functions
234*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
235*53ee8cc1Swenshuai.xi
NDS_CAM_Init(void)236*53ee8cc1Swenshuai.xi NDS_Result NDS_CAM_Init(void)
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi MS_U32 i, j;
239*53ee8cc1Swenshuai.xi
240*53ee8cc1Swenshuai.xi for (i = 0; i < CAM_MAX_CONNECTION; i++)
241*53ee8cc1Swenshuai.xi {
242*53ee8cc1Swenshuai.xi for (j = 0; j < CAM_MAX_DSCMB_NUM; j++)
243*53ee8cc1Swenshuai.xi {
244*53ee8cc1Swenshuai.xi _NDS_CamMapInit(&_Dscmb[i][j]);
245*53ee8cc1Swenshuai.xi }
246*53ee8cc1Swenshuai.xi }
247*53ee8cc1Swenshuai.xi
248*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(1, _u8DefaultKey, 16);
249*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(2, _u8DefaultKey, 16);
250*53ee8cc1Swenshuai.xi
251*53ee8cc1Swenshuai.xi // _NDS_SC_Ctrl_Reg |= CAM_UART_CTRL_AUTO_FLOWCTRL;//0x14;
252*53ee8cc1Swenshuai.xi // CAM_REG(REG_CAM_UART_CTRL) = _NDS_SC_Ctrl_Reg;
253*53ee8cc1Swenshuai.xi
254*53ee8cc1Swenshuai.xi return E_NDS_OK;
255*53ee8cc1Swenshuai.xi }
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi
NDS_CAM_Exit(void)258*53ee8cc1Swenshuai.xi NDS_Result NDS_CAM_Exit(void)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi return E_NDS_OK;
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi // CA module hardware indeitifcation --------------------------------------------------------------
265*53ee8cc1Swenshuai.xi
266*53ee8cc1Swenshuai.xi // 5.2
XHDICA_GetLogicalStreamId(int request_type,NDS_ULONG x_connection,NDS_BYTE * hw_module_id)267*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_GetLogicalStreamId (int request_type,
268*53ee8cc1Swenshuai.xi NDS_ULONG x_connection,
269*53ee8cc1Swenshuai.xi NDS_BYTE *hw_module_id)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi NDS_FUNC("[%s][%d] \n", __FUNCTION__, __LINE__);
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi if ((request_type < HDICA_GET_EMM_STREAM) || (request_type > HDICA_GET_DESCRAMBLER_STREAM))
274*53ee8cc1Swenshuai.xi {
275*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
276*53ee8cc1Swenshuai.xi }
277*53ee8cc1Swenshuai.xi
278*53ee8cc1Swenshuai.xi hw_module_id = 0;
279*53ee8cc1Swenshuai.xi return CA_OK;
280*53ee8cc1Swenshuai.xi }
281*53ee8cc1Swenshuai.xi
282*53ee8cc1Swenshuai.xi
283*53ee8cc1Swenshuai.xi // Smart card driver ------------------------------------------------------------------------------
284*53ee8cc1Swenshuai.xi
285*53ee8cc1Swenshuai.xi // nds_sc.c
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi // 6.3.1
HDICA_SetCardId(NDS_ULONG card_id)288*53ee8cc1Swenshuai.xi NDS_STATUS HDICA_SetCardId(NDS_ULONG card_id)
289*53ee8cc1Swenshuai.xi {
290*53ee8cc1Swenshuai.xi NDS_FUNC("[%s][%d]--card_id[0x%lx] \n", __FUNCTION__, __LINE__, card_id);
291*53ee8cc1Swenshuai.xi
292*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_CARDID_0) = 0xFF & card_id;
293*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_CARDID_1) = 0xFF & (card_id>>8);
294*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_CARDID_2) = 0xFF & (card_id>>16);
295*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_CARDID_3) = 0xFF & (card_id>>24);
296*53ee8cc1Swenshuai.xi
297*53ee8cc1Swenshuai.xi return CA_OK;
298*53ee8cc1Swenshuai.xi }
299*53ee8cc1Swenshuai.xi
300*53ee8cc1Swenshuai.xi
301*53ee8cc1Swenshuai.xi // 6.3.2
HDICA_SetIrdId(NDS_ULONG ird_id)302*53ee8cc1Swenshuai.xi NDS_STATUS HDICA_SetIrdId(NDS_ULONG ird_id)
303*53ee8cc1Swenshuai.xi {
304*53ee8cc1Swenshuai.xi NDS_FUNC("[%s][%d]--ird_id[0x%lx] \n", __FUNCTION__, __LINE__, ird_id);
305*53ee8cc1Swenshuai.xi
306*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_IRDID_0) = 0xFF & ird_id;
307*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_IRDID_1) = 0xFF & (ird_id>>8);
308*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_IRDID_2) = 0xFF & (ird_id>>16);
309*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_IRDID_3) = 0xFF & (ird_id>>24);
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi return CA_OK;
312*53ee8cc1Swenshuai.xi }
313*53ee8cc1Swenshuai.xi
314*53ee8cc1Swenshuai.xi // ECM filtering and reception --------------------------------------------------------------------
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi // nds_flt.c
317*53ee8cc1Swenshuai.xi
318*53ee8cc1Swenshuai.xi // 8.2.6
XHDICA_SetCaValue(NDS_ULONG x_connection,NDS_BYTE ca_value)319*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetCaValue( NDS_ULONG x_connection, NDS_BYTE ca_value )
320*53ee8cc1Swenshuai.xi {
321*53ee8cc1Swenshuai.xi return (HDICA_SetCaValue(ca_value));
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi
324*53ee8cc1Swenshuai.xi
325*53ee8cc1Swenshuai.xi // 8.2.7
HDICA_SetCaValue(NDS_BYTE ca_value)326*53ee8cc1Swenshuai.xi NDS_STATUS HDICA_SetCaValue (NDS_BYTE ca_value)
327*53ee8cc1Swenshuai.xi {
328*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] ca_value[0x%x]\n", __FUNCTION__, __LINE__, ca_value);
329*53ee8cc1Swenshuai.xi
330*53ee8cc1Swenshuai.xi //printf("[%s]-[%d] ca_value[0x%x]\n", __FUNCTION__, __LINE__, ca_value);
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_SBOX) = ca_value;
333*53ee8cc1Swenshuai.xi return CA_OK;
334*53ee8cc1Swenshuai.xi }
335*53ee8cc1Swenshuai.xi
336*53ee8cc1Swenshuai.xi
XHDICA_DefineDescramblerType(NDS_ULONG x_connection,NDS_BYTE descrambler_type)337*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineDescramblerType(NDS_ULONG x_connection, NDS_BYTE descrambler_type)
338*53ee8cc1Swenshuai.xi {
339*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] descrambler_type[0x%x]\n", __FUNCTION__, __LINE__, descrambler_type);
340*53ee8cc1Swenshuai.xi
341*53ee8cc1Swenshuai.xi switch (descrambler_type)
342*53ee8cc1Swenshuai.xi {
343*53ee8cc1Swenshuai.xi case CSA:
344*53ee8cc1Swenshuai.xi case NSA:
345*53ee8cc1Swenshuai.xi case DES:
346*53ee8cc1Swenshuai.xi case AES:
347*53ee8cc1Swenshuai.xi break;
348*53ee8cc1Swenshuai.xi default:
349*53ee8cc1Swenshuai.xi descrambler_type = DSCMB_TYPE_NULL;
350*53ee8cc1Swenshuai.xi break;
351*53ee8cc1Swenshuai.xi }
352*53ee8cc1Swenshuai.xi _u8DscmbType[x_connection] = descrambler_type;
353*53ee8cc1Swenshuai.xi return CA_OK;
354*53ee8cc1Swenshuai.xi }
355*53ee8cc1Swenshuai.xi
XHDICA_DefineDescramblerEs(NDS_ULONG x_connection,NDS_BYTE descrambler_num,NDS_USHORT pid,NDS_BYTE filter_control)356*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineDescramblerEs(NDS_ULONG x_connection,
357*53ee8cc1Swenshuai.xi NDS_BYTE descrambler_num,
358*53ee8cc1Swenshuai.xi NDS_USHORT pid,
359*53ee8cc1Swenshuai.xi NDS_BYTE filter_control)
360*53ee8cc1Swenshuai.xi {
361*53ee8cc1Swenshuai.xi CAM_Dscmb* pDscmb = NULL;
362*53ee8cc1Swenshuai.xi NDS_STATUS ret = CA_OK;
363*53ee8cc1Swenshuai.xi DSCMB_Type DscmbType;
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] descrambler_num[%d] pid[0x%x] con[0x%x]\n", __FUNCTION__, __LINE__, descrambler_num, pid, filter_control);
366*53ee8cc1Swenshuai.xi // printf("[%s]-[%d] descrambler_num[%d] pid[0x%x] con[0x%x]\n", __FUNCTION__, __LINE__, descrambler_num, pid, filter_control);
367*53ee8cc1Swenshuai.xi
368*53ee8cc1Swenshuai.xi if (pid < 2 || pid > 0x1FFE)
369*53ee8cc1Swenshuai.xi {
370*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
371*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
372*53ee8cc1Swenshuai.xi }
373*53ee8cc1Swenshuai.xi
374*53ee8cc1Swenshuai.xi if (CAM_MAX_DSCMB_NUM <= descrambler_num)
375*53ee8cc1Swenshuai.xi {
376*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
377*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
378*53ee8cc1Swenshuai.xi }
379*53ee8cc1Swenshuai.xi
380*53ee8cc1Swenshuai.xi // HDICA_DESCRAMBLE_PES_PACKET_LEVEL
381*53ee8cc1Swenshuai.xi if (HDICA_DESCRAMBLE_PES_PACKET_LEVEL & filter_control)
382*53ee8cc1Swenshuai.xi {
383*53ee8cc1Swenshuai.xi ret = CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
384*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, ret, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
385*53ee8cc1Swenshuai.xi goto XHDICA_DefineDescramblerEs_exit;
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi
388*53ee8cc1Swenshuai.xi pDscmb = &(_Dscmb[x_connection][descrambler_num]);
389*53ee8cc1Swenshuai.xi if (!(HDICA_DESCRAMBLER_CONTROL_ENABLE_DESCRAMBLING & filter_control))
390*53ee8cc1Swenshuai.xi {
391*53ee8cc1Swenshuai.xi if (pDscmb->u32DscmbId != DRV_DSCMB_FLT_NULL)
392*53ee8cc1Swenshuai.xi {
393*53ee8cc1Swenshuai.xi // MS_U8 CWFF[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
394*53ee8cc1Swenshuai.xi
395*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeyReset(pDscmb->u32DscmbId, E_DSCMB_KEY_CLEAR);
396*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeyReset(pDscmb->u32DscmbId, E_DSCMB_KEY_EVEN);
397*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeyReset(pDscmb->u32DscmbId, E_DSCMB_KEY_ODD);
398*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltDisconnectPid(pDscmb->u32DscmbId, pid);
399*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltFree(pDscmb->u32DscmbId);
400*53ee8cc1Swenshuai.xi _NDS_CamMapInit(pDscmb);
401*53ee8cc1Swenshuai.xi }
402*53ee8cc1Swenshuai.xi goto XHDICA_DefineDescramblerEs_exit;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi switch (_u8DscmbType[x_connection])
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi case CSA:
409*53ee8cc1Swenshuai.xi DscmbType = E_DSCMB_TYPE_CSA;
410*53ee8cc1Swenshuai.xi break;
411*53ee8cc1Swenshuai.xi case NSA:
412*53ee8cc1Swenshuai.xi DscmbType = E_DSCMB_TYPE_NSA_AS_ESA;
413*53ee8cc1Swenshuai.xi break;
414*53ee8cc1Swenshuai.xi case DES:
415*53ee8cc1Swenshuai.xi DscmbType = E_DSCMB_TYPE_DES;
416*53ee8cc1Swenshuai.xi break;
417*53ee8cc1Swenshuai.xi case AES:
418*53ee8cc1Swenshuai.xi DscmbType = E_DSCMB_TYPE_SYN_AES;
419*53ee8cc1Swenshuai.xi break;
420*53ee8cc1Swenshuai.xi default:
421*53ee8cc1Swenshuai.xi ret = CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
422*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, ret, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
423*53ee8cc1Swenshuai.xi goto XHDICA_DefineDescramblerEs_exit;
424*53ee8cc1Swenshuai.xi }
425*53ee8cc1Swenshuai.xi // HDICA_DESCRAMBLER_CONTROL_ENABLE_DESCRAMBLING || HDICA_DESCRAMBLE_TRANSPORT_PACKET_LEVEL
426*53ee8cc1Swenshuai.xi if ((DRV_DSCMB_FLT_NULL == pDscmb->u32DscmbId) && (DRV_DSCMB_FLT_NULL == (pDscmb->u32DscmbId = MDrv_DSCMB_FltAlloc())))
427*53ee8cc1Swenshuai.xi {
428*53ee8cc1Swenshuai.xi ret = CA_GLOBAL_HARDWARE_FAILURE;
429*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, ret, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
430*53ee8cc1Swenshuai.xi goto XHDICA_DefineDescramblerEs_exit;
431*53ee8cc1Swenshuai.xi }
432*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltConnectPid(pDscmb->u32DscmbId, pid);
433*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltTypeSet(pDscmb->u32DscmbId, DscmbType);
434*53ee8cc1Swenshuai.xi pDscmb->u16Pid = (MS_U16)pid;
435*53ee8cc1Swenshuai.xi pDscmb->u8Status |= (MS_U8)filter_control;
436*53ee8cc1Swenshuai.xi
437*53ee8cc1Swenshuai.xi XHDICA_DefineDescramblerEs_exit:
438*53ee8cc1Swenshuai.xi return ret;
439*53ee8cc1Swenshuai.xi }
440*53ee8cc1Swenshuai.xi
441*53ee8cc1Swenshuai.xi // Legacy interface
XHDICA_SetEvenKey(NDS_ULONG x_connection,NDS_BYTE descrambler_num,NDS_BYTE * key_ptr)442*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetEvenKey(NDS_ULONG x_connection, NDS_BYTE descrambler_num, NDS_BYTE * key_ptr)
443*53ee8cc1Swenshuai.xi {
444*53ee8cc1Swenshuai.xi CAM_Dscmb* pDscmb = NULL;
445*53ee8cc1Swenshuai.xi
446*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi if (CAM_MAX_DSCMB_NUM <= descrambler_num)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
451*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
452*53ee8cc1Swenshuai.xi }
453*53ee8cc1Swenshuai.xi
454*53ee8cc1Swenshuai.xi pDscmb = &(_Dscmb[x_connection][descrambler_num]);
455*53ee8cc1Swenshuai.xi if (pDscmb->u32DscmbId == DRV_DSCMB_FLT_NULL)
456*53ee8cc1Swenshuai.xi {
457*53ee8cc1Swenshuai.xi return CA_INFO_NOT_AVAILABLE;
458*53ee8cc1Swenshuai.xi }
459*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeySet(pDscmb->u32DscmbId, E_DSCMB_KEY_EVEN, key_ptr);
460*53ee8cc1Swenshuai.xi return CA_OK;
461*53ee8cc1Swenshuai.xi }
462*53ee8cc1Swenshuai.xi
463*53ee8cc1Swenshuai.xi // Legacy interface
XHDICA_SetOddKey(NDS_ULONG x_connection,NDS_BYTE descrambler_num,NDS_BYTE * key_ptr)464*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetOddKey(NDS_ULONG x_connection, NDS_BYTE descrambler_num, NDS_BYTE * key_ptr)
465*53ee8cc1Swenshuai.xi {
466*53ee8cc1Swenshuai.xi CAM_Dscmb* pDscmb = NULL;
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
469*53ee8cc1Swenshuai.xi
470*53ee8cc1Swenshuai.xi if (CAM_MAX_DSCMB_NUM <= descrambler_num)
471*53ee8cc1Swenshuai.xi {
472*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
473*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
474*53ee8cc1Swenshuai.xi }
475*53ee8cc1Swenshuai.xi
476*53ee8cc1Swenshuai.xi pDscmb = &(_Dscmb[x_connection][descrambler_num]);
477*53ee8cc1Swenshuai.xi if (pDscmb->u32DscmbId == DRV_DSCMB_FLT_NULL)
478*53ee8cc1Swenshuai.xi {
479*53ee8cc1Swenshuai.xi return CA_INFO_NOT_AVAILABLE;
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeySet(pDscmb->u32DscmbId, E_DSCMB_KEY_ODD, key_ptr);
482*53ee8cc1Swenshuai.xi return CA_OK;
483*53ee8cc1Swenshuai.xi }
484*53ee8cc1Swenshuai.xi
XHDICA_GetSecurityChipNumber(NDS_BYTE * scn)485*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_GetSecurityChipNumber (NDS_BYTE *scn)
486*53ee8cc1Swenshuai.xi {
487*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
488*53ee8cc1Swenshuai.xi
489*53ee8cc1Swenshuai.xi *scn = 0xFF;
490*53ee8cc1Swenshuai.xi return CA_OK;
491*53ee8cc1Swenshuai.xi }
492*53ee8cc1Swenshuai.xi
493*53ee8cc1Swenshuai.xi #if 0 //[FIXME] if enable Rasp
494*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ECMCorruptionSettings(NDS_BYTE CorruptDataByte, NDS_BYTE FromByte)
495*53ee8cc1Swenshuai.xi {
496*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
497*53ee8cc1Swenshuai.xi
498*53ee8cc1Swenshuai.xi MS_U32 EngId = 0;
499*53ee8cc1Swenshuai.xi
500*53ee8cc1Swenshuai.xi //[FIXME] Not Xconection ?
501*53ee8cc1Swenshuai.xi HAL_RASP_SetCorptData(EngId , FromByte , 187 , CorruptDataByte);
502*53ee8cc1Swenshuai.xi
503*53ee8cc1Swenshuai.xi // MDrv_DSCMB_EcmCorruptSet((MS_U8)CorruptDataByte, (MS_U8)FromByte);
504*53ee8cc1Swenshuai.xi return CA_FEATURE_NOT_SUPPORTED;
505*53ee8cc1Swenshuai.xi
506*53ee8cc1Swenshuai.xi }
507*53ee8cc1Swenshuai.xi
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi
510*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_EnableECMCorruption(NDS_ULONG x_connection, NDS_USHORT pid, NDS_BYTE enable_corruption)
511*53ee8cc1Swenshuai.xi {
512*53ee8cc1Swenshuai.xi // @FIXME: complete _NDS_EMM_ECM_Flt_CorruptEnable implementation later
513*53ee8cc1Swenshuai.xi
514*53ee8cc1Swenshuai.xi MS_U32 EngId = 0, i ;
515*53ee8cc1Swenshuai.xi MS_U16 FltPid = 0 ;
516*53ee8cc1Swenshuai.xi MS_BOOL enable ;
517*53ee8cc1Swenshuai.xi
518*53ee8cc1Swenshuai.xi
519*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
520*53ee8cc1Swenshuai.xi
521*53ee8cc1Swenshuai.xi if (enable_corruption == 1)
522*53ee8cc1Swenshuai.xi enable = TRUE ;
523*53ee8cc1Swenshuai.xi else
524*53ee8cc1Swenshuai.xi enable = FALSE ;
525*53ee8cc1Swenshuai.xi
526*53ee8cc1Swenshuai.xi
527*53ee8cc1Swenshuai.xi for( i = 0 ; i < RASP_EVENT_NUM ; i++)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi HAL_RASP_GetPidflt(EngId, i , &FltPid);
530*53ee8cc1Swenshuai.xi if (FltPid == pid) break ;
531*53ee8cc1Swenshuai.xi }
532*53ee8cc1Swenshuai.xi if (RASP_EVENT_NUM == i) return CA_DRIVER_CAN_NOT_PERFORM_FUNCTION_NOW ;
533*53ee8cc1Swenshuai.xi
534*53ee8cc1Swenshuai.xi HAL_RASP_SetCorptFlt(EngId,i,enable);
535*53ee8cc1Swenshuai.xi
536*53ee8cc1Swenshuai.xi
537*53ee8cc1Swenshuai.xi return CA_OK;
538*53ee8cc1Swenshuai.xi }
539*53ee8cc1Swenshuai.xi #endif
540*53ee8cc1Swenshuai.xi
541*53ee8cc1Swenshuai.xi
XHDICA_SecondaryScramblingKey(NDS_ULONG x_connection,NDS_BYTE operation,NDS_BYTE * key_ptr)542*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SecondaryScramblingKey(NDS_ULONG x_connection, NDS_BYTE operation, NDS_BYTE * key_ptr)
543*53ee8cc1Swenshuai.xi {
544*53ee8cc1Swenshuai.xi // nsk packet
545*53ee8cc1Swenshuai.xi // @FIXME: Richard don't know how to deal with secondary key
546*53ee8cc1Swenshuai.xi //TODO:
547*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, CA_FEATURE_NOT_SUPPORTED, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
548*53ee8cc1Swenshuai.xi
549*53ee8cc1Swenshuai.xi if (operation == CA_OP_BASE_KEY)
550*53ee8cc1Swenshuai.xi {}
551*53ee8cc1Swenshuai.xi else if (operation == CA_OP_WRITING)
552*53ee8cc1Swenshuai.xi {}
553*53ee8cc1Swenshuai.xi else
554*53ee8cc1Swenshuai.xi {}
555*53ee8cc1Swenshuai.xi
556*53ee8cc1Swenshuai.xi //TODO:
557*53ee8cc1Swenshuai.xi return CA_FEATURE_NOT_SUPPORTED;
558*53ee8cc1Swenshuai.xi }
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi
_NDS_CamGetHashKey(MS_U8 * pu8KeyData)561*53ee8cc1Swenshuai.xi static void _NDS_CamGetHashKey(MS_U8 *pu8KeyData)
562*53ee8cc1Swenshuai.xi {
563*53ee8cc1Swenshuai.xi DSCMB_KLCfg KLConfig;
564*53ee8cc1Swenshuai.xi
565*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d] \n", __FUNCTION__, __LINE__);
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi KLConfig.bDecrypt = TRUE;
568*53ee8cc1Swenshuai.xi KLConfig.bInverse = FALSE;
569*53ee8cc1Swenshuai.xi KLConfig.bKeepRound = FALSE;
570*53ee8cc1Swenshuai.xi KLConfig.u32Round = 6;
571*53ee8cc1Swenshuai.xi KLConfig.u32EngMode = E_DSCMB_KL_TDES; // @FIXME: only TDES HASH key?
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetConfig(&KLConfig);
574*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KL_SRC_VGK, NULL, 0);
575*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetDst(E_DSCMB_KL_DST_ACPU);
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(0, _u8DefaultKey, 16);
578*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(1, _u8DefaultKey, 16);
579*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(2, _u8DefaultKey, 16);
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Start();
582*53ee8cc1Swenshuai.xi
583*53ee8cc1Swenshuai.xi // (3) polling status
584*53ee8cc1Swenshuai.xi while (1)
585*53ee8cc1Swenshuai.xi {
586*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_IsComplete())
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi break;
589*53ee8cc1Swenshuai.xi }
590*53ee8cc1Swenshuai.xi }
591*53ee8cc1Swenshuai.xi
592*53ee8cc1Swenshuai.xi //Read key
593*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ReadDataFromAcpu(pu8KeyData);
594*53ee8cc1Swenshuai.xi //_verSC_PrintData(pu8KeyData, 18);
595*53ee8cc1Swenshuai.xi
596*53ee8cc1Swenshuai.xi //ACK --release key
597*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ResetAcpuAck();
598*53ee8cc1Swenshuai.xi
599*53ee8cc1Swenshuai.xi // (5) Poll key ladder done
600*53ee8cc1Swenshuai.xi while (1)
601*53ee8cc1Swenshuai.xi {
602*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_Output_IsComplete())
603*53ee8cc1Swenshuai.xi // if (kl_done == ((reg_kl_status & 0x1)))
604*53ee8cc1Swenshuai.xi {
605*53ee8cc1Swenshuai.xi break;
606*53ee8cc1Swenshuai.xi }
607*53ee8cc1Swenshuai.xi }
608*53ee8cc1Swenshuai.xi
609*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Output_Stop();
610*53ee8cc1Swenshuai.xi
611*53ee8cc1Swenshuai.xi // (6) Clear key ladder control
612*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Stop();
613*53ee8cc1Swenshuai.xi }
614*53ee8cc1Swenshuai.xi
XHDICA_GetChipProperties(NDS_ULONG hw_module_id,unsigned int chip_prop_length,unsigned int * actual_chip_prop_length,NDS_BYTE * chip_properties,void * auxiliary_data)615*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_GetChipProperties(NDS_ULONG hw_module_id,
616*53ee8cc1Swenshuai.xi unsigned int chip_prop_length,
617*53ee8cc1Swenshuai.xi unsigned int *actual_chip_prop_length,
618*53ee8cc1Swenshuai.xi NDS_BYTE *chip_properties,
619*53ee8cc1Swenshuai.xi void *auxiliary_data)
620*53ee8cc1Swenshuai.xi {
621*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
622*53ee8cc1Swenshuai.xi
623*53ee8cc1Swenshuai.xi MS_U8* u8Ptr;
624*53ee8cc1Swenshuai.xi // @FIXME: return no data for capacity query at this stage
625*53ee8cc1Swenshuai.xi //TODO:
626*53ee8cc1Swenshuai.xi *actual_chip_prop_length = NDS_CHIP_PROP_LENGTH;
627*53ee8cc1Swenshuai.xi if (0 == chip_prop_length)
628*53ee8cc1Swenshuai.xi {
629*53ee8cc1Swenshuai.xi return CA_OK;
630*53ee8cc1Swenshuai.xi }
631*53ee8cc1Swenshuai.xi NDS_ASSERT((chip_prop_length>= NDS_CHIP_PROP_LENGTH), CA_INSUFFICIENT_BUFFER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
632*53ee8cc1Swenshuai.xi
633*53ee8cc1Swenshuai.xi u8Ptr = chip_properties;
634*53ee8cc1Swenshuai.xi memcpy(u8Ptr, u8ChipType, sizeof(u8ChipType));
635*53ee8cc1Swenshuai.xi u8Ptr += sizeof(u8ChipType);
636*53ee8cc1Swenshuai.xi
637*53ee8cc1Swenshuai.xi // otp_cfg_did2
638*53ee8cc1Swenshuai.xi u8ChipId[2] = (CFG_REG(REG_CFG_DID2_H) >> 8) & 0xFF;
639*53ee8cc1Swenshuai.xi u8ChipId[3] = (CFG_REG(REG_CFG_DID2_H) >> 0) & 0xFF;
640*53ee8cc1Swenshuai.xi u8ChipId[4] = (CFG_REG(REG_CFG_DID2_L) >> 8) & 0xFF;
641*53ee8cc1Swenshuai.xi u8ChipId[5] = (CFG_REG(REG_CFG_DID2_L) >> 0) & 0xFF;
642*53ee8cc1Swenshuai.xi memcpy(u8Ptr, u8ChipId, sizeof(u8ChipId));
643*53ee8cc1Swenshuai.xi u8Ptr += sizeof(u8ChipId);
644*53ee8cc1Swenshuai.xi
645*53ee8cc1Swenshuai.xi _NDS_CamGetHashKey(&u8HashKey[2]);
646*53ee8cc1Swenshuai.xi memcpy(u8Ptr, u8HashKey, sizeof(u8HashKey));
647*53ee8cc1Swenshuai.xi u8Ptr += sizeof(u8HashKey);
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi memcpy(u8Ptr, u8KLDepth, sizeof(u8KLDepth));
650*53ee8cc1Swenshuai.xi u8Ptr += sizeof(u8KLDepth);
651*53ee8cc1Swenshuai.xi
652*53ee8cc1Swenshuai.xi //(0<< 3) // Jtag password enabled , 0xBF221400+0x11[10-15]
653*53ee8cc1Swenshuai.xi //(0<< 4) // Boot Room enabled, 0xBF221400+0x0E[4-9] ==> 0x3F0
654*53ee8cc1Swenshuai.xi if ( (CFG_REG(REG_CFG_MODE) & CFG_MODE_JTAG_PWD) && !(CFG_REG(REG_CFG_MODE) & CFG_MODE_JTAG_CLOSE) )
655*53ee8cc1Swenshuai.xi {
656*53ee8cc1Swenshuai.xi u8ChipEnFlags[2] |= NDS_ENFLAGS_JTAG_PWD;
657*53ee8cc1Swenshuai.xi }
658*53ee8cc1Swenshuai.xi /* if (((*((volatile unsigned int*)( 0xBF221400+(0x11<< 2))) >> 10) > 0) && ((*((volatile unsigned int*)( 0xBF221400+(0x11<< 2))) >> 10) <= 0x07))
659*53ee8cc1Swenshuai.xi u8DscrEnableFlags[2] |= (1<<3);
660*53ee8cc1Swenshuai.xi */
661*53ee8cc1Swenshuai.xi if (IS_CFG_BOOT_OTP())
662*53ee8cc1Swenshuai.xi {
663*53ee8cc1Swenshuai.xi u8ChipEnFlags[2] |= NDS_ENFLAGS_BOOTROM;
664*53ee8cc1Swenshuai.xi }
665*53ee8cc1Swenshuai.xi /* if ((*((volatile unsigned int*)( 0xBF221400+(0x0E<< 2))) >> 4) > 0x3F)
666*53ee8cc1Swenshuai.xi u8ChipEnFlags[2] |= (1<<4);
667*53ee8cc1Swenshuai.xi */
668*53ee8cc1Swenshuai.xi memcpy(u8Ptr, u8ChipEnFlags, sizeof(u8ChipEnFlags));
669*53ee8cc1Swenshuai.xi u8Ptr += sizeof(u8ChipEnFlags);
670*53ee8cc1Swenshuai.xi return CA_OK;
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi
673*53ee8cc1Swenshuai.xi typedef struct
674*53ee8cc1Swenshuai.xi {
675*53ee8cc1Swenshuai.xi MS_U8* pu8Key;
676*53ee8cc1Swenshuai.xi MS_U8 u8Level;
677*53ee8cc1Swenshuai.xi MS_U8 u8KeyLen;
678*53ee8cc1Swenshuai.xi } _EncyptKeyDscr;
679*53ee8cc1Swenshuai.xi
_XHDICA_GetKeyLength(DSCMB_Type DscmbType)680*53ee8cc1Swenshuai.xi static MS_U32 _XHDICA_GetKeyLength(DSCMB_Type DscmbType)
681*53ee8cc1Swenshuai.xi {
682*53ee8cc1Swenshuai.xi switch (DscmbType)
683*53ee8cc1Swenshuai.xi {
684*53ee8cc1Swenshuai.xi case E_DSCMB_TYPE_CSA:
685*53ee8cc1Swenshuai.xi return 8;
686*53ee8cc1Swenshuai.xi case E_DSCMB_TYPE_NSA_AS_ESA:
687*53ee8cc1Swenshuai.xi return 16;
688*53ee8cc1Swenshuai.xi case E_DSCMB_TYPE_DES:
689*53ee8cc1Swenshuai.xi return 8;
690*53ee8cc1Swenshuai.xi case E_DSCMB_TYPE_AES:
691*53ee8cc1Swenshuai.xi return 16;
692*53ee8cc1Swenshuai.xi default:
693*53ee8cc1Swenshuai.xi return 0;
694*53ee8cc1Swenshuai.xi }
695*53ee8cc1Swenshuai.xi return 0;
696*53ee8cc1Swenshuai.xi }
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi
XHDICA_SetControlWord(NDS_ULONG x_connection,NDS_USHORT descrambler_num,unsigned int control_data_length,NDS_BYTE * control_data,unsigned int polarity_control)699*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetControlWord( NDS_ULONG x_connection,
700*53ee8cc1Swenshuai.xi NDS_USHORT descrambler_num,
701*53ee8cc1Swenshuai.xi unsigned int control_data_length,
702*53ee8cc1Swenshuai.xi NDS_BYTE *control_data,
703*53ee8cc1Swenshuai.xi unsigned int polarity_control )
704*53ee8cc1Swenshuai.xi {
705*53ee8cc1Swenshuai.xi // New interface
706*53ee8cc1Swenshuai.xi CAM_Dscmb * pDscmb = NULL;
707*53ee8cc1Swenshuai.xi MS_U32 u32Len;
708*53ee8cc1Swenshuai.xi DSCMB_Key_Type DscmbKeyType;
709*53ee8cc1Swenshuai.xi MS_BOOL bEncyptedCW = FALSE;
710*53ee8cc1Swenshuai.xi MS_U32 u32KLScheme = E_DSCMB_KL_TDES;
711*53ee8cc1Swenshuai.xi _EncyptKeyDscr enKeyDscr[4];
712*53ee8cc1Swenshuai.xi MS_U32 nKeyDscr = 0;
713*53ee8cc1Swenshuai.xi DSCMB_KLCfg KLConfig;
714*53ee8cc1Swenshuai.xi MS_U32 u32CWLength;
715*53ee8cc1Swenshuai.xi MS_U8 * pu8EnCW = NULL;
716*53ee8cc1Swenshuai.xi MS_U32 u32EnCWLen = 0;
717*53ee8cc1Swenshuai.xi MS_U32 u32Round;
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
720*53ee8cc1Swenshuai.xi
721*53ee8cc1Swenshuai.xi pDscmb = &(_Dscmb[x_connection][descrambler_num]);
722*53ee8cc1Swenshuai.xi if (pDscmb->u32DscmbId == DRV_DSCMB_FLT_NULL)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi return CA_INFO_NOT_AVAILABLE;
725*53ee8cc1Swenshuai.xi }
726*53ee8cc1Swenshuai.xi
727*53ee8cc1Swenshuai.xi u32CWLength = _XHDICA_GetKeyLength((DSCMB_Type)_u8DscmbType[x_connection]);
728*53ee8cc1Swenshuai.xi switch (polarity_control)
729*53ee8cc1Swenshuai.xi {
730*53ee8cc1Swenshuai.xi case POLARITY_CLEAR:
731*53ee8cc1Swenshuai.xi DscmbKeyType = E_DSCMB_KEY_CLEAR;
732*53ee8cc1Swenshuai.xi break;
733*53ee8cc1Swenshuai.xi case POLARITY_ODD:
734*53ee8cc1Swenshuai.xi DscmbKeyType = E_DSCMB_KEY_ODD;
735*53ee8cc1Swenshuai.xi break;
736*53ee8cc1Swenshuai.xi case POLARITY_EVEN:
737*53ee8cc1Swenshuai.xi DscmbKeyType = E_DSCMB_KEY_EVEN;
738*53ee8cc1Swenshuai.xi break;
739*53ee8cc1Swenshuai.xi default:
740*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
741*53ee8cc1Swenshuai.xi }
742*53ee8cc1Swenshuai.xi
743*53ee8cc1Swenshuai.xi nKeyDscr = 0;
744*53ee8cc1Swenshuai.xi while (control_data_length)
745*53ee8cc1Swenshuai.xi {
746*53ee8cc1Swenshuai.xi u32Len = (control_data[1] + 2);
747*53ee8cc1Swenshuai.xi switch (control_data[0]) // tag
748*53ee8cc1Swenshuai.xi {
749*53ee8cc1Swenshuai.xi case CLEAR_CW_DSCR_TAG: // 0x01
750*53ee8cc1Swenshuai.xi NDS_ASSERT((u32CWLength == control_data[1]), CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
751*53ee8cc1Swenshuai.xi //if (descrambler_num == 0)
752*53ee8cc1Swenshuai.xi //_verSC_PrintData(&(control_data[2]), 8);
753*53ee8cc1Swenshuai.xi MDrv_DSCMB_FltKeySet(pDscmb->u32DscmbId, DscmbKeyType, &(control_data[2]));
754*53ee8cc1Swenshuai.xi break;
755*53ee8cc1Swenshuai.xi case ENCRYPTED_CW_DSCR_TAG: // 0x02
756*53ee8cc1Swenshuai.xi bEncyptedCW = TRUE;
757*53ee8cc1Swenshuai.xi pu8EnCW = &(control_data[2]);
758*53ee8cc1Swenshuai.xi u32EnCWLen = control_data[1];
759*53ee8cc1Swenshuai.xi // NDS_ASSERT((u32KeyLength == control_data[1]), CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
760*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KL_SRC_VGK, NULL, 0);//just ACPU need set key
761*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(0, pu8EnCW, u32EnCWLen);
762*53ee8cc1Swenshuai.xi break;
763*53ee8cc1Swenshuai.xi case ENCRYPTED_KEY_DSCR_TAG: // 0x03
764*53ee8cc1Swenshuai.xi bEncyptedCW = TRUE;
765*53ee8cc1Swenshuai.xi enKeyDscr[nKeyDscr].u8Level = control_data[2];
766*53ee8cc1Swenshuai.xi //MS_ASSERT(1== enKeyDscr[nKeyDscr].u8Level); // must be level 1,2
767*53ee8cc1Swenshuai.xi enKeyDscr[nKeyDscr].u8KeyLen = control_data[3];
768*53ee8cc1Swenshuai.xi //MS_ASSERT(16 == enKeyDscr[nKeyDscr].u8KeyLen); // must be 128, 64 bits
769*53ee8cc1Swenshuai.xi enKeyDscr[nKeyDscr].pu8Key = &(control_data[4]);
770*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(enKeyDscr[nKeyDscr].u8Level, enKeyDscr[nKeyDscr].pu8Key, enKeyDscr[nKeyDscr].u8KeyLen);
771*53ee8cc1Swenshuai.xi nKeyDscr++;
772*53ee8cc1Swenshuai.xi break;
773*53ee8cc1Swenshuai.xi case ENCRYPTION_SCHEME_DSCR_TAG: // 0x04
774*53ee8cc1Swenshuai.xi switch ((control_data[2]<< 8) | control_data[3])
775*53ee8cc1Swenshuai.xi {
776*53ee8cc1Swenshuai.xi //#if NDS_KL_SCHEME_TDES_SUPPORTED
777*53ee8cc1Swenshuai.xi case 0x0002:
778*53ee8cc1Swenshuai.xi u32KLScheme = E_DSCMB_KL_TDES;
779*53ee8cc1Swenshuai.xi break;
780*53ee8cc1Swenshuai.xi //#endif
781*53ee8cc1Swenshuai.xi #if NDS_KL_SCHEME_AES_SUPPORTED
782*53ee8cc1Swenshuai.xi case 0x0010:
783*53ee8cc1Swenshuai.xi u32KLScheme = E_DSCMB_KL_AES;
784*53ee8cc1Swenshuai.xi break;
785*53ee8cc1Swenshuai.xi #endif
786*53ee8cc1Swenshuai.xi default:
787*53ee8cc1Swenshuai.xi u32KLScheme = E_DSCMB_KL_TDES;
788*53ee8cc1Swenshuai.xi return CA_SCHEME_NOT_SUPPORTED;
789*53ee8cc1Swenshuai.xi }
790*53ee8cc1Swenshuai.xi
791*53ee8cc1Swenshuai.xi break;
792*53ee8cc1Swenshuai.xi default:
793*53ee8cc1Swenshuai.xi printf("[%s][%d] Unsupported tag 0x%02x\n", __FUNCTION__, __LINE__, control_data[0]);
794*53ee8cc1Swenshuai.xi break;
795*53ee8cc1Swenshuai.xi }
796*53ee8cc1Swenshuai.xi if (control_data_length >= u32Len)
797*53ee8cc1Swenshuai.xi {
798*53ee8cc1Swenshuai.xi control_data_length -= u32Len;
799*53ee8cc1Swenshuai.xi control_data += u32Len;
800*53ee8cc1Swenshuai.xi }
801*53ee8cc1Swenshuai.xi else
802*53ee8cc1Swenshuai.xi {
803*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
804*53ee8cc1Swenshuai.xi break;
805*53ee8cc1Swenshuai.xi }
806*53ee8cc1Swenshuai.xi }
807*53ee8cc1Swenshuai.xi
808*53ee8cc1Swenshuai.xi if (bEncyptedCW)
809*53ee8cc1Swenshuai.xi {
810*53ee8cc1Swenshuai.xi //MS_ASSERT(u32EnCWLen == u32KeyLength); // Given CW length must be
811*53ee8cc1Swenshuai.xi if (8 == u32CWLength) // CSA
812*53ee8cc1Swenshuai.xi {
813*53ee8cc1Swenshuai.xi u32Round = 5;
814*53ee8cc1Swenshuai.xi }
815*53ee8cc1Swenshuai.xi else if (16 == u32CWLength) // NSA, Syn_AES
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi u32Round = 6;
818*53ee8cc1Swenshuai.xi }
819*53ee8cc1Swenshuai.xi else
820*53ee8cc1Swenshuai.xi {
821*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
822*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
823*53ee8cc1Swenshuai.xi }
824*53ee8cc1Swenshuai.xi
825*53ee8cc1Swenshuai.xi /// (1) put key
826*53ee8cc1Swenshuai.xi // MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KLAD_SRC_VGK, NULL, 0);
827*53ee8cc1Swenshuai.xi
828*53ee8cc1Swenshuai.xi /// (1.5) put input
829*53ee8cc1Swenshuai.xi /// Level 0
830*53ee8cc1Swenshuai.xi // reg_dcw_in_l = 0x3c, 0x2d, 0x1e, 0x0f;
831*53ee8cc1Swenshuai.xi // reg_dcw_in_h = 0x78, 0x69, 0x5a, 0x4b;;
832*53ee8cc1Swenshuai.xi // reg_dcw1_in_l = 0xb4, 0xa5, 0x96, 0x87;
833*53ee8cc1Swenshuai.xi // reg_dcw1_in_h = 0xf0, 0xe1, 0xd2, 0xc3;
834*53ee8cc1Swenshuai.xi //MDrv_DSCMB_KLadder_SetInput(1, _u8NDS_DefaultIn, 16);//spec form 082.pdf for initaliataion(1~2)
835*53ee8cc1Swenshuai.xi //MDrv_DSCMB_KLadder_SetInput(2, _u8NDS_DefaultIn, 16);
836*53ee8cc1Swenshuai.xi
837*53ee8cc1Swenshuai.xi /// Level 1 for encryption key
838*53ee8cc1Swenshuai.xi // reg_dcw2_in = enKeyDscr[0].pu8Key;
839*53ee8cc1Swenshuai.xi // reg_dcw3_in = enKeyDscr[0].pu8Key;
840*53ee8cc1Swenshuai.xi // MDrv_DSCMB_KLadder_SetInput(1, enKeyDscr[0].pu8Key, 16);
841*53ee8cc1Swenshuai.xi
842*53ee8cc1Swenshuai.xi // Level 2 for encryption CW
843*53ee8cc1Swenshuai.xi // reg_dcw2_in = pu8EnCW;
844*53ee8cc1Swenshuai.xi // reg_dcw3_in = pu8EnCW;
845*53ee8cc1Swenshuai.xi // MDrv_DSCMB_KLadder_SetInput(2, pu8EnCW, 16);
846*53ee8cc1Swenshuai.xi
847*53ee8cc1Swenshuai.xi // (2) key ladder set up
848*53ee8cc1Swenshuai.xi KLConfig.bDecrypt = TRUE;
849*53ee8cc1Swenshuai.xi KLConfig.bInverse = FALSE;
850*53ee8cc1Swenshuai.xi KLConfig.bKeepRound = FALSE;
851*53ee8cc1Swenshuai.xi KLConfig.u32Round = (MS_U32) u32Round;
852*53ee8cc1Swenshuai.xi KLConfig.u32EngMode = u32KLScheme;
853*53ee8cc1Swenshuai.xi
854*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetConfig(&KLConfig);
855*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetDst(E_DSCMB_KL_DST_KT_ESA);
856*53ee8cc1Swenshuai.xi #if 0 // TEST
857*53ee8cc1Swenshuai.xi vgk_test[16] = { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
858*53ee8cc1Swenshuai.xi 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
859*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KL_SRC_ACPU, vgk_test, 16);
860*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetDst(E_DSCMB_KL_DST_ACPU);
861*53ee8cc1Swenshuai.xi #endif
862*53ee8cc1Swenshuai.xi
863*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Start();
864*53ee8cc1Swenshuai.xi
865*53ee8cc1Swenshuai.xi // (3) polling status
866*53ee8cc1Swenshuai.xi while (1)
867*53ee8cc1Swenshuai.xi {
868*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_IsComplete())
869*53ee8cc1Swenshuai.xi {
870*53ee8cc1Swenshuai.xi break;
871*53ee8cc1Swenshuai.xi }
872*53ee8cc1Swenshuai.xi }
873*53ee8cc1Swenshuai.xi
874*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Output_Start(pDscmb->u32DscmbId, DscmbKeyType);
875*53ee8cc1Swenshuai.xi
876*53ee8cc1Swenshuai.xi // (5) Poll key ladder done
877*53ee8cc1Swenshuai.xi while (1)
878*53ee8cc1Swenshuai.xi {
879*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_Output_IsComplete())
880*53ee8cc1Swenshuai.xi // if (kl_done == ((reg_kl_status & 0x1)))
881*53ee8cc1Swenshuai.xi {
882*53ee8cc1Swenshuai.xi break;
883*53ee8cc1Swenshuai.xi }
884*53ee8cc1Swenshuai.xi }
885*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Output_Stop();
886*53ee8cc1Swenshuai.xi
887*53ee8cc1Swenshuai.xi // (6) Clear key ladder control
888*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Stop();
889*53ee8cc1Swenshuai.xi }
890*53ee8cc1Swenshuai.xi return CA_OK;
891*53ee8cc1Swenshuai.xi }
892*53ee8cc1Swenshuai.xi
893*53ee8cc1Swenshuai.xi
XHDICA_GetSerializationInfo(unsigned int info_type,unsigned int serializaion_data_len,unsigned int * actual_serialization_data_len,NDS_BYTE * serialization_data)894*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_GetSerializationInfo(unsigned int info_type,
895*53ee8cc1Swenshuai.xi unsigned int serializaion_data_len,
896*53ee8cc1Swenshuai.xi unsigned int *actual_serialization_data_len,
897*53ee8cc1Swenshuai.xi NDS_BYTE *serialization_data)
898*53ee8cc1Swenshuai.xi {
899*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
900*53ee8cc1Swenshuai.xi
901*53ee8cc1Swenshuai.xi *actual_serialization_data_len = 0;
902*53ee8cc1Swenshuai.xi return CA_INFO_NOT_AVAILABLE;
903*53ee8cc1Swenshuai.xi }
904*53ee8cc1Swenshuai.xi
XHDICA_GetResponseToChallenge(NDS_BYTE * nonce,NDS_BYTE nonce_length,int descrambling_key_length,NDS_BYTE * descrambling_key_descrip,NDS_BYTE * response,NDS_BYTE * response_length)905*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_GetResponseToChallenge( NDS_BYTE *nonce,
906*53ee8cc1Swenshuai.xi NDS_BYTE nonce_length,
907*53ee8cc1Swenshuai.xi int descrambling_key_length,
908*53ee8cc1Swenshuai.xi NDS_BYTE *descrambling_key_descrip,
909*53ee8cc1Swenshuai.xi NDS_BYTE *response,
910*53ee8cc1Swenshuai.xi NDS_BYTE *response_length)
911*53ee8cc1Swenshuai.xi {
912*53ee8cc1Swenshuai.xi DSCMB_KLCfg KLConfig;
913*53ee8cc1Swenshuai.xi MS_U32 u32KLScheme;
914*53ee8cc1Swenshuai.xi MS_U32 u32Len=0;
915*53ee8cc1Swenshuai.xi
916*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(0, nonce, nonce_length);//CW
917*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(1, _u8DefaultKey, 16);
918*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(2, _u8DefaultKey, 16);
919*53ee8cc1Swenshuai.xi
920*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
921*53ee8cc1Swenshuai.xi while (descrambling_key_length)
922*53ee8cc1Swenshuai.xi {
923*53ee8cc1Swenshuai.xi u32Len = (descrambling_key_descrip[1] + 2);
924*53ee8cc1Swenshuai.xi switch (descrambling_key_descrip[0]) // tag
925*53ee8cc1Swenshuai.xi {
926*53ee8cc1Swenshuai.xi case CLEAR_CW_DSCR_TAG:
927*53ee8cc1Swenshuai.xi break;
928*53ee8cc1Swenshuai.xi case ENCRYPTED_CW_DSCR_TAG:
929*53ee8cc1Swenshuai.xi break;
930*53ee8cc1Swenshuai.xi case ENCRYPTED_KEY_DSCR_TAG:
931*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput((MS_U32)descrambling_key_descrip[2],
932*53ee8cc1Swenshuai.xi &descrambling_key_descrip[4],
933*53ee8cc1Swenshuai.xi (MS_U32)descrambling_key_descrip[3]);
934*53ee8cc1Swenshuai.xi break;
935*53ee8cc1Swenshuai.xi case ENCRYPTION_SCHEME_DSCR_TAG:
936*53ee8cc1Swenshuai.xi switch ((descrambling_key_descrip[2]<< 8) | descrambling_key_descrip[3])
937*53ee8cc1Swenshuai.xi {
938*53ee8cc1Swenshuai.xi //#if NDS_KL_SCHEME_TDES_SUPPORTED
939*53ee8cc1Swenshuai.xi case 0x0002:
940*53ee8cc1Swenshuai.xi u32KLScheme = E_DSCMB_KL_TDES;
941*53ee8cc1Swenshuai.xi break;
942*53ee8cc1Swenshuai.xi //#endif
943*53ee8cc1Swenshuai.xi #if NDS_KL_SCHEME_AES_SUPPORTED
944*53ee8cc1Swenshuai.xi case 0x0010:
945*53ee8cc1Swenshuai.xi u32KLScheme = E_DSCMB_KL_AES;
946*53ee8cc1Swenshuai.xi break;
947*53ee8cc1Swenshuai.xi #endif
948*53ee8cc1Swenshuai.xi default:
949*53ee8cc1Swenshuai.xi return CA_SCHEME_NOT_SUPPORTED;
950*53ee8cc1Swenshuai.xi }
951*53ee8cc1Swenshuai.xi break;
952*53ee8cc1Swenshuai.xi default:
953*53ee8cc1Swenshuai.xi printf("[%s][%d] Unsupported tag 0x%02x\n", __FUNCTION__, __LINE__, descrambling_key_descrip[0]);
954*53ee8cc1Swenshuai.xi break;
955*53ee8cc1Swenshuai.xi }
956*53ee8cc1Swenshuai.xi if (descrambling_key_length >= u32Len)
957*53ee8cc1Swenshuai.xi {
958*53ee8cc1Swenshuai.xi descrambling_key_length -= u32Len;
959*53ee8cc1Swenshuai.xi descrambling_key_descrip+= u32Len;
960*53ee8cc1Swenshuai.xi }
961*53ee8cc1Swenshuai.xi else
962*53ee8cc1Swenshuai.xi {
963*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "NDS_ASSERT [%s]-[%d]\n", __FUNCTION__, __LINE__);
964*53ee8cc1Swenshuai.xi break;
965*53ee8cc1Swenshuai.xi }
966*53ee8cc1Swenshuai.xi }
967*53ee8cc1Swenshuai.xi
968*53ee8cc1Swenshuai.xi KLConfig.bDecrypt = TRUE;
969*53ee8cc1Swenshuai.xi KLConfig.bInverse = FALSE;
970*53ee8cc1Swenshuai.xi KLConfig.bKeepRound = FALSE;
971*53ee8cc1Swenshuai.xi KLConfig.u32Round = 6;
972*53ee8cc1Swenshuai.xi KLConfig.u32EngMode = E_DSCMB_KL_TDES;
973*53ee8cc1Swenshuai.xi
974*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetConfig(&KLConfig);
975*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KL_SRC_VGK, NULL, 0);
976*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetDst(E_DSCMB_KL_DST_ACPU);
977*53ee8cc1Swenshuai.xi
978*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Start();
979*53ee8cc1Swenshuai.xi
980*53ee8cc1Swenshuai.xi // (3) polling status
981*53ee8cc1Swenshuai.xi while (1)
982*53ee8cc1Swenshuai.xi {
983*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_IsComplete())
984*53ee8cc1Swenshuai.xi {
985*53ee8cc1Swenshuai.xi break;
986*53ee8cc1Swenshuai.xi }
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi //Read key
989*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ReadDataFromAcpu(response);
990*53ee8cc1Swenshuai.xi *response_length = 16;
991*53ee8cc1Swenshuai.xi //_verSC_PrintData(response, 16);
992*53ee8cc1Swenshuai.xi
993*53ee8cc1Swenshuai.xi //ACK --release key
994*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ResetAcpuAck();
995*53ee8cc1Swenshuai.xi
996*53ee8cc1Swenshuai.xi // (5) Poll key ladder done
997*53ee8cc1Swenshuai.xi while (1)
998*53ee8cc1Swenshuai.xi {
999*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_Output_IsComplete())
1000*53ee8cc1Swenshuai.xi // if (kl_done == ((reg_kl_status & 0x1)))
1001*53ee8cc1Swenshuai.xi {
1002*53ee8cc1Swenshuai.xi break;
1003*53ee8cc1Swenshuai.xi }
1004*53ee8cc1Swenshuai.xi }
1005*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Output_Stop();
1006*53ee8cc1Swenshuai.xi
1007*53ee8cc1Swenshuai.xi // (6) Clear key ladder control
1008*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Stop();
1009*53ee8cc1Swenshuai.xi
1010*53ee8cc1Swenshuai.xi return CA_OK;
1011*53ee8cc1Swenshuai.xi }
1012*53ee8cc1Swenshuai.xi
XHDICA_EncryptData(void * encrypt_in_params,unsigned int * out_data_buf_len,NDS_BYTE * out_data_buf)1013*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_EncryptData( void *encrypt_in_params,
1014*53ee8cc1Swenshuai.xi unsigned int *out_data_buf_len,
1015*53ee8cc1Swenshuai.xi NDS_BYTE *out_data_buf)
1016*53ee8cc1Swenshuai.xi {
1017*53ee8cc1Swenshuai.xi DSCMB_KLCfg KLConfig;
1018*53ee8cc1Swenshuai.xi MS_U8 u8Tag;
1019*53ee8cc1Swenshuai.xi MS_U16 u16InLen;
1020*53ee8cc1Swenshuai.xi MS_U8 pu8InData[16];
1021*53ee8cc1Swenshuai.xi MS_U8 u8Flag;
1022*53ee8cc1Swenshuai.xi MS_U8* pu8InParams = (MS_U8*)encrypt_in_params;
1023*53ee8cc1Swenshuai.xi MS_U32 i=0;
1024*53ee8cc1Swenshuai.xi u8Tag = ((pu8InParams[0])&0xFF);
1025*53ee8cc1Swenshuai.xi u16InLen = ((MS_U16)(((MS_U8*)(pu8InParams))[2]<<8)|(((MS_U8*)(pu8InParams))[3]));//((pu8InParams[3]) & 0xFF);
1026*53ee8cc1Swenshuai.xi u8Flag = ((pu8InParams[4+u16InLen])&0xFF);
1027*53ee8cc1Swenshuai.xi
1028*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1029*53ee8cc1Swenshuai.xi
1030*53ee8cc1Swenshuai.xi if (u8Tag != ENCRYPT_IN_PARAMS_DSCR_TAG)
1031*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1032*53ee8cc1Swenshuai.xi
1033*53ee8cc1Swenshuai.xi if (u8Flag & 0x01)//flag:1
1034*53ee8cc1Swenshuai.xi {
1035*53ee8cc1Swenshuai.xi if (u16InLen > 16)
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi *out_data_buf_len = (16 * (u16InLen/16));
1038*53ee8cc1Swenshuai.xi if (u16InLen%16)
1039*53ee8cc1Swenshuai.xi *out_data_buf_len+=16;
1040*53ee8cc1Swenshuai.xi }
1041*53ee8cc1Swenshuai.xi else
1042*53ee8cc1Swenshuai.xi *out_data_buf_len = 16;
1043*53ee8cc1Swenshuai.xi }
1044*53ee8cc1Swenshuai.xi else
1045*53ee8cc1Swenshuai.xi {
1046*53ee8cc1Swenshuai.xi if (out_data_buf == NULL)
1047*53ee8cc1Swenshuai.xi {
1048*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1049*53ee8cc1Swenshuai.xi }
1050*53ee8cc1Swenshuai.xi for (i=0;i<((*out_data_buf_len)/16);i++)
1051*53ee8cc1Swenshuai.xi {
1052*53ee8cc1Swenshuai.xi memset(pu8InData, 0, sizeof(pu8InData));
1053*53ee8cc1Swenshuai.xi memcpy(pu8InData, &pu8InParams[4+(i*16)], (u16InLen>16)?16:u16InLen);
1054*53ee8cc1Swenshuai.xi if (u16InLen > 16)
1055*53ee8cc1Swenshuai.xi {
1056*53ee8cc1Swenshuai.xi u16InLen -=16;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(0, pu8InData, sizeof(pu8InData));//CW
1059*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(1, _u8DefaultKey, sizeof(_u8DefaultKey));
1060*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetInput(2, _u8DefaultKey, sizeof(_u8DefaultKey));
1061*53ee8cc1Swenshuai.xi
1062*53ee8cc1Swenshuai.xi KLConfig.bDecrypt = TRUE;
1063*53ee8cc1Swenshuai.xi KLConfig.bInverse = FALSE;
1064*53ee8cc1Swenshuai.xi KLConfig.bKeepRound = FALSE;
1065*53ee8cc1Swenshuai.xi KLConfig.u32Round = 6;
1066*53ee8cc1Swenshuai.xi KLConfig.u32EngMode = E_DSCMB_KL_TDES;
1067*53ee8cc1Swenshuai.xi
1068*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetConfig(&KLConfig);
1069*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetKey(E_DSCMB_KL_SRC_VGK, NULL, 0);
1070*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_SetDst(E_DSCMB_KL_DST_ACPU);
1071*53ee8cc1Swenshuai.xi
1072*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Start();
1073*53ee8cc1Swenshuai.xi
1074*53ee8cc1Swenshuai.xi // (3) polling status
1075*53ee8cc1Swenshuai.xi while (1)
1076*53ee8cc1Swenshuai.xi {
1077*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_IsComplete())
1078*53ee8cc1Swenshuai.xi {
1079*53ee8cc1Swenshuai.xi break;
1080*53ee8cc1Swenshuai.xi }
1081*53ee8cc1Swenshuai.xi }
1082*53ee8cc1Swenshuai.xi //Read key
1083*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ReadDataFromAcpu(&out_data_buf[i*16]);
1084*53ee8cc1Swenshuai.xi //_verSC_PrintData(&out_data_buf[i*16], 16);
1085*53ee8cc1Swenshuai.xi
1086*53ee8cc1Swenshuai.xi //ACK --release key
1087*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_ResetAcpuAck();
1088*53ee8cc1Swenshuai.xi
1089*53ee8cc1Swenshuai.xi // (5) Poll key ladder done
1090*53ee8cc1Swenshuai.xi while (1)
1091*53ee8cc1Swenshuai.xi {
1092*53ee8cc1Swenshuai.xi if (MDrv_DSCMB_KLadder_Output_IsComplete())
1093*53ee8cc1Swenshuai.xi // if (kl_done == ((reg_kl_status & 0x1)))
1094*53ee8cc1Swenshuai.xi {
1095*53ee8cc1Swenshuai.xi break;
1096*53ee8cc1Swenshuai.xi }
1097*53ee8cc1Swenshuai.xi }
1098*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Output_Stop();
1099*53ee8cc1Swenshuai.xi
1100*53ee8cc1Swenshuai.xi // (6) Clear key ladder control
1101*53ee8cc1Swenshuai.xi MDrv_DSCMB_KLadder_Stop();
1102*53ee8cc1Swenshuai.xi }
1103*53ee8cc1Swenshuai.xi }
1104*53ee8cc1Swenshuai.xi return CA_OK;
1105*53ee8cc1Swenshuai.xi }
1106*53ee8cc1Swenshuai.xi
1107*53ee8cc1Swenshuai.xi
1108