1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;  Project:  TwlSDK - MATH - libraries
3;  File:     sha1.s
4;
5;  Copyright 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#define MATH_SHA1_SMALL_STACK
19
20#define EXPAND_FUNC
21#define USE_LDMIA
22
23; ����
24;   �\���� MATHSHA1Context �̃����o�̃A���C�����g�͌���ȉ��̒ʂ�
25;     h - 0 �` 20
26;     block - 20 �` 84
27;   �����o���ύX�ɂȂ����ꍇ�͗vC��
28
29;rfp	.req	r9
30;sl	.req	r10
31;fp	.req	r11
32;ip	.req	r12
33;sp	.req	r13
34;lr	.req	r14
35;pc	.req	r15
36    .text
37.L100:
38.L101:
39    .word 0x5A827999
40.L102:
41    .word 0x6ED9EBA1
42.L103:
43    .word 0x8F1BBCDC
44.L104:
45    .word 0xCA62C1D6
46.text
47	.align 0
48	.globl MATHi_SHA1ProcessBlock
49	.type MATHi_SHA1ProcessBlock,@function
50MATHi_SHA1ProcessBlock:
51	stmfd sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
52	; r3, lr  : �ėp
53    ; r4-r8   : a-e
54	; r9      : t
55	; r10     : tmp
56	; r11     : r0obNAbv
57	; r12     : w�̃Ah���X
58
59	; �������obNAbv
60	mov r11, r0
61	; ���[�J���ϐ����m��
62#if !defined(MATH_SHA1_SMALL_STACK)
63	;      u32   w[80];
64	sub sp, sp, #320
65	mov r12, sp
66#else
67	;      u32   w[16];
68	sub sp, sp, #64
69	mov r12, sp
70#endif
71
72	; r3      : NETSwapBytes32p�萔
73	; r9      : t
74	; r11     : r0obNAbv
75	; r12     : w�̃Ah���X
76	; r2, lr  : �ėp
77	; r4-r7   : ���[�hl
78	; r1, r8  : w[t], context->block[t] �̃Ah���X
79	; r0,r1,r2,r8,r10 : not use
80	mvn r3, #0x0000FF00
81	add r8, r11, #20
82	mov r1, r12
83	ldmia r8!, {r4, r5, r6, r7}
84	; t���Zbg
85    mov r9, #16
86.L105:
87	; w[t] = NETConvert32HToBE(((u32*)context->block)[t]);
88	; w[t+1] = NETConvert32HToBE(((u32*)context->block)[t+1]);
89	; w[t+2] = NETConvert32HToBE(((u32*)context->block)[t+2]);
90	; w[t+3] = NETConvert32HToBE(((u32*)context->block)[t+3]);
91	; NETConvert32HToBE��WJ��������
92	eor r2, r4, r4, ror #16
93    and r2, r3, r2, lsr #8
94    eor r4, r2, r4, ror #8
95
96	; NETConvert32HToBE��WJ��������
97	eor r2, r5, r5, ror #16
98    and r2, r3, r2, lsr #8
99    eor r5, r2, r5, ror #8
100
101	; NETConvert32HToBE��WJ��������
102	eor r2, r6, r6, ror #16
103    and r2, r3, r2, lsr #8
104    eor r6, r2, r6, ror #8
105
106	; NETConvert32HToBE��WJ��������
107	eor r2, r7, r7, ror #16
108    and r2, r3, r2, lsr #8
109    eor r7, r2, r7, ror #8
110
111	stmia r1!, {r4, r5, r6, r7}
112	; for (t = 0; t < 16; t+=4)
113	subs r9, r9, #4
114	ldmneia r8!, {r4, r5, r6, r7}
115	bne .L105
116
117#if !defined(MATH_SHA1_SMALL_STACK)
118	; r0 - r3, lr  : �ėp
119	; r8      : prev
120	; r9      : t
121	; r11     : r0obNAbv
122	; r12     : w�̃Ah���X
123	; r4 - r7 : w[t]�ɏ����߂��l
124	; r10     : not use
125	mov r9, #16
126
127	sub r8, r9, #16
128	add r8, r12, r8, lsl #2
129	ldr r1, [r8]
130	ldr lr, [r8, #8]
131.L106:
132	; u32    *prev = &w[t - 16];
133	; w[t] = NETRotateLeft32(1, prev[ 0] ^ prev[ 2] ^ prev[ 8] ^ prev[13]);
134	ldr r3, [r8, #32]
135	eor r1, r1, lr
136	ldr r2, [r8, #52]
137	eor r1, r1, r3
138	eor r1, r1, r2
139	; NETRotateLeft32
140	mov r4, r1, ror #31
141
142	; w[t+1] = NETRotateLeft32(1, prev[ 1] ^ prev[ 3] ^ prev[ 9] ^ prev[14]);
143	ldr r1, [r8, #4]
144	ldr lr, [r8, #12]
145	ldr r3, [r8, #36]
146	eor r1, r1, lr
147	ldr r2, [r8, #56]
148	eor r1, r1, r3
149	eor r1, r1, r2
150	; NETRotateLeft32
151	mov r5, r1, ror #31
152
153	; w[t+2] = NETRotateLeft32(1, prev[ 2] ^ prev[ 4] ^ prev[10] ^ prev[15]);
154	ldr r1, [r8, #8]
155	ldr lr, [r8, #16]
156	ldr r3, [r8, #40]
157	eor r1, r1, lr
158	ldr r2, [r8, #60]
159	eor r1, r1, r3
160	eor r1, r1, r2
161	; NETRotateLeft32
162	mov r6, r1, ror #31
163
164	; w[t+3] = NETRotateLeft32(1, prev[ 3] ^ prev[ 5] ^ prev[11] ^ prev[16]);
165	ldr r1, [r8, #12]
166	ldr lr, [r8, #20]
167	ldr r3, [r8, #44]
168	eor r1, r1, lr
169	eor r1, r1, r3
170	eor r1, r1, r4
171	; NETRotateLeft32
172	mov r7, r1, ror #31
173
174	add lr, r12, r9, lsl #2
175	stmia lr, {r4, r5, r6, r7}
176
177	; for (; t < 80; ++t)
178	add r9, r9, #4
179    cmp r9, #80
180	subne r8, r9, #16
181	addne r8, r12, r8, lsl #2
182	ldrne r1, [r8]
183	ldrne lr, [r8, #8]
184	bne .L106
185#endif
186
187    ; a,b,c,d,e �����[�h
188#if !defined(USE_LDMIA)
189	ldr r4, [r11]
190	ldr r5, [r11, #4]
191	ldr r6, [r11, #8]
192	ldr r7, [r11, #12]
193	ldr r8, [r11, #16]
194#else
195	ldmia r11, {r4, r5, r6, r7, r8}
196#endif
197
198	; r3, r2, r1, lr  : �ėp
199    ; r4-r8   : a-e
200	; r9      : t
201	; r10     : tmp
202	; r11     : r0obNAbv
203	; sp      : w�̃Ah���X
204	; r12     : �Œ�l
205	ldr r12, .L101
206	mov r9, #0
207.L107:
208    ; u32     tmp = 0x5A827999UL + ((b & c) | (~b & d));
209	and r10, r5, r6
210	mvn lr, r5
211	and lr, lr, r7
212	orr r10, r10, lr
213	add r10, r10, r12
214    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
215#if !defined(MATH_SHA1_SMALL_STACK)
216	ldr lr, [sp, r9, lsl #2]
217#else
218	and lr, r9, #15
219	ldr lr, [sp, lr, lsl #2]
220#endif
221	add r10, r10, r8
222	add r10, r10, lr
223	add r10, r10, r4, ror #27
224    ; e = d;
225	mov r8, r7
226    ; d = c;
227	mov r7, r6
228    ; c = NETRotateLeft32(30, b);
229	mov r6, r5, ror #2
230    ; b = a;
231	mov r5, r4
232    ; a = tmp;
233	mov r4, r10
234
235	; for (; t < 16; ++t)
236	add r9, r9, #1
237    cmp r9, #16
238	bne .L107
239
240.L108:
241    ; u32     tmp = 0x5A827999UL + ((b & c) | (~b & d));
242	and r10, r5, r6
243	mvn lr, r5
244	and lr, lr, r7
245	orr r10, r10, lr
246	add r10, r10, r12
247#if defined(MATH_SHA1_SMALL_STACK)
248    ; w_alias(t) = NETRotateLeft32(1,
249    ;                       w_alias(t - 16 +  0) ^
250    ;                       w_alias(t - 16 +  2) ^
251    ;                       w_alias(t - 16 +  8) ^
252    ;                       w_alias(t - 16 + 13) );
253	sub r2, r9, #16
254	and r2, r2, #0xF
255	sub lr, r9, #14
256	and lr, lr, #0xF
257	ldr r3, [sp, r2, lsl #2]
258	ldr r1, [sp, lr, lsl #2]
259	sub lr, r9, #8
260	eor r3, r3, r1
261	and lr, lr, #0xF
262	ldr r1, [sp, lr, lsl #2]
263	sub r2, r9, #3
264	eor r3, r3, r1
265	and r2, r2, #0xF
266	ldr r1, [sp, r2, lsl #2]
267	and r2, r9, #0xF
268	eor r3, r3, r1
269	mov r3, r3, ror #31
270	str r3, [sp, r2, lsl #2]
271#endif
272    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
273#if !defined(MATH_SHA1_SMALL_STACK)
274	ldr lr, [sp, r9, lsl #2]
275#else
276	and lr, r9, #15
277	ldr lr, [sp, lr, lsl #2]
278#endif
279	add r10, r10, r8
280	add r10, r10, lr
281	add r10, r10, r4, ror #27
282    ; e = d;
283	mov r8, r7
284    ; d = c;
285	mov r7, r6
286    ; c = NETRotateLeft32(30, b);
287	mov r6, r5, ror #2
288    ; b = a;
289	mov r5, r4
290    ; a = tmp;
291	mov r4, r10
292
293	; for (; t < 20; ++t)
294	add r9, r9, #1
295    cmp r9, #20
296	bne .L108
297
298	ldr r12, .L102
299.L109:
300    ; u32     tmp = 0x6ED9EBA1UL + (b ^ c ^ d);
301	eor r10, r5, r6
302	eor r10, r10, r7
303	add r10, r10, r12
304#if defined(MATH_SHA1_SMALL_STACK)
305    ; w_alias(t) = NETRotateLeft32(1,
306    ;                       w_alias(t - 16 +  0) ^
307    ;                       w_alias(t - 16 +  2) ^
308    ;                       w_alias(t - 16 +  8) ^
309    ;                       w_alias(t - 16 + 13) );
310	sub r2, r9, #16
311	and r2, r2, #0xF
312	sub lr, r9, #14
313	and lr, lr, #0xF
314	ldr r3, [sp, r2, lsl #2]
315	ldr r1, [sp, lr, lsl #2]
316	sub lr, r9, #8
317	eor r3, r3, r1
318	and lr, lr, #0xF
319	ldr r1, [sp, lr, lsl #2]
320	sub r2, r9, #3
321	eor r3, r3, r1
322	and r2, r2, #0xF
323	ldr r1, [sp, r2, lsl #2]
324	and r2, r9, #0xF
325	eor r3, r3, r1
326	mov r3, r3, ror #31
327	str r3, [sp, r2, lsl #2]
328#endif
329    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
330#if !defined(MATH_SHA1_SMALL_STACK)
331	ldr lr, [sp, r9, lsl #2]
332#else
333	and lr, r9, #15
334	ldr lr, [sp, lr, lsl #2]
335#endif
336	add r10, r10, r8
337	add r10, r10, lr
338	add r10, r10, r4, ror #27
339    ; e = d;
340	mov r8, r7
341    ; d = c;
342	mov r7, r6
343    ; c = NETRotateLeft32(30, b);
344	mov r6, r5, ror #2
345    ; b = a;
346	mov r5, r4
347    ; a = tmp;
348	mov r4, r10
349
350	; for (; t < 40; ++t)
351	add r9, r9, #1
352    cmp r9, #40
353	bne .L109
354
355	ldr r12, .L103
356.L110:
357    ; u32     tmp = 0x8F1BBCDCUL + ((b & c) | (b & d) | (c & d));
358	and r10, r5, r6
359	and lr, r5, r7
360	orr r10, r10, lr
361	and lr, r6, r7
362	orr r10, r10, lr
363	add r10, r10, r12
364#if defined(MATH_SHA1_SMALL_STACK)
365    ; w_alias(t) = NETRotateLeft32(1,
366    ;                       w_alias(t - 16 +  0) ^
367    ;                       w_alias(t - 16 +  2) ^
368    ;                       w_alias(t - 16 +  8) ^
369    ;                       w_alias(t - 16 + 13) );
370	sub r2, r9, #16
371	and r2, r2, #0xF
372	sub lr, r9, #14
373	and lr, lr, #0xF
374	ldr r3, [sp, r2, lsl #2]
375	ldr r1, [sp, lr, lsl #2]
376	sub lr, r9, #8
377	eor r3, r3, r1
378	and lr, lr, #0xF
379	ldr r1, [sp, lr, lsl #2]
380	sub r2, r9, #3
381	eor r3, r3, r1
382	and r2, r2, #0xF
383	ldr r1, [sp, r2, lsl #2]
384	and r2, r9, #0xF
385	eor r3, r3, r1
386	mov r3, r3, ror #31
387	str r3, [sp, r2, lsl #2]
388#endif
389    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
390#if !defined(MATH_SHA1_SMALL_STACK)
391	ldr lr, [sp, r9, lsl #2]
392#else
393	and lr, r9, #15
394	ldr lr, [sp, lr, lsl #2]
395#endif
396	add r10, r10, r8
397	add r10, r10, lr
398	add r10, r10, r4, ror #27
399    ; e = d;
400	mov r8, r7
401    ; d = c;
402	mov r7, r6
403    ; c = NETRotateLeft32(30, b);
404	mov r6, r5, ror #2
405    ; b = a;
406	mov r5, r4
407    ; a = tmp;
408	mov r4, r10
409
410	; for (; t < 60; ++t)
411	add r9, r9, #1
412    cmp r9, #60
413	bne .L110
414
415	ldr r12, .L104
416.L111:
417	; u32     tmp = 0xCA62C1D6UL + (b ^ c ^ d);
418	eor r10, r5, r6
419	eor r10, r10, r7
420	add r10, r10, r12
421#if defined(MATH_SHA1_SMALL_STACK)
422    ; w_alias(t) = NETRotateLeft32(1,
423    ;                       w_alias(t - 16 +  0) ^
424    ;                       w_alias(t - 16 +  2) ^
425    ;                       w_alias(t - 16 +  8) ^
426    ;                       w_alias(t - 16 + 13) );
427	sub r2, r9, #16
428	and r2, r2, #0xF
429	sub lr, r9, #14
430	and lr, lr, #0xF
431	ldr r3, [sp, r2, lsl #2]
432	ldr r1, [sp, lr, lsl #2]
433	sub lr, r9, #8
434	eor r3, r3, r1
435	and lr, lr, #0xF
436	ldr r1, [sp, lr, lsl #2]
437	sub r2, r9, #3
438	eor r3, r3, r1
439	and r2, r2, #0xF
440	ldr r1, [sp, r2, lsl #2]
441	and r2, r9, #0xF
442	eor r3, r3, r1
443	mov r3, r3, ror #31
444	str r3, [sp, r2, lsl #2]
445#endif
446    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
447#if !defined(MATH_SHA1_SMALL_STACK)
448	ldr lr, [sp, r9, lsl #2]
449#else
450	and lr, r9, #15
451	ldr lr, [sp, lr, lsl #2]
452#endif
453	add r10, r10, r8
454	add r10, r10, lr
455	add r10, r10, r4, ror #27
456    ; e = d;
457	mov r8, r7
458    ; d = c;
459	mov r7, r6
460    ; c = NETRotateLeft32(30, b);
461	mov r6, r5, ror #2
462    ; b = a;
463	mov r5, r4
464    ; a = tmp;
465	mov r4, r10
466
467	; for(t=60; t<80; ++t)
468	add r9, r9, #1
469    cmp r9, #80
470	bne .L111
471
472	; r3, r2, r1, lr  : �ėp
473	; r9, r10, r12    : �ėp
474    ; r4-r8   : a-e
475	; r11     : r0obNAbv
476
477    ; a,b,c,d,e ��context->h�ɑ�������
478#if !defined(USE_LDMIA)
479	ldr r3, [r11]
480	add r3, r3, r4
481	str r3, [r11]
482	ldr r3, [r11, #4]
483	add r3, r3, r5
484	str r3, [r11, #4]
485	ldr r3, [r11, #8]
486	add r3, r3, r6
487	str r3, [r11, #8]
488	ldr r3, [r11, #12]
489	add r3, r3, r7
490	str r3, [r11, #12]
491	ldr r3, [r11, #16]
492	add r3, r3, r8
493	str r3, [r11, #16]
494#else
495	ldmia r11, {r1, r2, r3, r9, r10}
496	add r1, r1, r4
497	add r2, r2, r5
498	add r3, r3, r6
499	add r9, r9, r7
500	add r10, r10, r8
501	stmia r11, {r1, r2, r3, r9, r10}
502#endif
503
504	; ���[�J���ϐ����������
505#if !defined(MATH_SHA1_SMALL_STACK)
506	;      u32   w[80];
507	add sp, sp, #320
508#else
509	;      u32   w[16];
510	add sp, sp, #64
511#endif
512
513	ldmfd sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
514.L112:
515	.size	MATHi_SHA1ProcessBlock,.L112-.L100
516
517
518#if !defined(EXPAND_FUNC)
519; ���ӁI ���̊֐���APCS�ɏ������Ă��܂���I
520;        C���ꂩ��͗��p�ł��܂���I
521.text
522    .align 0
523    .globl rotate_values
524    .type rotate_values,@function
525rotate_values:
526	; r3, r2  : �ėp
527    ; r4-r8   : a-e
528	; r9      : t
529	; r10     : tmp
530	; r11     : r0obNAbv
531	; r12     : w�̃Ah���X
532	; �Ăяo�����ł���MATHi_SHA1ProcessBlock�ɏ������Ă��� (lr��r2�̂ݕύX)
533	; ���WX�^�̃obNAbv�͂Ƃ��Ă��Ȃ�
534
535    ; tmp += w_alias(t) + NETRotateLeft32(5, a) + e;
536#if !defined(MATH_SHA1_SMALL_STACK)
537	ldr r3, [r12, r9, lsl #2]
538#else
539	and r3, r9, #15
540	ldr r3, [r12, r3, lsl #2]
541#endif
542	add r10, r10, r8
543	add r10, r10, r3
544	and r10, r10, r4, ror #27
545    ; e = d;
546	mov r8, r7
547    ; d = c;
548	mov r7, r6
549    ; c = NETRotateLeft32(30, b);
550	mov r6, r5, ror #2
551    ; b = a;
552	mov r5, r4
553    ; a = tmp;
554	mov r4, r10
555
556    mov pc, lr
557.L113:
558    .size   rotate_values,.L113-rotate_values
559
560
561#if defined(MATH_SHA1_SMALL_STACK)
562; ���ӁI ���̊֐���APCS�ɏ������Ă��܂���I
563;        C���ꂩ��͗��p�ł��܂���I
564.text
565    .align 0
566    .globl update_values
567    .type update_values,@function
568update_values:
569	; r3, r2, r1  : �ėp
570    ; r4-r8   : a-e
571	; r9      : t
572	; r10     : tmp
573	; r11     : r0obNAbv
574	; r12     : w�̃Ah���X
575	; �Ăяo�����ł���MATHi_SHA1ProcessBlock�ɏ������Ă��� (lr��r2�̂ݕύX)
576	; ���WX�^�̃obNAbv�͂Ƃ��Ă��Ȃ�
577
578    ; w_alias(t) = NETRotateLeft32(1,
579    ;                       w_alias(t - 16 +  0) ^
580    ;                       w_alias(t - 16 +  2) ^
581    ;                       w_alias(t - 16 +  8) ^
582    ;                       w_alias(t - 16 + 13) );
583	sub r2, r9, #16
584	and r2, r2, #0xF
585	ldr r3, [r12, r2, lsl #2]
586	sub r2, r9, #14
587	and r2, r2, #0xF
588	ldr r1, [r12, r2, lsl #2]
589	eor r3, r3, r1
590	sub r2, r9, #8
591	and r2, r2, #0xF
592	ldr r1, [r12, r2, lsl #2]
593	eor r3, r3, r1
594	sub r2, r9, #3
595	and r2, r2, #0xF
596	ldr r1, [r12, r2, lsl #2]
597	eor r3, r3, r1
598	mov r3, r3, ror #31
599	and r2, r9, #0xF
600	str r3, [r12, r2, lsl #2]
601
602    mov pc, lr
603.L114:
604    .size   update_values,.L114-update_values
605#endif
606#endif  ; !defined(EXPAND_FUNC)
607
608
609#if 0
610.text
611    .align 0
612    .globl NETSwapBytes32
613    .type NETSwapBytes32,@function
614NETSwapBytes32:
615    ; r0:n, r1:m, r2:t
616    mvn r1, #0x0000FF00
617    eor r2, r0, r0, ror #16
618    and r2, r1, r2, lsr #8
619    eor r0, r2, r0, ror #8
620    mov pc, lr
621.L115:
622    .size   NETSwapBytes32,.L115-NETSwapBytes32
623
624
625.text
626    .align 0
627	.globl NETRotateLeft32
628	.type NETRotateLeft32,@function
629NETRotateLeft32:
630	rsb r2, r0, #32
631	mov r0, r1, ror r2
632	mov pc, lr
633.L116:
634    .size   NETRotateLeft32,.L116-NETRotateLeft32
635#endif
636