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�ɂȂ����ꍇ�͗v�C�� 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 : r0�o�b�N�A�b�v 57 ; r12 : w�̃A�h���X 58 59 ; �������o�b�N�A�b�v 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 : NETSwapBytes32�p�萔 73 ; r9 : t 74 ; r11 : r0�o�b�N�A�b�v 75 ; r12 : w�̃A�h���X 76 ; r2, lr : �ėp 77 ; r4-r7 : ���[�h�l 78 ; r1, r8 : w[t], context->block[t] �̃A�h���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���Z�b�g 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��W�J�������� 92 eor r2, r4, r4, ror #16 93 and r2, r3, r2, lsr #8 94 eor r4, r2, r4, ror #8 95 96 ; NETConvert32HToBE��W�J�������� 97 eor r2, r5, r5, ror #16 98 and r2, r3, r2, lsr #8 99 eor r5, r2, r5, ror #8 100 101 ; NETConvert32HToBE��W�J�������� 102 eor r2, r6, r6, ror #16 103 and r2, r3, r2, lsr #8 104 eor r6, r2, r6, ror #8 105 106 ; NETConvert32HToBE��W�J�������� 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 : r0�o�b�N�A�b�v 122 ; r12 : w�̃A�h���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 : r0�o�b�N�A�b�v 203 ; sp : w�̃A�h���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 : r0�o�b�N�A�b�v 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 : r0�o�b�N�A�b�v 531 ; r12 : w�̃A�h���X 532 ; �Ăяo�����ł���MATHi_SHA1ProcessBlock�ɏ������Ă��� (lr��r2�̂ݕύX) 533 ; ���W�X�^�̃o�b�N�A�b�v�͂Ƃ��Ă��Ȃ� 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 : r0�o�b�N�A�b�v 574 ; r12 : w�̃A�h���X 575 ; �Ăяo�����ł���MATHi_SHA1ProcessBlock�ɏ������Ă��� (lr��r2�̂ݕύX) 576 ; ���W�X�^�̃o�b�N�A�b�v�͂Ƃ��Ă��Ȃ� 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