|
@@ -0,0 +1,920 @@
|
|
|
|
+# enter ECRYPT_encrypt_bytes
|
|
|
|
+.text
|
|
|
|
+.p2align 5
|
|
|
|
+.globl ECRYPT_encrypt_bytes
|
|
|
|
+ECRYPT_encrypt_bytes:
|
|
|
|
+ mov %rsp,%r11
|
|
|
|
+ and $31,%r11
|
|
|
|
+ add $256,%r11
|
|
|
|
+ sub %r11,%rsp
|
|
|
|
+ # x = arg1
|
|
|
|
+ mov %rdi,%r8
|
|
|
|
+ # m = arg2
|
|
|
|
+ mov %rsi,%rsi
|
|
|
|
+ # out = arg3
|
|
|
|
+ mov %rdx,%rdi
|
|
|
|
+ # bytes = arg4
|
|
|
|
+ mov %rcx,%rdx
|
|
|
|
+ # unsigned>? bytes - 0
|
|
|
|
+ cmp $0,%rdx
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto done if !unsigned>
|
|
|
|
+ jbe ._done
|
|
|
|
+ # comment:fp stack unchanged by fallthrough
|
|
|
|
+# start:
|
|
|
|
+._start:
|
|
|
|
+ # r11_stack = r11
|
|
|
|
+ movq %r11,0(%rsp)
|
|
|
|
+ # r12_stack = r12
|
|
|
|
+ movq %r12,8(%rsp)
|
|
|
|
+ # r13_stack = r13
|
|
|
|
+ movq %r13,16(%rsp)
|
|
|
|
+ # r14_stack = r14
|
|
|
|
+ movq %r14,24(%rsp)
|
|
|
|
+ # r15_stack = r15
|
|
|
|
+ movq %r15,32(%rsp)
|
|
|
|
+ # rbx_stack = rbx
|
|
|
|
+ movq %rbx,40(%rsp)
|
|
|
|
+ # rbp_stack = rbp
|
|
|
|
+ movq %rbp,48(%rsp)
|
|
|
|
+ # in0 = *(uint64 *) (x + 0)
|
|
|
|
+ movq 0(%r8),%rcx
|
|
|
|
+ # in2 = *(uint64 *) (x + 8)
|
|
|
|
+ movq 8(%r8),%r9
|
|
|
|
+ # in4 = *(uint64 *) (x + 16)
|
|
|
|
+ movq 16(%r8),%rax
|
|
|
|
+ # in6 = *(uint64 *) (x + 24)
|
|
|
|
+ movq 24(%r8),%r10
|
|
|
|
+ # in8 = *(uint64 *) (x + 32)
|
|
|
|
+ movq 32(%r8),%r11
|
|
|
|
+ # in10 = *(uint64 *) (x + 40)
|
|
|
|
+ movq 40(%r8),%r12
|
|
|
|
+ # in12 = *(uint64 *) (x + 48)
|
|
|
|
+ movq 48(%r8),%r13
|
|
|
|
+ # in14 = *(uint64 *) (x + 56)
|
|
|
|
+ movq 56(%r8),%r14
|
|
|
|
+ # j0 = in0
|
|
|
|
+ movq %rcx,56(%rsp)
|
|
|
|
+ # j2 = in2
|
|
|
|
+ movq %r9,64(%rsp)
|
|
|
|
+ # j4 = in4
|
|
|
|
+ movq %rax,72(%rsp)
|
|
|
|
+ # j6 = in6
|
|
|
|
+ movq %r10,80(%rsp)
|
|
|
|
+ # j8 = in8
|
|
|
|
+ movq %r11,88(%rsp)
|
|
|
|
+ # j10 = in10
|
|
|
|
+ movq %r12,96(%rsp)
|
|
|
|
+ # j12 = in12
|
|
|
|
+ movq %r13,104(%rsp)
|
|
|
|
+ # j14 = in14
|
|
|
|
+ movq %r14,112(%rsp)
|
|
|
|
+ # x_backup = x
|
|
|
|
+ movq %r8,120(%rsp)
|
|
|
|
+# bytesatleast1:
|
|
|
|
+._bytesatleast1:
|
|
|
|
+ # unsigned<? bytes - 64
|
|
|
|
+ cmp $64,%rdx
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto nocopy if !unsigned<
|
|
|
|
+ jae ._nocopy
|
|
|
|
+ # ctarget = out
|
|
|
|
+ movq %rdi,128(%rsp)
|
|
|
|
+ # out = &tmp
|
|
|
|
+ leaq 192(%rsp),%rdi
|
|
|
|
+ # i = bytes
|
|
|
|
+ mov %rdx,%rcx
|
|
|
|
+ # while (i) { *out++ = *m++; --i }
|
|
|
|
+ rep movsb
|
|
|
|
+ # out = &tmp
|
|
|
|
+ leaq 192(%rsp),%rdi
|
|
|
|
+ # m = &tmp
|
|
|
|
+ leaq 192(%rsp),%rsi
|
|
|
|
+ # comment:fp stack unchanged by fallthrough
|
|
|
|
+# nocopy:
|
|
|
|
+._nocopy:
|
|
|
|
+ # out_backup = out
|
|
|
|
+ movq %rdi,136(%rsp)
|
|
|
|
+ # m_backup = m
|
|
|
|
+ movq %rsi,144(%rsp)
|
|
|
|
+ # bytes_backup = bytes
|
|
|
|
+ movq %rdx,152(%rsp)
|
|
|
|
+ # x1 = j0
|
|
|
|
+ movq 56(%rsp),%rdi
|
|
|
|
+ # x0 = x1
|
|
|
|
+ mov %rdi,%rdx
|
|
|
|
+ # (uint64) x1 >>= 32
|
|
|
|
+ shr $32,%rdi
|
|
|
|
+ # x3 = j2
|
|
|
|
+ movq 64(%rsp),%rsi
|
|
|
|
+ # x2 = x3
|
|
|
|
+ mov %rsi,%rcx
|
|
|
|
+ # (uint64) x3 >>= 32
|
|
|
|
+ shr $32,%rsi
|
|
|
|
+ # x5 = j4
|
|
|
|
+ movq 72(%rsp),%r8
|
|
|
|
+ # x4 = x5
|
|
|
|
+ mov %r8,%r9
|
|
|
|
+ # (uint64) x5 >>= 32
|
|
|
|
+ shr $32,%r8
|
|
|
|
+ # x5_stack = x5
|
|
|
|
+ movq %r8,160(%rsp)
|
|
|
|
+ # x7 = j6
|
|
|
|
+ movq 80(%rsp),%r8
|
|
|
|
+ # x6 = x7
|
|
|
|
+ mov %r8,%rax
|
|
|
|
+ # (uint64) x7 >>= 32
|
|
|
|
+ shr $32,%r8
|
|
|
|
+ # x9 = j8
|
|
|
|
+ movq 88(%rsp),%r10
|
|
|
|
+ # x8 = x9
|
|
|
|
+ mov %r10,%r11
|
|
|
|
+ # (uint64) x9 >>= 32
|
|
|
|
+ shr $32,%r10
|
|
|
|
+ # x11 = j10
|
|
|
|
+ movq 96(%rsp),%r12
|
|
|
|
+ # x10 = x11
|
|
|
|
+ mov %r12,%r13
|
|
|
|
+ # x10_stack = x10
|
|
|
|
+ movq %r13,168(%rsp)
|
|
|
|
+ # (uint64) x11 >>= 32
|
|
|
|
+ shr $32,%r12
|
|
|
|
+ # x13 = j12
|
|
|
|
+ movq 104(%rsp),%r13
|
|
|
|
+ # x12 = x13
|
|
|
|
+ mov %r13,%r14
|
|
|
|
+ # (uint64) x13 >>= 32
|
|
|
|
+ shr $32,%r13
|
|
|
|
+ # x15 = j14
|
|
|
|
+ movq 112(%rsp),%r15
|
|
|
|
+ # x14 = x15
|
|
|
|
+ mov %r15,%rbx
|
|
|
|
+ # (uint64) x15 >>= 32
|
|
|
|
+ shr $32,%r15
|
|
|
|
+ # x15_stack = x15
|
|
|
|
+ movq %r15,176(%rsp)
|
|
|
|
+ # i = 20
|
|
|
|
+ mov $20,%r15
|
|
|
|
+# mainloop:
|
|
|
|
+._mainloop:
|
|
|
|
+ # i_backup = i
|
|
|
|
+ movq %r15,184(%rsp)
|
|
|
|
+ # x5 = x5_stack
|
|
|
|
+ movq 160(%rsp),%r15
|
|
|
|
+ # a = x12 + x0
|
|
|
|
+ lea (%r14,%rdx),%rbp
|
|
|
|
+ # (uint32) a <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x4 ^= a
|
|
|
|
+ xor %rbp,%r9
|
|
|
|
+ # b = x1 + x5
|
|
|
|
+ lea (%rdi,%r15),%rbp
|
|
|
|
+ # (uint32) b <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x9 ^= b
|
|
|
|
+ xor %rbp,%r10
|
|
|
|
+ # a = x0 + x4
|
|
|
|
+ lea (%rdx,%r9),%rbp
|
|
|
|
+ # (uint32) a <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x8 ^= a
|
|
|
|
+ xor %rbp,%r11
|
|
|
|
+ # b = x5 + x9
|
|
|
|
+ lea (%r15,%r10),%rbp
|
|
|
|
+ # (uint32) b <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x13 ^= b
|
|
|
|
+ xor %rbp,%r13
|
|
|
|
+ # a = x4 + x8
|
|
|
|
+ lea (%r9,%r11),%rbp
|
|
|
|
+ # (uint32) a <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x12 ^= a
|
|
|
|
+ xor %rbp,%r14
|
|
|
|
+ # b = x9 + x13
|
|
|
|
+ lea (%r10,%r13),%rbp
|
|
|
|
+ # (uint32) b <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x1 ^= b
|
|
|
|
+ xor %rbp,%rdi
|
|
|
|
+ # a = x8 + x12
|
|
|
|
+ lea (%r11,%r14),%rbp
|
|
|
|
+ # (uint32) a <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x0 ^= a
|
|
|
|
+ xor %rbp,%rdx
|
|
|
|
+ # b = x13 + x1
|
|
|
|
+ lea (%r13,%rdi),%rbp
|
|
|
|
+ # (uint32) b <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x5 ^= b
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x10 = x10_stack
|
|
|
|
+ movq 168(%rsp),%rbp
|
|
|
|
+ # x5_stack = x5
|
|
|
|
+ movq %r15,160(%rsp)
|
|
|
|
+ # c = x6 + x10
|
|
|
|
+ lea (%rax,%rbp),%r15
|
|
|
|
+ # (uint32) c <<<= 7
|
|
|
|
+ rol $7,%r15d
|
|
|
|
+ # x14 ^= c
|
|
|
|
+ xor %r15,%rbx
|
|
|
|
+ # c = x10 + x14
|
|
|
|
+ lea (%rbp,%rbx),%r15
|
|
|
|
+ # (uint32) c <<<= 9
|
|
|
|
+ rol $9,%r15d
|
|
|
|
+ # x2 ^= c
|
|
|
|
+ xor %r15,%rcx
|
|
|
|
+ # c = x14 + x2
|
|
|
|
+ lea (%rbx,%rcx),%r15
|
|
|
|
+ # (uint32) c <<<= 13
|
|
|
|
+ rol $13,%r15d
|
|
|
|
+ # x6 ^= c
|
|
|
|
+ xor %r15,%rax
|
|
|
|
+ # c = x2 + x6
|
|
|
|
+ lea (%rcx,%rax),%r15
|
|
|
|
+ # (uint32) c <<<= 18
|
|
|
|
+ rol $18,%r15d
|
|
|
|
+ # x10 ^= c
|
|
|
|
+ xor %r15,%rbp
|
|
|
|
+ # x15 = x15_stack
|
|
|
|
+ movq 176(%rsp),%r15
|
|
|
|
+ # x10_stack = x10
|
|
|
|
+ movq %rbp,168(%rsp)
|
|
|
|
+ # d = x11 + x15
|
|
|
|
+ lea (%r12,%r15),%rbp
|
|
|
|
+ # (uint32) d <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x3 ^= d
|
|
|
|
+ xor %rbp,%rsi
|
|
|
|
+ # d = x15 + x3
|
|
|
|
+ lea (%r15,%rsi),%rbp
|
|
|
|
+ # (uint32) d <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x7 ^= d
|
|
|
|
+ xor %rbp,%r8
|
|
|
|
+ # d = x3 + x7
|
|
|
|
+ lea (%rsi,%r8),%rbp
|
|
|
|
+ # (uint32) d <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x11 ^= d
|
|
|
|
+ xor %rbp,%r12
|
|
|
|
+ # d = x7 + x11
|
|
|
|
+ lea (%r8,%r12),%rbp
|
|
|
|
+ # (uint32) d <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x15 ^= d
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x15_stack = x15
|
|
|
|
+ movq %r15,176(%rsp)
|
|
|
|
+ # x5 = x5_stack
|
|
|
|
+ movq 160(%rsp),%r15
|
|
|
|
+ # a = x3 + x0
|
|
|
|
+ lea (%rsi,%rdx),%rbp
|
|
|
|
+ # (uint32) a <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x1 ^= a
|
|
|
|
+ xor %rbp,%rdi
|
|
|
|
+ # b = x4 + x5
|
|
|
|
+ lea (%r9,%r15),%rbp
|
|
|
|
+ # (uint32) b <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x6 ^= b
|
|
|
|
+ xor %rbp,%rax
|
|
|
|
+ # a = x0 + x1
|
|
|
|
+ lea (%rdx,%rdi),%rbp
|
|
|
|
+ # (uint32) a <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x2 ^= a
|
|
|
|
+ xor %rbp,%rcx
|
|
|
|
+ # b = x5 + x6
|
|
|
|
+ lea (%r15,%rax),%rbp
|
|
|
|
+ # (uint32) b <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x7 ^= b
|
|
|
|
+ xor %rbp,%r8
|
|
|
|
+ # a = x1 + x2
|
|
|
|
+ lea (%rdi,%rcx),%rbp
|
|
|
|
+ # (uint32) a <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x3 ^= a
|
|
|
|
+ xor %rbp,%rsi
|
|
|
|
+ # b = x6 + x7
|
|
|
|
+ lea (%rax,%r8),%rbp
|
|
|
|
+ # (uint32) b <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x4 ^= b
|
|
|
|
+ xor %rbp,%r9
|
|
|
|
+ # a = x2 + x3
|
|
|
|
+ lea (%rcx,%rsi),%rbp
|
|
|
|
+ # (uint32) a <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x0 ^= a
|
|
|
|
+ xor %rbp,%rdx
|
|
|
|
+ # b = x7 + x4
|
|
|
|
+ lea (%r8,%r9),%rbp
|
|
|
|
+ # (uint32) b <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x5 ^= b
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x10 = x10_stack
|
|
|
|
+ movq 168(%rsp),%rbp
|
|
|
|
+ # x5_stack = x5
|
|
|
|
+ movq %r15,160(%rsp)
|
|
|
|
+ # c = x9 + x10
|
|
|
|
+ lea (%r10,%rbp),%r15
|
|
|
|
+ # (uint32) c <<<= 7
|
|
|
|
+ rol $7,%r15d
|
|
|
|
+ # x11 ^= c
|
|
|
|
+ xor %r15,%r12
|
|
|
|
+ # c = x10 + x11
|
|
|
|
+ lea (%rbp,%r12),%r15
|
|
|
|
+ # (uint32) c <<<= 9
|
|
|
|
+ rol $9,%r15d
|
|
|
|
+ # x8 ^= c
|
|
|
|
+ xor %r15,%r11
|
|
|
|
+ # c = x11 + x8
|
|
|
|
+ lea (%r12,%r11),%r15
|
|
|
|
+ # (uint32) c <<<= 13
|
|
|
|
+ rol $13,%r15d
|
|
|
|
+ # x9 ^= c
|
|
|
|
+ xor %r15,%r10
|
|
|
|
+ # c = x8 + x9
|
|
|
|
+ lea (%r11,%r10),%r15
|
|
|
|
+ # (uint32) c <<<= 18
|
|
|
|
+ rol $18,%r15d
|
|
|
|
+ # x10 ^= c
|
|
|
|
+ xor %r15,%rbp
|
|
|
|
+ # x15 = x15_stack
|
|
|
|
+ movq 176(%rsp),%r15
|
|
|
|
+ # x10_stack = x10
|
|
|
|
+ movq %rbp,168(%rsp)
|
|
|
|
+ # d = x14 + x15
|
|
|
|
+ lea (%rbx,%r15),%rbp
|
|
|
|
+ # (uint32) d <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x12 ^= d
|
|
|
|
+ xor %rbp,%r14
|
|
|
|
+ # d = x15 + x12
|
|
|
|
+ lea (%r15,%r14),%rbp
|
|
|
|
+ # (uint32) d <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x13 ^= d
|
|
|
|
+ xor %rbp,%r13
|
|
|
|
+ # d = x12 + x13
|
|
|
|
+ lea (%r14,%r13),%rbp
|
|
|
|
+ # (uint32) d <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x14 ^= d
|
|
|
|
+ xor %rbp,%rbx
|
|
|
|
+ # d = x13 + x14
|
|
|
|
+ lea (%r13,%rbx),%rbp
|
|
|
|
+ # (uint32) d <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x15 ^= d
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x15_stack = x15
|
|
|
|
+ movq %r15,176(%rsp)
|
|
|
|
+ # x5 = x5_stack
|
|
|
|
+ movq 160(%rsp),%r15
|
|
|
|
+ # a = x12 + x0
|
|
|
|
+ lea (%r14,%rdx),%rbp
|
|
|
|
+ # (uint32) a <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x4 ^= a
|
|
|
|
+ xor %rbp,%r9
|
|
|
|
+ # b = x1 + x5
|
|
|
|
+ lea (%rdi,%r15),%rbp
|
|
|
|
+ # (uint32) b <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x9 ^= b
|
|
|
|
+ xor %rbp,%r10
|
|
|
|
+ # a = x0 + x4
|
|
|
|
+ lea (%rdx,%r9),%rbp
|
|
|
|
+ # (uint32) a <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x8 ^= a
|
|
|
|
+ xor %rbp,%r11
|
|
|
|
+ # b = x5 + x9
|
|
|
|
+ lea (%r15,%r10),%rbp
|
|
|
|
+ # (uint32) b <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x13 ^= b
|
|
|
|
+ xor %rbp,%r13
|
|
|
|
+ # a = x4 + x8
|
|
|
|
+ lea (%r9,%r11),%rbp
|
|
|
|
+ # (uint32) a <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x12 ^= a
|
|
|
|
+ xor %rbp,%r14
|
|
|
|
+ # b = x9 + x13
|
|
|
|
+ lea (%r10,%r13),%rbp
|
|
|
|
+ # (uint32) b <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x1 ^= b
|
|
|
|
+ xor %rbp,%rdi
|
|
|
|
+ # a = x8 + x12
|
|
|
|
+ lea (%r11,%r14),%rbp
|
|
|
|
+ # (uint32) a <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x0 ^= a
|
|
|
|
+ xor %rbp,%rdx
|
|
|
|
+ # b = x13 + x1
|
|
|
|
+ lea (%r13,%rdi),%rbp
|
|
|
|
+ # (uint32) b <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x5 ^= b
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x10 = x10_stack
|
|
|
|
+ movq 168(%rsp),%rbp
|
|
|
|
+ # x5_stack = x5
|
|
|
|
+ movq %r15,160(%rsp)
|
|
|
|
+ # c = x6 + x10
|
|
|
|
+ lea (%rax,%rbp),%r15
|
|
|
|
+ # (uint32) c <<<= 7
|
|
|
|
+ rol $7,%r15d
|
|
|
|
+ # x14 ^= c
|
|
|
|
+ xor %r15,%rbx
|
|
|
|
+ # c = x10 + x14
|
|
|
|
+ lea (%rbp,%rbx),%r15
|
|
|
|
+ # (uint32) c <<<= 9
|
|
|
|
+ rol $9,%r15d
|
|
|
|
+ # x2 ^= c
|
|
|
|
+ xor %r15,%rcx
|
|
|
|
+ # c = x14 + x2
|
|
|
|
+ lea (%rbx,%rcx),%r15
|
|
|
|
+ # (uint32) c <<<= 13
|
|
|
|
+ rol $13,%r15d
|
|
|
|
+ # x6 ^= c
|
|
|
|
+ xor %r15,%rax
|
|
|
|
+ # c = x2 + x6
|
|
|
|
+ lea (%rcx,%rax),%r15
|
|
|
|
+ # (uint32) c <<<= 18
|
|
|
|
+ rol $18,%r15d
|
|
|
|
+ # x10 ^= c
|
|
|
|
+ xor %r15,%rbp
|
|
|
|
+ # x15 = x15_stack
|
|
|
|
+ movq 176(%rsp),%r15
|
|
|
|
+ # x10_stack = x10
|
|
|
|
+ movq %rbp,168(%rsp)
|
|
|
|
+ # d = x11 + x15
|
|
|
|
+ lea (%r12,%r15),%rbp
|
|
|
|
+ # (uint32) d <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x3 ^= d
|
|
|
|
+ xor %rbp,%rsi
|
|
|
|
+ # d = x15 + x3
|
|
|
|
+ lea (%r15,%rsi),%rbp
|
|
|
|
+ # (uint32) d <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x7 ^= d
|
|
|
|
+ xor %rbp,%r8
|
|
|
|
+ # d = x3 + x7
|
|
|
|
+ lea (%rsi,%r8),%rbp
|
|
|
|
+ # (uint32) d <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x11 ^= d
|
|
|
|
+ xor %rbp,%r12
|
|
|
|
+ # d = x7 + x11
|
|
|
|
+ lea (%r8,%r12),%rbp
|
|
|
|
+ # (uint32) d <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x15 ^= d
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x15_stack = x15
|
|
|
|
+ movq %r15,176(%rsp)
|
|
|
|
+ # x5 = x5_stack
|
|
|
|
+ movq 160(%rsp),%r15
|
|
|
|
+ # a = x3 + x0
|
|
|
|
+ lea (%rsi,%rdx),%rbp
|
|
|
|
+ # (uint32) a <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x1 ^= a
|
|
|
|
+ xor %rbp,%rdi
|
|
|
|
+ # b = x4 + x5
|
|
|
|
+ lea (%r9,%r15),%rbp
|
|
|
|
+ # (uint32) b <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x6 ^= b
|
|
|
|
+ xor %rbp,%rax
|
|
|
|
+ # a = x0 + x1
|
|
|
|
+ lea (%rdx,%rdi),%rbp
|
|
|
|
+ # (uint32) a <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x2 ^= a
|
|
|
|
+ xor %rbp,%rcx
|
|
|
|
+ # b = x5 + x6
|
|
|
|
+ lea (%r15,%rax),%rbp
|
|
|
|
+ # (uint32) b <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x7 ^= b
|
|
|
|
+ xor %rbp,%r8
|
|
|
|
+ # a = x1 + x2
|
|
|
|
+ lea (%rdi,%rcx),%rbp
|
|
|
|
+ # (uint32) a <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x3 ^= a
|
|
|
|
+ xor %rbp,%rsi
|
|
|
|
+ # b = x6 + x7
|
|
|
|
+ lea (%rax,%r8),%rbp
|
|
|
|
+ # (uint32) b <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x4 ^= b
|
|
|
|
+ xor %rbp,%r9
|
|
|
|
+ # a = x2 + x3
|
|
|
|
+ lea (%rcx,%rsi),%rbp
|
|
|
|
+ # (uint32) a <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x0 ^= a
|
|
|
|
+ xor %rbp,%rdx
|
|
|
|
+ # b = x7 + x4
|
|
|
|
+ lea (%r8,%r9),%rbp
|
|
|
|
+ # (uint32) b <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x5 ^= b
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x10 = x10_stack
|
|
|
|
+ movq 168(%rsp),%rbp
|
|
|
|
+ # x5_stack = x5
|
|
|
|
+ movq %r15,160(%rsp)
|
|
|
|
+ # c = x9 + x10
|
|
|
|
+ lea (%r10,%rbp),%r15
|
|
|
|
+ # (uint32) c <<<= 7
|
|
|
|
+ rol $7,%r15d
|
|
|
|
+ # x11 ^= c
|
|
|
|
+ xor %r15,%r12
|
|
|
|
+ # c = x10 + x11
|
|
|
|
+ lea (%rbp,%r12),%r15
|
|
|
|
+ # (uint32) c <<<= 9
|
|
|
|
+ rol $9,%r15d
|
|
|
|
+ # x8 ^= c
|
|
|
|
+ xor %r15,%r11
|
|
|
|
+ # c = x11 + x8
|
|
|
|
+ lea (%r12,%r11),%r15
|
|
|
|
+ # (uint32) c <<<= 13
|
|
|
|
+ rol $13,%r15d
|
|
|
|
+ # x9 ^= c
|
|
|
|
+ xor %r15,%r10
|
|
|
|
+ # c = x8 + x9
|
|
|
|
+ lea (%r11,%r10),%r15
|
|
|
|
+ # (uint32) c <<<= 18
|
|
|
|
+ rol $18,%r15d
|
|
|
|
+ # x10 ^= c
|
|
|
|
+ xor %r15,%rbp
|
|
|
|
+ # x15 = x15_stack
|
|
|
|
+ movq 176(%rsp),%r15
|
|
|
|
+ # x10_stack = x10
|
|
|
|
+ movq %rbp,168(%rsp)
|
|
|
|
+ # d = x14 + x15
|
|
|
|
+ lea (%rbx,%r15),%rbp
|
|
|
|
+ # (uint32) d <<<= 7
|
|
|
|
+ rol $7,%ebp
|
|
|
|
+ # x12 ^= d
|
|
|
|
+ xor %rbp,%r14
|
|
|
|
+ # d = x15 + x12
|
|
|
|
+ lea (%r15,%r14),%rbp
|
|
|
|
+ # (uint32) d <<<= 9
|
|
|
|
+ rol $9,%ebp
|
|
|
|
+ # x13 ^= d
|
|
|
|
+ xor %rbp,%r13
|
|
|
|
+ # d = x12 + x13
|
|
|
|
+ lea (%r14,%r13),%rbp
|
|
|
|
+ # (uint32) d <<<= 13
|
|
|
|
+ rol $13,%ebp
|
|
|
|
+ # x14 ^= d
|
|
|
|
+ xor %rbp,%rbx
|
|
|
|
+ # d = x13 + x14
|
|
|
|
+ lea (%r13,%rbx),%rbp
|
|
|
|
+ # (uint32) d <<<= 18
|
|
|
|
+ rol $18,%ebp
|
|
|
|
+ # x15 ^= d
|
|
|
|
+ xor %rbp,%r15
|
|
|
|
+ # x15_stack = x15
|
|
|
|
+ movq %r15,176(%rsp)
|
|
|
|
+ # i = i_backup
|
|
|
|
+ movq 184(%rsp),%r15
|
|
|
|
+ # unsigned>? i -= 4
|
|
|
|
+ sub $4,%r15
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto mainloop if unsigned>
|
|
|
|
+ ja ._mainloop
|
|
|
|
+ # (uint32) x2 += j2
|
|
|
|
+ addl 64(%rsp),%ecx
|
|
|
|
+ # x3 <<= 32
|
|
|
|
+ shl $32,%rsi
|
|
|
|
+ # x3 += j2
|
|
|
|
+ addq 64(%rsp),%rsi
|
|
|
|
+ # (uint64) x3 >>= 32
|
|
|
|
+ shr $32,%rsi
|
|
|
|
+ # x3 <<= 32
|
|
|
|
+ shl $32,%rsi
|
|
|
|
+ # x2 += x3
|
|
|
|
+ add %rsi,%rcx
|
|
|
|
+ # (uint32) x6 += j6
|
|
|
|
+ addl 80(%rsp),%eax
|
|
|
|
+ # x7 <<= 32
|
|
|
|
+ shl $32,%r8
|
|
|
|
+ # x7 += j6
|
|
|
|
+ addq 80(%rsp),%r8
|
|
|
|
+ # (uint64) x7 >>= 32
|
|
|
|
+ shr $32,%r8
|
|
|
|
+ # x7 <<= 32
|
|
|
|
+ shl $32,%r8
|
|
|
|
+ # x6 += x7
|
|
|
|
+ add %r8,%rax
|
|
|
|
+ # (uint32) x8 += j8
|
|
|
|
+ addl 88(%rsp),%r11d
|
|
|
|
+ # x9 <<= 32
|
|
|
|
+ shl $32,%r10
|
|
|
|
+ # x9 += j8
|
|
|
|
+ addq 88(%rsp),%r10
|
|
|
|
+ # (uint64) x9 >>= 32
|
|
|
|
+ shr $32,%r10
|
|
|
|
+ # x9 <<= 32
|
|
|
|
+ shl $32,%r10
|
|
|
|
+ # x8 += x9
|
|
|
|
+ add %r10,%r11
|
|
|
|
+ # (uint32) x12 += j12
|
|
|
|
+ addl 104(%rsp),%r14d
|
|
|
|
+ # x13 <<= 32
|
|
|
|
+ shl $32,%r13
|
|
|
|
+ # x13 += j12
|
|
|
|
+ addq 104(%rsp),%r13
|
|
|
|
+ # (uint64) x13 >>= 32
|
|
|
|
+ shr $32,%r13
|
|
|
|
+ # x13 <<= 32
|
|
|
|
+ shl $32,%r13
|
|
|
|
+ # x12 += x13
|
|
|
|
+ add %r13,%r14
|
|
|
|
+ # (uint32) x0 += j0
|
|
|
|
+ addl 56(%rsp),%edx
|
|
|
|
+ # x1 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x1 += j0
|
|
|
|
+ addq 56(%rsp),%rdi
|
|
|
|
+ # (uint64) x1 >>= 32
|
|
|
|
+ shr $32,%rdi
|
|
|
|
+ # x1 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x0 += x1
|
|
|
|
+ add %rdi,%rdx
|
|
|
|
+ # x5 = x5_stack
|
|
|
|
+ movq 160(%rsp),%rdi
|
|
|
|
+ # (uint32) x4 += j4
|
|
|
|
+ addl 72(%rsp),%r9d
|
|
|
|
+ # x5 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x5 += j4
|
|
|
|
+ addq 72(%rsp),%rdi
|
|
|
|
+ # (uint64) x5 >>= 32
|
|
|
|
+ shr $32,%rdi
|
|
|
|
+ # x5 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x4 += x5
|
|
|
|
+ add %rdi,%r9
|
|
|
|
+ # x10 = x10_stack
|
|
|
|
+ movq 168(%rsp),%r8
|
|
|
|
+ # (uint32) x10 += j10
|
|
|
|
+ addl 96(%rsp),%r8d
|
|
|
|
+ # x11 <<= 32
|
|
|
|
+ shl $32,%r12
|
|
|
|
+ # x11 += j10
|
|
|
|
+ addq 96(%rsp),%r12
|
|
|
|
+ # (uint64) x11 >>= 32
|
|
|
|
+ shr $32,%r12
|
|
|
|
+ # x11 <<= 32
|
|
|
|
+ shl $32,%r12
|
|
|
|
+ # x10 += x11
|
|
|
|
+ add %r12,%r8
|
|
|
|
+ # x15 = x15_stack
|
|
|
|
+ movq 176(%rsp),%rdi
|
|
|
|
+ # (uint32) x14 += j14
|
|
|
|
+ addl 112(%rsp),%ebx
|
|
|
|
+ # x15 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x15 += j14
|
|
|
|
+ addq 112(%rsp),%rdi
|
|
|
|
+ # (uint64) x15 >>= 32
|
|
|
|
+ shr $32,%rdi
|
|
|
|
+ # x15 <<= 32
|
|
|
|
+ shl $32,%rdi
|
|
|
|
+ # x14 += x15
|
|
|
|
+ add %rdi,%rbx
|
|
|
|
+ # out = out_backup
|
|
|
|
+ movq 136(%rsp),%rdi
|
|
|
|
+ # m = m_backup
|
|
|
|
+ movq 144(%rsp),%rsi
|
|
|
|
+ # x0 ^= *(uint64 *) (m + 0)
|
|
|
|
+ xorq 0(%rsi),%rdx
|
|
|
|
+ # *(uint64 *) (out + 0) = x0
|
|
|
|
+ movq %rdx,0(%rdi)
|
|
|
|
+ # x2 ^= *(uint64 *) (m + 8)
|
|
|
|
+ xorq 8(%rsi),%rcx
|
|
|
|
+ # *(uint64 *) (out + 8) = x2
|
|
|
|
+ movq %rcx,8(%rdi)
|
|
|
|
+ # x4 ^= *(uint64 *) (m + 16)
|
|
|
|
+ xorq 16(%rsi),%r9
|
|
|
|
+ # *(uint64 *) (out + 16) = x4
|
|
|
|
+ movq %r9,16(%rdi)
|
|
|
|
+ # x6 ^= *(uint64 *) (m + 24)
|
|
|
|
+ xorq 24(%rsi),%rax
|
|
|
|
+ # *(uint64 *) (out + 24) = x6
|
|
|
|
+ movq %rax,24(%rdi)
|
|
|
|
+ # x8 ^= *(uint64 *) (m + 32)
|
|
|
|
+ xorq 32(%rsi),%r11
|
|
|
|
+ # *(uint64 *) (out + 32) = x8
|
|
|
|
+ movq %r11,32(%rdi)
|
|
|
|
+ # x10 ^= *(uint64 *) (m + 40)
|
|
|
|
+ xorq 40(%rsi),%r8
|
|
|
|
+ # *(uint64 *) (out + 40) = x10
|
|
|
|
+ movq %r8,40(%rdi)
|
|
|
|
+ # x12 ^= *(uint64 *) (m + 48)
|
|
|
|
+ xorq 48(%rsi),%r14
|
|
|
|
+ # *(uint64 *) (out + 48) = x12
|
|
|
|
+ movq %r14,48(%rdi)
|
|
|
|
+ # x14 ^= *(uint64 *) (m + 56)
|
|
|
|
+ xorq 56(%rsi),%rbx
|
|
|
|
+ # *(uint64 *) (out + 56) = x14
|
|
|
|
+ movq %rbx,56(%rdi)
|
|
|
|
+ # bytes = bytes_backup
|
|
|
|
+ movq 152(%rsp),%rdx
|
|
|
|
+ # in8 = j8
|
|
|
|
+ movq 88(%rsp),%rcx
|
|
|
|
+ # in8 += 1
|
|
|
|
+ add $1,%rcx
|
|
|
|
+ # j8 = in8
|
|
|
|
+ movq %rcx,88(%rsp)
|
|
|
|
+ # unsigned>? unsigned<? bytes - 64
|
|
|
|
+ cmp $64,%rdx
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto bytesatleast65 if unsigned>
|
|
|
|
+ ja ._bytesatleast65
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto bytesatleast64 if !unsigned<
|
|
|
|
+ jae ._bytesatleast64
|
|
|
|
+ # m = out
|
|
|
|
+ mov %rdi,%rsi
|
|
|
|
+ # out = ctarget
|
|
|
|
+ movq 128(%rsp),%rdi
|
|
|
|
+ # i = bytes
|
|
|
|
+ mov %rdx,%rcx
|
|
|
|
+ # while (i) { *out++ = *m++; --i }
|
|
|
|
+ rep movsb
|
|
|
|
+ # comment:fp stack unchanged by fallthrough
|
|
|
|
+# bytesatleast64:
|
|
|
|
+._bytesatleast64:
|
|
|
|
+ # x = x_backup
|
|
|
|
+ movq 120(%rsp),%rdi
|
|
|
|
+ # in8 = j8
|
|
|
|
+ movq 88(%rsp),%rsi
|
|
|
|
+ # *(uint64 *) (x + 32) = in8
|
|
|
|
+ movq %rsi,32(%rdi)
|
|
|
|
+ # r11 = r11_stack
|
|
|
|
+ movq 0(%rsp),%r11
|
|
|
|
+ # r12 = r12_stack
|
|
|
|
+ movq 8(%rsp),%r12
|
|
|
|
+ # r13 = r13_stack
|
|
|
|
+ movq 16(%rsp),%r13
|
|
|
|
+ # r14 = r14_stack
|
|
|
|
+ movq 24(%rsp),%r14
|
|
|
|
+ # r15 = r15_stack
|
|
|
|
+ movq 32(%rsp),%r15
|
|
|
|
+ # rbx = rbx_stack
|
|
|
|
+ movq 40(%rsp),%rbx
|
|
|
|
+ # rbp = rbp_stack
|
|
|
|
+ movq 48(%rsp),%rbp
|
|
|
|
+ # comment:fp stack unchanged by fallthrough
|
|
|
|
+# done:
|
|
|
|
+._done:
|
|
|
|
+ # leave
|
|
|
|
+ add %r11,%rsp
|
|
|
|
+ mov %rdi,%rax
|
|
|
|
+ mov %rsi,%rdx
|
|
|
|
+ ret
|
|
|
|
+# bytesatleast65:
|
|
|
|
+._bytesatleast65:
|
|
|
|
+ # bytes -= 64
|
|
|
|
+ sub $64,%rdx
|
|
|
|
+ # out += 64
|
|
|
|
+ add $64,%rdi
|
|
|
|
+ # m += 64
|
|
|
|
+ add $64,%rsi
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto bytesatleast1
|
|
|
|
+ jmp ._bytesatleast1
|
|
|
|
+# enter ECRYPT_keysetup
|
|
|
|
+.text
|
|
|
|
+.p2align 5
|
|
|
|
+.globl ECRYPT_keysetup
|
|
|
|
+ECRYPT_keysetup:
|
|
|
|
+ mov %rsp,%r11
|
|
|
|
+ and $31,%r11
|
|
|
|
+ add $256,%r11
|
|
|
|
+ sub %r11,%rsp
|
|
|
|
+ # k = arg2
|
|
|
|
+ mov %rsi,%rsi
|
|
|
|
+ # kbits = arg3
|
|
|
|
+ mov %rdx,%rdx
|
|
|
|
+ # x = arg1
|
|
|
|
+ mov %rdi,%rdi
|
|
|
|
+ # in0 = *(uint64 *) (k + 0)
|
|
|
|
+ movq 0(%rsi),%r8
|
|
|
|
+ # in2 = *(uint64 *) (k + 8)
|
|
|
|
+ movq 8(%rsi),%r9
|
|
|
|
+ # *(uint64 *) (x + 4) = in0
|
|
|
|
+ movq %r8,4(%rdi)
|
|
|
|
+ # *(uint64 *) (x + 12) = in2
|
|
|
|
+ movq %r9,12(%rdi)
|
|
|
|
+ # unsigned<? kbits - 256
|
|
|
|
+ cmp $256,%rdx
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto kbits128 if unsigned<
|
|
|
|
+ jb ._kbits128
|
|
|
|
+# kbits256:
|
|
|
|
+._kbits256:
|
|
|
|
+ # in10 = *(uint64 *) (k + 16)
|
|
|
|
+ movq 16(%rsi),%rdx
|
|
|
|
+ # in12 = *(uint64 *) (k + 24)
|
|
|
|
+ movq 24(%rsi),%rsi
|
|
|
|
+ # *(uint64 *) (x + 44) = in10
|
|
|
|
+ movq %rdx,44(%rdi)
|
|
|
|
+ # *(uint64 *) (x + 52) = in12
|
|
|
|
+ movq %rsi,52(%rdi)
|
|
|
|
+ # in0 = 1634760805
|
|
|
|
+ mov $1634760805,%rsi
|
|
|
|
+ # in4 = 857760878
|
|
|
|
+ mov $857760878,%rdx
|
|
|
|
+ # in10 = 2036477234
|
|
|
|
+ mov $2036477234,%rcx
|
|
|
|
+ # in14 = 1797285236
|
|
|
|
+ mov $1797285236,%r8
|
|
|
|
+ # *(uint32 *) (x + 0) = in0
|
|
|
|
+ movl %esi,0(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 20) = in4
|
|
|
|
+ movl %edx,20(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 40) = in10
|
|
|
|
+ movl %ecx,40(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 60) = in14
|
|
|
|
+ movl %r8d,60(%rdi)
|
|
|
|
+ # comment:fp stack unchanged by jump
|
|
|
|
+ # goto keysetupdone
|
|
|
|
+ jmp ._keysetupdone
|
|
|
|
+# kbits128:
|
|
|
|
+._kbits128:
|
|
|
|
+ # in10 = *(uint64 *) (k + 0)
|
|
|
|
+ movq 0(%rsi),%rdx
|
|
|
|
+ # in12 = *(uint64 *) (k + 8)
|
|
|
|
+ movq 8(%rsi),%rsi
|
|
|
|
+ # *(uint64 *) (x + 44) = in10
|
|
|
|
+ movq %rdx,44(%rdi)
|
|
|
|
+ # *(uint64 *) (x + 52) = in12
|
|
|
|
+ movq %rsi,52(%rdi)
|
|
|
|
+ # in0 = 1634760805
|
|
|
|
+ mov $1634760805,%rsi
|
|
|
|
+ # in4 = 824206446
|
|
|
|
+ mov $824206446,%rdx
|
|
|
|
+ # in10 = 2036477238
|
|
|
|
+ mov $2036477238,%rcx
|
|
|
|
+ # in14 = 1797285236
|
|
|
|
+ mov $1797285236,%r8
|
|
|
|
+ # *(uint32 *) (x + 0) = in0
|
|
|
|
+ movl %esi,0(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 20) = in4
|
|
|
|
+ movl %edx,20(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 40) = in10
|
|
|
|
+ movl %ecx,40(%rdi)
|
|
|
|
+ # *(uint32 *) (x + 60) = in14
|
|
|
|
+ movl %r8d,60(%rdi)
|
|
|
|
+# keysetupdone:
|
|
|
|
+._keysetupdone:
|
|
|
|
+ # leave
|
|
|
|
+ add %r11,%rsp
|
|
|
|
+ mov %rdi,%rax
|
|
|
|
+ mov %rsi,%rdx
|
|
|
|
+ ret
|
|
|
|
+# enter ECRYPT_ivsetup
|
|
|
|
+.text
|
|
|
|
+.p2align 5
|
|
|
|
+.globl ECRYPT_ivsetup
|
|
|
|
+ECRYPT_ivsetup:
|
|
|
|
+ mov %rsp,%r11
|
|
|
|
+ and $31,%r11
|
|
|
|
+ add $256,%r11
|
|
|
|
+ sub %r11,%rsp
|
|
|
|
+ # iv = arg2
|
|
|
|
+ mov %rsi,%rsi
|
|
|
|
+ # x = arg1
|
|
|
|
+ mov %rdi,%rdi
|
|
|
|
+ # in6 = *(uint64 *) (iv + 0)
|
|
|
|
+ movq 0(%rsi),%rsi
|
|
|
|
+ # in8 = 0
|
|
|
|
+ mov $0,%r8
|
|
|
|
+ # *(uint64 *) (x + 24) = in6
|
|
|
|
+ movq %rsi,24(%rdi)
|
|
|
|
+ # *(uint64 *) (x + 32) = in8
|
|
|
|
+ movq %r8,32(%rdi)
|
|
|
|
+ # leave
|
|
|
|
+ add %r11,%rsp
|
|
|
|
+ mov %rdi,%rax
|
|
|
|
+ mov %rsi,%rdx
|
|
|
|
+ ret
|