diff options
author | Niels Möller <nisse@lysator.liu.se> | 2013-05-20 20:36:25 +0200 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2013-05-20 20:36:25 +0200 |
commit | 5c4ca294ee274dee675b76d73045dc70080aab78 (patch) | |
tree | f5c4670379ca5d1a388188c240e354f498173bcd /x86_64/aes-decrypt-internal.asm | |
parent | 614a672e7efd87b82c514b471ccc66c081c380d4 (diff) | |
download | nettle-5c4ca294ee274dee675b76d73045dc70080aab78.tar.gz |
x86_64: Adapted aes assembly to new interrface.
Diffstat (limited to 'x86_64/aes-decrypt-internal.asm')
-rw-r--r-- | x86_64/aes-decrypt-internal.asm | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/x86_64/aes-decrypt-internal.asm b/x86_64/aes-decrypt-internal.asm index 606b7c89..f3451deb 100644 --- a/x86_64/aes-decrypt-internal.asm +++ b/x86_64/aes-decrypt-internal.asm @@ -1,7 +1,8 @@ C nettle, low-level cryptographics library C -C Copyright (C) 2001, 2002, 2005, 2008 Rafael R. Sevilla, Niels Möller -C +C Copyright (C) 2001, 2002, 2005, Rafael R. Sevilla, Niels Möller +C Copyright (C) 2008, 2013 Niels Möller +C C The nettle library is free software; you can redistribute it and/or modify C it under the terms of the GNU Lesser General Public License as published by C the Free Software Foundation; either version 2.1 of the License, or (at your @@ -31,16 +32,17 @@ define(<TA>,<%r10d>) define(<TB>,<%r11d>) define(<TC>,<%r12d>) -define(<CTX>, <%rdi>) -define(<TABLE>, <%rsi>) -define(<PARAM_LENGTH>,<%rdx>) -define(<PARAM_DST>, <%rcx>) -define(<SRC>, <%r8>) +C Input argument +define(<ROUNDS>, <%rdi>) +define(<KEYS>, <%rsi>) +define(<PARAM_TABLE>, <%rdx>) +define(<PARAM_LENGTH>,<%rcx>) +define(<DST>, <%r8>) +define(<SRC>, <%r9>) -define(<DST>, <%r9>) -define(<KEY>,<%r14>) -define(<COUNT>, <%r15d>) -define(<BLOCK_COUNT>, <%r13>) +define(<TABLE>, <%r13>) +define(<LENGTH>,<%r14>) +define(<KEY>, <%r15>) C Must correspond to an old-style register, for movzb from %ah--%dh to C work. @@ -48,14 +50,14 @@ define(<TMP>,<%rbp>) .file "aes-decrypt-internal.asm" - C _aes_decrypt(struct aes_context *ctx, + C _aes_decrypt(unsigned rounds, const uint32_t *keys, C const struct aes_table *T, C size_t length, uint8_t *dst, C uint8_t *src) .text ALIGN(16) PROLOGUE(_nettle_aes_decrypt) - W64_ENTRY(5, 0) + W64_ENTRY(6, 0) test PARAM_LENGTH, PARAM_LENGTH jz .Lend @@ -67,20 +69,21 @@ PROLOGUE(_nettle_aes_decrypt) push %r14 push %r15 - mov PARAM_DST, DST - mov PARAM_LENGTH, BLOCK_COUNT - shr $4, BLOCK_COUNT + subl $1, XREG(ROUNDS) + push ROUNDS C Rounds at (%rsp) + + mov PARAM_TABLE, TABLE + mov PARAM_LENGTH, LENGTH + shr $4, LENGTH .Lblock_loop: - mov CTX,KEY + mov KEYS, KEY AES_LOAD(SA, SB, SC, SD, SRC, KEY) add $16, SRC C Increment src pointer - C get number of rounds to do from ctx struct - movl AES_NROUNDS (CTX), COUNT - subl $1, COUNT + movl (%rsp), XREG(ROUNDS) - add $16,KEY C point to next key + add $16, KEY C point to next key ALIGN(16) .Lround_loop: AES_ROUND(TABLE, SA,SD,SC,SB, TA, TMP) @@ -97,8 +100,8 @@ PROLOGUE(_nettle_aes_decrypt) xorl 8(KEY),SC xorl 12(KEY),SD - add $16,KEY C point to next key - decl COUNT + add $16, KEY C point to next key + decl XREG(ROUNDS) jnz .Lround_loop C last round @@ -108,28 +111,29 @@ PROLOGUE(_nettle_aes_decrypt) AES_FINAL_ROUND(SD,SC,SB,SA, TABLE, SD, TMP) C Inverse S-box substitution - mov $3, COUNT + mov $3, XREG(ROUNDS) .Lsubst: AES_SUBST_BYTE(TA,TB,TC,SD, TABLE, TMP) - decl COUNT + decl XREG(ROUNDS) jnz .Lsubst C Add last subkey, and store decrypted data AES_STORE(TA,TB,TC,SD, KEY, DST) add $16, DST - dec BLOCK_COUNT + dec LENGTH jnz .Lblock_loop - pop %r15 + lea 8(%rsp), %rsp C Drop ROUNDS + pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx .Lend: - W64_EXIT(5, 0) + W64_EXIT(6, 0) ret EPILOGUE(_nettle_aes_decrypt) |