4 #if __ARM_MAX_ARCH__>=7
11 .long 0x01,0x01,0x01,0x01
12 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d @ rotate-n-splat
13 .long 0x1b,0x1b,0x1b,0x1b
15 .globl aes_v8_set_encrypt_key
16 .type aes_v8_set_encrypt_key,%function
18 aes_v8_set_encrypt_key:
51 .inst 0xf3f04300 @ aese q10,q0
70 .inst 0xf3f04300 @ aese q10,q0
85 .inst 0xf3f04300 @ aese q10,q0
103 vmov.i8 q10,#8 @ borrow q10
105 vsub.i8 q2,q2,q10 @ adjust the mask
112 .inst 0xf3f04300 @ aese q10,q0
148 .inst 0xf3f04300 @ aese q10,q0
164 .inst 0xf3f04300 @ aese q10,q0
180 mov r0,r3 @ return value
183 .size aes_v8_set_encrypt_key,.-aes_v8_set_encrypt_key
185 .globl aes_v8_set_decrypt_key
186 .type aes_v8_set_decrypt_key,%function
188 aes_v8_set_decrypt_key:
195 sub r2,r2,#240 @ restore original r2
197 add r0,r2,r12,lsl#4 @ end of key schedule
207 .inst 0xf3b003c0 @ aesimc q0,q0
208 .inst 0xf3b023c2 @ aesimc q1,q1
215 .inst 0xf3b003c0 @ aesimc q0,q0
218 eor r0,r0,r0 @ return value
221 .size aes_v8_set_decrypt_key,.-aes_v8_set_decrypt_key
222 .globl aes_v8_encrypt
223 .type aes_v8_encrypt,%function
233 .inst 0xf3b04300 @ aese q2,q0
235 .inst 0xf3b04384 @ aesmc q2,q2
237 .inst 0xf3b04302 @ aese q2,q1
239 .inst 0xf3b04384 @ aesmc q2,q2
242 .inst 0xf3b04300 @ aese q2,q0
244 .inst 0xf3b04384 @ aesmc q2,q2
245 .inst 0xf3b04302 @ aese q2,q1
250 .size aes_v8_encrypt,.-aes_v8_encrypt
251 .globl aes_v8_decrypt
252 .type aes_v8_decrypt,%function
262 .inst 0xf3b04340 @ aesd q2,q0
264 .inst 0xf3b043c4 @ aesimc q2,q2
266 .inst 0xf3b04342 @ aesd q2,q1
268 .inst 0xf3b043c4 @ aesimc q2,q2
271 .inst 0xf3b04340 @ aesd q2,q0
273 .inst 0xf3b043c4 @ aesimc q2,q2
274 .inst 0xf3b04342 @ aesd q2,q1
279 .size aes_v8_decrypt,.-aes_v8_decrypt
280 .globl aes_v8_cbc_encrypt
281 .type aes_v8_cbc_encrypt,%function
286 vstmdb sp!,{d8-d15} @ ABI specification says so
287 ldmia ip,{r4-r5} @ load remaining args
293 cmp r5,#0 @ en- or decrypting?
299 vld1.32 {q8-q9},[r3] @ load key schedule...
301 add r7,r3,r5,lsl#4 @ pointer to last 7 round keys
303 vld1.32 {q10-q11},[r7]!
304 vld1.32 {q12-q13},[r7]!
305 vld1.32 {q14-q15},[r7]!
318 .inst 0xf3b00320 @ aese q0,q8
320 .inst 0xf3b00380 @ aesmc q0,q0
322 .inst 0xf3b00322 @ aese q0,q9
324 .inst 0xf3b00380 @ aesmc q0,q0
327 .inst 0xf3b00320 @ aese q0,q8
328 .inst 0xf3b00380 @ aesmc q0,q0
330 .inst 0xf3b00322 @ aese q0,q9
331 .inst 0xf3b00380 @ aesmc q0,q0
333 .inst 0xf3b00324 @ aese q0,q10
334 .inst 0xf3b00380 @ aesmc q0,q0
336 .inst 0xf3b00326 @ aese q0,q11
337 .inst 0xf3b00380 @ aesmc q0,q0
339 .inst 0xf3b00328 @ aese q0,q12
340 .inst 0xf3b00380 @ aesmc q0,q0
342 .inst 0xf3b0032a @ aese q0,q13
343 .inst 0xf3b00380 @ aesmc q0,q0
344 vld1.32 {q9},[r7]! @ re-pre-load rndkey[1]
345 .inst 0xf3b0032c @ aese q0,q14
346 .inst 0xf3b00380 @ aesmc q0,q0
347 .inst 0xf3b0032e @ aese q0,q15
359 .inst 0xf3b00320 @ aese q0,q8
360 .inst 0xf3b00380 @ aesmc q0,q0
363 .inst 0xf3b00320 @ aese q0,q8
364 .inst 0xf3b00380 @ aesmc q0,q0
367 .inst 0xf3b00322 @ aese q0,q9
368 .inst 0xf3b00380 @ aesmc q0,q0
370 .inst 0xf3b00304 @ aese q0,q2
371 .inst 0xf3b00380 @ aesmc q0,q0
373 .inst 0xf3b00306 @ aese q0,q3
374 .inst 0xf3b00380 @ aesmc q0,q0
375 .inst 0xf3b00324 @ aese q0,q10
376 .inst 0xf3b00380 @ aesmc q0,q0
377 .inst 0xf3b00326 @ aese q0,q11
378 .inst 0xf3b00380 @ aesmc q0,q0
380 .inst 0xf3b00328 @ aese q0,q12
381 .inst 0xf3b00380 @ aesmc q0,q0
382 .inst 0xf3b0032a @ aese q0,q13
383 .inst 0xf3b00380 @ aesmc q0,q0
384 .inst 0xf3b0032c @ aese q0,q14
385 .inst 0xf3b00380 @ aesmc q0,q0
387 .inst 0xf3b0032e @ aese q0,q15
396 subs r2,r2,#32 @ bias
410 .inst 0xf3b00360 @ aesd q0,q8
411 .inst 0xf3b02360 @ aesd q1,q8
412 .inst 0xf3f04360 @ aesd q10,q8
414 .inst 0xf3b003c0 @ aesimc q0,q0
415 .inst 0xf3b023c2 @ aesimc q1,q1
416 .inst 0xf3f043e4 @ aesimc q10,q10
418 .inst 0xf3b00362 @ aesd q0,q9
419 .inst 0xf3b02362 @ aesd q1,q9
420 .inst 0xf3f04362 @ aesd q10,q9
422 .inst 0xf3b003c0 @ aesimc q0,q0
423 .inst 0xf3b023c2 @ aesimc q1,q1
424 .inst 0xf3f043e4 @ aesimc q10,q10
427 .inst 0xf3b00360 @ aesd q0,q8
428 .inst 0xf3b02360 @ aesd q1,q8
429 .inst 0xf3f04360 @ aesd q10,q8
431 .inst 0xf3b003c0 @ aesimc q0,q0
432 .inst 0xf3b023c2 @ aesimc q1,q1
433 .inst 0xf3f043e4 @ aesimc q10,q10
435 .inst 0xf3b00362 @ aesd q0,q9
436 .inst 0xf3b02362 @ aesd q1,q9
437 .inst 0xf3f04362 @ aesd q10,q9
440 .inst 0xf3b003c0 @ aesimc q0,q0
441 .inst 0xf3b023c2 @ aesimc q1,q1
442 .inst 0xf3f043e4 @ aesimc q10,q10
444 movlo r6,r2 @ r6, r6, is zero at this point
445 .inst 0xf3b00368 @ aesd q0,q12
446 .inst 0xf3b02368 @ aesd q1,q12
447 .inst 0xf3f04368 @ aesd q10,q12
448 add r0,r0,r6 @ r0 is adjusted in such way that
449 @ at exit from the loop q1-q10
450 @ are loaded with last "words"
451 .inst 0xf3b003c0 @ aesimc q0,q0
452 .inst 0xf3b023c2 @ aesimc q1,q1
453 .inst 0xf3f043e4 @ aesimc q10,q10
455 .inst 0xf3b0036a @ aesd q0,q13
456 .inst 0xf3b0236a @ aesd q1,q13
457 .inst 0xf3f0436a @ aesd q10,q13
459 .inst 0xf3b003c0 @ aesimc q0,q0
460 .inst 0xf3b023c2 @ aesimc q1,q1
461 .inst 0xf3f043e4 @ aesimc q10,q10
463 .inst 0xf3b0036c @ aesd q0,q14
464 .inst 0xf3b0236c @ aesd q1,q14
465 .inst 0xf3f0436c @ aesd q10,q14
467 .inst 0xf3b003c0 @ aesimc q0,q0
468 .inst 0xf3b023c2 @ aesimc q1,q1
469 .inst 0xf3f043e4 @ aesimc q10,q10
470 vld1.32 {q8},[r7]! @ re-pre-load rndkey[0]
471 .inst 0xf3b0036e @ aesd q0,q15
472 .inst 0xf3b0236e @ aesd q1,q15
473 .inst 0xf3f0436e @ aesd q10,q15
479 vld1.32 {q9},[r7]! @ re-pre-load rndkey[1]
493 .inst 0xf3b02360 @ aesd q1,q8
494 .inst 0xf3f04360 @ aesd q10,q8
496 .inst 0xf3b023c2 @ aesimc q1,q1
497 .inst 0xf3f043e4 @ aesimc q10,q10
499 .inst 0xf3b02362 @ aesd q1,q9
500 .inst 0xf3f04362 @ aesd q10,q9
502 .inst 0xf3b023c2 @ aesimc q1,q1
503 .inst 0xf3f043e4 @ aesimc q10,q10
506 .inst 0xf3b02360 @ aesd q1,q8
507 .inst 0xf3f04360 @ aesd q10,q8
508 .inst 0xf3b023c2 @ aesimc q1,q1
509 .inst 0xf3f043e4 @ aesimc q10,q10
510 .inst 0xf3b02362 @ aesd q1,q9
511 .inst 0xf3f04362 @ aesd q10,q9
512 .inst 0xf3b023c2 @ aesimc q1,q1
513 .inst 0xf3f043e4 @ aesimc q10,q10
514 .inst 0xf3b02368 @ aesd q1,q12
515 .inst 0xf3f04368 @ aesd q10,q12
516 .inst 0xf3b023c2 @ aesimc q1,q1
517 .inst 0xf3f043e4 @ aesimc q10,q10
519 .inst 0xf3b0236a @ aesd q1,q13
520 .inst 0xf3f0436a @ aesd q10,q13
521 .inst 0xf3b023c2 @ aesimc q1,q1
522 .inst 0xf3f043e4 @ aesimc q10,q10
524 .inst 0xf3b0236c @ aesd q1,q14
525 .inst 0xf3f0436c @ aesd q10,q14
526 .inst 0xf3b023c2 @ aesimc q1,q1
527 .inst 0xf3f043e4 @ aesimc q10,q10
529 .inst 0xf3b0236e @ aesd q1,q15
530 .inst 0xf3f0436e @ aesd q10,q15
549 .size aes_v8_cbc_encrypt,.-aes_v8_cbc_encrypt
550 .globl aes_v8_ctr32_encrypt_blocks
551 .type aes_v8_ctr32_encrypt_blocks,%function
553 aes_v8_ctr32_encrypt_blocks:
555 stmdb sp!,{r4-r10,lr}
556 vstmdb sp!,{d8-d15} @ ABI specification says so
557 ldr r4, [ip] @ load remaining arg
563 vld1.32 {q8-q9},[r3] @ load key schedule...
567 add r7,r3,r5,lsl#4 @ pointer to last 5 round keys
569 vld1.32 {q12-q13},[r7]!
570 vld1.32 {q14-q15},[r7]!
593 .inst 0xf3b00320 @ aese q0,q8
594 .inst 0xf3b02320 @ aese q1,q8
595 .inst 0xf3f04320 @ aese q10,q8
597 .inst 0xf3b00380 @ aesmc q0,q0
598 .inst 0xf3b02382 @ aesmc q1,q1
599 .inst 0xf3f043a4 @ aesmc q10,q10
601 .inst 0xf3b00322 @ aese q0,q9
602 .inst 0xf3b02322 @ aese q1,q9
603 .inst 0xf3f04322 @ aese q10,q9
605 .inst 0xf3b00380 @ aesmc q0,q0
606 .inst 0xf3b02382 @ aesmc q1,q1
607 .inst 0xf3f043a4 @ aesmc q10,q10
610 .inst 0xf3b00320 @ aese q0,q8
611 .inst 0xf3b02320 @ aese q1,q8
612 .inst 0xf3f04320 @ aese q10,q8
614 .inst 0xf3b08380 @ aesmc q4,q0
616 .inst 0xf3b0a382 @ aesmc q5,q1
617 .inst 0xf3f043a4 @ aesmc q10,q10
619 .inst 0xf3b08322 @ aese q4,q9
621 .inst 0xf3b0a322 @ aese q5,q9
622 .inst 0xf3f04322 @ aese q10,q9
624 .inst 0xf3b08388 @ aesmc q4,q4
626 .inst 0xf3b0a38a @ aesmc q5,q5
627 .inst 0xf3f023a4 @ aesmc q9,q10
630 .inst 0xf3b08328 @ aese q4,q12
631 .inst 0xf3b0a328 @ aese q5,q12
632 .inst 0xf3f02328 @ aese q9,q12
635 .inst 0xf3b08388 @ aesmc q4,q4
636 .inst 0xf3b0a38a @ aesmc q5,q5
637 .inst 0xf3f023a2 @ aesmc q9,q9
640 .inst 0xf3b0832a @ aese q4,q13
641 .inst 0xf3b0a32a @ aese q5,q13
642 .inst 0xf3f0232a @ aese q9,q13
645 .inst 0xf3b08388 @ aesmc q4,q4
646 vld1.32 {q8},[r7]! @ re-pre-load rndkey[0]
647 .inst 0xf3b0a38a @ aesmc q5,q5
648 .inst 0xf3f023a2 @ aesmc q9,q9
651 .inst 0xf3b0832c @ aese q4,q14
652 .inst 0xf3b0a32c @ aese q5,q14
653 .inst 0xf3f0232c @ aese q9,q14
656 .inst 0xf3b08388 @ aesmc q4,q4
657 .inst 0xf3b0a38a @ aesmc q5,q5
658 .inst 0xf3f023a2 @ aesmc q9,q9
661 .inst 0xf3b0832e @ aese q4,q15
662 .inst 0xf3b0a32e @ aese q5,q15
663 .inst 0xf3f0232e @ aese q9,q15
669 vld1.32 {q9},[r7]! @ re-pre-load rndkey[1]
682 .inst 0xf3b00320 @ aese q0,q8
683 .inst 0xf3b02320 @ aese q1,q8
685 .inst 0xf3b00380 @ aesmc q0,q0
686 .inst 0xf3b02382 @ aesmc q1,q1
688 .inst 0xf3b00322 @ aese q0,q9
689 .inst 0xf3b02322 @ aese q1,q9
691 .inst 0xf3b00380 @ aesmc q0,q0
692 .inst 0xf3b02382 @ aesmc q1,q1
695 .inst 0xf3b00320 @ aese q0,q8
696 .inst 0xf3b02320 @ aese q1,q8
697 .inst 0xf3b00380 @ aesmc q0,q0
698 .inst 0xf3b02382 @ aesmc q1,q1
699 .inst 0xf3b00322 @ aese q0,q9
700 .inst 0xf3b02322 @ aese q1,q9
701 .inst 0xf3b00380 @ aesmc q0,q0
702 .inst 0xf3b02382 @ aesmc q1,q1
704 .inst 0xf3b00328 @ aese q0,q12
705 .inst 0xf3b02328 @ aese q1,q12
707 .inst 0xf3b00380 @ aesmc q0,q0
708 .inst 0xf3b02382 @ aesmc q1,q1
709 .inst 0xf3b0032a @ aese q0,q13
710 .inst 0xf3b0232a @ aese q1,q13
711 .inst 0xf3b00380 @ aesmc q0,q0
712 .inst 0xf3b02382 @ aesmc q1,q1
713 .inst 0xf3b0032c @ aese q0,q14
714 .inst 0xf3b0232c @ aese q1,q14
716 .inst 0xf3b00380 @ aesmc q0,q0
717 .inst 0xf3b02382 @ aesmc q1,q1
719 .inst 0xf3b0032e @ aese q0,q15
720 .inst 0xf3b0232e @ aese q1,q15
731 ldmia sp!,{r4-r10,pc}
732 .size aes_v8_ctr32_encrypt_blocks,.-aes_v8_ctr32_encrypt_blocks