Subversion Repositories planix.SVN

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#define AESOP(o,r1,r2) \
2
	BYTE	$0x66; \
3
	BYTE	$0x0F; \
4
	BYTE	$0x38; \
5
	BYTE	$(o); \
6
	BYTE	$(0xC0 | r2<<3 | r1)
7
 
8
#define AESIMC(r1,r2)		AESOP(0xDB,r1,r2)
9
#define	AESENC(r1,r2)		AESOP(0xDC,r1,r2)
10
#define	AESENCLAST(r1,r2)	AESOP(0xDD,r1,r2)
11
#define	AESDEC(r1,r2)		AESOP(0xDE,r1,r2)
12
#define	AESDECLAST(r1,r2)	AESOP(0xDF,r1,r2)
13
 
14
#define	AESKEYGENASSIST(i,r1,r2) \
15
	BYTE	$0x66; \
16
	BYTE	$0x0F; \
17
	BYTE	$0x3A; \
18
	BYTE	$0xDF; \
19
	BYTE	$(0xC0 | r2<<3 | r1); \
20
	BYTE	$(i)
21
 
22
TEXT aesni_init(SB), 0, $0
23
	MOVL	$1, AX
24
	CPUID
25
	XORL	AX, AX
26
	ANDL	$(1<<25), CX
27
	JZ	_ret
28
 
29
	/* override aes function pointers */
30
	MOVQ	$AESencrypt<>(SB), AX
31
	MOVQ	AX, aes_encrypt(SB)
32
	MOVQ	$AESdecrypt<>(SB), AX
33
	MOVQ	AX, aes_decrypt(SB)
34
 
35
	/* return setup function pointer */
36
	MOVQ	$AESsetup<>(SB), AX
37
_ret:
38
	RET
39
 
40
TEXT AESencrypt<>(SB), 0, $0
41
	MOVL	Nr+8(FP), CX
42
	MOVQ	pt+16(FP), SI
43
	MOVQ	ct+24(FP), DI
44
	MOVO	(RARG), X0
45
	MOVOU	(SI), X7
46
	ADDQ	$16, RARG
47
	PXOR	X7, X0
48
	CMPL	CX, $12
49
	JLT	erounds10
50
	JEQ	erounds12
51
erounds14:
52
	MOVO	0(RARG), X1
53
	MOVO	16(RARG), X2
54
	ADDQ	$32, RARG
55
	AESENC(1, 0)
56
	AESENC(2, 0)
57
erounds12:
58
	MOVO	0(RARG), X3
59
	MOVO	16(RARG), X4
60
	ADDQ	$32, RARG
61
	AESENC(3, 0)
62
	AESENC(4, 0)
63
erounds10:
64
	MOVO	0(RARG), X1
65
	MOVO	16(RARG), X2
66
	MOVO	32(RARG), X3
67
	MOVO	48(RARG), X4
68
	MOVO	64(RARG), X5
69
	MOVO	80(RARG), X6
70
	MOVO	96(RARG), X7
71
	AESENC(1, 0)
72
	MOVO	112(RARG), X1
73
	AESENC(2, 0)
74
	MOVO	128(RARG), X2
75
	AESENC(3, 0)
76
	MOVO	144(RARG), X3
77
	AESENC(4, 0)
78
	AESENC(5, 0)
79
	AESENC(6, 0)
80
	AESENC(7, 0)
81
 
82
	AESENC(1, 0)
83
	AESENC(2, 0)
84
	AESENCLAST(3, 0)
85
	MOVOU	X0, (DI)
86
	RET
87
 
88
TEXT AESdecrypt<>(SB), 0, $0
89
	MOVL	Nr+8(FP), CX
90
	MOVQ	ct+16(FP), SI
91
	MOVQ	pt+24(FP), DI
92
	MOVO	(RARG), X0
93
	MOVOU	(SI), X7
94
	ADDQ	$16, RARG
95
	PXOR	X7, X0
96
	CMPL	CX, $12
97
	JLT	drounds10
98
	JEQ	drounds12
99
drounds14:
100
	MOVO	0(RARG), X1
101
	MOVO	16(RARG), X2
102
	ADDQ	$32, RARG
103
	AESDEC(1, 0)
104
	AESDEC(2, 0)
105
drounds12:
106
	MOVO	0(RARG), X3
107
	MOVO	16(RARG), X4
108
	ADDQ	$32, RARG
109
	AESDEC(3, 0)
110
	AESDEC(4, 0)
111
drounds10:
112
	MOVO	0(RARG), X1
113
	MOVO	16(RARG), X2
114
	MOVO	32(RARG), X3
115
	MOVO	48(RARG), X4
116
	MOVO	64(RARG), X5
117
	MOVO	80(RARG), X6
118
	MOVO	96(RARG), X7
119
	AESDEC(1, 0)
120
	MOVO	112(RARG), X1
121
	AESDEC(2, 0)
122
	MOVO	128(RARG), X2
123
	AESDEC(3, 0)
124
	MOVO	144(RARG), X3
125
	AESDEC(4, 0)
126
	AESDEC(5, 0)
127
	AESDEC(6, 0)
128
	AESDEC(7, 0)
129
 
130
	AESDEC(1, 0)
131
	AESDEC(2, 0)
132
	AESDECLAST(3, 0)
133
	MOVOU	X0, (DI)
134
	RET
135
 
136
TEXT AESsetup<>(SB), 0, $16
137
	MOVQ	RARG, erk+0(FP)
138
	MOVQ	key+16(FP), DX
139
	MOVL	nkey+24(FP), BX
140
	MOVQ	DX, 8(SP)
141
	CMPL	BX, $32
142
	JEQ	esetup256
143
	CMPL	BX, $24
144
	JEQ	esetup192
145
	CMPL	BX, $16
146
	JEQ	esetup128
147
	XORL	AX, AX
148
	RET	
149
esetup256:
150
	CALL	setupEnc256<>(SB)
151
	JMP	dsetup
152
esetup192:
153
	CALL	setupEnc192<>(SB)
154
	JMP	dsetup
155
esetup128:
156
	CALL	setupEnc128<>(SB)
157
dsetup:
158
	MOVQ	erk+0(FP), SI
159
	MOVQ	drk+8(FP), DI
160
 
161
	MOVL	AX, BX
162
	SHLL	$4, BX
163
	ADDQ	BX, SI
164
 
165
	MOVO	(SI), X0
166
	MOVO	X0, (DI)
167
 
168
	MOVO	-16(SI), X1
169
	MOVO	-32(SI), X2
170
	MOVO	-48(SI), X3
171
	MOVO	-64(SI), X4
172
	AESIMC(1, 1)
173
	AESIMC(2, 2)
174
	AESIMC(3, 3)
175
	AESIMC(4, 4)
176
	MOVO	X1, 16(DI)
177
	MOVO	X2, 32(DI)
178
	MOVO	X3, 48(DI)
179
	MOVO	X4, 64(DI)
180
 
181
	MOVO	-80(SI), X1
182
	MOVO	-96(SI), X2
183
	MOVO	-112(SI), X3
184
	MOVO	-128(SI), X4
185
	AESIMC(1, 1)
186
	AESIMC(2, 2)
187
	AESIMC(3, 3)
188
	AESIMC(4, 4)
189
	MOVO	X1, 80(DI)
190
	MOVO	X2, 96(DI)
191
	MOVO	X3, 112(DI)
192
	MOVO	X4, 128(DI)
193
 
194
	MOVO 	-144(SI), X1
195
	AESIMC(1, 1)
196
	MOVO	X1, 144(DI)
197
 
198
	CMPL	AX, $10
199
	JEQ	dsetupend
200
 
201
	MOVO	-160(SI), X1
202
	MOVO	-176(SI), X2
203
	AESIMC(1, 1)
204
	AESIMC(2, 2)
205
	MOVO	X1, 160(DI)
206
	MOVO	X2, 176(DI)
207
 
208
	CMPL	AX, $12
209
	JEQ	dsetupend
210
 
211
	MOVO	-192(SI), X1
212
	MOVO	-208(SI), X2
213
	AESIMC(1, 1)
214
	AESIMC(2, 2)
215
	MOVO	X1, 192(DI)
216
	MOVO	X2, 208(DI)
217
dsetupend:
218
	SUBQ	BX, SI
219
	ADDQ	BX, DI
220
	MOVO	(SI), X0
221
	MOVO	X0, (DI)
222
	RET
223
 
224
TEXT setupEnc128<>(SB), 0, $0
225
	MOVQ	key+8(FP), SI
226
	MOVOU	(SI), X1
227
	MOVO	X1, (RARG)
228
	AESKEYGENASSIST(0x01, 1, 0)
229
	CALL	rk128<>(SB)
230
	MOVO	X1, 16(RARG)
231
	AESKEYGENASSIST(0x02, 1, 0)
232
	CALL	rk128<>(SB)
233
	MOVO	X1, 32(RARG)
234
	AESKEYGENASSIST(0x04, 1, 0)
235
	CALL	rk128<>(SB)
236
	MOVO	X1, 48(RARG)
237
	AESKEYGENASSIST(0x08, 1, 0)
238
	CALL	rk128<>(SB)
239
	MOVO	X1, 64(RARG)
240
	AESKEYGENASSIST(0x10, 1, 0)
241
	CALL	rk128<>(SB)
242
	MOVO	X1, 80(RARG)
243
	AESKEYGENASSIST(0x20, 1, 0)
244
	CALL	rk128<>(SB)
245
	MOVO	X1, 96(RARG)
246
	AESKEYGENASSIST(0x40, 1, 0)
247
	CALL	rk128<>(SB)
248
	MOVO	X1, 112(RARG)
249
	AESKEYGENASSIST(0x80, 1, 0)
250
	CALL	rk128<>(SB)
251
	MOVO	X1, 128(RARG)
252
	AESKEYGENASSIST(0x1b, 1, 0)
253
	CALL	rk128<>(SB)
254
	MOVO	X1, 144(RARG)
255
	AESKEYGENASSIST(0x36, 1, 0)
256
	CALL	rk128<>(SB)
257
	MOVO	X1, 160(RARG)
258
	MOVL	$10, AX
259
	RET
260
TEXT rk128<>(SB), 0, $0
261
	PSHUFL	$0xff, X0, X0
262
	MOVO	X1, X2
263
	PSLLO	$4, X2
264
	PXOR	X2, X1
265
	PSLLO	$4, X2
266
	PXOR	X2, X1
267
	PSLLO	$4, X2
268
	PXOR	X2, X1
269
	PXOR	X0, X1
270
	RET
271
 
272
TEXT setupEnc192<>(SB), 0, $0
273
	MOVQ	key+8(FP), SI
274
	MOVOU	(SI), X1
275
	MOVOU	16(SI), X2
276
	MOVO	X1, (RARG)
277
	MOVO	X2, X5
278
	AESKEYGENASSIST(0x01, 2, 0)
279
	CALL	rk192<>(SB)
280
	SHUFPD	$0, X1, X5
281
	MOVO	X5, 16(RARG)
282
	MOVO	X1, X6
283
	SHUFPD	$1, X2, X6
284
	MOVO	X6, 32(RARG)
285
	AESKEYGENASSIST(0x02, 2, 0)
286
	CALL	rk192<>(SB)
287
	MOVO	X1, 48(RARG)
288
	MOVO	X2, X5
289
	AESKEYGENASSIST(0x04, 2, 0)
290
	CALL	rk192<>(SB)
291
	SHUFPD	$0, X1, X5
292
	MOVO	X5, 64(RARG)
293
	MOVO	X1, X6
294
	SHUFPD	$1, X2, X6
295
	MOVO	X6, 80(RARG)
296
	AESKEYGENASSIST(0x08, 2, 0)
297
	CALL	rk192<>(SB)
298
	MOVO	X1, 96(RARG)
299
	MOVO	X2, X5
300
	AESKEYGENASSIST(0x10, 2, 0)
301
	CALL	rk192<>(SB)
302
	SHUFPD	$0, X1, X5
303
	MOVO	X5, 112(RARG)
304
	MOVO	X1, X6
305
	SHUFPD	$1, X2, X6
306
	MOVO	X6, 128(RARG)
307
	AESKEYGENASSIST(0x20, 2, 0)
308
	CALL	rk192<>(SB)
309
	MOVO	X1, 144(RARG)
310
	MOVO	X2, X5
311
	AESKEYGENASSIST(0x40, 2, 0)
312
	CALL	rk192<>(SB)
313
	SHUFPD	$0, X1, X5
314
	MOVO	X5, 160(RARG)
315
	MOVO	X1, X6
316
	SHUFPD	$1, X2, X6
317
	MOVO	X6, 176(RARG)
318
	AESKEYGENASSIST(0x80, 2, 0)
319
	CALL	rk192<>(SB)
320
	MOVO	X1, 192(RARG)
321
	MOVL	$12, AX
322
	RET
323
TEXT rk192<>(SB), 0, $0
324
	PSHUFL	$0x55, X0, X0
325
	MOVOU	X1, X4
326
	PSLLO	$4, X4
327
	PXOR	X4, X1
328
	PSLLO	$4, X4
329
	PXOR	X4, X1
330
	PSLLO	$4, X4
331
	PXOR	X4, X1
332
	PXOR	X0, X1
333
	PSHUFL	$0xff, X1, X0
334
	MOVOU	X2, X4
335
	PSLLO	$4, X4
336
	PXOR	X4, X2
337
	PXOR	X0, X2
338
	RET
339
 
340
TEXT setupEnc256<>(SB), 0, $0
341
	MOVQ	key+8(FP), SI
342
	MOVOU	(SI), X1
343
	MOVOU	16(SI), X2
344
	MOVO	X1, (RARG)
345
	MOVO	X2, 16(RARG)
346
	AESKEYGENASSIST(0x01, 2, 0)
347
	CALL	rk256_a<>(SB)
348
	MOVO	X1, 32(RARG)
349
	AESKEYGENASSIST(0x00, 1, 0)
350
	CALL	rk256_b<>(SB)
351
	MOVO	X2, 48(RARG)
352
	AESKEYGENASSIST(0x02, 2, 0)
353
	CALL	rk256_a<>(SB)
354
	MOVO	X1, 64(RARG)
355
	AESKEYGENASSIST(0x00, 1, 0)
356
	CALL	rk256_b<>(SB)
357
	MOVO	X2, 80(RARG)
358
	AESKEYGENASSIST(0x04, 2, 0)
359
	CALL	rk256_a<>(SB)
360
	MOVO	X1, 96(RARG)
361
	AESKEYGENASSIST(0x00, 1, 0)
362
	CALL	rk256_b<>(SB)
363
	MOVO	X2, 112(RARG)
364
	AESKEYGENASSIST(0x08, 2, 0)
365
	CALL	rk256_a<>(SB)
366
	MOVO	X1, 128(RARG)
367
	AESKEYGENASSIST(0x00, 1, 0)
368
	CALL	rk256_b<>(SB)
369
	MOVO	X2, 144(RARG)
370
	AESKEYGENASSIST(0x10, 2, 0)
371
	CALL	rk256_a<>(SB)
372
	MOVO	X1, 160(RARG)
373
	AESKEYGENASSIST(0x00, 1, 0)
374
	CALL	rk256_b<>(SB)
375
	MOVO	X2, 176(RARG)
376
	AESKEYGENASSIST(0x20, 2, 0)
377
	CALL	rk256_a<>(SB)
378
	MOVO	X1, 192(RARG)
379
	AESKEYGENASSIST(0x00, 1, 0)
380
	CALL	rk256_b<>(SB)
381
	MOVO	X2, 208(RARG)
382
	AESKEYGENASSIST(0x40, 2, 0)
383
	CALL	rk256_a<>(SB)
384
	MOVO	X1, 224(RARG)
385
	MOVL	$14, AX
386
	RET
387
TEXT rk256_a<>(SB), 0, $0
388
	PSHUFL	$0xff, X0, X0
389
	MOVO	X1, X4
390
	PSLLO	$4, X4
391
	PXOR	X4, X1
392
	PSLLO	$4, X4
393
	PXOR	X4, X1
394
	PSLLO	$4, X4
395
	PXOR	X4, X1
396
	PXOR	X0, X1
397
	RET
398
TEXT rk256_b<>(SB), 0, $0
399
	PSHUFL	$0xaa, X0, X0
400
	MOVO	X2, X4
401
	PSLLO	$4, X4
402
	PXOR	X4, X2
403
	PSLLO	$4, X4
404
	PXOR	X4, X2
405
	PSLLO	$4, X4
406
	PXOR	X4, X2
407
	PXOR	X0, X2
408
	RET