[CRYPTO] api: Get rid of flags argument to setkey
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 <herbert@gondor.apana.org.au>
This commit is contained in:
parent
25cdbcd9e5
commit
560c06ae1a
24 changed files with 63 additions and 92 deletions
|
@ -379,12 +379,13 @@ static void gen_tabs(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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;
|
int i;
|
||||||
u32 ss[8];
|
u32 ss[8];
|
||||||
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
|
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
|
|
||||||
/* encryption schedule */
|
/* encryption schedule */
|
||||||
|
|
||||||
|
|
|
@ -38,9 +38,10 @@ struct s390_aes_ctx {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
|
|
||||||
switch (key_len) {
|
switch (key_len) {
|
||||||
case 16:
|
case 16:
|
||||||
|
|
|
@ -45,9 +45,10 @@ struct crypt_s390_des3_192_ctx {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
|
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);
|
struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* test if key is valid (not a weak key) */
|
/* test if key is valid (not a weak key) */
|
||||||
|
@ -167,11 +168,12 @@ static struct crypto_alg des_alg = {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
|
static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen, u32 *flags)
|
unsigned int keylen)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
|
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))) {
|
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) {
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
|
||||||
|
@ -303,11 +305,12 @@ static struct crypto_alg des3_128_alg = {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
|
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen, u32 *flags)
|
unsigned int keylen)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
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) &&
|
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
|
||||||
memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
|
memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
|
||||||
|
|
|
@ -228,13 +228,14 @@ static void __init gen_tabs(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
u32 i, j, t, u, v, w;
|
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;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,13 +249,14 @@ gen_tabs (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct aes_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
u32 i, t, u, v, w;
|
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;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -461,10 +461,11 @@ static const u32 rc[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __be32 *key = (const __be32 *)in_key;
|
const __be32 *key = (const __be32 *)in_key;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
int N, R, i, r;
|
int N, R, i, r;
|
||||||
u32 kappa[ANUBIS_MAX_N];
|
u32 kappa[ANUBIS_MAX_N];
|
||||||
u32 inter[ANUBIS_MAX_N];
|
u32 inter[ANUBIS_MAX_N];
|
||||||
|
|
|
@ -25,7 +25,7 @@ struct arc4_ctx {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
int i, j = 0, k = 0;
|
int i, j = 0, k = 0;
|
||||||
|
|
|
@ -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.
|
* Calculates the blowfish S and P boxes for encryption and decryption.
|
||||||
*/
|
*/
|
||||||
static int bf_setkey(struct crypto_tfm *tfm, const u8 *key,
|
static int bf_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
|
||||||
unsigned int keylen, u32 *flags)
|
|
||||||
{
|
{
|
||||||
struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
|
struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
u32 *P = ctx->p;
|
u32 *P = ctx->p;
|
||||||
|
|
|
@ -769,8 +769,7 @@ static void key_schedule(u32 * x, u32 * z, u32 * k)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key,
|
static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned key_len)
|
||||||
unsigned key_len, u32 *flags)
|
|
||||||
{
|
{
|
||||||
struct cast5_ctx *c = crypto_tfm_ctx(tfm);
|
struct cast5_ctx *c = crypto_tfm_ctx(tfm);
|
||||||
int i;
|
int i;
|
||||||
|
@ -779,11 +778,6 @@ static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
u32 k[16];
|
u32 k[16];
|
||||||
__be32 p_key[4];
|
__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;
|
c->rr = key_len <= 10 ? 1 : 0;
|
||||||
|
|
||||||
memset(p_key, 0, 16);
|
memset(p_key, 0, 16);
|
||||||
|
|
|
@ -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,
|
static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
||||||
unsigned key_len, u32 *flags)
|
unsigned key_len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u32 key[8];
|
u32 key[8];
|
||||||
__be32 p_key[8]; /* padded key */
|
__be32 p_key[8]; /* padded key */
|
||||||
struct cast6_ctx *c = crypto_tfm_ctx(tfm);
|
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;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
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) {
|
if (keylen < cia->cia_min_keysize || keylen > cia->cia_max_keysize) {
|
||||||
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else
|
} else
|
||||||
return cia->cia_setkey(tfm, key, keylen,
|
return cia->cia_setkey(tfm, key, keylen);
|
||||||
&tfm->crt_flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ecb_encrypt(struct crypto_tfm *tfm,
|
static int ecb_encrypt(struct crypto_tfm *tfm,
|
||||||
|
|
|
@ -44,13 +44,12 @@ static void chksum_init(struct crypto_tfm *tfm)
|
||||||
* the seed.
|
* the seed.
|
||||||
*/
|
*/
|
||||||
static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key,
|
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);
|
struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
|
||||||
|
|
||||||
if (keylen != sizeof(mctx->crc)) {
|
if (keylen != sizeof(mctx->crc)) {
|
||||||
if (flags)
|
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
*flags = CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
mctx->key = le32_to_cpu(*(__le32 *)key);
|
mctx->key = le32_to_cpu(*(__le32 *)key);
|
||||||
|
|
|
@ -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,
|
static int null_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen, u32 *flags)
|
unsigned int keylen)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
|
|
||||||
static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
||||||
|
|
|
@ -784,9 +784,10 @@ static void dkey(u32 *pe, const u8 *k)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
|
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);
|
struct des_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
u32 tmp[DES_EXPKEY_WORDS];
|
u32 tmp[DES_EXPKEY_WORDS];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -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,
|
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;
|
const u32 *K = (const u32 *)key;
|
||||||
struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
|
struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
u32 *expkey = dctx->expkey;
|
u32 *expkey = dctx->expkey;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
|
|
||||||
if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
|
if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
|
||||||
!((K[2] ^ K[4]) | (K[3] ^ K[5]))))
|
!((K[2] ^ K[4]) | (K[3] ^ K[5]))))
|
||||||
|
|
|
@ -76,12 +76,16 @@ static void final(struct crypto_tfm *tfm, u8 *out)
|
||||||
tfm->__crt_alg->cra_digest.dia_final(tfm, 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)
|
static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
|
||||||
{
|
{
|
||||||
u32 flags;
|
tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
|
||||||
if (tfm->__crt_alg->cra_digest.dia_setkey == NULL)
|
return tfm->__crt_alg->cra_digest.dia_setkey(tfm, key, keylen);
|
||||||
return -ENOSYS;
|
|
||||||
return tfm->__crt_alg->cra_digest.dia_setkey(tfm, key, keylen, &flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void digest(struct crypto_tfm *tfm,
|
static void digest(struct crypto_tfm *tfm,
|
||||||
|
@ -100,12 +104,13 @@ int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags)
|
||||||
int crypto_init_digest_ops(struct crypto_tfm *tfm)
|
int crypto_init_digest_ops(struct crypto_tfm *tfm)
|
||||||
{
|
{
|
||||||
struct digest_tfm *ops = &tfm->crt_digest;
|
struct digest_tfm *ops = &tfm->crt_digest;
|
||||||
|
struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;
|
||||||
|
|
||||||
ops->dit_init = init;
|
ops->dit_init = init;
|
||||||
ops->dit_update = update;
|
ops->dit_update = update;
|
||||||
ops->dit_final = final;
|
ops->dit_final = final;
|
||||||
ops->dit_digest = digest;
|
ops->dit_digest = digest;
|
||||||
ops->dit_setkey = setkey;
|
ops->dit_setkey = dalg->dia_setkey ? setkey : nosetkey;
|
||||||
|
|
||||||
return crypto_alloc_hmac_block(tfm);
|
return crypto_alloc_hmac_block(tfm);
|
||||||
}
|
}
|
||||||
|
|
|
@ -755,7 +755,7 @@ static const u64 c[KHAZAD_ROUNDS + 1] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int khazad_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
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);
|
struct khazad_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __be32 *key = (const __be32 *)in_key;
|
const __be32 *key = (const __be32 *)in_key;
|
||||||
|
@ -763,12 +763,6 @@ static int khazad_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
||||||
const u64 *S = T7;
|
const u64 *S = T7;
|
||||||
u64 K2, K1;
|
u64 K2, K1;
|
||||||
|
|
||||||
if (key_len != 16)
|
|
||||||
{
|
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* key is supposed to be 32-bit aligned */
|
/* key is supposed to be 32-bit aligned */
|
||||||
K2 = ((u64)be32_to_cpu(key[0]) << 32) | be32_to_cpu(key[1]);
|
K2 = ((u64)be32_to_cpu(key[0]) << 32) | be32_to_cpu(key[1]);
|
||||||
K1 = ((u64)be32_to_cpu(key[2]) << 32) | be32_to_cpu(key[3]);
|
K1 = ((u64)be32_to_cpu(key[2]) << 32) | be32_to_cpu(key[3]);
|
||||||
|
|
|
@ -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,
|
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);
|
struct michael_mic_ctx *mctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *data = (const __le32 *)key;
|
const __le32 *data = (const __le32 *)key;
|
||||||
|
|
||||||
if (keylen != 8) {
|
if (keylen != 8) {
|
||||||
if (flags)
|
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
*flags = CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ struct serpent_ctx {
|
||||||
|
|
||||||
|
|
||||||
static int serpent_setkey(struct crypto_tfm *tfm, const u8 *key,
|
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);
|
struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
u32 *k = ctx->expkey;
|
u32 *k = ctx->expkey;
|
||||||
|
@ -224,13 +224,6 @@ static int serpent_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
u32 r0,r1,r2,r3,r4;
|
u32 r0,r1,r2,r3,r4;
|
||||||
int i;
|
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 */
|
/* Copy key, add padding */
|
||||||
|
|
||||||
for (i = 0; i < keylen; ++i)
|
for (i = 0; i < keylen; ++i)
|
||||||
|
@ -497,21 +490,15 @@ static struct crypto_alg serpent_alg = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
|
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];
|
u8 rev_key[SERPENT_MAX_KEY_SIZE];
|
||||||
int i;
|
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)
|
for (i = 0; i < keylen; ++i)
|
||||||
rev_key[keylen - i - 1] = key[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)
|
static void tnepres_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
||||||
|
|
|
@ -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);
|
sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
|
||||||
|
|
||||||
crypto_digest_init(tfm);
|
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_update(tfm, sg, 1);
|
||||||
crypto_digest_final(tfm, result);
|
crypto_digest_final(tfm, result);
|
||||||
|
|
||||||
|
|
16
crypto/tea.c
16
crypto/tea.c
|
@ -46,17 +46,11 @@ struct xtea_ctx {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tea_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
static int tea_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
||||||
unsigned int key_len, u32 *flags)
|
unsigned int key_len)
|
||||||
{
|
{
|
||||||
struct tea_ctx *ctx = crypto_tfm_ctx(tfm);
|
struct tea_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
|
||||||
if (key_len != 16)
|
|
||||||
{
|
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->KEY[0] = le32_to_cpu(key[0]);
|
ctx->KEY[0] = le32_to_cpu(key[0]);
|
||||||
ctx->KEY[1] = le32_to_cpu(key[1]);
|
ctx->KEY[1] = le32_to_cpu(key[1]);
|
||||||
ctx->KEY[2] = le32_to_cpu(key[2]);
|
ctx->KEY[2] = le32_to_cpu(key[2]);
|
||||||
|
@ -125,17 +119,11 @@ static void tea_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xtea_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
static int xtea_setkey(struct crypto_tfm *tfm, const u8 *in_key,
|
||||||
unsigned int key_len, u32 *flags)
|
unsigned int key_len)
|
||||||
{
|
{
|
||||||
struct xtea_ctx *ctx = crypto_tfm_ctx(tfm);
|
struct xtea_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
|
||||||
if (key_len != 16)
|
|
||||||
{
|
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->KEY[0] = le32_to_cpu(key[0]);
|
ctx->KEY[0] = le32_to_cpu(key[0]);
|
||||||
ctx->KEY[1] = le32_to_cpu(key[1]);
|
ctx->KEY[1] = le32_to_cpu(key[1]);
|
||||||
ctx->KEY[2] = le32_to_cpu(key[2]);
|
ctx->KEY[2] = le32_to_cpu(key[2]);
|
||||||
|
|
|
@ -580,11 +580,11 @@ static const u8 calc_sb_tbl[512] = {
|
||||||
ctx->a[(j) + 1] = rol32(y, 9)
|
ctx->a[(j) + 1] = rol32(y, 9)
|
||||||
|
|
||||||
/* Perform the key setup. */
|
/* Perform the key setup. */
|
||||||
int twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
|
int twofish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
|
||||||
unsigned int key_len, u32 *flags)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
struct twofish_ctx *ctx = crypto_tfm_ctx(tfm);
|
struct twofish_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
|
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
|
|
||||||
|
@ -600,7 +600,7 @@ int twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
u8 tmp;
|
u8 tmp;
|
||||||
|
|
||||||
/* Check key length. */
|
/* Check key length. */
|
||||||
if (key_len != 16 && key_len != 24 && key_len != 32)
|
if (key_len % 8)
|
||||||
{
|
{
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL; /* unsupported key length */
|
return -EINVAL; /* unsupported key length */
|
||||||
|
|
|
@ -308,15 +308,16 @@ static inline struct aes_ctx *aes_ctx(struct crypto_tfm *tfm)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
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 = aes_ctx(tfm);
|
struct aes_ctx *ctx = aes_ctx(tfm);
|
||||||
const __le32 *key = (const __le32 *)in_key;
|
const __le32 *key = (const __le32 *)in_key;
|
||||||
|
u32 *flags = &tfm->crt_flags;
|
||||||
uint32_t i, t, u, v, w;
|
uint32_t i, t, u, v, w;
|
||||||
uint32_t P[AES_EXTENDED_KEY_SIZE];
|
uint32_t P[AES_EXTENDED_KEY_SIZE];
|
||||||
uint32_t rounds;
|
uint32_t rounds;
|
||||||
|
|
||||||
if (key_len != 16 && key_len != 24 && key_len != 32) {
|
if (key_len % 8) {
|
||||||
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ struct twofish_ctx {
|
||||||
u32 s[4][256], w[8], k[32];
|
u32 s[4][256], w[8], k[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
int twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
|
int twofish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len);
|
||||||
unsigned int key_len, u32 *flags);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -106,7 +106,7 @@ struct cipher_alg {
|
||||||
unsigned int cia_min_keysize;
|
unsigned int cia_min_keysize;
|
||||||
unsigned int cia_max_keysize;
|
unsigned int cia_max_keysize;
|
||||||
int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key,
|
int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen, u32 *flags);
|
unsigned int keylen);
|
||||||
void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
|
void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
|
||||||
void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
|
void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ struct digest_alg {
|
||||||
unsigned int len);
|
unsigned int len);
|
||||||
void (*dia_final)(struct crypto_tfm *tfm, u8 *out);
|
void (*dia_final)(struct crypto_tfm *tfm, u8 *out);
|
||||||
int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key,
|
int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen, u32 *flags);
|
unsigned int keylen);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct compress_alg {
|
struct compress_alg {
|
||||||
|
@ -397,8 +397,6 @@ static inline int crypto_digest_setkey(struct crypto_tfm *tfm,
|
||||||
const u8 *key, unsigned int keylen)
|
const u8 *key, unsigned int keylen)
|
||||||
{
|
{
|
||||||
BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
|
BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
|
||||||
if (tfm->crt_digest.dit_setkey == NULL)
|
|
||||||
return -ENOSYS;
|
|
||||||
return tfm->crt_digest.dit_setkey(tfm, key, keylen);
|
return tfm->crt_digest.dit_setkey(tfm, key, keylen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue