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) 2006-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 drvCIPHER.c
98*53ee8cc1Swenshuai.xi // @brief CIPHER Driver
99*53ee8cc1Swenshuai.xi // @author MStar Semiconductor,Inc.
100*53ee8cc1Swenshuai.xi //
101*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
104*53ee8cc1Swenshuai.xi #include <linux/string.h>
105*53ee8cc1Swenshuai.xi #include <linux/uaccess.h>
106*53ee8cc1Swenshuai.xi #include <linux/compat.h>
107*53ee8cc1Swenshuai.xi #else
108*53ee8cc1Swenshuai.xi #include <stdio.h>
109*53ee8cc1Swenshuai.xi #include <string.h>
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi #include "MsCommon.h"
113*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
114*53ee8cc1Swenshuai.xi #include "MsOS.h"
115*53ee8cc1Swenshuai.xi #include "MsVersion.h"
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi #include "drvCIPHER.h"
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi #include "halRSA.h"
120*53ee8cc1Swenshuai.xi #include "halCIPHER.h"
121*53ee8cc1Swenshuai.xi #include "utopia.h"
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi #include "drvAESDMA_v2.h"
124*53ee8cc1Swenshuai.xi #include "drvAESDMA_private.h"
125*53ee8cc1Swenshuai.xi
126*53ee8cc1Swenshuai.xi #ifdef CIPHER_UTOPIA_20
127*53ee8cc1Swenshuai.xi #define CIPHER_UTOPIA2 1UL
128*53ee8cc1Swenshuai.xi #else
129*53ee8cc1Swenshuai.xi #define CIPHER_UTOPIA2 0UL
130*53ee8cc1Swenshuai.xi #endif
131*53ee8cc1Swenshuai.xi
132*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
133*53ee8cc1Swenshuai.xi #include "drvCIPHER_v2.h"
134*53ee8cc1Swenshuai.xi #endif
135*53ee8cc1Swenshuai.xi #include "drvCIPHER_private.h"
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
138*53ee8cc1Swenshuai.xi // Driver Compiler Option
139*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
140*53ee8cc1Swenshuai.xi #define CIPHERIntEnable() MsOS_EnableInterrupt (CRYPTODMA_IRQ)
141*53ee8cc1Swenshuai.xi #define CIPHERIntDisable() MsOS_DisableInterrupt(CRYPTODMA_IRQ)
142*53ee8cc1Swenshuai.xi #define CIPHERIntAttach() MsOS_AttachInterrupt (CRYPTODMA_IRQ, (InterruptCb )_CIPHER_Isr)
143*53ee8cc1Swenshuai.xi #define CIPHERIntDetach() MsOS_DetachInterrupt (CRYPTODMA_IRQ)
144*53ee8cc1Swenshuai.xi
145*53ee8cc1Swenshuai.xi #define AESDMAPA2KSEG1(addr) ((void *)(((MS_U32)addr) | 0xa0000000UL)) //physical -> unchched
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi #define RSAInitChk() if(_bRSA_Init == FALSE){ DEBUG_CIPHER(CIPHER_DBG_ERR,"Not initialized"); return DRVAESDMA_FAIL; }
149*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
150*53ee8cc1Swenshuai.xi // Local Defines
151*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
152*53ee8cc1Swenshuai.xi #define CIPHER_TASK_STACK_SIZE (4096UL)
153*53ee8cc1Swenshuai.xi #define CIPHER_CAVID (0x0FUL)
154*53ee8cc1Swenshuai.xi #define HASH_HMAC_KEYPAD_SIZE (64UL)
155*53ee8cc1Swenshuai.xi #define HASH_RPT_SIZE_ALL (10UL)
156*53ee8cc1Swenshuai.xi #define HASH_RPT_SIZE_STATUS (2UL)
157*53ee8cc1Swenshuai.xi
158*53ee8cc1Swenshuai.xi #define HASH_MD5_DIGEST_SIZE (16UL)
159*53ee8cc1Swenshuai.xi #define HASH_SHA1_DIGEST_SIZE (20UL)
160*53ee8cc1Swenshuai.xi #define HASH_SHA256_DIGEST_SIZE (32UL)
161*53ee8cc1Swenshuai.xi #define HASH_SM3_DIGEST_SIZE (32UL)
162*53ee8cc1Swenshuai.xi #define HASH_BLOCK_SIZE (64UL)
163*53ee8cc1Swenshuai.xi
164*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_SHA_CHECK_SIZE (8UL)
165*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_LUT (0x1UL)
166*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_M (0x2UL)
167*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_BC (0x4UL)
168*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_KCV_SIZE (16UL) //HW limitation, need padding to 16 bytes
169*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT_SIZE (256UL)
170*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_M_SIZE (128UL)
171*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_BC_SIZE (16UL)
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_SHA_FAIL (0x00000010UL)
174*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_KCV_FAIL (0x00000020UL)
175*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT_FAIL (0x00000030UL)
176*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_M_FAIL (0x00000040UL)
177*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_BC_FAIL (0x00000050UL)
178*53ee8cc1Swenshuai.xi
179*53ee8cc1Swenshuai.xi #define DRV_CIPHER_NO_REPORT_BUFFER (0x00000003UL)
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi //Interrupt
182*53ee8cc1Swenshuai.xi #define DRV_CIPHER_DMA_DATA_INIT (0x00000000UL)
183*53ee8cc1Swenshuai.xi #define DRV_CIPHER_DONE (0x00000100UL)
184*53ee8cc1Swenshuai.xi #define DRV_CIPHER_CALLBACK (0x0000000FUL)
185*53ee8cc1Swenshuai.xi #define DRV_CIPHER_CLOSE (0x80000000UL)
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi //Report status
188*53ee8cc1Swenshuai.xi #define DRV_CIPHER_REPORT_OK (0x80000000UL)
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi typedef struct
191*53ee8cc1Swenshuai.xi {
192*53ee8cc1Swenshuai.xi MS_U32 u32LUT; //LUT3 fill in 512 bytes table, each has 9 bits to describe
193*53ee8cc1Swenshuai.xi MS_U32 u32M;
194*53ee8cc1Swenshuai.xi MS_U32 u32BC;
195*53ee8cc1Swenshuai.xi }DRV_CIPHER_TA_LUT3;
196*53ee8cc1Swenshuai.xi
197*53ee8cc1Swenshuai.xi
198*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
199*53ee8cc1Swenshuai.xi // Global Variable
200*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
201*53ee8cc1Swenshuai.xi static MS_BOOL _bCIPHERDrv_Inited = FALSE;
202*53ee8cc1Swenshuai.xi static MS_BOOL _bCIPHERDrv_KeyCtrlEn = FALSE;
203*53ee8cc1Swenshuai.xi
204*53ee8cc1Swenshuai.xi #ifdef CIPHER_NO_PRINTF
205*53ee8cc1Swenshuai.xi #define DRV_CIPHER_ASSERT( _bool_, _msg_, ret) if(!(_bool_)){return (ret);}
206*53ee8cc1Swenshuai.xi #else
207*53ee8cc1Swenshuai.xi #define DRV_CIPHER_ASSERT( _bool_, _msg_, ret) if(!(_bool_)){ printf(_msg_); return (ret);}
208*53ee8cc1Swenshuai.xi #endif
209*53ee8cc1Swenshuai.xi #define DRV_CIPHER_INIT_CHECK(ret) DRV_CIPHER_ASSERT(TRUE == _bCIPHERDrv_Inited, "drvCIPHER is not initialized\n", ret)
210*53ee8cc1Swenshuai.xi #define DRV_CIPHER_KEYCTRL_CHECK(ret) DRV_CIPHER_ASSERT(TRUE == _bCIPHERDrv_KeyCtrlEn, "drvCIPHER key control mode is not enable\n", ret)
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi MS_S32 _CipherMtx = 0;
213*53ee8cc1Swenshuai.xi MS_S32 _CipherRSAMtx;
214*53ee8cc1Swenshuai.xi MS_S32 _CipherSemaphore;
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi MS_S32 _AESDMAMtx = 0;
217*53ee8cc1Swenshuai.xi
218*53ee8cc1Swenshuai.xi MS_BOOL bDES_Key = FALSE;
219*53ee8cc1Swenshuai.xi
220*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
221*53ee8cc1Swenshuai.xi static void *pu32AesdmaInst = NULL;
222*53ee8cc1Swenshuai.xi static void *pu32CipherInst = NULL;
223*53ee8cc1Swenshuai.xi #endif
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi static CIPHER_DBGMSG_LEVEL _CIPHERDBGLevel = CIPHER_DBG_ERR;
226*53ee8cc1Swenshuai.xi static MSIF_Version _drv_cipher_version = {
227*53ee8cc1Swenshuai.xi .DDI = { CIPHER_DRV_VERSION, },
228*53ee8cc1Swenshuai.xi };
229*53ee8cc1Swenshuai.xi
230*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
231*53ee8cc1Swenshuai.xi //Isr proc
232*53ee8cc1Swenshuai.xi static void* _pCIPHERTaskStack;
233*53ee8cc1Swenshuai.xi static MS_U8 _u8CIPHER_StackBuffer[CIPHER_TASK_STACK_SIZE];
234*53ee8cc1Swenshuai.xi static MS_S32 _s32CIPHERTaskId;
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi static MS_U32 _u32LastErr;
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi typedef enum
239*53ee8cc1Swenshuai.xi {
240*53ee8cc1Swenshuai.xi E_CIPHER_DMA_DONE,
241*53ee8cc1Swenshuai.xi E_CIPHER_HASH_DONE,
242*53ee8cc1Swenshuai.xi }CIPHER_WAIT;
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi static CIPHER_WAIT _eCipherWait;
245*53ee8cc1Swenshuai.xi
246*53ee8cc1Swenshuai.xi #endif
247*53ee8cc1Swenshuai.xi
248*53ee8cc1Swenshuai.xi #define CIPHER_REPORT_BUFFER_MAX 2UL
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi typedef struct
251*53ee8cc1Swenshuai.xi {
252*53ee8cc1Swenshuai.xi MS_U32 u32Report;
253*53ee8cc1Swenshuai.xi MS_U32 u32DoneBytes;
254*53ee8cc1Swenshuai.xi MS_U32 u32ExcMsg;
255*53ee8cc1Swenshuai.xi MS_U8* pu8Digest_Buf;
256*53ee8cc1Swenshuai.xi MS_U32 u32Digest_Buf_Size;
257*53ee8cc1Swenshuai.xi P_DrvCIPHER_EvtCallback pfCallback;
258*53ee8cc1Swenshuai.xi CIPHER_KEY_SRC eKeySrc;
259*53ee8cc1Swenshuai.xi MS_U8 u8KeyIdx;
260*53ee8cc1Swenshuai.xi MS_BOOL bUsed;
261*53ee8cc1Swenshuai.xi }CIPHER_REPORT;
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi typedef struct
264*53ee8cc1Swenshuai.xi {
265*53ee8cc1Swenshuai.xi DRV_CIPHER_DMACFG stConfig;
266*53ee8cc1Swenshuai.xi MS_U8 u8Key[HAL_CRYPTODMA_KEYLEN_MAX];
267*53ee8cc1Swenshuai.xi MS_U8 u8IV[HAL_CRYPTODMA_KEYLEN_MAX];
268*53ee8cc1Swenshuai.xi MS_BOOL bUsed;
269*53ee8cc1Swenshuai.xi }CIPHER_RESOURCE;
270*53ee8cc1Swenshuai.xi
271*53ee8cc1Swenshuai.xi static CIPHER_REPORT _CIPHER_ReportBuffer[CIPHER_REPORT_BUFFER_MAX];
272*53ee8cc1Swenshuai.xi static CIPHER_RESOURCE _CIPHER_Resource[HAL_CRYPTODMA_DMA_KEY_SLOT];
273*53ee8cc1Swenshuai.xi
274*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
275*53ee8cc1Swenshuai.xi extern MS_U32 _u32CallbackID;
276*53ee8cc1Swenshuai.xi extern MS_U16 _u16ThreadID;
277*53ee8cc1Swenshuai.xi #else
278*53ee8cc1Swenshuai.xi static MS_U32 _u32CallbackID = 1;
279*53ee8cc1Swenshuai.xi static MS_U16 _u16ThreadID = 1;
280*53ee8cc1Swenshuai.xi #endif
281*53ee8cc1Swenshuai.xi
282*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
283*53ee8cc1Swenshuai.xi // Internal Variable
284*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi static MS_BOOL _bRSA_Init = FALSE;
287*53ee8cc1Swenshuai.xi
288*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
289*53ee8cc1Swenshuai.xi static MS_S32 _s32CIPHEREventId;
290*53ee8cc1Swenshuai.xi
291*53ee8cc1Swenshuai.xi #define _CIPHER_SetEvent(flag) MsOS_SetEvent(_s32CIPHEREventId, (flag))
292*53ee8cc1Swenshuai.xi #define _CIPHER_GetEvent(events) MsOS_WaitEvent(_s32CIPHEREventId, DRV_CIPHER_DONE, &events, E_OR_CLEAR, MSOS_WAIT_FOREVER)
293*53ee8cc1Swenshuai.xi
294*53ee8cc1Swenshuai.xi #endif
295*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
296*53ee8cc1Swenshuai.xi // Debug Function
297*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
298*53ee8cc1Swenshuai.xi #ifdef CIPHER_NO_PRINTF
299*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER(debug_level, fmt, args...)
300*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER_KEYCTRL(debug_level, fmt, args...)
301*53ee8cc1Swenshuai.xi #else
302*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER(debug_level, fmt, args...) do{ if (_CIPHERDBGLevel >= (debug_level))\
303*53ee8cc1Swenshuai.xi printf("[%s][%d]"fmt"\n", __FUNCTION__, __LINE__, ## args);}\
304*53ee8cc1Swenshuai.xi while(0)
305*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER_KEYCTRL(debug_level, fmt, args...) do{ if (_CIPHERDBGLevel >= (debug_level))\
306*53ee8cc1Swenshuai.xi printf("[%s][%d][KeyCtrl] "fmt"\n", __FUNCTION__, __LINE__, ## args);}\
307*53ee8cc1Swenshuai.xi while(0)
308*53ee8cc1Swenshuai.xi #endif
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
312*53ee8cc1Swenshuai.xi // Internal Function
313*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
314*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
_CIPHER_Isr(void)315*53ee8cc1Swenshuai.xi static void _CIPHER_Isr(void)
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi MS_U32 u32Rpt[10] = {0};
318*53ee8cc1Swenshuai.xi MS_U32 u32ExcMsg = 0;
319*53ee8cc1Swenshuai.xi MS_U32 u32RptId = 0;
320*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
321*53ee8cc1Swenshuai.xi MS_U8* pu8Digest_Buf = NULL;
322*53ee8cc1Swenshuai.xi MS_U32 u32Digest_Buf_Size = 0;
323*53ee8cc1Swenshuai.xi
324*53ee8cc1Swenshuai.xi HAL_CIPHER_IntClear();
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi if(E_CIPHER_DMA_DONE == _eCipherWait)
327*53ee8cc1Swenshuai.xi {
328*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_GetRpt(u32Rpt);
329*53ee8cc1Swenshuai.xi HAL_CIPHER_GetException(&u32ExcMsg);
330*53ee8cc1Swenshuai.xi
331*53ee8cc1Swenshuai.xi u32RptId = u32Rpt[0] & REG_CIPHER_RPT_THREAD_MSK;
332*53ee8cc1Swenshuai.xi u8BufNum = u32RptId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
333*53ee8cc1Swenshuai.xi
334*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = u32Rpt[0];
335*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = u32Rpt[1];
336*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg = u32ExcMsg;
337*53ee8cc1Swenshuai.xi
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi else //E_CIPHER_HASH_DONE
340*53ee8cc1Swenshuai.xi {
341*53ee8cc1Swenshuai.xi //Get all register report, include status and digest
342*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_GetRpt(u32Rpt, HASH_RPT_SIZE_ALL);
343*53ee8cc1Swenshuai.xi HAL_CIPHER_GetException(&u32ExcMsg);
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi u32RptId = u32Rpt[0] & REG_CIPHER_RPT_THREAD_MSK;
346*53ee8cc1Swenshuai.xi u8BufNum = u32RptId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
347*53ee8cc1Swenshuai.xi
348*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = u32Rpt[0];
349*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = u32Rpt[1];
350*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg = u32ExcMsg;
351*53ee8cc1Swenshuai.xi
352*53ee8cc1Swenshuai.xi pu8Digest_Buf = _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf;
353*53ee8cc1Swenshuai.xi u32Digest_Buf_Size = _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size;
354*53ee8cc1Swenshuai.xi
355*53ee8cc1Swenshuai.xi if((pu8Digest_Buf != NULL) && (u32Digest_Buf_Size != 0))
356*53ee8cc1Swenshuai.xi {
357*53ee8cc1Swenshuai.xi //Avoid status report, only copy digest to output address
358*53ee8cc1Swenshuai.xi memcpy((MS_U8 *)pu8Digest_Buf, u32Rpt+HASH_RPT_SIZE_STATUS, u32Digest_Buf_Size);
359*53ee8cc1Swenshuai.xi }
360*53ee8cc1Swenshuai.xi
361*53ee8cc1Swenshuai.xi }
362*53ee8cc1Swenshuai.xi
363*53ee8cc1Swenshuai.xi _u32CallbackID = u32RptId;
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi _CIPHER_SetEvent(DRV_CIPHER_DONE); // Trigger task
366*53ee8cc1Swenshuai.xi CIPHERIntEnable();
367*53ee8cc1Swenshuai.xi
368*53ee8cc1Swenshuai.xi }
369*53ee8cc1Swenshuai.xi
_CIPHER_Isr_Proc(void)370*53ee8cc1Swenshuai.xi static void _CIPHER_Isr_Proc(void)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0;
373*53ee8cc1Swenshuai.xi MS_U32 u32Rpt = 0;
374*53ee8cc1Swenshuai.xi MS_BOOL bSuccess = FALSE;
375*53ee8cc1Swenshuai.xi MS_U32 u32ExcMsg = 0;
376*53ee8cc1Swenshuai.xi MS_U32 u32ExcTmp = 0;
377*53ee8cc1Swenshuai.xi MS_U32 u32RptId = 0;
378*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
379*53ee8cc1Swenshuai.xi MS_U8 u8KeyIdx = 0;
380*53ee8cc1Swenshuai.xi P_DrvCIPHER_EvtCallback pfCallBack = NULL;
381*53ee8cc1Swenshuai.xi CIPHER_KEY_SRC eKeySrc = 0;
382*53ee8cc1Swenshuai.xi
383*53ee8cc1Swenshuai.xi while (1)
384*53ee8cc1Swenshuai.xi {
385*53ee8cc1Swenshuai.xi _CIPHER_GetEvent(u32Events);
386*53ee8cc1Swenshuai.xi
387*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32Events, DRV_CIPHER_DONE))
388*53ee8cc1Swenshuai.xi {
389*53ee8cc1Swenshuai.xi //Handling callback
390*53ee8cc1Swenshuai.xi u8BufNum = _u32CallbackID % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
391*53ee8cc1Swenshuai.xi u32Rpt = _CIPHER_ReportBuffer[u8BufNum].u32Report;
392*53ee8cc1Swenshuai.xi pfCallBack = _CIPHER_ReportBuffer[u8BufNum].pfCallback;
393*53ee8cc1Swenshuai.xi u32ExcTmp = _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg;
394*53ee8cc1Swenshuai.xi eKeySrc = _CIPHER_ReportBuffer[u8BufNum].eKeySrc;
395*53ee8cc1Swenshuai.xi u8KeyIdx = _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx;
396*53ee8cc1Swenshuai.xi
397*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_ExceptFilter(&u32ExcTmp, eKeySrc, u8KeyIdx);
398*53ee8cc1Swenshuai.xi u32ExcMsg = HAL_CIPHER_ReadException(u32ExcTmp);
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi u32RptId = u32Rpt & REG_CIPHER_RPT_THREAD_MSK;
401*53ee8cc1Swenshuai.xi
402*53ee8cc1Swenshuai.xi bSuccess = FALSE;
403*53ee8cc1Swenshuai.xi
404*53ee8cc1Swenshuai.xi if(u32Rpt & DRV_CIPHER_REPORT_OK)
405*53ee8cc1Swenshuai.xi {
406*53ee8cc1Swenshuai.xi bSuccess = TRUE;
407*53ee8cc1Swenshuai.xi }
408*53ee8cc1Swenshuai.xi
409*53ee8cc1Swenshuai.xi if(u32ExcMsg != 0)
410*53ee8cc1Swenshuai.xi {
411*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetException();
412*53ee8cc1Swenshuai.xi }
413*53ee8cc1Swenshuai.xi
414*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
415*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
416*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg = 0;
417*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = NULL;
418*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
419*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = NULL;
420*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].eKeySrc = 0;
421*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = 0;
422*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = FALSE;
423*53ee8cc1Swenshuai.xi
424*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
425*53ee8cc1Swenshuai.xi if(pfCallBack != NULL)
426*53ee8cc1Swenshuai.xi {
427*53ee8cc1Swenshuai.xi pfCallBack(u32RptId, bSuccess, u32ExcMsg);
428*53ee8cc1Swenshuai.xi
429*53ee8cc1Swenshuai.xi }
430*53ee8cc1Swenshuai.xi }
431*53ee8cc1Swenshuai.xi
432*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32Events, DRV_CIPHER_CLOSE))
433*53ee8cc1Swenshuai.xi {
434*53ee8cc1Swenshuai.xi break;
435*53ee8cc1Swenshuai.xi }
436*53ee8cc1Swenshuai.xi
437*53ee8cc1Swenshuai.xi } // Task while loop
438*53ee8cc1Swenshuai.xi }
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi #endif
441*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId,MS_U32 * pu32Exception)442*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
443*53ee8cc1Swenshuai.xi {
444*53ee8cc1Swenshuai.xi MS_U32 u32Ret = DRV_CIPHER_OK;
445*53ee8cc1Swenshuai.xi MS_U32 u32Rpt[2] = {0};
446*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
447*53ee8cc1Swenshuai.xi MS_BOOL bDone = FALSE;
448*53ee8cc1Swenshuai.xi
449*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(FALSE);
450*53ee8cc1Swenshuai.xi
451*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
452*53ee8cc1Swenshuai.xi
453*53ee8cc1Swenshuai.xi u8BufNum = u32CmdId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
454*53ee8cc1Swenshuai.xi
455*53ee8cc1Swenshuai.xi //Check register report
456*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_CmdDone(u32CmdId, &u32Ret))
457*53ee8cc1Swenshuai.xi {
458*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:DMA cmd[%u] NOT done!", u32CmdId);
459*53ee8cc1Swenshuai.xi bDone = FALSE;
460*53ee8cc1Swenshuai.xi goto ISDMADONE_FINISH;
461*53ee8cc1Swenshuai.xi }
462*53ee8cc1Swenshuai.xi
463*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_GetRpt(u32Rpt);
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi if((u32Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
466*53ee8cc1Swenshuai.xi {
467*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA fail[%u]!", u32CmdId);
468*53ee8cc1Swenshuai.xi
469*53ee8cc1Swenshuai.xi if(u32Ret != 0)
470*53ee8cc1Swenshuai.xi {
471*53ee8cc1Swenshuai.xi *pu32Exception = HAL_CIPHER_ReadException(u32Ret);
472*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetException();
473*53ee8cc1Swenshuai.xi }
474*53ee8cc1Swenshuai.xi }
475*53ee8cc1Swenshuai.xi
476*53ee8cc1Swenshuai.xi bDone = TRUE;
477*53ee8cc1Swenshuai.xi
478*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
479*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
480*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg = 0;
481*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = NULL;
482*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
483*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = FALSE;
484*53ee8cc1Swenshuai.xi
485*53ee8cc1Swenshuai.xi ISDMADONE_FINISH:
486*53ee8cc1Swenshuai.xi
487*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
488*53ee8cc1Swenshuai.xi
489*53ee8cc1Swenshuai.xi if(bDone)
490*53ee8cc1Swenshuai.xi {
491*53ee8cc1Swenshuai.xi MsOS_ReadMemory();
492*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
493*53ee8cc1Swenshuai.xi }
494*53ee8cc1Swenshuai.xi
495*53ee8cc1Swenshuai.xi return bDone;
496*53ee8cc1Swenshuai.xi }
497*53ee8cc1Swenshuai.xi
MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId,MS_U32 * pu32Exception)498*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
499*53ee8cc1Swenshuai.xi {
500*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
501*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
502*53ee8cc1Swenshuai.xi CIPHER_ISDMADONE pArgs;
503*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_ISDMADONE));
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
506*53ee8cc1Swenshuai.xi {
507*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
508*53ee8cc1Swenshuai.xi }
509*53ee8cc1Swenshuai.xi
510*53ee8cc1Swenshuai.xi pArgs.u32CmdId = u32CmdId;
511*53ee8cc1Swenshuai.xi pArgs.pu32Exception = pu32Exception;
512*53ee8cc1Swenshuai.xi
513*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_IsDMADone, (void*)&pArgs);
514*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi //DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
517*53ee8cc1Swenshuai.xi return FALSE;
518*53ee8cc1Swenshuai.xi }
519*53ee8cc1Swenshuai.xi
520*53ee8cc1Swenshuai.xi return TRUE;
521*53ee8cc1Swenshuai.xi #else
522*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_IsDMADone(u32CmdId, pu32Exception);
523*53ee8cc1Swenshuai.xi #endif
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId,MS_U32 * pu32Exception)526*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi MS_U32 u32Ret = DRV_CIPHER_OK;
529*53ee8cc1Swenshuai.xi MS_U32 u32Rpt[10] = {0};
530*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
531*53ee8cc1Swenshuai.xi MS_BOOL bDone = FALSE;
532*53ee8cc1Swenshuai.xi
533*53ee8cc1Swenshuai.xi MS_U8* pu8Digest_Buf = NULL;
534*53ee8cc1Swenshuai.xi MS_U32 u32Digest_Buf_Size = 0;
535*53ee8cc1Swenshuai.xi CIPHER_KEY_SRC eKeySrc = 0;
536*53ee8cc1Swenshuai.xi MS_U8 u8KeyIdx = 0;
537*53ee8cc1Swenshuai.xi
538*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(FALSE);
539*53ee8cc1Swenshuai.xi
540*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
541*53ee8cc1Swenshuai.xi
542*53ee8cc1Swenshuai.xi u8BufNum = u32CmdId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
543*53ee8cc1Swenshuai.xi
544*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_CmdDone(u32CmdId, &u32Ret))
545*53ee8cc1Swenshuai.xi {
546*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:HASH cmd[%u] NOT done!", u32CmdId);
547*53ee8cc1Swenshuai.xi bDone = FALSE;
548*53ee8cc1Swenshuai.xi goto ISHASHDONE_FINISH;
549*53ee8cc1Swenshuai.xi }
550*53ee8cc1Swenshuai.xi
551*53ee8cc1Swenshuai.xi //Get all register report, include status and digest
552*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_GetRpt(u32Rpt, HASH_RPT_SIZE_ALL);
553*53ee8cc1Swenshuai.xi
554*53ee8cc1Swenshuai.xi pu8Digest_Buf = _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf;
555*53ee8cc1Swenshuai.xi u32Digest_Buf_Size = _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size;
556*53ee8cc1Swenshuai.xi eKeySrc = _CIPHER_ReportBuffer[u8BufNum].eKeySrc;
557*53ee8cc1Swenshuai.xi u8KeyIdx = _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx;
558*53ee8cc1Swenshuai.xi
559*53ee8cc1Swenshuai.xi //Avoid status report, only copy digest to output address
560*53ee8cc1Swenshuai.xi if((pu8Digest_Buf != NULL) && (u32Digest_Buf_Size > 0))
561*53ee8cc1Swenshuai.xi {
562*53ee8cc1Swenshuai.xi memcpy((MS_U8 *)pu8Digest_Buf, u32Rpt+HASH_RPT_SIZE_STATUS, u32Digest_Buf_Size);
563*53ee8cc1Swenshuai.xi }
564*53ee8cc1Swenshuai.xi
565*53ee8cc1Swenshuai.xi //Reset exception flag for polling mode
566*53ee8cc1Swenshuai.xi if(u32Ret != 0)
567*53ee8cc1Swenshuai.xi {
568*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_ExceptFilter(&u32Ret, eKeySrc, u8KeyIdx);
569*53ee8cc1Swenshuai.xi *pu32Exception = HAL_CIPHER_ReadException(u32Ret);
570*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetException();
571*53ee8cc1Swenshuai.xi }
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi if((u32Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
574*53ee8cc1Swenshuai.xi {
575*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH fail[%u]!", u32CmdId);
576*53ee8cc1Swenshuai.xi }
577*53ee8cc1Swenshuai.xi
578*53ee8cc1Swenshuai.xi bDone = TRUE;
579*53ee8cc1Swenshuai.xi
580*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
581*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
582*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg = 0;
583*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = NULL;
584*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
585*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].eKeySrc = 0;
586*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = 0;
587*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = FALSE;
588*53ee8cc1Swenshuai.xi
589*53ee8cc1Swenshuai.xi ISHASHDONE_FINISH:
590*53ee8cc1Swenshuai.xi
591*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
592*53ee8cc1Swenshuai.xi
593*53ee8cc1Swenshuai.xi if(bDone)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
596*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
597*53ee8cc1Swenshuai.xi }
598*53ee8cc1Swenshuai.xi
599*53ee8cc1Swenshuai.xi return bDone;
600*53ee8cc1Swenshuai.xi }
601*53ee8cc1Swenshuai.xi
MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId,MS_U32 * pu32Exception)602*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
603*53ee8cc1Swenshuai.xi {
604*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
605*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
606*53ee8cc1Swenshuai.xi CIPHER_ISHASHDONE pArgs;
607*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_ISHASHDONE));
608*53ee8cc1Swenshuai.xi
609*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
610*53ee8cc1Swenshuai.xi {
611*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
612*53ee8cc1Swenshuai.xi }
613*53ee8cc1Swenshuai.xi
614*53ee8cc1Swenshuai.xi pArgs.u32CmdId = u32CmdId;
615*53ee8cc1Swenshuai.xi pArgs.pu32Exception = pu32Exception;
616*53ee8cc1Swenshuai.xi
617*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_IsHASHDone, (void*)&pArgs);
618*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
619*53ee8cc1Swenshuai.xi {
620*53ee8cc1Swenshuai.xi //DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
621*53ee8cc1Swenshuai.xi return FALSE;
622*53ee8cc1Swenshuai.xi }
623*53ee8cc1Swenshuai.xi
624*53ee8cc1Swenshuai.xi return TRUE;
625*53ee8cc1Swenshuai.xi #else
626*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_IsHASHDone(u32CmdId, pu32Exception);
627*53ee8cc1Swenshuai.xi #endif
628*53ee8cc1Swenshuai.xi }
629*53ee8cc1Swenshuai.xi
630*53ee8cc1Swenshuai.xi #if 0
631*53ee8cc1Swenshuai.xi static void _dump(MS_U8 *ptr, MS_U32 size)
632*53ee8cc1Swenshuai.xi {
633*53ee8cc1Swenshuai.xi int i = 0;
634*53ee8cc1Swenshuai.xi printf("[DUMP Start]\n");
635*53ee8cc1Swenshuai.xi for(i = 0; i < size; i++)
636*53ee8cc1Swenshuai.xi {
637*53ee8cc1Swenshuai.xi printf("0x%02x ", *(ptr+i));
638*53ee8cc1Swenshuai.xi }
639*53ee8cc1Swenshuai.xi printf("[DUMP Finish]\n");
640*53ee8cc1Swenshuai.xi }
641*53ee8cc1Swenshuai.xi #endif
642*53ee8cc1Swenshuai.xi
_AESDMA_MSBF2Native(MS_U8 u8Bytes[4])643*53ee8cc1Swenshuai.xi MS_U32 _AESDMA_MSBF2Native(MS_U8 u8Bytes[4])
644*53ee8cc1Swenshuai.xi {
645*53ee8cc1Swenshuai.xi return (u8Bytes[0] << 24) | (u8Bytes[1] << 16) | (u8Bytes[2] << 8) | u8Bytes[3];
646*53ee8cc1Swenshuai.xi }
647*53ee8cc1Swenshuai.xi
_ReverseU8Buf(MS_U8 * buf,MS_U32 len)648*53ee8cc1Swenshuai.xi void _ReverseU8Buf(MS_U8 *buf, MS_U32 len)
649*53ee8cc1Swenshuai.xi {
650*53ee8cc1Swenshuai.xi MS_U8 i = 0;
651*53ee8cc1Swenshuai.xi MS_U8 j = len-1;
652*53ee8cc1Swenshuai.xi MS_U8 temp = 0;
653*53ee8cc1Swenshuai.xi
654*53ee8cc1Swenshuai.xi if((buf==NULL)||(len<=1)) return;
655*53ee8cc1Swenshuai.xi
656*53ee8cc1Swenshuai.xi while(i<j)
657*53ee8cc1Swenshuai.xi {
658*53ee8cc1Swenshuai.xi temp = buf[i];
659*53ee8cc1Swenshuai.xi buf[i] = buf[j];
660*53ee8cc1Swenshuai.xi buf[j] = temp;
661*53ee8cc1Swenshuai.xi i++;
662*53ee8cc1Swenshuai.xi j--;
663*53ee8cc1Swenshuai.xi }
664*53ee8cc1Swenshuai.xi }
665*53ee8cc1Swenshuai.xi
_CIPHER_TransDbgLevel(DrvAESDMA_DbgLevel eDbgLevel)666*53ee8cc1Swenshuai.xi CIPHER_DBGMSG_LEVEL _CIPHER_TransDbgLevel(DrvAESDMA_DbgLevel eDbgLevel)
667*53ee8cc1Swenshuai.xi {
668*53ee8cc1Swenshuai.xi CIPHER_DBGMSG_LEVEL eCipherDbgLevel = CIPHER_DBG_NONE;
669*53ee8cc1Swenshuai.xi switch(eDbgLevel)
670*53ee8cc1Swenshuai.xi {
671*53ee8cc1Swenshuai.xi case E_DRVAESDMA_DBG_L1:
672*53ee8cc1Swenshuai.xi eCipherDbgLevel = CIPHER_DBG_ERR;
673*53ee8cc1Swenshuai.xi break;
674*53ee8cc1Swenshuai.xi
675*53ee8cc1Swenshuai.xi case E_DRVAESDMA_DBG_L2:
676*53ee8cc1Swenshuai.xi eCipherDbgLevel = CIPHER_DBG_INFO;
677*53ee8cc1Swenshuai.xi break;
678*53ee8cc1Swenshuai.xi
679*53ee8cc1Swenshuai.xi default:
680*53ee8cc1Swenshuai.xi eCipherDbgLevel = CIPHER_DBG_NONE;
681*53ee8cc1Swenshuai.xi break;
682*53ee8cc1Swenshuai.xi }
683*53ee8cc1Swenshuai.xi
684*53ee8cc1Swenshuai.xi return eCipherDbgLevel;
685*53ee8cc1Swenshuai.xi
686*53ee8cc1Swenshuai.xi }
687*53ee8cc1Swenshuai.xi
688*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
689*53ee8cc1Swenshuai.xi // Global Function
690*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_CIPHER_InitBySWFlag(MS_BOOL bSWInit)691*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_InitBySWFlag(MS_BOOL bSWInit)
692*53ee8cc1Swenshuai.xi {
693*53ee8cc1Swenshuai.xi MS_VIRT u32Bank;
694*53ee8cc1Swenshuai.xi MS_PHY u32BankSize;
695*53ee8cc1Swenshuai.xi MS_U32 i = 0;
696*53ee8cc1Swenshuai.xi
697*53ee8cc1Swenshuai.xi if(_bCIPHERDrv_Inited == TRUE)
698*53ee8cc1Swenshuai.xi {
699*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Double Init!");
700*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
701*53ee8cc1Swenshuai.xi }
702*53ee8cc1Swenshuai.xi
703*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
704*53ee8cc1Swenshuai.xi {
705*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Get MMIO base fail");
706*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
707*53ee8cc1Swenshuai.xi }
708*53ee8cc1Swenshuai.xi
709*53ee8cc1Swenshuai.xi HAL_CIPHER_SetBank(u32Bank);
710*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE, TRUE);
711*53ee8cc1Swenshuai.xi
712*53ee8cc1Swenshuai.xi if(FALSE == bSWInit)
713*53ee8cc1Swenshuai.xi {
714*53ee8cc1Swenshuai.xi HAL_CIPHER_SWReset();
715*53ee8cc1Swenshuai.xi
716*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
717*53ee8cc1Swenshuai.xi _u32CallbackID = 1;
718*53ee8cc1Swenshuai.xi }
719*53ee8cc1Swenshuai.xi
720*53ee8cc1Swenshuai.xi for(i=0;i<CIPHER_REPORT_BUFFER_MAX;i++)
721*53ee8cc1Swenshuai.xi {
722*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32Report = 0;
723*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32DoneBytes = 0;
724*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32ExcMsg = 0;
725*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].pu8Digest_Buf = NULL;
726*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32Digest_Buf_Size = 0;
727*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].eKeySrc = 0;
728*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u8KeyIdx = 0;
729*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].bUsed = FALSE;
730*53ee8cc1Swenshuai.xi }
731*53ee8cc1Swenshuai.xi
732*53ee8cc1Swenshuai.xi _CipherMtx = MsOS_CreateMutex(E_MSOS_FIFO, (char*)"CIPHER Mutex", MSOS_PROCESS_SHARED);
733*53ee8cc1Swenshuai.xi _AESDMAMtx = MsOS_CreateMutex(E_MSOS_FIFO, (char*)"AESDMA Mutex", MSOS_PROCESS_SHARED);
734*53ee8cc1Swenshuai.xi _CipherSemaphore = MsOS_CreateSemaphore(1, E_MSOS_FIFO, (char *)"CIPHER Semaphore");
735*53ee8cc1Swenshuai.xi
736*53ee8cc1Swenshuai.xi _bCIPHERDrv_Inited = TRUE;
737*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
738*53ee8cc1Swenshuai.xi
739*53ee8cc1Swenshuai.xi //Isr event
740*53ee8cc1Swenshuai.xi _s32CIPHEREventId = MsOS_CreateEventGroup("CIPHER_Event");
741*53ee8cc1Swenshuai.xi if (_s32CIPHEREventId < 0)
742*53ee8cc1Swenshuai.xi {
743*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "_s32CIPHEREventId < 0 ");
744*53ee8cc1Swenshuai.xi _u32LastErr = DRV_CIPHER_FAIL;
745*53ee8cc1Swenshuai.xi return _u32LastErr;
746*53ee8cc1Swenshuai.xi }
747*53ee8cc1Swenshuai.xi
748*53ee8cc1Swenshuai.xi //Task stack
749*53ee8cc1Swenshuai.xi _pCIPHERTaskStack = _u8CIPHER_StackBuffer;
750*53ee8cc1Swenshuai.xi
751*53ee8cc1Swenshuai.xi //Isr Task
752*53ee8cc1Swenshuai.xi _s32CIPHERTaskId = MsOS_CreateTask((TaskEntry)_CIPHER_Isr_Proc,
753*53ee8cc1Swenshuai.xi 0,
754*53ee8cc1Swenshuai.xi E_TASK_PRI_SYS,
755*53ee8cc1Swenshuai.xi TRUE,
756*53ee8cc1Swenshuai.xi _pCIPHERTaskStack,
757*53ee8cc1Swenshuai.xi CIPHER_TASK_STACK_SIZE,
758*53ee8cc1Swenshuai.xi "CIPHER_Task");
759*53ee8cc1Swenshuai.xi
760*53ee8cc1Swenshuai.xi if (_s32CIPHERTaskId < 0)
761*53ee8cc1Swenshuai.xi {
762*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "_s32CIPHERTaskId < 0 ");
763*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32CIPHEREventId);
764*53ee8cc1Swenshuai.xi _u32LastErr = DRV_CIPHER_FAIL;
765*53ee8cc1Swenshuai.xi return _u32LastErr;
766*53ee8cc1Swenshuai.xi }
767*53ee8cc1Swenshuai.xi
768*53ee8cc1Swenshuai.xi HAL_CIPHER_IntEnable();
769*53ee8cc1Swenshuai.xi
770*53ee8cc1Swenshuai.xi CIPHERIntDisable();
771*53ee8cc1Swenshuai.xi CIPHERIntDetach();
772*53ee8cc1Swenshuai.xi CIPHERIntAttach();
773*53ee8cc1Swenshuai.xi CIPHERIntEnable();
774*53ee8cc1Swenshuai.xi
775*53ee8cc1Swenshuai.xi #endif
776*53ee8cc1Swenshuai.xi
777*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_Init(void)780*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_Init(void)
781*53ee8cc1Swenshuai.xi {
782*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_InitBySWFlag(FALSE);
783*53ee8cc1Swenshuai.xi }
784*53ee8cc1Swenshuai.xi
MDrv_CIPHER_Init(void)785*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Init(void)
786*53ee8cc1Swenshuai.xi {
787*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
788*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
789*53ee8cc1Swenshuai.xi
790*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
791*53ee8cc1Swenshuai.xi {
792*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_CIPHER, &pu32CipherInst, 0x0, NULL))
793*53ee8cc1Swenshuai.xi {
794*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "UtopiaOpen CIPHER fail\n");
795*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
796*53ee8cc1Swenshuai.xi }
797*53ee8cc1Swenshuai.xi }
798*53ee8cc1Swenshuai.xi
799*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_Init, NULL);
800*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
801*53ee8cc1Swenshuai.xi {
802*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
803*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
804*53ee8cc1Swenshuai.xi }
805*53ee8cc1Swenshuai.xi
806*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
807*53ee8cc1Swenshuai.xi #else
808*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_Init();
809*53ee8cc1Swenshuai.xi #endif
810*53ee8cc1Swenshuai.xi }
811*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_Reset(void)812*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_Reset(void)
813*53ee8cc1Swenshuai.xi {
814*53ee8cc1Swenshuai.xi MS_U32 i = 0;
815*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
816*53ee8cc1Swenshuai.xi
817*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
818*53ee8cc1Swenshuai.xi
819*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE, TRUE);
820*53ee8cc1Swenshuai.xi HAL_CIPHER_SWReset();
821*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetException();
822*53ee8cc1Swenshuai.xi
823*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
824*53ee8cc1Swenshuai.xi _u32CallbackID = 1;
825*53ee8cc1Swenshuai.xi
826*53ee8cc1Swenshuai.xi for(i=0;i<CIPHER_REPORT_BUFFER_MAX;i++)
827*53ee8cc1Swenshuai.xi {
828*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32Report = 0;
829*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32DoneBytes = 0;
830*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32ExcMsg = 0;
831*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].pu8Digest_Buf = NULL;
832*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u32Digest_Buf_Size = 0;
833*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].pfCallback = NULL;
834*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].eKeySrc = 0;
835*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].u8KeyIdx = 0;
836*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[i].bUsed = FALSE;
837*53ee8cc1Swenshuai.xi }
838*53ee8cc1Swenshuai.xi
839*53ee8cc1Swenshuai.xi if(TRUE == _bCIPHERDrv_KeyCtrlEn)
840*53ee8cc1Swenshuai.xi {
841*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
842*53ee8cc1Swenshuai.xi {
843*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi
846*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Reset Key Ctrl!\n");
847*53ee8cc1Swenshuai.xi }
848*53ee8cc1Swenshuai.xi
849*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher Reset!\n");
850*53ee8cc1Swenshuai.xi
851*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
852*53ee8cc1Swenshuai.xi
853*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
854*53ee8cc1Swenshuai.xi }
855*53ee8cc1Swenshuai.xi
MDrv_CIPHER_Reset(void)856*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Reset(void)
857*53ee8cc1Swenshuai.xi {
858*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
859*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
860*53ee8cc1Swenshuai.xi
861*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
862*53ee8cc1Swenshuai.xi {
863*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
864*53ee8cc1Swenshuai.xi }
865*53ee8cc1Swenshuai.xi
866*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_Reset, NULL);
867*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
868*53ee8cc1Swenshuai.xi {
869*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
870*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
871*53ee8cc1Swenshuai.xi }
872*53ee8cc1Swenshuai.xi
873*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
874*53ee8cc1Swenshuai.xi #else
875*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_Reset();
876*53ee8cc1Swenshuai.xi #endif
877*53ee8cc1Swenshuai.xi }
878*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_ResetKey(MS_U32 u32CAVid,MS_U32 u32KeyIdx)879*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_ResetKey(MS_U32 u32CAVid, MS_U32 u32KeyIdx)
880*53ee8cc1Swenshuai.xi {
881*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
882*53ee8cc1Swenshuai.xi DRV_CIPHER_ALGO algo = {0};
883*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
884*53ee8cc1Swenshuai.xi MS_U32 u32WaitCnt = 0;
885*53ee8cc1Swenshuai.xi
886*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
889*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
890*53ee8cc1Swenshuai.xi
891*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE , FALSE );
892*53ee8cc1Swenshuai.xi
893*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_CaVid(u32CAVid))
894*53ee8cc1Swenshuai.xi {
895*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
896*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)u32CAVid);
897*53ee8cc1Swenshuai.xi goto RESETKEY_FINISH;
898*53ee8cc1Swenshuai.xi }
899*53ee8cc1Swenshuai.xi
900*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_Algo(algo);
901*53ee8cc1Swenshuai.xi
902*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_ResetKey(u32KeyIdx))
903*53ee8cc1Swenshuai.xi {
904*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
905*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Reset Key Index fail!");
906*53ee8cc1Swenshuai.xi goto RESETKEY_FINISH;
907*53ee8cc1Swenshuai.xi }
908*53ee8cc1Swenshuai.xi
909*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_InputSrcFrom(E_CIPHER_DIRECT, NULL, 0);
910*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_OutputDstTo(E_CIPHER_DIRECT, NULL, 0);
911*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileinDesc ( 0, HAL_CRYPTODMA_DIRDATA_MAX);
912*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileoutDesc( 0, (HAL_CRYPTODMA_DIRDATA_MAX - 1));
913*53ee8cc1Swenshuai.xi
914*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Start(FALSE, E_DMA_INT_NONE, TRUE, 0))
915*53ee8cc1Swenshuai.xi {
916*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Reset Key fail!\n");
917*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
918*53ee8cc1Swenshuai.xi goto RESETKEY_FINISH;
919*53ee8cc1Swenshuai.xi }
920*53ee8cc1Swenshuai.xi
921*53ee8cc1Swenshuai.xi //Check register report
922*53ee8cc1Swenshuai.xi while((FALSE == HAL_CIPHER_DMA_CmdDone(0, &u32Ret)) && (u32WaitCnt < HAL_CIPHER_RESETKEY_TIMEOUT_VALUE))
923*53ee8cc1Swenshuai.xi {
924*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Reset Key NOT done!");
925*53ee8cc1Swenshuai.xi u32WaitCnt++;
926*53ee8cc1Swenshuai.xi }
927*53ee8cc1Swenshuai.xi
928*53ee8cc1Swenshuai.xi if(u32WaitCnt >= HAL_CIPHER_RESETKEY_TIMEOUT_VALUE)
929*53ee8cc1Swenshuai.xi {
930*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Reset Key timeout!");
931*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
932*53ee8cc1Swenshuai.xi goto RESETKEY_FINISH;
933*53ee8cc1Swenshuai.xi }
934*53ee8cc1Swenshuai.xi
935*53ee8cc1Swenshuai.xi if(u32Ret != 0)
936*53ee8cc1Swenshuai.xi {
937*53ee8cc1Swenshuai.xi //Ignore exception here, HW still clear session key
938*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetException();
939*53ee8cc1Swenshuai.xi }
940*53ee8cc1Swenshuai.xi
941*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher Reset Key success!\n");
942*53ee8cc1Swenshuai.xi
943*53ee8cc1Swenshuai.xi RESETKEY_FINISH:
944*53ee8cc1Swenshuai.xi
945*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
946*53ee8cc1Swenshuai.xi
947*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
948*53ee8cc1Swenshuai.xi
949*53ee8cc1Swenshuai.xi
950*53ee8cc1Swenshuai.xi return ret;
951*53ee8cc1Swenshuai.xi }
952*53ee8cc1Swenshuai.xi
MDrv_CIPHER_ResetKey(MS_U32 u32CAVid,MS_U32 u32KeyIdx)953*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_ResetKey(MS_U32 u32CAVid, MS_U32 u32KeyIdx)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
956*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
957*53ee8cc1Swenshuai.xi CIPHER_RESETKEY pArgs;
958*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_RESETKEY));
959*53ee8cc1Swenshuai.xi
960*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
961*53ee8cc1Swenshuai.xi {
962*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
963*53ee8cc1Swenshuai.xi }
964*53ee8cc1Swenshuai.xi
965*53ee8cc1Swenshuai.xi pArgs.u32CAVid = u32CAVid;
966*53ee8cc1Swenshuai.xi pArgs.u32KeyIdx = u32KeyIdx;
967*53ee8cc1Swenshuai.xi pArgs.ret = DRV_CIPHER_OK;
968*53ee8cc1Swenshuai.xi
969*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_ResetKey, (void*)&pArgs);
970*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
971*53ee8cc1Swenshuai.xi {
972*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
973*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
974*53ee8cc1Swenshuai.xi }
975*53ee8cc1Swenshuai.xi
976*53ee8cc1Swenshuai.xi return pArgs.ret;
977*53ee8cc1Swenshuai.xi #else
978*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_ResetKey(u32CAVid, u32KeyIdx);
979*53ee8cc1Swenshuai.xi #endif
980*53ee8cc1Swenshuai.xi }
981*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)982*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)
983*53ee8cc1Swenshuai.xi {
984*53ee8cc1Swenshuai.xi _CIPHERDBGLevel = eDBGMsgLevel;
985*53ee8cc1Swenshuai.xi HAL_CIPHER_SetDbgLevel(eDBGMsgLevel);
986*53ee8cc1Swenshuai.xi
987*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Debug level[%d]!", eDBGMsgLevel);
988*53ee8cc1Swenshuai.xi
989*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi
MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)992*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)
993*53ee8cc1Swenshuai.xi {
994*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
995*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
996*53ee8cc1Swenshuai.xi CIPHER_DBGLEVEL pArgs;
997*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_DBGLEVEL));
998*53ee8cc1Swenshuai.xi
999*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
1000*53ee8cc1Swenshuai.xi {
1001*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1002*53ee8cc1Swenshuai.xi }
1003*53ee8cc1Swenshuai.xi
1004*53ee8cc1Swenshuai.xi pArgs.eDBGMsgLevel = eDBGMsgLevel;
1005*53ee8cc1Swenshuai.xi
1006*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_DbgLevel, (void*)&pArgs);
1007*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
1008*53ee8cc1Swenshuai.xi {
1009*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1010*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1011*53ee8cc1Swenshuai.xi }
1012*53ee8cc1Swenshuai.xi
1013*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
1014*53ee8cc1Swenshuai.xi #else
1015*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_SetDbgLevel(eDBGMsgLevel);
1016*53ee8cc1Swenshuai.xi #endif
1017*53ee8cc1Swenshuai.xi }
1018*53ee8cc1Swenshuai.xi
MDrv_CIPHER_GetLibVer(const MSIF_Version ** ppVersion)1019*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_GetLibVer(const MSIF_Version **ppVersion)
1020*53ee8cc1Swenshuai.xi {
1021*53ee8cc1Swenshuai.xi if (!ppVersion)
1022*53ee8cc1Swenshuai.xi {
1023*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1024*53ee8cc1Swenshuai.xi }
1025*53ee8cc1Swenshuai.xi
1026*53ee8cc1Swenshuai.xi *ppVersion = &_drv_cipher_version;
1027*53ee8cc1Swenshuai.xi
1028*53ee8cc1Swenshuai.xi return DRV_CIPHER_OK;
1029*53ee8cc1Swenshuai.xi }
1030*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1031*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1032*53ee8cc1Swenshuai.xi {
1033*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1034*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1035*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
1036*53ee8cc1Swenshuai.xi
1037*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1038*53ee8cc1Swenshuai.xi
1039*53ee8cc1Swenshuai.xi if(TRUE == _bCIPHERDrv_KeyCtrlEn)
1040*53ee8cc1Swenshuai.xi {
1041*53ee8cc1Swenshuai.xi if(HAL_CRYPTODMA_DMA_KEY_SLOT <= stCfg.stKey.u8KeyIdx)
1042*53ee8cc1Swenshuai.xi {
1043*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Key Index!");
1044*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1045*53ee8cc1Swenshuai.xi }
1046*53ee8cc1Swenshuai.xi
1047*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_KL == stCfg.stKey.eKeySrc && FALSE == _CIPHER_Resource[stCfg.stKey.u8KeyIdx % HAL_CRYPTODMA_DMA_KEY_SLOT].bUsed)
1048*53ee8cc1Swenshuai.xi {
1049*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", stCfg.stKey.u8KeyIdx);
1050*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1051*53ee8cc1Swenshuai.xi }
1052*53ee8cc1Swenshuai.xi }
1053*53ee8cc1Swenshuai.xi
1054*53ee8cc1Swenshuai.xi //Check data size
1055*53ee8cc1Swenshuai.xi if((stCfg.stInput.u32Size == 0) || (stCfg.stOutput.u32Size == 0))
1056*53ee8cc1Swenshuai.xi {
1057*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!");
1058*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1059*53ee8cc1Swenshuai.xi }
1060*53ee8cc1Swenshuai.xi
1061*53ee8cc1Swenshuai.xi //Check Key length
1062*53ee8cc1Swenshuai.xi if((stCfg.stKey.u8KeyLen > HAL_CRYPTODMA_KEYLEN_MAX) || (stCfg.stKey.u8IVLen > HAL_CRYPTODMA_KEYLEN_MAX))
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key length!\n");
1065*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1066*53ee8cc1Swenshuai.xi }
1067*53ee8cc1Swenshuai.xi
1068*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
1069*53ee8cc1Swenshuai.xi {
1070*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
1071*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1072*53ee8cc1Swenshuai.xi }
1073*53ee8cc1Swenshuai.xi
1074*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
1075*53ee8cc1Swenshuai.xi
1076*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
1077*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1078*53ee8cc1Swenshuai.xi
1079*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1080*53ee8cc1Swenshuai.xi
1081*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
1082*53ee8cc1Swenshuai.xi
1083*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1084*53ee8cc1Swenshuai.xi
1085*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stCfg.u32CAVid))
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1088*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1089*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1090*53ee8cc1Swenshuai.xi }
1091*53ee8cc1Swenshuai.xi
1092*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_Algo( stCfg.stAlgo);
1093*53ee8cc1Swenshuai.xi
1094*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_Key(stCfg.stKey))
1095*53ee8cc1Swenshuai.xi {
1096*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1097*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set Key fail!");
1098*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1099*53ee8cc1Swenshuai.xi }
1100*53ee8cc1Swenshuai.xi
1101*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_IV(stCfg.stKey.pu8IVData, stCfg.stKey.u8IVLen);
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
1104*53ee8cc1Swenshuai.xi stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
1105*53ee8cc1Swenshuai.xi
1106*53ee8cc1Swenshuai.xi // need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
1107*53ee8cc1Swenshuai.xi // before call DMA_Set_FileinDesc and DMA_Set_FileoutDesc
1108*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_InputSrcFrom(stCfg.stInput.eMemoryType, NULL, 0);
1109*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_OutputDstTo(stCfg.stOutput.eMemoryType, NULL, 0))
1110*53ee8cc1Swenshuai.xi {
1111*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1112*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set Output destination fail!");
1113*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1114*53ee8cc1Swenshuai.xi }
1115*53ee8cc1Swenshuai.xi
1116*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input source from [%d], Output destination to [%d]",
1117*53ee8cc1Swenshuai.xi stCfg.stInput.eMemoryType, stCfg.stOutput.eMemoryType);
1118*53ee8cc1Swenshuai.xi
1119*53ee8cc1Swenshuai.xi // Set File-in Addr //
1120*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileinDesc ( stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1121*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileoutDesc( stCfg.stOutput.u32Addr, stCfg.stOutput.u32Addr + stCfg.stOutput.u32Size - 1);
1122*53ee8cc1Swenshuai.xi
1123*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address [0x%08x], size[%u], Output address [0x%08x], size[%u]",
1124*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size, (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
1125*53ee8cc1Swenshuai.xi
1126*53ee8cc1Swenshuai.xi //Check report buffer
1127*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1128*53ee8cc1Swenshuai.xi
1129*53ee8cc1Swenshuai.xi //Report buffer already used
1130*53ee8cc1Swenshuai.xi if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1131*53ee8cc1Swenshuai.xi {
1132*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1133*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_NO_REPORT_BUFFER;
1134*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1135*53ee8cc1Swenshuai.xi }
1136*53ee8cc1Swenshuai.xi
1137*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
1138*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1139*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1140*53ee8cc1Swenshuai.xi
1141*53ee8cc1Swenshuai.xi
1142*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1143*53ee8cc1Swenshuai.xi
1144*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_DMA_DONE;
1145*53ee8cc1Swenshuai.xi
1146*53ee8cc1Swenshuai.xi if(stCfg.pfCallback != NULL)
1147*53ee8cc1Swenshuai.xi {
1148*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1149*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
1150*53ee8cc1Swenshuai.xi }
1151*53ee8cc1Swenshuai.xi #endif
1152*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:DMA decrypt operation[%d]", stCfg.bDecrypt);
1153*53ee8cc1Swenshuai.xi
1154*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Start(stCfg.bDecrypt, eIntMode , TRUE , _u16ThreadID))
1155*53ee8cc1Swenshuai.xi {
1156*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA Fail!\n");
1157*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1158*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1159*53ee8cc1Swenshuai.xi }
1160*53ee8cc1Swenshuai.xi
1161*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1162*53ee8cc1Swenshuai.xi
1163*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
1164*53ee8cc1Swenshuai.xi
1165*53ee8cc1Swenshuai.xi //Check thread id max
1166*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1167*53ee8cc1Swenshuai.xi {
1168*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
1169*53ee8cc1Swenshuai.xi }
1170*53ee8cc1Swenshuai.xi else
1171*53ee8cc1Swenshuai.xi {
1172*53ee8cc1Swenshuai.xi _u16ThreadID++;
1173*53ee8cc1Swenshuai.xi }
1174*53ee8cc1Swenshuai.xi
1175*53ee8cc1Swenshuai.xi DMA_FINISH:
1176*53ee8cc1Swenshuai.xi
1177*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
1178*53ee8cc1Swenshuai.xi
1179*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
1180*53ee8cc1Swenshuai.xi {
1181*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
1182*53ee8cc1Swenshuai.xi }
1183*53ee8cc1Swenshuai.xi
1184*53ee8cc1Swenshuai.xi return ret;
1185*53ee8cc1Swenshuai.xi }
1186*53ee8cc1Swenshuai.xi
MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1187*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
1190*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
1191*53ee8cc1Swenshuai.xi CIPHER_DMACALC pArgs;
1192*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_DMACALC));
1193*53ee8cc1Swenshuai.xi
1194*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
1195*53ee8cc1Swenshuai.xi {
1196*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1197*53ee8cc1Swenshuai.xi }
1198*53ee8cc1Swenshuai.xi
1199*53ee8cc1Swenshuai.xi memcpy(&pArgs.stCfg, &stCfg, sizeof(DRV_CIPHER_DMACFG));
1200*53ee8cc1Swenshuai.xi pArgs.pu32CmdId = pu32CmdId;
1201*53ee8cc1Swenshuai.xi pArgs.ret = DRV_CIPHER_OK;
1202*53ee8cc1Swenshuai.xi
1203*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_DMACalc, (void*)&pArgs);
1204*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
1205*53ee8cc1Swenshuai.xi {
1206*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1207*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1208*53ee8cc1Swenshuai.xi }
1209*53ee8cc1Swenshuai.xi
1210*53ee8cc1Swenshuai.xi return pArgs.ret;
1211*53ee8cc1Swenshuai.xi #else
1212*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_DMACalc(stCfg, pu32CmdId);
1213*53ee8cc1Swenshuai.xi #endif
1214*53ee8cc1Swenshuai.xi }
1215*53ee8cc1Swenshuai.xi
MDrv_CIPHER_OTPHASHCalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1216*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_OTPHASHCalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1217*53ee8cc1Swenshuai.xi {
1218*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1219*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1220*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
1221*53ee8cc1Swenshuai.xi MS_U32 u32OTPHashRound = 0;
1222*53ee8cc1Swenshuai.xi MS_U32 u32CurrentRound = 0;
1223*53ee8cc1Swenshuai.xi
1224*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1225*53ee8cc1Swenshuai.xi
1226*53ee8cc1Swenshuai.xi // Check data size
1227*53ee8cc1Swenshuai.xi if((stCfg.stInput.u32Size == 0) || (stCfg.stOutput.u32Size == 0))
1228*53ee8cc1Swenshuai.xi {
1229*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!");
1230*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1231*53ee8cc1Swenshuai.xi }
1232*53ee8cc1Swenshuai.xi
1233*53ee8cc1Swenshuai.xi // Check CmdId
1234*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
1235*53ee8cc1Swenshuai.xi {
1236*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
1237*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1238*53ee8cc1Swenshuai.xi }
1239*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
1240*53ee8cc1Swenshuai.xi
1241*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
1242*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1243*53ee8cc1Swenshuai.xi
1244*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1245*53ee8cc1Swenshuai.xi
1246*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
1247*53ee8cc1Swenshuai.xi
1248*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1249*53ee8cc1Swenshuai.xi
1250*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stCfg.u32CAVid))
1251*53ee8cc1Swenshuai.xi {
1252*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1253*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1254*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1255*53ee8cc1Swenshuai.xi }
1256*53ee8cc1Swenshuai.xi
1257*53ee8cc1Swenshuai.xi // Set Algorithm
1258*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_Algo( stCfg.stAlgo);
1259*53ee8cc1Swenshuai.xi
1260*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
1261*53ee8cc1Swenshuai.xi stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
1262*53ee8cc1Swenshuai.xi
1263*53ee8cc1Swenshuai.xi // need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
1264*53ee8cc1Swenshuai.xi // before call DMA_Set_FileinDesc and DMA_Set_FileoutDesc
1265*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_InputSrcFrom(stCfg.stInput.eMemoryType, NULL, 0);
1266*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_OutputDstTo(stCfg.stOutput.eMemoryType, NULL, 0);
1267*53ee8cc1Swenshuai.xi
1268*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input source from [%d], Output destination to [%d]",
1269*53ee8cc1Swenshuai.xi stCfg.stInput.eMemoryType, stCfg.stOutput.eMemoryType);
1270*53ee8cc1Swenshuai.xi
1271*53ee8cc1Swenshuai.xi // Not suppoet OTPHash (size low than 32 bytes)
1272*53ee8cc1Swenshuai.xi if(stCfg.stInput.u32Size < HAL_CRYPTODMA_OTPHASH_SIZE_MIN)
1273*53ee8cc1Swenshuai.xi {
1274*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:OTPHASH input size error!");
1275*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:OTPHASH support input size should lagger than %lu bytes!", HAL_CRYPTODMA_OTPHASH_SIZE_MIN);
1276*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
1277*53ee8cc1Swenshuai.xi }
1278*53ee8cc1Swenshuai.xi
1279*53ee8cc1Swenshuai.xi // Check OTPHash round
1280*53ee8cc1Swenshuai.xi while(1)
1281*53ee8cc1Swenshuai.xi {
1282*53ee8cc1Swenshuai.xi if(stCfg.stInput.u32Size <= (u32OTPHashRound+1)*HAL_CRYPTODMA_OTPHASH_UNIT)
1283*53ee8cc1Swenshuai.xi {
1284*53ee8cc1Swenshuai.xi break;
1285*53ee8cc1Swenshuai.xi }
1286*53ee8cc1Swenshuai.xi else
1287*53ee8cc1Swenshuai.xi {
1288*53ee8cc1Swenshuai.xi u32OTPHashRound++;
1289*53ee8cc1Swenshuai.xi }
1290*53ee8cc1Swenshuai.xi }
1291*53ee8cc1Swenshuai.xi
1292*53ee8cc1Swenshuai.xi // Set File-out Addr //
1293*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileoutDesc( stCfg.stOutput.u32Addr, stCfg.stOutput.u32Addr + stCfg.stOutput.u32Size - 1);
1294*53ee8cc1Swenshuai.xi
1295*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Output address [0x%08x], size[%u]",
1296*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
1297*53ee8cc1Swenshuai.xi
1298*53ee8cc1Swenshuai.xi //Check report buffer
1299*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1300*53ee8cc1Swenshuai.xi
1301*53ee8cc1Swenshuai.xi //Report buffer already used
1302*53ee8cc1Swenshuai.xi if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1303*53ee8cc1Swenshuai.xi {
1304*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1305*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_NO_REPORT_BUFFER;
1306*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1307*53ee8cc1Swenshuai.xi }
1308*53ee8cc1Swenshuai.xi
1309*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
1310*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1311*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1312*53ee8cc1Swenshuai.xi
1313*53ee8cc1Swenshuai.xi
1314*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1315*53ee8cc1Swenshuai.xi
1316*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_DMA_DONE;
1317*53ee8cc1Swenshuai.xi
1318*53ee8cc1Swenshuai.xi if(stCfg.pfCallback != NULL)
1319*53ee8cc1Swenshuai.xi {
1320*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1321*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
1322*53ee8cc1Swenshuai.xi }
1323*53ee8cc1Swenshuai.xi #endif
1324*53ee8cc1Swenshuai.xi
1325*53ee8cc1Swenshuai.xi // Start OTPHash
1326*53ee8cc1Swenshuai.xi for(u32CurrentRound=0; u32CurrentRound<=u32OTPHashRound; u32CurrentRound++)
1327*53ee8cc1Swenshuai.xi {
1328*53ee8cc1Swenshuai.xi // Set OTPHash configuration //
1329*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_OTPHash( u32CurrentRound, u32OTPHashRound);
1330*53ee8cc1Swenshuai.xi
1331*53ee8cc1Swenshuai.xi // Set OTPHash File-in Addr //
1332*53ee8cc1Swenshuai.xi HAL_CIPHER_OTPHash_Set_FileinDesc( stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32CurrentRound, stCfg.stInput.eMemoryType);
1333*53ee8cc1Swenshuai.xi
1334*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_OTPHash_Start(eIntMode , TRUE , _u16ThreadID))
1335*53ee8cc1Swenshuai.xi {
1336*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA Fail!\n");
1337*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1338*53ee8cc1Swenshuai.xi goto DMA_FINISH;
1339*53ee8cc1Swenshuai.xi }
1340*53ee8cc1Swenshuai.xi
1341*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1342*53ee8cc1Swenshuai.xi
1343*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
1344*53ee8cc1Swenshuai.xi
1345*53ee8cc1Swenshuai.xi //Check thread id max
1346*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1347*53ee8cc1Swenshuai.xi {
1348*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
1349*53ee8cc1Swenshuai.xi }
1350*53ee8cc1Swenshuai.xi else
1351*53ee8cc1Swenshuai.xi {
1352*53ee8cc1Swenshuai.xi _u16ThreadID++;
1353*53ee8cc1Swenshuai.xi }
1354*53ee8cc1Swenshuai.xi }
1355*53ee8cc1Swenshuai.xi
1356*53ee8cc1Swenshuai.xi DMA_FINISH:
1357*53ee8cc1Swenshuai.xi
1358*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
1359*53ee8cc1Swenshuai.xi
1360*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
1363*53ee8cc1Swenshuai.xi }
1364*53ee8cc1Swenshuai.xi
1365*53ee8cc1Swenshuai.xi return ret;
1366*53ee8cc1Swenshuai.xi
1367*53ee8cc1Swenshuai.xi }
1368*53ee8cc1Swenshuai.xi
_MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg,MS_U32 * pu32CmdId)1369*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg, MS_U32 *pu32CmdId)
1370*53ee8cc1Swenshuai.xi {
1371*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1372*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1373*53ee8cc1Swenshuai.xi MS_U32 u32OutLen = 32;
1374*53ee8cc1Swenshuai.xi MS_U32 u32HashSrc = 0;
1375*53ee8cc1Swenshuai.xi MS_U32 u32HashDst = 0;
1376*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
1377*53ee8cc1Swenshuai.xi
1378*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1379*53ee8cc1Swenshuai.xi
1380*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
1381*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1382*53ee8cc1Swenshuai.xi
1383*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1384*53ee8cc1Swenshuai.xi
1385*53ee8cc1Swenshuai.xi //Check data size
1386*53ee8cc1Swenshuai.xi if((stCfg.stInput.u32Size == 0) || (stCfg.u32Digest_Buf_Size == 0))
1387*53ee8cc1Swenshuai.xi {
1388*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1389*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is zero!");
1390*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi
1393*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
1394*53ee8cc1Swenshuai.xi {
1395*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1396*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1397*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1398*53ee8cc1Swenshuai.xi }
1399*53ee8cc1Swenshuai.xi
1400*53ee8cc1Swenshuai.xi if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1) u32OutLen = HASH_SHA1_DIGEST_SIZE; //160 bits
1401*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256) u32OutLen = HASH_SHA256_DIGEST_SIZE; //256 bits
1402*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5) u32OutLen = HASH_MD5_DIGEST_SIZE; //128 bits
1403*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3) u32OutLen = HASH_SM3_DIGEST_SIZE; //256 bits
1404*53ee8cc1Swenshuai.xi else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1405*53ee8cc1Swenshuai.xi
1406*53ee8cc1Swenshuai.xi if(stCfg.u32Digest_Buf_Size != u32OutLen)
1407*53ee8cc1Swenshuai.xi {
1408*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1409*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!", stCfg.u32Digest_Buf_Size);
1410*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1411*53ee8cc1Swenshuai.xi }
1412*53ee8cc1Swenshuai.xi
1413*53ee8cc1Swenshuai.xi //Reset all
1414*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(FALSE , TRUE);
1415*53ee8cc1Swenshuai.xi
1416*53ee8cc1Swenshuai.xi //Set CAVid
1417*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]\n", (unsigned int)stCfg.u32CAVid);
1418*53ee8cc1Swenshuai.xi
1419*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1420*53ee8cc1Swenshuai.xi {
1421*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1422*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1423*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1424*53ee8cc1Swenshuai.xi }
1425*53ee8cc1Swenshuai.xi
1426*53ee8cc1Swenshuai.xi //Set Algo
1427*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE );
1428*53ee8cc1Swenshuai.xi
1429*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm [%d]", stCfg.eAlgo);
1430*53ee8cc1Swenshuai.xi
1431*53ee8cc1Swenshuai.xi //Set IV to FIPS
1432*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
1433*53ee8cc1Swenshuai.xi {
1434*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1435*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HASH IV fail!");
1436*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1437*53ee8cc1Swenshuai.xi }
1438*53ee8cc1Swenshuai.xi
1439*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
1440*53ee8cc1Swenshuai.xi {
1441*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1442*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
1443*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1444*53ee8cc1Swenshuai.xi }
1445*53ee8cc1Swenshuai.xi
1446*53ee8cc1Swenshuai.xi //Set Hash message source
1447*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1448*53ee8cc1Swenshuai.xi {
1449*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1450*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1451*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1452*53ee8cc1Swenshuai.xi }
1453*53ee8cc1Swenshuai.xi
1454*53ee8cc1Swenshuai.xi //Set input message address
1455*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1456*53ee8cc1Swenshuai.xi {
1457*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1458*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1459*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1460*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1461*53ee8cc1Swenshuai.xi }
1462*53ee8cc1Swenshuai.xi
1463*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO;Set Input address[0x%08x], size[%u]",
1464*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1465*53ee8cc1Swenshuai.xi
1466*53ee8cc1Swenshuai.xi //Set output destination
1467*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1468*53ee8cc1Swenshuai.xi {
1469*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1470*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1471*53ee8cc1Swenshuai.xi }
1472*53ee8cc1Swenshuai.xi
1473*53ee8cc1Swenshuai.xi #if 0 //Default output to Register
1474*53ee8cc1Swenshuai.xi //Set output address
1475*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA((MS_U32)stCfg.pu8Digest_Buf), u32HashDst))
1476*53ee8cc1Swenshuai.xi {
1477*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1478*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1479*53ee8cc1Swenshuai.xi }
1480*53ee8cc1Swenshuai.xi #endif
1481*53ee8cc1Swenshuai.xi
1482*53ee8cc1Swenshuai.xi //Set HOS = 1 , Output will be MSB First
1483*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetHOS(TRUE);
1484*53ee8cc1Swenshuai.xi
1485*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1486*53ee8cc1Swenshuai.xi
1487*53ee8cc1Swenshuai.xi //Report buffer already used
1488*53ee8cc1Swenshuai.xi if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1489*53ee8cc1Swenshuai.xi {
1490*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1491*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_NO_REPORT_BUFFER;
1492*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi
1495*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
1496*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1497*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = stCfg.pu8Digest_Buf;
1498*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
1499*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1500*53ee8cc1Swenshuai.xi
1501*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]",
1502*53ee8cc1Swenshuai.xi (long unsigned int)stCfg.pu8Digest_Buf,
1503*53ee8cc1Swenshuai.xi stCfg.u32Digest_Buf_Size);
1504*53ee8cc1Swenshuai.xi
1505*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1506*53ee8cc1Swenshuai.xi
1507*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_HASH_DONE;
1508*53ee8cc1Swenshuai.xi
1509*53ee8cc1Swenshuai.xi if(stCfg.pfCallback != NULL)
1510*53ee8cc1Swenshuai.xi {
1511*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1512*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
1513*53ee8cc1Swenshuai.xi }
1514*53ee8cc1Swenshuai.xi #endif
1515*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
1516*53ee8cc1Swenshuai.xi
1517*53ee8cc1Swenshuai.xi //Start hash
1518*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
1519*53ee8cc1Swenshuai.xi {
1520*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1521*53ee8cc1Swenshuai.xi goto HASHAUTO_FINISH;
1522*53ee8cc1Swenshuai.xi }
1523*53ee8cc1Swenshuai.xi
1524*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1525*53ee8cc1Swenshuai.xi
1526*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
1527*53ee8cc1Swenshuai.xi
1528*53ee8cc1Swenshuai.xi //Check thread id max
1529*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1530*53ee8cc1Swenshuai.xi {
1531*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
1532*53ee8cc1Swenshuai.xi }
1533*53ee8cc1Swenshuai.xi else
1534*53ee8cc1Swenshuai.xi {
1535*53ee8cc1Swenshuai.xi _u16ThreadID++;
1536*53ee8cc1Swenshuai.xi }
1537*53ee8cc1Swenshuai.xi
1538*53ee8cc1Swenshuai.xi HASHAUTO_FINISH:
1539*53ee8cc1Swenshuai.xi
1540*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
1541*53ee8cc1Swenshuai.xi
1542*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
1543*53ee8cc1Swenshuai.xi {
1544*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
1545*53ee8cc1Swenshuai.xi }
1546*53ee8cc1Swenshuai.xi
1547*53ee8cc1Swenshuai.xi return ret;
1548*53ee8cc1Swenshuai.xi }
1549*53ee8cc1Swenshuai.xi
MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg,MS_U32 * pu32CmdId)1550*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg, MS_U32 *pu32CmdId)
1551*53ee8cc1Swenshuai.xi {
1552*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
1553*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
1554*53ee8cc1Swenshuai.xi CIPHER_HASHCALC pArgs;
1555*53ee8cc1Swenshuai.xi memset(&pArgs, 0, sizeof(CIPHER_HASHCALC));
1556*53ee8cc1Swenshuai.xi
1557*53ee8cc1Swenshuai.xi if(pu32CipherInst == NULL)
1558*53ee8cc1Swenshuai.xi {
1559*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1560*53ee8cc1Swenshuai.xi }
1561*53ee8cc1Swenshuai.xi
1562*53ee8cc1Swenshuai.xi memcpy(&pArgs.stCfg, &stCfg, sizeof(DRV_CIPHER_HASHCFG));
1563*53ee8cc1Swenshuai.xi pArgs.pu32CmdId = pu32CmdId;
1564*53ee8cc1Swenshuai.xi pArgs.ret = DRV_CIPHER_OK;
1565*53ee8cc1Swenshuai.xi
1566*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_HASH, (void*)&pArgs);
1567*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
1568*53ee8cc1Swenshuai.xi {
1569*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1570*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1571*53ee8cc1Swenshuai.xi }
1572*53ee8cc1Swenshuai.xi
1573*53ee8cc1Swenshuai.xi return pArgs.ret;
1574*53ee8cc1Swenshuai.xi #else
1575*53ee8cc1Swenshuai.xi return _MDrv_CIPHER_HASH(stCfg, pu32CmdId);
1576*53ee8cc1Swenshuai.xi #endif
1577*53ee8cc1Swenshuai.xi }
1578*53ee8cc1Swenshuai.xi
MDrv_CIPHER_HASHManual(DRV_CIPHER_HASHCFG_MANUAL stCfg,MS_U32 * pu32CmdId)1579*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HASHManual(DRV_CIPHER_HASHCFG_MANUAL stCfg, MS_U32 *pu32CmdId)
1580*53ee8cc1Swenshuai.xi {
1581*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1582*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1583*53ee8cc1Swenshuai.xi HAL_CIPHER_IWCTYPE eIWCType = E_CIPHER_HASH_IWC_MANUAL; //Init Word Count
1584*53ee8cc1Swenshuai.xi MS_U32 u32IVSel = CMD_HASH_IV_FIPS;
1585*53ee8cc1Swenshuai.xi MS_U8* pu8IV = NULL;
1586*53ee8cc1Swenshuai.xi MS_U32 u32DataSize = 0;
1587*53ee8cc1Swenshuai.xi MS_U32 u32IVSize = 0;
1588*53ee8cc1Swenshuai.xi MS_BOOL bAutoPad = FALSE;
1589*53ee8cc1Swenshuai.xi MS_U32 u32OutLen = 32;
1590*53ee8cc1Swenshuai.xi MS_U32 u32HashSrc = 0;
1591*53ee8cc1Swenshuai.xi MS_U32 u32HashDst = 0;
1592*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
1593*53ee8cc1Swenshuai.xi
1594*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1595*53ee8cc1Swenshuai.xi
1596*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
1597*53ee8cc1Swenshuai.xi
1598*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
1599*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1600*53ee8cc1Swenshuai.xi
1601*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1602*53ee8cc1Swenshuai.xi
1603*53ee8cc1Swenshuai.xi //Check data size
1604*53ee8cc1Swenshuai.xi u32DataSize = stCfg.stInput.u32Size;
1605*53ee8cc1Swenshuai.xi
1606*53ee8cc1Swenshuai.xi if((0 == u32DataSize) && (E_CIPHER_HASH_STAGE_LAST != stCfg.eStage))
1607*53ee8cc1Swenshuai.xi {
1608*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1609*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is [%u]!\n", u32DataSize);
1610*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1611*53ee8cc1Swenshuai.xi }
1612*53ee8cc1Swenshuai.xi
1613*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
1614*53ee8cc1Swenshuai.xi {
1615*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1616*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1617*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1618*53ee8cc1Swenshuai.xi }
1619*53ee8cc1Swenshuai.xi
1620*53ee8cc1Swenshuai.xi if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1) u32OutLen = HASH_SHA1_DIGEST_SIZE; //160 bits
1621*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256) u32OutLen = HASH_SHA256_DIGEST_SIZE; //256 bits
1622*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5) u32OutLen = HASH_MD5_DIGEST_SIZE; //128 bits
1623*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3) u32OutLen = HASH_SM3_DIGEST_SIZE; //256 bits
1624*53ee8cc1Swenshuai.xi else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1625*53ee8cc1Swenshuai.xi
1626*53ee8cc1Swenshuai.xi //Check buffer and size
1627*53ee8cc1Swenshuai.xi if((stCfg.pu8Digest_Buf != NULL) && (stCfg.u32Digest_Buf_Size != u32OutLen))
1628*53ee8cc1Swenshuai.xi {
1629*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1630*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!\n", stCfg.u32Digest_Buf_Size);
1631*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1632*53ee8cc1Swenshuai.xi }
1633*53ee8cc1Swenshuai.xi
1634*53ee8cc1Swenshuai.xi //Check IV setting
1635*53ee8cc1Swenshuai.xi if(stCfg.pu8SetIV != NULL)
1636*53ee8cc1Swenshuai.xi {
1637*53ee8cc1Swenshuai.xi pu8IV = stCfg.pu8SetIV;
1638*53ee8cc1Swenshuai.xi u32IVSel = CMD_HASH_IV_CMD;
1639*53ee8cc1Swenshuai.xi
1640*53ee8cc1Swenshuai.xi if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1)
1641*53ee8cc1Swenshuai.xi {
1642*53ee8cc1Swenshuai.xi u32IVSize = HASH_SHA1_DIGEST_SIZE;
1643*53ee8cc1Swenshuai.xi }
1644*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256)
1645*53ee8cc1Swenshuai.xi {
1646*53ee8cc1Swenshuai.xi u32IVSize = HASH_SHA256_DIGEST_SIZE;
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5)
1649*53ee8cc1Swenshuai.xi {
1650*53ee8cc1Swenshuai.xi u32IVSize = HASH_MD5_DIGEST_SIZE;
1651*53ee8cc1Swenshuai.xi }
1652*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3)
1653*53ee8cc1Swenshuai.xi {
1654*53ee8cc1Swenshuai.xi u32IVSize = HASH_SM3_DIGEST_SIZE;
1655*53ee8cc1Swenshuai.xi }
1656*53ee8cc1Swenshuai.xi }
1657*53ee8cc1Swenshuai.xi else
1658*53ee8cc1Swenshuai.xi {
1659*53ee8cc1Swenshuai.xi //NULL IV
1660*53ee8cc1Swenshuai.xi if(stCfg.eIVMode == E_CIPHER_HASH_IV_CMD)
1661*53ee8cc1Swenshuai.xi {
1662*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1663*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:NULL IV!");
1664*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1665*53ee8cc1Swenshuai.xi }
1666*53ee8cc1Swenshuai.xi }
1667*53ee8cc1Swenshuai.xi
1668*53ee8cc1Swenshuai.xi //IV and IWC is from previous report
1669*53ee8cc1Swenshuai.xi if(stCfg.eIVMode == E_CIPHER_HASH_IV_PRV)
1670*53ee8cc1Swenshuai.xi {
1671*53ee8cc1Swenshuai.xi u32IVSel = CMD_HASH_IV_PRV_RPT;
1672*53ee8cc1Swenshuai.xi eIWCType = E_CIPHER_HASH_IWC_PRV;
1673*53ee8cc1Swenshuai.xi }
1674*53ee8cc1Swenshuai.xi
1675*53ee8cc1Swenshuai.xi //AutoPad only works on last stage, previous stage is 64 bytes alignment
1676*53ee8cc1Swenshuai.xi if(stCfg.eStage == E_CIPHER_HASH_STAGE_LAST)
1677*53ee8cc1Swenshuai.xi {
1678*53ee8cc1Swenshuai.xi bAutoPad = TRUE;
1679*53ee8cc1Swenshuai.xi }
1680*53ee8cc1Swenshuai.xi else
1681*53ee8cc1Swenshuai.xi {
1682*53ee8cc1Swenshuai.xi if((u32DataSize % (MS_U32)HASH_BLOCK_SIZE) != 0 )
1683*53ee8cc1Swenshuai.xi {
1684*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1685*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH block is 64 bytes alignment!");
1686*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1687*53ee8cc1Swenshuai.xi }
1688*53ee8cc1Swenshuai.xi }
1689*53ee8cc1Swenshuai.xi
1690*53ee8cc1Swenshuai.xi //Reset all
1691*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(FALSE , TRUE);
1692*53ee8cc1Swenshuai.xi
1693*53ee8cc1Swenshuai.xi //Set CAVid
1694*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1695*53ee8cc1Swenshuai.xi
1696*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1697*53ee8cc1Swenshuai.xi {
1698*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1699*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1700*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1701*53ee8cc1Swenshuai.xi }
1702*53ee8cc1Swenshuai.xi
1703*53ee8cc1Swenshuai.xi //Set Algo
1704*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, bAutoPad, FALSE);
1705*53ee8cc1Swenshuai.xi
1706*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm[%d], AutoPad[%d]", stCfg.eAlgo, bAutoPad);
1707*53ee8cc1Swenshuai.xi
1708*53ee8cc1Swenshuai.xi //Set IV to FIPS
1709*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_IV(pu8IV, u32IVSize , u32IVSel))
1710*53ee8cc1Swenshuai.xi {
1711*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1712*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set IV fail, IV size[%u]", u32IVSize);
1713*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1714*53ee8cc1Swenshuai.xi }
1715*53ee8cc1Swenshuai.xi
1716*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set IV size[%u], IV Mode[%d]", u32IVSize, stCfg.eIVMode);
1717*53ee8cc1Swenshuai.xi
1718*53ee8cc1Swenshuai.xi //Set Init Word Count
1719*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(eIWCType, stCfg.u32StartByte))
1720*53ee8cc1Swenshuai.xi {
1721*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1722*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set IWC fail, IWC[%d], StartBytes[%u]", eIWCType, stCfg.u32StartByte);
1723*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1724*53ee8cc1Swenshuai.xi }
1725*53ee8cc1Swenshuai.xi
1726*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set IWC[%d], StartBytes[%u]", eIWCType, stCfg.u32StartByte);
1727*53ee8cc1Swenshuai.xi
1728*53ee8cc1Swenshuai.xi //Set HMAC Key
1729*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, stCfg.eHMACKPad, FALSE))
1730*53ee8cc1Swenshuai.xi {
1731*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1732*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set HMAC key fail, HMAC key source[%d], key index[%u]", stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
1733*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1734*53ee8cc1Swenshuai.xi }
1735*53ee8cc1Swenshuai.xi
1736*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set HMAC Key Source[%d], Key Index[%u], KeyPad[%d]",
1737*53ee8cc1Swenshuai.xi stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx, stCfg.eHMACKPad);
1738*53ee8cc1Swenshuai.xi
1739*53ee8cc1Swenshuai.xi //Set Hash message source
1740*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1741*53ee8cc1Swenshuai.xi {
1742*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1743*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1744*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1745*53ee8cc1Swenshuai.xi }
1746*53ee8cc1Swenshuai.xi
1747*53ee8cc1Swenshuai.xi //Set input message address
1748*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1749*53ee8cc1Swenshuai.xi {
1750*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1751*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1752*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1753*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1754*53ee8cc1Swenshuai.xi }
1755*53ee8cc1Swenshuai.xi
1756*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input address[0x%08x], size[%u]",
1757*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1758*53ee8cc1Swenshuai.xi
1759*53ee8cc1Swenshuai.xi //Set output destination
1760*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1761*53ee8cc1Swenshuai.xi {
1762*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1763*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1764*53ee8cc1Swenshuai.xi }
1765*53ee8cc1Swenshuai.xi #if 0
1766*53ee8cc1Swenshuai.xi //Set output address
1767*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
1768*53ee8cc1Swenshuai.xi {
1769*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1770*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1771*53ee8cc1Swenshuai.xi }
1772*53ee8cc1Swenshuai.xi #endif
1773*53ee8cc1Swenshuai.xi //Set HOS = 1, Output will be MSB First
1774*53ee8cc1Swenshuai.xi //IV auto mode use previous report digest as IV, report must be LSB first
1775*53ee8cc1Swenshuai.xi if(stCfg.pu8Digest_Buf == NULL)
1776*53ee8cc1Swenshuai.xi {
1777*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetHOS(FALSE);
1778*53ee8cc1Swenshuai.xi }
1779*53ee8cc1Swenshuai.xi else
1780*53ee8cc1Swenshuai.xi {
1781*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetHOS(TRUE);
1782*53ee8cc1Swenshuai.xi }
1783*53ee8cc1Swenshuai.xi
1784*53ee8cc1Swenshuai.xi //Set total size if last command
1785*53ee8cc1Swenshuai.xi if(stCfg.eStage == E_CIPHER_HASH_STAGE_LAST)
1786*53ee8cc1Swenshuai.xi {
1787*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetMsgLength(stCfg.u32StartByte + stCfg.stInput.u32Size);
1788*53ee8cc1Swenshuai.xi }
1789*53ee8cc1Swenshuai.xi
1790*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Message length, StartBytes[0x%08x], Input Size[%u]",
1791*53ee8cc1Swenshuai.xi (unsigned int)stCfg.u32StartByte, stCfg.stInput.u32Size);
1792*53ee8cc1Swenshuai.xi
1793*53ee8cc1Swenshuai.xi
1794*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1795*53ee8cc1Swenshuai.xi
1796*53ee8cc1Swenshuai.xi //Report buffer already used
1797*53ee8cc1Swenshuai.xi if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1798*53ee8cc1Swenshuai.xi {
1799*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer[%u] is used!", u8BufNum);
1800*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_NO_REPORT_BUFFER;
1801*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1802*53ee8cc1Swenshuai.xi }
1803*53ee8cc1Swenshuai.xi
1804*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
1805*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1806*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = stCfg.pu8Digest_Buf;
1807*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
1808*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].eKeySrc = stCfg.stHMACKey.eKeySrc;
1809*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
1810*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1811*53ee8cc1Swenshuai.xi
1812*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]",
1813*53ee8cc1Swenshuai.xi (long unsigned int)stCfg.pu8Digest_Buf, stCfg.u32Digest_Buf_Size);
1814*53ee8cc1Swenshuai.xi
1815*53ee8cc1Swenshuai.xi
1816*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1817*53ee8cc1Swenshuai.xi
1818*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_HASH_DONE;
1819*53ee8cc1Swenshuai.xi #endif
1820*53ee8cc1Swenshuai.xi
1821*53ee8cc1Swenshuai.xi //Start hash
1822*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
1823*53ee8cc1Swenshuai.xi {
1824*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1825*53ee8cc1Swenshuai.xi goto HASHMANUAL_FINISH;
1826*53ee8cc1Swenshuai.xi }
1827*53ee8cc1Swenshuai.xi
1828*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
1829*53ee8cc1Swenshuai.xi
1830*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
1831*53ee8cc1Swenshuai.xi
1832*53ee8cc1Swenshuai.xi //Check thread id max
1833*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1834*53ee8cc1Swenshuai.xi {
1835*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
1836*53ee8cc1Swenshuai.xi }
1837*53ee8cc1Swenshuai.xi else
1838*53ee8cc1Swenshuai.xi {
1839*53ee8cc1Swenshuai.xi _u16ThreadID++;
1840*53ee8cc1Swenshuai.xi }
1841*53ee8cc1Swenshuai.xi
1842*53ee8cc1Swenshuai.xi HASHMANUAL_FINISH:
1843*53ee8cc1Swenshuai.xi
1844*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
1845*53ee8cc1Swenshuai.xi
1846*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
1847*53ee8cc1Swenshuai.xi {
1848*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
1849*53ee8cc1Swenshuai.xi }
1850*53ee8cc1Swenshuai.xi
1851*53ee8cc1Swenshuai.xi return ret;
1852*53ee8cc1Swenshuai.xi }
1853*53ee8cc1Swenshuai.xi
MDrv_CIPHER_HMAC(DRV_CIPHER_HMACCFG stCfg,MS_U32 * pu32CmdId)1854*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HMAC(DRV_CIPHER_HMACCFG stCfg, MS_U32 *pu32CmdId)
1855*53ee8cc1Swenshuai.xi {
1856*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1857*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1858*53ee8cc1Swenshuai.xi MS_U32 u32OutLen = 0;
1859*53ee8cc1Swenshuai.xi MS_U32 u32HashSrc = 0;
1860*53ee8cc1Swenshuai.xi MS_U32 u32HashDst = 0;
1861*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
1862*53ee8cc1Swenshuai.xi
1863*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_NOS) || defined (MCU_AEON) || defined (MSOS_TYPE_OPTEE)
1864*53ee8cc1Swenshuai.xi MS_U32 Rpt[10] = {0};
1865*53ee8cc1Swenshuai.xi MS_U32 u32WaitCnt = 0;
1866*53ee8cc1Swenshuai.xi MS_U32 u32ErrorMsg = 0;
1867*53ee8cc1Swenshuai.xi #endif
1868*53ee8cc1Swenshuai.xi
1869*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1870*53ee8cc1Swenshuai.xi
1871*53ee8cc1Swenshuai.xi if(TRUE == _bCIPHERDrv_KeyCtrlEn)
1872*53ee8cc1Swenshuai.xi {
1873*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_KL == stCfg.stHMACKey.eKeySrc)
1874*53ee8cc1Swenshuai.xi {
1875*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not support!");
1876*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
1877*53ee8cc1Swenshuai.xi }
1878*53ee8cc1Swenshuai.xi }
1879*53ee8cc1Swenshuai.xi
1880*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
1881*53ee8cc1Swenshuai.xi
1882*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
1883*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1884*53ee8cc1Swenshuai.xi
1885*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1886*53ee8cc1Swenshuai.xi
1887*53ee8cc1Swenshuai.xi //Check data size
1888*53ee8cc1Swenshuai.xi if((stCfg.stInput.u32Size == 0) || (stCfg.u32Digest_Buf_Size == 0))
1889*53ee8cc1Swenshuai.xi {
1890*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is zero!");
1891*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1892*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1893*53ee8cc1Swenshuai.xi }
1894*53ee8cc1Swenshuai.xi
1895*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
1896*53ee8cc1Swenshuai.xi {
1897*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1898*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1899*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1900*53ee8cc1Swenshuai.xi }
1901*53ee8cc1Swenshuai.xi
1902*53ee8cc1Swenshuai.xi if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1) u32OutLen = HASH_SHA1_DIGEST_SIZE; //160 bits
1903*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256) u32OutLen = HASH_SHA256_DIGEST_SIZE; //256 bits
1904*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5) u32OutLen = HASH_MD5_DIGEST_SIZE; //128 bits
1905*53ee8cc1Swenshuai.xi else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3) u32OutLen = HASH_SM3_DIGEST_SIZE; //256 bits
1906*53ee8cc1Swenshuai.xi else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1907*53ee8cc1Swenshuai.xi
1908*53ee8cc1Swenshuai.xi if(stCfg.u32Digest_Buf_Size != u32OutLen)
1909*53ee8cc1Swenshuai.xi {
1910*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1911*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!", stCfg.u32Digest_Buf_Size);
1912*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1913*53ee8cc1Swenshuai.xi }
1914*53ee8cc1Swenshuai.xi //------------Inner hash----------------------------
1915*53ee8cc1Swenshuai.xi //Reset all
1916*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(FALSE , TRUE);
1917*53ee8cc1Swenshuai.xi //Set CAVid
1918*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1919*53ee8cc1Swenshuai.xi {
1920*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1921*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1922*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1923*53ee8cc1Swenshuai.xi }
1924*53ee8cc1Swenshuai.xi //Set Algo
1925*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE);
1926*53ee8cc1Swenshuai.xi
1927*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm [%d]", stCfg.eAlgo);
1928*53ee8cc1Swenshuai.xi
1929*53ee8cc1Swenshuai.xi //Set IV to FIPS
1930*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
1931*53ee8cc1Swenshuai.xi {
1932*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1933*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC IV fail!");
1934*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1935*53ee8cc1Swenshuai.xi }
1936*53ee8cc1Swenshuai.xi
1937*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
1938*53ee8cc1Swenshuai.xi {
1939*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1940*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
1941*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1942*53ee8cc1Swenshuai.xi }
1943*53ee8cc1Swenshuai.xi
1944*53ee8cc1Swenshuai.xi //Set HMAC Key
1945*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, E_CIPHER_HMAC_IKPAD, FALSE))
1946*53ee8cc1Swenshuai.xi {
1947*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1948*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set HMAC key fail, HMAC key source[%d], key index[%u]", stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
1949*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1950*53ee8cc1Swenshuai.xi }
1951*53ee8cc1Swenshuai.xi
1952*53ee8cc1Swenshuai.xi //Set Hash message source
1953*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1954*53ee8cc1Swenshuai.xi {
1955*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1956*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1957*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1958*53ee8cc1Swenshuai.xi }
1959*53ee8cc1Swenshuai.xi //Set input message address
1960*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1961*53ee8cc1Swenshuai.xi {
1962*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1963*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1964*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1965*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1966*53ee8cc1Swenshuai.xi }
1967*53ee8cc1Swenshuai.xi
1968*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address[0x%08x], size[%u]",
1969*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1970*53ee8cc1Swenshuai.xi
1971*53ee8cc1Swenshuai.xi //Set output destination, HMAC inner hash output to register
1972*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1973*53ee8cc1Swenshuai.xi {
1974*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
1975*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1976*53ee8cc1Swenshuai.xi }
1977*53ee8cc1Swenshuai.xi #if 0
1978*53ee8cc1Swenshuai.xi //Set output address
1979*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
1980*53ee8cc1Swenshuai.xi {
1981*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
1982*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
1983*53ee8cc1Swenshuai.xi }
1984*53ee8cc1Swenshuai.xi #endif
1985*53ee8cc1Swenshuai.xi //Set HOS = 0, HW limitation
1986*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetHOS(FALSE);
1987*53ee8cc1Swenshuai.xi
1988*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetMsgLength(stCfg.stInput.u32Size + HASH_HMAC_KEYPAD_SIZE);
1989*53ee8cc1Swenshuai.xi
1990*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1991*53ee8cc1Swenshuai.xi
1992*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
1993*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1994*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = NULL;
1995*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
1996*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].eKeySrc = stCfg.stHMACKey.eKeySrc;
1997*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
1998*53ee8cc1Swenshuai.xi
1999*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
2000*53ee8cc1Swenshuai.xi
2001*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_HASH_DONE;
2002*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
2003*53ee8cc1Swenshuai.xi
2004*53ee8cc1Swenshuai.xi #endif
2005*53ee8cc1Swenshuai.xi
2006*53ee8cc1Swenshuai.xi //Start hash
2007*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
2008*53ee8cc1Swenshuai.xi {
2009*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2010*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2011*53ee8cc1Swenshuai.xi }
2012*53ee8cc1Swenshuai.xi
2013*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
2014*53ee8cc1Swenshuai.xi
2015*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_NOS) || defined (MCU_AEON) || defined (MSOS_TYPE_OPTEE)
2016*53ee8cc1Swenshuai.xi
2017*53ee8cc1Swenshuai.xi while(FALSE == HAL_CIPHER_Hash_CmdDone(_u16ThreadID, &u32ErrorMsg) && u32WaitCnt < HASH_TIMEOUT_VALUE)
2018*53ee8cc1Swenshuai.xi {
2019*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_NUTTX
2020*53ee8cc1Swenshuai.xi MsOS_DelayTaskUs(200);
2021*53ee8cc1Swenshuai.xi #elif MSOS_TYPE_OPTEE
2022*53ee8cc1Swenshuai.xi
2023*53ee8cc1Swenshuai.xi #else
2024*53ee8cc1Swenshuai.xi MsOS_DelayTask(20);
2025*53ee8cc1Swenshuai.xi #endif
2026*53ee8cc1Swenshuai.xi u32WaitCnt++;
2027*53ee8cc1Swenshuai.xi }
2028*53ee8cc1Swenshuai.xi //First time should print HMAC error flag
2029*53ee8cc1Swenshuai.xi if(u32ErrorMsg != 0)
2030*53ee8cc1Swenshuai.xi {
2031*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_ExceptFilter(&u32ErrorMsg, stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
2032*53ee8cc1Swenshuai.xi HAL_CIPHER_ReadException(u32ErrorMsg);
2033*53ee8cc1Swenshuai.xi }
2034*53ee8cc1Swenshuai.xi
2035*53ee8cc1Swenshuai.xi if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
2036*53ee8cc1Swenshuai.xi {
2037*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
2038*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2039*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2040*53ee8cc1Swenshuai.xi }
2041*53ee8cc1Swenshuai.xi
2042*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_GetRpt(Rpt, HASH_RPT_SIZE_STATUS);
2043*53ee8cc1Swenshuai.xi
2044*53ee8cc1Swenshuai.xi if((Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
2045*53ee8cc1Swenshuai.xi {
2046*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2047*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HMAC Inner Hash Fail!");
2048*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2049*53ee8cc1Swenshuai.xi }
2050*53ee8cc1Swenshuai.xi
2051*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
2052*53ee8cc1Swenshuai.xi #endif
2053*53ee8cc1Swenshuai.xi
2054*53ee8cc1Swenshuai.xi //Check thread id max
2055*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
2056*53ee8cc1Swenshuai.xi {
2057*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
2058*53ee8cc1Swenshuai.xi }
2059*53ee8cc1Swenshuai.xi else
2060*53ee8cc1Swenshuai.xi {
2061*53ee8cc1Swenshuai.xi _u16ThreadID++;
2062*53ee8cc1Swenshuai.xi }
2063*53ee8cc1Swenshuai.xi
2064*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2065*53ee8cc1Swenshuai.xi
2066*53ee8cc1Swenshuai.xi //----------------Outer hash------------------------------
2067*53ee8cc1Swenshuai.xi
2068*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
2069*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
2070*53ee8cc1Swenshuai.xi
2071*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2072*53ee8cc1Swenshuai.xi
2073*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_NONE;
2074*53ee8cc1Swenshuai.xi
2075*53ee8cc1Swenshuai.xi //Set CAVid
2076*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
2077*53ee8cc1Swenshuai.xi {
2078*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2079*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
2080*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2081*53ee8cc1Swenshuai.xi }
2082*53ee8cc1Swenshuai.xi
2083*53ee8cc1Swenshuai.xi //Set Algo
2084*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE );
2085*53ee8cc1Swenshuai.xi
2086*53ee8cc1Swenshuai.xi //Set IV to FIPS
2087*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
2088*53ee8cc1Swenshuai.xi {
2089*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2090*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC IV fail!");
2091*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2092*53ee8cc1Swenshuai.xi }
2093*53ee8cc1Swenshuai.xi
2094*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
2095*53ee8cc1Swenshuai.xi {
2096*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2097*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
2098*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2099*53ee8cc1Swenshuai.xi }
2100*53ee8cc1Swenshuai.xi
2101*53ee8cc1Swenshuai.xi
2102*53ee8cc1Swenshuai.xi //Set HMAC Key,
2103*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, E_CIPHER_HMAC_OKPAD, FALSE))
2104*53ee8cc1Swenshuai.xi {
2105*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2106*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC key fail!");
2107*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2108*53ee8cc1Swenshuai.xi }
2109*53ee8cc1Swenshuai.xi
2110*53ee8cc1Swenshuai.xi //No need to set Hash message source
2111*53ee8cc1Swenshuai.xi //HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc);
2112*53ee8cc1Swenshuai.xi
2113*53ee8cc1Swenshuai.xi //Set input message address, outer hash from previous report
2114*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_SetMsg(NULL, 0, CMD_HASH_SRC_PRV_RPT))
2115*53ee8cc1Swenshuai.xi {
2116*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2117*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC message fail!");
2118*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2119*53ee8cc1Swenshuai.xi }
2120*53ee8cc1Swenshuai.xi
2121*53ee8cc1Swenshuai.xi //Set output destination
2122*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
2123*53ee8cc1Swenshuai.xi {
2124*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2125*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC output destination fail!");
2126*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2127*53ee8cc1Swenshuai.xi }
2128*53ee8cc1Swenshuai.xi
2129*53ee8cc1Swenshuai.xi #if 0 //Default output to Register
2130*53ee8cc1Swenshuai.xi //Set output address
2131*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
2132*53ee8cc1Swenshuai.xi {
2133*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2134*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2135*53ee8cc1Swenshuai.xi }
2136*53ee8cc1Swenshuai.xi #endif
2137*53ee8cc1Swenshuai.xi
2138*53ee8cc1Swenshuai.xi //Set HOS = 1
2139*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetHOS(TRUE);
2140*53ee8cc1Swenshuai.xi
2141*53ee8cc1Swenshuai.xi HAL_CIPHER_Hash_SetMsgLength(u32OutLen + HASH_HMAC_KEYPAD_SIZE); //Hash output size + O_keypad_size
2142*53ee8cc1Swenshuai.xi
2143*53ee8cc1Swenshuai.xi u8BufNum = _u16ThreadID % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
2144*53ee8cc1Swenshuai.xi
2145*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
2146*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
2147*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf = stCfg.pu8Digest_Buf;
2148*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
2149*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].eKeySrc = stCfg.stHMACKey.eKeySrc;
2150*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
2151*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
2152*53ee8cc1Swenshuai.xi
2153*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]\n",
2154*53ee8cc1Swenshuai.xi (long unsigned int)stCfg.pu8Digest_Buf, stCfg.u32Digest_Buf_Size);
2155*53ee8cc1Swenshuai.xi
2156*53ee8cc1Swenshuai.xi
2157*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
2158*53ee8cc1Swenshuai.xi
2159*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_HASH_DONE;
2160*53ee8cc1Swenshuai.xi
2161*53ee8cc1Swenshuai.xi if(stCfg.pfCallback != NULL)
2162*53ee8cc1Swenshuai.xi {
2163*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
2164*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
2165*53ee8cc1Swenshuai.xi }
2166*53ee8cc1Swenshuai.xi #endif
2167*53ee8cc1Swenshuai.xi
2168*53ee8cc1Swenshuai.xi //Start hash
2169*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
2170*53ee8cc1Swenshuai.xi {
2171*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2172*53ee8cc1Swenshuai.xi goto HASHHMAC_FINISH;
2173*53ee8cc1Swenshuai.xi }
2174*53ee8cc1Swenshuai.xi
2175*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
2176*53ee8cc1Swenshuai.xi
2177*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
2178*53ee8cc1Swenshuai.xi
2179*53ee8cc1Swenshuai.xi //Check thread id max
2180*53ee8cc1Swenshuai.xi if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
2181*53ee8cc1Swenshuai.xi {
2182*53ee8cc1Swenshuai.xi _u16ThreadID = 1;
2183*53ee8cc1Swenshuai.xi }
2184*53ee8cc1Swenshuai.xi else
2185*53ee8cc1Swenshuai.xi {
2186*53ee8cc1Swenshuai.xi _u16ThreadID++;
2187*53ee8cc1Swenshuai.xi }
2188*53ee8cc1Swenshuai.xi
2189*53ee8cc1Swenshuai.xi HASHHMAC_FINISH:
2190*53ee8cc1Swenshuai.xi
2191*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2192*53ee8cc1Swenshuai.xi
2193*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
2194*53ee8cc1Swenshuai.xi {
2195*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
2196*53ee8cc1Swenshuai.xi }
2197*53ee8cc1Swenshuai.xi
2198*53ee8cc1Swenshuai.xi return ret;
2199*53ee8cc1Swenshuai.xi }
2200*53ee8cc1Swenshuai.xi
MDrv_CIPHER_KeyCtrl(MS_BOOL bEnable)2201*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_KeyCtrl(MS_BOOL bEnable)
2202*53ee8cc1Swenshuai.xi {
2203*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2204*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2205*53ee8cc1Swenshuai.xi
2206*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2207*53ee8cc1Swenshuai.xi
2208*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2209*53ee8cc1Swenshuai.xi
2210*53ee8cc1Swenshuai.xi if(bEnable)
2211*53ee8cc1Swenshuai.xi {
2212*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2213*53ee8cc1Swenshuai.xi {
2214*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2215*53ee8cc1Swenshuai.xi }
2216*53ee8cc1Swenshuai.xi
2217*53ee8cc1Swenshuai.xi _bCIPHERDrv_KeyCtrlEn = TRUE;
2218*53ee8cc1Swenshuai.xi }
2219*53ee8cc1Swenshuai.xi else
2220*53ee8cc1Swenshuai.xi {
2221*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2222*53ee8cc1Swenshuai.xi {
2223*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2224*53ee8cc1Swenshuai.xi }
2225*53ee8cc1Swenshuai.xi
2226*53ee8cc1Swenshuai.xi _bCIPHERDrv_KeyCtrlEn = FALSE;
2227*53ee8cc1Swenshuai.xi }
2228*53ee8cc1Swenshuai.xi
2229*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Key slot control mode[%d]", _bCIPHERDrv_KeyCtrlEn);
2230*53ee8cc1Swenshuai.xi
2231*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2232*53ee8cc1Swenshuai.xi
2233*53ee8cc1Swenshuai.xi return ret;
2234*53ee8cc1Swenshuai.xi }
2235*53ee8cc1Swenshuai.xi
MDrv_CIPHER_Alloc(MS_U32 * pu32CipherId)2236*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Alloc(MS_U32 *pu32CipherId)
2237*53ee8cc1Swenshuai.xi {
2238*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2239*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2240*53ee8cc1Swenshuai.xi
2241*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2242*53ee8cc1Swenshuai.xi DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2243*53ee8cc1Swenshuai.xi
2244*53ee8cc1Swenshuai.xi if(NULL == pu32CipherId)
2245*53ee8cc1Swenshuai.xi {
2246*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Cipher Id is NULL!");
2247*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2248*53ee8cc1Swenshuai.xi }
2249*53ee8cc1Swenshuai.xi
2250*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2251*53ee8cc1Swenshuai.xi
2252*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2253*53ee8cc1Swenshuai.xi {
2254*53ee8cc1Swenshuai.xi if(FALSE == _CIPHER_Resource[i].bUsed)
2255*53ee8cc1Swenshuai.xi {
2256*53ee8cc1Swenshuai.xi _CIPHER_Resource[i].bUsed = TRUE;
2257*53ee8cc1Swenshuai.xi *pu32CipherId = i;
2258*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Allocate Cipher Id[%u]", i);
2259*53ee8cc1Swenshuai.xi goto CIPHER_ALLOC_DONE;
2260*53ee8cc1Swenshuai.xi }
2261*53ee8cc1Swenshuai.xi }
2262*53ee8cc1Swenshuai.xi
2263*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2264*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Allocate Cipher Id fail");
2265*53ee8cc1Swenshuai.xi
2266*53ee8cc1Swenshuai.xi CIPHER_ALLOC_DONE:
2267*53ee8cc1Swenshuai.xi
2268*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2269*53ee8cc1Swenshuai.xi return ret;
2270*53ee8cc1Swenshuai.xi
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi
MDrv_CIPHER_Free(MS_U32 u32CipherId)2273*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Free(MS_U32 u32CipherId)
2274*53ee8cc1Swenshuai.xi {
2275*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2276*53ee8cc1Swenshuai.xi
2277*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2278*53ee8cc1Swenshuai.xi DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2279*53ee8cc1Swenshuai.xi
2280*53ee8cc1Swenshuai.xi if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2281*53ee8cc1Swenshuai.xi {
2282*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2283*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2284*53ee8cc1Swenshuai.xi }
2285*53ee8cc1Swenshuai.xi
2286*53ee8cc1Swenshuai.xi u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2287*53ee8cc1Swenshuai.xi
2288*53ee8cc1Swenshuai.xi if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2289*53ee8cc1Swenshuai.xi {
2290*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_WARN, "Warning:Not used Cipher Id[%u]!", u32CipherId);
2291*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2292*53ee8cc1Swenshuai.xi }
2293*53ee8cc1Swenshuai.xi
2294*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_KL == _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc)
2295*53ee8cc1Swenshuai.xi {
2296*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != MDrv_CIPHER_ResetKey(_CIPHER_Resource[u32CipherId].stConfig.u32CAVid, _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx))
2297*53ee8cc1Swenshuai.xi {
2298*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Reset key slot fail!");
2299*53ee8cc1Swenshuai.xi return DRV_CIPHER_FAIL;
2300*53ee8cc1Swenshuai.xi
2301*53ee8cc1Swenshuai.xi }
2302*53ee8cc1Swenshuai.xi }
2303*53ee8cc1Swenshuai.xi
2304*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2305*53ee8cc1Swenshuai.xi
2306*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[u32CipherId], 0, sizeof(CIPHER_RESOURCE));
2307*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Free Cipher Id[%u]", u32CipherId);
2308*53ee8cc1Swenshuai.xi
2309*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2310*53ee8cc1Swenshuai.xi
2311*53ee8cc1Swenshuai.xi return ret;
2312*53ee8cc1Swenshuai.xi }
2313*53ee8cc1Swenshuai.xi
MDrv_CIPHER_DMAConfigure(MS_U32 u32CipherId,DRV_CIPHER_DMACFG stCfg)2314*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAConfigure(MS_U32 u32CipherId, DRV_CIPHER_DMACFG stCfg)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2317*53ee8cc1Swenshuai.xi
2318*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2319*53ee8cc1Swenshuai.xi DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2320*53ee8cc1Swenshuai.xi
2321*53ee8cc1Swenshuai.xi if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2322*53ee8cc1Swenshuai.xi {
2323*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2324*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2325*53ee8cc1Swenshuai.xi }
2326*53ee8cc1Swenshuai.xi
2327*53ee8cc1Swenshuai.xi u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2328*53ee8cc1Swenshuai.xi
2329*53ee8cc1Swenshuai.xi if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2330*53ee8cc1Swenshuai.xi {
2331*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", u32CipherId);
2332*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2333*53ee8cc1Swenshuai.xi }
2334*53ee8cc1Swenshuai.xi
2335*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2336*53ee8cc1Swenshuai.xi
2337*53ee8cc1Swenshuai.xi if(0 != stCfg.u32CAVid)
2338*53ee8cc1Swenshuai.xi {
2339*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.u32CAVid = stCfg.u32CAVid;
2340*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
2341*53ee8cc1Swenshuai.xi }
2342*53ee8cc1Swenshuai.xi
2343*53ee8cc1Swenshuai.xi //Update Algorithm and Encrypt/Decrypt operation
2344*53ee8cc1Swenshuai.xi if(0 != stCfg.stAlgo.eMainAlgo || 0 != stCfg.stAlgo.eSubAlgo || 0 != stCfg.stAlgo.eResAlgo || 0 != stCfg.stAlgo.eSBAlgo)
2345*53ee8cc1Swenshuai.xi {
2346*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stAlgo = stCfg.stAlgo;
2347*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.bDecrypt = stCfg.bDecrypt;
2348*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
2349*53ee8cc1Swenshuai.xi stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
2350*53ee8cc1Swenshuai.xi }
2351*53ee8cc1Swenshuai.xi
2352*53ee8cc1Swenshuai.xi if(0 != stCfg.stInput.u32Addr || 0 != stCfg.stInput.u32Size || 0 != stCfg.stInput.eMemoryType)
2353*53ee8cc1Swenshuai.xi {
2354*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stInput = stCfg.stInput;
2355*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address [0x%08x], size[%u]",
2356*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
2357*53ee8cc1Swenshuai.xi }
2358*53ee8cc1Swenshuai.xi
2359*53ee8cc1Swenshuai.xi if(0 != stCfg.stOutput.u32Addr || 0 != stCfg.stOutput.u32Size || 0 != stCfg.stOutput.eMemoryType)
2360*53ee8cc1Swenshuai.xi {
2361*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stOutput = stCfg.stOutput;
2362*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Output address [0x%08x], size[%u]",
2363*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
2364*53ee8cc1Swenshuai.xi }
2365*53ee8cc1Swenshuai.xi
2366*53ee8cc1Swenshuai.xi if(0 != stCfg.stKey.eKeySrc || 0 != stCfg.stKey.u8KeyIdx || NULL != stCfg.stKey.pu8KeyData)
2367*53ee8cc1Swenshuai.xi {
2368*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_CPU == stCfg.stKey.eKeySrc)
2369*53ee8cc1Swenshuai.xi {
2370*53ee8cc1Swenshuai.xi if(NULL != stCfg.stKey.pu8KeyData && 0 != stCfg.stKey.u8KeyLen)
2371*53ee8cc1Swenshuai.xi {
2372*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[u32CipherId].u8Key, 0, HAL_CRYPTODMA_KEYLEN_MAX);
2373*53ee8cc1Swenshuai.xi memcpy(&_CIPHER_Resource[u32CipherId].u8Key, (MS_U8 *)stCfg.stKey.pu8KeyData, stCfg.stKey.u8KeyLen);
2374*53ee8cc1Swenshuai.xi
2375*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_CPU;
2376*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.pu8KeyData = _CIPHER_Resource[u32CipherId].u8Key;
2377*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyLen = stCfg.stKey.u8KeyLen;
2378*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set ACPU key in CipherId[%u]", u32CipherId);
2379*53ee8cc1Swenshuai.xi }
2380*53ee8cc1Swenshuai.xi else
2381*53ee8cc1Swenshuai.xi {
2382*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Key is NULL!");
2383*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2384*53ee8cc1Swenshuai.xi goto DMA_CONFIGURE_DONE;
2385*53ee8cc1Swenshuai.xi }
2386*53ee8cc1Swenshuai.xi }
2387*53ee8cc1Swenshuai.xi
2388*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_KL == stCfg.stKey.eKeySrc)
2389*53ee8cc1Swenshuai.xi {
2390*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_KL;
2391*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx = (MS_U8)u32CipherId;
2392*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set KL index in CipherId[%u]", u32CipherId);
2393*53ee8cc1Swenshuai.xi }
2394*53ee8cc1Swenshuai.xi
2395*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_OTP == stCfg.stKey.eKeySrc)
2396*53ee8cc1Swenshuai.xi {
2397*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_OTP;
2398*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx = stCfg.stKey.u8KeyIdx;
2399*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set OTP key index in CipherId[%u]", u32CipherId);
2400*53ee8cc1Swenshuai.xi }
2401*53ee8cc1Swenshuai.xi
2402*53ee8cc1Swenshuai.xi if(E_CIPHER_KSRC_CAIP == stCfg.stKey.eKeySrc)
2403*53ee8cc1Swenshuai.xi {
2404*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_CAIP;
2405*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set CAIP key in CipherId[%u]", u32CipherId);
2406*53ee8cc1Swenshuai.xi }
2407*53ee8cc1Swenshuai.xi
2408*53ee8cc1Swenshuai.xi }
2409*53ee8cc1Swenshuai.xi
2410*53ee8cc1Swenshuai.xi if(NULL != stCfg.stKey.pu8IVData && 0 != stCfg.stKey.u8IVLen)
2411*53ee8cc1Swenshuai.xi {
2412*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[u32CipherId].u8IV, 0, HAL_CRYPTODMA_KEYLEN_MAX);
2413*53ee8cc1Swenshuai.xi memcpy(&_CIPHER_Resource[u32CipherId].u8IV, (MS_U8 *)stCfg.stKey.pu8IVData, stCfg.stKey.u8IVLen);
2414*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.pu8IVData = _CIPHER_Resource[u32CipherId].u8IV;
2415*53ee8cc1Swenshuai.xi _CIPHER_Resource[u32CipherId].stConfig.stKey.u8IVLen = stCfg.stKey.u8IVLen;
2416*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set IV in CipherId[%u]", u32CipherId);
2417*53ee8cc1Swenshuai.xi }
2418*53ee8cc1Swenshuai.xi
2419*53ee8cc1Swenshuai.xi DMA_CONFIGURE_DONE:
2420*53ee8cc1Swenshuai.xi
2421*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2422*53ee8cc1Swenshuai.xi return ret;
2423*53ee8cc1Swenshuai.xi
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi
MDrv_CIPHER_DMAStart(MS_U32 u32CipherId,MS_U32 * pu32CmdId)2426*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAStart(MS_U32 u32CipherId, MS_U32 *pu32CmdId)
2427*53ee8cc1Swenshuai.xi {
2428*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2429*53ee8cc1Swenshuai.xi DRV_CIPHER_DMACFG stCfg;
2430*53ee8cc1Swenshuai.xi
2431*53ee8cc1Swenshuai.xi DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2432*53ee8cc1Swenshuai.xi DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2433*53ee8cc1Swenshuai.xi
2434*53ee8cc1Swenshuai.xi if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2435*53ee8cc1Swenshuai.xi {
2436*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2437*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2438*53ee8cc1Swenshuai.xi }
2439*53ee8cc1Swenshuai.xi
2440*53ee8cc1Swenshuai.xi u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2441*53ee8cc1Swenshuai.xi
2442*53ee8cc1Swenshuai.xi if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2443*53ee8cc1Swenshuai.xi {
2444*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", u32CipherId);
2445*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2446*53ee8cc1Swenshuai.xi }
2447*53ee8cc1Swenshuai.xi
2448*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
2449*53ee8cc1Swenshuai.xi {
2450*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
2451*53ee8cc1Swenshuai.xi return DRV_CIPHER_BAD_PARAM;
2452*53ee8cc1Swenshuai.xi }
2453*53ee8cc1Swenshuai.xi
2454*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2455*53ee8cc1Swenshuai.xi
2456*53ee8cc1Swenshuai.xi memset(&stCfg, 0 , sizeof(DRV_CIPHER_DMACFG));
2457*53ee8cc1Swenshuai.xi
2458*53ee8cc1Swenshuai.xi stCfg = _CIPHER_Resource[u32CipherId].stConfig;
2459*53ee8cc1Swenshuai.xi
2460*53ee8cc1Swenshuai.xi DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "DMA use CipherId[%u]", u32CipherId);
2461*53ee8cc1Swenshuai.xi
2462*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2463*53ee8cc1Swenshuai.xi
2464*53ee8cc1Swenshuai.xi ret = MDrv_CIPHER_DMACalc(stCfg, pu32CmdId);
2465*53ee8cc1Swenshuai.xi
2466*53ee8cc1Swenshuai.xi return ret;
2467*53ee8cc1Swenshuai.xi
2468*53ee8cc1Swenshuai.xi }
2469*53ee8cc1Swenshuai.xi
2470*53ee8cc1Swenshuai.xi
2471*53ee8cc1Swenshuai.xi #if 0
2472*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAParser(CIPHER_PARSERCFG stParserCfg, MS_U32 *pu32CmdId)
2473*53ee8cc1Swenshuai.xi {
2474*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2475*53ee8cc1Swenshuai.xi HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
2476*53ee8cc1Swenshuai.xi MS_U8 u8BufNum = 0;
2477*53ee8cc1Swenshuai.xi
2478*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
2479*53ee8cc1Swenshuai.xi
2480*53ee8cc1Swenshuai.xi //==============Obtain Semaphore==============
2481*53ee8cc1Swenshuai.xi MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
2482*53ee8cc1Swenshuai.xi
2483*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2484*53ee8cc1Swenshuai.xi
2485*53ee8cc1Swenshuai.xi //Check data size
2486*53ee8cc1Swenshuai.xi if((stParserCfg.stInput.u32Size == 0) || (stParserCfg.stOutput.u32Size == 0))
2487*53ee8cc1Swenshuai.xi {
2488*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!\n");
2489*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2490*53ee8cc1Swenshuai.xi goto PARSER_FINISH;
2491*53ee8cc1Swenshuai.xi }
2492*53ee8cc1Swenshuai.xi
2493*53ee8cc1Swenshuai.xi if(pu32CmdId == NULL)
2494*53ee8cc1Swenshuai.xi {
2495*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!\n");
2496*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2497*53ee8cc1Swenshuai.xi goto PARSER_FINISH;
2498*53ee8cc1Swenshuai.xi }
2499*53ee8cc1Swenshuai.xi
2500*53ee8cc1Swenshuai.xi HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
2501*53ee8cc1Swenshuai.xi
2502*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set CAVid [0x%x]\n", (unsigned int)stParserCfg.u32CAVid);
2503*53ee8cc1Swenshuai.xi
2504*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stParserCfg.u32CAVid))
2505*53ee8cc1Swenshuai.xi {
2506*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_BAD_PARAM;
2507*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!\n", (unsigned int)stParserCfg.u32CAVid);
2508*53ee8cc1Swenshuai.xi goto PARSER_FINISH;
2509*53ee8cc1Swenshuai.xi }
2510*53ee8cc1Swenshuai.xi
2511*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_Algo( stParserCfg.stAlgo);
2512*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_Key ( stParserCfg.stKey);
2513*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_IV(stParserCfg.stKey.pu8IVData, stParserCfg.stKey.u8IVLen);
2514*53ee8cc1Swenshuai.xi
2515*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]\n"
2516*53ee8cc1Swenshuai.xi ,stParserCfg.stAlgo.eMainAlgo, stParserCfg.stAlgo.eSubAlgo, stParserCfg.stAlgo.eResAlgo, stParserCfg.stAlgo.eSBAlgo);
2517*53ee8cc1Swenshuai.xi
2518*53ee8cc1Swenshuai.xi // need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
2519*53ee8cc1Swenshuai.xi // before call DMA_Set_FileinDesc and DMA_Set_FileoutDesc
2520*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_InputSrcFrom(stParserCfg.stInput.eMemoryType, NULL, 0);
2521*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_OutputDstTo(stParserCfg.stOutput.eMemoryType, NULL, 0);
2522*53ee8cc1Swenshuai.xi
2523*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input source from [%d], Output source from [%d]\n",
2524*53ee8cc1Swenshuai.xi stParserCfg.stInput.eMemoryType, stParserCfg.stOutput.eMemoryType);
2525*53ee8cc1Swenshuai.xi
2526*53ee8cc1Swenshuai.xi // Set File-in Addr //
2527*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileinDesc ( stParserCfg.stInput.u32Addr, stParserCfg.stInput.u32Size);
2528*53ee8cc1Swenshuai.xi HAL_CIPHER_DMA_Set_FileoutDesc( stParserCfg.stOutput.u32Addr, stParserCfg.stOutput.u32Addr + stParserCfg.stOutput.u32Size - 1);
2529*53ee8cc1Swenshuai.xi
2530*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input address [0x%08x], size[%u], Output address [0x%08x], size[%u]\n",
2531*53ee8cc1Swenshuai.xi (unsigned int)stParserCfg.stInput.u32Addr, stParserCfg.stInput.u32Size, (unsigned int)stParserCfg.stOutput.u32Addr, stParserCfg.stOutput.u32Size);
2532*53ee8cc1Swenshuai.xi
2533*53ee8cc1Swenshuai.xi // Set Hardware Parser
2534*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_Mode(stParserCfg.eParserMode);
2535*53ee8cc1Swenshuai.xi
2536*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_PID(stParserCfg.stPID);
2537*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_SCB(stParserCfg.stTSCfg.eSCB);
2538*53ee8cc1Swenshuai.xi
2539*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_ForceSCB(stParserCfg.stTSCfg.bInScrb, stParserCfg.stTSCfg.eFSCB);
2540*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Rmv_SCB(stParserCfg.stTSCfg.bRmvScrb);
2541*53ee8cc1Swenshuai.xi
2542*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_MaskSCB(stParserCfg.stTSCfg.bTsScrbMask);
2543*53ee8cc1Swenshuai.xi
2544*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_Key2(stParserCfg.stKey2);
2545*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_IV2(stParserCfg.stKey2.pu8IVData, stParserCfg.stKey2.u8IVLen);
2546*53ee8cc1Swenshuai.xi
2547*53ee8cc1Swenshuai.xi HAL_CIPHER_PARSER_Set_ClearHeaderMode(stParserCfg.bClearHead);
2548*53ee8cc1Swenshuai.xi
2549*53ee8cc1Swenshuai.xi //Check report buffer
2550*53ee8cc1Swenshuai.xi u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
2551*53ee8cc1Swenshuai.xi
2552*53ee8cc1Swenshuai.xi //Report buffer already used
2553*53ee8cc1Swenshuai.xi if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
2554*53ee8cc1Swenshuai.xi {
2555*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!\n");
2556*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_NO_REPORT_BUFFER;
2557*53ee8cc1Swenshuai.xi goto PARSER_FINISH;
2558*53ee8cc1Swenshuai.xi }
2559*53ee8cc1Swenshuai.xi
2560*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32Report = 0;
2561*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
2562*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
2563*53ee8cc1Swenshuai.xi
2564*53ee8cc1Swenshuai.xi
2565*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
2566*53ee8cc1Swenshuai.xi
2567*53ee8cc1Swenshuai.xi _eCipherWait = E_CIPHER_DMA_DONE;
2568*53ee8cc1Swenshuai.xi
2569*53ee8cc1Swenshuai.xi if(stParserCfg.pfCallback != NULL)
2570*53ee8cc1Swenshuai.xi {
2571*53ee8cc1Swenshuai.xi _CIPHER_ReportBuffer[u8BufNum].pfCallback = stParserCfg.pfCallback;
2572*53ee8cc1Swenshuai.xi eIntMode = E_DMA_INT_ENABLE;
2573*53ee8cc1Swenshuai.xi }
2574*53ee8cc1Swenshuai.xi #endif
2575*53ee8cc1Swenshuai.xi
2576*53ee8cc1Swenshuai.xi if(FALSE == HAL_CIPHER_DMA_Start(stParserCfg.bDecrypt, eIntMode , TRUE , _u16ThreadID))
2577*53ee8cc1Swenshuai.xi {
2578*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:PARSER Fail!\n");
2579*53ee8cc1Swenshuai.xi ret = DRV_CIPHER_FAIL;
2580*53ee8cc1Swenshuai.xi goto PARSER_FINISH;
2581*53ee8cc1Swenshuai.xi }
2582*53ee8cc1Swenshuai.xi
2583*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
2584*53ee8cc1Swenshuai.xi
2585*53ee8cc1Swenshuai.xi *pu32CmdId = (MS_U32)_u16ThreadID;
2586*53ee8cc1Swenshuai.xi
2587*53ee8cc1Swenshuai.xi _u16ThreadID++;
2588*53ee8cc1Swenshuai.xi
2589*53ee8cc1Swenshuai.xi PARSER_FINISH:
2590*53ee8cc1Swenshuai.xi
2591*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherMtx);
2592*53ee8cc1Swenshuai.xi
2593*53ee8cc1Swenshuai.xi if(ret != DRV_CIPHER_OK)
2594*53ee8cc1Swenshuai.xi {
2595*53ee8cc1Swenshuai.xi MsOS_ReleaseSemaphore(_CipherSemaphore);
2596*53ee8cc1Swenshuai.xi }
2597*53ee8cc1Swenshuai.xi
2598*53ee8cc1Swenshuai.xi return ret;
2599*53ee8cc1Swenshuai.xi
2600*53ee8cc1Swenshuai.xi }
2601*53ee8cc1Swenshuai.xi #endif
2602*53ee8cc1Swenshuai.xi
2603*53ee8cc1Swenshuai.xi #ifdef ENABLE_BGC
MDrv_CIPHER_BGC_Enable(MS_U32 u32EngId,MS_U32 u32Algo,MS_U8 * pu8Golden,MS_U32 u32SAddr,MS_U32 u32Size)2604*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_BGC_Enable(MS_U32 u32EngId,MS_U32 u32Algo, MS_U8 *pu8Golden, MS_U32 u32SAddr, MS_U32 u32Size)
2605*53ee8cc1Swenshuai.xi {
2606*53ee8cc1Swenshuai.xi //Set BGC Algo
2607*53ee8cc1Swenshuai.xi HAL_CIPHER_BGC_Algo(u32EngId, u32Algo);
2608*53ee8cc1Swenshuai.xi
2609*53ee8cc1Swenshuai.xi //Set BGC Period
2610*53ee8cc1Swenshuai.xi HAL_CIPHER_BGC_Period(u32EngId, E_CIPHER_BGC_PERIOD_1MS);
2611*53ee8cc1Swenshuai.xi
2612*53ee8cc1Swenshuai.xi //Set BGC Range
2613*53ee8cc1Swenshuai.xi HAL_CIPHER_BGC_Range(u32EngId, u32SAddr, (u32SAddr + u32Size-1) );
2614*53ee8cc1Swenshuai.xi
2615*53ee8cc1Swenshuai.xi //Set BGC Golden
2616*53ee8cc1Swenshuai.xi HAL_CIPHER_BGC_Golden(u32EngId, pu8Golden);
2617*53ee8cc1Swenshuai.xi
2618*53ee8cc1Swenshuai.xi //Set BGC Enable
2619*53ee8cc1Swenshuai.xi HAL_CIPHER_BGC_Start(u32EngId, TRUE);
2620*53ee8cc1Swenshuai.xi
2621*53ee8cc1Swenshuai.xi
2622*53ee8cc1Swenshuai.xi return 0;
2623*53ee8cc1Swenshuai.xi }
2624*53ee8cc1Swenshuai.xi
MDrv_CIPHER_BGC_Check(MS_U32 u32EngId,MS_BOOL * bOK)2625*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_BGC_Check(MS_U32 u32EngId, MS_BOOL *bOK)
2626*53ee8cc1Swenshuai.xi {
2627*53ee8cc1Swenshuai.xi if(HAL_CIPHER_BGC_Check(u32EngId) == FALSE)
2628*53ee8cc1Swenshuai.xi {
2629*53ee8cc1Swenshuai.xi *bOK = FALSE;
2630*53ee8cc1Swenshuai.xi }
2631*53ee8cc1Swenshuai.xi else
2632*53ee8cc1Swenshuai.xi {
2633*53ee8cc1Swenshuai.xi *bOK = TRUE;
2634*53ee8cc1Swenshuai.xi }
2635*53ee8cc1Swenshuai.xi return 0;
2636*53ee8cc1Swenshuai.xi }
2637*53ee8cc1Swenshuai.xi
2638*53ee8cc1Swenshuai.xi #endif
2639*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////
2640*53ee8cc1Swenshuai.xi static DRV_CIPHER_KEY _CipherKey = {
2641*53ee8cc1Swenshuai.xi E_CIPHER_KSRC_CPU,
2642*53ee8cc1Swenshuai.xi 0,
2643*53ee8cc1Swenshuai.xi 0,
2644*53ee8cc1Swenshuai.xi 0,
2645*53ee8cc1Swenshuai.xi 0,
2646*53ee8cc1Swenshuai.xi 0
2647*53ee8cc1Swenshuai.xi };
2648*53ee8cc1Swenshuai.xi static MS_BOOL _isDecrypt = TRUE;
2649*53ee8cc1Swenshuai.xi static DRV_CIPHER_ALGO _stAlgo = {0};
2650*53ee8cc1Swenshuai.xi static DRV_CIPHER_DATA _stInput = {0};
2651*53ee8cc1Swenshuai.xi static DRV_CIPHER_DATA _stOutput = {0};
2652*53ee8cc1Swenshuai.xi static MS_U32 _RetId = 0;
2653*53ee8cc1Swenshuai.xi static MS_U8 _u8IV[16] = {0};
2654*53ee8cc1Swenshuai.xi static MS_U8 _u8Key[16] = {0};
2655*53ee8cc1Swenshuai.xi static MS_U8 _u8ZeroData[16] = {0};
2656*53ee8cc1Swenshuai.xi static MS_U32 _u32CAVid = 0x0F;
2657*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_InitBySWFlag(MS_BOOL bSWInit)2658*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_InitBySWFlag(MS_BOOL bSWInit)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2661*53ee8cc1Swenshuai.xi
2662*53ee8cc1Swenshuai.xi ret = _MDrv_CIPHER_InitBySWFlag(bSWInit);
2663*53ee8cc1Swenshuai.xi
2664*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != ret)
2665*53ee8cc1Swenshuai.xi {
2666*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:_MDrv_CIPHER_InitBySWFlag fail");
2667*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2668*53ee8cc1Swenshuai.xi }
2669*53ee8cc1Swenshuai.xi
2670*53ee8cc1Swenshuai.xi // Default Key from ACPU
2671*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
2672*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = _u8ZeroData;
2673*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 16;
2674*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0;
2675*53ee8cc1Swenshuai.xi
2676*53ee8cc1Swenshuai.xi //Clear IV
2677*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = _u8ZeroData;
2678*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = 16;
2679*53ee8cc1Swenshuai.xi
2680*53ee8cc1Swenshuai.xi //Clear Algo
2681*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = 0;
2682*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = 0;
2683*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = 0;
2684*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = 0;
2685*53ee8cc1Swenshuai.xi
2686*53ee8cc1Swenshuai.xi //Clear Input
2687*53ee8cc1Swenshuai.xi _stInput.u32Addr = 0;
2688*53ee8cc1Swenshuai.xi _stInput.u32Size = 0;
2689*53ee8cc1Swenshuai.xi _stInput.eMemoryType = 0;
2690*53ee8cc1Swenshuai.xi
2691*53ee8cc1Swenshuai.xi //Clear Output
2692*53ee8cc1Swenshuai.xi _stOutput.u32Addr = 0;
2693*53ee8cc1Swenshuai.xi _stOutput.u32Size = 0;
2694*53ee8cc1Swenshuai.xi _stOutput.eMemoryType = 0;
2695*53ee8cc1Swenshuai.xi
2696*53ee8cc1Swenshuai.xi memset(_u8Key, 0, sizeof(_u8Key));
2697*53ee8cc1Swenshuai.xi memset(_u8IV, 0, sizeof(_u8IV));
2698*53ee8cc1Swenshuai.xi
2699*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
2700*53ee8cc1Swenshuai.xi }
2701*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_Init(MS_PHY u32miu0addr,MS_PHY u32miu1addr,MS_U32 u32miunum)2702*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Init(MS_PHY u32miu0addr , MS_PHY u32miu1addr , MS_U32 u32miunum)
2703*53ee8cc1Swenshuai.xi {
2704*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2705*53ee8cc1Swenshuai.xi MS_U32 i = 0;
2706*53ee8cc1Swenshuai.xi
2707*53ee8cc1Swenshuai.xi ret = MDrv_CIPHER_Init();
2708*53ee8cc1Swenshuai.xi
2709*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2710*53ee8cc1Swenshuai.xi {
2711*53ee8cc1Swenshuai.xi memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2712*53ee8cc1Swenshuai.xi }
2713*53ee8cc1Swenshuai.xi
2714*53ee8cc1Swenshuai.xi return ret;
2715*53ee8cc1Swenshuai.xi }
2716*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Init(MS_PHY u32miu0addr,MS_PHY u32miu1addr,MS_U32 u32miunum)2717*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Init(MS_PHY u32miu0addr , MS_PHY u32miu1addr , MS_U32 u32miunum)
2718*53ee8cc1Swenshuai.xi {
2719*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2720*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2721*53ee8cc1Swenshuai.xi AESDMA_INIT pArgs;
2722*53ee8cc1Swenshuai.xi
2723*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
2724*53ee8cc1Swenshuai.xi {
2725*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_AESDMA, &pu32AesdmaInst, 0x0, NULL))
2726*53ee8cc1Swenshuai.xi {
2727*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaOpen CIPHER fail");
2728*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2729*53ee8cc1Swenshuai.xi }
2730*53ee8cc1Swenshuai.xi }
2731*53ee8cc1Swenshuai.xi
2732*53ee8cc1Swenshuai.xi pArgs.u32miu0addr = u32miu0addr;
2733*53ee8cc1Swenshuai.xi pArgs.u32miu1addr = u32miu1addr;
2734*53ee8cc1Swenshuai.xi pArgs.u32miunum = u32miunum;
2735*53ee8cc1Swenshuai.xi
2736*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Init, (void*)&pArgs);
2737*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
2738*53ee8cc1Swenshuai.xi {
2739*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2740*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2741*53ee8cc1Swenshuai.xi }
2742*53ee8cc1Swenshuai.xi
2743*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
2744*53ee8cc1Swenshuai.xi #else
2745*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_Init(u32miu0addr, u32miu1addr, u32miunum);
2746*53ee8cc1Swenshuai.xi #endif
2747*53ee8cc1Swenshuai.xi }
2748*53ee8cc1Swenshuai.xi
MDrv_AESDMA_QueryCipherMode(DrvAESDMA_CipherMode eMode)2749*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_QueryCipherMode(DrvAESDMA_CipherMode eMode)
2750*53ee8cc1Swenshuai.xi {
2751*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
2752*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
2753*53ee8cc1Swenshuai.xi }
2754*53ee8cc1Swenshuai.xi
2755*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode,MS_BOOL bDescrypt)2756*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode, MS_BOOL bDescrypt)
2757*53ee8cc1Swenshuai.xi {
2758*53ee8cc1Swenshuai.xi //DRV_CIPHER_ALGO stAlgo;
2759*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher mode[%d], Decrypt[%d]!", eMode, bDescrypt);
2760*53ee8cc1Swenshuai.xi
2761*53ee8cc1Swenshuai.xi bDES_Key = FALSE;
2762*53ee8cc1Swenshuai.xi switch(eMode)
2763*53ee8cc1Swenshuai.xi {
2764*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_ECB:
2765*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2766*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2767*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2768*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2769*53ee8cc1Swenshuai.xi break;
2770*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_CTR:
2771*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2772*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2773*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2774*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2775*53ee8cc1Swenshuai.xi break;
2776*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_CBC:
2777*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2778*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2779*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2780*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2781*53ee8cc1Swenshuai.xi break;
2782*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_DES_ECB:
2783*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2784*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2785*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2786*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2787*53ee8cc1Swenshuai.xi bDES_Key = TRUE;
2788*53ee8cc1Swenshuai.xi break;
2789*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_DES_CTR:
2790*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2791*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2792*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2793*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2794*53ee8cc1Swenshuai.xi bDES_Key = TRUE;
2795*53ee8cc1Swenshuai.xi break;
2796*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_DES_CBC:
2797*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2798*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2799*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2800*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2801*53ee8cc1Swenshuai.xi bDES_Key = TRUE;
2802*53ee8cc1Swenshuai.xi break;
2803*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_TDES_ECB:
2804*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2805*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2806*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2807*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2808*53ee8cc1Swenshuai.xi break;
2809*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_TDES_CTR:
2810*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2811*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2812*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2813*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2814*53ee8cc1Swenshuai.xi break;
2815*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_TDES_CBC:
2816*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2817*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2818*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2819*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2820*53ee8cc1Swenshuai.xi break;
2821*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_CTS_CBC:
2822*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2823*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2824*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2825*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2826*53ee8cc1Swenshuai.xi break;
2827*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_CTS_ECB:
2828*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2829*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2830*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2831*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2832*53ee8cc1Swenshuai.xi break;
2833*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_DES_CTS_CBC:
2834*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2835*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2836*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2837*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2838*53ee8cc1Swenshuai.xi bDES_Key = TRUE;
2839*53ee8cc1Swenshuai.xi break;
2840*53ee8cc1Swenshuai.xi
2841*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_DES_CTS_ECB:
2842*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2843*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2844*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2845*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2846*53ee8cc1Swenshuai.xi bDES_Key = TRUE;
2847*53ee8cc1Swenshuai.xi break;
2848*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_TDES_CTS_CBC:
2849*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2850*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2851*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2852*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2853*53ee8cc1Swenshuai.xi break;
2854*53ee8cc1Swenshuai.xi case E_DRVAESDMA_CIPHER_TDES_CTS_ECB:
2855*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2856*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2857*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2858*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2859*53ee8cc1Swenshuai.xi break;
2860*53ee8cc1Swenshuai.xi default:
2861*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = 0;
2862*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = 0;
2863*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = 0;
2864*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = 0;
2865*53ee8cc1Swenshuai.xi break;
2866*53ee8cc1Swenshuai.xi }
2867*53ee8cc1Swenshuai.xi
2868*53ee8cc1Swenshuai.xi _isDecrypt = bDescrypt;
2869*53ee8cc1Swenshuai.xi
2870*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Algo 0x%x 0x%x 0x%x 0x%x",
2871*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo, _stAlgo.eSubAlgo,_stAlgo.eResAlgo,_stAlgo.eSBAlgo);
2872*53ee8cc1Swenshuai.xi
2873*53ee8cc1Swenshuai.xi return 0;
2874*53ee8cc1Swenshuai.xi }
2875*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode,MS_BOOL bDescrypt)2876*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode, MS_BOOL bDescrypt)
2877*53ee8cc1Swenshuai.xi {
2878*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2879*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2880*53ee8cc1Swenshuai.xi AESDMA_SEL_ENG pArgs;
2881*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
2882*53ee8cc1Swenshuai.xi {
2883*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
2884*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2885*53ee8cc1Swenshuai.xi }
2886*53ee8cc1Swenshuai.xi
2887*53ee8cc1Swenshuai.xi pArgs.eMode = eMode;
2888*53ee8cc1Swenshuai.xi pArgs.bDescrypt = bDescrypt;
2889*53ee8cc1Swenshuai.xi
2890*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SelEng, (void*)&pArgs);
2891*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
2892*53ee8cc1Swenshuai.xi {
2893*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2894*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2895*53ee8cc1Swenshuai.xi }
2896*53ee8cc1Swenshuai.xi
2897*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
2898*53ee8cc1Swenshuai.xi #else
2899*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SelEng(eMode, bDescrypt);
2900*53ee8cc1Swenshuai.xi #endif
2901*53ee8cc1Swenshuai.xi }
2902*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetKey_Ex(const MS_U8 * pu8Key,MS_U32 u32Len)2903*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKey_Ex(const MS_U8 *pu8Key, MS_U32 u32Len)
2904*53ee8cc1Swenshuai.xi {
2905*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT ret = DRVAESDMA_OK;
2906*53ee8cc1Swenshuai.xi if(pu8Key && (u32Len <= HAL_CRYPTODMA_KEYLEN_MAX) && (u32Len > 0))
2907*53ee8cc1Swenshuai.xi {
2908*53ee8cc1Swenshuai.xi // Key from ACPU
2909*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
2910*53ee8cc1Swenshuai.xi
2911*53ee8cc1Swenshuai.xi memcpy(_u8Key, (MS_U8*)pu8Key, u32Len);
2912*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = _u8Key;
2913*53ee8cc1Swenshuai.xi
2914*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = u32Len;
2915*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0;
2916*53ee8cc1Swenshuai.xi }
2917*53ee8cc1Swenshuai.xi else
2918*53ee8cc1Swenshuai.xi {
2919*53ee8cc1Swenshuai.xi //Key from KL
2920*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
2921*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = 0;
2922*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 0;
2923*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0; // always use 0
2924*53ee8cc1Swenshuai.xi }
2925*53ee8cc1Swenshuai.xi
2926*53ee8cc1Swenshuai.xi if(u32Len > HAL_CRYPTODMA_KEYLEN_MAX)
2927*53ee8cc1Swenshuai.xi {
2928*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key Length!");
2929*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
2930*53ee8cc1Swenshuai.xi }
2931*53ee8cc1Swenshuai.xi
2932*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u]",
2933*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx);
2934*53ee8cc1Swenshuai.xi
2935*53ee8cc1Swenshuai.xi return ret;
2936*53ee8cc1Swenshuai.xi }
2937*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetKey_Ex(const MS_U8 * pu8Key,MS_U32 u32Len)2938*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetKey_Ex(const MS_U8 *pu8Key, MS_U32 u32Len)
2939*53ee8cc1Swenshuai.xi {
2940*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2941*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2942*53ee8cc1Swenshuai.xi AESDMA_SET_KEY_EX pArgs;
2943*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
2944*53ee8cc1Swenshuai.xi {
2945*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
2946*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2947*53ee8cc1Swenshuai.xi }
2948*53ee8cc1Swenshuai.xi
2949*53ee8cc1Swenshuai.xi pArgs.pu8Key = pu8Key;
2950*53ee8cc1Swenshuai.xi pArgs.u32Len = u32Len;
2951*53ee8cc1Swenshuai.xi
2952*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetKey_Ex, (void*)&pArgs);
2953*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
2954*53ee8cc1Swenshuai.xi {
2955*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2956*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
2957*53ee8cc1Swenshuai.xi }
2958*53ee8cc1Swenshuai.xi
2959*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
2960*53ee8cc1Swenshuai.xi #else
2961*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetKey_Ex(pu8Key, u32Len);
2962*53ee8cc1Swenshuai.xi #endif
2963*53ee8cc1Swenshuai.xi
2964*53ee8cc1Swenshuai.xi }
2965*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetIV_Ex(const MS_U8 * pu8IV,MS_U32 u32Len)2966*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetIV_Ex(const MS_U8 *pu8IV, MS_U32 u32Len)
2967*53ee8cc1Swenshuai.xi {
2968*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT ret = DRVAESDMA_OK;
2969*53ee8cc1Swenshuai.xi
2970*53ee8cc1Swenshuai.xi if(pu8IV && (u32Len <= HAL_CRYPTODMA_KEYLEN_MAX) && (u32Len > 0))
2971*53ee8cc1Swenshuai.xi {
2972*53ee8cc1Swenshuai.xi memcpy(_u8IV, pu8IV, u32Len);
2973*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = _u8IV;
2974*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = u32Len;
2975*53ee8cc1Swenshuai.xi }
2976*53ee8cc1Swenshuai.xi else
2977*53ee8cc1Swenshuai.xi {
2978*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = 0;
2979*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = 0;
2980*53ee8cc1Swenshuai.xi }
2981*53ee8cc1Swenshuai.xi
2982*53ee8cc1Swenshuai.xi if(u32Len > HAL_CRYPTODMA_KEYLEN_MAX)
2983*53ee8cc1Swenshuai.xi {
2984*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid IV Length!");
2985*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
2986*53ee8cc1Swenshuai.xi }
2987*53ee8cc1Swenshuai.xi
2988*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IV Length[%u]", _CipherKey.u8IVLen);
2989*53ee8cc1Swenshuai.xi
2990*53ee8cc1Swenshuai.xi return ret;
2991*53ee8cc1Swenshuai.xi }
2992*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetIV_Ex(const MS_U8 * pu8IV,MS_U32 u32Len)2993*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetIV_Ex(const MS_U8 *pu8IV, MS_U32 u32Len)
2994*53ee8cc1Swenshuai.xi {
2995*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2996*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2997*53ee8cc1Swenshuai.xi AESDMA_SET_IV_EX pArgs;
2998*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
2999*53ee8cc1Swenshuai.xi {
3000*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3001*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3002*53ee8cc1Swenshuai.xi }
3003*53ee8cc1Swenshuai.xi
3004*53ee8cc1Swenshuai.xi pArgs.pu8IV = pu8IV;
3005*53ee8cc1Swenshuai.xi pArgs.u32Len = u32Len;
3006*53ee8cc1Swenshuai.xi
3007*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetIV_Ex, (void*)&pArgs);
3008*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3009*53ee8cc1Swenshuai.xi {
3010*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3011*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3012*53ee8cc1Swenshuai.xi }
3013*53ee8cc1Swenshuai.xi
3014*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3015*53ee8cc1Swenshuai.xi #else
3016*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetIV_Ex(pu8IV, u32Len);
3017*53ee8cc1Swenshuai.xi #endif
3018*53ee8cc1Swenshuai.xi }
3019*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetKey(MS_U32 * pCipherKey)3020*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKey(MS_U32 *pCipherKey)
3021*53ee8cc1Swenshuai.xi {
3022*53ee8cc1Swenshuai.xi if(pCipherKey)
3023*53ee8cc1Swenshuai.xi {
3024*53ee8cc1Swenshuai.xi MS_U32 u32Tmp[4] = {0};
3025*53ee8cc1Swenshuai.xi if(!bDES_Key)
3026*53ee8cc1Swenshuai.xi {
3027*53ee8cc1Swenshuai.xi u32Tmp[3] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey);
3028*53ee8cc1Swenshuai.xi u32Tmp[2] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 4);
3029*53ee8cc1Swenshuai.xi u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 8);
3030*53ee8cc1Swenshuai.xi u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 12);
3031*53ee8cc1Swenshuai.xi }
3032*53ee8cc1Swenshuai.xi else
3033*53ee8cc1Swenshuai.xi {
3034*53ee8cc1Swenshuai.xi u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey);
3035*53ee8cc1Swenshuai.xi u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 4);
3036*53ee8cc1Swenshuai.xi
3037*53ee8cc1Swenshuai.xi }
3038*53ee8cc1Swenshuai.xi // Key from ACPU
3039*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
3040*53ee8cc1Swenshuai.xi
3041*53ee8cc1Swenshuai.xi memcpy(_u8Key,(MS_U8 *)u32Tmp, 16);
3042*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = _u8Key;
3043*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 16;
3044*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0;
3045*53ee8cc1Swenshuai.xi }
3046*53ee8cc1Swenshuai.xi else
3047*53ee8cc1Swenshuai.xi {
3048*53ee8cc1Swenshuai.xi //Key from KL
3049*53ee8cc1Swenshuai.xi memset(_u8Key, 0, 16);
3050*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
3051*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = 0;
3052*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 16;
3053*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0;
3054*53ee8cc1Swenshuai.xi }
3055*53ee8cc1Swenshuai.xi
3056*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u], DES Key[%d]",
3057*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx, bDES_Key);
3058*53ee8cc1Swenshuai.xi
3059*53ee8cc1Swenshuai.xi return 0;
3060*53ee8cc1Swenshuai.xi }
3061*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetKey(MS_U32 * pCipherKey)3062*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetKey(MS_U32 *pCipherKey)
3063*53ee8cc1Swenshuai.xi {
3064*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3065*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3066*53ee8cc1Swenshuai.xi
3067*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3068*53ee8cc1Swenshuai.xi {
3069*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3070*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3071*53ee8cc1Swenshuai.xi }
3072*53ee8cc1Swenshuai.xi
3073*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetKey, pCipherKey);
3074*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3075*53ee8cc1Swenshuai.xi {
3076*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3077*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3078*53ee8cc1Swenshuai.xi }
3079*53ee8cc1Swenshuai.xi
3080*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3081*53ee8cc1Swenshuai.xi #else
3082*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetKey(pCipherKey);
3083*53ee8cc1Swenshuai.xi #endif
3084*53ee8cc1Swenshuai.xi }
3085*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetKeySel(MS_U32 * pCipherKey,DrvAESDMA_KEY_TYPE stKeyType)3086*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetKeySel(MS_U32 *pCipherKey, DrvAESDMA_KEY_TYPE stKeyType)
3087*53ee8cc1Swenshuai.xi {
3088*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3089*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3090*53ee8cc1Swenshuai.xi }
3091*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetOddIV(MS_U32 * pInitVector)3092*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetOddIV(MS_U32 *pInitVector)
3093*53ee8cc1Swenshuai.xi {
3094*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3095*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3096*53ee8cc1Swenshuai.xi }
3097*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetSecureKey(void)3098*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetSecureKey(void)
3099*53ee8cc1Swenshuai.xi {
3100*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3101*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3102*53ee8cc1Swenshuai.xi }
3103*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetSecureKey(void)3104*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetSecureKey(void)
3105*53ee8cc1Swenshuai.xi {
3106*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3107*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3108*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3109*53ee8cc1Swenshuai.xi {
3110*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3111*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3112*53ee8cc1Swenshuai.xi }
3113*53ee8cc1Swenshuai.xi
3114*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetSecureKey, NULL);
3115*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3116*53ee8cc1Swenshuai.xi {
3117*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3118*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3119*53ee8cc1Swenshuai.xi }
3120*53ee8cc1Swenshuai.xi
3121*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3122*53ee8cc1Swenshuai.xi #else
3123*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetSecureKey();
3124*53ee8cc1Swenshuai.xi #endif
3125*53ee8cc1Swenshuai.xi }
3126*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetSecuredKeyIndex(MS_U8 u8KeyIdx)3127*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetSecuredKeyIndex (MS_U8 u8KeyIdx)
3128*53ee8cc1Swenshuai.xi {
3129*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3130*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3131*53ee8cc1Swenshuai.xi }
3132*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetIV(MS_U32 * pInitVector)3133*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetIV(MS_U32 *pInitVector)
3134*53ee8cc1Swenshuai.xi {
3135*53ee8cc1Swenshuai.xi if(pInitVector)
3136*53ee8cc1Swenshuai.xi {
3137*53ee8cc1Swenshuai.xi MS_U32 u32Tmp[4] = {0};
3138*53ee8cc1Swenshuai.xi if(!bDES_Key)
3139*53ee8cc1Swenshuai.xi {
3140*53ee8cc1Swenshuai.xi u32Tmp[3] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector);
3141*53ee8cc1Swenshuai.xi u32Tmp[2] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 4);
3142*53ee8cc1Swenshuai.xi u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 8);
3143*53ee8cc1Swenshuai.xi u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 12);
3144*53ee8cc1Swenshuai.xi }
3145*53ee8cc1Swenshuai.xi else
3146*53ee8cc1Swenshuai.xi {
3147*53ee8cc1Swenshuai.xi u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector);
3148*53ee8cc1Swenshuai.xi u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 4);
3149*53ee8cc1Swenshuai.xi }
3150*53ee8cc1Swenshuai.xi memcpy(_u8IV,(MS_U8 *)u32Tmp, 16);
3151*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = _u8IV;
3152*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = 16;
3153*53ee8cc1Swenshuai.xi }
3154*53ee8cc1Swenshuai.xi else
3155*53ee8cc1Swenshuai.xi {
3156*53ee8cc1Swenshuai.xi memset(_u8IV, 0, 16);
3157*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = 0;
3158*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = 0;
3159*53ee8cc1Swenshuai.xi }
3160*53ee8cc1Swenshuai.xi
3161*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IV Length[%u], DES IV[%d]", _CipherKey.u8IVLen, bDES_Key);
3162*53ee8cc1Swenshuai.xi
3163*53ee8cc1Swenshuai.xi return 0;
3164*53ee8cc1Swenshuai.xi }
3165*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetIV(MS_U32 * pInitVector)3166*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetIV(MS_U32 *pInitVector)
3167*53ee8cc1Swenshuai.xi {
3168*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3169*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3170*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3171*53ee8cc1Swenshuai.xi {
3172*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3173*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3174*53ee8cc1Swenshuai.xi }
3175*53ee8cc1Swenshuai.xi
3176*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetIV, pInitVector);
3177*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3178*53ee8cc1Swenshuai.xi {
3179*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3180*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3181*53ee8cc1Swenshuai.xi }
3182*53ee8cc1Swenshuai.xi
3183*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3184*53ee8cc1Swenshuai.xi #else
3185*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetIV(pInitVector);
3186*53ee8cc1Swenshuai.xi #endif
3187*53ee8cc1Swenshuai.xi
3188*53ee8cc1Swenshuai.xi }
3189*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetPS(MS_U32 u32PTN,MS_U32 u32Mask,MS_BOOL bPSin_Enable,MS_BOOL bPSout_Enable)3190*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetPS(MS_U32 u32PTN, MS_U32 u32Mask, MS_BOOL bPSin_Enable, MS_BOOL bPSout_Enable)
3191*53ee8cc1Swenshuai.xi {
3192*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3193*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3194*53ee8cc1Swenshuai.xi }
3195*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetPS(MS_U32 u32PTN,MS_U32 u32Mask,MS_BOOL bPSin_Enable,MS_BOOL bPSout_Enable)3196*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetPS(MS_U32 u32PTN, MS_U32 u32Mask, MS_BOOL bPSin_Enable, MS_BOOL bPSout_Enable)
3197*53ee8cc1Swenshuai.xi {
3198*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3199*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3200*53ee8cc1Swenshuai.xi AESDMA_SET_PS pArgs;
3201*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3202*53ee8cc1Swenshuai.xi {
3203*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3204*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3205*53ee8cc1Swenshuai.xi }
3206*53ee8cc1Swenshuai.xi
3207*53ee8cc1Swenshuai.xi pArgs.u32PTN = u32PTN;
3208*53ee8cc1Swenshuai.xi pArgs.u32Mask = u32Mask;
3209*53ee8cc1Swenshuai.xi pArgs.bPSin_Enable = bPSin_Enable;
3210*53ee8cc1Swenshuai.xi pArgs.bPSout_Enable = bPSout_Enable;
3211*53ee8cc1Swenshuai.xi
3212*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetPS, (void*)&pArgs);
3213*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3214*53ee8cc1Swenshuai.xi {
3215*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3216*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3217*53ee8cc1Swenshuai.xi }
3218*53ee8cc1Swenshuai.xi
3219*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3220*53ee8cc1Swenshuai.xi #else
3221*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetPS(u32PTN, u32Mask, bPSin_Enable, bPSout_Enable);
3222*53ee8cc1Swenshuai.xi #endif
3223*53ee8cc1Swenshuai.xi }
3224*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)3225*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)
3226*53ee8cc1Swenshuai.xi {
3227*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "Set CAVid [0x%x]",(unsigned int)u32CAVid);
3228*53ee8cc1Swenshuai.xi
3229*53ee8cc1Swenshuai.xi if((u32CAVid > HAL_CRYPTODMA_CAVID_MAX) || (u32CAVid == 0))
3230*53ee8cc1Swenshuai.xi {
3231*53ee8cc1Swenshuai.xi return DRVAESDMA_INVALID_PARAM;
3232*53ee8cc1Swenshuai.xi }
3233*53ee8cc1Swenshuai.xi
3234*53ee8cc1Swenshuai.xi _u32CAVid = u32CAVid;
3235*53ee8cc1Swenshuai.xi
3236*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3237*53ee8cc1Swenshuai.xi }
3238*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)3239*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)
3240*53ee8cc1Swenshuai.xi {
3241*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3242*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3243*53ee8cc1Swenshuai.xi AESDMA_CAVID pArgs;
3244*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3245*53ee8cc1Swenshuai.xi {
3246*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3247*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3248*53ee8cc1Swenshuai.xi }
3249*53ee8cc1Swenshuai.xi
3250*53ee8cc1Swenshuai.xi pArgs.u32CAVid = u32CAVid;
3251*53ee8cc1Swenshuai.xi
3252*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetDefaultCAVid, (void*)&pArgs);
3253*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3254*53ee8cc1Swenshuai.xi {
3255*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3256*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3257*53ee8cc1Swenshuai.xi }
3258*53ee8cc1Swenshuai.xi
3259*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3260*53ee8cc1Swenshuai.xi #else
3261*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetDefaultCAVid(u32CAVid);
3262*53ee8cc1Swenshuai.xi #endif
3263*53ee8cc1Swenshuai.xi }
3264*53ee8cc1Swenshuai.xi
3265*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_PSRelease(void)3266*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_PSRelease(void)
3267*53ee8cc1Swenshuai.xi {
3268*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3269*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3270*53ee8cc1Swenshuai.xi }
3271*53ee8cc1Swenshuai.xi
MDrv_AESDMA_PSRelease(void)3272*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_PSRelease(void)
3273*53ee8cc1Swenshuai.xi {
3274*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3275*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3276*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3277*53ee8cc1Swenshuai.xi {
3278*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3279*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3280*53ee8cc1Swenshuai.xi }
3281*53ee8cc1Swenshuai.xi
3282*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_PSRelease, NULL);
3283*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3284*53ee8cc1Swenshuai.xi {
3285*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3286*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3287*53ee8cc1Swenshuai.xi }
3288*53ee8cc1Swenshuai.xi
3289*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3290*53ee8cc1Swenshuai.xi #else
3291*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_PSRelease();
3292*53ee8cc1Swenshuai.xi #endif
3293*53ee8cc1Swenshuai.xi }
3294*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr,MS_U32 u32FileInNum,MS_PHY u32FileOutSAddr,MS_PHY u32FileOutEAddr)3295*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr, MS_U32 u32FileInNum, MS_PHY u32FileOutSAddr, MS_PHY u32FileOutEAddr)
3296*53ee8cc1Swenshuai.xi {
3297*53ee8cc1Swenshuai.xi
3298*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:FileIn address[0x%x], FileIn num[0x%x], FileOut start address[0x%x], FileOut end address[0x%x]",
3299*53ee8cc1Swenshuai.xi (unsigned int)u32FileinAddr,
3300*53ee8cc1Swenshuai.xi (unsigned int)u32FileInNum,
3301*53ee8cc1Swenshuai.xi (unsigned int)u32FileOutSAddr,
3302*53ee8cc1Swenshuai.xi (unsigned int)u32FileOutEAddr);
3303*53ee8cc1Swenshuai.xi
3304*53ee8cc1Swenshuai.xi _stInput.u32Addr = u32FileinAddr;
3305*53ee8cc1Swenshuai.xi _stInput.u32Size = u32FileInNum;
3306*53ee8cc1Swenshuai.xi _stInput.eMemoryType = E_CIPHER_DRAM;
3307*53ee8cc1Swenshuai.xi
3308*53ee8cc1Swenshuai.xi _stOutput.u32Addr = u32FileOutSAddr;
3309*53ee8cc1Swenshuai.xi _stOutput.u32Size = (u32FileOutEAddr - u32FileOutSAddr) + 1;
3310*53ee8cc1Swenshuai.xi _stOutput.eMemoryType = E_CIPHER_DRAM;
3311*53ee8cc1Swenshuai.xi
3312*53ee8cc1Swenshuai.xi return 0;
3313*53ee8cc1Swenshuai.xi }
3314*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr,MS_U32 u32FileInNum,MS_PHY u32FileOutSAddr,MS_PHY u32FileOutEAddr)3315*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr, MS_U32 u32FileInNum, MS_PHY u32FileOutSAddr, MS_PHY u32FileOutEAddr)
3316*53ee8cc1Swenshuai.xi {
3317*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3318*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3319*53ee8cc1Swenshuai.xi AESDMA_FILE_INOUT pArgs;
3320*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3321*53ee8cc1Swenshuai.xi {
3322*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3323*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3324*53ee8cc1Swenshuai.xi }
3325*53ee8cc1Swenshuai.xi
3326*53ee8cc1Swenshuai.xi pArgs.u32FileinAddr = u32FileinAddr;
3327*53ee8cc1Swenshuai.xi pArgs.u32FileInNum = u32FileInNum;
3328*53ee8cc1Swenshuai.xi pArgs.u32FileOutSAddr = u32FileOutSAddr;
3329*53ee8cc1Swenshuai.xi pArgs.u32FileOutEAddr = u32FileOutEAddr;
3330*53ee8cc1Swenshuai.xi
3331*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetFileInOut, (void*)&pArgs);
3332*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3333*53ee8cc1Swenshuai.xi {
3334*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3335*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3336*53ee8cc1Swenshuai.xi }
3337*53ee8cc1Swenshuai.xi
3338*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3339*53ee8cc1Swenshuai.xi #else
3340*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetFileInOut(u32FileinAddr, u32FileInNum, u32FileOutSAddr, u32FileOutEAddr);
3341*53ee8cc1Swenshuai.xi #endif
3342*53ee8cc1Swenshuai.xi }
3343*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_Start(MS_BOOL bStart)3344*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Start(MS_BOOL bStart)
3345*53ee8cc1Swenshuai.xi {
3346*53ee8cc1Swenshuai.xi DRV_CIPHER_DMACFG stCfg = {{0}};
3347*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
3348*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
3349*53ee8cc1Swenshuai.xi
3350*53ee8cc1Swenshuai.xi stCfg.stAlgo = _stAlgo;
3351*53ee8cc1Swenshuai.xi stCfg.u32CAVid = _u32CAVid;
3352*53ee8cc1Swenshuai.xi stCfg.stKey = _CipherKey;
3353*53ee8cc1Swenshuai.xi stCfg.stInput = _stInput;
3354*53ee8cc1Swenshuai.xi stCfg.stOutput = _stOutput;
3355*53ee8cc1Swenshuai.xi
3356*53ee8cc1Swenshuai.xi stCfg.bDecrypt = _isDecrypt;
3357*53ee8cc1Swenshuai.xi
3358*53ee8cc1Swenshuai.xi ret = MDrv_CIPHER_DMACalc(stCfg, &_RetId);
3359*53ee8cc1Swenshuai.xi
3360*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Decrypt[%d], CmdId[%u]!", _isDecrypt, _RetId);
3361*53ee8cc1Swenshuai.xi
3362*53ee8cc1Swenshuai.xi return ret;
3363*53ee8cc1Swenshuai.xi }
3364*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Start(MS_BOOL bStart)3365*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Start(MS_BOOL bStart)
3366*53ee8cc1Swenshuai.xi {
3367*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3368*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3369*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3370*53ee8cc1Swenshuai.xi {
3371*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3372*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3373*53ee8cc1Swenshuai.xi }
3374*53ee8cc1Swenshuai.xi
3375*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Start, &bStart);
3376*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3377*53ee8cc1Swenshuai.xi {
3378*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3379*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3380*53ee8cc1Swenshuai.xi }
3381*53ee8cc1Swenshuai.xi
3382*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3383*53ee8cc1Swenshuai.xi #else
3384*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_Start(bStart);
3385*53ee8cc1Swenshuai.xi #endif
3386*53ee8cc1Swenshuai.xi }
3387*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_Reset(void)3388*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Reset(void)
3389*53ee8cc1Swenshuai.xi {
3390*53ee8cc1Swenshuai.xi DRV_CIPHER_RET ret = DRV_CIPHER_OK;
3391*53ee8cc1Swenshuai.xi ret = MDrv_CIPHER_Reset();
3392*53ee8cc1Swenshuai.xi
3393*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != ret)
3394*53ee8cc1Swenshuai.xi return ret;
3395*53ee8cc1Swenshuai.xi
3396*53ee8cc1Swenshuai.xi // Default Key from ACPU
3397*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
3398*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = _u8ZeroData;
3399*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 16;
3400*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = 0;
3401*53ee8cc1Swenshuai.xi
3402*53ee8cc1Swenshuai.xi //Clear IV
3403*53ee8cc1Swenshuai.xi _CipherKey.pu8IVData = _u8ZeroData;
3404*53ee8cc1Swenshuai.xi _CipherKey.u8IVLen = 16;
3405*53ee8cc1Swenshuai.xi
3406*53ee8cc1Swenshuai.xi //Clear Algo
3407*53ee8cc1Swenshuai.xi _stAlgo.eMainAlgo = 0;
3408*53ee8cc1Swenshuai.xi _stAlgo.eSubAlgo = 0;
3409*53ee8cc1Swenshuai.xi _stAlgo.eResAlgo = 0;
3410*53ee8cc1Swenshuai.xi _stAlgo.eSBAlgo = 0;
3411*53ee8cc1Swenshuai.xi
3412*53ee8cc1Swenshuai.xi //Clear Input
3413*53ee8cc1Swenshuai.xi _stInput.u32Addr = 0;
3414*53ee8cc1Swenshuai.xi _stInput.u32Size = 0;
3415*53ee8cc1Swenshuai.xi _stInput.eMemoryType = 0;
3416*53ee8cc1Swenshuai.xi
3417*53ee8cc1Swenshuai.xi //Clear Output
3418*53ee8cc1Swenshuai.xi _stOutput.u32Addr = 0;
3419*53ee8cc1Swenshuai.xi _stOutput.u32Size = 0;
3420*53ee8cc1Swenshuai.xi _stOutput.eMemoryType = 0;
3421*53ee8cc1Swenshuai.xi
3422*53ee8cc1Swenshuai.xi memset(_u8Key, 0, sizeof(_u8Key));
3423*53ee8cc1Swenshuai.xi memset(_u8IV, 0, sizeof(_u8IV));
3424*53ee8cc1Swenshuai.xi
3425*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:AESDMA Reset");
3426*53ee8cc1Swenshuai.xi
3427*53ee8cc1Swenshuai.xi return 0;
3428*53ee8cc1Swenshuai.xi }
3429*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Reset(void)3430*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Reset(void)
3431*53ee8cc1Swenshuai.xi {
3432*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3433*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3434*53ee8cc1Swenshuai.xi
3435*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3436*53ee8cc1Swenshuai.xi {
3437*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3438*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3439*53ee8cc1Swenshuai.xi }
3440*53ee8cc1Swenshuai.xi
3441*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Reset, NULL);
3442*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3443*53ee8cc1Swenshuai.xi {
3444*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3445*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3446*53ee8cc1Swenshuai.xi }
3447*53ee8cc1Swenshuai.xi
3448*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3449*53ee8cc1Swenshuai.xi #else
3450*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_Reset();
3451*53ee8cc1Swenshuai.xi #endif
3452*53ee8cc1Swenshuai.xi
3453*53ee8cc1Swenshuai.xi }
3454*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_GetStatus(MS_U32 * u32RetVal)3455*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_GetStatus(MS_U32 *u32RetVal)
3456*53ee8cc1Swenshuai.xi {
3457*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3458*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3459*53ee8cc1Swenshuai.xi }
3460*53ee8cc1Swenshuai.xi
MDrv_AESDMA_GetStatus(void)3461*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_GetStatus(void)
3462*53ee8cc1Swenshuai.xi {
3463*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3464*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3465*53ee8cc1Swenshuai.xi }
3466*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_IsFinished(MS_U32 * u32RetVal)3467*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_IsFinished(MS_U32 *u32RetVal)
3468*53ee8cc1Swenshuai.xi {
3469*53ee8cc1Swenshuai.xi MS_BOOL bDone = FALSE;
3470*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
3471*53ee8cc1Swenshuai.xi
3472*53ee8cc1Swenshuai.xi bDone = MDrv_CIPHER_IsDMADone(_RetId, &u32Ret);
3473*53ee8cc1Swenshuai.xi
3474*53ee8cc1Swenshuai.xi if(TRUE == bDone)
3475*53ee8cc1Swenshuai.xi {
3476*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3477*53ee8cc1Swenshuai.xi }
3478*53ee8cc1Swenshuai.xi else
3479*53ee8cc1Swenshuai.xi {
3480*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CmdId[%u] Not Done!", _RetId);
3481*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3482*53ee8cc1Swenshuai.xi }
3483*53ee8cc1Swenshuai.xi }
3484*53ee8cc1Swenshuai.xi
MDrv_AESDMA_IsFinished(void)3485*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_IsFinished(void)
3486*53ee8cc1Swenshuai.xi {
3487*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3488*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3489*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3490*53ee8cc1Swenshuai.xi {
3491*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3492*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3493*53ee8cc1Swenshuai.xi }
3494*53ee8cc1Swenshuai.xi
3495*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_IsFinished, NULL);
3496*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3497*53ee8cc1Swenshuai.xi {
3498*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3499*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3500*53ee8cc1Swenshuai.xi }
3501*53ee8cc1Swenshuai.xi
3502*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3503*53ee8cc1Swenshuai.xi #else
3504*53ee8cc1Swenshuai.xi MS_U32 u32Tmp = 0;
3505*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_IsFinished(&u32Tmp);
3506*53ee8cc1Swenshuai.xi #endif
3507*53ee8cc1Swenshuai.xi }
3508*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_GetPSMatchedByteCNT(MS_U32 * u32RetVal)3509*53ee8cc1Swenshuai.xi MS_U32 _MDrv_AESDMA_GetPSMatchedByteCNT(MS_U32 *u32RetVal)
3510*53ee8cc1Swenshuai.xi {
3511*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3512*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3513*53ee8cc1Swenshuai.xi }
3514*53ee8cc1Swenshuai.xi
MDrv_AESDMA_GetPSMatchedByteCNT(void)3515*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U32 MDrv_AESDMA_GetPSMatchedByteCNT(void)
3516*53ee8cc1Swenshuai.xi {
3517*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3518*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3519*53ee8cc1Swenshuai.xi }
3520*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_GetPSMatchedPTN(void)3521*53ee8cc1Swenshuai.xi MS_U32 _MDrv_AESDMA_GetPSMatchedPTN(void)
3522*53ee8cc1Swenshuai.xi {
3523*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3524*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3525*53ee8cc1Swenshuai.xi }
3526*53ee8cc1Swenshuai.xi
MDrv_AESDMA_GetPSMatchedPTN(void)3527*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U32 MDrv_AESDMA_GetPSMatchedPTN(void)
3528*53ee8cc1Swenshuai.xi {
3529*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3530*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3531*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3532*53ee8cc1Swenshuai.xi {
3533*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3534*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3535*53ee8cc1Swenshuai.xi }
3536*53ee8cc1Swenshuai.xi
3537*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_GetPSMatchedPTN, NULL);
3538*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3539*53ee8cc1Swenshuai.xi {
3540*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3541*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3542*53ee8cc1Swenshuai.xi }
3543*53ee8cc1Swenshuai.xi
3544*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3545*53ee8cc1Swenshuai.xi #else
3546*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_GetPSMatchedPTN();
3547*53ee8cc1Swenshuai.xi #endif
3548*53ee8cc1Swenshuai.xi }
3549*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents,P_DrvAESDMA_EvtCallback pfCallback)3550*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents, P_DrvAESDMA_EvtCallback pfCallback)
3551*53ee8cc1Swenshuai.xi {
3552*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3553*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3554*53ee8cc1Swenshuai.xi }
3555*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents,P_DrvAESDMA_EvtCallback pfCallback)3556*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents, P_DrvAESDMA_EvtCallback pfCallback)
3557*53ee8cc1Swenshuai.xi {
3558*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3559*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3560*53ee8cc1Swenshuai.xi AESDMA_NOTIFY pArgs;
3561*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3562*53ee8cc1Swenshuai.xi {
3563*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3564*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3565*53ee8cc1Swenshuai.xi }
3566*53ee8cc1Swenshuai.xi
3567*53ee8cc1Swenshuai.xi pArgs.eEvents = eEvents;
3568*53ee8cc1Swenshuai.xi pArgs.pfCallback = pfCallback;
3569*53ee8cc1Swenshuai.xi
3570*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Notify, (void*)&pArgs);
3571*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3572*53ee8cc1Swenshuai.xi {
3573*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3574*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3575*53ee8cc1Swenshuai.xi }
3576*53ee8cc1Swenshuai.xi
3577*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3578*53ee8cc1Swenshuai.xi #else
3579*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_Notify(eEvents, pfCallback);
3580*53ee8cc1Swenshuai.xi #endif
3581*53ee8cc1Swenshuai.xi }
3582*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetDbgLevel(DrvAESDMA_DbgLevel DbgLevel)3583*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetDbgLevel(DrvAESDMA_DbgLevel DbgLevel)
3584*53ee8cc1Swenshuai.xi {
3585*53ee8cc1Swenshuai.xi CIPHER_DBGMSG_LEVEL eDbgLevel = _CIPHER_TransDbgLevel(DbgLevel);
3586*53ee8cc1Swenshuai.xi
3587*53ee8cc1Swenshuai.xi MDrv_CIPHER_SetDbgLevel(eDbgLevel);
3588*53ee8cc1Swenshuai.xi
3589*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3590*53ee8cc1Swenshuai.xi }
3591*53ee8cc1Swenshuai.xi
MDrv_AESDMA_GetLibVer(const MSIF_Version ** ppVersion)3592*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_GetLibVer(const MSIF_Version **ppVersion)
3593*53ee8cc1Swenshuai.xi {
3594*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3595*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3596*53ee8cc1Swenshuai.xi }
3597*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_Rand(MS_U32 * u32PABuf,MS_U32 u32Size)3598*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Rand(MS_U32 *u32PABuf, MS_U32 u32Size)
3599*53ee8cc1Swenshuai.xi {
3600*53ee8cc1Swenshuai.xi if(NULL == u32PABuf || 0 == u32Size)
3601*53ee8cc1Swenshuai.xi {
3602*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Buffer or Size is zero!");
3603*53ee8cc1Swenshuai.xi return DRVAESDMA_INVALID_PARAM;
3604*53ee8cc1Swenshuai.xi }
3605*53ee8cc1Swenshuai.xi
3606*53ee8cc1Swenshuai.xi ptrdiff_t n = (ptrdiff_t)u32PABuf;
3607*53ee8cc1Swenshuai.xi MS_VIRT u8VABuf = (MS_VIRT)MsOS_PA2KSEG1((MS_PHY)n);
3608*53ee8cc1Swenshuai.xi
3609*53ee8cc1Swenshuai.xi if( FALSE == HAL_CIPHER_Misc_Random((MS_U8 *)u8VABuf,u32Size))
3610*53ee8cc1Swenshuai.xi {
3611*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3612*53ee8cc1Swenshuai.xi }
3613*53ee8cc1Swenshuai.xi
3614*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3615*53ee8cc1Swenshuai.xi }
3616*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Rand(MS_U32 * u32PABuf,MS_U32 u32Size)3617*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Rand(MS_U32 *u32PABuf, MS_U32 u32Size)
3618*53ee8cc1Swenshuai.xi {
3619*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3620*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3621*53ee8cc1Swenshuai.xi AESDMA_RAND pArgs;
3622*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3623*53ee8cc1Swenshuai.xi {
3624*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3625*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3626*53ee8cc1Swenshuai.xi }
3627*53ee8cc1Swenshuai.xi
3628*53ee8cc1Swenshuai.xi pArgs.u32PABuf = u32PABuf;
3629*53ee8cc1Swenshuai.xi pArgs.u32Size = u32Size;
3630*53ee8cc1Swenshuai.xi
3631*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Rand, (void*)&pArgs);
3632*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3633*53ee8cc1Swenshuai.xi {
3634*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3635*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3636*53ee8cc1Swenshuai.xi }
3637*53ee8cc1Swenshuai.xi
3638*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3639*53ee8cc1Swenshuai.xi #else
3640*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_Rand(u32PABuf, u32Size);
3641*53ee8cc1Swenshuai.xi #endif
3642*53ee8cc1Swenshuai.xi }
3643*53ee8cc1Swenshuai.xi
3644*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Set_Clk(MS_BOOL benable)3645*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Set_Clk(MS_BOOL benable)
3646*53ee8cc1Swenshuai.xi {
3647*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Not Support!");
3648*53ee8cc1Swenshuai.xi return 0;
3649*53ee8cc1Swenshuai.xi }
3650*53ee8cc1Swenshuai.xi
_MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode,MS_PHY u32PAInBuf,MS_U32 u32Size,MS_PHY u32PAOutBuf)3651*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode, MS_PHY u32PAInBuf, MS_U32 u32Size, MS_PHY u32PAOutBuf)
3652*53ee8cc1Swenshuai.xi {
3653*53ee8cc1Swenshuai.xi DRV_CIPHER_HASHCFG stCfg = {0};
3654*53ee8cc1Swenshuai.xi CIPHER_HASH_ALGO eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3655*53ee8cc1Swenshuai.xi MS_U32 u32DgstSize = 20;
3656*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
3657*53ee8cc1Swenshuai.xi MS_U32 u32WaitCnt = 0;
3658*53ee8cc1Swenshuai.xi
3659*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:eMode[%d], InBuffer[0x%08x], Size[%u], OutBuffer[0x%08x]!",
3660*53ee8cc1Swenshuai.xi eMode, (unsigned int)u32PAInBuf, u32Size, (unsigned int)u32PAOutBuf);
3661*53ee8cc1Swenshuai.xi
3662*53ee8cc1Swenshuai.xi switch(eMode)
3663*53ee8cc1Swenshuai.xi {
3664*53ee8cc1Swenshuai.xi case E_DRVAESDMA_SHA1:
3665*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3666*53ee8cc1Swenshuai.xi u32DgstSize = 20;
3667*53ee8cc1Swenshuai.xi break;
3668*53ee8cc1Swenshuai.xi case E_DRVAESDMA_SHA256:
3669*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA256;
3670*53ee8cc1Swenshuai.xi u32DgstSize = 32;
3671*53ee8cc1Swenshuai.xi break;
3672*53ee8cc1Swenshuai.xi default:
3673*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3674*53ee8cc1Swenshuai.xi u32DgstSize = 20;
3675*53ee8cc1Swenshuai.xi }
3676*53ee8cc1Swenshuai.xi
3677*53ee8cc1Swenshuai.xi stCfg.eAlgo = eAlgo;
3678*53ee8cc1Swenshuai.xi stCfg.stInput.u32Addr = u32PAInBuf;
3679*53ee8cc1Swenshuai.xi stCfg.stInput.u32Size = u32Size;
3680*53ee8cc1Swenshuai.xi stCfg.pu8Digest_Buf = (MS_U8*)(MsOS_PA2KSEG1(u32PAOutBuf));
3681*53ee8cc1Swenshuai.xi stCfg.u32Digest_Buf_Size = u32DgstSize;
3682*53ee8cc1Swenshuai.xi
3683*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != MDrv_CIPHER_HASH(stCfg, &_RetId))
3684*53ee8cc1Swenshuai.xi {
3685*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH Fail!");
3686*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3687*53ee8cc1Swenshuai.xi }
3688*53ee8cc1Swenshuai.xi
3689*53ee8cc1Swenshuai.xi while((FALSE == MDrv_CIPHER_IsHASHDone(_RetId, &u32Ret)) && u32WaitCnt < HASH_TIMEOUT_VALUE)
3690*53ee8cc1Swenshuai.xi {
3691*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_NUTTX
3692*53ee8cc1Swenshuai.xi MsOS_DelayTaskUs(200);
3693*53ee8cc1Swenshuai.xi #elif defined MSOS_TYPE_OPTEE
3694*53ee8cc1Swenshuai.xi
3695*53ee8cc1Swenshuai.xi #else
3696*53ee8cc1Swenshuai.xi MsOS_DelayTask(20);
3697*53ee8cc1Swenshuai.xi #endif
3698*53ee8cc1Swenshuai.xi u32WaitCnt++;
3699*53ee8cc1Swenshuai.xi }
3700*53ee8cc1Swenshuai.xi
3701*53ee8cc1Swenshuai.xi if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
3702*53ee8cc1Swenshuai.xi {
3703*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
3704*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3705*53ee8cc1Swenshuai.xi }
3706*53ee8cc1Swenshuai.xi
3707*53ee8cc1Swenshuai.xi //Reverse MSB to LSB for old API compatible
3708*53ee8cc1Swenshuai.xi _ReverseU8Buf((MS_U8 *)stCfg.pu8Digest_Buf, u32DgstSize );
3709*53ee8cc1Swenshuai.xi
3710*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3711*53ee8cc1Swenshuai.xi }
3712*53ee8cc1Swenshuai.xi
MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode,MS_PHY u32PAInBuf,MS_U32 u32Size,MS_PHY u32PAOutBuf)3713*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode, MS_PHY u32PAInBuf, MS_U32 u32Size, MS_PHY u32PAOutBuf)
3714*53ee8cc1Swenshuai.xi {
3715*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3716*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3717*53ee8cc1Swenshuai.xi SHA_CALCULATE pArgs;
3718*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3719*53ee8cc1Swenshuai.xi {
3720*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3721*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3722*53ee8cc1Swenshuai.xi }
3723*53ee8cc1Swenshuai.xi
3724*53ee8cc1Swenshuai.xi pArgs.eMode = eMode;
3725*53ee8cc1Swenshuai.xi pArgs.u32PAInBuf = u32PAInBuf;
3726*53ee8cc1Swenshuai.xi pArgs.u32Size = u32Size;
3727*53ee8cc1Swenshuai.xi pArgs.u32PAOutBuf = u32PAOutBuf;
3728*53ee8cc1Swenshuai.xi
3729*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_SHA_Calculate, (void*)&pArgs);
3730*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3731*53ee8cc1Swenshuai.xi {
3732*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3733*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3734*53ee8cc1Swenshuai.xi }
3735*53ee8cc1Swenshuai.xi
3736*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3737*53ee8cc1Swenshuai.xi #else
3738*53ee8cc1Swenshuai.xi return _MDrv_SHA_Calculate(eMode, u32PAInBuf, u32Size, u32PAOutBuf);
3739*53ee8cc1Swenshuai.xi #endif
3740*53ee8cc1Swenshuai.xi }
3741*53ee8cc1Swenshuai.xi
_MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg,DrvAESDMA_HASH_STAGE eStage,MS_U32 u32DoneBytes,MS_U8 * pu8SetIV)3742*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg, DrvAESDMA_HASH_STAGE eStage, MS_U32 u32DoneBytes, MS_U8 *pu8SetIV)
3743*53ee8cc1Swenshuai.xi {
3744*53ee8cc1Swenshuai.xi DRV_CIPHER_HASHCFG_MANUAL stCipherCfg = {0};
3745*53ee8cc1Swenshuai.xi CIPHER_HASH_ALGO eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3746*53ee8cc1Swenshuai.xi MS_U32 u32DgstSize = 20;
3747*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
3748*53ee8cc1Swenshuai.xi MS_U32 u32WaitCnt = 0;
3749*53ee8cc1Swenshuai.xi
3750*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:eMode[%d], Stage[%d], Done Bytes[%u]!",
3751*53ee8cc1Swenshuai.xi stCfg.eMode, eStage, u32DoneBytes);
3752*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:InAddress[0x%08x], InSize[%u], OutAddress[0x%08x], OutSize[%u]!",
3753*53ee8cc1Swenshuai.xi (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size, (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
3754*53ee8cc1Swenshuai.xi
3755*53ee8cc1Swenshuai.xi switch(stCfg.eMode)
3756*53ee8cc1Swenshuai.xi {
3757*53ee8cc1Swenshuai.xi case E_DRVAESDMA_SHA1:
3758*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3759*53ee8cc1Swenshuai.xi u32DgstSize = 20;
3760*53ee8cc1Swenshuai.xi break;
3761*53ee8cc1Swenshuai.xi case E_DRVAESDMA_SHA256:
3762*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA256;
3763*53ee8cc1Swenshuai.xi u32DgstSize = 32;
3764*53ee8cc1Swenshuai.xi break;
3765*53ee8cc1Swenshuai.xi default:
3766*53ee8cc1Swenshuai.xi eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3767*53ee8cc1Swenshuai.xi u32DgstSize = 20;
3768*53ee8cc1Swenshuai.xi }
3769*53ee8cc1Swenshuai.xi
3770*53ee8cc1Swenshuai.xi //Algo
3771*53ee8cc1Swenshuai.xi stCipherCfg.eAlgo = eAlgo;
3772*53ee8cc1Swenshuai.xi
3773*53ee8cc1Swenshuai.xi //Input
3774*53ee8cc1Swenshuai.xi stCipherCfg.stInput.u32Addr = stCfg.stInput.u32Addr;
3775*53ee8cc1Swenshuai.xi stCipherCfg.stInput.u32Size = stCfg.stInput.u32Size;
3776*53ee8cc1Swenshuai.xi
3777*53ee8cc1Swenshuai.xi //Output
3778*53ee8cc1Swenshuai.xi stCipherCfg.pu8Digest_Buf = (MS_U8*)stCfg.stOutput.u32Addr;
3779*53ee8cc1Swenshuai.xi stCipherCfg.u32Digest_Buf_Size = stCfg.stOutput.u32Size;
3780*53ee8cc1Swenshuai.xi
3781*53ee8cc1Swenshuai.xi //Stage
3782*53ee8cc1Swenshuai.xi stCipherCfg.eStage = eStage;
3783*53ee8cc1Swenshuai.xi
3784*53ee8cc1Swenshuai.xi //StartBytes
3785*53ee8cc1Swenshuai.xi stCipherCfg.u32StartByte = u32DoneBytes;
3786*53ee8cc1Swenshuai.xi
3787*53ee8cc1Swenshuai.xi //IV
3788*53ee8cc1Swenshuai.xi stCipherCfg.pu8SetIV = pu8SetIV;
3789*53ee8cc1Swenshuai.xi
3790*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != MDrv_CIPHER_HASHManual(stCipherCfg, &_RetId))
3791*53ee8cc1Swenshuai.xi {
3792*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH Fail!");
3793*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3794*53ee8cc1Swenshuai.xi }
3795*53ee8cc1Swenshuai.xi
3796*53ee8cc1Swenshuai.xi while((FALSE == MDrv_CIPHER_IsHASHDone(_RetId, &u32Ret)) && u32WaitCnt < HASH_TIMEOUT_VALUE)
3797*53ee8cc1Swenshuai.xi {
3798*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_NUTTX
3799*53ee8cc1Swenshuai.xi MsOS_DelayTaskUs(200);
3800*53ee8cc1Swenshuai.xi #elif defined MSOS_TYPE_OPTEE
3801*53ee8cc1Swenshuai.xi
3802*53ee8cc1Swenshuai.xi #else
3803*53ee8cc1Swenshuai.xi MsOS_DelayTask(20);
3804*53ee8cc1Swenshuai.xi #endif
3805*53ee8cc1Swenshuai.xi u32WaitCnt++;
3806*53ee8cc1Swenshuai.xi }
3807*53ee8cc1Swenshuai.xi
3808*53ee8cc1Swenshuai.xi if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
3809*53ee8cc1Swenshuai.xi {
3810*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
3811*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3812*53ee8cc1Swenshuai.xi }
3813*53ee8cc1Swenshuai.xi
3814*53ee8cc1Swenshuai.xi //Reverse MSB to LSB for old API compatible
3815*53ee8cc1Swenshuai.xi if(eStage == E_DRVAESDMA_HASH_STAGE_LAST)
3816*53ee8cc1Swenshuai.xi {
3817*53ee8cc1Swenshuai.xi _ReverseU8Buf((MS_U8 *)stCipherCfg.pu8Digest_Buf, u32DgstSize );
3818*53ee8cc1Swenshuai.xi }
3819*53ee8cc1Swenshuai.xi
3820*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3821*53ee8cc1Swenshuai.xi }
3822*53ee8cc1Swenshuai.xi
MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg,DrvAESDMA_HASH_STAGE eStage,MS_U32 u32DoneBytes,MS_U8 * pu8SetIV)3823*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg, DrvAESDMA_HASH_STAGE eStage, MS_U32 u32DoneBytes, MS_U8 *pu8SetIV)
3824*53ee8cc1Swenshuai.xi {
3825*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3826*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3827*53ee8cc1Swenshuai.xi SHA_CALCULATE_MANUAL pArgs;
3828*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
3829*53ee8cc1Swenshuai.xi {
3830*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3831*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3832*53ee8cc1Swenshuai.xi }
3833*53ee8cc1Swenshuai.xi
3834*53ee8cc1Swenshuai.xi if(NULL != stCfg.stInput.u32Addr)
3835*53ee8cc1Swenshuai.xi {
3836*53ee8cc1Swenshuai.xi stCfg.stInput.u32Addr = MsOS_VA2PA(stCfg.stInput.u32Addr);
3837*53ee8cc1Swenshuai.xi }
3838*53ee8cc1Swenshuai.xi pArgs.stCfg = stCfg;
3839*53ee8cc1Swenshuai.xi pArgs.eStage = eStage;
3840*53ee8cc1Swenshuai.xi pArgs.u32DoneBytes = u32DoneBytes;
3841*53ee8cc1Swenshuai.xi pArgs.pu8SetIV = pu8SetIV;
3842*53ee8cc1Swenshuai.xi
3843*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_SHA_CalculateManual, (void*)&pArgs);
3844*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
3845*53ee8cc1Swenshuai.xi {
3846*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3847*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
3848*53ee8cc1Swenshuai.xi }
3849*53ee8cc1Swenshuai.xi
3850*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3851*53ee8cc1Swenshuai.xi #else
3852*53ee8cc1Swenshuai.xi
3853*53ee8cc1Swenshuai.xi if(NULL != stCfg.stInput.u32Addr)
3854*53ee8cc1Swenshuai.xi {
3855*53ee8cc1Swenshuai.xi stCfg.stInput.u32Addr = MsOS_VA2PA(stCfg.stInput.u32Addr);
3856*53ee8cc1Swenshuai.xi }
3857*53ee8cc1Swenshuai.xi return _MDrv_SHA_CalculateManual(stCfg, eStage, u32DoneBytes, pu8SetIV);
3858*53ee8cc1Swenshuai.xi #endif
3859*53ee8cc1Swenshuai.xi }
3860*53ee8cc1Swenshuai.xi
3861*53ee8cc1Swenshuai.xi
3862*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
MDrv_MOBF_DmaOnly(void)3863*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_DmaOnly(void)
3864*53ee8cc1Swenshuai.xi {
3865*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3866*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3867*53ee8cc1Swenshuai.xi }
3868*53ee8cc1Swenshuai.xi
MDrv_MOBF_Encrypt(MS_U32 u32Key,MS_BOOL bEnable)3869*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_Encrypt(MS_U32 u32Key, MS_BOOL bEnable)
3870*53ee8cc1Swenshuai.xi {
3871*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3872*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3873*53ee8cc1Swenshuai.xi }
3874*53ee8cc1Swenshuai.xi
MDrv_MOBF_Decrypt(MS_U32 u32Key,MS_BOOL bEnable)3875*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_Decrypt(MS_U32 u32Key, MS_BOOL bEnable)
3876*53ee8cc1Swenshuai.xi {
3877*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3878*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3879*53ee8cc1Swenshuai.xi }
3880*53ee8cc1Swenshuai.xi
MDrv_MOBF_OneWay(void)3881*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_OneWay(void)
3882*53ee8cc1Swenshuai.xi {
3883*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3884*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3885*53ee8cc1Swenshuai.xi }
3886*53ee8cc1Swenshuai.xi #endif
3887*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_MaskScrmb(MS_BOOL bEnable)3888*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_MaskScrmb(MS_BOOL bEnable)
3889*53ee8cc1Swenshuai.xi {
3890*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3891*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3892*53ee8cc1Swenshuai.xi }
3893*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_SetScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)3894*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)
3895*53ee8cc1Swenshuai.xi {
3896*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3897*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3898*53ee8cc1Swenshuai.xi }
3899*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_SetAddedScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)3900*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetAddedScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)
3901*53ee8cc1Swenshuai.xi {
3902*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3903*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3904*53ee8cc1Swenshuai.xi }
3905*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_QueryPidCount(void)3906*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U8 MDrv_AESDMA_Parser_QueryPidCount(void)
3907*53ee8cc1Swenshuai.xi {
3908*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3909*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3910*53ee8cc1Swenshuai.xi }
3911*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_SetPid(MS_U8 u8Index,MS_U16 u16Pid)3912*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetPid(MS_U8 u8Index, MS_U16 u16Pid)
3913*53ee8cc1Swenshuai.xi {
3914*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3915*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3916*53ee8cc1Swenshuai.xi }
3917*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_BypassPid(MS_BOOL bEnable)3918*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_BypassPid(MS_BOOL bEnable)
3919*53ee8cc1Swenshuai.xi {
3920*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3921*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3922*53ee8cc1Swenshuai.xi }
3923*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_Encrypt(DrvAESDMA_ParserMode eMode)3924*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_Encrypt(DrvAESDMA_ParserMode eMode)
3925*53ee8cc1Swenshuai.xi {
3926*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3927*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3928*53ee8cc1Swenshuai.xi }
3929*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Parser_Decrypt(DrvAESDMA_ParserMode eMode)3930*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_Decrypt(DrvAESDMA_ParserMode eMode)
3931*53ee8cc1Swenshuai.xi {
3932*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3933*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
3934*53ee8cc1Swenshuai.xi }
3935*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Lock(void)3936*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_AESDMA_Lock(void)
3937*53ee8cc1Swenshuai.xi {
3938*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_AESDMAMtx, MSOS_WAIT_FOREVER);
3939*53ee8cc1Swenshuai.xi return TRUE;
3940*53ee8cc1Swenshuai.xi }
3941*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Unlock(void)3942*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_AESDMA_Unlock(void)
3943*53ee8cc1Swenshuai.xi {
3944*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_AESDMAMtx);
3945*53ee8cc1Swenshuai.xi return TRUE;
3946*53ee8cc1Swenshuai.xi }
3947*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetPowerState(EN_POWER_MODE u16PowerState)3948*53ee8cc1Swenshuai.xi MS_U32 MDrv_AESDMA_SetPowerState(EN_POWER_MODE u16PowerState)
3949*53ee8cc1Swenshuai.xi {
3950*53ee8cc1Swenshuai.xi static EN_POWER_MODE u16PreAESDMAPowerState = E_POWER_MECHANICAL;
3951*53ee8cc1Swenshuai.xi MS_U32 u32Return = UTOPIA_STATUS_FAIL;
3952*53ee8cc1Swenshuai.xi
3953*53ee8cc1Swenshuai.xi if (u16PowerState == E_POWER_SUSPEND)
3954*53ee8cc1Swenshuai.xi {
3955*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Go to SUSPEND\n");
3956*53ee8cc1Swenshuai.xi
3957*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
3958*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32CIPHEREventId);
3959*53ee8cc1Swenshuai.xi #endif
3960*53ee8cc1Swenshuai.xi // MsOS_DeleteTask(_s32AESDMATaskId);
3961*53ee8cc1Swenshuai.xi MsOS_DeleteSemaphore(_CipherSemaphore);
3962*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_CipherMtx);
3963*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_AESDMAMtx);
3964*53ee8cc1Swenshuai.xi
3965*53ee8cc1Swenshuai.xi u16PreAESDMAPowerState = u16PowerState;
3966*53ee8cc1Swenshuai.xi u32Return = UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
3967*53ee8cc1Swenshuai.xi
3968*53ee8cc1Swenshuai.xi _bCIPHERDrv_Inited = FALSE;
3969*53ee8cc1Swenshuai.xi }
3970*53ee8cc1Swenshuai.xi else if (u16PowerState == E_POWER_RESUME)
3971*53ee8cc1Swenshuai.xi {
3972*53ee8cc1Swenshuai.xi if (u16PreAESDMAPowerState == E_POWER_SUSPEND)
3973*53ee8cc1Swenshuai.xi {
3974*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Go to RESUME\n");
3975*53ee8cc1Swenshuai.xi _bCIPHERDrv_Inited = FALSE;
3976*53ee8cc1Swenshuai.xi MDrv_CIPHER_Init();
3977*53ee8cc1Swenshuai.xi
3978*53ee8cc1Swenshuai.xi
3979*53ee8cc1Swenshuai.xi u16PreAESDMAPowerState = u16PowerState;
3980*53ee8cc1Swenshuai.xi u32Return = UTOPIA_STATUS_SUCCESS;//RESUME_OK;
3981*53ee8cc1Swenshuai.xi }
3982*53ee8cc1Swenshuai.xi else
3983*53ee8cc1Swenshuai.xi {
3984*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
3985*53ee8cc1Swenshuai.xi u32Return = UTOPIA_STATUS_FAIL;//SUSPEND_FAILED;
3986*53ee8cc1Swenshuai.xi }
3987*53ee8cc1Swenshuai.xi }
3988*53ee8cc1Swenshuai.xi else
3989*53ee8cc1Swenshuai.xi {
3990*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__,u16PowerState);
3991*53ee8cc1Swenshuai.xi u32Return = UTOPIA_STATUS_FAIL;
3992*53ee8cc1Swenshuai.xi }
3993*53ee8cc1Swenshuai.xi
3994*53ee8cc1Swenshuai.xi return u32Return;// for success
3995*53ee8cc1Swenshuai.xi
3996*53ee8cc1Swenshuai.xi }
3997*53ee8cc1Swenshuai.xi
MDrv_AESDMA_Exit(void)3998*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_Exit(void)
3999*53ee8cc1Swenshuai.xi {
4000*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4001*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4002*53ee8cc1Swenshuai.xi }
4003*53ee8cc1Swenshuai.xi
MDrv_AESDMA_IsSecretKeyInNormalBank(void)4004*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_IsSecretKeyInNormalBank(void)
4005*53ee8cc1Swenshuai.xi {
4006*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4007*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4008*53ee8cc1Swenshuai.xi }
4009*53ee8cc1Swenshuai.xi
MDrv_AESDMA_EnableTwoKeys(MS_BOOL bEnable)4010*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_EnableTwoKeys(MS_BOOL bEnable)
4011*53ee8cc1Swenshuai.xi {
4012*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4013*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4014*53ee8cc1Swenshuai.xi }
4015*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetOddKey(MS_U32 * pInitVector)4016*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetOddKey(MS_U32 *pInitVector)
4017*53ee8cc1Swenshuai.xi {
4018*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4019*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4020*53ee8cc1Swenshuai.xi }
4021*53ee8cc1Swenshuai.xi
MDrv_AESDMA_ParserStart(MS_BOOL bStart)4022*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_ParserStart(MS_BOOL bStart)
4023*53ee8cc1Swenshuai.xi {
4024*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4025*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4026*53ee8cc1Swenshuai.xi }
4027*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_NormalReset(void)4028*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_NormalReset(void)
4029*53ee8cc1Swenshuai.xi {
4030*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4031*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4032*53ee8cc1Swenshuai.xi }
4033*53ee8cc1Swenshuai.xi
MDrv_AESDMA_NormalReset(void)4034*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_NormalReset(void)
4035*53ee8cc1Swenshuai.xi {
4036*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4037*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4038*53ee8cc1Swenshuai.xi }
4039*53ee8cc1Swenshuai.xi
MDrv_HDCP_ProcessCipher(MS_U8 u8Idx,MS_U8 * pu8Riv,MS_U8 * pu8ContentKey)4040*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDCP_ProcessCipher(MS_U8 u8Idx, MS_U8* pu8Riv, MS_U8 *pu8ContentKey)
4041*53ee8cc1Swenshuai.xi {
4042*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4043*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4044*53ee8cc1Swenshuai.xi }
4045*53ee8cc1Swenshuai.xi
MDrv_HDCP_GetHdcpCipherState(MS_U8 u8Idx,MS_U8 * pu8State)4046*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDCP_GetHdcpCipherState(MS_U8 u8Idx, MS_U8 *pu8State)
4047*53ee8cc1Swenshuai.xi {
4048*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4049*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4050*53ee8cc1Swenshuai.xi }
4051*53ee8cc1Swenshuai.xi
MDrv_HDMI_GetM0(MS_U32 u32InputPortType,MS_U8 * pu8Data)4052*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDMI_GetM0(MS_U32 u32InputPortType, MS_U8 *pu8Data)
4053*53ee8cc1Swenshuai.xi {
4054*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4055*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4056*53ee8cc1Swenshuai.xi }
4057*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_SetKeyIndex(MS_U32 u32Index,MS_BOOL bIsOddKey)4058*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKeyIndex (MS_U32 u32Index, MS_BOOL bIsOddKey)
4059*53ee8cc1Swenshuai.xi {
4060*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT ret = DRVAESDMA_OK;
4061*53ee8cc1Swenshuai.xi
4062*53ee8cc1Swenshuai.xi if(HAL_CIPHER_KEYSLOT_BASE > u32Index || (HAL_CIPHER_KEYSLOT_BASE + HAL_CRYPTODMA_DMA_KEY_SLOT - 1) < u32Index)
4063*53ee8cc1Swenshuai.xi {
4064*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key index[0x%04u]!", (unsigned int)u32Index);
4065*53ee8cc1Swenshuai.xi return DRVAESDMA_INVALID_PARAM;
4066*53ee8cc1Swenshuai.xi }
4067*53ee8cc1Swenshuai.xi
4068*53ee8cc1Swenshuai.xi //Key from KL
4069*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
4070*53ee8cc1Swenshuai.xi _CipherKey.pu8KeyData = 0;
4071*53ee8cc1Swenshuai.xi _CipherKey.u8KeyLen = 0;
4072*53ee8cc1Swenshuai.xi _CipherKey.u8KeyIdx = u32Index - HAL_CIPHER_KEYSLOT_BASE; //SK0:0x10, SK1:0x11
4073*53ee8cc1Swenshuai.xi
4074*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u]",
4075*53ee8cc1Swenshuai.xi _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx);
4076*53ee8cc1Swenshuai.xi
4077*53ee8cc1Swenshuai.xi return ret;
4078*53ee8cc1Swenshuai.xi }
4079*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetKeyIndex(MS_U32 u32Index,MS_BOOL bIsOddKey)4080*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetKeyIndex (MS_U32 u32Index, MS_BOOL bIsOddKey)
4081*53ee8cc1Swenshuai.xi {
4082*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4083*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4084*53ee8cc1Swenshuai.xi AESDMA_KEY_INDEX pArgs;
4085*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4086*53ee8cc1Swenshuai.xi {
4087*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4088*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4089*53ee8cc1Swenshuai.xi }
4090*53ee8cc1Swenshuai.xi
4091*53ee8cc1Swenshuai.xi pArgs.bOddKeyEn = bIsOddKey;
4092*53ee8cc1Swenshuai.xi pArgs.u32KeyIndex = u32Index;
4093*53ee8cc1Swenshuai.xi
4094*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Set_Key_Index, (void*)&pArgs);
4095*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4096*53ee8cc1Swenshuai.xi {
4097*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4098*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4099*53ee8cc1Swenshuai.xi }
4100*53ee8cc1Swenshuai.xi
4101*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4102*53ee8cc1Swenshuai.xi #else
4103*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_SetKeyIndex(u32Index, bIsOddKey);
4104*53ee8cc1Swenshuai.xi #endif
4105*53ee8cc1Swenshuai.xi }
4106*53ee8cc1Swenshuai.xi
MDrv_AESDMA_SetAesCtr64(MS_BOOL bCtr64En)4107*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetAesCtr64 (MS_BOOL bCtr64En)
4108*53ee8cc1Swenshuai.xi {
4109*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4110*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4111*53ee8cc1Swenshuai.xi }
4112*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_AllocKeySlot(MS_U32 * pu32Index)4113*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_AllocKeySlot (MS_U32 *pu32Index)
4114*53ee8cc1Swenshuai.xi {
4115*53ee8cc1Swenshuai.xi MS_U32 i = 0;
4116*53ee8cc1Swenshuai.xi
4117*53ee8cc1Swenshuai.xi if(NULL == pu32Index)
4118*53ee8cc1Swenshuai.xi {
4119*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:pu32Index is NULL");
4120*53ee8cc1Swenshuai.xi return DRVAESDMA_INVALID_PARAM;
4121*53ee8cc1Swenshuai.xi }
4122*53ee8cc1Swenshuai.xi
4123*53ee8cc1Swenshuai.xi for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
4124*53ee8cc1Swenshuai.xi {
4125*53ee8cc1Swenshuai.xi if(FALSE == _CIPHER_Resource[i].bUsed)
4126*53ee8cc1Swenshuai.xi {
4127*53ee8cc1Swenshuai.xi _CIPHER_Resource[i].bUsed = TRUE;
4128*53ee8cc1Swenshuai.xi *pu32Index = i + HAL_CIPHER_KEYSLOT_BASE;
4129*53ee8cc1Swenshuai.xi break;
4130*53ee8cc1Swenshuai.xi }
4131*53ee8cc1Swenshuai.xi }
4132*53ee8cc1Swenshuai.xi
4133*53ee8cc1Swenshuai.xi if(HAL_CRYPTODMA_DMA_KEY_SLOT == i)
4134*53ee8cc1Swenshuai.xi {
4135*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:No empty key slot");
4136*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4137*53ee8cc1Swenshuai.xi }
4138*53ee8cc1Swenshuai.xi
4139*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4140*53ee8cc1Swenshuai.xi }
4141*53ee8cc1Swenshuai.xi
MDrv_AESDMA_AllocKeySlot(MS_U32 * pu32Index)4142*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_AllocKeySlot (MS_U32 *pu32Index)
4143*53ee8cc1Swenshuai.xi {
4144*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4145*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4146*53ee8cc1Swenshuai.xi AESDMA_ALLOC_KEY_SLOT pArgs;
4147*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4148*53ee8cc1Swenshuai.xi {
4149*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4150*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4151*53ee8cc1Swenshuai.xi }
4152*53ee8cc1Swenshuai.xi
4153*53ee8cc1Swenshuai.xi pArgs.pu32KeyIndex = pu32Index;
4154*53ee8cc1Swenshuai.xi
4155*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_AllocKeySlot, (void*)&pArgs);
4156*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4157*53ee8cc1Swenshuai.xi {
4158*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4159*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4160*53ee8cc1Swenshuai.xi }
4161*53ee8cc1Swenshuai.xi
4162*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4163*53ee8cc1Swenshuai.xi #else
4164*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_AllocKeySlot(pu32Index);
4165*53ee8cc1Swenshuai.xi #endif
4166*53ee8cc1Swenshuai.xi
4167*53ee8cc1Swenshuai.xi }
4168*53ee8cc1Swenshuai.xi
_MDrv_AESDMA_FreeKeySlot(MS_U32 u32Index)4169*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_FreeKeySlot (MS_U32 u32Index)
4170*53ee8cc1Swenshuai.xi {
4171*53ee8cc1Swenshuai.xi MS_U32 i = 0;
4172*53ee8cc1Swenshuai.xi
4173*53ee8cc1Swenshuai.xi if(HAL_CIPHER_KEYSLOT_BASE > u32Index || (HAL_CIPHER_KEYSLOT_BASE + HAL_CRYPTODMA_DMA_KEY_SLOT - 1) < u32Index)
4174*53ee8cc1Swenshuai.xi {
4175*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key index[0x%04u]!", (unsigned int)u32Index);
4176*53ee8cc1Swenshuai.xi return DRVAESDMA_INVALID_PARAM;
4177*53ee8cc1Swenshuai.xi }
4178*53ee8cc1Swenshuai.xi
4179*53ee8cc1Swenshuai.xi i = u32Index - HAL_CIPHER_KEYSLOT_BASE;
4180*53ee8cc1Swenshuai.xi
4181*53ee8cc1Swenshuai.xi if(DRV_CIPHER_OK != MDrv_CIPHER_ResetKey(_u32CAVid, i))
4182*53ee8cc1Swenshuai.xi {
4183*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Reset key fail, CAVid=[0x%04u], index=[0x%04u]!", (unsigned int)_u32CAVid, (unsigned int)u32Index);
4184*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4185*53ee8cc1Swenshuai.xi }
4186*53ee8cc1Swenshuai.xi
4187*53ee8cc1Swenshuai.xi _CIPHER_Resource[i].bUsed = FALSE;
4188*53ee8cc1Swenshuai.xi
4189*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4190*53ee8cc1Swenshuai.xi }
4191*53ee8cc1Swenshuai.xi
MDrv_AESDMA_FreeKeySlot(MS_U32 u32Index)4192*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_FreeKeySlot (MS_U32 u32Index)
4193*53ee8cc1Swenshuai.xi {
4194*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4195*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4196*53ee8cc1Swenshuai.xi AESDMA_KEY_INDEX pArgs;
4197*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4198*53ee8cc1Swenshuai.xi {
4199*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4200*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4201*53ee8cc1Swenshuai.xi }
4202*53ee8cc1Swenshuai.xi
4203*53ee8cc1Swenshuai.xi pArgs.u32KeyIndex = u32Index;
4204*53ee8cc1Swenshuai.xi
4205*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_FreeKeySlot, (void*)&pArgs);
4206*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4207*53ee8cc1Swenshuai.xi {
4208*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4209*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4210*53ee8cc1Swenshuai.xi }
4211*53ee8cc1Swenshuai.xi
4212*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4213*53ee8cc1Swenshuai.xi #else
4214*53ee8cc1Swenshuai.xi return _MDrv_AESDMA_FreeKeySlot(u32Index);
4215*53ee8cc1Swenshuai.xi #endif
4216*53ee8cc1Swenshuai.xi }
4217*53ee8cc1Swenshuai.xi
4218*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_NUTTX
MDrv_AESDMA_SetSecurityInfo(DrvAESDMA_SecureInfo * pSecureInfo)4219*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetSecurityInfo(DrvAESDMA_SecureInfo *pSecureInfo)
4220*53ee8cc1Swenshuai.xi {
4221*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4222*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4223*53ee8cc1Swenshuai.xi }
4224*53ee8cc1Swenshuai.xi #endif
4225*53ee8cc1Swenshuai.xi
_MDrv_RSA_Init(void)4226*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_RSA_Init(void)
4227*53ee8cc1Swenshuai.xi {
4228*53ee8cc1Swenshuai.xi MS_VIRT u32Bank;
4229*53ee8cc1Swenshuai.xi MS_PHY u32BankSize;
4230*53ee8cc1Swenshuai.xi
4231*53ee8cc1Swenshuai.xi if(_bRSA_Init == FALSE)
4232*53ee8cc1Swenshuai.xi {
4233*53ee8cc1Swenshuai.xi if(FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
4234*53ee8cc1Swenshuai.xi {
4235*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Get MMIO base fail");
4236*53ee8cc1Swenshuai.xi return FALSE;
4237*53ee8cc1Swenshuai.xi }
4238*53ee8cc1Swenshuai.xi
4239*53ee8cc1Swenshuai.xi HAL_RSA_SetBank(u32Bank);
4240*53ee8cc1Swenshuai.xi
4241*53ee8cc1Swenshuai.xi _CipherRSAMtx = MsOS_CreateMutex( E_MSOS_FIFO, (char*)"CIPHER RSA mutex", MSOS_PROCESS_SHARED);
4242*53ee8cc1Swenshuai.xi _bRSA_Init = TRUE;
4243*53ee8cc1Swenshuai.xi }
4244*53ee8cc1Swenshuai.xi return TRUE;
4245*53ee8cc1Swenshuai.xi }
4246*53ee8cc1Swenshuai.xi
_MDrv_RSA_Calculate(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAKey * pstKey,DrvAESDMA_RSAMode eMode)4247*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_Calculate(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAKey *pstKey, DrvAESDMA_RSAMode eMode)
4248*53ee8cc1Swenshuai.xi {
4249*53ee8cc1Swenshuai.xi MS_U32 ret = DRVAESDMA_OK;
4250*53ee8cc1Swenshuai.xi MS_U32 u32KeyLen = 0;
4251*53ee8cc1Swenshuai.xi MS_U8 u8Public = 0;
4252*53ee8cc1Swenshuai.xi MS_U32 *pu32Sig = NULL;
4253*53ee8cc1Swenshuai.xi
4254*53ee8cc1Swenshuai.xi if( pstSign==NULL || pstKey==NULL )
4255*53ee8cc1Swenshuai.xi {
4256*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
4257*53ee8cc1Swenshuai.xi goto RSA_CAL_FINISH;
4258*53ee8cc1Swenshuai.xi }
4259*53ee8cc1Swenshuai.xi pu32Sig = (MS_U32 *)(pstSign);
4260*53ee8cc1Swenshuai.xi
4261*53ee8cc1Swenshuai.xi if( _MDrv_RSA_Init()==FALSE )
4262*53ee8cc1Swenshuai.xi {
4263*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Init fail");
4264*53ee8cc1Swenshuai.xi ret = DRVAESDMA_FAIL;
4265*53ee8cc1Swenshuai.xi goto RSA_CAL_FINISH;
4266*53ee8cc1Swenshuai.xi }
4267*53ee8cc1Swenshuai.xi
4268*53ee8cc1Swenshuai.xi MsOS_ObtainMutex( _CipherRSAMtx, MSOS_WAIT_FOREVER);
4269*53ee8cc1Swenshuai.xi
4270*53ee8cc1Swenshuai.xi HAL_RSA_Reset();
4271*53ee8cc1Swenshuai.xi HAL_RSA_Ind32Ctrl(RAM_WRITE);
4272*53ee8cc1Swenshuai.xi
4273*53ee8cc1Swenshuai.xi switch (eMode)
4274*53ee8cc1Swenshuai.xi {
4275*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA1024_PUBLIC:
4276*53ee8cc1Swenshuai.xi {
4277*53ee8cc1Swenshuai.xi u32KeyLen = 128;
4278*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4279*53ee8cc1Swenshuai.xi break;
4280*53ee8cc1Swenshuai.xi }
4281*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA1024_PRIVATE:
4282*53ee8cc1Swenshuai.xi {
4283*53ee8cc1Swenshuai.xi u32KeyLen = 128;
4284*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PRIV_KEY;
4285*53ee8cc1Swenshuai.xi break;
4286*53ee8cc1Swenshuai.xi }
4287*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA2048_PUBLIC:
4288*53ee8cc1Swenshuai.xi {
4289*53ee8cc1Swenshuai.xi u32KeyLen = 256;
4290*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4291*53ee8cc1Swenshuai.xi break;
4292*53ee8cc1Swenshuai.xi }
4293*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA2048_PRIVATE:
4294*53ee8cc1Swenshuai.xi {
4295*53ee8cc1Swenshuai.xi u32KeyLen = 256;
4296*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PRIV_KEY;
4297*53ee8cc1Swenshuai.xi break;
4298*53ee8cc1Swenshuai.xi }
4299*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA256_PUBLIC:
4300*53ee8cc1Swenshuai.xi {
4301*53ee8cc1Swenshuai.xi u32KeyLen = 32;
4302*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4303*53ee8cc1Swenshuai.xi break;
4304*53ee8cc1Swenshuai.xi }
4305*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA256_PRIVATE:
4306*53ee8cc1Swenshuai.xi {
4307*53ee8cc1Swenshuai.xi u32KeyLen = 32;
4308*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PRIV_KEY;
4309*53ee8cc1Swenshuai.xi break;
4310*53ee8cc1Swenshuai.xi }
4311*53ee8cc1Swenshuai.xi default:
4312*53ee8cc1Swenshuai.xi {
4313*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
4314*53ee8cc1Swenshuai.xi goto RSA_CAL_FINISH;
4315*53ee8cc1Swenshuai.xi }
4316*53ee8cc1Swenshuai.xi }
4317*53ee8cc1Swenshuai.xi
4318*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "RSA Mode[%d]", eMode);
4319*53ee8cc1Swenshuai.xi
4320*53ee8cc1Swenshuai.xi HAL_RSA_LoadSram((pstKey->u32KeyE), E_RSA_ADDRESS_E);
4321*53ee8cc1Swenshuai.xi HAL_RSA_LoadSram((pstKey->u32KeyN), E_RSA_ADDRESS_N);
4322*53ee8cc1Swenshuai.xi HAL_RSA_LoadSram(pu32Sig, E_RSA_ADDRESS_A);
4323*53ee8cc1Swenshuai.xi
4324*53ee8cc1Swenshuai.xi HAL_RSA_SetKeyLength((u32KeyLen/RSA_UNIT_SIZE)-1);
4325*53ee8cc1Swenshuai.xi HAL_RSA_SetKeyType(E_RSA_USE_SW_KEY, u8Public); //sw key, public key
4326*53ee8cc1Swenshuai.xi HAL_RSA_ExponetialStart();
4327*53ee8cc1Swenshuai.xi
4328*53ee8cc1Swenshuai.xi RSA_CAL_FINISH:
4329*53ee8cc1Swenshuai.xi return ret;
4330*53ee8cc1Swenshuai.xi }
4331*53ee8cc1Swenshuai.xi
MDrv_RSA_Calculate(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAKey * pstKey,DrvAESDMA_RSAMode eMode)4332*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_Calculate(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAKey *pstKey, DrvAESDMA_RSAMode eMode)
4333*53ee8cc1Swenshuai.xi {
4334*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4335*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4336*53ee8cc1Swenshuai.xi RSA_CALCULATE pArgs;
4337*53ee8cc1Swenshuai.xi
4338*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4339*53ee8cc1Swenshuai.xi {
4340*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_AESDMA, &pu32AesdmaInst, 0x0, NULL))
4341*53ee8cc1Swenshuai.xi {
4342*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaOpen CIPHER fail");
4343*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4344*53ee8cc1Swenshuai.xi }
4345*53ee8cc1Swenshuai.xi }
4346*53ee8cc1Swenshuai.xi
4347*53ee8cc1Swenshuai.xi pArgs.pstSign = pstSign;
4348*53ee8cc1Swenshuai.xi pArgs.pstKey = pstKey;
4349*53ee8cc1Swenshuai.xi pArgs.eMode = eMode;
4350*53ee8cc1Swenshuai.xi
4351*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_Calculate, (void*)&pArgs);
4352*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4353*53ee8cc1Swenshuai.xi {
4354*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4355*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4356*53ee8cc1Swenshuai.xi }
4357*53ee8cc1Swenshuai.xi
4358*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4359*53ee8cc1Swenshuai.xi #else
4360*53ee8cc1Swenshuai.xi return _MDrv_RSA_Calculate(pstSign, pstKey, eMode);
4361*53ee8cc1Swenshuai.xi #endif
4362*53ee8cc1Swenshuai.xi }
MDrv_RSA_Calculate_Hw_Key(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAHwKeyMode eMode)4363*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_RSA_Calculate_Hw_Key(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAHwKeyMode eMode)
4364*53ee8cc1Swenshuai.xi {
4365*53ee8cc1Swenshuai.xi MS_U32 ret = DRVAESDMA_OK;
4366*53ee8cc1Swenshuai.xi MS_U8 u8KeySrc= 0;
4367*53ee8cc1Swenshuai.xi MS_U8 u8Public = 0;
4368*53ee8cc1Swenshuai.xi MS_U32 *pu32Sig = NULL;
4369*53ee8cc1Swenshuai.xi MS_U32 u32SwitchValue;
4370*53ee8cc1Swenshuai.xi
4371*53ee8cc1Swenshuai.xi if( pstSign==NULL )
4372*53ee8cc1Swenshuai.xi {
4373*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
4374*53ee8cc1Swenshuai.xi goto RSA_CAL_HW_FINISH;
4375*53ee8cc1Swenshuai.xi }
4376*53ee8cc1Swenshuai.xi pu32Sig = (MS_U32 *)(pstSign);
4377*53ee8cc1Swenshuai.xi
4378*53ee8cc1Swenshuai.xi if( _MDrv_RSA_Init()==FALSE )
4379*53ee8cc1Swenshuai.xi {
4380*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Init fail");
4381*53ee8cc1Swenshuai.xi ret = DRVAESDMA_FAIL;
4382*53ee8cc1Swenshuai.xi goto RSA_CAL_HW_FINISH;
4383*53ee8cc1Swenshuai.xi }
4384*53ee8cc1Swenshuai.xi
4385*53ee8cc1Swenshuai.xi MsOS_ObtainMutex( _CipherRSAMtx, MSOS_WAIT_FOREVER);
4386*53ee8cc1Swenshuai.xi
4387*53ee8cc1Swenshuai.xi HAL_RSA_Reset();
4388*53ee8cc1Swenshuai.xi HAL_RSA_Ind32Ctrl(RAM_WRITE);
4389*53ee8cc1Swenshuai.xi
4390*53ee8cc1Swenshuai.xi switch (eMode)
4391*53ee8cc1Swenshuai.xi {
4392*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA_HWKEY_PRIVATE:
4393*53ee8cc1Swenshuai.xi {
4394*53ee8cc1Swenshuai.xi u8KeySrc = E_RSA_HW_PRI_KEY;
4395*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PRIV_KEY;
4396*53ee8cc1Swenshuai.xi break;
4397*53ee8cc1Swenshuai.xi }
4398*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA_HWKEY_PUBLIC1:
4399*53ee8cc1Swenshuai.xi {
4400*53ee8cc1Swenshuai.xi u8KeySrc = E_RSA_HW_PUB_KEY1;
4401*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4402*53ee8cc1Swenshuai.xi break;
4403*53ee8cc1Swenshuai.xi }
4404*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA_HWKEY_PUBLIC2:
4405*53ee8cc1Swenshuai.xi {
4406*53ee8cc1Swenshuai.xi u8KeySrc = E_RSA_HW_PUB_KEY2;
4407*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4408*53ee8cc1Swenshuai.xi break;
4409*53ee8cc1Swenshuai.xi }
4410*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA_HWKEY_ROM_PRIVATE:
4411*53ee8cc1Swenshuai.xi {
4412*53ee8cc1Swenshuai.xi u8KeySrc = E_RSA_HW_PRI_KEY;
4413*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PRIV_KEY;
4414*53ee8cc1Swenshuai.xi break;
4415*53ee8cc1Swenshuai.xi }
4416*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA_HWKEY_ROM_PUBLIC:
4417*53ee8cc1Swenshuai.xi {
4418*53ee8cc1Swenshuai.xi u8KeySrc = E_RSA_HW_PUB_KEY1;
4419*53ee8cc1Swenshuai.xi u8Public = E_RSA_USE_PUB_KEY;
4420*53ee8cc1Swenshuai.xi break;
4421*53ee8cc1Swenshuai.xi }
4422*53ee8cc1Swenshuai.xi default:
4423*53ee8cc1Swenshuai.xi {
4424*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
4425*53ee8cc1Swenshuai.xi goto RSA_CAL_HW_FINISH;
4426*53ee8cc1Swenshuai.xi }
4427*53ee8cc1Swenshuai.xi }
4428*53ee8cc1Swenshuai.xi
4429*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:RSA Mode[%d], Key Source[%u], Public[%u]",
4430*53ee8cc1Swenshuai.xi eMode, u8KeySrc, u8Public);
4431*53ee8cc1Swenshuai.xi
4432*53ee8cc1Swenshuai.xi if(eMode == E_DRVAESDMA_RSA_HWKEY_ROM_PRIVATE || eMode == E_DRVAESDMA_RSA_HWKEY_ROM_PUBLIC)
4433*53ee8cc1Swenshuai.xi {
4434*53ee8cc1Swenshuai.xi HAL_RSA_Hwkey_Switch();
4435*53ee8cc1Swenshuai.xi
4436*53ee8cc1Swenshuai.xi u32SwitchValue = HAL_RSA_Read_Hwkey_Switch();
4437*53ee8cc1Swenshuai.xi
4438*53ee8cc1Swenshuai.xi if( u32SwitchValue != 1 )
4439*53ee8cc1Swenshuai.xi {
4440*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Hwkey Switch fail");
4441*53ee8cc1Swenshuai.xi ret = DRVAESDMA_FAIL;
4442*53ee8cc1Swenshuai.xi goto RSA_CAL_HW_FINISH;
4443*53ee8cc1Swenshuai.xi }
4444*53ee8cc1Swenshuai.xi }
4445*53ee8cc1Swenshuai.xi
4446*53ee8cc1Swenshuai.xi HAL_RSA_LoadSram(pu32Sig, E_RSA_ADDRESS_A);
4447*53ee8cc1Swenshuai.xi
4448*53ee8cc1Swenshuai.xi HAL_RSA_SetKeyType(E_RSA_USE_HW_KEY, u8Public);
4449*53ee8cc1Swenshuai.xi HAL_RSA_Rootkey_Sel(u8KeySrc);
4450*53ee8cc1Swenshuai.xi HAL_RSA_ExponetialStart();
4451*53ee8cc1Swenshuai.xi
4452*53ee8cc1Swenshuai.xi RSA_CAL_HW_FINISH:
4453*53ee8cc1Swenshuai.xi return ret;
4454*53ee8cc1Swenshuai.xi }
4455*53ee8cc1Swenshuai.xi
_MDrv_RSA_IsFinished(void)4456*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_IsFinished(void)
4457*53ee8cc1Swenshuai.xi {
4458*53ee8cc1Swenshuai.xi RSAInitChk();
4459*53ee8cc1Swenshuai.xi
4460*53ee8cc1Swenshuai.xi if(HAL_RSA_Get_RSA_IsFinished()==0)
4461*53ee8cc1Swenshuai.xi {
4462*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4463*53ee8cc1Swenshuai.xi }
4464*53ee8cc1Swenshuai.xi else
4465*53ee8cc1Swenshuai.xi {
4466*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:RSA Not Done!");
4467*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4468*53ee8cc1Swenshuai.xi }
4469*53ee8cc1Swenshuai.xi }
4470*53ee8cc1Swenshuai.xi
MDrv_RSA_IsFinished(void)4471*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_IsFinished(void)
4472*53ee8cc1Swenshuai.xi {
4473*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4474*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4475*53ee8cc1Swenshuai.xi MS_U32 u32TimeOut = RSA_DEFAULT_TIMEOUT_VALUE;
4476*53ee8cc1Swenshuai.xi
4477*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4478*53ee8cc1Swenshuai.xi {
4479*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4480*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4481*53ee8cc1Swenshuai.xi }
4482*53ee8cc1Swenshuai.xi
4483*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_IsFinished, (void*)&u32TimeOut);
4484*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4485*53ee8cc1Swenshuai.xi {
4486*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4487*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4488*53ee8cc1Swenshuai.xi }
4489*53ee8cc1Swenshuai.xi
4490*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4491*53ee8cc1Swenshuai.xi #else
4492*53ee8cc1Swenshuai.xi return _MDrv_RSA_IsFinished();
4493*53ee8cc1Swenshuai.xi #endif
4494*53ee8cc1Swenshuai.xi }
4495*53ee8cc1Swenshuai.xi
_MDrv_RSA_Output(DrvAESDMA_RSAMode eMode,DrvAESDMA_RSAOut * pstRSAOut)4496*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_Output(DrvAESDMA_RSAMode eMode, DrvAESDMA_RSAOut *pstRSAOut)
4497*53ee8cc1Swenshuai.xi {
4498*53ee8cc1Swenshuai.xi MS_U32 ret = DRVAESDMA_OK;
4499*53ee8cc1Swenshuai.xi MS_U32 i = 0;
4500*53ee8cc1Swenshuai.xi MS_U32 u32KeyLen = 0;
4501*53ee8cc1Swenshuai.xi MS_U32 *pu32RSAOut = (MS_U32 *)(pstRSAOut->u32RSAOut);
4502*53ee8cc1Swenshuai.xi
4503*53ee8cc1Swenshuai.xi RSAInitChk();
4504*53ee8cc1Swenshuai.xi
4505*53ee8cc1Swenshuai.xi switch (eMode)
4506*53ee8cc1Swenshuai.xi {
4507*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA1024_PUBLIC:
4508*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA1024_PRIVATE:
4509*53ee8cc1Swenshuai.xi {
4510*53ee8cc1Swenshuai.xi u32KeyLen = 128;
4511*53ee8cc1Swenshuai.xi break;
4512*53ee8cc1Swenshuai.xi }
4513*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA2048_PUBLIC:
4514*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA2048_PRIVATE:
4515*53ee8cc1Swenshuai.xi {
4516*53ee8cc1Swenshuai.xi u32KeyLen = 256;
4517*53ee8cc1Swenshuai.xi break;
4518*53ee8cc1Swenshuai.xi }
4519*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA256_PUBLIC:
4520*53ee8cc1Swenshuai.xi case E_DRVAESDMA_RSA256_PRIVATE:
4521*53ee8cc1Swenshuai.xi {
4522*53ee8cc1Swenshuai.xi u32KeyLen = 32;
4523*53ee8cc1Swenshuai.xi break;
4524*53ee8cc1Swenshuai.xi }
4525*53ee8cc1Swenshuai.xi default:
4526*53ee8cc1Swenshuai.xi {
4527*53ee8cc1Swenshuai.xi ret = DRVAESDMA_INVALID_PARAM;
4528*53ee8cc1Swenshuai.xi goto RSA_OUTPUT_FINISH;
4529*53ee8cc1Swenshuai.xi }
4530*53ee8cc1Swenshuai.xi }
4531*53ee8cc1Swenshuai.xi
4532*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:RSA Mode[%d], Key length[%u]", eMode, u32KeyLen);
4533*53ee8cc1Swenshuai.xi
4534*53ee8cc1Swenshuai.xi HAL_RSA_SetFileOutAddr(64-(u32KeyLen/sizeof(MS_U32)));
4535*53ee8cc1Swenshuai.xi HAL_RSA_Ind32Ctrl(RAM_READ);
4536*53ee8cc1Swenshuai.xi HAL_RSA_FileOutStart();
4537*53ee8cc1Swenshuai.xi for( i = 0; i<(u32KeyLen/RSA_UNIT_SIZE); i++)
4538*53ee8cc1Swenshuai.xi {
4539*53ee8cc1Swenshuai.xi pu32RSAOut[(u32KeyLen/RSA_UNIT_SIZE)-1-i] = HAL_RSA_FileOut();
4540*53ee8cc1Swenshuai.xi }
4541*53ee8cc1Swenshuai.xi
4542*53ee8cc1Swenshuai.xi RSA_OUTPUT_FINISH:
4543*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_CipherRSAMtx);
4544*53ee8cc1Swenshuai.xi return ret;
4545*53ee8cc1Swenshuai.xi }
MDrv_RSA_Output(DrvAESDMA_RSAMode eMode,DrvAESDMA_RSAOut * pstRSAOut)4546*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_Output(DrvAESDMA_RSAMode eMode, DrvAESDMA_RSAOut *pstRSAOut)
4547*53ee8cc1Swenshuai.xi {
4548*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4549*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4550*53ee8cc1Swenshuai.xi RSA_OUTPUT pArgs;
4551*53ee8cc1Swenshuai.xi if(pu32AesdmaInst == NULL)
4552*53ee8cc1Swenshuai.xi {
4553*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4554*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4555*53ee8cc1Swenshuai.xi }
4556*53ee8cc1Swenshuai.xi
4557*53ee8cc1Swenshuai.xi pArgs.eMode = eMode;
4558*53ee8cc1Swenshuai.xi pArgs.pstRSAOut = pstRSAOut;
4559*53ee8cc1Swenshuai.xi
4560*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_Output, (void*)&pArgs);
4561*53ee8cc1Swenshuai.xi if(UTOPIA_STATUS_SUCCESS != u32Ret)
4562*53ee8cc1Swenshuai.xi {
4563*53ee8cc1Swenshuai.xi DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4564*53ee8cc1Swenshuai.xi return DRVAESDMA_FAIL;
4565*53ee8cc1Swenshuai.xi }
4566*53ee8cc1Swenshuai.xi
4567*53ee8cc1Swenshuai.xi return DRVAESDMA_OK;
4568*53ee8cc1Swenshuai.xi #else
4569*53ee8cc1Swenshuai.xi return _MDrv_RSA_Output(eMode, pstRSAOut);
4570*53ee8cc1Swenshuai.xi #endif
4571*53ee8cc1Swenshuai.xi }
4572*53ee8cc1Swenshuai.xi
4573*53ee8cc1Swenshuai.xi
4574