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

Commit 6c2bb98b authored by Herbert Xu's avatar Herbert Xu
Browse files

[CRYPTO] all: Pass tfm instead of ctx to algorithms



Up until now algorithms have been happy to get a context pointer since
they know everything that's in the tfm already (e.g., alignment, block
size).

However, once we have parameterised algorithms, such information will
be specific to each tfm.  So the algorithm API needs to be changed to
pass the tfm structure instead of the context pointer.

This patch is basically a text substitution.  The only tricky bit is
the assembly routines that need to get the context pointer offset
through asm-offsets.h.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 43600106
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -36,19 +36,19 @@
.file "aes-i586-asm.S"
.text

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

// offsets to parameters with one register pushed onto stack
#include <asm/asm-offsets.h>

#define in_blk   16  // input byte array address parameter
#define out_blk  12  // output byte array address parameter
#define ctx       8  // AES context structure
#define tlen 1024   // length of each of 4 'xor' arrays (256 32-bit words)

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

#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

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

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

.global  aes_enc_blk

@@ -228,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
@@ -293,7 +293,7 @@ aes_enc_blk:
	ret

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

.global  aes_dec_blk

@@ -304,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
+5 −5
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(void *ctx, u8 *dst, const u8 *src);
asmlinkage void aes_dec_blk(void *ctx, u8 *dst, const u8 *src);
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 */
+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 @@ fail:
	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