aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorAaron Grothe <ajgrothe@yahoo.com>2004-09-28 00:03:47 -0700
committerDavid S. Miller <davem@nuts.davemloft.net>2004-09-28 00:03:47 -0700
commit5eca4f1870657a5eec4cef8dd821d68f3dcb31a4 (patch)
treebc54f9c919f329fb808ab0f2ee088a909ce251fa /crypto
parent5e78674021b427322a82c47c3826ea18b2480854 (diff)
downloadhistory-5eca4f1870657a5eec4cef8dd821d68f3dcb31a4.tar.gz
[CRYPTO]: Whirlpool algorithm updates.
Signed-off-by: Aaron Grothe <ajgrothe@yahoo.com> Signed-off-by: James Morris <jmorris@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/Kconfig11
-rw-r--r--crypto/Makefile2
-rw-r--r--crypto/tcrypt.c16
-rw-r--r--crypto/tcrypt.h153
-rw-r--r--crypto/wp512.c (renamed from crypto/whirlpool.c)157
5 files changed, 286 insertions, 53 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig
index f048ed35410fce..9916a1830e5d2d 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -67,16 +67,13 @@ config CRYPTO_SHA512
This code also includes SHA-384, a 384 bit hash with 192 bits
of security against collision attacks.
-config CRYPTO_WHIRLPOOL
- tristate "Whirlpool digest algorithm"
+config CRYPTO_WP512
+ tristate "Whirlpool digest algorithms"
depends on CRYPTO
help
- Whirlpool hash algorithm.
-
- Whirlpool is part of the NESSIE cryptographic primtives.
- Whirlpool works on messages shorter than 2^256 bits and
- produces a 512 bit hash.
+ Whirlpool hash algorithm 512, 384 and 256-bit hashes
+ Whirlpool-512 is part of the NESSIE cryptographic primtives.
Whirlpool will be part of the ISO/IEC 10118-3:2003(E) standard
See also:
diff --git a/crypto/Makefile b/crypto/Makefile
index caebd383e6ae0a..0c9d42bfbe0609 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -14,7 +14,7 @@ obj-$(CONFIG_CRYPTO_MD5) += md5.o
obj-$(CONFIG_CRYPTO_SHA1) += sha1.o
obj-$(CONFIG_CRYPTO_SHA256) += sha256.o
obj-$(CONFIG_CRYPTO_SHA512) += sha512.o
-obj-$(CONFIG_CRYPTO_WHIRLPOOL) += whirlpool.o
+obj-$(CONFIG_CRYPTO_WP512) += wp512.o
obj-$(CONFIG_CRYPTO_DES) += des.o
obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index 5ffd3193022d48..c23d5ee6946eb1 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -63,7 +63,7 @@ static char *check[] = {
"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
- "whirlpool", NULL
+ "wp512", "wp384", "wp256", NULL
};
static void
@@ -682,7 +682,9 @@ do_test(void)
test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
- test_hash("whirlpool", whirlpool_tv_template, WHIRLPOOL_TEST_VECTORS);
+ test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
+ test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
+ test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
test_deflate();
test_crc32c();
#ifdef CONFIG_CRYPTO_HMAC
@@ -795,7 +797,15 @@ do_test(void)
break;
case 22:
- test_hash("whirlpool", whirlpool_tv_template, WHIRLPOOL_TEST_VECTORS);
+ test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
+ break;
+
+ case 23:
+ test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
+ break;
+
+ case 24:
+ test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
break;
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h
index 536c21f3cfc0c3..18370befc652b1 100644
--- a/crypto/tcrypt.h
+++ b/crypto/tcrypt.h
@@ -307,9 +307,9 @@ struct hash_testvec sha512_tv_template[] = {
* by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE
* submission
*/
-#define WHIRLPOOL_TEST_VECTORS 8
+#define WP512_TEST_VECTORS 8
-struct hash_testvec whirlpool_tv_template[] = {
+struct hash_testvec wp512_tv_template[] = {
{
.plaintext = "",
.psize = 0,
@@ -405,6 +405,155 @@ struct hash_testvec whirlpool_tv_template[] = {
},
};
+#define WP384_TEST_VECTORS 8
+
+struct hash_testvec wp384_tv_template[] = {
+ {
+ .plaintext = "",
+ .psize = 0,
+ .digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
+ 0x9B, 0x44, 0xE3, 0x9C, 0x1D, 0x2E, 0x17, 0x26,
+ 0xC5, 0x30, 0x23, 0x21, 0x30, 0xD4, 0x07, 0xF8,
+ 0x9A, 0xFE, 0xE0, 0x96, 0x49, 0x97, 0xF7, 0xA7,
+ 0x3E, 0x83, 0xBE, 0x69, 0x8B, 0x28, 0x8F, 0xEB,
+ 0xCF, 0x88, 0xE3, 0xE0, 0x3C, 0x4F, 0x07, 0x57 },
+
+
+ }, {
+ .plaintext = "a",
+ .psize = 1,
+ .digest = { 0x8A, 0xCA, 0x26, 0x02, 0x79, 0x2A, 0xEC, 0x6F,
+ 0x11, 0xA6, 0x72, 0x06, 0x53, 0x1F, 0xB7, 0xD7,
+ 0xF0, 0xDF, 0xF5, 0x94, 0x13, 0x14, 0x5E, 0x69,
+ 0x73, 0xC4, 0x50, 0x01, 0xD0, 0x08, 0x7B, 0x42,
+ 0xD1, 0x1B, 0xC6, 0x45, 0x41, 0x3A, 0xEF, 0xF6,
+ 0x3A, 0x42, 0x39, 0x1A, 0x39, 0x14, 0x5A, 0x59 },
+ }, {
+ .plaintext = "abc",
+ .psize = 3,
+ .digest = { 0x4E, 0x24, 0x48, 0xA4, 0xC6, 0xF4, 0x86, 0xBB,
+ 0x16, 0xB6, 0x56, 0x2C, 0x73, 0xB4, 0x02, 0x0B,
+ 0xF3, 0x04, 0x3E, 0x3A, 0x73, 0x1B, 0xCE, 0x72,
+ 0x1A, 0xE1, 0xB3, 0x03, 0xD9, 0x7E, 0x6D, 0x4C,
+ 0x71, 0x81, 0xEE, 0xBD, 0xB6, 0xC5, 0x7E, 0x27,
+ 0x7D, 0x0E, 0x34, 0x95, 0x71, 0x14, 0xCB, 0xD6 },
+ }, {
+ .plaintext = "message digest",
+ .psize = 14,
+ .digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
+ 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
+ 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
+ 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B,
+ 0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1,
+ 0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6 },
+ }, {
+ .plaintext = "abcdefghijklmnopqrstuvwxyz",
+ .psize = 26,
+ .digest = { 0xF1, 0xD7, 0x54, 0x66, 0x26, 0x36, 0xFF, 0xE9,
+ 0x2C, 0x82, 0xEB, 0xB9, 0x21, 0x2A, 0x48, 0x4A,
+ 0x8D, 0x38, 0x63, 0x1E, 0xAD, 0x42, 0x38, 0xF5,
+ 0x44, 0x2E, 0xE1, 0x3B, 0x80, 0x54, 0xE4, 0x1B,
+ 0x08, 0xBF, 0x2A, 0x92, 0x51, 0xC3, 0x0B, 0x6A,
+ 0x0B, 0x8A, 0xAE, 0x86, 0x17, 0x7A, 0xB4, 0xA6 },
+ }, {
+ .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz0123456789",
+ .psize = 62,
+ .digest = { 0xDC, 0x37, 0xE0, 0x08, 0xCF, 0x9E, 0xE6, 0x9B,
+ 0xF1, 0x1F, 0x00, 0xED, 0x9A, 0xBA, 0x26, 0x90,
+ 0x1D, 0xD7, 0xC2, 0x8C, 0xDE, 0xC0, 0x66, 0xCC,
+ 0x6A, 0xF4, 0x2E, 0x40, 0xF8, 0x2F, 0x3A, 0x1E,
+ 0x08, 0xEB, 0xA2, 0x66, 0x29, 0x12, 0x9D, 0x8F,
+ 0xB7, 0xCB, 0x57, 0x21, 0x1B, 0x92, 0x81, 0xA6 },
+ }, {
+ .plaintext = "1234567890123456789012345678901234567890"
+ "1234567890123456789012345678901234567890",
+ .psize = 80,
+ .digest = { 0x46, 0x6E, 0xF1, 0x8B, 0xAB, 0xB0, 0x15, 0x4D,
+ 0x25, 0xB9, 0xD3, 0x8A, 0x64, 0x14, 0xF5, 0xC0,
+ 0x87, 0x84, 0x37, 0x2B, 0xCC, 0xB2, 0x04, 0xD6,
+ 0x54, 0x9C, 0x4A, 0xFA, 0xDB, 0x60, 0x14, 0x29,
+ 0x4D, 0x5B, 0xD8, 0xDF, 0x2A, 0x6C, 0x44, 0xE5,
+ 0x38, 0xCD, 0x04, 0x7B, 0x26, 0x81, 0xA5, 0x1A },
+ }, {
+ .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
+ .psize = 32,
+ .digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
+ 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
+ 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
+ 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69,
+ 0x16, 0xBD, 0xC8, 0x03, 0x1B, 0xC5, 0xBE, 0x1B,
+ 0x7B, 0x94, 0x76, 0x39, 0xFE, 0x05, 0x0B, 0x56 },
+ },
+};
+
+#define WP256_TEST_VECTORS 8
+
+struct hash_testvec wp256_tv_template[] = {
+ {
+ .plaintext = "",
+ .psize = 0,
+ .digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
+ 0x9B, 0x44, 0xE3, 0x9C, 0x1D, 0x2E, 0x17, 0x26,
+ 0xC5, 0x30, 0x23, 0x21, 0x30, 0xD4, 0x07, 0xF8,
+ 0x9A, 0xFE, 0xE0, 0x96, 0x49, 0x97, 0xF7, 0xA7 },
+
+
+ }, {
+ .plaintext = "a",
+ .psize = 1,
+ .digest = { 0x8A, 0xCA, 0x26, 0x02, 0x79, 0x2A, 0xEC, 0x6F,
+ 0x11, 0xA6, 0x72, 0x06, 0x53, 0x1F, 0xB7, 0xD7,
+ 0xF0, 0xDF, 0xF5, 0x94, 0x13, 0x14, 0x5E, 0x69,
+ 0x73, 0xC4, 0x50, 0x01, 0xD0, 0x08, 0x7B, 0x42 },
+ }, {
+ .plaintext = "abc",
+ .psize = 3,
+ .digest = { 0x4E, 0x24, 0x48, 0xA4, 0xC6, 0xF4, 0x86, 0xBB,
+ 0x16, 0xB6, 0x56, 0x2C, 0x73, 0xB4, 0x02, 0x0B,
+ 0xF3, 0x04, 0x3E, 0x3A, 0x73, 0x1B, 0xCE, 0x72,
+ 0x1A, 0xE1, 0xB3, 0x03, 0xD9, 0x7E, 0x6D, 0x4C },
+ }, {
+ .plaintext = "message digest",
+ .psize = 14,
+ .digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
+ 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
+ 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
+ 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B },
+ }, {
+ .plaintext = "abcdefghijklmnopqrstuvwxyz",
+ .psize = 26,
+ .digest = { 0xF1, 0xD7, 0x54, 0x66, 0x26, 0x36, 0xFF, 0xE9,
+ 0x2C, 0x82, 0xEB, 0xB9, 0x21, 0x2A, 0x48, 0x4A,
+ 0x8D, 0x38, 0x63, 0x1E, 0xAD, 0x42, 0x38, 0xF5,
+ 0x44, 0x2E, 0xE1, 0x3B, 0x80, 0x54, 0xE4, 0x1B },
+ }, {
+ .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz0123456789",
+ .psize = 62,
+ .digest = { 0xDC, 0x37, 0xE0, 0x08, 0xCF, 0x9E, 0xE6, 0x9B,
+ 0xF1, 0x1F, 0x00, 0xED, 0x9A, 0xBA, 0x26, 0x90,
+ 0x1D, 0xD7, 0xC2, 0x8C, 0xDE, 0xC0, 0x66, 0xCC,
+ 0x6A, 0xF4, 0x2E, 0x40, 0xF8, 0x2F, 0x3A, 0x1E },
+ }, {
+ .plaintext = "1234567890123456789012345678901234567890"
+ "1234567890123456789012345678901234567890",
+ .psize = 80,
+ .digest = { 0x46, 0x6E, 0xF1, 0x8B, 0xAB, 0xB0, 0x15, 0x4D,
+ 0x25, 0xB9, 0xD3, 0x8A, 0x64, 0x14, 0xF5, 0xC0,
+ 0x87, 0x84, 0x37, 0x2B, 0xCC, 0xB2, 0x04, 0xD6,
+ 0x54, 0x9C, 0x4A, 0xFA, 0xDB, 0x60, 0x14, 0x29 },
+ }, {
+ .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
+ .psize = 32,
+ .digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
+ 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
+ 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
+ 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69 },
+ },
+};
+
+
#ifdef CONFIG_CRYPTO_HMAC
/*
* HMAC-MD5 test vectors from RFC2202
diff --git a/crypto/whirlpool.c b/crypto/wp512.c
index 7f85507fa6c410..fd6e20e1f2910d 100644
--- a/crypto/whirlpool.c
+++ b/crypto/wp512.c
@@ -25,18 +25,21 @@
#include <asm/scatterlist.h>
#include <linux/crypto.h>
-#define WHIRLPOOL_DIGEST_SIZE 64
-#define WHIRLPOOL_BLOCK_SIZE 64
-#define WHIRLPOOL_LENGTHBYTES 32
+#define WP512_DIGEST_SIZE 64
+#define WP384_DIGEST_SIZE 48
+#define WP256_DIGEST_SIZE 32
+
+#define WP512_BLOCK_SIZE 64
+#define WP512_LENGTHBYTES 32
#define WHIRLPOOL_ROUNDS 10
-struct whirlpool_ctx {
- u8 bitLength[WHIRLPOOL_LENGTHBYTES];
- u8 buffer[WHIRLPOOL_BLOCK_SIZE];
+struct wp512_ctx {
+ u8 bitLength[WP512_LENGTHBYTES];
+ u8 buffer[WP512_BLOCK_SIZE];
int bufferBits;
int bufferPos;
- u64 hash[WHIRLPOOL_DIGEST_SIZE/8];
+ u64 hash[WP512_DIGEST_SIZE/8];
};
/*
@@ -769,7 +772,7 @@ static const u64 rc[WHIRLPOOL_ROUNDS + 1] = {
* The core Whirlpool transform.
*/
-static void whirlpool_process_buffer(struct whirlpool_ctx *wctx) {
+static void wp512_process_buffer(struct wp512_ctx *wctx) {
int i, r;
u64 K[8]; /* the round key */
u64 block[8]; /* mu(buffer) */
@@ -985,9 +988,9 @@ static void whirlpool_process_buffer(struct whirlpool_ctx *wctx) {
}
-static void whirlpool_init (void *ctx) {
+static void wp512_init (void *ctx) {
int i;
- struct whirlpool_ctx *wctx = ctx;
+ struct wp512_ctx *wctx = ctx;
memset(wctx->bitLength, 0, 32);
wctx->bufferBits = wctx->bufferPos = 0;
@@ -997,10 +1000,10 @@ static void whirlpool_init (void *ctx) {
}
}
-static void whirlpool_update(void *ctx, const u8 *source, unsigned int len)
+static void wp512_update(void *ctx, const u8 *source, unsigned int len)
{
- struct whirlpool_ctx *wctx = ctx;
+ struct wp512_ctx *wctx = ctx;
int sourcePos = 0;
unsigned int bits_len = len * 8; // convert to number of bits
int sourceGap = (8 - ((int)bits_len & 7)) & 7;
@@ -1024,8 +1027,8 @@ static void whirlpool_update(void *ctx, const u8 *source, unsigned int len)
((source[sourcePos + 1] & 0xff) >> (8 - sourceGap));
buffer[bufferPos++] |= (u8)(b >> bufferRem);
bufferBits += 8 - bufferRem;
- if (bufferBits == WHIRLPOOL_DIGEST_SIZE * 8) {
- whirlpool_process_buffer(wctx);
+ if (bufferBits == WP512_BLOCK_SIZE * 8) {
+ wp512_process_buffer(wctx);
bufferBits = bufferPos = 0;
}
buffer[bufferPos] = b << (8 - bufferRem);
@@ -1045,8 +1048,8 @@ static void whirlpool_update(void *ctx, const u8 *source, unsigned int len)
bufferPos++;
bufferBits += 8 - bufferRem;
bits_len -= 8 - bufferRem;
- if (bufferBits == WHIRLPOOL_DIGEST_SIZE * 8) {
- whirlpool_process_buffer(wctx);
+ if (bufferBits == WP512_BLOCK_SIZE * 8) {
+ wp512_process_buffer(wctx);
bufferBits = bufferPos = 0;
}
buffer[bufferPos] = b << (8 - bufferRem);
@@ -1058,9 +1061,9 @@ static void whirlpool_update(void *ctx, const u8 *source, unsigned int len)
}
-static void whirlpool_final(void *ctx, u8 *out)
+static void wp512_final(void *ctx, u8 *out)
{
- struct whirlpool_ctx *wctx = ctx;
+ struct wp512_ctx *wctx = ctx;
int i;
u8 *buffer = wctx->buffer;
u8 *bitLength = wctx->bitLength;
@@ -1070,22 +1073,22 @@ static void whirlpool_final(void *ctx, u8 *out)
buffer[bufferPos] |= 0x80U >> (bufferBits & 7);
bufferPos++;
- if (bufferPos > WHIRLPOOL_BLOCK_SIZE - WHIRLPOOL_LENGTHBYTES) {
- if (bufferPos < WHIRLPOOL_BLOCK_SIZE) {
- memset(&buffer[bufferPos], 0, WHIRLPOOL_BLOCK_SIZE - bufferPos);
+ if (bufferPos > WP512_BLOCK_SIZE - WP512_LENGTHBYTES) {
+ if (bufferPos < WP512_BLOCK_SIZE) {
+ memset(&buffer[bufferPos], 0, WP512_BLOCK_SIZE - bufferPos);
}
- whirlpool_process_buffer(wctx);
+ wp512_process_buffer(wctx);
bufferPos = 0;
}
- if (bufferPos < WHIRLPOOL_BLOCK_SIZE - WHIRLPOOL_LENGTHBYTES) {
+ if (bufferPos < WP512_BLOCK_SIZE - WP512_LENGTHBYTES) {
memset(&buffer[bufferPos], 0,
- (WHIRLPOOL_BLOCK_SIZE - WHIRLPOOL_LENGTHBYTES) - bufferPos);
+ (WP512_BLOCK_SIZE - WP512_LENGTHBYTES) - bufferPos);
}
- bufferPos = WHIRLPOOL_BLOCK_SIZE - WHIRLPOOL_LENGTHBYTES;
- memcpy(&buffer[WHIRLPOOL_BLOCK_SIZE - WHIRLPOOL_LENGTHBYTES],
- bitLength, WHIRLPOOL_LENGTHBYTES);
- whirlpool_process_buffer(wctx);
- for (i = 0; i < WHIRLPOOL_DIGEST_SIZE/8; i++) {
+ bufferPos = WP512_BLOCK_SIZE - WP512_LENGTHBYTES;
+ memcpy(&buffer[WP512_BLOCK_SIZE - WP512_LENGTHBYTES],
+ bitLength, WP512_LENGTHBYTES);
+ wp512_process_buffer(wctx);
+ for (i = 0; i < WP512_DIGEST_SIZE/8; i++) {
digest[0] = (u8)(wctx->hash[i] >> 56);
digest[1] = (u8)(wctx->hash[i] >> 48);
digest[2] = (u8)(wctx->hash[i] >> 40);
@@ -1100,30 +1103,104 @@ static void whirlpool_final(void *ctx, u8 *out)
wctx->bufferPos = bufferPos;
}
-static struct crypto_alg alg = {
- .cra_name = "whirlpool",
+static void wp384_final(void *ctx, u8 *out)
+{
+ struct wp512_ctx *wctx = ctx;
+ u8 D[64];
+
+ wp512_final (wctx, D);
+ memcpy (out, D, WP384_DIGEST_SIZE);
+ memset (D, 0, WP512_DIGEST_SIZE);
+}
+
+static void wp256_final(void *ctx, u8 *out)
+{
+ struct wp512_ctx *wctx = ctx;
+ u8 D[64];
+
+ wp512_final (wctx, D);
+ memcpy (out, D, WP256_DIGEST_SIZE);
+ memset (D, 0, WP512_DIGEST_SIZE);
+}
+
+static struct crypto_alg wp512 = {
+ .cra_name = "wp512",
+ .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
+ .cra_blocksize = WP512_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct wp512_ctx),
+ .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 = {
+ .cra_name = "wp384",
.cra_flags = CRYPTO_ALG_TYPE_DIGEST,
- .cra_blocksize = WHIRLPOOL_BLOCK_SIZE,
- .cra_ctxsize = sizeof(struct whirlpool_ctx),
+ .cra_blocksize = WP512_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct wp512_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
+ .cra_list = LIST_HEAD_INIT(wp384.cra_list),
.cra_u = { .digest = {
- .dia_digestsize = WHIRLPOOL_DIGEST_SIZE,
- .dia_init = whirlpool_init,
- .dia_update = whirlpool_update,
- .dia_final = whirlpool_final } }
+ .dia_digestsize = WP384_DIGEST_SIZE,
+ .dia_init = wp512_init,
+ .dia_update = wp512_update,
+ .dia_final = wp384_final } }
+};
+
+static struct crypto_alg wp256 = {
+ .cra_name = "wp256",
+ .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
+ .cra_blocksize = WP512_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct wp512_ctx),
+ .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 init(void)
{
- return crypto_register_alg(&alg);
+ int ret = 0;
+
+ ret = crypto_register_alg(&wp512);
+
+ if (ret < 0)
+ goto out;
+
+ ret = crypto_register_alg(&wp384);
+ if (ret < 0)
+ {
+ crypto_unregister_alg(&wp512);
+ goto out;
+ }
+
+ ret = crypto_register_alg(&wp256);
+ if (ret < 0)
+ {
+ crypto_unregister_alg(&wp512);
+ crypto_unregister_alg(&wp384);
+ }
+out:
+ return ret;
}
static void __exit fini(void)
{
- crypto_unregister_alg(&alg);
+ crypto_unregister_alg(&wp512);
+ crypto_unregister_alg(&wp384);
+ crypto_unregister_alg(&wp256);
}
+MODULE_ALIAS("wp384");
+MODULE_ALIAS("wp256");
+
module_init(init);
module_exit(fini);