xref: /utopia/UTPA2-700.0.x/modules/dscmb/api/nsk2hdi/nsk2hdi_bl.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi 
2*53ee8cc1Swenshuai.xi #include <stdlib.h>
3*53ee8cc1Swenshuai.xi #include <string.h>
4*53ee8cc1Swenshuai.xi #include "MsCommon.h"
5*53ee8cc1Swenshuai.xi 
6*53ee8cc1Swenshuai.xi #include "nsk2hdi_bl.h"
7*53ee8cc1Swenshuai.xi #include "nsk_dbg.h"
8*53ee8cc1Swenshuai.xi #include "drvCIPHER.h"
9*53ee8cc1Swenshuai.xi #include "nsk2hdi_header.h"
10*53ee8cc1Swenshuai.xi 
11*53ee8cc1Swenshuai.xi /*****************************************************************************\
12*53ee8cc1Swenshuai.xi   \Definitions
13*53ee8cc1Swenshuai.xi \*****************************************************************************/
14*53ee8cc1Swenshuai.xi #define SHA1_SIZE   (20)
15*53ee8cc1Swenshuai.xi #define SHA256_SIZE (32)
16*53ee8cc1Swenshuai.xi #define MD5_SIZE    (16)
17*53ee8cc1Swenshuai.xi 
18*53ee8cc1Swenshuai.xi #define MaximumHashSize  SHA256_SIZE
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi 
21*53ee8cc1Swenshuai.xi 
22*53ee8cc1Swenshuai.xi /*****************************************************************************\
23*53ee8cc1Swenshuai.xi   \ typedef struct
24*53ee8cc1Swenshuai.xi \*****************************************************************************/
25*53ee8cc1Swenshuai.xi 
26*53ee8cc1Swenshuai.xi 
27*53ee8cc1Swenshuai.xi typedef struct _bl_capability_descriptor {
28*53ee8cc1Swenshuai.xi     NDS_UBYTE       descriptor_tag;         // NSK2HDI_BL_CAPABILITY_DESC_TAG
29*53ee8cc1Swenshuai.xi     NDS_UBYTE       len;
30*53ee8cc1Swenshuai.xi     NDS_UBYTE       max_data_size[4];
31*53ee8cc1Swenshuai.xi     NDS_UBYTE       min_data_size[4];
32*53ee8cc1Swenshuai.xi     NDS_UBYTE       data_size_granularity[4];
33*53ee8cc1Swenshuai.xi     NDS_UBYTE       data_alignment[4];
34*53ee8cc1Swenshuai.xi } BL_CAPABILITY_DESCRIPTOR;
35*53ee8cc1Swenshuai.xi 
36*53ee8cc1Swenshuai.xi typedef struct _bl_hashing_algorithm_descriptor {
37*53ee8cc1Swenshuai.xi     NDS_UBYTE       descriptor_tag;         // NSK2HDI_BL_ALGORITHM_DESC_TAG
38*53ee8cc1Swenshuai.xi     NDS_UBYTE       len;
39*53ee8cc1Swenshuai.xi     NDS_UBYTE       algorithm;
40*53ee8cc1Swenshuai.xi     //NDS_UBYTE       hash_block_size[2];
41*53ee8cc1Swenshuai.xi } BL_HASHING_ALGORITHM_DESCRIPTOR;
42*53ee8cc1Swenshuai.xi 
43*53ee8cc1Swenshuai.xi typedef struct _bl_desc {
44*53ee8cc1Swenshuai.xi     BL_CAPABILITY_DESCRIPTOR            m_cap;
45*53ee8cc1Swenshuai.xi     BL_HASHING_ALGORITHM_DESCRIPTOR     m_algo;
46*53ee8cc1Swenshuai.xi } BL_DESC;
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi 
49*53ee8cc1Swenshuai.xi 
50*53ee8cc1Swenshuai.xi /*****************************************************************************\
51*53ee8cc1Swenshuai.xi   \ local variables
52*53ee8cc1Swenshuai.xi \*****************************************************************************/
53*53ee8cc1Swenshuai.xi 
54*53ee8cc1Swenshuai.xi 
55*53ee8cc1Swenshuai.xi static BL_CAPABILITY_DESCRIPTOR m_cap_des = {
56*53ee8cc1Swenshuai.xi     .descriptor_tag       = NSK2HDI_BL_CAPABILITY_DESC_TAG,
57*53ee8cc1Swenshuai.xi     .len                  = sizeof(BL_CAPABILITY_DESCRIPTOR) - 2,
58*53ee8cc1Swenshuai.xi     .max_data_size[0] = 0,
59*53ee8cc1Swenshuai.xi     .max_data_size[1] = 0,
60*53ee8cc1Swenshuai.xi     .max_data_size[2] = 0x80,
61*53ee8cc1Swenshuai.xi     .max_data_size[3] = 0,
62*53ee8cc1Swenshuai.xi     .min_data_size[0] = 0x01,
63*53ee8cc1Swenshuai.xi     .data_size_granularity[0] = 0x10,
64*53ee8cc1Swenshuai.xi     .data_alignment[0] = 0x10,
65*53ee8cc1Swenshuai.xi };
66*53ee8cc1Swenshuai.xi 
67*53ee8cc1Swenshuai.xi 
68*53ee8cc1Swenshuai.xi static BL_HASHING_ALGORITHM_DESCRIPTOR m_algo_des[3] = {
69*53ee8cc1Swenshuai.xi     {
70*53ee8cc1Swenshuai.xi         .descriptor_tag = NSK2HDI_BL_ALGORITHM_DESC_TAG,
71*53ee8cc1Swenshuai.xi         .len            = sizeof(BL_HASHING_ALGORITHM_DESCRIPTOR) - 2,
72*53ee8cc1Swenshuai.xi         .algorithm      = NSK2HDI_BL_SHA1_HASH_ALG_TYPE,
73*53ee8cc1Swenshuai.xi         //.hash_block_size[0] = 0x0,
74*53ee8cc1Swenshuai.xi         //.hash_block_size[1] = 0x1,
75*53ee8cc1Swenshuai.xi 
76*53ee8cc1Swenshuai.xi     },
77*53ee8cc1Swenshuai.xi 
78*53ee8cc1Swenshuai.xi     {
79*53ee8cc1Swenshuai.xi         .descriptor_tag = NSK2HDI_BL_ALGORITHM_DESC_TAG,
80*53ee8cc1Swenshuai.xi         .len            = sizeof(BL_HASHING_ALGORITHM_DESCRIPTOR) - 2,
81*53ee8cc1Swenshuai.xi         .algorithm      = NSK2HDI_BL_SHA256_HASH_ALG_TYPE,
82*53ee8cc1Swenshuai.xi         //.hash_block_size[0] = 0x0,
83*53ee8cc1Swenshuai.xi         //.hash_block_size[1] = 0x1,
84*53ee8cc1Swenshuai.xi 
85*53ee8cc1Swenshuai.xi     },
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi     {
88*53ee8cc1Swenshuai.xi         .descriptor_tag = NSK2HDI_BL_ALGORITHM_DESC_TAG,
89*53ee8cc1Swenshuai.xi         .len            = sizeof(BL_HASHING_ALGORITHM_DESCRIPTOR) - 2,
90*53ee8cc1Swenshuai.xi         .algorithm      = NSK2HDI_BL_MD5_HASH_ALG_TYPE,
91*53ee8cc1Swenshuai.xi         //.hash_block_size[0] = 0x0,
92*53ee8cc1Swenshuai.xi         //.hash_block_size[1] = 0x1,
93*53ee8cc1Swenshuai.xi 
94*53ee8cc1Swenshuai.xi     },
95*53ee8cc1Swenshuai.xi 
96*53ee8cc1Swenshuai.xi };
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi static BL_HASHING_ALGORITHM_DESCRIPTOR ghash_algo;
100*53ee8cc1Swenshuai.xi static NDS_ULONG ghash_data_size;  // IN
101*53ee8cc1Swenshuai.xi static NDS_UBYTE *gphash_data;   // IN
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi static MS_U8 HASH_OUTPUT[MaximumHashSize];
104*53ee8cc1Swenshuai.xi static MS_U8 HASH_Middle_OUTPUT[MaximumHashSize];
105*53ee8cc1Swenshuai.xi static MS_U32 HASH_ACCU = 0;
106*53ee8cc1Swenshuai.xi static NDS_UBYTE manual_mode = FALSE;
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi static CIPHER_HASH_STAGE operation_stage = E_CIPHER_HASH_STAGE_FIRST;
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi /*****************************************************************************\
111*53ee8cc1Swenshuai.xi   \ global variables
112*53ee8cc1Swenshuai.xi \*****************************************************************************/
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi /*****************************************************************************\
116*53ee8cc1Swenshuai.xi   \ NSK2HDI bootloader related functions
117*53ee8cc1Swenshuai.xi \*****************************************************************************/
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi 
_DumpBuf(const MS_U8 * buf,MS_U32 len)120*53ee8cc1Swenshuai.xi static void _DumpBuf(const MS_U8 *buf, MS_U32 len)
121*53ee8cc1Swenshuai.xi {
122*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
123*53ee8cc1Swenshuai.xi     for (i = 0; i < len; i++) {
124*53ee8cc1Swenshuai.xi         printf("0x%02x%c", buf[i], ((i % 16) == 15) ? '\n' : ' ');
125*53ee8cc1Swenshuai.xi     }
126*53ee8cc1Swenshuai.xi     printf("\n");
127*53ee8cc1Swenshuai.xi }
128*53ee8cc1Swenshuai.xi 
NSK2HDI_CalHASH_Auto(NDS_ULONG data_size,const NDS_UBYTE * data,NDS_ULONG * digest_size,NDS_UBYTE * digest,NDS_ULONG algorithm)129*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_CalHASH_Auto(NDS_ULONG           data_size,      // IN
130*53ee8cc1Swenshuai.xi                                     const NDS_UBYTE     *data,          // IN
131*53ee8cc1Swenshuai.xi                                     NDS_ULONG           *digest_size,   // IN/OUT
132*53ee8cc1Swenshuai.xi                                     NDS_UBYTE           *digest,
133*53ee8cc1Swenshuai.xi                                     NDS_ULONG           algorithm )
134*53ee8cc1Swenshuai.xi {
135*53ee8cc1Swenshuai.xi     DRV_CIPHER_HASHCFG cipher_cfg;
136*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret;
137*53ee8cc1Swenshuai.xi     NDS_ULONG OutputSize = SHA1_SIZE;
138*53ee8cc1Swenshuai.xi     MS_U32 u32CmdId,u32Exception;
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi     _DumpBuf(data,data_size);
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi     memset(&cipher_cfg, 0x0, sizeof(DRV_CIPHER_HASHCFG));
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi     cipher_cfg.u32CAVid = 0xf;
147*53ee8cc1Swenshuai.xi     if(NSK2HDI_BL_SHA1_HASH_ALG_TYPE == algorithm)
148*53ee8cc1Swenshuai.xi     {
149*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_SHA1;
150*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = SHA1_SIZE;
151*53ee8cc1Swenshuai.xi     }
152*53ee8cc1Swenshuai.xi     else if(NSK2HDI_BL_SHA256_HASH_ALG_TYPE == algorithm)
153*53ee8cc1Swenshuai.xi     {
154*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_SHA256;
155*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = SHA256_SIZE;
156*53ee8cc1Swenshuai.xi     }
157*53ee8cc1Swenshuai.xi     else if(NSK2HDI_BL_MD5_HASH_ALG_TYPE == algorithm)
158*53ee8cc1Swenshuai.xi     {
159*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_MD5;
160*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = MD5_SIZE;
161*53ee8cc1Swenshuai.xi     }
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi     NSK_TRACE(("eAlgo = %d, OutputSize = %x\n",cipher_cfg.eAlgo,OutputSize));
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi     MS_U8 *pTestInput, *pTestOutput;
166*53ee8cc1Swenshuai.xi     pTestInput = MApi_NSK2_AllocateMemory(data_size, FALSE);
167*53ee8cc1Swenshuai.xi     pTestOutput = MApi_NSK2_AllocateMemory(OutputSize, FALSE);
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi     memcpy(pTestInput,data,data_size);
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi     cipher_cfg.stInput.u32Addr = MsOS_VA2PA((MS_VIRT)pTestInput);
172*53ee8cc1Swenshuai.xi     cipher_cfg.stInput.u32Size = data_size;
173*53ee8cc1Swenshuai.xi     cipher_cfg.pu8Digest_Buf = (MS_U8 *)pTestOutput;
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi     ret = MDrv_CIPHER_HASH(cipher_cfg, &u32CmdId);
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi     if(ret != 0)
179*53ee8cc1Swenshuai.xi     {
180*53ee8cc1Swenshuai.xi         NSK_ERROR(("HASH FAIL!!!\n"));
181*53ee8cc1Swenshuai.xi         return NSK2HDI_STATUS_FAILED;
182*53ee8cc1Swenshuai.xi     }
183*53ee8cc1Swenshuai.xi 
184*53ee8cc1Swenshuai.xi     while(FALSE == MDrv_CIPHER_IsHASHDone(u32CmdId,&u32Exception))
185*53ee8cc1Swenshuai.xi     {
186*53ee8cc1Swenshuai.xi         MsOS_DelayTask(20);
187*53ee8cc1Swenshuai.xi     }
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi     memcpy(HASH_OUTPUT,pTestOutput,OutputSize);
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi     _DumpBuf(HASH_OUTPUT, OutputSize);
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi     memcpy(digest, HASH_OUTPUT, OutputSize);
194*53ee8cc1Swenshuai.xi     *digest_size = OutputSize;
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi     MApi_NSK2_FreeMemory(pTestInput, FALSE);
197*53ee8cc1Swenshuai.xi     MApi_NSK2_FreeMemory(pTestOutput, FALSE);
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
203*53ee8cc1Swenshuai.xi }
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi 
NSK2HDI_CalHASH_Manual(NDS_ULONG data_size,const NDS_UBYTE * data,NDS_ULONG * digest_size,NDS_UBYTE * digest,NDS_ULONG algorithm,CIPHER_HASH_STAGE stage)206*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_CalHASH_Manual( NDS_ULONG           data_size,      // IN
207*53ee8cc1Swenshuai.xi                                        const NDS_UBYTE     *data,          // IN
208*53ee8cc1Swenshuai.xi                                        NDS_ULONG           *digest_size,   // IN/OUT
209*53ee8cc1Swenshuai.xi                                        NDS_UBYTE           *digest,
210*53ee8cc1Swenshuai.xi                                        NDS_ULONG           algorithm,
211*53ee8cc1Swenshuai.xi                                        CIPHER_HASH_STAGE   stage)
212*53ee8cc1Swenshuai.xi {
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     DRV_CIPHER_HASHCFG_MANUAL cipher_cfg;
217*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET     ret = DRV_CIPHER_OK;
218*53ee8cc1Swenshuai.xi     NDS_ULONG          OutputSize = SHA1_SIZE;
219*53ee8cc1Swenshuai.xi     MS_U32             u32CmdId,u32Exception;
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi     memset(&cipher_cfg, 0, sizeof(cipher_cfg));
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi     if(NSK2HDI_BL_SHA1_HASH_ALG_TYPE == algorithm)
224*53ee8cc1Swenshuai.xi     {
225*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_SHA1;
226*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = SHA1_SIZE;
227*53ee8cc1Swenshuai.xi     }
228*53ee8cc1Swenshuai.xi     else if(NSK2HDI_BL_SHA256_HASH_ALG_TYPE == algorithm)
229*53ee8cc1Swenshuai.xi     {
230*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_SHA256;
231*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = SHA256_SIZE;
232*53ee8cc1Swenshuai.xi     }
233*53ee8cc1Swenshuai.xi     else if(NSK2HDI_BL_MD5_HASH_ALG_TYPE == algorithm)
234*53ee8cc1Swenshuai.xi     {
235*53ee8cc1Swenshuai.xi         cipher_cfg.eAlgo = E_CIPHER_HASH_ALGO_MD5;
236*53ee8cc1Swenshuai.xi         cipher_cfg.u32Digest_Buf_Size = OutputSize = MD5_SIZE;
237*53ee8cc1Swenshuai.xi     }
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi     MS_U8 *pTestInput, *pTestOutput, *pTestMidOutput;
240*53ee8cc1Swenshuai.xi     pTestInput = MApi_NSK2_AllocateMemory(data_size, FALSE);
241*53ee8cc1Swenshuai.xi     pTestOutput = MApi_NSK2_AllocateMemory(OutputSize, FALSE);
242*53ee8cc1Swenshuai.xi     pTestMidOutput = MApi_NSK2_AllocateMemory(OutputSize, FALSE);
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi     memcpy(pTestMidOutput,HASH_Middle_OUTPUT,OutputSize);
245*53ee8cc1Swenshuai.xi     memcpy(pTestInput,data,data_size);
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi     cipher_cfg.u32CAVid = 0xf;
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi     cipher_cfg.stInput.u32Addr = MsOS_VA2PA((MS_VIRT)pTestInput);
250*53ee8cc1Swenshuai.xi     cipher_cfg.stInput.u32Size = data_size;
251*53ee8cc1Swenshuai.xi     cipher_cfg.pu8Digest_Buf = (MS_U8 *)pTestOutput;
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi     NSK_TRACE(("stage = %d, data_size = %x\n",stage, data_size));
254*53ee8cc1Swenshuai.xi     NSK_TRACE((" HASH_ACCU = %d\n",HASH_ACCU));
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi #if 0
257*53ee8cc1Swenshuai.xi     if(data_size == 1)
258*53ee8cc1Swenshuai.xi     {
259*53ee8cc1Swenshuai.xi         printf("final data = %x\n",*data);
260*53ee8cc1Swenshuai.xi     }
261*53ee8cc1Swenshuai.xi #endif
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi     if(stage == E_CIPHER_HASH_STAGE_FIRST)
264*53ee8cc1Swenshuai.xi     {
265*53ee8cc1Swenshuai.xi         NSK_TRACE(("E_CIPHER_HASH_STAGE_FIRST\n"));
266*53ee8cc1Swenshuai.xi         cipher_cfg.eStage = E_CIPHER_HASH_STAGE_FIRST;
267*53ee8cc1Swenshuai.xi         cipher_cfg.u32StartByte = 0;
268*53ee8cc1Swenshuai.xi         cipher_cfg.pu8SetIV = NULL;
269*53ee8cc1Swenshuai.xi         cipher_cfg.eIVMode = E_CIPHER_HASH_IV_FIPS;
270*53ee8cc1Swenshuai.xi         ret = MDrv_CIPHER_HASHManual(cipher_cfg, &u32CmdId);
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi         while(FALSE == MDrv_CIPHER_IsHASHDone(u32CmdId,&u32Exception))
273*53ee8cc1Swenshuai.xi         {
274*53ee8cc1Swenshuai.xi             MsOS_DelayTask(20);
275*53ee8cc1Swenshuai.xi         }
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi         HASH_ACCU += data_size;
278*53ee8cc1Swenshuai.xi     }
279*53ee8cc1Swenshuai.xi     else if (stage == E_CIPHER_HASH_STAGE_UPDATE)
280*53ee8cc1Swenshuai.xi     {
281*53ee8cc1Swenshuai.xi         NSK_TRACE(("E_CIPHER_HASH_STAGE_UPDATE\n"));
282*53ee8cc1Swenshuai.xi         cipher_cfg.eStage = E_CIPHER_HASH_STAGE_UPDATE;
283*53ee8cc1Swenshuai.xi         cipher_cfg.u32StartByte = HASH_ACCU;
284*53ee8cc1Swenshuai.xi         cipher_cfg.pu8SetIV = (MS_U8 *)pTestMidOutput;
285*53ee8cc1Swenshuai.xi         cipher_cfg.eIVMode = E_CIPHER_HASH_IV_CMD;
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi         ret = MDrv_CIPHER_HASHManual(cipher_cfg, &u32CmdId);
288*53ee8cc1Swenshuai.xi 
289*53ee8cc1Swenshuai.xi         while(FALSE == MDrv_CIPHER_IsHASHDone(u32CmdId,&u32Exception))
290*53ee8cc1Swenshuai.xi         {
291*53ee8cc1Swenshuai.xi             MsOS_DelayTask(20);
292*53ee8cc1Swenshuai.xi         }
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi         HASH_ACCU += data_size;
295*53ee8cc1Swenshuai.xi     }
296*53ee8cc1Swenshuai.xi     else if (stage == E_CIPHER_HASH_STAGE_LAST)
297*53ee8cc1Swenshuai.xi     {
298*53ee8cc1Swenshuai.xi         NSK_TRACE(("E_CIPHER_HASH_STAGE_LAST\n"));
299*53ee8cc1Swenshuai.xi         cipher_cfg.eStage = E_CIPHER_HASH_STAGE_LAST;
300*53ee8cc1Swenshuai.xi         cipher_cfg.u32StartByte = HASH_ACCU;
301*53ee8cc1Swenshuai.xi         cipher_cfg.pu8SetIV = (MS_U8 *)pTestMidOutput;
302*53ee8cc1Swenshuai.xi         cipher_cfg.eIVMode = E_CIPHER_HASH_IV_CMD;
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi         ret = MDrv_CIPHER_HASHManual(cipher_cfg, &u32CmdId);
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi         while(FALSE == MDrv_CIPHER_IsHASHDone(u32CmdId,&u32Exception))
307*53ee8cc1Swenshuai.xi         {
308*53ee8cc1Swenshuai.xi             MsOS_DelayTask(20);
309*53ee8cc1Swenshuai.xi         }
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi         if(digest != NULL)
312*53ee8cc1Swenshuai.xi         {
313*53ee8cc1Swenshuai.xi             memcpy(HASH_OUTPUT,pTestOutput,OutputSize);
314*53ee8cc1Swenshuai.xi             memcpy(digest, HASH_OUTPUT, OutputSize);
315*53ee8cc1Swenshuai.xi         }
316*53ee8cc1Swenshuai.xi         else
317*53ee8cc1Swenshuai.xi         {
318*53ee8cc1Swenshuai.xi             NSK_ERROR(("the return buffer is null!!!\n"));
319*53ee8cc1Swenshuai.xi         }
320*53ee8cc1Swenshuai.xi 
321*53ee8cc1Swenshuai.xi         if(digest_size != NULL)
322*53ee8cc1Swenshuai.xi         {
323*53ee8cc1Swenshuai.xi             *digest_size = OutputSize;
324*53ee8cc1Swenshuai.xi         }
325*53ee8cc1Swenshuai.xi         else
326*53ee8cc1Swenshuai.xi         {
327*53ee8cc1Swenshuai.xi             NSK_ERROR(("the return buffer size is null!!!\n"));
328*53ee8cc1Swenshuai.xi         }
329*53ee8cc1Swenshuai.xi     }
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi     NSK_TRACE(("ret = %d\n",ret));
332*53ee8cc1Swenshuai.xi 
333*53ee8cc1Swenshuai.xi     if(ret != 0)
334*53ee8cc1Swenshuai.xi     {
335*53ee8cc1Swenshuai.xi         NSK_ERROR(("HASH FAIL!!!\n"));
336*53ee8cc1Swenshuai.xi         return NSK2HDI_STATUS_FAILED;
337*53ee8cc1Swenshuai.xi     }
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi     memcpy(HASH_Middle_OUTPUT, pTestOutput, OutputSize);
340*53ee8cc1Swenshuai.xi 
341*53ee8cc1Swenshuai.xi     MApi_NSK2_FreeMemory(pTestInput, FALSE);
342*53ee8cc1Swenshuai.xi     MApi_NSK2_FreeMemory(pTestOutput, FALSE);
343*53ee8cc1Swenshuai.xi     MApi_NSK2_FreeMemory(pTestMidOutput, FALSE);
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
348*53ee8cc1Swenshuai.xi }
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi //this function is used to query the capabilities of the provided hashing engine.
352*53ee8cc1Swenshuai.xi //out--> BL Capability descriptor, BL Algorithm descriptor
NSK2HDI_BL_GetHashCapabilities(NDS_ULONG request_id,NDS_ULONG * desc_size,NDS_UBYTE * desc)353*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_BL_GetHashCapabilities(
354*53ee8cc1Swenshuai.xi                                         NDS_ULONG   request_id,     // IN
355*53ee8cc1Swenshuai.xi                                         NDS_ULONG  *desc_size,      // IN/OUT
356*53ee8cc1Swenshuai.xi                                         NDS_UBYTE  *desc            // OUT
357*53ee8cc1Swenshuai.xi                                         )
358*53ee8cc1Swenshuai.xi {
359*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi     if (request_id != NSK2HDI_BL_ALL_DESCRIPTORS_REQUEST)
362*53ee8cc1Swenshuai.xi     {
363*53ee8cc1Swenshuai.xi         NSK_ERROR(("Invalid TAG:%x", request_id));
364*53ee8cc1Swenshuai.xi         return NSK2HDI_STATUS_INVALID_REQUEST;
365*53ee8cc1Swenshuai.xi     }
366*53ee8cc1Swenshuai.xi     NSK_PRINT(("desc_size:%d \n", *desc_size ));
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi     if(desc == NULL)
369*53ee8cc1Swenshuai.xi     {
370*53ee8cc1Swenshuai.xi         *desc_size = sizeof(BL_CAPABILITY_DESCRIPTOR) + 3 * sizeof(BL_HASHING_ALGORITHM_DESCRIPTOR) ;
371*53ee8cc1Swenshuai.xi         NSK_TRACE(("return desc_size = %x\n",*desc_size));
372*53ee8cc1Swenshuai.xi         return NSK2HDI_STATUS_OK;
373*53ee8cc1Swenshuai.xi     }
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi     memcpy(desc,&m_cap_des, sizeof(BL_CAPABILITY_DESCRIPTOR));
377*53ee8cc1Swenshuai.xi 
378*53ee8cc1Swenshuai.xi     memcpy( (desc + sizeof(BL_CAPABILITY_DESCRIPTOR)) ,&m_algo_des[0], 3 * sizeof(BL_HASHING_ALGORITHM_DESCRIPTOR) );
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
381*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
382*53ee8cc1Swenshuai.xi }
383*53ee8cc1Swenshuai.xi 
384*53ee8cc1Swenshuai.xi //this function shall initialize a hashing operation.
NSK2HDI_BL_InitializeHashOperation(NDS_ULONG desc_size,NDS_UBYTE * desc)385*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_BL_InitializeHashOperation(
386*53ee8cc1Swenshuai.xi                                                   NDS_ULONG desc_size,  // IN
387*53ee8cc1Swenshuai.xi                                                   NDS_UBYTE *desc       // IN
388*53ee8cc1Swenshuai.xi                                                   )
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
391*53ee8cc1Swenshuai.xi     NSK_TRACE(("%s desc_size:%d\n", __FUNCTION__, desc_size));
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi     MS_U32 size = desc_size;
394*53ee8cc1Swenshuai.xi     MS_U8  *pBL_buf = (MS_U8*)desc;
395*53ee8cc1Swenshuai.xi     MS_U8 u8size;
396*53ee8cc1Swenshuai.xi     MS_U8 TagSwitch;
397*53ee8cc1Swenshuai.xi     MS_U8 algorithm;
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi     while(size>=3)
400*53ee8cc1Swenshuai.xi     {
401*53ee8cc1Swenshuai.xi         TagSwitch = pBL_buf[0];
402*53ee8cc1Swenshuai.xi         u8size = pBL_buf[1];
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi         switch(TagSwitch)
405*53ee8cc1Swenshuai.xi         {
406*53ee8cc1Swenshuai.xi             case NSK2HDI_BL_ALGORITHM_DESC_TAG:
407*53ee8cc1Swenshuai.xi                 NSK_TRACE(("NSK2HDI_BL_ALGORITHM_DESC_TAG\n"));
408*53ee8cc1Swenshuai.xi                 algorithm = pBL_buf[2];
409*53ee8cc1Swenshuai.xi                 NSK_TRACE(("algorithm = %x\n",algorithm));
410*53ee8cc1Swenshuai.xi                 ghash_algo.algorithm = algorithm;
411*53ee8cc1Swenshuai.xi                 //memcpy(&ghash_algo, pBL_buf, u8size);
412*53ee8cc1Swenshuai.xi                 break;
413*53ee8cc1Swenshuai.xi 
414*53ee8cc1Swenshuai.xi             case NSK2HDI_BL_CAPABILITY_DESC_TAG:
415*53ee8cc1Swenshuai.xi                 NSK_TRACE(("NSK2HDI_BL_CAPABILITY_DESC_TAG\n"));
416*53ee8cc1Swenshuai.xi                 break;
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi              default:
419*53ee8cc1Swenshuai.xi                 NSK_ERROR(("unknown desc tag\n"));
420*53ee8cc1Swenshuai.xi                 break;
421*53ee8cc1Swenshuai.xi         }
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi         pBL_buf += 3;
424*53ee8cc1Swenshuai.xi         size -= 3;
425*53ee8cc1Swenshuai.xi     }
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi     memset(HASH_OUTPUT, 0x0, MaximumHashSize);
428*53ee8cc1Swenshuai.xi     memset(HASH_Middle_OUTPUT, 0x0, MaximumHashSize);
429*53ee8cc1Swenshuai.xi     operation_stage = E_CIPHER_HASH_STAGE_FIRST;
430*53ee8cc1Swenshuai.xi 
431*53ee8cc1Swenshuai.xi     HASH_ACCU = 0;
432*53ee8cc1Swenshuai.xi     manual_mode = FALSE;
433*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
434*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
435*53ee8cc1Swenshuai.xi }
436*53ee8cc1Swenshuai.xi 
437*53ee8cc1Swenshuai.xi //this fcuntion shall performa a hash operation on a chunk of data, or continue a
438*53ee8cc1Swenshuai.xi //previous operation. This function shall return only upon completion of the operation.
439*53ee8cc1Swenshuai.xi //Other threads may not call any other API from this document during this opration.
NSK2HDI_BL_PerformHashOperation(NDS_ULONG data_size,const NDS_UBYTE * data)440*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_BL_PerformHashOperation(
441*53ee8cc1Swenshuai.xi                                         NDS_ULONG           data_size,  // IN
442*53ee8cc1Swenshuai.xi                                         const NDS_UBYTE     *data       // IN
443*53ee8cc1Swenshuai.xi                                         )
444*53ee8cc1Swenshuai.xi {
445*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
446*53ee8cc1Swenshuai.xi     printf ("%s data_size:%d\n", __FUNCTION__, data_size);
447*53ee8cc1Swenshuai.xi     MS_U8 algorithm;
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi     algorithm = ghash_algo.algorithm;
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     NSK_TRACE(("algorithm = %x\n",algorithm));
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi     ghash_data_size = data_size;
454*53ee8cc1Swenshuai.xi     gphash_data = (NDS_UBYTE *)data;
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi     if( (NSK2HDI_BL_SHA1_HASH_ALG_TYPE != algorithm) &&
457*53ee8cc1Swenshuai.xi         (NSK2HDI_BL_SHA256_HASH_ALG_TYPE != algorithm) &&
458*53ee8cc1Swenshuai.xi         (NSK2HDI_BL_MD5_HASH_ALG_TYPE == algorithm) )
459*53ee8cc1Swenshuai.xi     {
460*53ee8cc1Swenshuai.xi         NSK_TRACE(("algorithm not support\n"));
461*53ee8cc1Swenshuai.xi     }
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi     NSK2HDI_CalHASH_Manual(data_size, data, NULL, NULL, algorithm, operation_stage);
464*53ee8cc1Swenshuai.xi     manual_mode = TRUE;
465*53ee8cc1Swenshuai.xi     if(operation_stage == E_CIPHER_HASH_STAGE_FIRST)
466*53ee8cc1Swenshuai.xi     {
467*53ee8cc1Swenshuai.xi         operation_stage = E_CIPHER_HASH_STAGE_UPDATE;
468*53ee8cc1Swenshuai.xi     }
469*53ee8cc1Swenshuai.xi 
470*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
471*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
472*53ee8cc1Swenshuai.xi }
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi //this function completes a hash operation.
478*53ee8cc1Swenshuai.xi //out-->digest_size, actual size in bytes of the hash digest written to buffer.
479*53ee8cc1Swenshuai.xi //out-->digest, Buufer with the resulting hash digest.
NSK2HDI_BL_CompleteHashOperation(NDS_ULONG data_size,const NDS_UBYTE * data,NDS_ULONG * digest_size,NDS_UBYTE * digest)480*53ee8cc1Swenshuai.xi NSK2HDI_STATUS NSK2HDI_BL_CompleteHashOperation(
481*53ee8cc1Swenshuai.xi                                         NDS_ULONG           data_size,      // IN
482*53ee8cc1Swenshuai.xi                                         const NDS_UBYTE     *data,          // IN
483*53ee8cc1Swenshuai.xi                                         NDS_ULONG           *digest_size,   // IN/OUT
484*53ee8cc1Swenshuai.xi                                         NDS_UBYTE           *digest         // OUT
485*53ee8cc1Swenshuai.xi                                         )
486*53ee8cc1Swenshuai.xi {
487*53ee8cc1Swenshuai.xi     NSK_TRACE(("Enter\n"));
488*53ee8cc1Swenshuai.xi     NDS_ULONG algorithm;
489*53ee8cc1Swenshuai.xi 
490*53ee8cc1Swenshuai.xi     algorithm = ghash_algo.algorithm;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi     NSK_TRACE(("%s data_size:0x%x\n", __FUNCTION__, data_size));
493*53ee8cc1Swenshuai.xi     NSK_TRACE(("algorithm = %x\n",algorithm));
494*53ee8cc1Swenshuai.xi 
495*53ee8cc1Swenshuai.xi     if(manual_mode == TRUE)
496*53ee8cc1Swenshuai.xi     {
497*53ee8cc1Swenshuai.xi         NSK2HDI_CalHASH_Manual(data_size, data, digest_size, digest, algorithm, E_CIPHER_HASH_STAGE_LAST);
498*53ee8cc1Swenshuai.xi     }
499*53ee8cc1Swenshuai.xi     else
500*53ee8cc1Swenshuai.xi     {
501*53ee8cc1Swenshuai.xi         NSK2HDI_CalHASH_Auto(data_size, data, digest_size, digest, algorithm);
502*53ee8cc1Swenshuai.xi     }
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi     //*digest_size = output_size;
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi     NSK_TRACE(("Exit\n"));
507*53ee8cc1Swenshuai.xi     return NSK2HDI_STATUS_OK;
508*53ee8cc1Swenshuai.xi }
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi 
512*53ee8cc1Swenshuai.xi 
513