Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 972d19e8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6:
  [CRYPTO] tcrypt: Forbid tcrypt from being built-in
  [CRYPTO] aes: Add wrappers for assembly routines
  [CRYPTO] tcrypt: Speed benchmark support for digest algorithms
  [CRYPTO] tcrypt: Return -EAGAIN from module_init()
  [CRYPTO] api: Allow replacement when registering new algorithms
  [CRYPTO] api: Removed const from cra_name/cra_driver_name
  [CRYPTO] api: Added cra_init/cra_exit
  [CRYPTO] api: Fixed incorrect passing of context instead of tfm
  [CRYPTO] padlock: Rearrange context structure to reduce code size
  [CRYPTO] all: Pass tfm instead of ctx to algorithms
  [CRYPTO] digest: Remove unnecessary zeroing during init
  [CRYPTO] aes-i586: Get rid of useless function wrappers
  [CRYPTO] digest: Add alignment handling
  [CRYPTO] khazad: Use 32-bit reads on key
parents cdf4f383 b9d0a25a
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -36,22 +36,19 @@
.file "aes-i586-asm.S"
.text

// aes_rval aes_enc_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])//
// aes_rval aes_dec_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])//
#include <asm/asm-offsets.h>

#define tlen 1024   // length of each of 4 'xor' arrays (256 32-bit words)

// offsets to parameters with one register pushed onto stack
/* offsets to parameters with one register pushed onto stack */
#define tfm 8
#define out_blk 12
#define in_blk 16

#define in_blk    8  // input byte array address parameter
#define out_blk  12  // output byte array address parameter
#define ctx      16  // AES context structure

// offsets in context structure

#define ekey     0   // encryption key schedule base address
#define nrnd   256   // number of rounds
#define dkey   260   // decryption key schedule base address
/* offsets in crypto_tfm structure */
#define ekey (crypto_tfm_ctx_offset + 0)
#define nrnd (crypto_tfm_ctx_offset + 256)
#define dkey (crypto_tfm_ctx_offset + 260)

// register mapping for encrypt and decrypt subroutines

@@ -220,6 +217,7 @@
	do_col (table, r5,r0,r1,r4, r2,r3);		/* idx=r5 */

// AES (Rijndael) Encryption Subroutine
/* void aes_enc_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */

.global  aes_enc_blk

@@ -230,7 +228,7 @@

aes_enc_blk:
	push    %ebp
	mov     ctx(%esp),%ebp      // pointer to context
	mov     tfm(%esp),%ebp

// CAUTION: the order and the values used in these assigns 
// rely on the register mappings
@@ -295,6 +293,7 @@ aes_enc_blk:
	ret

// AES (Rijndael) Decryption Subroutine
/* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */

.global  aes_dec_blk

@@ -305,7 +304,7 @@ aes_enc_blk:

aes_dec_blk:
	push    %ebp
	mov     ctx(%esp),%ebp       // pointer to context
	mov     tfm(%esp),%ebp

// CAUTION: the order and the values used in these assigns 
// rely on the register mappings
+10 −10
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@
#include <linux/crypto.h>
#include <linux/linkage.h>

asmlinkage void aes_enc_blk(const u8 *src, u8 *dst, void *ctx);
asmlinkage void aes_dec_blk(const u8 *src, u8 *dst, void *ctx);
asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src);

#define AES_MIN_KEY_SIZE	16
#define AES_MAX_KEY_SIZE	32
@@ -378,12 +378,12 @@ static void gen_tabs(void)
	k[8*(i)+11] = ss[3];						\
}

static int
aes_set_key(void *ctx_arg, const u8 *in_key, unsigned int key_len, u32 *flags)
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
		       unsigned int key_len, u32 *flags)
{
	int i;
	u32 ss[8];
	struct aes_ctx *ctx = ctx_arg;
	struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
	const __le32 *key = (const __le32 *)in_key;

	/* encryption schedule */
@@ -464,16 +464,16 @@ aes_set_key(void *ctx_arg, const u8 *in_key, unsigned int key_len, u32 *flags)
	return 0;
}

static inline void aes_encrypt(void *ctx, u8 *dst, const u8 *src)
static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	aes_enc_blk(src, dst, ctx);
	aes_enc_blk(tfm, dst, src);
}
static inline void aes_decrypt(void *ctx, u8 *dst, const u8 *src)

static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	aes_dec_blk(src, dst, ctx);
	aes_dec_blk(tfm, dst, src);
}


static struct crypto_alg aes_alg = {
	.cra_name		=	"aes",
	.cra_driver_name	=	"aes-i586",
+3 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
 * to extract and format the required data.
 */

#include <linux/crypto.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/personality.h>
@@ -69,4 +70,6 @@ void foo(void)

	DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
	DEFINE(VSYSCALL_BASE, __fix_to_virt(FIX_VSYSCALL));

	OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
}
+7 −7
Original line number Diff line number Diff line
@@ -37,10 +37,10 @@ struct s390_aes_ctx {
	int key_len;
};

static int aes_set_key(void *ctx, const u8 *in_key, unsigned int key_len,
		       u32 *flags)
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
		       unsigned int key_len, u32 *flags)
{
	struct s390_aes_ctx *sctx = ctx;
	struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);

	switch (key_len) {
	case 16:
@@ -70,9 +70,9 @@ static int aes_set_key(void *ctx, const u8 *in_key, unsigned int key_len,
	return -EINVAL;
}

static void aes_encrypt(void *ctx, u8 *out, const u8 *in)
static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
	const struct s390_aes_ctx *sctx = ctx;
	const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);

	switch (sctx->key_len) {
	case 16:
@@ -90,9 +90,9 @@ static void aes_encrypt(void *ctx, u8 *out, const u8 *in)
	}
}

static void aes_decrypt(void *ctx, u8 *out, const u8 *in)
static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
	const struct s390_aes_ctx *sctx = ctx;
	const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);

	switch (sctx->key_len) {
	case 16:
+21 −21
Original line number Diff line number Diff line
@@ -44,10 +44,10 @@ struct crypt_s390_des3_192_ctx {
	u8 key[DES3_192_KEY_SIZE];
};

static int des_setkey(void *ctx, const u8 *key, unsigned int keylen,
		      u32 *flags)
static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
		      unsigned int keylen, u32 *flags)
{
	struct crypt_s390_des_ctx *dctx = ctx;
	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
	int ret;

	/* test if key is valid (not a weak key) */
@@ -57,16 +57,16 @@ static int des_setkey(void *ctx, const u8 *key, unsigned int keylen,
	return ret;
}

static void des_encrypt(void *ctx, u8 *out, const u8 *in)
static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
	struct crypt_s390_des_ctx *dctx = ctx;
	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_DEA_ENCRYPT, dctx->key, out, in, DES_BLOCK_SIZE);
}

static void des_decrypt(void *ctx, u8 *out, const u8 *in)
static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
	struct crypt_s390_des_ctx *dctx = ctx;
	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_DEA_DECRYPT, dctx->key, out, in, DES_BLOCK_SIZE);
}
@@ -166,11 +166,11 @@ static struct crypto_alg des_alg = {
 *   Implementers MUST reject keys that exhibit this property.
 *
 */
static int des3_128_setkey(void *ctx, const u8 *key, unsigned int keylen,
			   u32 *flags)
static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
			   unsigned int keylen, u32 *flags)
{
	int i, ret;
	struct crypt_s390_des3_128_ctx *dctx = ctx;
	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
	const u8* temp_key = key;

	if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) {
@@ -186,17 +186,17 @@ static int des3_128_setkey(void *ctx, const u8 *key, unsigned int keylen,
	return 0;
}

static void des3_128_encrypt(void *ctx, u8 *dst, const u8 *src)
static void des3_128_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	struct crypt_s390_des3_128_ctx *dctx = ctx;
	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_TDEA_128_ENCRYPT, dctx->key, dst, (void*)src,
		      DES3_128_BLOCK_SIZE);
}

static void des3_128_decrypt(void *ctx, u8 *dst, const u8 *src)
static void des3_128_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	struct crypt_s390_des3_128_ctx *dctx = ctx;
	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_TDEA_128_DECRYPT, dctx->key, dst, (void*)src,
		      DES3_128_BLOCK_SIZE);
@@ -302,11 +302,11 @@ static struct crypto_alg des3_128_alg = {
 *   property.
 *
 */
static int des3_192_setkey(void *ctx, const u8 *key, unsigned int keylen,
			   u32 *flags)
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
			   unsigned int keylen, u32 *flags)
{
	int i, ret;
	struct crypt_s390_des3_192_ctx *dctx = ctx;
	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
	const u8* temp_key = key;

	if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
@@ -325,17 +325,17 @@ static int des3_192_setkey(void *ctx, const u8 *key, unsigned int keylen,
	return 0;
}

static void des3_192_encrypt(void *ctx, u8 *dst, const u8 *src)
static void des3_192_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	struct crypt_s390_des3_192_ctx *dctx = ctx;
	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_TDEA_192_ENCRYPT, dctx->key, dst, (void*)src,
		      DES3_192_BLOCK_SIZE);
}

static void des3_192_decrypt(void *ctx, u8 *dst, const u8 *src)
static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
	struct crypt_s390_des3_192_ctx *dctx = ctx;
	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);

	crypt_s390_km(KM_TDEA_192_DECRYPT, dctx->key, dst, (void*)src,
		      DES3_192_BLOCK_SIZE);
Loading