The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/opencrypto/ocryptodev.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: ocryptodev.c,v 1.2.4.2 2009/05/03 17:24:45 snj Exp $ */
    2 /*      $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $        */
    3 /*      $OpenBSD: cryptodev.c,v 1.53 2002/07/10 22:21:30 mickey Exp $   */
    4 
    5 /*-
    6  * Copyright (c) 2008 The NetBSD Foundation, Inc.
    7  * All rights reserved.
    8  *
    9  * This code is derived from software contributed to The NetBSD Foundation
   10  * by Coyote Point Systems, Inc.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31  * POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 /*
   35  * Copyright (c) 2001 Theo de Raadt
   36  *
   37  * Redistribution and use in source and binary forms, with or without
   38  * modification, are permitted provided that the following conditions
   39  * are met:
   40  *
   41  * 1. Redistributions of source code must retain the above copyright
   42  *   notice, this list of conditions and the following disclaimer.
   43  * 2. Redistributions in binary form must reproduce the above copyright
   44  *   notice, this list of conditions and the following disclaimer in the
   45  *   documentation and/or other materials provided with the distribution.
   46  * 3. The name of the author may not be used to endorse or promote products
   47  *   derived from this software without specific prior written permission.
   48  *
   49  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   50  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   51  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   52  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   53  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   54  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   55  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   56  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   57  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   58  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   59  *
   60  * Effort sponsored in part by the Defense Advanced Research Projects
   61  * Agency (DARPA) and Air Force Research Laboratory, Air Force
   62  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
   63  *
   64  */
   65 
   66 /*
   67  * Implement backward compatibility IOCTLs in this module.
   68  *
   69  */
   70 
   71 #include <sys/cdefs.h>
   72 __KERNEL_RCSID(0, "$NetBSD: ocryptodev.c,v 1.2.4.2 2009/05/03 17:24:45 snj Exp $");
   73 
   74 #include <sys/param.h>
   75 #include <sys/systm.h>
   76 #include <sys/kmem.h>
   77 #include <sys/malloc.h>
   78 #include <sys/mbuf.h>
   79 #include <sys/pool.h>
   80 #include <sys/sysctl.h>
   81 #include <sys/file.h>
   82 #include <sys/filedesc.h>
   83 #include <sys/errno.h>
   84 #include <sys/md5.h>
   85 #include <sys/sha1.h>
   86 #include <sys/conf.h>
   87 #include <sys/device.h>
   88 #include <sys/kauth.h>
   89 #include <sys/select.h>
   90 #include <sys/poll.h>
   91 #include <sys/atomic.h>
   92 
   93 #include "opt_ocf.h"
   94 #include <opencrypto/cryptodev.h>
   95 #include <opencrypto/ocryptodev.h>
   96 #include <opencrypto/xform.h>
   97 
   98 static int      ocryptodev_op(struct csession *, struct ocrypt_op *,
   99                     struct lwp *);
  100 static int      ocryptodev_mop(struct fcrypt *, struct ocrypt_n_op *, int,
  101                     struct lwp *);
  102 static int      ocryptodev_session(struct fcrypt *, struct osession_op *);
  103 static int      ocryptodev_msession(struct fcrypt *, struct osession_n_op *, int);
  104 
  105 int
  106 ocryptof_ioctl(struct file *fp, u_long cmd, void *data)
  107 {
  108         struct fcrypt *fcr = fp->f_data;
  109         struct csession *cse;
  110         struct osession_op *osop;
  111         struct osession_n_op *osnop;
  112         struct ocrypt_op *ocop;
  113         struct ocrypt_mop *omop;
  114         struct ocrypt_n_op *ocnop;
  115         struct ocrypt_sgop *osgop;
  116 
  117         int error = 0;
  118 
  119         switch (cmd) {
  120         case OCIOCGSESSION:
  121                 osop = (struct osession_op *)data;
  122                 error = ocryptodev_session(fcr, osop);
  123                 break;
  124         case CIOCNGSESSION:
  125                 osgop = (struct ocrypt_sgop *)data;
  126                 osnop = kmem_alloc((osgop->count *
  127                                   sizeof(struct osession_n_op)), KM_SLEEP);
  128                 error = copyin(osgop->sessions, osnop, osgop->count *
  129                                sizeof(struct osession_n_op));
  130                 if (error) {
  131                         goto mbail;
  132                 }
  133 
  134                 error = ocryptodev_msession(fcr, osnop, osgop->count);
  135                 if (error) {
  136                         goto mbail;
  137                 }
  138 
  139                 error = copyout(osnop, osgop->sessions, osgop->count *
  140                     sizeof(struct osession_n_op));
  141 mbail:
  142                 kmem_free(osnop, osgop->count * sizeof(struct osession_n_op));
  143                 break;
  144         case OCIOCCRYPT:
  145                 mutex_spin_enter(&crypto_mtx);
  146                 ocop = (struct ocrypt_op *)data;
  147                 cse = cryptodev_csefind(fcr, ocop->ses);
  148                 mutex_spin_exit(&crypto_mtx);
  149                 if (cse == NULL) {
  150                         DPRINTF(("csefind failed\n"));
  151                         return EINVAL;
  152                 }
  153                 error = ocryptodev_op(cse, ocop, curlwp);
  154                 DPRINTF(("ocryptodev_op error = %d\n", error));
  155                 break;
  156         case OCIOCNCRYPTM:
  157                 omop = (struct ocrypt_mop *)data;
  158                 ocnop = kmem_alloc((omop->count * sizeof(struct ocrypt_n_op)),
  159                     KM_SLEEP);
  160                 error = copyin(omop->reqs, ocnop,
  161                     (omop->count * sizeof(struct ocrypt_n_op)));
  162                 if(!error) {
  163                         error = ocryptodev_mop(fcr, ocnop, omop->count, curlwp);
  164                         if (!error) {
  165                                 error = copyout(ocnop, omop->reqs, 
  166                                     (omop->count * sizeof(struct ocrypt_n_op)));
  167                         }
  168                 }
  169                 kmem_free(ocnop, (omop->count * sizeof(struct ocrypt_n_op)));
  170                 break;  
  171         default:
  172                 DPRINTF(("invalid ioctl cmd 0x%lx\n", cmd));
  173                 return EINVAL;
  174         }
  175         return error;
  176 }
  177 
  178 
  179 static int
  180 ocryptodev_op(struct csession *cse, struct ocrypt_op *ocop, struct lwp *l)
  181 {
  182         struct crypt_op cop;
  183 
  184         cop.ses = ocop->ses;
  185         cop.op = ocop->op;
  186         cop.flags = ocop->flags;
  187         cop.len = ocop->len;
  188         cop.src = ocop->src;
  189         cop.dst = ocop->dst;
  190         cop.mac = ocop->mac;
  191         cop.iv = ocop->iv;
  192         cop.dst_len = 0;
  193 
  194         return cryptodev_op(cse, &cop, l);
  195 };
  196 
  197 static int 
  198 ocryptodev_mop(struct fcrypt *fcr, 
  199               struct ocrypt_n_op *ocnop,
  200               int count, struct lwp *l)
  201 {
  202         int res;
  203 
  204         struct crypt_n_op cnop;
  205 
  206         cnop.ses = ocnop->ses;
  207         cnop.op = ocnop->op;
  208         cnop.flags = ocnop->flags;
  209         cnop.len = ocnop->len;
  210         cnop.reqid = ocnop->reqid;
  211         cnop.status = ocnop->status;
  212         cnop.opaque = ocnop->opaque;
  213         cnop.keylen = ocnop->keylen;
  214         cnop.key = ocnop->key;
  215         cnop.mackeylen = ocnop->mackeylen;
  216         cnop.mackey = ocnop->mackey;
  217         cnop.src = ocnop->src;
  218         cnop.dst = ocnop->dst;
  219         cnop.mac = ocnop->mac;
  220         cnop.iv = ocnop->iv;
  221         cnop.dst_len = 0;
  222         res = cryptodev_mop(fcr, &cnop, count, l);
  223         ocnop->reqid = cnop.reqid;
  224         ocnop->status = cnop.status;
  225 
  226         return res;
  227 };
  228 
  229 
  230 static int
  231 ocryptodev_session(struct fcrypt *fcr, struct osession_op *osop) 
  232 {
  233         struct session_op sop;
  234         int res;
  235 
  236         sop.cipher = osop->cipher;
  237         sop.mac = osop->mac;
  238         sop.comp_alg = 0;
  239         sop.keylen = osop->keylen;
  240         sop.key = osop->key;
  241         sop.mackeylen = osop->mackeylen;
  242         sop.mackey = osop->mackey;
  243         sop.ses = osop->ses;
  244         res = cryptodev_session(fcr, &sop);
  245         osop->ses = sop.ses;
  246         return res;
  247 
  248 }
  249 
  250 static int
  251 ocryptodev_msession(struct fcrypt *fcr, struct osession_n_op *osn_ops,
  252                    int count)
  253 {
  254         int i;
  255 
  256         for (i = 0; i < count; i++, osn_ops++) {
  257                 struct osession_op os_op;
  258                 os_op.cipher =          osn_ops->cipher;
  259                 os_op.mac =             osn_ops->mac;
  260                 os_op.keylen =          osn_ops->keylen;
  261                 os_op.key =             osn_ops->key;
  262                 os_op.mackeylen =       osn_ops->mackeylen;
  263                 os_op.mackey =          osn_ops->mackey;
  264 
  265                 osn_ops->status = ocryptodev_session(fcr, &os_op);
  266                 osn_ops->ses =          os_op.ses;
  267         }
  268 
  269         return 0;
  270 }

Cache object: 2ca45ef5b751e53369a0fe0b9ddeb339


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.