Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/crypto/aes-spe-modes.S
26439 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* AES modes (ECB/CBC/CTR/XTS) for PPC AES implementation
4
*
5
* Copyright (c) 2015 Markus Stockhausen <[email protected]>
6
*/
7
8
#include <asm/ppc_asm.h>
9
#include "aes-spe-regs.h"
10
11
#ifdef __BIG_ENDIAN__ /* Macros for big endian builds */
12
13
#define LOAD_DATA(reg, off) \
14
lwz reg,off(rSP); /* load with offset */
15
#define SAVE_DATA(reg, off) \
16
stw reg,off(rDP); /* save with offset */
17
#define NEXT_BLOCK \
18
addi rSP,rSP,16; /* increment pointers per bloc */ \
19
addi rDP,rDP,16;
20
#define LOAD_IV(reg, off) \
21
lwz reg,off(rIP); /* IV loading with offset */
22
#define SAVE_IV(reg, off) \
23
stw reg,off(rIP); /* IV saving with offset */
24
#define START_IV /* nothing to reset */
25
#define CBC_DEC 16 /* CBC decrement per block */
26
#define CTR_DEC 1 /* CTR decrement one byte */
27
28
#else /* Macros for little endian */
29
30
#define LOAD_DATA(reg, off) \
31
lwbrx reg,0,rSP; /* load reversed */ \
32
addi rSP,rSP,4; /* and increment pointer */
33
#define SAVE_DATA(reg, off) \
34
stwbrx reg,0,rDP; /* save reversed */ \
35
addi rDP,rDP,4; /* and increment pointer */
36
#define NEXT_BLOCK /* nothing todo */
37
#define LOAD_IV(reg, off) \
38
lwbrx reg,0,rIP; /* load reversed */ \
39
addi rIP,rIP,4; /* and increment pointer */
40
#define SAVE_IV(reg, off) \
41
stwbrx reg,0,rIP; /* load reversed */ \
42
addi rIP,rIP,4; /* and increment pointer */
43
#define START_IV \
44
subi rIP,rIP,16; /* must reset pointer */
45
#define CBC_DEC 32 /* 2 blocks because of incs */
46
#define CTR_DEC 17 /* 1 block because of incs */
47
48
#endif
49
50
#define SAVE_0_REGS
51
#define LOAD_0_REGS
52
53
#define SAVE_4_REGS \
54
stw rI0,96(r1); /* save 32 bit registers */ \
55
stw rI1,100(r1); \
56
stw rI2,104(r1); \
57
stw rI3,108(r1);
58
59
#define LOAD_4_REGS \
60
lwz rI0,96(r1); /* restore 32 bit registers */ \
61
lwz rI1,100(r1); \
62
lwz rI2,104(r1); \
63
lwz rI3,108(r1);
64
65
#define SAVE_8_REGS \
66
SAVE_4_REGS \
67
stw rG0,112(r1); /* save 32 bit registers */ \
68
stw rG1,116(r1); \
69
stw rG2,120(r1); \
70
stw rG3,124(r1);
71
72
#define LOAD_8_REGS \
73
LOAD_4_REGS \
74
lwz rG0,112(r1); /* restore 32 bit registers */ \
75
lwz rG1,116(r1); \
76
lwz rG2,120(r1); \
77
lwz rG3,124(r1);
78
79
#define INITIALIZE_CRYPT(tab,nr32bitregs) \
80
mflr r0; \
81
stwu r1,-160(r1); /* create stack frame */ \
82
lis rT0,tab@h; /* en-/decryption table pointer */ \
83
stw r0,8(r1); /* save link register */ \
84
ori rT0,rT0,tab@l; \
85
evstdw r14,16(r1); \
86
mr rKS,rKP; \
87
evstdw r15,24(r1); /* We must save non volatile */ \
88
evstdw r16,32(r1); /* registers. Take the chance */ \
89
evstdw r17,40(r1); /* and save the SPE part too */ \
90
evstdw r18,48(r1); \
91
evstdw r19,56(r1); \
92
evstdw r20,64(r1); \
93
evstdw r21,72(r1); \
94
evstdw r22,80(r1); \
95
evstdw r23,88(r1); \
96
SAVE_##nr32bitregs##_REGS
97
98
#define FINALIZE_CRYPT(nr32bitregs) \
99
lwz r0,8(r1); \
100
evldw r14,16(r1); /* restore SPE registers */ \
101
evldw r15,24(r1); \
102
evldw r16,32(r1); \
103
evldw r17,40(r1); \
104
evldw r18,48(r1); \
105
evldw r19,56(r1); \
106
evldw r20,64(r1); \
107
evldw r21,72(r1); \
108
evldw r22,80(r1); \
109
evldw r23,88(r1); \
110
LOAD_##nr32bitregs##_REGS \
111
mtlr r0; /* restore link register */ \
112
xor r0,r0,r0; \
113
stw r0,16(r1); /* delete sensitive data */ \
114
stw r0,24(r1); /* that we might have pushed */ \
115
stw r0,32(r1); /* from other context that runs */ \
116
stw r0,40(r1); /* the same code */ \
117
stw r0,48(r1); \
118
stw r0,56(r1); \
119
stw r0,64(r1); \
120
stw r0,72(r1); \
121
stw r0,80(r1); \
122
stw r0,88(r1); \
123
addi r1,r1,160; /* cleanup stack frame */
124
125
#define ENDIAN_SWAP(t0, t1, s0, s1) \
126
rotrwi t0,s0,8; /* swap endianness for 2 GPRs */ \
127
rotrwi t1,s1,8; \
128
rlwimi t0,s0,8,8,15; \
129
rlwimi t1,s1,8,8,15; \
130
rlwimi t0,s0,8,24,31; \
131
rlwimi t1,s1,8,24,31;
132
133
#define GF128_MUL(d0, d1, d2, d3, t0) \
134
li t0,0x87; /* multiplication in GF128 */ \
135
cmpwi d3,-1; \
136
iselgt t0,0,t0; \
137
rlwimi d3,d2,0,0,0; /* propagate "carry" bits */ \
138
rotlwi d3,d3,1; \
139
rlwimi d2,d1,0,0,0; \
140
rotlwi d2,d2,1; \
141
rlwimi d1,d0,0,0,0; \
142
slwi d0,d0,1; /* shift left 128 bit */ \
143
rotlwi d1,d1,1; \
144
xor d0,d0,t0;
145
146
#define START_KEY(d0, d1, d2, d3) \
147
lwz rW0,0(rKP); \
148
mtctr rRR; \
149
lwz rW1,4(rKP); \
150
lwz rW2,8(rKP); \
151
lwz rW3,12(rKP); \
152
xor rD0,d0,rW0; \
153
xor rD1,d1,rW1; \
154
xor rD2,d2,rW2; \
155
xor rD3,d3,rW3;
156
157
/*
158
* ppc_encrypt_aes(u8 *out, const u8 *in, u32 *key_enc,
159
* u32 rounds)
160
*
161
* called from glue layer to encrypt a single 16 byte block
162
* round values are AES128 = 4, AES192 = 5, AES256 = 6
163
*
164
*/
165
_GLOBAL(ppc_encrypt_aes)
166
INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0)
167
LOAD_DATA(rD0, 0)
168
LOAD_DATA(rD1, 4)
169
LOAD_DATA(rD2, 8)
170
LOAD_DATA(rD3, 12)
171
START_KEY(rD0, rD1, rD2, rD3)
172
bl ppc_encrypt_block
173
xor rD0,rD0,rW0
174
SAVE_DATA(rD0, 0)
175
xor rD1,rD1,rW1
176
SAVE_DATA(rD1, 4)
177
xor rD2,rD2,rW2
178
SAVE_DATA(rD2, 8)
179
xor rD3,rD3,rW3
180
SAVE_DATA(rD3, 12)
181
FINALIZE_CRYPT(0)
182
blr
183
184
/*
185
* ppc_decrypt_aes(u8 *out, const u8 *in, u32 *key_dec,
186
* u32 rounds)
187
*
188
* called from glue layer to decrypt a single 16 byte block
189
* round values are AES128 = 4, AES192 = 5, AES256 = 6
190
*
191
*/
192
_GLOBAL(ppc_decrypt_aes)
193
INITIALIZE_CRYPT(PPC_AES_4K_DECTAB,0)
194
LOAD_DATA(rD0, 0)
195
addi rT1,rT0,4096
196
LOAD_DATA(rD1, 4)
197
LOAD_DATA(rD2, 8)
198
LOAD_DATA(rD3, 12)
199
START_KEY(rD0, rD1, rD2, rD3)
200
bl ppc_decrypt_block
201
xor rD0,rD0,rW0
202
SAVE_DATA(rD0, 0)
203
xor rD1,rD1,rW1
204
SAVE_DATA(rD1, 4)
205
xor rD2,rD2,rW2
206
SAVE_DATA(rD2, 8)
207
xor rD3,rD3,rW3
208
SAVE_DATA(rD3, 12)
209
FINALIZE_CRYPT(0)
210
blr
211
212
/*
213
* ppc_encrypt_ecb(u8 *out, const u8 *in, u32 *key_enc,
214
* u32 rounds, u32 bytes);
215
*
216
* called from glue layer to encrypt multiple blocks via ECB
217
* Bytes must be larger or equal 16 and only whole blocks are
218
* processed. round values are AES128 = 4, AES192 = 5 and
219
* AES256 = 6
220
*
221
*/
222
_GLOBAL(ppc_encrypt_ecb)
223
INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0)
224
ppc_encrypt_ecb_loop:
225
LOAD_DATA(rD0, 0)
226
mr rKP,rKS
227
LOAD_DATA(rD1, 4)
228
subi rLN,rLN,16
229
LOAD_DATA(rD2, 8)
230
cmpwi rLN,15
231
LOAD_DATA(rD3, 12)
232
START_KEY(rD0, rD1, rD2, rD3)
233
bl ppc_encrypt_block
234
xor rD0,rD0,rW0
235
SAVE_DATA(rD0, 0)
236
xor rD1,rD1,rW1
237
SAVE_DATA(rD1, 4)
238
xor rD2,rD2,rW2
239
SAVE_DATA(rD2, 8)
240
xor rD3,rD3,rW3
241
SAVE_DATA(rD3, 12)
242
NEXT_BLOCK
243
bt gt,ppc_encrypt_ecb_loop
244
FINALIZE_CRYPT(0)
245
blr
246
247
/*
248
* ppc_decrypt_ecb(u8 *out, const u8 *in, u32 *key_dec,
249
* u32 rounds, u32 bytes);
250
*
251
* called from glue layer to decrypt multiple blocks via ECB
252
* Bytes must be larger or equal 16 and only whole blocks are
253
* processed. round values are AES128 = 4, AES192 = 5 and
254
* AES256 = 6
255
*
256
*/
257
_GLOBAL(ppc_decrypt_ecb)
258
INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 0)
259
addi rT1,rT0,4096
260
ppc_decrypt_ecb_loop:
261
LOAD_DATA(rD0, 0)
262
mr rKP,rKS
263
LOAD_DATA(rD1, 4)
264
subi rLN,rLN,16
265
LOAD_DATA(rD2, 8)
266
cmpwi rLN,15
267
LOAD_DATA(rD3, 12)
268
START_KEY(rD0, rD1, rD2, rD3)
269
bl ppc_decrypt_block
270
xor rD0,rD0,rW0
271
SAVE_DATA(rD0, 0)
272
xor rD1,rD1,rW1
273
SAVE_DATA(rD1, 4)
274
xor rD2,rD2,rW2
275
SAVE_DATA(rD2, 8)
276
xor rD3,rD3,rW3
277
SAVE_DATA(rD3, 12)
278
NEXT_BLOCK
279
bt gt,ppc_decrypt_ecb_loop
280
FINALIZE_CRYPT(0)
281
blr
282
283
/*
284
* ppc_encrypt_cbc(u8 *out, const u8 *in, u32 *key_enc,
285
* 32 rounds, u32 bytes, u8 *iv);
286
*
287
* called from glue layer to encrypt multiple blocks via CBC
288
* Bytes must be larger or equal 16 and only whole blocks are
289
* processed. round values are AES128 = 4, AES192 = 5 and
290
* AES256 = 6
291
*
292
*/
293
_GLOBAL(ppc_encrypt_cbc)
294
INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4)
295
LOAD_IV(rI0, 0)
296
LOAD_IV(rI1, 4)
297
LOAD_IV(rI2, 8)
298
LOAD_IV(rI3, 12)
299
ppc_encrypt_cbc_loop:
300
LOAD_DATA(rD0, 0)
301
mr rKP,rKS
302
LOAD_DATA(rD1, 4)
303
subi rLN,rLN,16
304
LOAD_DATA(rD2, 8)
305
cmpwi rLN,15
306
LOAD_DATA(rD3, 12)
307
xor rD0,rD0,rI0
308
xor rD1,rD1,rI1
309
xor rD2,rD2,rI2
310
xor rD3,rD3,rI3
311
START_KEY(rD0, rD1, rD2, rD3)
312
bl ppc_encrypt_block
313
xor rI0,rD0,rW0
314
SAVE_DATA(rI0, 0)
315
xor rI1,rD1,rW1
316
SAVE_DATA(rI1, 4)
317
xor rI2,rD2,rW2
318
SAVE_DATA(rI2, 8)
319
xor rI3,rD3,rW3
320
SAVE_DATA(rI3, 12)
321
NEXT_BLOCK
322
bt gt,ppc_encrypt_cbc_loop
323
START_IV
324
SAVE_IV(rI0, 0)
325
SAVE_IV(rI1, 4)
326
SAVE_IV(rI2, 8)
327
SAVE_IV(rI3, 12)
328
FINALIZE_CRYPT(4)
329
blr
330
331
/*
332
* ppc_decrypt_cbc(u8 *out, const u8 *in, u32 *key_dec,
333
* u32 rounds, u32 bytes, u8 *iv);
334
*
335
* called from glue layer to decrypt multiple blocks via CBC
336
* round values are AES128 = 4, AES192 = 5, AES256 = 6
337
*
338
*/
339
_GLOBAL(ppc_decrypt_cbc)
340
INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 4)
341
li rT1,15
342
LOAD_IV(rI0, 0)
343
andc rLN,rLN,rT1
344
LOAD_IV(rI1, 4)
345
subi rLN,rLN,16
346
LOAD_IV(rI2, 8)
347
add rSP,rSP,rLN /* reverse processing */
348
LOAD_IV(rI3, 12)
349
add rDP,rDP,rLN
350
LOAD_DATA(rD0, 0)
351
addi rT1,rT0,4096
352
LOAD_DATA(rD1, 4)
353
LOAD_DATA(rD2, 8)
354
LOAD_DATA(rD3, 12)
355
START_IV
356
SAVE_IV(rD0, 0)
357
SAVE_IV(rD1, 4)
358
SAVE_IV(rD2, 8)
359
cmpwi rLN,16
360
SAVE_IV(rD3, 12)
361
bt lt,ppc_decrypt_cbc_end
362
ppc_decrypt_cbc_loop:
363
mr rKP,rKS
364
START_KEY(rD0, rD1, rD2, rD3)
365
bl ppc_decrypt_block
366
subi rLN,rLN,16
367
subi rSP,rSP,CBC_DEC
368
xor rW0,rD0,rW0
369
LOAD_DATA(rD0, 0)
370
xor rW1,rD1,rW1
371
LOAD_DATA(rD1, 4)
372
xor rW2,rD2,rW2
373
LOAD_DATA(rD2, 8)
374
xor rW3,rD3,rW3
375
LOAD_DATA(rD3, 12)
376
xor rW0,rW0,rD0
377
SAVE_DATA(rW0, 0)
378
xor rW1,rW1,rD1
379
SAVE_DATA(rW1, 4)
380
xor rW2,rW2,rD2
381
SAVE_DATA(rW2, 8)
382
xor rW3,rW3,rD3
383
SAVE_DATA(rW3, 12)
384
cmpwi rLN,15
385
subi rDP,rDP,CBC_DEC
386
bt gt,ppc_decrypt_cbc_loop
387
ppc_decrypt_cbc_end:
388
mr rKP,rKS
389
START_KEY(rD0, rD1, rD2, rD3)
390
bl ppc_decrypt_block
391
xor rW0,rW0,rD0
392
xor rW1,rW1,rD1
393
xor rW2,rW2,rD2
394
xor rW3,rW3,rD3
395
xor rW0,rW0,rI0 /* decrypt with initial IV */
396
SAVE_DATA(rW0, 0)
397
xor rW1,rW1,rI1
398
SAVE_DATA(rW1, 4)
399
xor rW2,rW2,rI2
400
SAVE_DATA(rW2, 8)
401
xor rW3,rW3,rI3
402
SAVE_DATA(rW3, 12)
403
FINALIZE_CRYPT(4)
404
blr
405
406
/*
407
* ppc_crypt_ctr(u8 *out, const u8 *in, u32 *key_enc,
408
* u32 rounds, u32 bytes, u8 *iv);
409
*
410
* called from glue layer to encrypt/decrypt multiple blocks
411
* via CTR. Number of bytes does not need to be a multiple of
412
* 16. Round values are AES128 = 4, AES192 = 5, AES256 = 6
413
*
414
*/
415
_GLOBAL(ppc_crypt_ctr)
416
INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4)
417
LOAD_IV(rI0, 0)
418
LOAD_IV(rI1, 4)
419
LOAD_IV(rI2, 8)
420
cmpwi rLN,16
421
LOAD_IV(rI3, 12)
422
START_IV
423
bt lt,ppc_crypt_ctr_partial
424
ppc_crypt_ctr_loop:
425
mr rKP,rKS
426
START_KEY(rI0, rI1, rI2, rI3)
427
bl ppc_encrypt_block
428
xor rW0,rD0,rW0
429
xor rW1,rD1,rW1
430
xor rW2,rD2,rW2
431
xor rW3,rD3,rW3
432
LOAD_DATA(rD0, 0)
433
subi rLN,rLN,16
434
LOAD_DATA(rD1, 4)
435
LOAD_DATA(rD2, 8)
436
LOAD_DATA(rD3, 12)
437
xor rD0,rD0,rW0
438
SAVE_DATA(rD0, 0)
439
xor rD1,rD1,rW1
440
SAVE_DATA(rD1, 4)
441
xor rD2,rD2,rW2
442
SAVE_DATA(rD2, 8)
443
xor rD3,rD3,rW3
444
SAVE_DATA(rD3, 12)
445
addic rI3,rI3,1 /* increase counter */
446
addze rI2,rI2
447
addze rI1,rI1
448
addze rI0,rI0
449
NEXT_BLOCK
450
cmpwi rLN,15
451
bt gt,ppc_crypt_ctr_loop
452
ppc_crypt_ctr_partial:
453
cmpwi rLN,0
454
bt eq,ppc_crypt_ctr_end
455
mr rKP,rKS
456
START_KEY(rI0, rI1, rI2, rI3)
457
bl ppc_encrypt_block
458
xor rW0,rD0,rW0
459
SAVE_IV(rW0, 0)
460
xor rW1,rD1,rW1
461
SAVE_IV(rW1, 4)
462
xor rW2,rD2,rW2
463
SAVE_IV(rW2, 8)
464
xor rW3,rD3,rW3
465
SAVE_IV(rW3, 12)
466
mtctr rLN
467
subi rIP,rIP,CTR_DEC
468
subi rSP,rSP,1
469
subi rDP,rDP,1
470
ppc_crypt_ctr_xorbyte:
471
lbzu rW4,1(rIP) /* bytewise xor for partial block */
472
lbzu rW5,1(rSP)
473
xor rW4,rW4,rW5
474
stbu rW4,1(rDP)
475
bdnz ppc_crypt_ctr_xorbyte
476
subf rIP,rLN,rIP
477
addi rIP,rIP,1
478
addic rI3,rI3,1
479
addze rI2,rI2
480
addze rI1,rI1
481
addze rI0,rI0
482
ppc_crypt_ctr_end:
483
SAVE_IV(rI0, 0)
484
SAVE_IV(rI1, 4)
485
SAVE_IV(rI2, 8)
486
SAVE_IV(rI3, 12)
487
FINALIZE_CRYPT(4)
488
blr
489
490
/*
491
* ppc_encrypt_xts(u8 *out, const u8 *in, u32 *key_enc,
492
* u32 rounds, u32 bytes, u8 *iv, u32 *key_twk);
493
*
494
* called from glue layer to encrypt multiple blocks via XTS
495
* If key_twk is given, the initial IV encryption will be
496
* processed too. Round values are AES128 = 4, AES192 = 5,
497
* AES256 = 6
498
*
499
*/
500
_GLOBAL(ppc_encrypt_xts)
501
INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 8)
502
LOAD_IV(rI0, 0)
503
LOAD_IV(rI1, 4)
504
LOAD_IV(rI2, 8)
505
cmpwi rKT,0
506
LOAD_IV(rI3, 12)
507
bt eq,ppc_encrypt_xts_notweak
508
mr rKP,rKT
509
START_KEY(rI0, rI1, rI2, rI3)
510
bl ppc_encrypt_block
511
xor rI0,rD0,rW0
512
xor rI1,rD1,rW1
513
xor rI2,rD2,rW2
514
xor rI3,rD3,rW3
515
ppc_encrypt_xts_notweak:
516
ENDIAN_SWAP(rG0, rG1, rI0, rI1)
517
ENDIAN_SWAP(rG2, rG3, rI2, rI3)
518
ppc_encrypt_xts_loop:
519
LOAD_DATA(rD0, 0)
520
mr rKP,rKS
521
LOAD_DATA(rD1, 4)
522
subi rLN,rLN,16
523
LOAD_DATA(rD2, 8)
524
LOAD_DATA(rD3, 12)
525
xor rD0,rD0,rI0
526
xor rD1,rD1,rI1
527
xor rD2,rD2,rI2
528
xor rD3,rD3,rI3
529
START_KEY(rD0, rD1, rD2, rD3)
530
bl ppc_encrypt_block
531
xor rD0,rD0,rW0
532
xor rD1,rD1,rW1
533
xor rD2,rD2,rW2
534
xor rD3,rD3,rW3
535
xor rD0,rD0,rI0
536
SAVE_DATA(rD0, 0)
537
xor rD1,rD1,rI1
538
SAVE_DATA(rD1, 4)
539
xor rD2,rD2,rI2
540
SAVE_DATA(rD2, 8)
541
xor rD3,rD3,rI3
542
SAVE_DATA(rD3, 12)
543
GF128_MUL(rG0, rG1, rG2, rG3, rW0)
544
ENDIAN_SWAP(rI0, rI1, rG0, rG1)
545
ENDIAN_SWAP(rI2, rI3, rG2, rG3)
546
cmpwi rLN,0
547
NEXT_BLOCK
548
bt gt,ppc_encrypt_xts_loop
549
START_IV
550
SAVE_IV(rI0, 0)
551
SAVE_IV(rI1, 4)
552
SAVE_IV(rI2, 8)
553
SAVE_IV(rI3, 12)
554
FINALIZE_CRYPT(8)
555
blr
556
557
/*
558
* ppc_decrypt_xts(u8 *out, const u8 *in, u32 *key_dec,
559
* u32 rounds, u32 blocks, u8 *iv, u32 *key_twk);
560
*
561
* called from glue layer to decrypt multiple blocks via XTS
562
* If key_twk is given, the initial IV encryption will be
563
* processed too. Round values are AES128 = 4, AES192 = 5,
564
* AES256 = 6
565
*
566
*/
567
_GLOBAL(ppc_decrypt_xts)
568
INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 8)
569
LOAD_IV(rI0, 0)
570
addi rT1,rT0,4096
571
LOAD_IV(rI1, 4)
572
LOAD_IV(rI2, 8)
573
cmpwi rKT,0
574
LOAD_IV(rI3, 12)
575
bt eq,ppc_decrypt_xts_notweak
576
subi rT0,rT0,4096
577
mr rKP,rKT
578
START_KEY(rI0, rI1, rI2, rI3)
579
bl ppc_encrypt_block
580
xor rI0,rD0,rW0
581
xor rI1,rD1,rW1
582
xor rI2,rD2,rW2
583
xor rI3,rD3,rW3
584
addi rT0,rT0,4096
585
ppc_decrypt_xts_notweak:
586
ENDIAN_SWAP(rG0, rG1, rI0, rI1)
587
ENDIAN_SWAP(rG2, rG3, rI2, rI3)
588
ppc_decrypt_xts_loop:
589
LOAD_DATA(rD0, 0)
590
mr rKP,rKS
591
LOAD_DATA(rD1, 4)
592
subi rLN,rLN,16
593
LOAD_DATA(rD2, 8)
594
LOAD_DATA(rD3, 12)
595
xor rD0,rD0,rI0
596
xor rD1,rD1,rI1
597
xor rD2,rD2,rI2
598
xor rD3,rD3,rI3
599
START_KEY(rD0, rD1, rD2, rD3)
600
bl ppc_decrypt_block
601
xor rD0,rD0,rW0
602
xor rD1,rD1,rW1
603
xor rD2,rD2,rW2
604
xor rD3,rD3,rW3
605
xor rD0,rD0,rI0
606
SAVE_DATA(rD0, 0)
607
xor rD1,rD1,rI1
608
SAVE_DATA(rD1, 4)
609
xor rD2,rD2,rI2
610
SAVE_DATA(rD2, 8)
611
xor rD3,rD3,rI3
612
SAVE_DATA(rD3, 12)
613
GF128_MUL(rG0, rG1, rG2, rG3, rW0)
614
ENDIAN_SWAP(rI0, rI1, rG0, rG1)
615
ENDIAN_SWAP(rI2, rI3, rG2, rG3)
616
cmpwi rLN,0
617
NEXT_BLOCK
618
bt gt,ppc_decrypt_xts_loop
619
START_IV
620
SAVE_IV(rI0, 0)
621
SAVE_IV(rI1, 4)
622
SAVE_IV(rI2, 8)
623
SAVE_IV(rI3, 12)
624
FINALIZE_CRYPT(8)
625
blr
626
627