summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2014-12-01 21:10:19 +0200
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2014-12-06 14:02:30 +0200
commitcbf4c8cb6bbda15eea61885279f2a6f1d4bcedfd (patch)
treead39c43a7ac31cc4327addfceffa776579dc26af
parent3d5b51786e2050c461e9791b59142a731462b66d (diff)
downloadlibgcrypt-cbf4c8cb6bbda15eea61885279f2a6f1d4bcedfd.tar.gz
rijndael: split Padlock part to separate file
* cipher/Makefile.am: Add 'rijndael-padlock.c'. * cipher/rijndael-padlock.c: New. * cipher/rijndael.c (do_padlock, do_padlock_encrypt) (do_padlock_decrypt): Move to 'rijndael-padlock.c'. * configure.ac [mpi_cpu_arch=x86]: Add 'rijndael-padlock.lo'. -- Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
-rw-r--r--cipher/Makefile.am2
-rw-r--r--cipher/rijndael-padlock.c102
-rw-r--r--cipher/rijndael.c86
-rw-r--r--configure.ac3
4 files changed, 114 insertions, 79 deletions
diff --git a/cipher/Makefile.am b/cipher/Makefile.am
index 19b36925..d7e77736 100644
--- a/cipher/Makefile.am
+++ b/cipher/Makefile.am
@@ -75,7 +75,7 @@ md4.c \
md5.c \
poly1305-sse2-amd64.S poly1305-avx2-amd64.S poly1305-armv7-neon.S \
rijndael.c rijndael-internal.h rijndael-tables.h rijndael-aesni.c \
- rijndael-amd64.S rijndael-arm.S \
+ rijndael-padlock.c rijndael-amd64.S rijndael-arm.S \
rmd160.c \
rsa.c \
salsa20.c salsa20-amd64.S salsa20-armv7-neon.S \
diff --git a/cipher/rijndael-padlock.c b/cipher/rijndael-padlock.c
new file mode 100644
index 00000000..476772af
--- /dev/null
+++ b/cipher/rijndael-padlock.c
@@ -0,0 +1,102 @@
+/* Padlock accelerated AES for Libgcrypt
+ * Copyright (C) 2000, 2001, 2002, 2003, 2007,
+ * 2008, 2011, 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* for memcmp() */
+
+#include "types.h" /* for byte and u32 typedefs */
+#include "g10lib.h"
+#include "cipher.h"
+#include "bufhelp.h"
+#include "cipher-selftest.h"
+#include "rijndael-internal.h"
+
+#ifdef USE_PADLOCK
+
+/* Encrypt or decrypt one block using the padlock engine. A and B may
+ be the same. */
+static unsigned int
+do_padlock (const RIJNDAEL_context *ctx, unsigned char *bx,
+ const unsigned char *ax, int decrypt_flag)
+{
+ /* BX and AX are not necessary correctly aligned. Thus we need to
+ copy them here. */
+ unsigned char a[16] __attribute__ ((aligned (16)));
+ unsigned char b[16] __attribute__ ((aligned (16)));
+ unsigned int cword[4] __attribute__ ((aligned (16)));
+ int blocks;
+
+ /* The control word fields are:
+ 127:12 11:10 9 8 7 6 5 4 3:0
+ RESERVED KSIZE CRYPT INTER KEYGN CIPHR ALIGN DGEST ROUND */
+ cword[0] = (ctx->rounds & 15); /* (The mask is just a safeguard.) */
+ cword[1] = 0;
+ cword[2] = 0;
+ cword[3] = 0;
+ if (decrypt_flag)
+ cword[0] |= 0x00000200;
+
+ memcpy (a, ax, 16);
+
+ blocks = 1; /* Init counter for just one block. */
+#ifdef __x86_64__
+ asm volatile
+ ("pushfq\n\t" /* Force key reload. */
+ "popfq\n\t"
+ ".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t" /* REP XCRYPT ECB. */
+ : /* No output */
+ : "S" (a), "D" (b), "d" (cword), "b" (ctx->padlockkey), "c" (blocks)
+ : "cc", "memory"
+ );
+#else
+ asm volatile
+ ("pushfl\n\t" /* Force key reload. */
+ "popfl\n\t"
+ "xchg %3, %%ebx\n\t" /* Load key. */
+ ".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t" /* REP XCRYPT ECB. */
+ "xchg %3, %%ebx\n" /* Restore GOT register. */
+ : /* No output */
+ : "S" (a), "D" (b), "d" (cword), "r" (ctx->padlockkey), "c" (blocks)
+ : "cc", "memory"
+ );
+#endif
+
+ memcpy (bx, b, 16);
+
+ return (48 + 15 /* possible padding for alignment */);
+}
+
+unsigned int
+_gcry_aes_padlock_encrypt (const RIJNDAEL_context *ctx,
+ unsigned char *bx, const unsigned char *ax)
+{
+ return do_padlock(ctx, bx, ax, 0);
+}
+
+unsigned int
+_gcry_aes_padlock_decrypt (const RIJNDAEL_context *ctx,
+ unsigned char *bx, const unsigned char *ax)
+{
+ return do_padlock(ctx, bx, ax, 1);
+}
+
+#endif /* USE_PADLOCK */
diff --git a/cipher/rijndael.c b/cipher/rijndael.c
index 7a4f5ec1..aa1681db 100644
--- a/cipher/rijndael.c
+++ b/cipher/rijndael.c
@@ -106,12 +106,12 @@ extern void _gcry_aes_aesni_cbc_dec (RIJNDAEL_context *ctx,
#endif
#ifdef USE_PADLOCK
-static unsigned int do_padlock_encrypt (const RIJNDAEL_context *ctx,
- unsigned char *bx,
- const unsigned char *ax);
-static unsigned int do_padlock_decrypt (const RIJNDAEL_context *ctx,
- unsigned char *bx,
- const unsigned char *ax);
+extern unsigned int _gcry_aes_padlock_encrypt (const RIJNDAEL_context *ctx,
+ unsigned char *bx,
+ const unsigned char *ax);
+extern unsigned int _gcry_aes_padlock_decrypt (const RIJNDAEL_context *ctx,
+ unsigned char *bx,
+ const unsigned char *ax);
#endif
#ifdef USE_ARM_ASM
@@ -222,8 +222,8 @@ do_setkey (RIJNDAEL_context *ctx, const byte *key, const unsigned keylen)
#ifdef USE_PADLOCK
else if (hwfeatures & HWF_PADLOCK_AES && keylen == 128/8)
{
- ctx->encrypt_fn = do_padlock_encrypt;
- ctx->decrypt_fn = do_padlock_decrypt;
+ ctx->encrypt_fn = _gcry_aes_padlock_encrypt;
+ ctx->decrypt_fn = _gcry_aes_padlock_decrypt;
ctx->use_padlock = 1;
memcpy (ctx->padlockkey, key, keylen);
}
@@ -532,76 +532,6 @@ do_encrypt (const RIJNDAEL_context *ctx,
}
-/* Encrypt or decrypt one block using the padlock engine. A and B may
- be the same. */
-#ifdef USE_PADLOCK
-static unsigned int
-do_padlock (const RIJNDAEL_context *ctx, unsigned char *bx,
- const unsigned char *ax, int decrypt_flag)
-{
- /* BX and AX are not necessary correctly aligned. Thus we need to
- copy them here. */
- unsigned char a[16] __attribute__ ((aligned (16)));
- unsigned char b[16] __attribute__ ((aligned (16)));
- unsigned int cword[4] __attribute__ ((aligned (16)));
- int blocks;
-
- /* The control word fields are:
- 127:12 11:10 9 8 7 6 5 4 3:0
- RESERVED KSIZE CRYPT INTER KEYGN CIPHR ALIGN DGEST ROUND */
- cword[0] = (ctx->rounds & 15); /* (The mask is just a safeguard.) */
- cword[1] = 0;
- cword[2] = 0;
- cword[3] = 0;
- if (decrypt_flag)
- cword[0] |= 0x00000200;
-
- memcpy (a, ax, 16);
-
- blocks = 1; /* Init counter for just one block. */
-#ifdef __x86_64__
- asm volatile
- ("pushfq\n\t" /* Force key reload. */
- "popfq\n\t"
- ".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t" /* REP XCRYPT ECB. */
- : /* No output */
- : "S" (a), "D" (b), "d" (cword), "b" (ctx->padlockkey), "c" (blocks)
- : "cc", "memory"
- );
-#else
- asm volatile
- ("pushfl\n\t" /* Force key reload. */
- "popfl\n\t"
- "xchg %3, %%ebx\n\t" /* Load key. */
- ".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t" /* REP XCRYPT ECB. */
- "xchg %3, %%ebx\n" /* Restore GOT register. */
- : /* No output */
- : "S" (a), "D" (b), "d" (cword), "r" (ctx->padlockkey), "c" (blocks)
- : "cc", "memory"
- );
-#endif
-
- memcpy (bx, b, 16);
-
- return (48 + 15 /* possible padding for alignment */);
-}
-
-static unsigned int
-do_padlock_encrypt (const RIJNDAEL_context *ctx,
- unsigned char *bx, const unsigned char *ax)
-{
- return do_padlock(ctx, bx, ax, 0);
-}
-
-static unsigned int
-do_padlock_decrypt (const RIJNDAEL_context *ctx,
- unsigned char *bx, const unsigned char *ax)
-{
- return do_padlock(ctx, bx, ax, 1);
-}
-#endif /*USE_PADLOCK*/
-
-
static unsigned int
rijndael_encrypt (void *context, byte *b, const byte *a)
{
diff --git a/configure.ac b/configure.ac
index 369be25e..c979d571 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1703,6 +1703,9 @@ if test "$found" = "1" ; then
x86)
# Build with the AES-NI implementation
GCRYPT_CIPHERS="$GCRYPT_CIPHERS rijndael-aesni.lo"
+
+ # Build with the Padlock implementation
+ GCRYPT_CIPHERS="$GCRYPT_CIPHERS rijndael-padlock.lo"
;;
esac
fi