Commit 65526f63 authored by Iuliana Prodan's avatar Iuliana Prodan Committed by Herbert Xu

crypto: gcm - helper functions for assoclen/authsize check

Added inline helper functions to check authsize and assoclen for
gcm, rfc4106 and rfc4543.
These are used in the generic implementation of gcm, rfc4106 and
rfc4543.
Signed-off-by: default avatarIuliana Prodan <iuliana.prodan@nxp.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 1bfaac7c
...@@ -152,20 +152,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, ...@@ -152,20 +152,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
static int crypto_gcm_setauthsize(struct crypto_aead *tfm, static int crypto_gcm_setauthsize(struct crypto_aead *tfm,
unsigned int authsize) unsigned int authsize)
{ {
switch (authsize) { return crypto_gcm_check_authsize(authsize);
case 4:
case 8:
case 12:
case 13:
case 14:
case 15:
case 16:
break;
default:
return -EINVAL;
}
return 0;
} }
static void crypto_gcm_init_common(struct aead_request *req) static void crypto_gcm_init_common(struct aead_request *req)
...@@ -762,15 +749,11 @@ static int crypto_rfc4106_setauthsize(struct crypto_aead *parent, ...@@ -762,15 +749,11 @@ static int crypto_rfc4106_setauthsize(struct crypto_aead *parent,
unsigned int authsize) unsigned int authsize)
{ {
struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent); struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent);
int err;
switch (authsize) { err = crypto_rfc4106_check_authsize(authsize);
case 8: if (err)
case 12: return err;
case 16:
break;
default:
return -EINVAL;
}
return crypto_aead_setauthsize(ctx->child, authsize); return crypto_aead_setauthsize(ctx->child, authsize);
} }
...@@ -818,8 +801,11 @@ static struct aead_request *crypto_rfc4106_crypt(struct aead_request *req) ...@@ -818,8 +801,11 @@ static struct aead_request *crypto_rfc4106_crypt(struct aead_request *req)
static int crypto_rfc4106_encrypt(struct aead_request *req) static int crypto_rfc4106_encrypt(struct aead_request *req)
{ {
if (req->assoclen != 16 && req->assoclen != 20) int err;
return -EINVAL;
err = crypto_ipsec_check_assoclen(req->assoclen);
if (err)
return err;
req = crypto_rfc4106_crypt(req); req = crypto_rfc4106_crypt(req);
...@@ -828,8 +814,11 @@ static int crypto_rfc4106_encrypt(struct aead_request *req) ...@@ -828,8 +814,11 @@ static int crypto_rfc4106_encrypt(struct aead_request *req)
static int crypto_rfc4106_decrypt(struct aead_request *req) static int crypto_rfc4106_decrypt(struct aead_request *req)
{ {
if (req->assoclen != 16 && req->assoclen != 20) int err;
return -EINVAL;
err = crypto_ipsec_check_assoclen(req->assoclen);
if (err)
return err;
req = crypto_rfc4106_crypt(req); req = crypto_rfc4106_crypt(req);
......
#ifndef _CRYPTO_GCM_H #ifndef _CRYPTO_GCM_H
#define _CRYPTO_GCM_H #define _CRYPTO_GCM_H
#include <linux/errno.h>
#define GCM_AES_IV_SIZE 12 #define GCM_AES_IV_SIZE 12
#define GCM_RFC4106_IV_SIZE 8 #define GCM_RFC4106_IV_SIZE 8
#define GCM_RFC4543_IV_SIZE 8 #define GCM_RFC4543_IV_SIZE 8
/*
* validate authentication tag for GCM
*/
static inline int crypto_gcm_check_authsize(unsigned int authsize)
{
switch (authsize) {
case 4:
case 8:
case 12:
case 13:
case 14:
case 15:
case 16:
break;
default:
return -EINVAL;
}
return 0;
}
/*
* validate authentication tag for RFC4106
*/
static inline int crypto_rfc4106_check_authsize(unsigned int authsize)
{
switch (authsize) {
case 8:
case 12:
case 16:
break;
default:
return -EINVAL;
}
return 0;
}
/*
* validate assoclen for RFC4106/RFC4543
*/
static inline int crypto_ipsec_check_assoclen(unsigned int assoclen)
{
switch (assoclen) {
case 16:
case 20:
break;
default:
return -EINVAL;
}
return 0;
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment