1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - MATH - include
3   File:     math/dgt.h
4 
5   Copyright 2003-2008 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date::            $
14   $Rev:$
15   $Author:$
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NITRO_MATH_DGT_H_
19 #define NITRO_MATH_DGT_H_
20 
21 #ifndef SDK_WIN32
22 #include <nitro/misc.h>
23 #endif
24 #include <nitro/types.h>
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 //----------------------------------------------------------------------------
31 // Constant Definitions
32 //----------------------------------------------------------------------------
33 
34 // Digest length
35 #define MATH_MD5_DIGEST_SIZE    (128/8)     // 128-bit
36 #define MATH_SHA1_DIGEST_SIZE   (160/8)     // 160-bit
37 #define MATH_SHA256_DIGEST_SIZE 32          // 256-bit
38 
39 // Maximum digest length
40 #define MATH_HASH_DIGEST_SIZE_MAX  MATH_SHA1_DIGEST_SIZE
41 
42 // Process block length
43 #define MATH_HASH_BLOCK_SIZE    (512/8)
44 #define MATH_MD5_BLOCK_SIZE     MATH_HASH_BLOCK_SIZE     // 512-bit
45 #define MATH_SHA1_BLOCK_SIZE    MATH_HASH_BLOCK_SIZE     // 512-bit
46 
47 //----------------------------------------------------------------------------
48 // Type Definitions
49 //----------------------------------------------------------------------------
50 
51 typedef struct MATHMD5Context
52 {
53     union
54     {
55         struct
56         {
57             unsigned long a, b, c, d;
58         };
59         unsigned long state[4];
60     };
61     unsigned long long length;
62     union
63     {
64         unsigned long buffer32[16];
65         unsigned char buffer8[64];
66     };
67 } MATHMD5Context;
68 
69 typedef struct MATHSHA1Context
70 {
71     u32     h[5];                        /* H0,H1,H2,H3,H4 */
72     u8      block[MATH_SHA1_BLOCK_SIZE]; /* current message block */
73     u32     pool;                        /* message length in 'block' */
74     u32     blocks_low;                  /* total blocks (in bytes) */
75     u32     blocks_high;
76 }
77 MATHSHA1Context;
78 
79 //----------------------------------------------------------------------------
80 // Function Declarations
81 //----------------------------------------------------------------------------
82 
83 /*****************************************************************************/
84 /* MD5                                                                       */
85 /*****************************************************************************/
86 
87 /*---------------------------------------------------------------------------*
88   Name:         MATH_MD5Init
89 
90   Description:  Initializes the MATHMD5Context structure used for requesting the MD5 value.
91 
92   Arguments:    context:   MATHMD5Context structure
93 
94   Returns:      None.
95  *---------------------------------------------------------------------------*/
96 void MATH_MD5Init(MATHMD5Context * context);
97 
98 /*---------------------------------------------------------------------------*
99   Name:         MATH_MD5Update
100 
101   Description:  Updates the MD5 value with given data.
102 
103   Arguments:    context:   MATHMD5Context structure
104                 input:   Pointer to input data.
105                 length:  Length of input data.
106 
107   Returns:      None.
108  *---------------------------------------------------------------------------*/
109 void MATH_MD5Update(MATHMD5Context * context, const void *input, u32 length);
110 
111 /*---------------------------------------------------------------------------*
112   Name:         MATH_MD5GetHash
113 
114   Description:  Gets the final MD5 value.
115 
116   Arguments:    context:   MATHMD5Context structure
117                 digest:   Pointer to the location where MD5 is stored.
118 
119   Returns:      None.
120  *---------------------------------------------------------------------------*/
121 void MATH_MD5GetHash(MATHMD5Context * context, void *digest);
122 
123 // For forward compatibility
MATH_MD5GetDigest(MATHMD5Context * context,void * digest)124 static inline void MATH_MD5GetDigest(MATHMD5Context * context, void *digest)
125 {
126     MATH_MD5GetHash(context, digest);
127 }
128 
129 
130 /*****************************************************************************/
131 /* SHA-1                                                                     */
132 /*****************************************************************************/
133 
134 /*---------------------------------------------------------------------------*
135   Name:         MATH_SHA1Init
136 
137   Description:  Initializes the MATHSHA1Context structure used for requesting the SHA1 value.
138 
139   Arguments:    context:   MATHSHA1Context structure
140 
141   Returns:      None.
142  *---------------------------------------------------------------------------*/
143 void MATH_SHA1Init(MATHSHA1Context * context);
144 
145 /*---------------------------------------------------------------------------*
146   Name:         MATH_SHA1Update
147 
148   Description:  Updates the SHA1 value with given data.
149 
150   Arguments:    context:   MATHSHA1Context structure
151                 input:   Pointer to input data.
152                 length:  Length of input data.
153 
154   Returns:      None.
155  *---------------------------------------------------------------------------*/
156 void MATH_SHA1Update(MATHSHA1Context * context, const void *input, u32 length);
157 
158 /*---------------------------------------------------------------------------*
159   Name:         MATH_SHA1GetHash
160 
161   Description:  Gets the final SHA1 value.
162 
163   Arguments:    context:   MATHSHA1Context structure
164                 digest:   Pointer to the location where the SHA1 value is stored.
165 
166   Returns:      None.
167  *---------------------------------------------------------------------------*/
168 void MATH_SHA1GetHash(MATHSHA1Context * context, void *digest);
169 
170 // For forward compatibility
MATH_SHA1GetDigest(MATHSHA1Context * context,void * digest)171 static inline void MATH_SHA1GetDigest(MATHSHA1Context * context, void *digest)
172 {
173     MATH_SHA1GetHash(context, digest);
174 }
175 
176 
177 /*****************************************************************************/
178 /* SHA256                                                                     */
179 /*****************************************************************************/
180 #define MATHSHA256_CBLOCK	64
181 #define MATHSHA256_LBLOCK	16
182 #define MATHSHA256_BLOCK	16
183 #define MATHSHA256_LAST_BLOCK  56
184 #define MATHSHA256_LENGTH_BLOCK 8
185 #define MATHSHA256_DIGEST_LENGTH 32
186 
187 typedef struct MATHSHA256Context MATHSHA256Context;
188 typedef void (MATHSHA256_BLOCK_FUNC)(MATHSHA256Context *c, u32 *W, int num);
189 
190 struct MATHSHA256Context
191 {
192     u32 h[8];
193     u32 Nl,Nh;
194     u8 data[MATHSHA256_CBLOCK];
195     int num;
196 };
197 
198 void MATH_SHA256Init(MATHSHA256Context *c);
199 void MATH_SHA256Update(MATHSHA256Context *c, const void* data, u32 len);
200 void MATH_SHA256GetHash(MATHSHA256Context *c, void* digest);
201 void MATH_CalcSHA256(void* digest, const void* data, u32 dataLength);
202 
203 
204 /*****************************************************************************/
205 /* Utility Functions                                                        */
206 /*****************************************************************************/
207 
208 /*---------------------------------------------------------------------------*
209   Name:         MATH_CalcMD5
210 
211   Description:  Calculates MD5.
212 
213   Arguments:    digest:   Pointer to the location where MD5 is stored.
214                 data:    Pointer to input data.
215                 dataLength:   Length of input data.
216 
217   Returns:      None.
218  *---------------------------------------------------------------------------*/
219 void    MATH_CalcMD5(void *digest, const void *data, u32 dataLength);
220 
221 /*---------------------------------------------------------------------------*
222   Name:         MATH_CalcSHA1
223 
224   Description:  Calculates SHA-1.
225 
226   Arguments:    digest:   Pointer to the location where SHA-1 is stored.
227                 data:    Pointer to input data.
228                 dataLength:   Length of input data.
229 
230   Returns:      None.
231  *---------------------------------------------------------------------------*/
232 void    MATH_CalcSHA1(void *digest, const void *data, u32 dataLength);
233 
234 
235 /*---------------------------------------------------------------------------*
236   Name:         MATH_CalcHMACMD5
237 
238   Description:  Calculates HMAC-MD5.
239 
240   Arguments:    digest:   Pointer to the location where HMAC-MD5 is stored.
241                 data:    Pointer to input data.
242                 dataLength:   Length of input data.
243                 key:    Pointer to the key
244                 keyLength:   Length of the key
245 
246   Returns:      None.
247  *---------------------------------------------------------------------------*/
248 void
249 MATH_CalcHMACMD5(void *digest, const void *data, u32 dataLength, const void *key, u32 keyLength);
250 
251 /*---------------------------------------------------------------------------*
252   Name:         MATH_CalcHMACSHA1
253 
254   Description:  Calculates HMAC-SHA-1.
255 
256   Arguments:    digest:   Pointer to the location where the HMAC-SHA-1 value is stored.
257                 data:    Pointer to input data.
258                 dataLength:   Length of input data.
259                 key:    Pointer to the key
260                 keyLength:   Length of the key
261 
262   Returns:      None.
263  *---------------------------------------------------------------------------*/
264 void
265 MATH_CalcHMACSHA1(void *digest, const void *data, u32 dataLength, const void *key, u32 keyLength);
266 
267 /*---------------------------------------------------------------------------*
268   Name:         MATH_CalcHMACSHA256
269 
270   Description:  Calculates HMAC-SHA-256.
271 
272   Arguments:    digest:   Pointer to the location where the HMAC-SHA-256 value is stored.
273                 data:    Pointer to input data.
274                 dataLength:   Length of input data.
275                 key:    Pointer to the key
276                 keyLength:   Length of the key
277 
278   Returns:      None.
279  *---------------------------------------------------------------------------*/
280 void
281 MATH_CalcHMACSHA256(void *digest, const void *data, u32 dataLength, const void *key, u32 keyLength);
282 
283 int MATHi_SetOverlayTableMode( int flag );
284 
285 #ifdef __cplusplus
286 }/* extern "C" */
287 #endif
288 
289 /* NITRO_MATH_DGT_H_ */
290 #endif
291