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