/* * An OCF module for determining the cost of crypto versus the cost of * IPSec processing outside of OCF. This modules gives us the effect of * zero cost encryption, of course you will need to run it at both ends * since it does no crypto at all. * * Written by David McCullough <david_mccullough@mcafee.com> * Copyright (C) 2006-2010 David McCullough * * LICENSE TERMS * * The free distribution and use of this software in both source and binary * form is allowed (with or without changes) provided that: * * 1. distributions of this source code include the above copyright * notice, this list of conditions and the following disclaimer; * * 2. distributions in binary form include the above copyright * notice, this list of conditions and the following disclaimer * in the documentation and/or other associated materials; * * 3. the copyright holder's name is not used to endorse products * built using this software without specific written permission. * * ALTERNATIVELY, provided that this notice is retained in full, this product * may be distributed under the terms of the GNU General Public License (GPL), * in which case the provisions of the GPL apply INSTEAD OF those given above. * * DISCLAIMER * * This software is provided 'as is' with no explicit or implied warranties * in respect of its properties, including, but not limited to, correctness * and/or fitness for purpose. */ #include <linux/version.h> #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) && !defined(AUTOCONF_INCLUDED) #include <linux/config.h> #endif #include <linux/module.h> #include <linux/init.h> #include <linux/list.h> #include <linux/slab.h> #include <linux/sched.h> #include <linux/wait.h> #include <linux/crypto.h> #include <linux/interrupt.h> #include <cryptodev.h> #include <uio.h> static int32_t null_id = -1; static u_int32_t null_sesnum = 0; static int null_process(device_t, struct cryptop *, int); static int null_newsession(device_t, u_int32_t *, struct cryptoini *); static int null_freesession(device_t, u_int64_t); #define debug ocfnull_debug int ocfnull_debug = 0; module_param(ocfnull_debug, int, 0644); MODULE_PARM_DESC(ocfnull_debug, "Enable debug"); /* * dummy device structure */ static struct { softc_device_decl sc_dev; } nulldev; static device_method_t null_methods = { /* crypto device methods */ DEVMETHOD(cryptodev_newsession, null_newsession), DEVMETHOD(cryptodev_freesession,null_freesession), DEVMETHOD(cryptodev_process, null_process), }; /* * Generate a new software session. */ static int null_newsession(device_t arg, u_int32_t *sid, struct cryptoini *cri) { dprintk("%s()\n", __FUNCTION__); if (sid == NULL || cri == NULL) { dprintk("%s,%d - EINVAL\n", __FILE__, __LINE__); return EINVAL; } if (null_sesnum == 0) null_sesnum++; *sid = null_sesnum++; return 0; } /* * Free a session. */ static int null_freesession(device_t arg, u_int64_t tid) { u_int32_t sid = CRYPTO_SESID2LID(tid); dprintk("%s()\n", __FUNCTION__); if (sid > null_sesnum) { dprintk("%s,%d: EINVAL\n", __FILE__, __LINE__); return EINVAL; } /* Silently accept and return */ if (sid == 0) return 0; return 0; } /* * Process a request. */ static int null_process(device_t arg, struct cryptop *crp, int hint) { unsigned int lid; dprintk("%s()\n", __FUNCTION__); /* Sanity check */ if (crp == NULL) { dprintk("%s,%d: EINVAL\n", __FILE__, __LINE__); return EINVAL; } crp->crp_etype = 0; if (crp->crp_desc == NULL || crp->crp_buf == NULL) { dprintk("%s,%d: EINVAL\n", __FILE__, __LINE__); crp->crp_etype = EINVAL; goto done; } /* * find the session we are using */ lid = crp->crp_sid & 0xffffffff; if (lid >= null_sesnum || lid == 0) { crp->crp_etype = ENOENT; dprintk("%s,%d: ENOENT\n", __FILE__, __LINE__); goto done; } done: crypto_done(crp); return 0; } /* * our driver startup and shutdown routines */ static int null_init(void) { dprintk("%s(%p)\n", __FUNCTION__, null_init); memset(&nulldev, 0, sizeof(nulldev)); softc_device_init(&nulldev, "ocfnull", 0, null_methods); null_id = crypto_get_driverid(softc_get_device(&nulldev), CRYPTOCAP_F_HARDWARE); if (null_id < 0) panic("ocfnull: crypto device cannot initialize!"); #define REGISTER(alg) \ crypto_register(null_id,alg,0,0) REGISTER(CRYPTO_DES_CBC); REGISTER(CRYPTO_3DES_CBC); REGISTER(CRYPTO_RIJNDAEL128_CBC); REGISTER(CRYPTO_MD5); REGISTER(CRYPTO_SHA1); REGISTER(CRYPTO_MD5_HMAC); REGISTER(CRYPTO_SHA1_HMAC); #undef REGISTER return 0; } static void null_exit(void) { dprintk("%s()\n", __FUNCTION__); crypto_unregister_all(null_id); null_id = -1; } module_init(null_init); module_exit(null_exit); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("David McCullough <david_mccullough@mcafee.com>"); MODULE_DESCRIPTION("ocfnull - claims a lot but does nothing");