123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /*
- * 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");
|