-
Notifications
You must be signed in to change notification settings - Fork 0
/
dec.s
75 lines (68 loc) · 1.37 KB
/
dec.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
BITS 64
%macro genkey 1-2
aeskeygenassist xmm2, xmm1, %1 ; round 2
call key_expansion_128
movdqu %2, xmm1
%endmacro
global decrypt
; decrypt(char *key, char *value, size_t len)
; rdi, rsi rdx
start:
jmp decrypt
key_expansion_128: ; expand key from xmm2
pshufd xmm2, xmm2, 0xff ; "shuffle packed double word"
vpslldq xmm3, xmm1, 0x4 ; "shift double quadword left logical"
pxor xmm1, xmm3
vpslldq xmm3, xmm1, 0x4
pxor xmm1, xmm3
vpslldq xmm3, xmm1, 0x4
pxor xmm1, xmm3
pxor xmm1, xmm2
ret
decrypt:
push rbx
movdqu xmm1, [rdi] ; move key in xmm0
movdqu xmm0, xmm1 ; move key in xmm0
genkey 0x1, xmm4
genkey 0x2, xmm5
genkey 0x4, xmm6
genkey 0x8, xmm7
genkey 0x10, xmm8
genkey 0x20, xmm9
genkey 0x40, xmm10
genkey 0x80, xmm11
genkey 0x1b, xmm12
genkey 0x36, xmm13
aesimc xmm4, xmm4
aesimc xmm5, xmm5
aesimc xmm6, xmm6
aesimc xmm7, xmm7
aesimc xmm8, xmm8
aesimc xmm9, xmm9
aesimc xmm10, xmm10
aesimc xmm11, xmm11
aesimc xmm12, xmm12
; while on the len
xor rdi, rdi
begin_loop:
cmp rdx, rdi
jle end
perform:
movdqu xmm15, [rsi + rdi] ; move value in xmm15
pxor xmm15, xmm13
aesdec xmm15, xmm12
aesdec xmm15, xmm11
aesdec xmm15, xmm10
aesdec xmm15, xmm9
aesdec xmm15, xmm8
aesdec xmm15, xmm7
aesdec xmm15, xmm6
aesdec xmm15, xmm5
aesdec xmm15, xmm4
aesdeclast xmm15, xmm0
movdqu [rsi + rdi], xmm15
add rdi, 0x10
jmp begin_loop
end:
pop rbx
ret