Skip to content

Commit

Permalink
[CRYPTO] api: Get rid of flags argument to setkey
Browse files Browse the repository at this point in the history
Now that the tfm is passed directly to setkey instead of the ctx, we no
longer need to pass the &tfm->crt_flags pointer.

This patch also gets rid of a few unnecessary checks on the key length
for ciphers as the cipher layer guarantees that the key length is within
the bounds specified by the algorithm.

Rather than testing dia_setkey every time, this patch does it only once
during crypto_alloc_tfm.  The redundant check from crypto_digest_setkey
is also removed.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Sep 21, 2006
1 parent 25cdbcd commit 560c06a
Show file tree
Hide file tree
Showing 24 changed files with 63 additions and 92 deletions.
3 changes: 2 additions & 1 deletion arch/i386/crypto/aes.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,12 +379,13 @@ static void gen_tabs(void)
}

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

/* encryption schedule */

Expand Down
3 changes: 2 additions & 1 deletion arch/s390/crypto/aes_s390.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ struct s390_aes_ctx {
};

static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
u32 *flags = &tfm->crt_flags;

switch (key_len) {
case 16:
Expand Down
13 changes: 8 additions & 5 deletions arch/s390/crypto/des_s390.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,10 @@ struct crypt_s390_des3_192_ctx {
};

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

/* test if key is valid (not a weak key) */
Expand Down Expand Up @@ -167,11 +168,12 @@ static struct crypto_alg des_alg = {
*
*/
static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
int i, ret;
struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
const u8* temp_key = key;
const u8 *temp_key = key;
u32 *flags = &tfm->crt_flags;

if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
Expand Down Expand Up @@ -303,11 +305,12 @@ static struct crypto_alg des3_128_alg = {
*
*/
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
int i, ret;
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
const u8* temp_key = key;
const u8 *temp_key = key;
u32 *flags = &tfm->crt_flags;

if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
Expand Down
5 changes: 3 additions & 2 deletions arch/x86_64/crypto/aes.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,13 +228,14 @@ static void __init gen_tabs(void)
}

static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
const __le32 *key = (const __le32 *)in_key;
u32 *flags = &tfm->crt_flags;
u32 i, j, t, u, v, w;

if (key_len != 16 && key_len != 24 && key_len != 32) {
if (key_len % 8) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}
Expand Down
5 changes: 3 additions & 2 deletions crypto/aes.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,13 +249,14 @@ gen_tabs (void)
}

static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
const __le32 *key = (const __le32 *)in_key;
u32 *flags = &tfm->crt_flags;
u32 i, t, u, v, w;

if (key_len != 16 && key_len != 24 && key_len != 32) {
if (key_len % 8) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}
Expand Down
3 changes: 2 additions & 1 deletion crypto/anubis.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,10 +461,11 @@ static const u32 rc[] = {
};

static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
const __be32 *key = (const __be32 *)in_key;
u32 *flags = &tfm->crt_flags;
int N, R, i, r;
u32 kappa[ANUBIS_MAX_N];
u32 inter[ANUBIS_MAX_N];
Expand Down
2 changes: 1 addition & 1 deletion crypto/arc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ struct arc4_ctx {
};

static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
int i, j = 0, k = 0;
Expand Down
3 changes: 1 addition & 2 deletions crypto/blowfish.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,8 +399,7 @@ static void bf_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
/*
* Calculates the blowfish S and P boxes for encryption and decryption.
*/
static int bf_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
static int bf_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
{
struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
u32 *P = ctx->p;
Expand Down
8 changes: 1 addition & 7 deletions crypto/cast5.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,20 +769,14 @@ static void key_schedule(u32 * x, u32 * z, u32 * k)
}


static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned key_len, u32 *flags)
static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned key_len)
{
struct cast5_ctx *c = crypto_tfm_ctx(tfm);
int i;
u32 x[4];
u32 z[4];
u32 k[16];
__be32 p_key[4];

if (key_len < 5 || key_len > 16) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}

c->rr = key_len <= 10 ? 1 : 0;

Expand Down
5 changes: 3 additions & 2 deletions crypto/cast6.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,14 +382,15 @@ static inline void W(u32 *key, unsigned int i) {
}

static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key,
unsigned key_len, u32 *flags)
unsigned key_len)
{
int i;
u32 key[8];
__be32 p_key[8]; /* padded key */
struct cast6_ctx *c = crypto_tfm_ctx(tfm);
u32 *flags = &tfm->crt_flags;

if (key_len < 16 || key_len > 32 || key_len % 4 != 0) {
if (key_len % 4 != 0) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}
Expand Down
4 changes: 2 additions & 2 deletions crypto/cipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,12 +264,12 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
{
struct cipher_alg *cia = &tfm->__crt_alg->cra_cipher;

tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
if (keylen < cia->cia_min_keysize || keylen > cia->cia_max_keysize) {
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
} else
return cia->cia_setkey(tfm, key, keylen,
&tfm->crt_flags);
return cia->cia_setkey(tfm, key, keylen);
}

static int ecb_encrypt(struct crypto_tfm *tfm,
Expand Down
5 changes: 2 additions & 3 deletions crypto/crc32c.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,12 @@ static void chksum_init(struct crypto_tfm *tfm)
* the seed.
*/
static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);

if (keylen != sizeof(mctx->crc)) {
if (flags)
*flags = CRYPTO_TFM_RES_BAD_KEY_LEN;
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}
mctx->key = le32_to_cpu(*(__le32 *)key);
Expand Down
2 changes: 1 addition & 1 deletion crypto/crypto_null.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ static void null_final(struct crypto_tfm *tfm, u8 *out)
{ }

static int null_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{ return 0; }

static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
Expand Down
6 changes: 4 additions & 2 deletions crypto/des.c
Original file line number Diff line number Diff line change
Expand Up @@ -784,9 +784,10 @@ static void dkey(u32 *pe, const u8 *k)
}

static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
struct des_ctx *dctx = crypto_tfm_ctx(tfm);
u32 *flags = &tfm->crt_flags;
u32 tmp[DES_EXPKEY_WORDS];
int ret;

Expand Down Expand Up @@ -864,11 +865,12 @@ static void des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
*
*/
static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
const u32 *K = (const u32 *)key;
struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
u32 *expkey = dctx->expkey;
u32 *flags = &tfm->crt_flags;

if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
!((K[2] ^ K[4]) | (K[3] ^ K[5]))))
Expand Down
15 changes: 10 additions & 5 deletions crypto/digest.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,16 @@ static void final(struct crypto_tfm *tfm, u8 *out)
tfm->__crt_alg->cra_digest.dia_final(tfm, out);
}

static int nosetkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
{
tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
return -ENOSYS;
}

static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
{
u32 flags;
if (tfm->__crt_alg->cra_digest.dia_setkey == NULL)
return -ENOSYS;
return tfm->__crt_alg->cra_digest.dia_setkey(tfm, key, keylen, &flags);
tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
return tfm->__crt_alg->cra_digest.dia_setkey(tfm, key, keylen);
}

static void digest(struct crypto_tfm *tfm,
Expand All @@ -100,12 +104,13 @@ int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags)
int crypto_init_digest_ops(struct crypto_tfm *tfm)
{
struct digest_tfm *ops = &tfm->crt_digest;
struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;

ops->dit_init = init;
ops->dit_update = update;
ops->dit_final = final;
ops->dit_digest = digest;
ops->dit_setkey = setkey;
ops->dit_setkey = dalg->dia_setkey ? setkey : nosetkey;

return crypto_alloc_hmac_block(tfm);
}
Expand Down
8 changes: 1 addition & 7 deletions crypto/khazad.c
Original file line number Diff line number Diff line change
Expand Up @@ -755,19 +755,13 @@ static const u64 c[KHAZAD_ROUNDS + 1] = {
};

static int khazad_setkey(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len, u32 *flags)
unsigned int key_len)
{
struct khazad_ctx *ctx = crypto_tfm_ctx(tfm);
const __be32 *key = (const __be32 *)in_key;
int r;
const u64 *S = T7;
u64 K2, K1;

if (key_len != 16)
{
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}

/* key is supposed to be 32-bit aligned */
K2 = ((u64)be32_to_cpu(key[0]) << 32) | be32_to_cpu(key[1]);
Expand Down
5 changes: 2 additions & 3 deletions crypto/michael_mic.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,13 @@ static void michael_final(struct crypto_tfm *tfm, u8 *out)


static int michael_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
struct michael_mic_ctx *mctx = crypto_tfm_ctx(tfm);
const __le32 *data = (const __le32 *)key;

if (keylen != 8) {
if (flags)
*flags = CRYPTO_TFM_RES_BAD_KEY_LEN;
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}

Expand Down
19 changes: 3 additions & 16 deletions crypto/serpent.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,21 +216,14 @@ struct serpent_ctx {


static int serpent_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
u32 *k = ctx->expkey;
u8 *k8 = (u8 *)k;
u32 r0,r1,r2,r3,r4;
int i;

if ((keylen < SERPENT_MIN_KEY_SIZE)
|| (keylen > SERPENT_MAX_KEY_SIZE))
{
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}

/* Copy key, add padding */

for (i = 0; i < keylen; ++i)
Expand Down Expand Up @@ -497,21 +490,15 @@ static struct crypto_alg serpent_alg = {
};

static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen, u32 *flags)
unsigned int keylen)
{
u8 rev_key[SERPENT_MAX_KEY_SIZE];
int i;

if ((keylen < SERPENT_MIN_KEY_SIZE)
|| (keylen > SERPENT_MAX_KEY_SIZE)) {
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL;
}

for (i = 0; i < keylen; ++i)
rev_key[keylen - i - 1] = key[i];

return serpent_setkey(tfm, rev_key, keylen, flags);
return serpent_setkey(tfm, rev_key, keylen);
}

static void tnepres_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
Expand Down
5 changes: 1 addition & 4 deletions crypto/tcrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,7 @@ static void test_hash(char *algo, struct hash_testvec *template,
sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);

crypto_digest_init(tfm);
if (tfm->crt_u.digest.dit_setkey) {
crypto_digest_setkey(tfm, hash_tv[i].key,
hash_tv[i].ksize);
}
crypto_digest_setkey(tfm, hash_tv[i].key, hash_tv[i].ksize);
crypto_digest_update(tfm, sg, 1);
crypto_digest_final(tfm, result);

Expand Down
Loading

0 comments on commit 560c06a

Please sign in to comment.