aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/aes192.asm
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2015-05-22 01:03:07 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2015-05-22 01:03:07 +0300
commit1463fd0559e0a664cd6a1bf6462a68dd79e58814 (patch)
treecd9ba513f473186a0780baf3f212c57d4521d91f /src/aes192.asm
downloadaes-tools-1463fd0559e0a664cd6a1bf6462a68dd79e58814.tar.gz
aes-tools-1463fd0559e0a664cd6a1bf6462a68dd79e58814.zip
initial commit
Diffstat (limited to 'src/aes192.asm')
-rw-r--r--src/aes192.asm196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/aes192.asm b/src/aes192.asm
new file mode 100644
index 0000000..84d3a3a
--- /dev/null
+++ b/src/aes192.asm
@@ -0,0 +1,196 @@
+; 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 13 dup(0)
+
+align 10h
+inverted_key_schedule oword 13 dup(0)
+
+.code
+
+@aes192ecb_encrypt@48 proc
+ call expand_keys_192ecb
+ 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]
+ aesenc xmm0, [key_schedule + 0A0h]
+ aesenc xmm0, [key_schedule + 0B0h]
+ aesenclast xmm0, [key_schedule + 0C0h]
+ ret
+@aes192ecb_encrypt@48 endp
+
+@aes192ecb_decrypt@48 proc
+ call expand_keys_192ecb
+ 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]
+ aesdec xmm0, [inverted_key_schedule + 0A0h]
+ aesdec xmm0, [inverted_key_schedule + 0B0h]
+ aesdeclast xmm0, [inverted_key_schedule + 0C0h]
+ ret
+@aes192ecb_decrypt@48 endp
+
+expand_keys_192ecb proc
+ ; key = k0 k1 k2 k3 k4 k5
+ ; xmm1 = k0 k1 k2 k3
+ ; xmm2 = 0 0 k5 k4
+
+ ; w[0] = k0 k1 k2 k3
+ ; w[1] = k4 k5 - -
+
+ ; i = 6
+ ; while (i < 52):
+ ; temp = w[i - 1]
+ ; if (i % 6 == 0):
+ ; temp = SubWord(RotWord(w[i - 1])) * Rcon
+ ; w[i] = w[i - 6] * temp
+ ; i = i + 1
+
+ ; w[6] = SubWord(RotWord(w[5])) * Rcon * w[0]
+ ; w[7] = w[6] * w[1]
+ ; = SubWord(RotWord(w[5])) * Rcon * w[0] * w[1]
+ ; w[8] = w[7] * w[2]
+ ; = SubWord(RotWord(w[5])) * Rcon * w[0] * w[1] * w[2]
+ ; w[9] = w[8] * w[3]
+ ; = SubWord(RotWord(w[5])) * Rcon * w[0] * w[1] * w[2] * w[3]
+ ; w[10] = w[9] * w[4]
+ ; = SubWord(RotWord(w[5])) * Rcon * w[0] * w[1] * w[2] * w[3] * w[4]
+ ; w[11] = w[10] * w[5]
+ ; = SubWord(RotWord(w[5])) * Rcon * w[0] * w[1] * w[2] * w[3] * w[4] * w[5]
+
+ movdqa [key_schedule], xmm1
+ movdqa [key_schedule + 10h], xmm2
+
+ lea ecx, [key_schedule + 18h]
+ aeskeygenassist xmm7, xmm2, 1
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 2
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 4
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 8
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 10h
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 20h
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 40h
+ call gen_round_key
+ aeskeygenassist xmm7, xmm2, 80h
+ call gen_round_key
+
+ call invert_key_schedule
+ ret
+
+gen_round_key:
+ ; xmm1 = x3 x2 x1 x0
+ ; xmm2 = - - x5 x4
+ ; xmm7 = RotWord(SubWord(-)) xor Rcon
+ ; SubWord(-)
+ ; RotWord(SubWord(x5)) xor Rcon
+ ; SubWord(x5)
+ movdqa xmm6, xmm1
+
+ pslldq xmm6, 4 ; xmm6 = x2 x1 x0 0
+ pxor xmm1, xmm6 ; xmm1 = (x3 * x2) (x1 * x2) (x1 * x0) x0
+ pslldq xmm6, 4 ; xmm6 = x1 x0 0 0
+ pxor xmm1, xmm6 ; xmm1 = (x3 * x2 * x1) (x1 * x2 * x0) (x1 * x0) x0
+ pslldq xmm6, 4 ; xmm6 = x0 0 0 0
+ pxor xmm1, xmm6 ; xmm1 = (x3 * x2 * x1 * x0) (x1 * x2 * x0) (x1 * x0) x0
+
+ pshufd xmm7, xmm7, 55h ; xmm7 = RotWord(SubWord(x5)) * Rcon
+ ; RotWord(SubWord(x5)) * Rcon
+ ; RotWord(SubWord(x5)) * Rcon
+ ; RotWord(SubWord(x5)) * Rcon
+
+ pxor xmm1, xmm7 ; xmm1 = RotWord(SubWord(x5)) * Rcon * x3 * x2 * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x2 * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x0
+
+ movq qword ptr [ecx], xmm1
+ add ecx, 8
+
+ pshufd xmm7, xmm1, 0FFh ; xmm7 = -
+ ; -
+ ; RotWord(SubWord(x5)) * Rcon * x3 * x2 * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x3 * x2 * x1 * x0
+ pxor xmm7, xmm2 ; xmm7 = -
+ ; -
+ ; RotWord(SubWord(x5)) * Rcon * x5 * x3 * x2 * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x4 * x3 * x2 * x1 * x0
+ pslldq xmm2, 4 ; xmm2 = - k5 k4 0
+ pxor xmm7, xmm2 ; xmm7 = -
+ ; -
+ ; RotWord(SubWord(x5)) * Rcon * x5 * x4 * x3 * x2 * x1 * x0
+ ; RotWord(SubWord(x5)) * Rcon * x4 * x3 * x2 * x1 * x0
+
+ movq xmm2, xmm7
+ pslldq xmm7, 8
+ movdqa xmm6, xmm1
+ psrldq xmm6, 8
+ por xmm7, xmm6
+ movdqu [ecx], xmm7
+ add ecx, 10h
+ ret
+
+invert_key_schedule:
+ movdqa xmm7, [key_schedule]
+ movdqa xmm6, [key_schedule + 0C0h]
+ movdqa [inverted_key_schedule], xmm6
+ movdqa [inverted_key_schedule + 0C0h], xmm7
+
+ aesimc xmm7, [key_schedule + 10h]
+ aesimc xmm6, [key_schedule + 0B0h]
+ movdqa [inverted_key_schedule + 10h], xmm6
+ movdqa [inverted_key_schedule + 0B0h], xmm7
+
+ aesimc xmm7, [key_schedule + 20h]
+ aesimc xmm6, [key_schedule + 0A0h]
+ movdqa [inverted_key_schedule + 20h], xmm6
+ movdqa [inverted_key_schedule + 0A0h], xmm7
+
+ aesimc xmm7, [key_schedule + 30h]
+ aesimc xmm6, [key_schedule + 90h]
+ movdqa [inverted_key_schedule + 30h], xmm6
+ movdqa [inverted_key_schedule + 90h], xmm7
+
+ aesimc xmm7, [key_schedule + 40h]
+ aesimc xmm6, [key_schedule + 80h]
+ movdqa [inverted_key_schedule + 40h], xmm6
+ movdqa [inverted_key_schedule + 80h], xmm7
+
+ aesimc xmm7, [key_schedule + 50h]
+ aesimc xmm6, [key_schedule + 70h]
+ movdqa [inverted_key_schedule + 50h], xmm6
+ movdqa [inverted_key_schedule + 70h], xmm7
+
+ aesimc xmm7, [key_schedule + 60h]
+ movdqa [inverted_key_schedule + 60h], xmm7
+
+ ret
+expand_keys_192ecb endp
+
+end