Skip to contentSkip to conversation

staging: skein: Add Crypto API and Loadable Module support

PATCH In review Eric Rost 3 participants 7 messages Oct 23, 2014 Staging

lore
Share & tools
lore

Eric Rost

author
#0 lore raw

v2 cover staging: skein: Add Crypto API and Loadable Module support

This patchset adds crypto api support and loadable module support to the skein driver.

Eric Rost (2):
staging: skein: Add Crypto API support
staging: skein: Add Loadable Module Support

 drivers/staging/skein/Kconfig         |  24 +---
 drivers/staging/skein/Makefile        |  13 +-
 drivers/staging/skein/skein.c         |   1 +
 drivers/staging/skein/skein.h         |   5 +
 drivers/staging/skein/skein_generic.c | 231 ++++++++++++++++++++++++++++++++++
 5 files changed, 248 insertions(+), 26 deletions(-)
 create mode 100644 drivers/staging/skein/skein_generic.c
Signature · 1 line
2.1.1
author
#1 lore raw

PATCH v2 1/2 staging: skein: Add Crypto API support

Adds crypto API support for the skein module. Also collapses the threefish module into the skein module.

---
 drivers/staging/skein/Kconfig         |  22 +------
 drivers/staging/skein/Makefile        |  13 ++--
 drivers/staging/skein/skein.c         |   1 +
 drivers/staging/skein/skein.h         |   5 ++
 drivers/staging/skein/skein_generic.c | 109 ++++++++++++++++++++++++++++++++++
 5 files changed, 125 insertions(+), 25 deletions(-)
 create mode 100644 drivers/staging/skein/skein_generic.c
drivers/staging/skein/Kconfig +3 -19
index b9172bf..de8bdd7 100644
@@ -1,8 +1,8 @@
 config CRYPTO_SKEIN
 	bool "Skein digest algorithm"
 	depends on (X86 || UML_X86) && 64BIT && CRYPTO
-	select CRYPTO_THREEFISH
 	select CRYPTO_HASH
+	select CRYPTO_ALGAPI
 	help
 	  Skein secure hash algorithm is one of 5 finalists from the NIST SHA3
 	  competition.
@@ -12,21 +12,5 @@ config CRYPTO_SKEIN
 
 	  http://www.skein-hash.info/sites/default/files/skein1.3.pdf
 
-	  for more information.  This module depends on the threefish block
-	  cipher module.
-
-config CRYPTO_THREEFISH
-	bool "Threefish tweakable block cipher"
-	depends on (X86 || UML_X86) && 64BIT && CRYPTO
-	select CRYPTO_ALGAPI
-	help
-	  Threefish cipher algorithm is the tweakable block cipher underneath
-	  the Skein family of secure hash algorithms.  Skein is one of 5
-	  finalists from the NIST SHA3 competition.
-
-	  Skein is optimized for modern, 64bit processors and is highly
-	  customizable.  See:
-
-	  http://www.skein-hash.info/sites/default/files/skein1.3.pdf
-
-	  for more information.
+	  for more information. This module also contains the threefish block
+	  cipher algorithm.
drivers/staging/skein/Makefile +7 -6
index a14aadd..382b041 100644
@@ -1,9 +1,10 @@
 #
 # Makefile for the skein secure hash algorithm
 #
-obj-$(CONFIG_CRYPTO_SKEIN) +=   skein.o \
-				skein_api.o \
-				skein_block.o
-
-obj-$(CONFIG_CRYPTO_THREEFISH) += threefish_block.o \
-				  threefish_api.o
+obj-$(CONFIG_CRYPTO_SKEIN) += skein_mod.o
+skein_mod-y := skein.o \
+	skein_api.o \
+	skein_block.o \
+	threefish_block.o \
+	threefish_api.o \
+	skein_generic.o
drivers/staging/skein/skein.c +1 -0
index 8cc8358..1c3933d 100644
@@ -11,6 +11,7 @@
 #define  SKEIN_PORT_CODE /* instantiate any code in skein_port.h */
 
 #include <linux/string.h>       /* get the memcpy/memset functions */
+#include <linux/export.h>
 #include "skein.h" /* get the Skein API definitions   */
 #include "skein_iv.h"    /* get precomputed IVs */
 #include "skein_block.h"
drivers/staging/skein/skein.h +5 -0
index e6669f1..79fac00 100644
@@ -28,6 +28,11 @@
 **
 ***************************************************************************/
 
+/*Skein digest sizes for crypto api*/
+#define SKEIN256_DIGEST_BIT_SIZE (256)
+#define SKEIN512_DIGEST_BIT_SIZE (512)
+#define SKEIN1024_DIGEST_BIT_SIZE (1024)
+
 #ifndef rotl_64
 #define rotl_64(x, N)    (((x) << (N)) | ((x) >> (64-(N))))
 #endif
drivers/staging/skein/skein_generic.c new file +109 -0

109 lines not on this page · raw message

Signature · 1 line
2.1.1
#2 lore raw

Re: [PATCH v2 1/2] staging: skein: Add Crypto API support

Quoted 3 lines · Eric Rost

Adds crypto API support for the skein module. Also collapses the threefish module into the skein module.

Why is this in staging anyway? It seems very small and not terrible code. It could easily be sent to the main kernel.

drivers/staging/skein/skein.h line 34

Quoted 12 lines
drivers/staging/skein/skein.h +4 -0
index e6669f1..79fac00 100644
@@ -28,6 +28,11 @@
 **
 ***************************************************************************/
 
+/*Skein digest sizes for crypto api*/
+#define SKEIN256_DIGEST_BIT_SIZE (256)
+#define SKEIN512_DIGEST_BIT_SIZE (512)
+#define SKEIN1024_DIGEST_BIT_SIZE (1024)

Superfulous parens.

drivers/staging/skein/skein.h line 37

Quoted 3 lines
drivers/staging/skein/skein.h +1 -0
+
 #ifndef rotl_64
 #define rotl_64(x, N)    (((x) << (N)) | ((x) >> (64-(N))))

Missing spaces.

#define rotl_64(x, N) (((x) << (N)) | ((x) >> (64 - (N))))

Also this should be a function. N and x are evaulated twice so it could be a bug depending on how it's called.

Quoted 25 lines
drivers/staging/skein/skein.h +0 -0
 #endif
drivers/staging/skein/skein_generic.c new file +18 -0
new file mode 100644
index 0000000..14cc5bd
@@ -0,0 +1,109 @@
+/*
+ * Cryptographic API.
+ *
+ * Skein256 Hash Algorithm.
+ *
+ * Derived from cryptoapi implementation, adapted for in-place
+ * scatterlist interface.
+ *
+ * Copyright (c) Eric Rost <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ */
+#include <crypto/internal/hash.h>
+#include <linux/init.h>

drivers/staging/skein/skein_generic.c line 28

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+#include <linux/mm.h>
+#include <linux/cryptohash.h>
+#include <linux/types.h>
+#include "skein.h"
+#include <asm/byteorder.h>
+
+static int skein256_init(struct shash_desc *desc)
+{
+	struct skein_256_ctx *sctx = shash_desc_ctx(desc);
+

Don't put a blank line in the middle of the declaration block.

drivers/staging/skein/skein_generic.c line 32

Quoted 4 lines
drivers/staging/skein/skein_generic.c new file +4 -0
+	int ret = skein_256_init(sctx, SKEIN256_DIGEST_BIT_SIZE);
+
+	return ret;
+}

This should be:

static int skein256_init(struct shash_desc *desc)

{
	struct skein_256_ctx *sctx = shash_desc_ctx(desc);

	return skein_256_init(sctx, SKEIN256_DIGEST_BIT_SIZE);
}

drivers/staging/skein/skein_generic.c line 38

Quoted 6 lines
drivers/staging/skein/skein_generic.c new file +6 -0
+
+int skein256_update(struct shash_desc *desc, const u8 *data,
+			unsigned int len)
+{
+	struct skein_256_ctx *sctx = shash_desc_ctx(desc);
+	size_t hbl = (size_t) len;

Pointless case. Pointless assignment.

drivers/staging/skein/skein_generic.c line 42

Quoted 4 lines
drivers/staging/skein/skein_generic.c new file +4 -0
+	int ret = skein_256_update(sctx, data, hbl);
+
+	return ret;
+}

This should be:

int skein256_update(struct shash_desc *desc, const u8 *data,
unsigned int len)

{
	struct skein_256_ctx *sctx = shash_desc_ctx(desc);

	return skein_256_update(sctx, data, len);
}

drivers/staging/skein/skein_generic.c line 51

Quoted 9 lines
drivers/staging/skein/skein_generic.c new file +9 -0
+EXPORT_SYMBOL(skein256_update);
+
+/* Add padding and return the message digest. */
+static int skein256_final(struct shash_desc *desc, u8 *out)
+{
+	struct skein_256_ctx *sctx = shash_desc_ctx(desc);
+	int ret = skein_256_final(sctx, out);
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 60

Quoted 9 lines
drivers/staging/skein/skein_generic.c new file +9 -0
+
+static int skein512_init(struct shash_desc *desc)
+{
+	struct skein_512_ctx *sctx = shash_desc_ctx(desc);
+
+	int ret = skein_512_init(sctx, SKEIN512_DIGEST_BIT_SIZE);
+
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 70

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+
+int skein512_update(struct shash_desc *desc, const u8 *data,
+			unsigned int len)
+{
+	struct skein_512_ctx *sctx = shash_desc_ctx(desc);
+	size_t hbl = (size_t) len;
+	int ret = skein_512_update(sctx, data, hbl);
+
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 79

Quoted 9 lines
drivers/staging/skein/skein_generic.c new file +9 -0
+EXPORT_SYMBOL(skein512_update);
+
+/* Add padding and return the message digest. */
+static int skein512_final(struct shash_desc *desc, u8 *out)
+{
+	struct skein_512_ctx *sctx = shash_desc_ctx(desc);
+	int ret = skein_512_final(sctx, out);
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 88

Quoted 9 lines
drivers/staging/skein/skein_generic.c new file +9 -0
+
+static int skein1024_init(struct shash_desc *desc)
+{
+	struct skein_1024_ctx *sctx = shash_desc_ctx(desc);
+
+	int ret = skein_1024_init(sctx, SKEIN1024_DIGEST_BIT_SIZE);
+
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 98

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+
+int skein1024_update(struct shash_desc *desc, const u8 *data,
+			unsigned int len)
+{
+	struct skein_1024_ctx *sctx = shash_desc_ctx(desc);
+	size_t hbl = (size_t) len;
+	int ret = skein_1024_update(sctx, data, hbl);
+
+	return ret;
+}

Same.

drivers/staging/skein/skein_generic.c line 107

Quoted 9 lines
drivers/staging/skein/skein_generic.c new file +9 -0
+EXPORT_SYMBOL(skein1024_update);
+
+/* Add padding and return the message digest. */
+static int skein1024_final(struct shash_desc *desc, u8 *out)
+{
+	struct skein_1024_ctx *sctx = shash_desc_ctx(desc);
+	int ret = skein_1024_final(sctx, out);
+	return ret;
+}

Same.

regarsd,
dan carpenter

#3 lore raw

Re: [PATCH v2 1/2] staging: skein: Add Crypto API support

Quoted 6 lines · Dan Carpenter
Quoted 2 lines · Eric Rost

Adds crypto API support for the skein module. Also collapses the threefish module into the skein module.

Why is this in staging anyway? It seems very small and not terrible code. It could easily be sent to the main kernel.

Yes, we're almost there. Loadable module support and integration into the crypto API were what was blocking my proposal to move into mainline. It might even happen this cycle if we can get this series into -next for a bit.

thx,

Jason.

#4 lore raw

Re: [PATCH v2 1/2] staging: skein: Add Crypto API support

In reply to Eric Rost
Quoted 62 lines · Eric Rost

Adds crypto API support for the skein module. Also collapses the threefish module into the skein module.

---
 drivers/staging/skein/Kconfig         |  22 +------
 drivers/staging/skein/Makefile        |  13 ++--
 drivers/staging/skein/skein.c         |   1 +
 drivers/staging/skein/skein.h         |   5 ++
 drivers/staging/skein/skein_generic.c | 109 ++++++++++++++++++++++++++++++++++
 5 files changed, 125 insertions(+), 25 deletions(-)
 create mode 100644 drivers/staging/skein/skein_generic.c
drivers/staging/skein/Kconfig +3 -19
index b9172bf..de8bdd7 100644
@@ -1,8 +1,8 @@
 config CRYPTO_SKEIN
 	bool "Skein digest algorithm"
 	depends on (X86 || UML_X86) && 64BIT && CRYPTO
-	select CRYPTO_THREEFISH
 	select CRYPTO_HASH
+	select CRYPTO_ALGAPI
 	help
 	  Skein secure hash algorithm is one of 5 finalists from the NIST SHA3
 	  competition.
@@ -12,21 +12,5 @@ config CRYPTO_SKEIN
 
 	  http://www.skein-hash.info/sites/default/files/skein1.3.pdf
 
-	  for more information.  This module depends on the threefish block
-	  cipher module.
-
-config CRYPTO_THREEFISH
-	bool "Threefish tweakable block cipher"
-	depends on (X86 || UML_X86) && 64BIT && CRYPTO
-	select CRYPTO_ALGAPI
-	help
-	  Threefish cipher algorithm is the tweakable block cipher underneath
-	  the Skein family of secure hash algorithms.  Skein is one of 5
-	  finalists from the NIST SHA3 competition.
-
-	  Skein is optimized for modern, 64bit processors and is highly
-	  customizable.  See:
-
-	  http://www.skein-hash.info/sites/default/files/skein1.3.pdf
-
-	  for more information.
+	  for more information. This module also contains the threefish block
+	  cipher algorithm.
drivers/staging/skein/Makefile +0 -3
index a14aadd..382b041 100644
@@ -1,9 +1,10 @@
 #
 # Makefile for the skein secure hash algorithm
 #
-obj-$(CONFIG_CRYPTO_SKEIN) +=   skein.o \
-				skein_api.o \
-				skein_block.o

drivers/staging/skein/Makefile line 10

Quoted 10 lines
drivers/staging/skein/Makefile +7 -3
-
-obj-$(CONFIG_CRYPTO_THREEFISH) += threefish_block.o \
-				  threefish_api.o
+obj-$(CONFIG_CRYPTO_SKEIN) += skein_mod.o
+skein_mod-y := skein.o \
+	skein_api.o \
+	skein_block.o \
+	threefish_block.o \
+	threefish_api.o \
+	skein_generic.o

I'd prefer to rename skein.c so that we can do skein.ko.

drivers/staging/skein/skein.c line 14

Quoted 9 lines
drivers/staging/skein/skein.c +1 -0
index 8cc8358..1c3933d 100644
@@ -11,6 +11,7 @@
 #define  SKEIN_PORT_CODE /* instantiate any code in skein_port.h */
 
 #include <linux/string.h>       /* get the memcpy/memset functions */
+#include <linux/export.h>

This shouldn't be needed anymore.

Quoted 38 lines
drivers/staging/skein/skein.c +0 -0
 #include "skein.h" /* get the Skein API definitions   */
 #include "skein_iv.h"    /* get precomputed IVs */
 #include "skein_block.h"
drivers/staging/skein/skein.h +5 -0
index e6669f1..79fac00 100644
@@ -28,6 +28,11 @@
 **
 ***************************************************************************/
 
+/*Skein digest sizes for crypto api*/
+#define SKEIN256_DIGEST_BIT_SIZE (256)
+#define SKEIN512_DIGEST_BIT_SIZE (512)
+#define SKEIN1024_DIGEST_BIT_SIZE (1024)
+
 #ifndef rotl_64
 #define rotl_64(x, N)    (((x) << (N)) | ((x) >> (64-(N))))
 #endif
drivers/staging/skein/skein_generic.c new file +13 -0
new file mode 100644
index 0000000..14cc5bd
@@ -0,0 +1,109 @@
+/*
+ * Cryptographic API.
+ *
+ * Skein256 Hash Algorithm.
+ *
+ * Derived from cryptoapi implementation, adapted for in-place
+ * scatterlist interface.
+ *
+ * Copyright (c) Eric Rost <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)

drivers/staging/skein/skein_generic.c line 23

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+ * any later version.
+ *
+ */
+#include <crypto/internal/hash.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/cryptohash.h>
+#include <linux/types.h>
+#include "skein.h"
+#include <asm/byteorder.h>

I forgot to mention this last time. Please put local includes last. Also, please double check that all of these are need in this file.

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+
+static int skein256_init(struct shash_desc *desc)
+{
+	struct skein_256_ctx *sctx = shash_desc_ctx(desc);
+
+	int ret = skein_256_init(sctx, SKEIN256_DIGEST_BIT_SIZE);
+
+	return ret;
+}
+

drivers/staging/skein/skein_generic.c line 43

Quoted 10 lines
drivers/staging/skein/skein_generic.c new file +10 -0
+int skein256_update(struct shash_desc *desc, const u8 *data,
+			unsigned int len)
+{
+	struct skein_256_ctx *sctx = shash_desc_ctx(desc);
+	size_t hbl = (size_t) len;
+	int ret = skein_256_update(sctx, data, hbl);
+
+	return ret;
+}
+EXPORT_SYMBOL(skein256_update);

Why export this symbol if it's registered with the crypto API?

Same the others after this one.

thx,

Jason.

author
#5 lore raw

PATCH v2 2/2 staging: skein: Add Loadable Module Support

In reply to Eric Rost

Adds loadable module support for skein_mod, containing skein256, skein512, and skein1024 algorithms.

---
 drivers/staging/skein/Kconfig         |   2 +-
 drivers/staging/skein/skein_generic.c | 122 ++++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+), 1 deletion(-)
drivers/staging/skein/Kconfig +1 -1
index de8bdd7..012a823 100644
@@ -1,5 +1,5 @@
 config CRYPTO_SKEIN
-	bool "Skein digest algorithm"
+	tristate "Skein digest algorithm"
 	depends on (X86 || UML_X86) && 64BIT && CRYPTO
 	select CRYPTO_HASH
 	select CRYPTO_ALGAPI
drivers/staging/skein/skein_generic.c +122 -0

144 lines not on this page · raw message

Signature · 1 line
2.1.1
#6 lore raw

Re: [PATCH v2 2/2] staging: skein: Add Loadable Module Support

drivers/staging/skein/skein_generic.c static int skein1024_final(struct shash_desc *desc, u8 *out) · line 215

Quoted 4 lines · Eric Rost
drivers/staging/skein/skein_generic.c +4 -0
+static int __init skein_generic_mod_init(void)
+{
+	return crypto_register_shash(&alg256) || crypto_register_shash(&alg512)
+		|| crypto_register_shash(&alg1024);

Shouldn't it unwind on error?

Quoted 1 line

+}

regards,
dan carpenter