Browse Source

[CRYPTO] api: Split out low-level API

The crypto API is made up of the part facing users such as IPsec and the
low-level part which is used by cryptographic entities such as algorithms.
This patch splits out the latter so that the two APIs are more clearly
delineated.  As a bonus the low-level API can now be modularised if all
algorithms are built as modules.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Herbert Xu 18 years ago
parent
commit
cce9e06d10
8 changed files with 204 additions and 134 deletions
  1. 50 34
      crypto/Kconfig
  2. 4 3
      crypto/Makefile
  3. 118 0
      crypto/algapi.c
  4. 2 95
      crypto/api.c
  5. 5 1
      crypto/internal.h
  6. 5 0
      crypto/proc.c
  7. 2 1
      drivers/crypto/Kconfig
  8. 18 0
      include/crypto/algapi.h

+ 50 - 34
crypto/Kconfig

@@ -9,47 +9,54 @@ config CRYPTO
 	help
 	help
 	  This option provides the core Cryptographic API.
 	  This option provides the core Cryptographic API.
 
 
+if CRYPTO
+
+config CRYPTO_ALGAPI
+	tristate
+	help
+	  This option provides the API for cryptographic algorithms.
+
 config CRYPTO_HMAC
 config CRYPTO_HMAC
 	bool "HMAC support"
 	bool "HMAC support"
-	depends on CRYPTO
 	help
 	help
 	  HMAC: Keyed-Hashing for Message Authentication (RFC2104).
 	  HMAC: Keyed-Hashing for Message Authentication (RFC2104).
 	  This is required for IPSec.
 	  This is required for IPSec.
 
 
 config CRYPTO_NULL
 config CRYPTO_NULL
 	tristate "Null algorithms"
 	tristate "Null algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  These are 'Null' algorithms, used by IPsec, which do nothing.
 	  These are 'Null' algorithms, used by IPsec, which do nothing.
 
 
 config CRYPTO_MD4
 config CRYPTO_MD4
 	tristate "MD4 digest algorithm"
 	tristate "MD4 digest algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  MD4 message digest algorithm (RFC1320).
 	  MD4 message digest algorithm (RFC1320).
 
 
 config CRYPTO_MD5
 config CRYPTO_MD5
 	tristate "MD5 digest algorithm"
 	tristate "MD5 digest algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  MD5 message digest algorithm (RFC1321).
 	  MD5 message digest algorithm (RFC1321).
 
 
 config CRYPTO_SHA1
 config CRYPTO_SHA1
 	tristate "SHA1 digest algorithm"
 	tristate "SHA1 digest algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
 	  SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
 
 
 config CRYPTO_SHA1_S390
 config CRYPTO_SHA1_S390
 	tristate "SHA1 digest algorithm (s390)"
 	tristate "SHA1 digest algorithm (s390)"
-	depends on CRYPTO && S390
+	depends on S390
+	select CRYPTO_ALGAPI
 	help
 	help
 	  This is the s390 hardware accelerated implementation of the
 	  This is the s390 hardware accelerated implementation of the
 	  SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
 	  SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
 
 
 config CRYPTO_SHA256
 config CRYPTO_SHA256
 	tristate "SHA256 digest algorithm"
 	tristate "SHA256 digest algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  SHA256 secure hash standard (DFIPS 180-2).
 	  SHA256 secure hash standard (DFIPS 180-2).
 	  
 	  
@@ -58,7 +65,8 @@ config CRYPTO_SHA256
 
 
 config CRYPTO_SHA256_S390
 config CRYPTO_SHA256_S390
 	tristate "SHA256 digest algorithm (s390)"
 	tristate "SHA256 digest algorithm (s390)"
-	depends on CRYPTO && S390
+	depends on S390
+	select CRYPTO_ALGAPI
 	help
 	help
 	  This is the s390 hardware accelerated implementation of the
 	  This is the s390 hardware accelerated implementation of the
 	  SHA256 secure hash standard (DFIPS 180-2).
 	  SHA256 secure hash standard (DFIPS 180-2).
@@ -68,7 +76,7 @@ config CRYPTO_SHA256_S390
 
 
 config CRYPTO_SHA512
 config CRYPTO_SHA512
 	tristate "SHA384 and SHA512 digest algorithms"
 	tristate "SHA384 and SHA512 digest algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  SHA512 secure hash standard (DFIPS 180-2).
 	  SHA512 secure hash standard (DFIPS 180-2).
 	  
 	  
@@ -80,7 +88,7 @@ config CRYPTO_SHA512
 
 
 config CRYPTO_WP512
 config CRYPTO_WP512
 	tristate "Whirlpool digest algorithms"
 	tristate "Whirlpool digest algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Whirlpool hash algorithm 512, 384 and 256-bit hashes
 	  Whirlpool hash algorithm 512, 384 and 256-bit hashes
 
 
@@ -92,7 +100,7 @@ config CRYPTO_WP512
 
 
 config CRYPTO_TGR192
 config CRYPTO_TGR192
 	tristate "Tiger digest algorithms"
 	tristate "Tiger digest algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Tiger hash algorithm 192, 160 and 128-bit hashes
 	  Tiger hash algorithm 192, 160 and 128-bit hashes
 
 
@@ -105,19 +113,20 @@ config CRYPTO_TGR192
 
 
 config CRYPTO_DES
 config CRYPTO_DES
 	tristate "DES and Triple DES EDE cipher algorithms"
 	tristate "DES and Triple DES EDE cipher algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
 	  DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
 
 
 config CRYPTO_DES_S390
 config CRYPTO_DES_S390
 	tristate "DES and Triple DES cipher algorithms (s390)"
 	tristate "DES and Triple DES cipher algorithms (s390)"
-	depends on CRYPTO && S390
+	depends on S390
+	select CRYPTO_ALGAPI
 	help
 	help
 	  DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
 	  DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
 
 
 config CRYPTO_BLOWFISH
 config CRYPTO_BLOWFISH
 	tristate "Blowfish cipher algorithm"
 	tristate "Blowfish cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Blowfish cipher algorithm, by Bruce Schneier.
 	  Blowfish cipher algorithm, by Bruce Schneier.
 	  
 	  
@@ -130,7 +139,7 @@ config CRYPTO_BLOWFISH
 
 
 config CRYPTO_TWOFISH
 config CRYPTO_TWOFISH
 	tristate "Twofish cipher algorithm"
 	tristate "Twofish cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	select CRYPTO_TWOFISH_COMMON
 	select CRYPTO_TWOFISH_COMMON
 	help
 	help
 	  Twofish cipher algorithm.
 	  Twofish cipher algorithm.
@@ -145,14 +154,14 @@ config CRYPTO_TWOFISH
 
 
 config CRYPTO_TWOFISH_COMMON
 config CRYPTO_TWOFISH_COMMON
 	tristate
 	tristate
-	depends on CRYPTO
 	help
 	help
 	  Common parts of the Twofish cipher algorithm shared by the
 	  Common parts of the Twofish cipher algorithm shared by the
 	  generic c and the assembler implementations.
 	  generic c and the assembler implementations.
 
 
 config CRYPTO_TWOFISH_586
 config CRYPTO_TWOFISH_586
 	tristate "Twofish cipher algorithms (i586)"
 	tristate "Twofish cipher algorithms (i586)"
-	depends on CRYPTO && ((X86 || UML_X86) && !64BIT)
+	depends on (X86 || UML_X86) && !64BIT
+	select CRYPTO_ALGAPI
 	select CRYPTO_TWOFISH_COMMON
 	select CRYPTO_TWOFISH_COMMON
 	help
 	help
 	  Twofish cipher algorithm.
 	  Twofish cipher algorithm.
@@ -167,7 +176,8 @@ config CRYPTO_TWOFISH_586
 
 
 config CRYPTO_TWOFISH_X86_64
 config CRYPTO_TWOFISH_X86_64
 	tristate "Twofish cipher algorithm (x86_64)"
 	tristate "Twofish cipher algorithm (x86_64)"
-	depends on CRYPTO && ((X86 || UML_X86) && 64BIT)
+	depends on (X86 || UML_X86) && 64BIT
+	select CRYPTO_ALGAPI
 	select CRYPTO_TWOFISH_COMMON
 	select CRYPTO_TWOFISH_COMMON
 	help
 	help
 	  Twofish cipher algorithm (x86_64).
 	  Twofish cipher algorithm (x86_64).
@@ -182,7 +192,7 @@ config CRYPTO_TWOFISH_X86_64
 
 
 config CRYPTO_SERPENT
 config CRYPTO_SERPENT
 	tristate "Serpent cipher algorithm"
 	tristate "Serpent cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Serpent cipher algorithm, by Anderson, Biham & Knudsen.
 	  Serpent cipher algorithm, by Anderson, Biham & Knudsen.
 
 
@@ -195,7 +205,7 @@ config CRYPTO_SERPENT
 
 
 config CRYPTO_AES
 config CRYPTO_AES
 	tristate "AES cipher algorithms"
 	tristate "AES cipher algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  algorithm.
 	  algorithm.
@@ -215,7 +225,8 @@ config CRYPTO_AES
 
 
 config CRYPTO_AES_586
 config CRYPTO_AES_586
 	tristate "AES cipher algorithms (i586)"
 	tristate "AES cipher algorithms (i586)"
-	depends on CRYPTO && ((X86 || UML_X86) && !64BIT)
+	depends on (X86 || UML_X86) && !64BIT
+	select CRYPTO_ALGAPI
 	help
 	help
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  algorithm.
 	  algorithm.
@@ -235,7 +246,8 @@ config CRYPTO_AES_586
 
 
 config CRYPTO_AES_X86_64
 config CRYPTO_AES_X86_64
 	tristate "AES cipher algorithms (x86_64)"
 	tristate "AES cipher algorithms (x86_64)"
-	depends on CRYPTO && ((X86 || UML_X86) && 64BIT)
+	depends on (X86 || UML_X86) && 64BIT
+	select CRYPTO_ALGAPI
 	help
 	help
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
 	  algorithm.
 	  algorithm.
@@ -255,7 +267,8 @@ config CRYPTO_AES_X86_64
 
 
 config CRYPTO_AES_S390
 config CRYPTO_AES_S390
 	tristate "AES cipher algorithms (s390)"
 	tristate "AES cipher algorithms (s390)"
-	depends on CRYPTO && S390
+	depends on S390
+	select CRYPTO_ALGAPI
 	help
 	help
 	  This is the s390 hardware accelerated implementation of the
 	  This is the s390 hardware accelerated implementation of the
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael
 	  AES cipher algorithms (FIPS-197). AES uses the Rijndael
@@ -275,21 +288,21 @@ config CRYPTO_AES_S390
 
 
 config CRYPTO_CAST5
 config CRYPTO_CAST5
 	tristate "CAST5 (CAST-128) cipher algorithm"
 	tristate "CAST5 (CAST-128) cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  The CAST5 encryption algorithm (synonymous with CAST-128) is
 	  The CAST5 encryption algorithm (synonymous with CAST-128) is
 	  described in RFC2144.
 	  described in RFC2144.
 
 
 config CRYPTO_CAST6
 config CRYPTO_CAST6
 	tristate "CAST6 (CAST-256) cipher algorithm"
 	tristate "CAST6 (CAST-256) cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  The CAST6 encryption algorithm (synonymous with CAST-256) is
 	  The CAST6 encryption algorithm (synonymous with CAST-256) is
 	  described in RFC2612.
 	  described in RFC2612.
 
 
 config CRYPTO_TEA
 config CRYPTO_TEA
 	tristate "TEA, XTEA and XETA cipher algorithms"
 	tristate "TEA, XTEA and XETA cipher algorithms"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  TEA cipher algorithm.
 	  TEA cipher algorithm.
 
 
@@ -306,7 +319,7 @@ config CRYPTO_TEA
 
 
 config CRYPTO_ARC4
 config CRYPTO_ARC4
 	tristate "ARC4 cipher algorithm"
 	tristate "ARC4 cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  ARC4 cipher algorithm.
 	  ARC4 cipher algorithm.
 
 
@@ -317,7 +330,7 @@ config CRYPTO_ARC4
 
 
 config CRYPTO_KHAZAD
 config CRYPTO_KHAZAD
 	tristate "Khazad cipher algorithm"
 	tristate "Khazad cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Khazad cipher algorithm.
 	  Khazad cipher algorithm.
 
 
@@ -330,7 +343,7 @@ config CRYPTO_KHAZAD
 
 
 config CRYPTO_ANUBIS
 config CRYPTO_ANUBIS
 	tristate "Anubis cipher algorithm"
 	tristate "Anubis cipher algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Anubis cipher algorithm.
 	  Anubis cipher algorithm.
 
 
@@ -345,7 +358,7 @@ config CRYPTO_ANUBIS
 
 
 config CRYPTO_DEFLATE
 config CRYPTO_DEFLATE
 	tristate "Deflate compression algorithm"
 	tristate "Deflate compression algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	select ZLIB_INFLATE
 	select ZLIB_INFLATE
 	select ZLIB_DEFLATE
 	select ZLIB_DEFLATE
 	help
 	help
@@ -356,7 +369,7 @@ config CRYPTO_DEFLATE
 
 
 config CRYPTO_MICHAEL_MIC
 config CRYPTO_MICHAEL_MIC
 	tristate "Michael MIC keyed digest algorithm"
 	tristate "Michael MIC keyed digest algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Michael MIC is used for message integrity protection in TKIP
 	  Michael MIC is used for message integrity protection in TKIP
 	  (IEEE 802.11i). This algorithm is required for TKIP, but it
 	  (IEEE 802.11i). This algorithm is required for TKIP, but it
@@ -365,7 +378,7 @@ config CRYPTO_MICHAEL_MIC
 
 
 config CRYPTO_CRC32C
 config CRYPTO_CRC32C
 	tristate "CRC32c CRC algorithm"
 	tristate "CRC32c CRC algorithm"
-	depends on CRYPTO
+	select CRYPTO_ALGAPI
 	select LIBCRC32C
 	select LIBCRC32C
 	help
 	help
 	  Castagnoli, et al Cyclic Redundancy-Check Algorithm.  Used
 	  Castagnoli, et al Cyclic Redundancy-Check Algorithm.  Used
@@ -375,10 +388,13 @@ config CRYPTO_CRC32C
 
 
 config CRYPTO_TEST
 config CRYPTO_TEST
 	tristate "Testing module"
 	tristate "Testing module"
-	depends on CRYPTO && m
+	depends on m
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Quick & dirty crypto test module.
 	  Quick & dirty crypto test module.
 
 
 source "drivers/crypto/Kconfig"
 source "drivers/crypto/Kconfig"
-endmenu
 
 
+endif	# if CRYPTO
+
+endmenu

+ 4 - 3
crypto/Makefile

@@ -2,10 +2,11 @@
 # Cryptographic API
 # Cryptographic API
 #
 #
 
 
-proc-crypto-$(CONFIG_PROC_FS) = proc.o
+obj-$(CONFIG_CRYPTO) += api.o scatterwalk.o cipher.o digest.o compress.o
 
 
-obj-$(CONFIG_CRYPTO) += api.o scatterwalk.o cipher.o digest.o compress.o \
-			$(proc-crypto-y)
+crypto_algapi-$(CONFIG_PROC_FS) += proc.o
+crypto_algapi-objs := algapi.o $(crypto_algapi-y)
+obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o
 
 
 obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
 obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
 obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o
 obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o

+ 118 - 0
crypto/algapi.c

@@ -0,0 +1,118 @@
+/*
+ * Cryptographic API for algorithms (i.e., low-level API).
+ *
+ * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
+ *
+ * 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 <linux/errno.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+
+#include "internal.h"
+
+static inline int crypto_set_driver_name(struct crypto_alg *alg)
+{
+	static const char suffix[] = "-generic";
+	char *driver_name = alg->cra_driver_name;
+	int len;
+
+	if (*driver_name)
+		return 0;
+
+	len = strlcpy(driver_name, alg->cra_name, CRYPTO_MAX_ALG_NAME);
+	if (len + sizeof(suffix) > CRYPTO_MAX_ALG_NAME)
+		return -ENAMETOOLONG;
+
+	memcpy(driver_name + len, suffix, sizeof(suffix));
+	return 0;
+}
+
+int crypto_register_alg(struct crypto_alg *alg)
+{
+	int ret;
+	struct crypto_alg *q;
+
+	if (alg->cra_alignmask & (alg->cra_alignmask + 1))
+		return -EINVAL;
+
+	if (alg->cra_alignmask & alg->cra_blocksize)
+		return -EINVAL;
+
+	if (alg->cra_blocksize > PAGE_SIZE / 8)
+		return -EINVAL;
+
+	if (alg->cra_priority < 0)
+		return -EINVAL;
+	
+	ret = crypto_set_driver_name(alg);
+	if (unlikely(ret))
+		return ret;
+
+	down_write(&crypto_alg_sem);
+	
+	list_for_each_entry(q, &crypto_alg_list, cra_list) {
+		if (q == alg) {
+			ret = -EEXIST;
+			goto out;
+		}
+	}
+	
+	list_add(&alg->cra_list, &crypto_alg_list);
+	atomic_set(&alg->cra_refcnt, 1);
+out:	
+	up_write(&crypto_alg_sem);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(crypto_register_alg);
+
+int crypto_unregister_alg(struct crypto_alg *alg)
+{
+	int ret = -ENOENT;
+	struct crypto_alg *q;
+	
+	down_write(&crypto_alg_sem);
+	list_for_each_entry(q, &crypto_alg_list, cra_list) {
+		if (alg == q) {
+			list_del(&alg->cra_list);
+			ret = 0;
+			goto out;
+		}
+	}
+out:	
+	up_write(&crypto_alg_sem);
+
+	if (ret)
+		return ret;
+
+	BUG_ON(atomic_read(&alg->cra_refcnt) != 1);
+	if (alg->cra_destroy)
+		alg->cra_destroy(alg);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(crypto_unregister_alg);
+
+static int __init crypto_algapi_init(void)
+{
+	crypto_init_proc();
+	return 0;
+}
+
+static void __exit crypto_algapi_exit(void)
+{
+	crypto_exit_proc();
+}
+
+module_init(crypto_algapi_init);
+module_exit(crypto_algapi_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Cryptographic algorithms API");

+ 2 - 95
crypto/api.c

@@ -15,19 +15,17 @@
  *
  *
  */
  */
 
 
-#include <linux/compiler.h>
-#include <linux/init.h>
-#include <linux/crypto.h>
 #include <linux/errno.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/kmod.h>
 #include <linux/kmod.h>
-#include <linux/rwsem.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include "internal.h"
 #include "internal.h"
 
 
 LIST_HEAD(crypto_alg_list);
 LIST_HEAD(crypto_alg_list);
+EXPORT_SYMBOL_GPL(crypto_alg_list);
 DECLARE_RWSEM(crypto_alg_sem);
 DECLARE_RWSEM(crypto_alg_sem);
+EXPORT_SYMBOL_GPL(crypto_alg_sem);
 
 
 static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
 static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
 {
 {
@@ -239,86 +237,6 @@ void crypto_free_tfm(struct crypto_tfm *tfm)
 	kfree(tfm);
 	kfree(tfm);
 }
 }
 
 
-static inline int crypto_set_driver_name(struct crypto_alg *alg)
-{
-	static const char suffix[] = "-generic";
-	char *driver_name = alg->cra_driver_name;
-	int len;
-
-	if (*driver_name)
-		return 0;
-
-	len = strlcpy(driver_name, alg->cra_name, CRYPTO_MAX_ALG_NAME);
-	if (len + sizeof(suffix) > CRYPTO_MAX_ALG_NAME)
-		return -ENAMETOOLONG;
-
-	memcpy(driver_name + len, suffix, sizeof(suffix));
-	return 0;
-}
-
-int crypto_register_alg(struct crypto_alg *alg)
-{
-	int ret;
-	struct crypto_alg *q;
-
-	if (alg->cra_alignmask & (alg->cra_alignmask + 1))
-		return -EINVAL;
-
-	if (alg->cra_alignmask & alg->cra_blocksize)
-		return -EINVAL;
-
-	if (alg->cra_blocksize > PAGE_SIZE / 8)
-		return -EINVAL;
-
-	if (alg->cra_priority < 0)
-		return -EINVAL;
-	
-	ret = crypto_set_driver_name(alg);
-	if (unlikely(ret))
-		return ret;
-
-	down_write(&crypto_alg_sem);
-	
-	list_for_each_entry(q, &crypto_alg_list, cra_list) {
-		if (q == alg) {
-			ret = -EEXIST;
-			goto out;
-		}
-	}
-	
-	list_add(&alg->cra_list, &crypto_alg_list);
-	atomic_set(&alg->cra_refcnt, 1);
-out:	
-	up_write(&crypto_alg_sem);
-	return ret;
-}
-
-int crypto_unregister_alg(struct crypto_alg *alg)
-{
-	int ret = -ENOENT;
-	struct crypto_alg *q;
-	
-	down_write(&crypto_alg_sem);
-	list_for_each_entry(q, &crypto_alg_list, cra_list) {
-		if (alg == q) {
-			list_del(&alg->cra_list);
-			ret = 0;
-			goto out;
-		}
-	}
-out:	
-	up_write(&crypto_alg_sem);
-
-	if (ret)
-		return ret;
-
-	BUG_ON(atomic_read(&alg->cra_refcnt) != 1);
-	if (alg->cra_destroy)
-		alg->cra_destroy(alg);
-
-	return 0;
-}
-
 int crypto_alg_available(const char *name, u32 flags)
 int crypto_alg_available(const char *name, u32 flags)
 {
 {
 	int ret = 0;
 	int ret = 0;
@@ -332,17 +250,6 @@ int crypto_alg_available(const char *name, u32 flags)
 	return ret;
 	return ret;
 }
 }
 
 
-static int __init init_crypto(void)
-{
-	printk(KERN_INFO "Initializing Cryptographic API\n");
-	crypto_init_proc();
-	return 0;
-}
-
-__initcall(init_crypto);
-
-EXPORT_SYMBOL_GPL(crypto_register_alg);
-EXPORT_SYMBOL_GPL(crypto_unregister_alg);
 EXPORT_SYMBOL_GPL(crypto_alloc_tfm);
 EXPORT_SYMBOL_GPL(crypto_alloc_tfm);
 EXPORT_SYMBOL_GPL(crypto_free_tfm);
 EXPORT_SYMBOL_GPL(crypto_free_tfm);
 EXPORT_SYMBOL_GPL(crypto_alg_available);
 EXPORT_SYMBOL_GPL(crypto_alg_available);

+ 5 - 1
crypto/internal.h

@@ -12,7 +12,8 @@
  */
  */
 #ifndef _CRYPTO_INTERNAL_H
 #ifndef _CRYPTO_INTERNAL_H
 #define _CRYPTO_INTERNAL_H
 #define _CRYPTO_INTERNAL_H
-#include <linux/crypto.h>
+
+#include <crypto/algapi.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 #include <linux/highmem.h>
 #include <linux/highmem.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
@@ -64,9 +65,12 @@ static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 void __init crypto_init_proc(void);
 void __init crypto_init_proc(void);
+void __exit crypto_exit_proc(void);
 #else
 #else
 static inline void crypto_init_proc(void)
 static inline void crypto_init_proc(void)
 { }
 { }
+static inline void crypto_exit_proc(void)
+{ }
 #endif
 #endif
 
 
 static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg,
 static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg,

+ 5 - 0
crypto/proc.c

@@ -113,3 +113,8 @@ void __init crypto_init_proc(void)
 	if (proc)
 	if (proc)
 		proc->proc_fops = &proc_crypto_ops;
 		proc->proc_fops = &proc_crypto_ops;
 }
 }
+
+void __exit crypto_exit_proc(void)
+{
+	remove_proc_entry("crypto", NULL);
+}

+ 2 - 1
drivers/crypto/Kconfig

@@ -2,7 +2,8 @@ menu "Hardware crypto devices"
 
 
 config CRYPTO_DEV_PADLOCK
 config CRYPTO_DEV_PADLOCK
 	tristate "Support for VIA PadLock ACE"
 	tristate "Support for VIA PadLock ACE"
-	depends on CRYPTO && X86_32
+	depends on X86_32
+	select CRYPTO_ALGAPI
 	help
 	help
 	  Some VIA processors come with an integrated crypto engine
 	  Some VIA processors come with an integrated crypto engine
 	  (so called VIA PadLock ACE, Advanced Cryptography Engine)
 	  (so called VIA PadLock ACE, Advanced Cryptography Engine)

+ 18 - 0
include/crypto/algapi.h

@@ -0,0 +1,18 @@
+/*
+ * Cryptographic API for algorithms (i.e., low-level API).
+ *
+ * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
+ *
+ * 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.
+ *
+ */
+#ifndef _CRYPTO_ALGAPI_H
+#define _CRYPTO_ALGAPI_H
+
+#include <linux/crypto.h>
+
+#endif	/* _CRYPTO_ALGAPI_H */
+