Skip to content

Commit

Permalink
crypto: shash - Export/import hash state only
Browse files Browse the repository at this point in the history
This patch replaces the full descriptor export with an export of
the partial hash state.  This allows the use of a consistent export
format across all implementations of a given algorithm.

This is useful because a number of cases require the use of the
partial hash state, e.g., PadLock can use the SHA1 hash state
to get around the fact that it can only hash contiguous data
chunks.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jul 11, 2009
1 parent 7ede5a5 commit 99d27e1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 15 deletions.
25 changes: 14 additions & 11 deletions crypto/shash.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,19 +172,15 @@ int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
}
EXPORT_SYMBOL_GPL(crypto_shash_digest);

int crypto_shash_import(struct shash_desc *desc, const u8 *in)
static int shash_no_export(struct shash_desc *desc, void *out)
{
struct crypto_shash *tfm = desc->tfm;
struct shash_alg *alg = crypto_shash_alg(tfm);

memcpy(shash_desc_ctx(desc), in, crypto_shash_descsize(tfm));

if (alg->reinit)
return alg->reinit(desc);
return -ENOSYS;
}

return 0;
static int shash_no_import(struct shash_desc *desc, const void *in)
{
return -ENOSYS;
}
EXPORT_SYMBOL_GPL(crypto_shash_import);

static int shash_async_setkey(struct crypto_ahash *tfm, const u8 *key,
unsigned int keylen)
Expand Down Expand Up @@ -484,12 +480,19 @@ static int shash_prepare_alg(struct shash_alg *alg)
struct crypto_alg *base = &alg->base;

if (alg->digestsize > PAGE_SIZE / 8 ||
alg->descsize > PAGE_SIZE / 8)
alg->descsize > PAGE_SIZE / 8 ||
alg->statesize > PAGE_SIZE / 8)
return -EINVAL;

base->cra_type = &crypto_shash_type;
base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
base->cra_flags |= CRYPTO_ALG_TYPE_SHASH;

if (!alg->import)
alg->import = shash_no_import;
if (!alg->export)
alg->export = shash_no_export;

return 0;
}

Expand Down
18 changes: 14 additions & 4 deletions include/crypto/hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,21 @@ struct shash_desc {

struct shash_alg {
int (*init)(struct shash_desc *desc);
int (*reinit)(struct shash_desc *desc);
int (*update)(struct shash_desc *desc, const u8 *data,
unsigned int len);
int (*final)(struct shash_desc *desc, u8 *out);
int (*finup)(struct shash_desc *desc, const u8 *data,
unsigned int len, u8 *out);
int (*digest)(struct shash_desc *desc, const u8 *data,
unsigned int len, u8 *out);
int (*export)(struct shash_desc *desc, void *out);
int (*import)(struct shash_desc *desc, const void *in);
int (*setkey)(struct crypto_shash *tfm, const u8 *key,
unsigned int keylen);

unsigned int descsize;
unsigned int digestsize;
unsigned int statesize;

struct crypto_alg base;
};
Expand Down Expand Up @@ -251,6 +253,11 @@ static inline unsigned int crypto_shash_digestsize(struct crypto_shash *tfm)
return crypto_shash_alg(tfm)->digestsize;
}

static inline unsigned int crypto_shash_statesize(struct crypto_shash *tfm)
{
return crypto_shash_alg(tfm)->statesize;
}

static inline u32 crypto_shash_get_flags(struct crypto_shash *tfm)
{
return crypto_tfm_get_flags(crypto_shash_tfm(tfm));
Expand Down Expand Up @@ -281,12 +288,15 @@ int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
unsigned int len, u8 *out);

static inline void crypto_shash_export(struct shash_desc *desc, u8 *out)
static inline int crypto_shash_export(struct shash_desc *desc, void *out)
{
memcpy(out, shash_desc_ctx(desc), crypto_shash_descsize(desc->tfm));
return crypto_shash_alg(desc->tfm)->export(desc, out);
}

int crypto_shash_import(struct shash_desc *desc, const u8 *in);
static inline int crypto_shash_import(struct shash_desc *desc, const void *in)
{
return crypto_shash_alg(desc->tfm)->import(desc, in);
}

static inline int crypto_shash_init(struct shash_desc *desc)
{
Expand Down

0 comments on commit 99d27e1

Please sign in to comment.