1 /* $NetBSD: ocryptodev.c,v 1.1 2009/03/25 01:26:13 darran 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 $ */
6 * Copyright (c) 2008 The NetBSD Foundation, Inc.
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Coyote Point Systems, Inc.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
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.
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.
35 * Copyright (c) 2001 Theo de Raadt
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
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.
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.
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.
67 * Implement backward compatibility IOCTLs in this module.
71 #include <sys/cdefs.h>
72 __KERNEL_RCSID(0, "$NetBSD: ocryptodev.c,v 1.1 2009/03/25 01:26:13 darran Exp $");
74 #include <sys/param.h>
75 #include <sys/systm.h>
77 #include <sys/malloc.h>
80 #include <sys/sysctl.h>
82 #include <sys/filedesc.h>
83 #include <sys/errno.h>
87 #include <sys/device.h>
88 #include <sys/kauth.h>
89 #include <sys/select.h>
91 #include <sys/atomic.h>
94 #include <opencrypto/cryptodev.h>
95 #include <opencrypto/ocryptodev.h>
96 #include <opencrypto/xform.h>
98 static int ocryptodev_op(struct csession
*, struct ocrypt_op
*,
100 static int ocryptodev_mop(struct fcrypt
*, struct ocrypt_n_op
*, int,
102 static int ocryptodev_session(struct fcrypt
*, struct osession_op
*);
103 static int ocryptodev_msession(struct fcrypt
*, struct osession_n_op
*, int);
106 ocryptof_ioctl(struct file
*fp
, u_long cmd
, void *data
)
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
;
121 osop
= (struct osession_op
*)data
;
122 error
= ocryptodev_session(fcr
, osop
);
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
));
134 error
= ocryptodev_msession(fcr
, osnop
, osgop
->count
);
139 error
= copyout(osnop
, osgop
->sessions
, osgop
->count
*
140 sizeof(struct osession_n_op
));
142 kmem_free(osnop
, osgop
->count
* sizeof(struct osession_n_op
));
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
);
150 DPRINTF(("csefind failed\n"));
153 error
= ocryptodev_op(cse
, ocop
, curlwp
);
154 DPRINTF(("ocryptodev_op error = %d\n", error
));
157 omop
= (struct ocrypt_mop
*)data
;
158 ocnop
= kmem_alloc((omop
->count
* sizeof(struct ocrypt_n_op
)),
160 error
= copyin(omop
->reqs
, ocnop
,
161 (omop
->count
* sizeof(struct ocrypt_n_op
)));
163 error
= ocryptodev_mop(fcr
, ocnop
, omop
->count
, curlwp
);
165 error
= copyout(ocnop
, omop
->reqs
,
166 (omop
->count
* sizeof(struct ocrypt_n_op
)));
169 kmem_free(ocnop
, (omop
->count
* sizeof(struct ocrypt_n_op
)));
172 DPRINTF(("invalid ioctl cmd 0x%lx\n", cmd
));
180 ocryptodev_op(struct csession
*cse
, struct ocrypt_op
*ocop
, struct lwp
*l
)
186 cop
.flags
= ocop
->flags
;
194 return cryptodev_op(cse
, &cop
, l
);
198 ocryptodev_mop(struct fcrypt
*fcr
,
199 struct ocrypt_n_op
*ocnop
,
200 int count
, struct lwp
*l
)
204 struct crypt_n_op cnop
;
206 cnop
.ses
= ocnop
->ses
;
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
;
222 res
= cryptodev_mop(fcr
, &cnop
, count
, l
);
223 ocnop
->reqid
= cnop
.reqid
;
224 ocnop
->status
= cnop
.status
;
231 ocryptodev_session(struct fcrypt
*fcr
, struct osession_op
*osop
)
233 struct session_op sop
;
236 sop
.cipher
= osop
->cipher
;
239 sop
.keylen
= osop
->keylen
;
241 sop
.mackeylen
= osop
->mackeylen
;
242 sop
.mackey
= osop
->mackey
;
243 res
= cryptodev_session(fcr
, &sop
);
250 ocryptodev_msession(struct fcrypt
*fcr
, struct osession_n_op
*osn_ops
,
255 for (i
= 0; i
< count
; i
++, osn_ops
++) {
256 struct osession_op os_op
;
257 os_op
.cipher
= osn_ops
->cipher
;
258 os_op
.mac
= osn_ops
->mac
;
259 os_op
.keylen
= osn_ops
->keylen
;
260 os_op
.key
= osn_ops
->key
;
261 os_op
.mackeylen
= osn_ops
->mackeylen
;
262 os_op
.mackey
= osn_ops
->mackey
;
264 osn_ops
->status
= ocryptodev_session(fcr
, &os_op
);
265 osn_ops
->ses
= os_op
.ses
;