crypto: wp512 - Switch to shash

This patch changes wp512, wp384 and wp256 to the new shash interface.

Signed-off-by: Adrian-Ken Rueegsegger <ken@codelabs.ch>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Adrian-Ken Rueegsegger 2008-12-07 19:34:37 +08:00 committed by Herbert Xu
parent f63fbd3d50
commit 4946510baa
2 changed files with 66 additions and 57 deletions

View File

@ -394,7 +394,7 @@ config CRYPTO_TGR192
config CRYPTO_WP512 config CRYPTO_WP512
tristate "Whirlpool digest algorithms" tristate "Whirlpool digest algorithms"
select CRYPTO_ALGAPI select CRYPTO_HASH
help help
Whirlpool hash algorithm 512, 384 and 256-bit hashes Whirlpool hash algorithm 512, 384 and 256-bit hashes

View File

@ -19,11 +19,11 @@
* (at your option) any later version. * (at your option) any later version.
* *
*/ */
#include <crypto/internal/hash.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/crypto.h>
#include <linux/types.h> #include <linux/types.h>
#define WP512_DIGEST_SIZE 64 #define WP512_DIGEST_SIZE 64
@ -980,8 +980,8 @@ static void wp512_process_buffer(struct wp512_ctx *wctx) {
} }
static void wp512_init(struct crypto_tfm *tfm) { static int wp512_init(struct shash_desc *desc) {
struct wp512_ctx *wctx = crypto_tfm_ctx(tfm); struct wp512_ctx *wctx = shash_desc_ctx(desc);
int i; int i;
memset(wctx->bitLength, 0, 32); memset(wctx->bitLength, 0, 32);
@ -990,12 +990,14 @@ static void wp512_init(struct crypto_tfm *tfm) {
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
wctx->hash[i] = 0L; wctx->hash[i] = 0L;
} }
return 0;
} }
static void wp512_update(struct crypto_tfm *tfm, const u8 *source, static int wp512_update(struct shash_desc *desc, const u8 *source,
unsigned int len) unsigned int len)
{ {
struct wp512_ctx *wctx = crypto_tfm_ctx(tfm); struct wp512_ctx *wctx = shash_desc_ctx(desc);
int sourcePos = 0; int sourcePos = 0;
unsigned int bits_len = len * 8; // convert to number of bits unsigned int bits_len = len * 8; // convert to number of bits
int sourceGap = (8 - ((int)bits_len & 7)) & 7; int sourceGap = (8 - ((int)bits_len & 7)) & 7;
@ -1051,11 +1053,12 @@ static void wp512_update(struct crypto_tfm *tfm, const u8 *source,
wctx->bufferBits = bufferBits; wctx->bufferBits = bufferBits;
wctx->bufferPos = bufferPos; wctx->bufferPos = bufferPos;
return 0;
} }
static void wp512_final(struct crypto_tfm *tfm, u8 *out) static int wp512_final(struct shash_desc *desc, u8 *out)
{ {
struct wp512_ctx *wctx = crypto_tfm_ctx(tfm); struct wp512_ctx *wctx = shash_desc_ctx(desc);
int i; int i;
u8 *buffer = wctx->buffer; u8 *buffer = wctx->buffer;
u8 *bitLength = wctx->bitLength; u8 *bitLength = wctx->bitLength;
@ -1084,89 +1087,95 @@ static void wp512_final(struct crypto_tfm *tfm, u8 *out)
digest[i] = cpu_to_be64(wctx->hash[i]); digest[i] = cpu_to_be64(wctx->hash[i]);
wctx->bufferBits = bufferBits; wctx->bufferBits = bufferBits;
wctx->bufferPos = bufferPos; wctx->bufferPos = bufferPos;
return 0;
} }
static void wp384_final(struct crypto_tfm *tfm, u8 *out) static int wp384_final(struct shash_desc *desc, u8 *out)
{ {
u8 D[64]; u8 D[64];
wp512_final(tfm, D); wp512_final(desc, D);
memcpy (out, D, WP384_DIGEST_SIZE); memcpy (out, D, WP384_DIGEST_SIZE);
memset (D, 0, WP512_DIGEST_SIZE); memset (D, 0, WP512_DIGEST_SIZE);
return 0;
} }
static void wp256_final(struct crypto_tfm *tfm, u8 *out) static int wp256_final(struct shash_desc *desc, u8 *out)
{ {
u8 D[64]; u8 D[64];
wp512_final(tfm, D); wp512_final(desc, D);
memcpy (out, D, WP256_DIGEST_SIZE); memcpy (out, D, WP256_DIGEST_SIZE);
memset (D, 0, WP512_DIGEST_SIZE); memset (D, 0, WP512_DIGEST_SIZE);
return 0;
} }
static struct crypto_alg wp512 = { static struct shash_alg wp512 = {
.digestsize = WP512_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.final = wp512_final,
.descsize = sizeof(struct wp512_ctx),
.base = {
.cra_name = "wp512", .cra_name = "wp512",
.cra_flags = CRYPTO_ALG_TYPE_DIGEST, .cra_flags = CRYPTO_ALG_TYPE_SHASH,
.cra_blocksize = WP512_BLOCK_SIZE, .cra_blocksize = WP512_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct wp512_ctx),
.cra_module = THIS_MODULE, .cra_module = THIS_MODULE,
.cra_list = LIST_HEAD_INIT(wp512.cra_list), }
.cra_u = { .digest = {
.dia_digestsize = WP512_DIGEST_SIZE,
.dia_init = wp512_init,
.dia_update = wp512_update,
.dia_final = wp512_final } }
}; };
static struct crypto_alg wp384 = { static struct shash_alg wp384 = {
.digestsize = WP384_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.final = wp384_final,
.descsize = sizeof(struct wp512_ctx),
.base = {
.cra_name = "wp384", .cra_name = "wp384",
.cra_flags = CRYPTO_ALG_TYPE_DIGEST, .cra_flags = CRYPTO_ALG_TYPE_SHASH,
.cra_blocksize = WP512_BLOCK_SIZE, .cra_blocksize = WP512_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct wp512_ctx),
.cra_module = THIS_MODULE, .cra_module = THIS_MODULE,
.cra_list = LIST_HEAD_INIT(wp384.cra_list), }
.cra_u = { .digest = {
.dia_digestsize = WP384_DIGEST_SIZE,
.dia_init = wp512_init,
.dia_update = wp512_update,
.dia_final = wp384_final } }
}; };
static struct crypto_alg wp256 = { static struct shash_alg wp256 = {
.digestsize = WP256_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.final = wp256_final,
.descsize = sizeof(struct wp512_ctx),
.base = {
.cra_name = "wp256", .cra_name = "wp256",
.cra_flags = CRYPTO_ALG_TYPE_DIGEST, .cra_flags = CRYPTO_ALG_TYPE_SHASH,
.cra_blocksize = WP512_BLOCK_SIZE, .cra_blocksize = WP512_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct wp512_ctx),
.cra_module = THIS_MODULE, .cra_module = THIS_MODULE,
.cra_list = LIST_HEAD_INIT(wp256.cra_list), }
.cra_u = { .digest = {
.dia_digestsize = WP256_DIGEST_SIZE,
.dia_init = wp512_init,
.dia_update = wp512_update,
.dia_final = wp256_final } }
}; };
static int __init wp512_mod_init(void) static int __init wp512_mod_init(void)
{ {
int ret = 0; int ret = 0;
ret = crypto_register_alg(&wp512); ret = crypto_register_shash(&wp512);
if (ret < 0) if (ret < 0)
goto out; goto out;
ret = crypto_register_alg(&wp384); ret = crypto_register_shash(&wp384);
if (ret < 0) if (ret < 0)
{ {
crypto_unregister_alg(&wp512); crypto_unregister_shash(&wp512);
goto out; goto out;
} }
ret = crypto_register_alg(&wp256); ret = crypto_register_shash(&wp256);
if (ret < 0) if (ret < 0)
{ {
crypto_unregister_alg(&wp512); crypto_unregister_shash(&wp512);
crypto_unregister_alg(&wp384); crypto_unregister_shash(&wp384);
} }
out: out:
return ret; return ret;
@ -1174,9 +1183,9 @@ out:
static void __exit wp512_mod_fini(void) static void __exit wp512_mod_fini(void)
{ {
crypto_unregister_alg(&wp512); crypto_unregister_shash(&wp512);
crypto_unregister_alg(&wp384); crypto_unregister_shash(&wp384);
crypto_unregister_alg(&wp256); crypto_unregister_shash(&wp256);
} }
MODULE_ALIAS("wp384"); MODULE_ALIAS("wp384");