aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/aes128.asm
blob: dfa7a7d69a068ed4c812d9fe6ac23803d7da514a (plain) (blame)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
; Copyright 2015 Egor Tensin <Egor.Tensin@gmail.com>
; This file is licensed under the terms of the MIT License.
; See LICENSE.txt for details.

.586
.xmm
.model flat

.data

align 10h
key_schedule oword 11 dup(0)

align 10h
inverted_key_schedule oword 11 dup(0)

.code

@aes128ecb_encrypt@32 proc
    call expand_keys_128ecb
    pxor xmm0, [key_schedule]
    aesenc xmm0, [key_schedule + 10h]
    aesenc xmm0, [key_schedule + 20h]
    aesenc xmm0, [key_schedule + 30h]
    aesenc xmm0, [key_schedule + 40h]
    aesenc xmm0, [key_schedule + 50h]
    aesenc xmm0, [key_schedule + 60h]
    aesenc xmm0, [key_schedule + 70h]
    aesenc xmm0, [key_schedule + 80h]
    aesenc xmm0, [key_schedule + 90h]
    aesenclast xmm0, [key_schedule + 0A0h]
    ret
@aes128ecb_encrypt@32 endp

@aes128ecb_decrypt@32 proc
    call expand_keys_128ecb
    pxor xmm0, [inverted_key_schedule]
    aesdec xmm0, [inverted_key_schedule + 10h]
    aesdec xmm0, [inverted_key_schedule + 20h]
    aesdec xmm0, [inverted_key_schedule + 30h]
    aesdec xmm0, [inverted_key_schedule + 40h]
    aesdec xmm0, [inverted_key_schedule + 50h]
    aesdec xmm0, [inverted_key_schedule + 60h]
    aesdec xmm0, [inverted_key_schedule + 70h]
    aesdec xmm0, [inverted_key_schedule + 80h]
    aesdec xmm0, [inverted_key_schedule + 90h]
    aesdeclast xmm0, [inverted_key_schedule + 0A0h]
    ret
@aes128ecb_decrypt@32 endp

expand_keys_128ecb proc
    lea ecx, [key_schedule + 10h]
    movdqa [key_schedule], xmm1

    aeskeygenassist xmm7, xmm1, 01h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 02h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 04h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 08h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 10h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 20h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 40h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 80h
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 1Bh
    call gen_round_key
    aeskeygenassist xmm7, xmm1, 36h
    call gen_round_key

    call invert_key_schedule
    ret

gen_round_key:
    movdqa xmm6, xmm1    ; xmm6 = key_schedule[i]
                         ; xmm6 = x3 x2 x1 x0

    pslldq xmm6, 4     ; xmm6 = x2 x1 x0 0
    pxor xmm1, xmm6    ; xmm1 = (x3 x2) (x2 x1) (x1 x0) x0
    pslldq xmm6, 4     ; xmm6 = x1 x0 0 0
    pxor xmm1, xmm6    ; xmm1 = (x3 x2 x1) (x2 x1 x0) (x1 x0) x0
    pslldq xmm6, 4     ; xmm6 = x0 0 0 0
    pxor xmm1, xmm6    ; xmm1 = (x3 x2 x1 x0) (x2 x1 x0) (x1 x0) x0

    pshufd xmm7, xmm7, 0FFh
    pxor xmm1, xmm7

    movdqa [ecx], xmm1
    add ecx, 10h
    ret

invert_key_schedule:
    movdqa xmm7, [key_schedule]
    movdqa xmm6, [key_schedule + 0A0h]
    movdqa [inverted_key_schedule], xmm6
    movdqa [inverted_key_schedule + 0A0h], xmm7

    aesimc xmm7, [key_schedule + 10h]
    aesimc xmm6, [key_schedule + 90h]
    movdqa [inverted_key_schedule + 10h], xmm6
    movdqa [inverted_key_schedule + 90h], xmm7

    aesimc xmm7, [key_schedule + 20h]
    aesimc xmm6, [key_schedule + 80h]
    movdqa [inverted_key_schedule + 20h], xmm6
    movdqa [inverted_key_schedule + 80h], xmm7

    aesimc xmm7, [key_schedule + 30h]
    aesimc xmm6, [key_schedule + 70h]
    movdqa [inverted_key_schedule + 30h], xmm6
    movdqa [inverted_key_schedule + 70h], xmm7

    aesimc xmm7, [key_schedule + 40h]
    aesimc xmm6, [key_schedule + 60h]
    movdqa [inverted_key_schedule + 40h], xmm6
    movdqa [inverted_key_schedule + 60h], xmm7

    aesimc xmm7, [key_schedule + 50h]
    movdqa [inverted_key_schedule + 50h], xmm7

    ret
expand_keys_128ecb endp

end