1 /* $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.41 2009/09/04 09:48:18 pjd Exp $ */
2 /* $OpenBSD: cryptodev.c,v 1.52 2002/06/19 07:22:46 deraadt Exp $ */
5 * Copyright (c) 2001 Theo de Raadt
6 * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 * Effort sponsored in part by the Defense Advanced Research Projects
32 * Agency (DARPA) and Air Force Research Laboratory, Air Force
33 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/malloc.h>
39 #include <sys/device.h>
42 #include <sys/sysctl.h>
44 #include <sys/filedesc.h>
45 #include <sys/errno.h>
47 #include <sys/random.h>
49 #include <sys/module.h>
50 #include <sys/kernel.h>
51 #include <sys/fcntl.h>
54 #include <sys/file2.h>
55 #include <sys/thread2.h>
57 #include <opencrypto/cryptodev.h>
58 #include <opencrypto/xform.h>
61 TAILQ_ENTRY(csession
) next
;
67 struct enc_xform
*txform
;
69 struct auth_hash
*thash
;
73 u_char tmp_iv
[EALG_MAX_BLOCK_LEN
];
85 TAILQ_HEAD(csessionlist
, csession
) csessions
;
89 static int cryptof_rw(struct file
*fp
, struct uio
*uio
,
90 struct ucred
*cred
, int flags
);
91 static int cryptof_ioctl(struct file
*, u_long
, caddr_t
,
92 struct ucred
*, struct sysmsg
*);
93 static int cryptof_kqfilter(struct file
*, struct knote
*);
94 static int cryptof_stat(struct file
*, struct stat
*, struct ucred
*);
95 static int cryptof_close(struct file
*);
97 static struct fileops cryptofops
= {
98 .fo_read
= cryptof_rw
,
99 .fo_write
= cryptof_rw
,
100 .fo_ioctl
= cryptof_ioctl
,
101 .fo_kqfilter
= cryptof_kqfilter
,
102 .fo_stat
= cryptof_stat
,
103 .fo_close
= cryptof_close
,
104 .fo_shutdown
= nofo_shutdown
107 static struct csession
*csefind(struct fcrypt
*, u_int
, int *);
108 static void csedrop(struct csession
*);
109 static int csedelete(struct fcrypt
*, struct csession
*);
110 static struct csession
*cseadd(struct fcrypt
*, struct csession
*);
111 static struct csession
*csecreate(struct fcrypt
*, u_int64_t
, caddr_t
,
112 u_int64_t
, caddr_t
, u_int64_t
, u_int32_t
, u_int32_t
, struct enc_xform
*,
114 static int csefree(struct csession
*);
116 static int cryptodev_op(struct csession
*, struct crypt_op
*, struct ucred
*);
117 static int cryptodev_key(struct crypt_kop
*);
118 static int cryptodev_find(struct crypt_find_op
*);
120 static struct lock cryptodev_lock
= LOCK_INITIALIZER("cryptodev", 0, 0);
126 struct ucred
*active_cred
,
133 * Check a crypto identifier to see if it requested
134 * a software device/driver. This can be done either
135 * by device name/class or through search constraints.
138 checkforsoftware(int crid
)
140 if (crid
& CRYPTOCAP_F_SOFTWARE
)
141 return EINVAL
; /* XXX */
142 if ((crid
& CRYPTOCAP_F_HARDWARE
) == 0 &&
143 (crypto_getcaps(crid
) & CRYPTOCAP_F_HARDWARE
) == 0)
144 return EINVAL
; /* XXX */
150 cryptof_ioctl(struct file
*fp
, u_long cmd
, caddr_t data
,
151 struct ucred
*cred
, struct sysmsg
*msg
)
153 #define SES2(p) ((struct session2_op *)p)
154 struct cryptoini cria
, crie
;
155 struct fcrypt
*fcr
= fp
->f_data
;
156 struct csession
*cse
;
157 struct session_op
*sop
;
158 struct crypt_op
*cop
;
159 struct enc_xform
*txform
= NULL
;
160 struct auth_hash
*thash
= NULL
;
161 struct crypt_kop
*kop
;
169 sop
= (struct session_op
*)data
;
170 switch (sop
->cipher
) {
174 txform
= &enc_xform_des
;
176 case CRYPTO_3DES_CBC
:
177 txform
= &enc_xform_3des
;
180 txform
= &enc_xform_blf
;
182 case CRYPTO_CAST_CBC
:
183 txform
= &enc_xform_cast5
;
185 case CRYPTO_SKIPJACK_CBC
:
186 txform
= &enc_xform_skipjack
;
189 txform
= &enc_xform_rijndael128
;
192 txform
= &enc_xform_aes_xts
;
195 txform
= &enc_xform_aes_ctr
;
197 case CRYPTO_NULL_CBC
:
198 txform
= &enc_xform_null
;
201 txform
= &enc_xform_arc4
;
203 case CRYPTO_CAMELLIA_CBC
:
204 txform
= &enc_xform_camellia
;
206 case CRYPTO_TWOFISH_CBC
:
207 txform
= &enc_xform_twofish
;
209 case CRYPTO_SERPENT_CBC
:
210 txform
= &enc_xform_serpent
;
212 case CRYPTO_TWOFISH_XTS
:
213 txform
= &enc_xform_twofish_xts
;
215 case CRYPTO_SERPENT_XTS
:
216 txform
= &enc_xform_serpent_xts
;
225 case CRYPTO_MD5_HMAC
:
226 thash
= &auth_hash_hmac_md5
;
228 case CRYPTO_SHA1_HMAC
:
229 thash
= &auth_hash_hmac_sha1
;
231 case CRYPTO_SHA2_256_HMAC
:
232 thash
= &auth_hash_hmac_sha2_256
;
234 case CRYPTO_SHA2_384_HMAC
:
235 thash
= &auth_hash_hmac_sha2_384
;
237 case CRYPTO_SHA2_512_HMAC
:
238 thash
= &auth_hash_hmac_sha2_512
;
240 case CRYPTO_RIPEMD160_HMAC
:
241 thash
= &auth_hash_hmac_ripemd_160
;
245 thash
= &auth_hash_md5
;
248 thash
= &auth_hash_sha1
;
251 case CRYPTO_NULL_HMAC
:
252 thash
= &auth_hash_null
;
258 bzero(&crie
, sizeof(crie
));
259 bzero(&cria
, sizeof(cria
));
262 crie
.cri_alg
= txform
->type
;
263 crie
.cri_klen
= sop
->keylen
* 8;
264 if (sop
->keylen
> txform
->maxkey
||
265 sop
->keylen
< txform
->minkey
) {
270 crie
.cri_key
= kmalloc(crie
.cri_klen
/ 8,
272 if ((error
= copyin(sop
->key
, crie
.cri_key
,
276 crie
.cri_next
= &cria
;
280 cria
.cri_alg
= thash
->type
;
281 cria
.cri_klen
= sop
->mackeylen
* 8;
282 if (sop
->mackeylen
!= thash
->keysize
) {
288 cria
.cri_key
= kmalloc(cria
.cri_klen
/ 8,
290 if ((error
= copyin(sop
->mackey
, cria
.cri_key
,
296 /* NB: CIOGSESSION2 has the crid */
297 if (cmd
== CIOCGSESSION2
) {
298 crid
= SES2(sop
)->crid
;
299 error
= checkforsoftware(crid
);
303 crid
= CRYPTOCAP_F_HARDWARE
;
304 if (crypto_devallowsoft
)
305 crid
|= CRYPTOCAP_F_SOFTWARE
;
307 error
= crypto_newsession(&sid
, (txform
? &crie
: &cria
), crid
);
311 lockmgr(&cryptodev_lock
, LK_EXCLUSIVE
);
312 cse
= csecreate(fcr
, sid
, crie
.cri_key
, crie
.cri_klen
,
313 cria
.cri_key
, cria
.cri_klen
, sop
->cipher
,
314 sop
->mac
, txform
, thash
);
315 lockmgr(&cryptodev_lock
, LK_RELEASE
);
318 crypto_freesession(sid
);
323 if (cmd
== CIOCGSESSION2
) {
324 /* return hardware/driver id */
325 SES2(sop
)->crid
= CRYPTO_SESID2HID(cse
->sid
);
330 bzero(crie
.cri_key
, crie
.cri_klen
/ 8);
331 kfree(crie
.cri_key
, M_XDATA
);
334 bzero(cria
.cri_key
, cria
.cri_klen
/ 8);
335 kfree(cria
.cri_key
, M_XDATA
);
340 lockmgr(&cryptodev_lock
, LK_EXCLUSIVE
);
341 ses
= *(u_int32_t
*)data
;
342 cse
= csefind(fcr
, ses
, &error
);
345 error
= csefree(cse
);
347 lockmgr(&cryptodev_lock
, LK_RELEASE
);
350 cop
= (struct crypt_op
*)data
;
351 lockmgr(&cryptodev_lock
, LK_EXCLUSIVE
);
352 cse
= csefind(fcr
, cop
->ses
, &error
);
353 lockmgr(&cryptodev_lock
, LK_RELEASE
);
355 error
= cryptodev_op(cse
, cop
, cred
);
361 if (!crypto_userasymcrypto
)
362 return (EPERM
); /* XXX compat? */
363 lockmgr(&cryptodev_lock
, LK_EXCLUSIVE
);
364 kop
= (struct crypt_kop
*)data
;
365 if (cmd
== CIOCKEY
) {
366 /* NB: crypto core enforces s/w driver use */
368 CRYPTOCAP_F_HARDWARE
| CRYPTOCAP_F_SOFTWARE
;
370 error
= cryptodev_key(kop
);
371 lockmgr(&cryptodev_lock
, LK_RELEASE
);
374 if (!crypto_userasymcrypto
) {
376 * NB: if user asym crypto operations are
377 * not permitted return "no algorithms"
378 * so well-behaved applications will just
379 * fallback to doing them in software.
383 error
= crypto_getfeat((int *)data
);
387 error
= cryptodev_find((struct crypt_find_op
*)data
);
397 static int cryptodev_cb(void *);
400 cryptodev_op(struct csession
*cse
, struct crypt_op
*cop
,
401 struct ucred
*active_cred
)
403 struct cryptop
*crp
= NULL
;
404 struct cryptodesc
*crde
= NULL
, *crda
= NULL
;
407 if (cop
->len
> 256*1024-4)
411 if (cop
->len
== 0 || (cop
->len
% cse
->txform
->blocksize
) != 0)
415 bzero(&cse
->uio
, sizeof(cse
->uio
));
416 cse
->uio
.uio_iov
= &cse
->iovec
;
417 cse
->uio
.uio_iovcnt
= 1;
418 cse
->uio
.uio_offset
= 0;
419 cse
->uio
.uio_resid
= cop
->len
;
420 cse
->uio
.uio_segflg
= UIO_SYSSPACE
;
421 cse
->uio
.uio_rw
= UIO_WRITE
;
422 /* XXX: not sure, was td, now curthread? */
423 cse
->uio
.uio_td
= curthread
;
424 cse
->uio
.uio_iov
[0].iov_len
= cop
->len
;
426 cse
->uio
.uio_iov
[0].iov_len
+= cse
->thash
->hashsize
;
427 cse
->uio
.uio_resid
+= cse
->thash
->hashsize
;
429 cse
->uio
.uio_iov
[0].iov_base
= kmalloc(cse
->uio
.uio_iov
[0].iov_len
,
432 crp
= crypto_getreq((cse
->txform
!= NULL
) + (cse
->thash
!= NULL
));
439 crda
= crp
->crp_desc
;
441 crde
= crda
->crd_next
;
444 crde
= crp
->crp_desc
;
451 if ((error
= copyin(cop
->src
, cse
->uio
.uio_iov
[0].iov_base
, cop
->len
)))
456 crda
->crd_len
= cop
->len
;
457 crda
->crd_inject
= cop
->len
;
459 crda
->crd_alg
= cse
->mac
;
460 crda
->crd_key
= cse
->mackey
;
461 crda
->crd_klen
= cse
->mackeylen
* 8;
465 if (cop
->op
== COP_ENCRYPT
)
466 crde
->crd_flags
|= CRD_F_ENCRYPT
;
468 crde
->crd_flags
&= ~CRD_F_ENCRYPT
;
469 crde
->crd_len
= cop
->len
;
470 crde
->crd_inject
= 0;
472 crde
->crd_alg
= cse
->cipher
;
473 crde
->crd_key
= cse
->key
;
474 crde
->crd_klen
= cse
->keylen
* 8;
477 crp
->crp_ilen
= cop
->len
;
478 crp
->crp_flags
= CRYPTO_F_IOV
| CRYPTO_F_CBIMM
479 | (cop
->flags
& COP_F_BATCH
);
480 crp
->crp_buf
= (caddr_t
)&cse
->uio
;
481 crp
->crp_callback
= (int (*) (struct cryptop
*)) cryptodev_cb
;
482 crp
->crp_sid
= cse
->sid
;
483 crp
->crp_opaque
= (void *)cse
;
490 if (cse
->cipher
== CRYPTO_ARC4
) { /* XXX use flag? */
494 if ((error
= copyin(cop
->iv
, cse
->tmp_iv
, cse
->txform
->blocksize
)))
496 bcopy(cse
->tmp_iv
, crde
->crd_iv
, cse
->txform
->blocksize
);
497 crde
->crd_flags
|= CRD_F_IV_EXPLICIT
| CRD_F_IV_PRESENT
;
499 } else if (cse
->cipher
== CRYPTO_ARC4
) { /* XXX use flag? */
502 crde
->crd_flags
|= CRD_F_IV_PRESENT
;
503 crde
->crd_skip
= cse
->txform
->blocksize
;
504 crde
->crd_len
-= cse
->txform
->blocksize
;
507 if (cop
->mac
&& crda
== NULL
) {
514 * Let the dispatch run unlocked, then, interlock against the
515 * callback before checking if the operation completed and going
516 * to sleep. This insures drivers don't inherit our lock which
517 * results in a lock order reversal between crypto_dispatch forced
518 * entry and the crypto_done callback into us.
520 error
= crypto_dispatch(crp
);
521 lockmgr(&cse
->lock
, LK_EXCLUSIVE
);
522 if (error
== 0 && (crp
->crp_flags
& CRYPTO_F_DONE
) == 0)
523 error
= lksleep(crp
, &cse
->lock
, 0, "crydev", 0);
524 lockmgr(&cse
->lock
, LK_RELEASE
);
529 if (crp
->crp_etype
== EAGAIN
) {
531 crp
->crp_flags
&= ~CRYPTO_F_DONE
;
535 if (crp
->crp_etype
!= 0) {
536 error
= crp
->crp_etype
;
546 (error
= copyout(cse
->uio
.uio_iov
[0].iov_base
, cop
->dst
, cop
->len
)))
550 (error
= copyout((caddr_t
)cse
->uio
.uio_iov
[0].iov_base
+ cop
->len
,
551 cop
->mac
, cse
->thash
->hashsize
)))
557 if (cse
->uio
.uio_iov
[0].iov_base
)
558 kfree(cse
->uio
.uio_iov
[0].iov_base
, M_XDATA
);
564 cryptodev_cb(void *op
)
566 struct cryptop
*crp
= (struct cryptop
*) op
;
567 struct csession
*cse
= (struct csession
*)crp
->crp_opaque
;
569 lockmgr(&cse
->lock
, LK_EXCLUSIVE
);
570 cse
->error
= crp
->crp_etype
;
572 lockmgr(&cse
->lock
, LK_RELEASE
);
577 cryptodevkey_cb(void *op
)
579 struct cryptkop
*krp
= (struct cryptkop
*) op
;
586 cryptodev_key(struct crypt_kop
*kop
)
588 struct cryptkop
*krp
= NULL
;
590 int in
, out
, size
, i
;
592 if (kop
->crk_iparams
+ kop
->crk_oparams
> CRK_MAXPARAM
) {
596 in
= kop
->crk_iparams
;
597 out
= kop
->crk_oparams
;
598 switch (kop
->crk_op
) {
600 if (in
== 3 && out
== 1)
603 case CRK_MOD_EXP_CRT
:
604 if (in
== 6 && out
== 1)
608 if (in
== 5 && out
== 2)
612 if (in
== 7 && out
== 0)
615 case CRK_DH_COMPUTE_KEY
:
616 if (in
== 3 && out
== 1)
623 krp
= (struct cryptkop
*)kmalloc(sizeof *krp
, M_XDATA
, M_WAITOK
| M_ZERO
);
624 krp
->krp_op
= kop
->crk_op
;
625 krp
->krp_status
= kop
->crk_status
;
626 krp
->krp_iparams
= kop
->crk_iparams
;
627 krp
->krp_oparams
= kop
->crk_oparams
;
628 krp
->krp_crid
= kop
->crk_crid
;
630 krp
->krp_callback
= (int (*) (struct cryptkop
*)) cryptodevkey_cb
;
632 for (i
= 0; i
< CRK_MAXPARAM
; i
++) {
633 if (kop
->crk_param
[i
].crp_nbits
> 65536)
634 /* Limit is the same as in OpenBSD */
636 krp
->krp_param
[i
].crp_nbits
= kop
->crk_param
[i
].crp_nbits
;
638 for (i
= 0; i
< krp
->krp_iparams
+ krp
->krp_oparams
; i
++) {
639 size
= (krp
->krp_param
[i
].crp_nbits
+ 7) / 8;
642 krp
->krp_param
[i
].crp_p
= kmalloc(size
, M_XDATA
, M_WAITOK
);
643 if (i
>= krp
->krp_iparams
)
645 error
= copyin(kop
->crk_param
[i
].crp_p
, krp
->krp_param
[i
].crp_p
, size
);
650 error
= crypto_kdispatch(krp
);
653 error
= tsleep(krp
, 0, "crydev", 0);
655 /* XXX can this happen? if so, how do we recover? */
659 kop
->crk_crid
= krp
->krp_crid
; /* device that did the work */
660 if (krp
->krp_status
!= 0) {
661 error
= krp
->krp_status
;
665 for (i
= krp
->krp_iparams
; i
< krp
->krp_iparams
+ krp
->krp_oparams
; i
++) {
666 size
= (krp
->krp_param
[i
].crp_nbits
+ 7) / 8;
669 error
= copyout(krp
->krp_param
[i
].crp_p
, kop
->crk_param
[i
].crp_p
, size
);
676 kop
->crk_status
= krp
->krp_status
;
677 for (i
= 0; i
< CRK_MAXPARAM
; i
++) {
678 if (krp
->krp_param
[i
].crp_p
) {
679 bzero(krp
->krp_param
[i
].crp_p
,
680 (krp
->krp_param
[i
].crp_nbits
+ 7) / 8);
681 kfree(krp
->krp_param
[i
].crp_p
, M_XDATA
);
690 cryptodev_find(struct crypt_find_op
*find
)
694 if (find
->crid
!= -1) {
695 dev
= crypto_find_device_byhid(find
->crid
);
698 strlcpy(find
->name
, device_get_nameunit(dev
),
701 find
->crid
= crypto_find_driver(find
->name
);
702 if (find
->crid
== -1)
712 cryptof_kqfilter(struct file
*fp
, struct knote
*kn
)
722 cryptof_stat(struct file
*fp
, struct stat
*sb
, struct ucred
*cred
)
728 cryptof_close(struct file
*fp
)
730 struct fcrypt
*fcr
= fp
->f_data
;
731 struct csession
*cse
;
733 lockmgr(&cryptodev_lock
, LK_EXCLUSIVE
);
734 fcr
= (struct fcrypt
*)fp
->f_data
;
735 while ((cse
= TAILQ_FIRST(&fcr
->csessions
))) {
736 TAILQ_REMOVE(&fcr
->csessions
, cse
, next
);
740 lockmgr(&cryptodev_lock
, LK_RELEASE
);
746 static struct csession
*
747 csefind(struct fcrypt
*fcr
, u_int ses
, int *errorp
)
749 struct csession
*cse
;
751 TAILQ_FOREACH(cse
, &fcr
->csessions
, next
) {
752 if (cse
->ses
== ses
) {
754 kprintf("csefind: cse %p BUSY\n", cse
);
767 csedrop(struct csession
*cse
)
773 csedelete(struct fcrypt
*fcr
, struct csession
*cse_del
)
775 struct csession
*cse
;
777 TAILQ_FOREACH(cse
, &fcr
->csessions
, next
) {
778 if (cse
== cse_del
) {
779 TAILQ_REMOVE(&fcr
->csessions
, cse
, next
);
786 static struct csession
*
787 cseadd(struct fcrypt
*fcr
, struct csession
*cse
)
789 TAILQ_INSERT_TAIL(&fcr
->csessions
, cse
, next
);
790 cse
->ses
= fcr
->sesn
++;
795 csecreate(struct fcrypt
*fcr
, u_int64_t sid
, caddr_t key
, u_int64_t keylen
,
796 caddr_t mackey
, u_int64_t mackeylen
, u_int32_t cipher
, u_int32_t mac
,
797 struct enc_xform
*txform
, struct auth_hash
*thash
)
799 struct csession
*cse
;
801 cse
= kmalloc(sizeof(struct csession
), M_XDATA
, M_WAITOK
| M_ZERO
);
802 lockinit(&cse
->lock
, "cryptodev", 0, LK_CANRECURSE
);
804 cse
->keylen
= keylen
/8;
805 cse
->mackey
= mackey
;
806 cse
->mackeylen
= mackeylen
/8;
808 cse
->cipher
= cipher
;
810 cse
->txform
= txform
;
817 csefree(struct csession
*cse
)
821 error
= crypto_freesession(cse
->sid
);
822 lockuninit(&cse
->lock
);
824 kfree(cse
->key
, M_XDATA
);
826 kfree(cse
->mackey
, M_XDATA
);
832 cryptoopen(struct dev_open_args
*ap
)
838 cryptoread(struct dev_read_args
*ap
)
844 cryptowrite(struct dev_write_args
*ap
)
850 cryptoioctl(struct dev_ioctl_args
*ap
)
852 struct thread
*td
= curthread
;
859 fcr
= kmalloc(sizeof(struct fcrypt
), M_XDATA
, M_WAITOK
);
860 TAILQ_INIT(&fcr
->csessions
);
863 KKASSERT(td
->td_lwp
);
864 error
= falloc(td
->td_lwp
, &f
, &fd
);
870 /* falloc automatically provides an extra reference to 'f'. */
871 f
->f_flag
= FREAD
| FWRITE
;
872 f
->f_type
= DTYPE_CRYPTO
;
873 f
->f_ops
= &cryptofops
;
875 fsetfd(td
->td_proc
->p_fd
, f
, fd
);
876 *(u_int32_t
*)ap
->a_data
= fd
;
881 error
= cryptodev_find((struct crypt_find_op
*)ap
->a_data
);
884 error
= crypto_getfeat((int *)ap
->a_data
);
893 static struct dev_ops crypto_ops
= {
894 { "crypto", 0, D_MPSAFE
},
895 .d_open
= cryptoopen
,
896 .d_read
= cryptoread
,
897 .d_write
= cryptowrite
,
898 .d_ioctl
= cryptoioctl
,
902 * Initialization code, both for static and dynamic loading.
905 cryptodev_modevent(module_t mod
, int type
, void *unused
)
910 kprintf("crypto: <crypto device>\n");
911 make_dev(&crypto_ops
, 0, UID_ROOT
, GID_WHEEL
,
915 /*XXX disallow if active sessions */
916 //dev_ops_remove(&crypto_ops, 0, 0);
917 dev_ops_remove_all(&crypto_ops
);
923 static moduledata_t cryptodev_mod
= {
928 MODULE_VERSION(cryptodev
, 1);
929 DECLARE_MODULE(cryptodev
, cryptodev_mod
, SI_SUB_PSEUDO
, SI_ORDER_ANY
);
930 MODULE_DEPEND(cryptodev
, crypto
, 1, 1, 1);