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.17 2022/03/12 17:15:04 riastradh 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.17 2022/03/12 17:15:04 riastradh 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 #include <sys/compat_stub.h> 
   93 #include <sys/module.h>
   94 
   95 #ifdef _KERNEL_OPT
   96 #include "opt_ocf.h"
   97 #endif
   98 
   99 #include <opencrypto/cryptodev.h>
  100 #include <opencrypto/cryptodev_internal.h>
  101 #include <opencrypto/ocryptodev.h>
  102 #include <opencrypto/xform.h>
  103 
  104 static int      ocryptodev_op(struct csession *, struct ocrypt_op *,
  105                     struct lwp *);
  106 static int      ocryptodev_mop(struct fcrypt *, struct ocrypt_n_op *, int,
  107                     struct lwp *);
  108 static int      ocryptodev_session(struct fcrypt *, struct osession_op *);
  109 static int      ocryptodev_msession(struct fcrypt *, struct osession_n_op *,
  110                     int);
  111 
  112 int
  113 ocryptof_ioctl(struct file *fp, u_long cmd, void *data)
  114 {
  115         struct fcrypt *fcr = fp->f_fcrypt;
  116         struct csession *cse;
  117         struct osession_op *osop;
  118         struct osession_n_op *osnop;
  119         struct ocrypt_op *ocop;
  120         struct ocrypt_mop *omop;
  121         struct ocrypt_n_op *ocnop;
  122         struct ocrypt_sgop *osgop;
  123 
  124         int error = 0;
  125 
  126         switch (cmd) {
  127         case OCIOCGSESSION:
  128                 osop = (struct osession_op *)data;
  129                 error = ocryptodev_session(fcr, osop);
  130                 break;
  131         case CIOCNGSESSION:
  132                 osgop = (struct ocrypt_sgop *)data;
  133                 if ((osgop->count <= 0) ||
  134                     (SIZE_MAX/sizeof(struct osession_n_op) < osgop->count)) {
  135                         error = EINVAL;
  136                         break;
  137                 }
  138                 osnop = kmem_alloc((osgop->count *
  139                                   sizeof(struct osession_n_op)), KM_SLEEP);
  140                 error = copyin(osgop->sessions, osnop, osgop->count *
  141                                sizeof(struct osession_n_op));
  142                 if (error) {
  143                         goto mbail;
  144                 }
  145 
  146                 error = ocryptodev_msession(fcr, osnop, osgop->count);
  147                 if (error) {
  148                         goto mbail;
  149                 }
  150 
  151                 error = copyout(osnop, osgop->sessions, osgop->count *
  152                     sizeof(struct osession_n_op));
  153 mbail:
  154                 kmem_free(osnop, osgop->count * sizeof(struct osession_n_op));
  155                 break;
  156         case OCIOCCRYPT:
  157                 mutex_enter(&cryptodev_mtx);
  158                 ocop = (struct ocrypt_op *)data;
  159                 cse = cryptodev_csefind(fcr, ocop->ses);
  160                 mutex_exit(&cryptodev_mtx);
  161                 if (cse == NULL) {
  162                         DPRINTF("csefind failed\n");
  163                         return EINVAL;
  164                 }
  165                 error = ocryptodev_op(cse, ocop, curlwp);
  166                 DPRINTF("ocryptodev_op error = %d\n", error);
  167                 break;
  168         case OCIOCNCRYPTM:
  169                 omop = (struct ocrypt_mop *)data;
  170                 if (omop->count <= 0 || omop->count > 1) {
  171                         error = EINVAL;
  172                         break;
  173                 }
  174                 ocnop = kmem_alloc((omop->count * sizeof(struct ocrypt_n_op)),
  175                     KM_SLEEP);
  176                 error = copyin(omop->reqs, ocnop,
  177                     (omop->count * sizeof(struct ocrypt_n_op)));
  178                 if(!error) {
  179                         error = ocryptodev_mop(fcr, ocnop, omop->count,
  180                             curlwp);
  181                         if (!error) {
  182                                 error = copyout(ocnop, omop->reqs, 
  183                                     (omop->count * sizeof(struct ocrypt_n_op)));
  184                         }
  185                 }
  186                 kmem_free(ocnop, (omop->count * sizeof(struct ocrypt_n_op)));
  187                 break;  
  188         default:
  189                 DPRINTF("invalid ioctl cmd 0x%lx\n", cmd);
  190                 return EINVAL;
  191         }
  192         return error;
  193 }
  194 
  195 
  196 static int
  197 ocryptodev_op(struct csession *cse, struct ocrypt_op *ocop, struct lwp *l)
  198 {
  199         struct crypt_op cop;
  200 
  201         cop.ses = ocop->ses;
  202         cop.op = ocop->op;
  203         cop.flags = ocop->flags;
  204         cop.len = ocop->len;
  205         cop.src = ocop->src;
  206         cop.dst = ocop->dst;
  207         cop.mac = ocop->mac;
  208         cop.iv = ocop->iv;
  209         cop.dst_len = 0;
  210 
  211         return cryptodev_op(cse, &cop, l);
  212 };
  213 
  214 static int 
  215 ocryptodev_mop(struct fcrypt *fcr, struct ocrypt_n_op *ocnop, int count,
  216     struct lwp *l)
  217 {
  218         int res;
  219 
  220         struct crypt_n_op cnop;
  221 
  222         cnop.ses = ocnop->ses;
  223         cnop.op = ocnop->op;
  224         cnop.flags = ocnop->flags;
  225         cnop.len = ocnop->len;
  226         cnop.reqid = ocnop->reqid;
  227         cnop.status = ocnop->status;
  228         cnop.opaque = ocnop->opaque;
  229         cnop.keylen = ocnop->keylen;
  230         cnop.key = ocnop->key;
  231         cnop.mackeylen = ocnop->mackeylen;
  232         cnop.mackey = ocnop->mackey;
  233         cnop.src = ocnop->src;
  234         cnop.dst = ocnop->dst;
  235         cnop.mac = ocnop->mac;
  236         cnop.iv = ocnop->iv;
  237         cnop.dst_len = 0;
  238         res = cryptodev_mop(fcr, &cnop, count, l);
  239         ocnop->reqid = cnop.reqid;
  240         ocnop->status = cnop.status;
  241 
  242         return res;
  243 };
  244 
  245 
  246 static int
  247 ocryptodev_session(struct fcrypt *fcr, struct osession_op *osop)
  248 {
  249         struct session_op sop;
  250         int res;
  251 
  252         sop.cipher = osop->cipher;
  253         sop.mac = osop->mac;
  254         sop.comp_alg = 0;
  255         sop.keylen = osop->keylen;
  256         sop.key = osop->key;
  257         sop.mackeylen = osop->mackeylen;
  258         sop.mackey = osop->mackey;
  259         res = cryptodev_session(fcr, &sop);
  260         if (res)
  261                 return res;
  262         osop->ses = sop.ses;
  263         return 0;
  264 
  265 }
  266 
  267 static int
  268 ocryptodev_msession(struct fcrypt *fcr, struct osession_n_op *osn_ops,
  269                    int count)
  270 {
  271         int i;
  272 
  273         for (i = 0; i < count; i++, osn_ops++) {
  274                 struct osession_op os_op;
  275                 os_op.cipher =          osn_ops->cipher;
  276                 os_op.mac =             osn_ops->mac;
  277                 os_op.keylen =          osn_ops->keylen;
  278                 os_op.key =             osn_ops->key;
  279                 os_op.mackeylen =       osn_ops->mackeylen;
  280                 os_op.mackey =          osn_ops->mackey;
  281                 os_op.ses =             ~0;
  282 
  283                 osn_ops->status = ocryptodev_session(fcr, &os_op);
  284                 osn_ops->ses =          os_op.ses;
  285         }
  286 
  287         return 0;
  288 }

Cache object: ea2e51a02c4dc604b61becfbd9b0067a


[ 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.