Skip to content

Commit 83072f7

Browse files
committed
Slightly improve performance of AES encrypt routine
1 parent 9c313a7 commit 83072f7

File tree

2 files changed

+51
-29
lines changed

2 files changed

+51
-29
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>classNames</key>
6+
<dict>
7+
<key>AESTests</key>
8+
<dict>
9+
<key>testAESEncryptPerformance()</key>
10+
<dict>
11+
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
12+
<dict>
13+
<key>baselineAverage</key>
14+
<real>0.23441</real>
15+
<key>baselineIntegrationDisplayName</key>
16+
<string>Local Baseline</string>
17+
</dict>
18+
</dict>
19+
</dict>
20+
</dict>
21+
</dict>
22+
</plist>

Sources/CryptoSwift/AES.swift

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -133,70 +133,70 @@ fileprivate extension AES {
133133
func encrypt(block: Array<UInt8>) -> Array<UInt8>? {
134134

135135
if blockMode.options.contains(.PaddingRequired) && block.count != AES.blockSize {
136-
return block
136+
return Array(block)
137137
}
138138

139139
let rounds = self.variant.Nr
140140
let rk = self.expandedKey
141-
var b = block[block.indices].toUInt32Array()
141+
142+
var b0 = UInt32(block[block.startIndex + 0 + (0 << 2)]) << 0 | UInt32(block[block.startIndex + 1 + (0 << 2)]) << 8 | UInt32(block[block.startIndex + 2 + (0 << 2)]) << 16 | UInt32(block[block.startIndex + 3 + (0 << 2)]) << 24
143+
var b1 = UInt32(block[block.startIndex + 0 + (1 << 2)]) << 0 | UInt32(block[block.startIndex + 1 + (1 << 2)]) << 8 | UInt32(block[block.startIndex + 2 + (1 << 2)]) << 16 | UInt32(block[block.startIndex + 3 + (1 << 2)]) << 24
144+
var b2 = UInt32(block[block.startIndex + 0 + (2 << 2)]) << 0 | UInt32(block[block.startIndex + 1 + (2 << 2)]) << 8 | UInt32(block[block.startIndex + 2 + (2 << 2)]) << 16 | UInt32(block[block.startIndex + 3 + (2 << 2)]) << 24
145+
var b3 = UInt32(block[block.startIndex + 0 + (3 << 2)]) << 0 | UInt32(block[block.startIndex + 1 + (3 << 2)]) << 8 | UInt32(block[block.startIndex + 2 + (3 << 2)]) << 16 | UInt32(block[block.startIndex + 3 + (3 << 2)]) << 24
142146

143147
var t = Array<UInt32>(repeating: 0, count: 4)
144148

145149
for r in 0 ..< rounds - 1 {
146-
t[0] = b[0] ^ rk[r][0]
147-
t[1] = b[1] ^ rk[r][1]
148-
t[2] = b[2] ^ rk[r][2]
149-
t[3] = b[3] ^ rk[r][3]
150+
t[0] = b0 ^ rk[r][0]
151+
t[1] = b1 ^ rk[r][1]
152+
t[2] = b2 ^ rk[r][2]
153+
t[3] = b3 ^ rk[r][3]
150154

151155
let lb00 = T0[Int(t[0] & 0xFF)]
152156
let lb01 = T1[Int((t[1] >> 8) & 0xFF)]
153157
let lb02 = T2[Int((t[2] >> 16) & 0xFF)]
154158
let lb03 = T3[Int(t[3] >> 24)]
155-
b[0] = lb00 ^ lb01 ^ lb02 ^ lb03
159+
b0 = lb00 ^ lb01 ^ lb02 ^ lb03
156160

157161
let lb10 = T0[Int(t[1] & 0xFF)]
158162
let lb11 = T1[Int((t[2] >> 8) & 0xFF)]
159163
let lb12 = T2[Int((t[3] >> 16) & 0xFF)]
160164
let lb13 = T3[Int(t[0] >> 24)]
161-
b[1] = lb10 ^ lb11 ^ lb12 ^ lb13
165+
b1 = lb10 ^ lb11 ^ lb12 ^ lb13
162166

163167
let lb20 = T0[Int(t[2] & 0xFF)]
164168
let lb21 = T1[Int((t[3] >> 8) & 0xFF)]
165169
let lb22 = T2[Int((t[0] >> 16) & 0xFF)]
166170
let lb23 = T3[Int(t[1] >> 24)]
167-
b[2] = lb20 ^ lb21 ^ lb22 ^ lb23
171+
b2 = lb20 ^ lb21 ^ lb22 ^ lb23
168172

169173
let lb30 = T0[Int(t[3] & 0xFF)]
170174
let lb31 = T1[Int((t[0] >> 8) & 0xFF)]
171175
let lb32 = T2[Int((t[1] >> 16) & 0xFF)]
172176
let lb33 = T3[Int(t[2] >> 24)]
173-
b[3] = lb30 ^ lb31 ^ lb32 ^ lb33
177+
b3 = lb30 ^ lb31 ^ lb32 ^ lb33
174178
}
175179

176180
// last round
177181
let r = rounds - 1
178182

179-
t[0] = b[0] ^ rk[r][0]
180-
t[1] = b[1] ^ rk[r][1]
181-
t[2] = b[2] ^ rk[r][2]
182-
t[3] = b[3] ^ rk[r][3]
183+
t[0] = b0 ^ rk[r][0]
184+
t[1] = b1 ^ rk[r][1]
185+
t[2] = b2 ^ rk[r][2]
186+
t[3] = b3 ^ rk[r][3]
183187

184188
// rounds
185-
b[0] = F1(t[0], t[1], t[2], t[3]) ^ rk[rounds][0]
186-
b[1] = F1(t[1], t[2], t[3], t[0]) ^ rk[rounds][1]
187-
b[2] = F1(t[2], t[3], t[0], t[1]) ^ rk[rounds][2]
188-
b[3] = F1(t[3], t[0], t[1], t[2]) ^ rk[rounds][3]
189-
190-
var out = Array<UInt8>()
191-
out.reserveCapacity(b.count * 4)
192-
for num in b {
193-
out.append(UInt8(num & 0xFF))
194-
out.append(UInt8((num >> 8) & 0xFF))
195-
out.append(UInt8((num >> 16) & 0xFF))
196-
out.append(UInt8((num >> 24) & 0xFF))
197-
}
198-
199-
return out
189+
b0 = F1(t[0], t[1], t[2], t[3]) ^ rk[rounds][0]
190+
b1 = F1(t[1], t[2], t[3], t[0]) ^ rk[rounds][1]
191+
b2 = F1(t[2], t[3], t[0], t[1]) ^ rk[rounds][2]
192+
b3 = F1(t[3], t[0], t[1], t[2]) ^ rk[rounds][3]
193+
194+
return [
195+
UInt8(b0 & 0xFF),UInt8((b0 >> 8) & 0xFF),UInt8((b0 >> 16) & 0xFF),UInt8((b0 >> 24) & 0xFF),
196+
UInt8(b1 & 0xFF),UInt8((b1 >> 8) & 0xFF),UInt8((b1 >> 16) & 0xFF),UInt8((b1 >> 24) & 0xFF),
197+
UInt8(b2 & 0xFF),UInt8((b2 >> 8) & 0xFF),UInt8((b2 >> 16) & 0xFF),UInt8((b2 >> 24) & 0xFF),
198+
UInt8(b3 & 0xFF),UInt8((b3 >> 8) & 0xFF),UInt8((b3 >> 16) & 0xFF),UInt8((b3 >> 24) & 0xFF)
199+
] as Array<UInt8>
200200
}
201201

202202
func decrypt(block: Array<UInt8>) -> Array<UInt8>? {

0 commit comments

Comments
 (0)