From 5c4ca294ee274dee675b76d73045dc70080aab78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Mon, 20 May 2013 20:36:25 +0200 Subject: [PATCH] x86_64: Adapted aes assembly to new interrface. --- ChangeLog | 6 ++++ x86_64/aes-decrypt-internal.asm | 60 ++++++++++++++++++--------------- x86_64/aes-encrypt-internal.asm | 58 ++++++++++++++++--------------- 3 files changed, 69 insertions(+), 55 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd7ca286..070f00af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-05-20 Niels Möller + + * x86_64/aes-decrypt-internal.asm: Likewise. + + * x86_64/aes-encrypt-internal.asm: Adapted to new interface. + 2013-05-17 Niels Möller * aes.h (struct aes_ctx): Renamed nrounds to rounds, and moved 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(,<%r10d>) define(,<%r11d>) define(,<%r12d>) -define(, <%rdi>) -define(, <%rsi>) -define(,<%rdx>) -define(, <%rcx>) -define(, <%r8>) +C Input argument +define(, <%rdi>) +define(, <%rsi>) +define(, <%rdx>) +define(,<%rcx>) +define(, <%r8>) +define(, <%r9>) -define(, <%r9>) -define(,<%r14>) -define(, <%r15d>) -define(, <%r13>) +define(
, <%r13>) +define(,<%r14>) +define(, <%r15>) C Must correspond to an old-style register, for movzb from %ah--%dh to C work. @@ -48,14 +50,14 @@ define(,<%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) diff --git a/x86_64/aes-encrypt-internal.asm b/x86_64/aes-encrypt-internal.asm index e1003c69..27b031b5 100644 --- a/x86_64/aes-encrypt-internal.asm +++ b/x86_64/aes-encrypt-internal.asm @@ -1,6 +1,7 @@ C nettle, low-level cryptographics library C -C Copyright (C) 2001, 2002, 2005, 2008 Rafael R. Sevilla, Niels Möller +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 @@ -31,16 +32,17 @@ define(,<%r10d>) define(,<%r11d>) define(,<%r12d>) -define(, <%rdi>) -define(
, <%rsi>) -define(,<%rdx>) -define(, <%rcx>) -define(, <%r8>) +C Input argument +define(, <%rdi>) +define(, <%rsi>) +define(, <%rdx>) +define(,<%rcx>) +define(, <%r8>) +define(, <%r9>) -define(, <%r9>) -define(,<%r14>) -define(, <%r15d>) -define(, <%r13>) +define(
, <%r13>) +define(,<%r14>) +define(, <%r15>) C Must correspond to an old-style register, for movzb from %ah--%dh to C work. @@ -48,14 +50,14 @@ define(,<%rbp>) .file "aes-encrypt-internal.asm" - C _aes_encrypt(struct aes_context *ctx, + C _aes_encrypt(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_encrypt) - W64_ENTRY(5, 0) + W64_ENTRY(6, 0) test PARAM_LENGTH, PARAM_LENGTH jz .Lend @@ -67,20 +69,21 @@ PROLOGUE(_nettle_aes_encrypt) 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,SB,SC,SD, TA, TMP) @@ -97,8 +100,8 @@ PROLOGUE(_nettle_aes_encrypt) 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_encrypt) AES_FINAL_ROUND(SD,SA,SB,SC, TABLE, SD, TMP) C 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 encrypted 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_encrypt) -- GitLab