mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	This reverts commit c4741b2305.
Crypto API self-tests no longer run at registration time and now
occur either at late_initcall or upon the first use.
Therefore the premise of the above commit no longer exists.  Revert
it and subsequent additions of subsys_initcall and arch_initcall.
Note that lib/crypto calls will stay at subsys_initcall (or rather
downgraded from arch_initcall) because they may need to occur
before Crypto API registration.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
		
	
			
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
/*
 | 
						|
 * Cryptographic API
 | 
						|
 *
 | 
						|
 * ARC4 Cipher Algorithm
 | 
						|
 *
 | 
						|
 * Jon Oberheide <jon@oberheide.org>
 | 
						|
 */
 | 
						|
 | 
						|
#include <crypto/arc4.h>
 | 
						|
#include <crypto/internal/skcipher.h>
 | 
						|
#include <linux/init.h>
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/module.h>
 | 
						|
#include <linux/sched.h>
 | 
						|
 | 
						|
#define ARC4_ALIGN __alignof__(struct arc4_ctx)
 | 
						|
 | 
						|
static int crypto_arc4_setkey(struct crypto_lskcipher *tfm, const u8 *in_key,
 | 
						|
			      unsigned int key_len)
 | 
						|
{
 | 
						|
	struct arc4_ctx *ctx = crypto_lskcipher_ctx(tfm);
 | 
						|
 | 
						|
	return arc4_setkey(ctx, in_key, key_len);
 | 
						|
}
 | 
						|
 | 
						|
static int crypto_arc4_crypt(struct crypto_lskcipher *tfm, const u8 *src,
 | 
						|
			     u8 *dst, unsigned nbytes, u8 *siv, u32 flags)
 | 
						|
{
 | 
						|
	struct arc4_ctx *ctx = crypto_lskcipher_ctx(tfm);
 | 
						|
 | 
						|
	if (!(flags & CRYPTO_LSKCIPHER_FLAG_CONT))
 | 
						|
		memcpy(siv, ctx, sizeof(*ctx));
 | 
						|
 | 
						|
	ctx = (struct arc4_ctx *)siv;
 | 
						|
 | 
						|
	arc4_crypt(ctx, dst, src, nbytes);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int crypto_arc4_init(struct crypto_lskcipher *tfm)
 | 
						|
{
 | 
						|
	pr_warn_ratelimited("\"%s\" (%ld) uses obsolete ecb(arc4) skcipher\n",
 | 
						|
			    current->comm, (unsigned long)current->pid);
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static struct lskcipher_alg arc4_alg = {
 | 
						|
	.co.base.cra_name		=	"arc4",
 | 
						|
	.co.base.cra_driver_name	=	"arc4-generic",
 | 
						|
	.co.base.cra_priority		=	100,
 | 
						|
	.co.base.cra_blocksize		=	ARC4_BLOCK_SIZE,
 | 
						|
	.co.base.cra_ctxsize		=	sizeof(struct arc4_ctx),
 | 
						|
	.co.base.cra_alignmask		=	ARC4_ALIGN - 1,
 | 
						|
	.co.base.cra_module		=	THIS_MODULE,
 | 
						|
	.co.min_keysize			=	ARC4_MIN_KEY_SIZE,
 | 
						|
	.co.max_keysize			=	ARC4_MAX_KEY_SIZE,
 | 
						|
	.co.statesize			=	sizeof(struct arc4_ctx),
 | 
						|
	.setkey				=	crypto_arc4_setkey,
 | 
						|
	.encrypt			=	crypto_arc4_crypt,
 | 
						|
	.decrypt			=	crypto_arc4_crypt,
 | 
						|
	.init				=	crypto_arc4_init,
 | 
						|
};
 | 
						|
 | 
						|
static int __init arc4_init(void)
 | 
						|
{
 | 
						|
	return crypto_register_lskcipher(&arc4_alg);
 | 
						|
}
 | 
						|
 | 
						|
static void __exit arc4_exit(void)
 | 
						|
{
 | 
						|
	crypto_unregister_lskcipher(&arc4_alg);
 | 
						|
}
 | 
						|
 | 
						|
module_init(arc4_init);
 | 
						|
module_exit(arc4_exit);
 | 
						|
 | 
						|
MODULE_LICENSE("GPL");
 | 
						|
MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
 | 
						|
MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
 | 
						|
MODULE_ALIAS_CRYPTO("ecb(arc4)");
 |