Deleted Added
full compact
aes-armv4.S (305153) aes-armv4.S (326663)
1/* $FreeBSD: stable/11/secure/lib/libcrypto/arm/aes-armv4.S 305153 2016-08-31 20:33:59Z jkim $ */
1/* $FreeBSD: stable/11/secure/lib/libcrypto/arm/aes-armv4.S 326663 2017-12-07 18:04:48Z jkim $ */
2/* Do not modify. This file is auto-generated from aes-armv4.pl. */
3
4@ ====================================================================
5@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
6@ project. The module is, however, dual licensed under OpenSSL and
7@ CRYPTOGAMS licenses depending on where you obtain it. For further
8@ details see http://www.openssl.org/~appro/cryptogams/.
9@ ====================================================================
10
11@ AES for ARMv4
12
13@ January 2007.
14@
15@ Code uses single 1K S-box and is >2 times faster than code generated
16@ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
17@ allows to merge logical or arithmetic operation with shift or rotate
18@ in one instruction and emit combined result every cycle. The module
19@ is endian-neutral. The performance is ~42 cycles/byte for 128-bit
20@ key [on single-issue Xscale PXA250 core].
21
22@ May 2007.
23@
24@ AES_set_[en|de]crypt_key is added.
25
26@ July 2010.
27@
28@ Rescheduling for dual-issue pipeline resulted in 12% improvement on
29@ Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
30
31@ February 2011.
32@
33@ Profiler-assisted and platform-specific optimization resulted in 16%
34@ improvement on Cortex A8 core and ~21.5 cycles per byte.
35
36#ifndef __KERNEL__
37# include "arm_arch.h"
38#else
39# define __ARM_ARCH__ __LINUX_ARM_ARCH__
40#endif
41
42.text
43#if __ARM_ARCH__<7
44.code 32
45#else
46.syntax unified
47# ifdef __thumb2__
48.thumb
49# else
50.code 32
51# endif
52#endif
53
54.type AES_Te,%object
55.align 5
56AES_Te:
57.word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
58.word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
59.word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
60.word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
61.word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
62.word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
63.word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
64.word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
65.word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
66.word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
67.word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
68.word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
69.word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
70.word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
71.word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
72.word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
73.word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
74.word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
75.word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
76.word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
77.word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
78.word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
79.word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
80.word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
81.word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
82.word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
83.word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
84.word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
85.word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
86.word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
87.word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
88.word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
89.word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
90.word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
91.word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
92.word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
93.word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
94.word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
95.word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
96.word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
97.word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
98.word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
99.word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
100.word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
101.word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
102.word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
103.word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
104.word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
105.word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
106.word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
107.word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
108.word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
109.word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
110.word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
111.word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
112.word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
113.word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
114.word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
115.word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
116.word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
117.word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
118.word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
119.word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
120.word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
121@ Te4[256]
122.byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
123.byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
124.byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
125.byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
126.byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
127.byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
128.byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
129.byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
130.byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
131.byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
132.byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
133.byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
134.byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
135.byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
136.byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
137.byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
138.byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
139.byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
140.byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
141.byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
142.byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
143.byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
144.byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
145.byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
146.byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
147.byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
148.byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
149.byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
150.byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
151.byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
152.byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
153.byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
154@ rcon[]
155.word 0x01000000, 0x02000000, 0x04000000, 0x08000000
156.word 0x10000000, 0x20000000, 0x40000000, 0x80000000
157.word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
158.size AES_Te,.-AES_Te
159
160@ void AES_encrypt(const unsigned char *in, unsigned char *out,
161@ const AES_KEY *key) {
162.global AES_encrypt
163.type AES_encrypt,%function
164.align 5
165AES_encrypt:
166#if __ARM_ARCH__<7
167 sub r3,pc,#8 @ AES_encrypt
168#else
2/* Do not modify. This file is auto-generated from aes-armv4.pl. */
3
4@ ====================================================================
5@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
6@ project. The module is, however, dual licensed under OpenSSL and
7@ CRYPTOGAMS licenses depending on where you obtain it. For further
8@ details see http://www.openssl.org/~appro/cryptogams/.
9@ ====================================================================
10
11@ AES for ARMv4
12
13@ January 2007.
14@
15@ Code uses single 1K S-box and is >2 times faster than code generated
16@ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
17@ allows to merge logical or arithmetic operation with shift or rotate
18@ in one instruction and emit combined result every cycle. The module
19@ is endian-neutral. The performance is ~42 cycles/byte for 128-bit
20@ key [on single-issue Xscale PXA250 core].
21
22@ May 2007.
23@
24@ AES_set_[en|de]crypt_key is added.
25
26@ July 2010.
27@
28@ Rescheduling for dual-issue pipeline resulted in 12% improvement on
29@ Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
30
31@ February 2011.
32@
33@ Profiler-assisted and platform-specific optimization resulted in 16%
34@ improvement on Cortex A8 core and ~21.5 cycles per byte.
35
36#ifndef __KERNEL__
37# include "arm_arch.h"
38#else
39# define __ARM_ARCH__ __LINUX_ARM_ARCH__
40#endif
41
42.text
43#if __ARM_ARCH__<7
44.code 32
45#else
46.syntax unified
47# ifdef __thumb2__
48.thumb
49# else
50.code 32
51# endif
52#endif
53
54.type AES_Te,%object
55.align 5
56AES_Te:
57.word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
58.word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
59.word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
60.word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
61.word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
62.word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
63.word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
64.word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
65.word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
66.word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
67.word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
68.word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
69.word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
70.word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
71.word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
72.word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
73.word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
74.word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
75.word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
76.word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
77.word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
78.word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
79.word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
80.word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
81.word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
82.word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
83.word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
84.word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
85.word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
86.word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
87.word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
88.word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
89.word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
90.word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
91.word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
92.word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
93.word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
94.word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
95.word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
96.word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
97.word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
98.word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
99.word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
100.word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
101.word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
102.word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
103.word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
104.word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
105.word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
106.word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
107.word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
108.word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
109.word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
110.word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
111.word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
112.word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
113.word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
114.word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
115.word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
116.word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
117.word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
118.word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
119.word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
120.word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
121@ Te4[256]
122.byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
123.byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
124.byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
125.byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
126.byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
127.byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
128.byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
129.byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
130.byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
131.byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
132.byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
133.byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
134.byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
135.byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
136.byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
137.byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
138.byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
139.byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
140.byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
141.byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
142.byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
143.byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
144.byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
145.byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
146.byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
147.byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
148.byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
149.byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
150.byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
151.byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
152.byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
153.byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
154@ rcon[]
155.word 0x01000000, 0x02000000, 0x04000000, 0x08000000
156.word 0x10000000, 0x20000000, 0x40000000, 0x80000000
157.word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
158.size AES_Te,.-AES_Te
159
160@ void AES_encrypt(const unsigned char *in, unsigned char *out,
161@ const AES_KEY *key) {
162.global AES_encrypt
163.type AES_encrypt,%function
164.align 5
165AES_encrypt:
166#if __ARM_ARCH__<7
167 sub r3,pc,#8 @ AES_encrypt
168#else
169 adr r3,AES_encrypt
169 adr r3,.
170#endif
171 stmdb sp!,{r1,r4-r12,lr}
172 mov r12,r0 @ inp
173 mov r11,r2
174 sub r10,r3,#AES_encrypt-AES_Te @ Te
175#if __ARM_ARCH__<7
176 ldrb r0,[r12,#3] @ load input data in endian-neutral
177 ldrb r4,[r12,#2] @ manner...
178 ldrb r5,[r12,#1]
179 ldrb r6,[r12,#0]
180 orr r0,r0,r4,lsl#8
181 ldrb r1,[r12,#7]
182 orr r0,r0,r5,lsl#16
183 ldrb r4,[r12,#6]
184 orr r0,r0,r6,lsl#24
185 ldrb r5,[r12,#5]
186 ldrb r6,[r12,#4]
187 orr r1,r1,r4,lsl#8
188 ldrb r2,[r12,#11]
189 orr r1,r1,r5,lsl#16
190 ldrb r4,[r12,#10]
191 orr r1,r1,r6,lsl#24
192 ldrb r5,[r12,#9]
193 ldrb r6,[r12,#8]
194 orr r2,r2,r4,lsl#8
195 ldrb r3,[r12,#15]
196 orr r2,r2,r5,lsl#16
197 ldrb r4,[r12,#14]
198 orr r2,r2,r6,lsl#24
199 ldrb r5,[r12,#13]
200 ldrb r6,[r12,#12]
201 orr r3,r3,r4,lsl#8
202 orr r3,r3,r5,lsl#16
203 orr r3,r3,r6,lsl#24
204#else
205 ldr r0,[r12,#0]
206 ldr r1,[r12,#4]
207 ldr r2,[r12,#8]
208 ldr r3,[r12,#12]
209#ifdef __ARMEL__
210 rev r0,r0
211 rev r1,r1
212 rev r2,r2
213 rev r3,r3
214#endif
215#endif
216 bl _armv4_AES_encrypt
217
218 ldr r12,[sp],#4 @ pop out
219#if __ARM_ARCH__>=7
220#ifdef __ARMEL__
221 rev r0,r0
222 rev r1,r1
223 rev r2,r2
224 rev r3,r3
225#endif
226 str r0,[r12,#0]
227 str r1,[r12,#4]
228 str r2,[r12,#8]
229 str r3,[r12,#12]
230#else
231 mov r4,r0,lsr#24 @ write output in endian-neutral
232 mov r5,r0,lsr#16 @ manner...
233 mov r6,r0,lsr#8
234 strb r4,[r12,#0]
235 strb r5,[r12,#1]
236 mov r4,r1,lsr#24
237 strb r6,[r12,#2]
238 mov r5,r1,lsr#16
239 strb r0,[r12,#3]
240 mov r6,r1,lsr#8
241 strb r4,[r12,#4]
242 strb r5,[r12,#5]
243 mov r4,r2,lsr#24
244 strb r6,[r12,#6]
245 mov r5,r2,lsr#16
246 strb r1,[r12,#7]
247 mov r6,r2,lsr#8
248 strb r4,[r12,#8]
249 strb r5,[r12,#9]
250 mov r4,r3,lsr#24
251 strb r6,[r12,#10]
252 mov r5,r3,lsr#16
253 strb r2,[r12,#11]
254 mov r6,r3,lsr#8
255 strb r4,[r12,#12]
256 strb r5,[r12,#13]
257 strb r6,[r12,#14]
258 strb r3,[r12,#15]
259#endif
260#if __ARM_ARCH__>=5
261 ldmia sp!,{r4-r12,pc}
262#else
263 ldmia sp!,{r4-r12,lr}
264 tst lr,#1
265 moveq pc,lr @ be binary compatible with V4, yet
266 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
267#endif
268.size AES_encrypt,.-AES_encrypt
269
270.type _armv4_AES_encrypt,%function
271.align 2
272_armv4_AES_encrypt:
273 str lr,[sp,#-4]! @ push lr
274 ldmia r11!,{r4-r7}
275 eor r0,r0,r4
276 ldr r12,[r11,#240-16]
277 eor r1,r1,r5
278 eor r2,r2,r6
279 eor r3,r3,r7
280 sub r12,r12,#1
281 mov lr,#255
282
283 and r7,lr,r0
284 and r8,lr,r0,lsr#8
285 and r9,lr,r0,lsr#16
286 mov r0,r0,lsr#24
287.Lenc_loop:
288 ldr r4,[r10,r7,lsl#2] @ Te3[s0>>0]
289 and r7,lr,r1,lsr#16 @ i0
290 ldr r5,[r10,r8,lsl#2] @ Te2[s0>>8]
291 and r8,lr,r1
292 ldr r6,[r10,r9,lsl#2] @ Te1[s0>>16]
293 and r9,lr,r1,lsr#8
294 ldr r0,[r10,r0,lsl#2] @ Te0[s0>>24]
295 mov r1,r1,lsr#24
296
297 ldr r7,[r10,r7,lsl#2] @ Te1[s1>>16]
298 ldr r8,[r10,r8,lsl#2] @ Te3[s1>>0]
299 ldr r9,[r10,r9,lsl#2] @ Te2[s1>>8]
300 eor r0,r0,r7,ror#8
301 ldr r1,[r10,r1,lsl#2] @ Te0[s1>>24]
302 and r7,lr,r2,lsr#8 @ i0
303 eor r5,r5,r8,ror#8
304 and r8,lr,r2,lsr#16 @ i1
305 eor r6,r6,r9,ror#8
306 and r9,lr,r2
307 ldr r7,[r10,r7,lsl#2] @ Te2[s2>>8]
308 eor r1,r1,r4,ror#24
309 ldr r8,[r10,r8,lsl#2] @ Te1[s2>>16]
310 mov r2,r2,lsr#24
311
312 ldr r9,[r10,r9,lsl#2] @ Te3[s2>>0]
313 eor r0,r0,r7,ror#16
314 ldr r2,[r10,r2,lsl#2] @ Te0[s2>>24]
315 and r7,lr,r3 @ i0
316 eor r1,r1,r8,ror#8
317 and r8,lr,r3,lsr#8 @ i1
318 eor r6,r6,r9,ror#16
319 and r9,lr,r3,lsr#16 @ i2
320 ldr r7,[r10,r7,lsl#2] @ Te3[s3>>0]
321 eor r2,r2,r5,ror#16
322 ldr r8,[r10,r8,lsl#2] @ Te2[s3>>8]
323 mov r3,r3,lsr#24
324
325 ldr r9,[r10,r9,lsl#2] @ Te1[s3>>16]
326 eor r0,r0,r7,ror#24
327 ldr r7,[r11],#16
328 eor r1,r1,r8,ror#16
329 ldr r3,[r10,r3,lsl#2] @ Te0[s3>>24]
330 eor r2,r2,r9,ror#8
331 ldr r4,[r11,#-12]
332 eor r3,r3,r6,ror#8
333
334 ldr r5,[r11,#-8]
335 eor r0,r0,r7
336 ldr r6,[r11,#-4]
337 and r7,lr,r0
338 eor r1,r1,r4
339 and r8,lr,r0,lsr#8
340 eor r2,r2,r5
341 and r9,lr,r0,lsr#16
342 eor r3,r3,r6
343 mov r0,r0,lsr#24
344
345 subs r12,r12,#1
346 bne .Lenc_loop
347
348 add r10,r10,#2
349
350 ldrb r4,[r10,r7,lsl#2] @ Te4[s0>>0]
351 and r7,lr,r1,lsr#16 @ i0
352 ldrb r5,[r10,r8,lsl#2] @ Te4[s0>>8]
353 and r8,lr,r1
354 ldrb r6,[r10,r9,lsl#2] @ Te4[s0>>16]
355 and r9,lr,r1,lsr#8
356 ldrb r0,[r10,r0,lsl#2] @ Te4[s0>>24]
357 mov r1,r1,lsr#24
358
359 ldrb r7,[r10,r7,lsl#2] @ Te4[s1>>16]
360 ldrb r8,[r10,r8,lsl#2] @ Te4[s1>>0]
361 ldrb r9,[r10,r9,lsl#2] @ Te4[s1>>8]
362 eor r0,r7,r0,lsl#8
363 ldrb r1,[r10,r1,lsl#2] @ Te4[s1>>24]
364 and r7,lr,r2,lsr#8 @ i0
365 eor r5,r8,r5,lsl#8
366 and r8,lr,r2,lsr#16 @ i1
367 eor r6,r9,r6,lsl#8
368 and r9,lr,r2
369 ldrb r7,[r10,r7,lsl#2] @ Te4[s2>>8]
370 eor r1,r4,r1,lsl#24
371 ldrb r8,[r10,r8,lsl#2] @ Te4[s2>>16]
372 mov r2,r2,lsr#24
373
374 ldrb r9,[r10,r9,lsl#2] @ Te4[s2>>0]
375 eor r0,r7,r0,lsl#8
376 ldrb r2,[r10,r2,lsl#2] @ Te4[s2>>24]
377 and r7,lr,r3 @ i0
378 eor r1,r1,r8,lsl#16
379 and r8,lr,r3,lsr#8 @ i1
380 eor r6,r9,r6,lsl#8
381 and r9,lr,r3,lsr#16 @ i2
382 ldrb r7,[r10,r7,lsl#2] @ Te4[s3>>0]
383 eor r2,r5,r2,lsl#24
384 ldrb r8,[r10,r8,lsl#2] @ Te4[s3>>8]
385 mov r3,r3,lsr#24
386
387 ldrb r9,[r10,r9,lsl#2] @ Te4[s3>>16]
388 eor r0,r7,r0,lsl#8
389 ldr r7,[r11,#0]
390 ldrb r3,[r10,r3,lsl#2] @ Te4[s3>>24]
391 eor r1,r1,r8,lsl#8
392 ldr r4,[r11,#4]
393 eor r2,r2,r9,lsl#16
394 ldr r5,[r11,#8]
395 eor r3,r6,r3,lsl#24
396 ldr r6,[r11,#12]
397
398 eor r0,r0,r7
399 eor r1,r1,r4
400 eor r2,r2,r5
401 eor r3,r3,r6
402
403 sub r10,r10,#2
404 ldr pc,[sp],#4 @ pop and return
405.size _armv4_AES_encrypt,.-_armv4_AES_encrypt
406
407.global private_AES_set_encrypt_key
408.type private_AES_set_encrypt_key,%function
409.align 5
410private_AES_set_encrypt_key:
411_armv4_AES_set_encrypt_key:
412#if __ARM_ARCH__<7
413 sub r3,pc,#8 @ AES_set_encrypt_key
414#else
170#endif
171 stmdb sp!,{r1,r4-r12,lr}
172 mov r12,r0 @ inp
173 mov r11,r2
174 sub r10,r3,#AES_encrypt-AES_Te @ Te
175#if __ARM_ARCH__<7
176 ldrb r0,[r12,#3] @ load input data in endian-neutral
177 ldrb r4,[r12,#2] @ manner...
178 ldrb r5,[r12,#1]
179 ldrb r6,[r12,#0]
180 orr r0,r0,r4,lsl#8
181 ldrb r1,[r12,#7]
182 orr r0,r0,r5,lsl#16
183 ldrb r4,[r12,#6]
184 orr r0,r0,r6,lsl#24
185 ldrb r5,[r12,#5]
186 ldrb r6,[r12,#4]
187 orr r1,r1,r4,lsl#8
188 ldrb r2,[r12,#11]
189 orr r1,r1,r5,lsl#16
190 ldrb r4,[r12,#10]
191 orr r1,r1,r6,lsl#24
192 ldrb r5,[r12,#9]
193 ldrb r6,[r12,#8]
194 orr r2,r2,r4,lsl#8
195 ldrb r3,[r12,#15]
196 orr r2,r2,r5,lsl#16
197 ldrb r4,[r12,#14]
198 orr r2,r2,r6,lsl#24
199 ldrb r5,[r12,#13]
200 ldrb r6,[r12,#12]
201 orr r3,r3,r4,lsl#8
202 orr r3,r3,r5,lsl#16
203 orr r3,r3,r6,lsl#24
204#else
205 ldr r0,[r12,#0]
206 ldr r1,[r12,#4]
207 ldr r2,[r12,#8]
208 ldr r3,[r12,#12]
209#ifdef __ARMEL__
210 rev r0,r0
211 rev r1,r1
212 rev r2,r2
213 rev r3,r3
214#endif
215#endif
216 bl _armv4_AES_encrypt
217
218 ldr r12,[sp],#4 @ pop out
219#if __ARM_ARCH__>=7
220#ifdef __ARMEL__
221 rev r0,r0
222 rev r1,r1
223 rev r2,r2
224 rev r3,r3
225#endif
226 str r0,[r12,#0]
227 str r1,[r12,#4]
228 str r2,[r12,#8]
229 str r3,[r12,#12]
230#else
231 mov r4,r0,lsr#24 @ write output in endian-neutral
232 mov r5,r0,lsr#16 @ manner...
233 mov r6,r0,lsr#8
234 strb r4,[r12,#0]
235 strb r5,[r12,#1]
236 mov r4,r1,lsr#24
237 strb r6,[r12,#2]
238 mov r5,r1,lsr#16
239 strb r0,[r12,#3]
240 mov r6,r1,lsr#8
241 strb r4,[r12,#4]
242 strb r5,[r12,#5]
243 mov r4,r2,lsr#24
244 strb r6,[r12,#6]
245 mov r5,r2,lsr#16
246 strb r1,[r12,#7]
247 mov r6,r2,lsr#8
248 strb r4,[r12,#8]
249 strb r5,[r12,#9]
250 mov r4,r3,lsr#24
251 strb r6,[r12,#10]
252 mov r5,r3,lsr#16
253 strb r2,[r12,#11]
254 mov r6,r3,lsr#8
255 strb r4,[r12,#12]
256 strb r5,[r12,#13]
257 strb r6,[r12,#14]
258 strb r3,[r12,#15]
259#endif
260#if __ARM_ARCH__>=5
261 ldmia sp!,{r4-r12,pc}
262#else
263 ldmia sp!,{r4-r12,lr}
264 tst lr,#1
265 moveq pc,lr @ be binary compatible with V4, yet
266 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
267#endif
268.size AES_encrypt,.-AES_encrypt
269
270.type _armv4_AES_encrypt,%function
271.align 2
272_armv4_AES_encrypt:
273 str lr,[sp,#-4]! @ push lr
274 ldmia r11!,{r4-r7}
275 eor r0,r0,r4
276 ldr r12,[r11,#240-16]
277 eor r1,r1,r5
278 eor r2,r2,r6
279 eor r3,r3,r7
280 sub r12,r12,#1
281 mov lr,#255
282
283 and r7,lr,r0
284 and r8,lr,r0,lsr#8
285 and r9,lr,r0,lsr#16
286 mov r0,r0,lsr#24
287.Lenc_loop:
288 ldr r4,[r10,r7,lsl#2] @ Te3[s0>>0]
289 and r7,lr,r1,lsr#16 @ i0
290 ldr r5,[r10,r8,lsl#2] @ Te2[s0>>8]
291 and r8,lr,r1
292 ldr r6,[r10,r9,lsl#2] @ Te1[s0>>16]
293 and r9,lr,r1,lsr#8
294 ldr r0,[r10,r0,lsl#2] @ Te0[s0>>24]
295 mov r1,r1,lsr#24
296
297 ldr r7,[r10,r7,lsl#2] @ Te1[s1>>16]
298 ldr r8,[r10,r8,lsl#2] @ Te3[s1>>0]
299 ldr r9,[r10,r9,lsl#2] @ Te2[s1>>8]
300 eor r0,r0,r7,ror#8
301 ldr r1,[r10,r1,lsl#2] @ Te0[s1>>24]
302 and r7,lr,r2,lsr#8 @ i0
303 eor r5,r5,r8,ror#8
304 and r8,lr,r2,lsr#16 @ i1
305 eor r6,r6,r9,ror#8
306 and r9,lr,r2
307 ldr r7,[r10,r7,lsl#2] @ Te2[s2>>8]
308 eor r1,r1,r4,ror#24
309 ldr r8,[r10,r8,lsl#2] @ Te1[s2>>16]
310 mov r2,r2,lsr#24
311
312 ldr r9,[r10,r9,lsl#2] @ Te3[s2>>0]
313 eor r0,r0,r7,ror#16
314 ldr r2,[r10,r2,lsl#2] @ Te0[s2>>24]
315 and r7,lr,r3 @ i0
316 eor r1,r1,r8,ror#8
317 and r8,lr,r3,lsr#8 @ i1
318 eor r6,r6,r9,ror#16
319 and r9,lr,r3,lsr#16 @ i2
320 ldr r7,[r10,r7,lsl#2] @ Te3[s3>>0]
321 eor r2,r2,r5,ror#16
322 ldr r8,[r10,r8,lsl#2] @ Te2[s3>>8]
323 mov r3,r3,lsr#24
324
325 ldr r9,[r10,r9,lsl#2] @ Te1[s3>>16]
326 eor r0,r0,r7,ror#24
327 ldr r7,[r11],#16
328 eor r1,r1,r8,ror#16
329 ldr r3,[r10,r3,lsl#2] @ Te0[s3>>24]
330 eor r2,r2,r9,ror#8
331 ldr r4,[r11,#-12]
332 eor r3,r3,r6,ror#8
333
334 ldr r5,[r11,#-8]
335 eor r0,r0,r7
336 ldr r6,[r11,#-4]
337 and r7,lr,r0
338 eor r1,r1,r4
339 and r8,lr,r0,lsr#8
340 eor r2,r2,r5
341 and r9,lr,r0,lsr#16
342 eor r3,r3,r6
343 mov r0,r0,lsr#24
344
345 subs r12,r12,#1
346 bne .Lenc_loop
347
348 add r10,r10,#2
349
350 ldrb r4,[r10,r7,lsl#2] @ Te4[s0>>0]
351 and r7,lr,r1,lsr#16 @ i0
352 ldrb r5,[r10,r8,lsl#2] @ Te4[s0>>8]
353 and r8,lr,r1
354 ldrb r6,[r10,r9,lsl#2] @ Te4[s0>>16]
355 and r9,lr,r1,lsr#8
356 ldrb r0,[r10,r0,lsl#2] @ Te4[s0>>24]
357 mov r1,r1,lsr#24
358
359 ldrb r7,[r10,r7,lsl#2] @ Te4[s1>>16]
360 ldrb r8,[r10,r8,lsl#2] @ Te4[s1>>0]
361 ldrb r9,[r10,r9,lsl#2] @ Te4[s1>>8]
362 eor r0,r7,r0,lsl#8
363 ldrb r1,[r10,r1,lsl#2] @ Te4[s1>>24]
364 and r7,lr,r2,lsr#8 @ i0
365 eor r5,r8,r5,lsl#8
366 and r8,lr,r2,lsr#16 @ i1
367 eor r6,r9,r6,lsl#8
368 and r9,lr,r2
369 ldrb r7,[r10,r7,lsl#2] @ Te4[s2>>8]
370 eor r1,r4,r1,lsl#24
371 ldrb r8,[r10,r8,lsl#2] @ Te4[s2>>16]
372 mov r2,r2,lsr#24
373
374 ldrb r9,[r10,r9,lsl#2] @ Te4[s2>>0]
375 eor r0,r7,r0,lsl#8
376 ldrb r2,[r10,r2,lsl#2] @ Te4[s2>>24]
377 and r7,lr,r3 @ i0
378 eor r1,r1,r8,lsl#16
379 and r8,lr,r3,lsr#8 @ i1
380 eor r6,r9,r6,lsl#8
381 and r9,lr,r3,lsr#16 @ i2
382 ldrb r7,[r10,r7,lsl#2] @ Te4[s3>>0]
383 eor r2,r5,r2,lsl#24
384 ldrb r8,[r10,r8,lsl#2] @ Te4[s3>>8]
385 mov r3,r3,lsr#24
386
387 ldrb r9,[r10,r9,lsl#2] @ Te4[s3>>16]
388 eor r0,r7,r0,lsl#8
389 ldr r7,[r11,#0]
390 ldrb r3,[r10,r3,lsl#2] @ Te4[s3>>24]
391 eor r1,r1,r8,lsl#8
392 ldr r4,[r11,#4]
393 eor r2,r2,r9,lsl#16
394 ldr r5,[r11,#8]
395 eor r3,r6,r3,lsl#24
396 ldr r6,[r11,#12]
397
398 eor r0,r0,r7
399 eor r1,r1,r4
400 eor r2,r2,r5
401 eor r3,r3,r6
402
403 sub r10,r10,#2
404 ldr pc,[sp],#4 @ pop and return
405.size _armv4_AES_encrypt,.-_armv4_AES_encrypt
406
407.global private_AES_set_encrypt_key
408.type private_AES_set_encrypt_key,%function
409.align 5
410private_AES_set_encrypt_key:
411_armv4_AES_set_encrypt_key:
412#if __ARM_ARCH__<7
413 sub r3,pc,#8 @ AES_set_encrypt_key
414#else
415 adr r3,private_AES_set_encrypt_key
415 adr r3,.
416#endif
417 teq r0,#0
418#if __ARM_ARCH__>=7
419 itt eq @ Thumb2 thing, sanity check in ARM
420#endif
421 moveq r0,#-1
422 beq .Labrt
423 teq r2,#0
424#if __ARM_ARCH__>=7
425 itt eq @ Thumb2 thing, sanity check in ARM
426#endif
427 moveq r0,#-1
428 beq .Labrt
429
430 teq r1,#128
431 beq .Lok
432 teq r1,#192
433 beq .Lok
434 teq r1,#256
435#if __ARM_ARCH__>=7
436 itt ne @ Thumb2 thing, sanity check in ARM
437#endif
438 movne r0,#-1
439 bne .Labrt
440
441.Lok: stmdb sp!,{r4-r12,lr}
442 sub r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
443
444 mov r12,r0 @ inp
445 mov lr,r1 @ bits
446 mov r11,r2 @ key
447
448#if __ARM_ARCH__<7
449 ldrb r0,[r12,#3] @ load input data in endian-neutral
450 ldrb r4,[r12,#2] @ manner...
451 ldrb r5,[r12,#1]
452 ldrb r6,[r12,#0]
453 orr r0,r0,r4,lsl#8
454 ldrb r1,[r12,#7]
455 orr r0,r0,r5,lsl#16
456 ldrb r4,[r12,#6]
457 orr r0,r0,r6,lsl#24
458 ldrb r5,[r12,#5]
459 ldrb r6,[r12,#4]
460 orr r1,r1,r4,lsl#8
461 ldrb r2,[r12,#11]
462 orr r1,r1,r5,lsl#16
463 ldrb r4,[r12,#10]
464 orr r1,r1,r6,lsl#24
465 ldrb r5,[r12,#9]
466 ldrb r6,[r12,#8]
467 orr r2,r2,r4,lsl#8
468 ldrb r3,[r12,#15]
469 orr r2,r2,r5,lsl#16
470 ldrb r4,[r12,#14]
471 orr r2,r2,r6,lsl#24
472 ldrb r5,[r12,#13]
473 ldrb r6,[r12,#12]
474 orr r3,r3,r4,lsl#8
475 str r0,[r11],#16
476 orr r3,r3,r5,lsl#16
477 str r1,[r11,#-12]
478 orr r3,r3,r6,lsl#24
479 str r2,[r11,#-8]
480 str r3,[r11,#-4]
481#else
482 ldr r0,[r12,#0]
483 ldr r1,[r12,#4]
484 ldr r2,[r12,#8]
485 ldr r3,[r12,#12]
486#ifdef __ARMEL__
487 rev r0,r0
488 rev r1,r1
489 rev r2,r2
490 rev r3,r3
491#endif
492 str r0,[r11],#16
493 str r1,[r11,#-12]
494 str r2,[r11,#-8]
495 str r3,[r11,#-4]
496#endif
497
498 teq lr,#128
499 bne .Lnot128
500 mov r12,#10
501 str r12,[r11,#240-16]
502 add r6,r10,#256 @ rcon
503 mov lr,#255
504
505.L128_loop:
506 and r5,lr,r3,lsr#24
507 and r7,lr,r3,lsr#16
508 ldrb r5,[r10,r5]
509 and r8,lr,r3,lsr#8
510 ldrb r7,[r10,r7]
511 and r9,lr,r3
512 ldrb r8,[r10,r8]
513 orr r5,r5,r7,lsl#24
514 ldrb r9,[r10,r9]
515 orr r5,r5,r8,lsl#16
516 ldr r4,[r6],#4 @ rcon[i++]
517 orr r5,r5,r9,lsl#8
518 eor r5,r5,r4
519 eor r0,r0,r5 @ rk[4]=rk[0]^...
520 eor r1,r1,r0 @ rk[5]=rk[1]^rk[4]
521 str r0,[r11],#16
522 eor r2,r2,r1 @ rk[6]=rk[2]^rk[5]
523 str r1,[r11,#-12]
524 eor r3,r3,r2 @ rk[7]=rk[3]^rk[6]
525 str r2,[r11,#-8]
526 subs r12,r12,#1
527 str r3,[r11,#-4]
528 bne .L128_loop
529 sub r2,r11,#176
530 b .Ldone
531
532.Lnot128:
533#if __ARM_ARCH__<7
534 ldrb r8,[r12,#19]
535 ldrb r4,[r12,#18]
536 ldrb r5,[r12,#17]
537 ldrb r6,[r12,#16]
538 orr r8,r8,r4,lsl#8
539 ldrb r9,[r12,#23]
540 orr r8,r8,r5,lsl#16
541 ldrb r4,[r12,#22]
542 orr r8,r8,r6,lsl#24
543 ldrb r5,[r12,#21]
544 ldrb r6,[r12,#20]
545 orr r9,r9,r4,lsl#8
546 orr r9,r9,r5,lsl#16
547 str r8,[r11],#8
548 orr r9,r9,r6,lsl#24
549 str r9,[r11,#-4]
550#else
551 ldr r8,[r12,#16]
552 ldr r9,[r12,#20]
553#ifdef __ARMEL__
554 rev r8,r8
555 rev r9,r9
556#endif
557 str r8,[r11],#8
558 str r9,[r11,#-4]
559#endif
560
561 teq lr,#192
562 bne .Lnot192
563 mov r12,#12
564 str r12,[r11,#240-24]
565 add r6,r10,#256 @ rcon
566 mov lr,#255
567 mov r12,#8
568
569.L192_loop:
570 and r5,lr,r9,lsr#24
571 and r7,lr,r9,lsr#16
572 ldrb r5,[r10,r5]
573 and r8,lr,r9,lsr#8
574 ldrb r7,[r10,r7]
575 and r9,lr,r9
576 ldrb r8,[r10,r8]
577 orr r5,r5,r7,lsl#24
578 ldrb r9,[r10,r9]
579 orr r5,r5,r8,lsl#16
580 ldr r4,[r6],#4 @ rcon[i++]
581 orr r5,r5,r9,lsl#8
582 eor r9,r5,r4
583 eor r0,r0,r9 @ rk[6]=rk[0]^...
584 eor r1,r1,r0 @ rk[7]=rk[1]^rk[6]
585 str r0,[r11],#24
586 eor r2,r2,r1 @ rk[8]=rk[2]^rk[7]
587 str r1,[r11,#-20]
588 eor r3,r3,r2 @ rk[9]=rk[3]^rk[8]
589 str r2,[r11,#-16]
590 subs r12,r12,#1
591 str r3,[r11,#-12]
592#if __ARM_ARCH__>=7
593 itt eq @ Thumb2 thing, sanity check in ARM
594#endif
595 subeq r2,r11,#216
596 beq .Ldone
597
598 ldr r7,[r11,#-32]
599 ldr r8,[r11,#-28]
600 eor r7,r7,r3 @ rk[10]=rk[4]^rk[9]
601 eor r9,r8,r7 @ rk[11]=rk[5]^rk[10]
602 str r7,[r11,#-8]
603 str r9,[r11,#-4]
604 b .L192_loop
605
606.Lnot192:
607#if __ARM_ARCH__<7
608 ldrb r8,[r12,#27]
609 ldrb r4,[r12,#26]
610 ldrb r5,[r12,#25]
611 ldrb r6,[r12,#24]
612 orr r8,r8,r4,lsl#8
613 ldrb r9,[r12,#31]
614 orr r8,r8,r5,lsl#16
615 ldrb r4,[r12,#30]
616 orr r8,r8,r6,lsl#24
617 ldrb r5,[r12,#29]
618 ldrb r6,[r12,#28]
619 orr r9,r9,r4,lsl#8
620 orr r9,r9,r5,lsl#16
621 str r8,[r11],#8
622 orr r9,r9,r6,lsl#24
623 str r9,[r11,#-4]
624#else
625 ldr r8,[r12,#24]
626 ldr r9,[r12,#28]
627#ifdef __ARMEL__
628 rev r8,r8
629 rev r9,r9
630#endif
631 str r8,[r11],#8
632 str r9,[r11,#-4]
633#endif
634
635 mov r12,#14
636 str r12,[r11,#240-32]
637 add r6,r10,#256 @ rcon
638 mov lr,#255
639 mov r12,#7
640
641.L256_loop:
642 and r5,lr,r9,lsr#24
643 and r7,lr,r9,lsr#16
644 ldrb r5,[r10,r5]
645 and r8,lr,r9,lsr#8
646 ldrb r7,[r10,r7]
647 and r9,lr,r9
648 ldrb r8,[r10,r8]
649 orr r5,r5,r7,lsl#24
650 ldrb r9,[r10,r9]
651 orr r5,r5,r8,lsl#16
652 ldr r4,[r6],#4 @ rcon[i++]
653 orr r5,r5,r9,lsl#8
654 eor r9,r5,r4
655 eor r0,r0,r9 @ rk[8]=rk[0]^...
656 eor r1,r1,r0 @ rk[9]=rk[1]^rk[8]
657 str r0,[r11],#32
658 eor r2,r2,r1 @ rk[10]=rk[2]^rk[9]
659 str r1,[r11,#-28]
660 eor r3,r3,r2 @ rk[11]=rk[3]^rk[10]
661 str r2,[r11,#-24]
662 subs r12,r12,#1
663 str r3,[r11,#-20]
664#if __ARM_ARCH__>=7
665 itt eq @ Thumb2 thing, sanity check in ARM
666#endif
667 subeq r2,r11,#256
668 beq .Ldone
669
670 and r5,lr,r3
671 and r7,lr,r3,lsr#8
672 ldrb r5,[r10,r5]
673 and r8,lr,r3,lsr#16
674 ldrb r7,[r10,r7]
675 and r9,lr,r3,lsr#24
676 ldrb r8,[r10,r8]
677 orr r5,r5,r7,lsl#8
678 ldrb r9,[r10,r9]
679 orr r5,r5,r8,lsl#16
680 ldr r4,[r11,#-48]
681 orr r5,r5,r9,lsl#24
682
683 ldr r7,[r11,#-44]
684 ldr r8,[r11,#-40]
685 eor r4,r4,r5 @ rk[12]=rk[4]^...
686 ldr r9,[r11,#-36]
687 eor r7,r7,r4 @ rk[13]=rk[5]^rk[12]
688 str r4,[r11,#-16]
689 eor r8,r8,r7 @ rk[14]=rk[6]^rk[13]
690 str r7,[r11,#-12]
691 eor r9,r9,r8 @ rk[15]=rk[7]^rk[14]
692 str r8,[r11,#-8]
693 str r9,[r11,#-4]
694 b .L256_loop
695
696.align 2
697.Ldone: mov r0,#0
698 ldmia sp!,{r4-r12,lr}
699.Labrt:
700#if __ARM_ARCH__>=5
701 bx lr @ .word 0xe12fff1e
702#else
703 tst lr,#1
704 moveq pc,lr @ be binary compatible with V4, yet
705 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
706#endif
707.size private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
708
709.global private_AES_set_decrypt_key
710.type private_AES_set_decrypt_key,%function
711.align 5
712private_AES_set_decrypt_key:
713 str lr,[sp,#-4]! @ push lr
714 bl _armv4_AES_set_encrypt_key
715 teq r0,#0
716 ldr lr,[sp],#4 @ pop lr
717 bne .Labrt
718
719 mov r0,r2 @ AES_set_encrypt_key preserves r2,
720 mov r1,r2 @ which is AES_KEY *key
721 b _armv4_AES_set_enc2dec_key
722.size private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
723
724@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
725.global AES_set_enc2dec_key
726.type AES_set_enc2dec_key,%function
727.align 5
728AES_set_enc2dec_key:
729_armv4_AES_set_enc2dec_key:
730 stmdb sp!,{r4-r12,lr}
731
732 ldr r12,[r0,#240]
733 mov r7,r0 @ input
734 add r8,r0,r12,lsl#4
735 mov r11,r1 @ ouput
736 add r10,r1,r12,lsl#4
737 str r12,[r1,#240]
738
739.Linv: ldr r0,[r7],#16
740 ldr r1,[r7,#-12]
741 ldr r2,[r7,#-8]
742 ldr r3,[r7,#-4]
743 ldr r4,[r8],#-16
744 ldr r5,[r8,#16+4]
745 ldr r6,[r8,#16+8]
746 ldr r9,[r8,#16+12]
747 str r0,[r10],#-16
748 str r1,[r10,#16+4]
749 str r2,[r10,#16+8]
750 str r3,[r10,#16+12]
751 str r4,[r11],#16
752 str r5,[r11,#-12]
753 str r6,[r11,#-8]
754 str r9,[r11,#-4]
755 teq r7,r8
756 bne .Linv
757
758 ldr r0,[r7]
759 ldr r1,[r7,#4]
760 ldr r2,[r7,#8]
761 ldr r3,[r7,#12]
762 str r0,[r11]
763 str r1,[r11,#4]
764 str r2,[r11,#8]
765 str r3,[r11,#12]
766 sub r11,r11,r12,lsl#3
767 ldr r0,[r11,#16]! @ prefetch tp1
768 mov r7,#0x80
769 mov r8,#0x1b
770 orr r7,r7,#0x8000
771 orr r8,r8,#0x1b00
772 orr r7,r7,r7,lsl#16
773 orr r8,r8,r8,lsl#16
774 sub r12,r12,#1
775 mvn r9,r7
776 mov r12,r12,lsl#2 @ (rounds-1)*4
777
778.Lmix: and r4,r0,r7
779 and r1,r0,r9
780 sub r4,r4,r4,lsr#7
781 and r4,r4,r8
782 eor r1,r4,r1,lsl#1 @ tp2
783
784 and r4,r1,r7
785 and r2,r1,r9
786 sub r4,r4,r4,lsr#7
787 and r4,r4,r8
788 eor r2,r4,r2,lsl#1 @ tp4
789
790 and r4,r2,r7
791 and r3,r2,r9
792 sub r4,r4,r4,lsr#7
793 and r4,r4,r8
794 eor r3,r4,r3,lsl#1 @ tp8
795
796 eor r4,r1,r2
797 eor r5,r0,r3 @ tp9
798 eor r4,r4,r3 @ tpe
799 eor r4,r4,r1,ror#24
800 eor r4,r4,r5,ror#24 @ ^= ROTATE(tpb=tp9^tp2,8)
801 eor r4,r4,r2,ror#16
802 eor r4,r4,r5,ror#16 @ ^= ROTATE(tpd=tp9^tp4,16)
803 eor r4,r4,r5,ror#8 @ ^= ROTATE(tp9,24)
804
805 ldr r0,[r11,#4] @ prefetch tp1
806 str r4,[r11],#4
807 subs r12,r12,#1
808 bne .Lmix
809
810 mov r0,#0
811#if __ARM_ARCH__>=5
812 ldmia sp!,{r4-r12,pc}
813#else
814 ldmia sp!,{r4-r12,lr}
815 tst lr,#1
816 moveq pc,lr @ be binary compatible with V4, yet
817 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
818#endif
819.size AES_set_enc2dec_key,.-AES_set_enc2dec_key
820
821.type AES_Td,%object
822.align 5
823AES_Td:
824.word 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
825.word 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
826.word 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
827.word 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
828.word 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
829.word 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
830.word 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
831.word 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
832.word 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
833.word 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
834.word 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
835.word 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
836.word 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
837.word 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
838.word 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
839.word 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
840.word 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
841.word 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
842.word 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
843.word 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
844.word 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
845.word 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
846.word 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
847.word 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
848.word 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
849.word 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
850.word 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
851.word 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
852.word 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
853.word 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
854.word 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
855.word 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
856.word 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
857.word 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
858.word 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
859.word 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
860.word 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
861.word 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
862.word 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
863.word 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
864.word 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
865.word 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
866.word 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
867.word 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
868.word 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
869.word 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
870.word 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
871.word 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
872.word 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
873.word 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
874.word 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
875.word 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
876.word 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
877.word 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
878.word 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
879.word 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
880.word 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
881.word 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
882.word 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
883.word 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
884.word 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
885.word 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
886.word 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
887.word 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
888@ Td4[256]
889.byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
890.byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
891.byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
892.byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
893.byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
894.byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
895.byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
896.byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
897.byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
898.byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
899.byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
900.byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
901.byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
902.byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
903.byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
904.byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
905.byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
906.byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
907.byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
908.byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
909.byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
910.byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
911.byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
912.byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
913.byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
914.byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
915.byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
916.byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
917.byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
918.byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
919.byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
920.byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
921.size AES_Td,.-AES_Td
922
923@ void AES_decrypt(const unsigned char *in, unsigned char *out,
924@ const AES_KEY *key) {
925.global AES_decrypt
926.type AES_decrypt,%function
927.align 5
928AES_decrypt:
929#if __ARM_ARCH__<7
930 sub r3,pc,#8 @ AES_decrypt
931#else
416#endif
417 teq r0,#0
418#if __ARM_ARCH__>=7
419 itt eq @ Thumb2 thing, sanity check in ARM
420#endif
421 moveq r0,#-1
422 beq .Labrt
423 teq r2,#0
424#if __ARM_ARCH__>=7
425 itt eq @ Thumb2 thing, sanity check in ARM
426#endif
427 moveq r0,#-1
428 beq .Labrt
429
430 teq r1,#128
431 beq .Lok
432 teq r1,#192
433 beq .Lok
434 teq r1,#256
435#if __ARM_ARCH__>=7
436 itt ne @ Thumb2 thing, sanity check in ARM
437#endif
438 movne r0,#-1
439 bne .Labrt
440
441.Lok: stmdb sp!,{r4-r12,lr}
442 sub r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
443
444 mov r12,r0 @ inp
445 mov lr,r1 @ bits
446 mov r11,r2 @ key
447
448#if __ARM_ARCH__<7
449 ldrb r0,[r12,#3] @ load input data in endian-neutral
450 ldrb r4,[r12,#2] @ manner...
451 ldrb r5,[r12,#1]
452 ldrb r6,[r12,#0]
453 orr r0,r0,r4,lsl#8
454 ldrb r1,[r12,#7]
455 orr r0,r0,r5,lsl#16
456 ldrb r4,[r12,#6]
457 orr r0,r0,r6,lsl#24
458 ldrb r5,[r12,#5]
459 ldrb r6,[r12,#4]
460 orr r1,r1,r4,lsl#8
461 ldrb r2,[r12,#11]
462 orr r1,r1,r5,lsl#16
463 ldrb r4,[r12,#10]
464 orr r1,r1,r6,lsl#24
465 ldrb r5,[r12,#9]
466 ldrb r6,[r12,#8]
467 orr r2,r2,r4,lsl#8
468 ldrb r3,[r12,#15]
469 orr r2,r2,r5,lsl#16
470 ldrb r4,[r12,#14]
471 orr r2,r2,r6,lsl#24
472 ldrb r5,[r12,#13]
473 ldrb r6,[r12,#12]
474 orr r3,r3,r4,lsl#8
475 str r0,[r11],#16
476 orr r3,r3,r5,lsl#16
477 str r1,[r11,#-12]
478 orr r3,r3,r6,lsl#24
479 str r2,[r11,#-8]
480 str r3,[r11,#-4]
481#else
482 ldr r0,[r12,#0]
483 ldr r1,[r12,#4]
484 ldr r2,[r12,#8]
485 ldr r3,[r12,#12]
486#ifdef __ARMEL__
487 rev r0,r0
488 rev r1,r1
489 rev r2,r2
490 rev r3,r3
491#endif
492 str r0,[r11],#16
493 str r1,[r11,#-12]
494 str r2,[r11,#-8]
495 str r3,[r11,#-4]
496#endif
497
498 teq lr,#128
499 bne .Lnot128
500 mov r12,#10
501 str r12,[r11,#240-16]
502 add r6,r10,#256 @ rcon
503 mov lr,#255
504
505.L128_loop:
506 and r5,lr,r3,lsr#24
507 and r7,lr,r3,lsr#16
508 ldrb r5,[r10,r5]
509 and r8,lr,r3,lsr#8
510 ldrb r7,[r10,r7]
511 and r9,lr,r3
512 ldrb r8,[r10,r8]
513 orr r5,r5,r7,lsl#24
514 ldrb r9,[r10,r9]
515 orr r5,r5,r8,lsl#16
516 ldr r4,[r6],#4 @ rcon[i++]
517 orr r5,r5,r9,lsl#8
518 eor r5,r5,r4
519 eor r0,r0,r5 @ rk[4]=rk[0]^...
520 eor r1,r1,r0 @ rk[5]=rk[1]^rk[4]
521 str r0,[r11],#16
522 eor r2,r2,r1 @ rk[6]=rk[2]^rk[5]
523 str r1,[r11,#-12]
524 eor r3,r3,r2 @ rk[7]=rk[3]^rk[6]
525 str r2,[r11,#-8]
526 subs r12,r12,#1
527 str r3,[r11,#-4]
528 bne .L128_loop
529 sub r2,r11,#176
530 b .Ldone
531
532.Lnot128:
533#if __ARM_ARCH__<7
534 ldrb r8,[r12,#19]
535 ldrb r4,[r12,#18]
536 ldrb r5,[r12,#17]
537 ldrb r6,[r12,#16]
538 orr r8,r8,r4,lsl#8
539 ldrb r9,[r12,#23]
540 orr r8,r8,r5,lsl#16
541 ldrb r4,[r12,#22]
542 orr r8,r8,r6,lsl#24
543 ldrb r5,[r12,#21]
544 ldrb r6,[r12,#20]
545 orr r9,r9,r4,lsl#8
546 orr r9,r9,r5,lsl#16
547 str r8,[r11],#8
548 orr r9,r9,r6,lsl#24
549 str r9,[r11,#-4]
550#else
551 ldr r8,[r12,#16]
552 ldr r9,[r12,#20]
553#ifdef __ARMEL__
554 rev r8,r8
555 rev r9,r9
556#endif
557 str r8,[r11],#8
558 str r9,[r11,#-4]
559#endif
560
561 teq lr,#192
562 bne .Lnot192
563 mov r12,#12
564 str r12,[r11,#240-24]
565 add r6,r10,#256 @ rcon
566 mov lr,#255
567 mov r12,#8
568
569.L192_loop:
570 and r5,lr,r9,lsr#24
571 and r7,lr,r9,lsr#16
572 ldrb r5,[r10,r5]
573 and r8,lr,r9,lsr#8
574 ldrb r7,[r10,r7]
575 and r9,lr,r9
576 ldrb r8,[r10,r8]
577 orr r5,r5,r7,lsl#24
578 ldrb r9,[r10,r9]
579 orr r5,r5,r8,lsl#16
580 ldr r4,[r6],#4 @ rcon[i++]
581 orr r5,r5,r9,lsl#8
582 eor r9,r5,r4
583 eor r0,r0,r9 @ rk[6]=rk[0]^...
584 eor r1,r1,r0 @ rk[7]=rk[1]^rk[6]
585 str r0,[r11],#24
586 eor r2,r2,r1 @ rk[8]=rk[2]^rk[7]
587 str r1,[r11,#-20]
588 eor r3,r3,r2 @ rk[9]=rk[3]^rk[8]
589 str r2,[r11,#-16]
590 subs r12,r12,#1
591 str r3,[r11,#-12]
592#if __ARM_ARCH__>=7
593 itt eq @ Thumb2 thing, sanity check in ARM
594#endif
595 subeq r2,r11,#216
596 beq .Ldone
597
598 ldr r7,[r11,#-32]
599 ldr r8,[r11,#-28]
600 eor r7,r7,r3 @ rk[10]=rk[4]^rk[9]
601 eor r9,r8,r7 @ rk[11]=rk[5]^rk[10]
602 str r7,[r11,#-8]
603 str r9,[r11,#-4]
604 b .L192_loop
605
606.Lnot192:
607#if __ARM_ARCH__<7
608 ldrb r8,[r12,#27]
609 ldrb r4,[r12,#26]
610 ldrb r5,[r12,#25]
611 ldrb r6,[r12,#24]
612 orr r8,r8,r4,lsl#8
613 ldrb r9,[r12,#31]
614 orr r8,r8,r5,lsl#16
615 ldrb r4,[r12,#30]
616 orr r8,r8,r6,lsl#24
617 ldrb r5,[r12,#29]
618 ldrb r6,[r12,#28]
619 orr r9,r9,r4,lsl#8
620 orr r9,r9,r5,lsl#16
621 str r8,[r11],#8
622 orr r9,r9,r6,lsl#24
623 str r9,[r11,#-4]
624#else
625 ldr r8,[r12,#24]
626 ldr r9,[r12,#28]
627#ifdef __ARMEL__
628 rev r8,r8
629 rev r9,r9
630#endif
631 str r8,[r11],#8
632 str r9,[r11,#-4]
633#endif
634
635 mov r12,#14
636 str r12,[r11,#240-32]
637 add r6,r10,#256 @ rcon
638 mov lr,#255
639 mov r12,#7
640
641.L256_loop:
642 and r5,lr,r9,lsr#24
643 and r7,lr,r9,lsr#16
644 ldrb r5,[r10,r5]
645 and r8,lr,r9,lsr#8
646 ldrb r7,[r10,r7]
647 and r9,lr,r9
648 ldrb r8,[r10,r8]
649 orr r5,r5,r7,lsl#24
650 ldrb r9,[r10,r9]
651 orr r5,r5,r8,lsl#16
652 ldr r4,[r6],#4 @ rcon[i++]
653 orr r5,r5,r9,lsl#8
654 eor r9,r5,r4
655 eor r0,r0,r9 @ rk[8]=rk[0]^...
656 eor r1,r1,r0 @ rk[9]=rk[1]^rk[8]
657 str r0,[r11],#32
658 eor r2,r2,r1 @ rk[10]=rk[2]^rk[9]
659 str r1,[r11,#-28]
660 eor r3,r3,r2 @ rk[11]=rk[3]^rk[10]
661 str r2,[r11,#-24]
662 subs r12,r12,#1
663 str r3,[r11,#-20]
664#if __ARM_ARCH__>=7
665 itt eq @ Thumb2 thing, sanity check in ARM
666#endif
667 subeq r2,r11,#256
668 beq .Ldone
669
670 and r5,lr,r3
671 and r7,lr,r3,lsr#8
672 ldrb r5,[r10,r5]
673 and r8,lr,r3,lsr#16
674 ldrb r7,[r10,r7]
675 and r9,lr,r3,lsr#24
676 ldrb r8,[r10,r8]
677 orr r5,r5,r7,lsl#8
678 ldrb r9,[r10,r9]
679 orr r5,r5,r8,lsl#16
680 ldr r4,[r11,#-48]
681 orr r5,r5,r9,lsl#24
682
683 ldr r7,[r11,#-44]
684 ldr r8,[r11,#-40]
685 eor r4,r4,r5 @ rk[12]=rk[4]^...
686 ldr r9,[r11,#-36]
687 eor r7,r7,r4 @ rk[13]=rk[5]^rk[12]
688 str r4,[r11,#-16]
689 eor r8,r8,r7 @ rk[14]=rk[6]^rk[13]
690 str r7,[r11,#-12]
691 eor r9,r9,r8 @ rk[15]=rk[7]^rk[14]
692 str r8,[r11,#-8]
693 str r9,[r11,#-4]
694 b .L256_loop
695
696.align 2
697.Ldone: mov r0,#0
698 ldmia sp!,{r4-r12,lr}
699.Labrt:
700#if __ARM_ARCH__>=5
701 bx lr @ .word 0xe12fff1e
702#else
703 tst lr,#1
704 moveq pc,lr @ be binary compatible with V4, yet
705 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
706#endif
707.size private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
708
709.global private_AES_set_decrypt_key
710.type private_AES_set_decrypt_key,%function
711.align 5
712private_AES_set_decrypt_key:
713 str lr,[sp,#-4]! @ push lr
714 bl _armv4_AES_set_encrypt_key
715 teq r0,#0
716 ldr lr,[sp],#4 @ pop lr
717 bne .Labrt
718
719 mov r0,r2 @ AES_set_encrypt_key preserves r2,
720 mov r1,r2 @ which is AES_KEY *key
721 b _armv4_AES_set_enc2dec_key
722.size private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
723
724@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
725.global AES_set_enc2dec_key
726.type AES_set_enc2dec_key,%function
727.align 5
728AES_set_enc2dec_key:
729_armv4_AES_set_enc2dec_key:
730 stmdb sp!,{r4-r12,lr}
731
732 ldr r12,[r0,#240]
733 mov r7,r0 @ input
734 add r8,r0,r12,lsl#4
735 mov r11,r1 @ ouput
736 add r10,r1,r12,lsl#4
737 str r12,[r1,#240]
738
739.Linv: ldr r0,[r7],#16
740 ldr r1,[r7,#-12]
741 ldr r2,[r7,#-8]
742 ldr r3,[r7,#-4]
743 ldr r4,[r8],#-16
744 ldr r5,[r8,#16+4]
745 ldr r6,[r8,#16+8]
746 ldr r9,[r8,#16+12]
747 str r0,[r10],#-16
748 str r1,[r10,#16+4]
749 str r2,[r10,#16+8]
750 str r3,[r10,#16+12]
751 str r4,[r11],#16
752 str r5,[r11,#-12]
753 str r6,[r11,#-8]
754 str r9,[r11,#-4]
755 teq r7,r8
756 bne .Linv
757
758 ldr r0,[r7]
759 ldr r1,[r7,#4]
760 ldr r2,[r7,#8]
761 ldr r3,[r7,#12]
762 str r0,[r11]
763 str r1,[r11,#4]
764 str r2,[r11,#8]
765 str r3,[r11,#12]
766 sub r11,r11,r12,lsl#3
767 ldr r0,[r11,#16]! @ prefetch tp1
768 mov r7,#0x80
769 mov r8,#0x1b
770 orr r7,r7,#0x8000
771 orr r8,r8,#0x1b00
772 orr r7,r7,r7,lsl#16
773 orr r8,r8,r8,lsl#16
774 sub r12,r12,#1
775 mvn r9,r7
776 mov r12,r12,lsl#2 @ (rounds-1)*4
777
778.Lmix: and r4,r0,r7
779 and r1,r0,r9
780 sub r4,r4,r4,lsr#7
781 and r4,r4,r8
782 eor r1,r4,r1,lsl#1 @ tp2
783
784 and r4,r1,r7
785 and r2,r1,r9
786 sub r4,r4,r4,lsr#7
787 and r4,r4,r8
788 eor r2,r4,r2,lsl#1 @ tp4
789
790 and r4,r2,r7
791 and r3,r2,r9
792 sub r4,r4,r4,lsr#7
793 and r4,r4,r8
794 eor r3,r4,r3,lsl#1 @ tp8
795
796 eor r4,r1,r2
797 eor r5,r0,r3 @ tp9
798 eor r4,r4,r3 @ tpe
799 eor r4,r4,r1,ror#24
800 eor r4,r4,r5,ror#24 @ ^= ROTATE(tpb=tp9^tp2,8)
801 eor r4,r4,r2,ror#16
802 eor r4,r4,r5,ror#16 @ ^= ROTATE(tpd=tp9^tp4,16)
803 eor r4,r4,r5,ror#8 @ ^= ROTATE(tp9,24)
804
805 ldr r0,[r11,#4] @ prefetch tp1
806 str r4,[r11],#4
807 subs r12,r12,#1
808 bne .Lmix
809
810 mov r0,#0
811#if __ARM_ARCH__>=5
812 ldmia sp!,{r4-r12,pc}
813#else
814 ldmia sp!,{r4-r12,lr}
815 tst lr,#1
816 moveq pc,lr @ be binary compatible with V4, yet
817 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
818#endif
819.size AES_set_enc2dec_key,.-AES_set_enc2dec_key
820
821.type AES_Td,%object
822.align 5
823AES_Td:
824.word 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
825.word 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
826.word 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
827.word 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
828.word 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
829.word 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
830.word 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
831.word 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
832.word 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
833.word 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
834.word 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
835.word 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
836.word 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
837.word 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
838.word 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
839.word 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
840.word 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
841.word 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
842.word 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
843.word 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
844.word 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
845.word 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
846.word 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
847.word 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
848.word 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
849.word 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
850.word 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
851.word 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
852.word 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
853.word 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
854.word 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
855.word 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
856.word 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
857.word 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
858.word 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
859.word 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
860.word 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
861.word 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
862.word 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
863.word 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
864.word 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
865.word 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
866.word 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
867.word 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
868.word 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
869.word 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
870.word 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
871.word 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
872.word 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
873.word 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
874.word 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
875.word 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
876.word 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
877.word 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
878.word 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
879.word 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
880.word 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
881.word 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
882.word 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
883.word 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
884.word 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
885.word 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
886.word 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
887.word 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
888@ Td4[256]
889.byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
890.byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
891.byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
892.byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
893.byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
894.byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
895.byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
896.byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
897.byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
898.byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
899.byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
900.byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
901.byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
902.byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
903.byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
904.byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
905.byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
906.byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
907.byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
908.byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
909.byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
910.byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
911.byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
912.byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
913.byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
914.byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
915.byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
916.byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
917.byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
918.byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
919.byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
920.byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
921.size AES_Td,.-AES_Td
922
923@ void AES_decrypt(const unsigned char *in, unsigned char *out,
924@ const AES_KEY *key) {
925.global AES_decrypt
926.type AES_decrypt,%function
927.align 5
928AES_decrypt:
929#if __ARM_ARCH__<7
930 sub r3,pc,#8 @ AES_decrypt
931#else
932 adr r3,AES_decrypt
932 adr r3,.
933#endif
934 stmdb sp!,{r1,r4-r12,lr}
935 mov r12,r0 @ inp
936 mov r11,r2
937 sub r10,r3,#AES_decrypt-AES_Td @ Td
938#if __ARM_ARCH__<7
939 ldrb r0,[r12,#3] @ load input data in endian-neutral
940 ldrb r4,[r12,#2] @ manner...
941 ldrb r5,[r12,#1]
942 ldrb r6,[r12,#0]
943 orr r0,r0,r4,lsl#8
944 ldrb r1,[r12,#7]
945 orr r0,r0,r5,lsl#16
946 ldrb r4,[r12,#6]
947 orr r0,r0,r6,lsl#24
948 ldrb r5,[r12,#5]
949 ldrb r6,[r12,#4]
950 orr r1,r1,r4,lsl#8
951 ldrb r2,[r12,#11]
952 orr r1,r1,r5,lsl#16
953 ldrb r4,[r12,#10]
954 orr r1,r1,r6,lsl#24
955 ldrb r5,[r12,#9]
956 ldrb r6,[r12,#8]
957 orr r2,r2,r4,lsl#8
958 ldrb r3,[r12,#15]
959 orr r2,r2,r5,lsl#16
960 ldrb r4,[r12,#14]
961 orr r2,r2,r6,lsl#24
962 ldrb r5,[r12,#13]
963 ldrb r6,[r12,#12]
964 orr r3,r3,r4,lsl#8
965 orr r3,r3,r5,lsl#16
966 orr r3,r3,r6,lsl#24
967#else
968 ldr r0,[r12,#0]
969 ldr r1,[r12,#4]
970 ldr r2,[r12,#8]
971 ldr r3,[r12,#12]
972#ifdef __ARMEL__
973 rev r0,r0
974 rev r1,r1
975 rev r2,r2
976 rev r3,r3
977#endif
978#endif
979 bl _armv4_AES_decrypt
980
981 ldr r12,[sp],#4 @ pop out
982#if __ARM_ARCH__>=7
983#ifdef __ARMEL__
984 rev r0,r0
985 rev r1,r1
986 rev r2,r2
987 rev r3,r3
988#endif
989 str r0,[r12,#0]
990 str r1,[r12,#4]
991 str r2,[r12,#8]
992 str r3,[r12,#12]
993#else
994 mov r4,r0,lsr#24 @ write output in endian-neutral
995 mov r5,r0,lsr#16 @ manner...
996 mov r6,r0,lsr#8
997 strb r4,[r12,#0]
998 strb r5,[r12,#1]
999 mov r4,r1,lsr#24
1000 strb r6,[r12,#2]
1001 mov r5,r1,lsr#16
1002 strb r0,[r12,#3]
1003 mov r6,r1,lsr#8
1004 strb r4,[r12,#4]
1005 strb r5,[r12,#5]
1006 mov r4,r2,lsr#24
1007 strb r6,[r12,#6]
1008 mov r5,r2,lsr#16
1009 strb r1,[r12,#7]
1010 mov r6,r2,lsr#8
1011 strb r4,[r12,#8]
1012 strb r5,[r12,#9]
1013 mov r4,r3,lsr#24
1014 strb r6,[r12,#10]
1015 mov r5,r3,lsr#16
1016 strb r2,[r12,#11]
1017 mov r6,r3,lsr#8
1018 strb r4,[r12,#12]
1019 strb r5,[r12,#13]
1020 strb r6,[r12,#14]
1021 strb r3,[r12,#15]
1022#endif
1023#if __ARM_ARCH__>=5
1024 ldmia sp!,{r4-r12,pc}
1025#else
1026 ldmia sp!,{r4-r12,lr}
1027 tst lr,#1
1028 moveq pc,lr @ be binary compatible with V4, yet
1029 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
1030#endif
1031.size AES_decrypt,.-AES_decrypt
1032
1033.type _armv4_AES_decrypt,%function
1034.align 2
1035_armv4_AES_decrypt:
1036 str lr,[sp,#-4]! @ push lr
1037 ldmia r11!,{r4-r7}
1038 eor r0,r0,r4
1039 ldr r12,[r11,#240-16]
1040 eor r1,r1,r5
1041 eor r2,r2,r6
1042 eor r3,r3,r7
1043 sub r12,r12,#1
1044 mov lr,#255
1045
1046 and r7,lr,r0,lsr#16
1047 and r8,lr,r0,lsr#8
1048 and r9,lr,r0
1049 mov r0,r0,lsr#24
1050.Ldec_loop:
1051 ldr r4,[r10,r7,lsl#2] @ Td1[s0>>16]
1052 and r7,lr,r1 @ i0
1053 ldr r5,[r10,r8,lsl#2] @ Td2[s0>>8]
1054 and r8,lr,r1,lsr#16
1055 ldr r6,[r10,r9,lsl#2] @ Td3[s0>>0]
1056 and r9,lr,r1,lsr#8
1057 ldr r0,[r10,r0,lsl#2] @ Td0[s0>>24]
1058 mov r1,r1,lsr#24
1059
1060 ldr r7,[r10,r7,lsl#2] @ Td3[s1>>0]
1061 ldr r8,[r10,r8,lsl#2] @ Td1[s1>>16]
1062 ldr r9,[r10,r9,lsl#2] @ Td2[s1>>8]
1063 eor r0,r0,r7,ror#24
1064 ldr r1,[r10,r1,lsl#2] @ Td0[s1>>24]
1065 and r7,lr,r2,lsr#8 @ i0
1066 eor r5,r8,r5,ror#8
1067 and r8,lr,r2 @ i1
1068 eor r6,r9,r6,ror#8
1069 and r9,lr,r2,lsr#16
1070 ldr r7,[r10,r7,lsl#2] @ Td2[s2>>8]
1071 eor r1,r1,r4,ror#8
1072 ldr r8,[r10,r8,lsl#2] @ Td3[s2>>0]
1073 mov r2,r2,lsr#24
1074
1075 ldr r9,[r10,r9,lsl#2] @ Td1[s2>>16]
1076 eor r0,r0,r7,ror#16
1077 ldr r2,[r10,r2,lsl#2] @ Td0[s2>>24]
1078 and r7,lr,r3,lsr#16 @ i0
1079 eor r1,r1,r8,ror#24
1080 and r8,lr,r3,lsr#8 @ i1
1081 eor r6,r9,r6,ror#8
1082 and r9,lr,r3 @ i2
1083 ldr r7,[r10,r7,lsl#2] @ Td1[s3>>16]
1084 eor r2,r2,r5,ror#8
1085 ldr r8,[r10,r8,lsl#2] @ Td2[s3>>8]
1086 mov r3,r3,lsr#24
1087
1088 ldr r9,[r10,r9,lsl#2] @ Td3[s3>>0]
1089 eor r0,r0,r7,ror#8
1090 ldr r7,[r11],#16
1091 eor r1,r1,r8,ror#16
1092 ldr r3,[r10,r3,lsl#2] @ Td0[s3>>24]
1093 eor r2,r2,r9,ror#24
1094
1095 ldr r4,[r11,#-12]
1096 eor r0,r0,r7
1097 ldr r5,[r11,#-8]
1098 eor r3,r3,r6,ror#8
1099 ldr r6,[r11,#-4]
1100 and r7,lr,r0,lsr#16
1101 eor r1,r1,r4
1102 and r8,lr,r0,lsr#8
1103 eor r2,r2,r5
1104 and r9,lr,r0
1105 eor r3,r3,r6
1106 mov r0,r0,lsr#24
1107
1108 subs r12,r12,#1
1109 bne .Ldec_loop
1110
1111 add r10,r10,#1024
1112
1113 ldr r5,[r10,#0] @ prefetch Td4
1114 ldr r6,[r10,#32]
1115 ldr r4,[r10,#64]
1116 ldr r5,[r10,#96]
1117 ldr r6,[r10,#128]
1118 ldr r4,[r10,#160]
1119 ldr r5,[r10,#192]
1120 ldr r6,[r10,#224]
1121
1122 ldrb r0,[r10,r0] @ Td4[s0>>24]
1123 ldrb r4,[r10,r7] @ Td4[s0>>16]
1124 and r7,lr,r1 @ i0
1125 ldrb r5,[r10,r8] @ Td4[s0>>8]
1126 and r8,lr,r1,lsr#16
1127 ldrb r6,[r10,r9] @ Td4[s0>>0]
1128 and r9,lr,r1,lsr#8
1129
1130 add r1,r10,r1,lsr#24
1131 ldrb r7,[r10,r7] @ Td4[s1>>0]
1132 ldrb r1,[r1] @ Td4[s1>>24]
1133 ldrb r8,[r10,r8] @ Td4[s1>>16]
1134 eor r0,r7,r0,lsl#24
1135 ldrb r9,[r10,r9] @ Td4[s1>>8]
1136 eor r1,r4,r1,lsl#8
1137 and r7,lr,r2,lsr#8 @ i0
1138 eor r5,r5,r8,lsl#8
1139 and r8,lr,r2 @ i1
1140 ldrb r7,[r10,r7] @ Td4[s2>>8]
1141 eor r6,r6,r9,lsl#8
1142 ldrb r8,[r10,r8] @ Td4[s2>>0]
1143 and r9,lr,r2,lsr#16
1144
1145 add r2,r10,r2,lsr#24
1146 ldrb r2,[r2] @ Td4[s2>>24]
1147 eor r0,r0,r7,lsl#8
1148 ldrb r9,[r10,r9] @ Td4[s2>>16]
1149 eor r1,r8,r1,lsl#16
1150 and r7,lr,r3,lsr#16 @ i0
1151 eor r2,r5,r2,lsl#16
1152 and r8,lr,r3,lsr#8 @ i1
1153 ldrb r7,[r10,r7] @ Td4[s3>>16]
1154 eor r6,r6,r9,lsl#16
1155 ldrb r8,[r10,r8] @ Td4[s3>>8]
1156 and r9,lr,r3 @ i2
1157
1158 add r3,r10,r3,lsr#24
1159 ldrb r9,[r10,r9] @ Td4[s3>>0]
1160 ldrb r3,[r3] @ Td4[s3>>24]
1161 eor r0,r0,r7,lsl#16
1162 ldr r7,[r11,#0]
1163 eor r1,r1,r8,lsl#8
1164 ldr r4,[r11,#4]
1165 eor r2,r9,r2,lsl#8
1166 ldr r5,[r11,#8]
1167 eor r3,r6,r3,lsl#24
1168 ldr r6,[r11,#12]
1169
1170 eor r0,r0,r7
1171 eor r1,r1,r4
1172 eor r2,r2,r5
1173 eor r3,r3,r6
1174
1175 sub r10,r10,#1024
1176 ldr pc,[sp],#4 @ pop and return
1177.size _armv4_AES_decrypt,.-_armv4_AES_decrypt
1178.asciz "AES for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
1179.align 2
933#endif
934 stmdb sp!,{r1,r4-r12,lr}
935 mov r12,r0 @ inp
936 mov r11,r2
937 sub r10,r3,#AES_decrypt-AES_Td @ Td
938#if __ARM_ARCH__<7
939 ldrb r0,[r12,#3] @ load input data in endian-neutral
940 ldrb r4,[r12,#2] @ manner...
941 ldrb r5,[r12,#1]
942 ldrb r6,[r12,#0]
943 orr r0,r0,r4,lsl#8
944 ldrb r1,[r12,#7]
945 orr r0,r0,r5,lsl#16
946 ldrb r4,[r12,#6]
947 orr r0,r0,r6,lsl#24
948 ldrb r5,[r12,#5]
949 ldrb r6,[r12,#4]
950 orr r1,r1,r4,lsl#8
951 ldrb r2,[r12,#11]
952 orr r1,r1,r5,lsl#16
953 ldrb r4,[r12,#10]
954 orr r1,r1,r6,lsl#24
955 ldrb r5,[r12,#9]
956 ldrb r6,[r12,#8]
957 orr r2,r2,r4,lsl#8
958 ldrb r3,[r12,#15]
959 orr r2,r2,r5,lsl#16
960 ldrb r4,[r12,#14]
961 orr r2,r2,r6,lsl#24
962 ldrb r5,[r12,#13]
963 ldrb r6,[r12,#12]
964 orr r3,r3,r4,lsl#8
965 orr r3,r3,r5,lsl#16
966 orr r3,r3,r6,lsl#24
967#else
968 ldr r0,[r12,#0]
969 ldr r1,[r12,#4]
970 ldr r2,[r12,#8]
971 ldr r3,[r12,#12]
972#ifdef __ARMEL__
973 rev r0,r0
974 rev r1,r1
975 rev r2,r2
976 rev r3,r3
977#endif
978#endif
979 bl _armv4_AES_decrypt
980
981 ldr r12,[sp],#4 @ pop out
982#if __ARM_ARCH__>=7
983#ifdef __ARMEL__
984 rev r0,r0
985 rev r1,r1
986 rev r2,r2
987 rev r3,r3
988#endif
989 str r0,[r12,#0]
990 str r1,[r12,#4]
991 str r2,[r12,#8]
992 str r3,[r12,#12]
993#else
994 mov r4,r0,lsr#24 @ write output in endian-neutral
995 mov r5,r0,lsr#16 @ manner...
996 mov r6,r0,lsr#8
997 strb r4,[r12,#0]
998 strb r5,[r12,#1]
999 mov r4,r1,lsr#24
1000 strb r6,[r12,#2]
1001 mov r5,r1,lsr#16
1002 strb r0,[r12,#3]
1003 mov r6,r1,lsr#8
1004 strb r4,[r12,#4]
1005 strb r5,[r12,#5]
1006 mov r4,r2,lsr#24
1007 strb r6,[r12,#6]
1008 mov r5,r2,lsr#16
1009 strb r1,[r12,#7]
1010 mov r6,r2,lsr#8
1011 strb r4,[r12,#8]
1012 strb r5,[r12,#9]
1013 mov r4,r3,lsr#24
1014 strb r6,[r12,#10]
1015 mov r5,r3,lsr#16
1016 strb r2,[r12,#11]
1017 mov r6,r3,lsr#8
1018 strb r4,[r12,#12]
1019 strb r5,[r12,#13]
1020 strb r6,[r12,#14]
1021 strb r3,[r12,#15]
1022#endif
1023#if __ARM_ARCH__>=5
1024 ldmia sp!,{r4-r12,pc}
1025#else
1026 ldmia sp!,{r4-r12,lr}
1027 tst lr,#1
1028 moveq pc,lr @ be binary compatible with V4, yet
1029 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
1030#endif
1031.size AES_decrypt,.-AES_decrypt
1032
1033.type _armv4_AES_decrypt,%function
1034.align 2
1035_armv4_AES_decrypt:
1036 str lr,[sp,#-4]! @ push lr
1037 ldmia r11!,{r4-r7}
1038 eor r0,r0,r4
1039 ldr r12,[r11,#240-16]
1040 eor r1,r1,r5
1041 eor r2,r2,r6
1042 eor r3,r3,r7
1043 sub r12,r12,#1
1044 mov lr,#255
1045
1046 and r7,lr,r0,lsr#16
1047 and r8,lr,r0,lsr#8
1048 and r9,lr,r0
1049 mov r0,r0,lsr#24
1050.Ldec_loop:
1051 ldr r4,[r10,r7,lsl#2] @ Td1[s0>>16]
1052 and r7,lr,r1 @ i0
1053 ldr r5,[r10,r8,lsl#2] @ Td2[s0>>8]
1054 and r8,lr,r1,lsr#16
1055 ldr r6,[r10,r9,lsl#2] @ Td3[s0>>0]
1056 and r9,lr,r1,lsr#8
1057 ldr r0,[r10,r0,lsl#2] @ Td0[s0>>24]
1058 mov r1,r1,lsr#24
1059
1060 ldr r7,[r10,r7,lsl#2] @ Td3[s1>>0]
1061 ldr r8,[r10,r8,lsl#2] @ Td1[s1>>16]
1062 ldr r9,[r10,r9,lsl#2] @ Td2[s1>>8]
1063 eor r0,r0,r7,ror#24
1064 ldr r1,[r10,r1,lsl#2] @ Td0[s1>>24]
1065 and r7,lr,r2,lsr#8 @ i0
1066 eor r5,r8,r5,ror#8
1067 and r8,lr,r2 @ i1
1068 eor r6,r9,r6,ror#8
1069 and r9,lr,r2,lsr#16
1070 ldr r7,[r10,r7,lsl#2] @ Td2[s2>>8]
1071 eor r1,r1,r4,ror#8
1072 ldr r8,[r10,r8,lsl#2] @ Td3[s2>>0]
1073 mov r2,r2,lsr#24
1074
1075 ldr r9,[r10,r9,lsl#2] @ Td1[s2>>16]
1076 eor r0,r0,r7,ror#16
1077 ldr r2,[r10,r2,lsl#2] @ Td0[s2>>24]
1078 and r7,lr,r3,lsr#16 @ i0
1079 eor r1,r1,r8,ror#24
1080 and r8,lr,r3,lsr#8 @ i1
1081 eor r6,r9,r6,ror#8
1082 and r9,lr,r3 @ i2
1083 ldr r7,[r10,r7,lsl#2] @ Td1[s3>>16]
1084 eor r2,r2,r5,ror#8
1085 ldr r8,[r10,r8,lsl#2] @ Td2[s3>>8]
1086 mov r3,r3,lsr#24
1087
1088 ldr r9,[r10,r9,lsl#2] @ Td3[s3>>0]
1089 eor r0,r0,r7,ror#8
1090 ldr r7,[r11],#16
1091 eor r1,r1,r8,ror#16
1092 ldr r3,[r10,r3,lsl#2] @ Td0[s3>>24]
1093 eor r2,r2,r9,ror#24
1094
1095 ldr r4,[r11,#-12]
1096 eor r0,r0,r7
1097 ldr r5,[r11,#-8]
1098 eor r3,r3,r6,ror#8
1099 ldr r6,[r11,#-4]
1100 and r7,lr,r0,lsr#16
1101 eor r1,r1,r4
1102 and r8,lr,r0,lsr#8
1103 eor r2,r2,r5
1104 and r9,lr,r0
1105 eor r3,r3,r6
1106 mov r0,r0,lsr#24
1107
1108 subs r12,r12,#1
1109 bne .Ldec_loop
1110
1111 add r10,r10,#1024
1112
1113 ldr r5,[r10,#0] @ prefetch Td4
1114 ldr r6,[r10,#32]
1115 ldr r4,[r10,#64]
1116 ldr r5,[r10,#96]
1117 ldr r6,[r10,#128]
1118 ldr r4,[r10,#160]
1119 ldr r5,[r10,#192]
1120 ldr r6,[r10,#224]
1121
1122 ldrb r0,[r10,r0] @ Td4[s0>>24]
1123 ldrb r4,[r10,r7] @ Td4[s0>>16]
1124 and r7,lr,r1 @ i0
1125 ldrb r5,[r10,r8] @ Td4[s0>>8]
1126 and r8,lr,r1,lsr#16
1127 ldrb r6,[r10,r9] @ Td4[s0>>0]
1128 and r9,lr,r1,lsr#8
1129
1130 add r1,r10,r1,lsr#24
1131 ldrb r7,[r10,r7] @ Td4[s1>>0]
1132 ldrb r1,[r1] @ Td4[s1>>24]
1133 ldrb r8,[r10,r8] @ Td4[s1>>16]
1134 eor r0,r7,r0,lsl#24
1135 ldrb r9,[r10,r9] @ Td4[s1>>8]
1136 eor r1,r4,r1,lsl#8
1137 and r7,lr,r2,lsr#8 @ i0
1138 eor r5,r5,r8,lsl#8
1139 and r8,lr,r2 @ i1
1140 ldrb r7,[r10,r7] @ Td4[s2>>8]
1141 eor r6,r6,r9,lsl#8
1142 ldrb r8,[r10,r8] @ Td4[s2>>0]
1143 and r9,lr,r2,lsr#16
1144
1145 add r2,r10,r2,lsr#24
1146 ldrb r2,[r2] @ Td4[s2>>24]
1147 eor r0,r0,r7,lsl#8
1148 ldrb r9,[r10,r9] @ Td4[s2>>16]
1149 eor r1,r8,r1,lsl#16
1150 and r7,lr,r3,lsr#16 @ i0
1151 eor r2,r5,r2,lsl#16
1152 and r8,lr,r3,lsr#8 @ i1
1153 ldrb r7,[r10,r7] @ Td4[s3>>16]
1154 eor r6,r6,r9,lsl#16
1155 ldrb r8,[r10,r8] @ Td4[s3>>8]
1156 and r9,lr,r3 @ i2
1157
1158 add r3,r10,r3,lsr#24
1159 ldrb r9,[r10,r9] @ Td4[s3>>0]
1160 ldrb r3,[r3] @ Td4[s3>>24]
1161 eor r0,r0,r7,lsl#16
1162 ldr r7,[r11,#0]
1163 eor r1,r1,r8,lsl#8
1164 ldr r4,[r11,#4]
1165 eor r2,r9,r2,lsl#8
1166 ldr r5,[r11,#8]
1167 eor r3,r6,r3,lsl#24
1168 ldr r6,[r11,#12]
1169
1170 eor r0,r0,r7
1171 eor r1,r1,r4
1172 eor r2,r2,r5
1173 eor r3,r3,r6
1174
1175 sub r10,r10,#1024
1176 ldr pc,[sp],#4 @ pop and return
1177.size _armv4_AES_decrypt,.-_armv4_AES_decrypt
1178.asciz "AES for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
1179.align 2