4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_CRYPTO_SCHED_IMPL_H
27 #define _SYS_CRYPTO_SCHED_IMPL_H
30 * Scheduler internal structures.
37 #include <sys/zfs_context.h>
38 #include <sys/crypto/api.h>
39 #include <sys/crypto/spi.h>
40 #include <sys/crypto/impl.h>
41 #include <sys/crypto/common.h>
43 typedef struct kcf_prov_tried
{
44 kcf_provider_desc_t
*pt_pd
;
45 struct kcf_prov_tried
*pt_next
;
48 #define IS_FG_SUPPORTED(mdesc, fg) \
49 (((mdesc)->pm_mech_info.cm_func_group_mask & (fg)) != 0)
51 #define IS_PROVIDER_TRIED(pd, tlist) \
52 (tlist != NULL && is_in_triedlist(pd, tlist))
54 #define IS_RECOVERABLE(error) \
55 (error == CRYPTO_BUSY || \
56 error == CRYPTO_KEY_SIZE_RANGE)
59 * Internal representation of a canonical context. We contain crypto_ctx_t
60 * structure in order to have just one memory allocation. The SPI
61 * ((crypto_ctx_t *)ctx)->cc_framework_private maps to this structure.
63 typedef struct kcf_context
{
64 crypto_ctx_t kc_glbl_ctx
;
66 kcf_provider_desc_t
*kc_prov_desc
; /* Prov. descriptor */
67 kcf_provider_desc_t
*kc_sw_prov_desc
; /* Prov. descriptor */
71 * Decrement the reference count on the framework private context.
72 * When the last reference is released, the framework private
73 * context structure is freed along with the global context.
75 #define KCF_CONTEXT_REFRELE(ictx) { \
76 ASSERT((ictx)->kc_refcnt != 0); \
78 if (atomic_add_32_nv(&(ictx)->kc_refcnt, -1) == 0) \
79 kcf_free_context(ictx); \
83 * Check if we can release the context now. In case of CRYPTO_BUSY,
84 * the client can retry the request using the context,
85 * so we do not release the context.
87 * This macro should be called only from the final routine in
88 * an init/update/final sequence. We do not release the context in case
89 * of update operations. We require the consumer to free it
90 * explicitly, in case it wants to abandon the operation. This is done
91 * as there may be mechanisms in ECB mode that can continue even if
92 * an operation on a block fails.
94 #define KCF_CONTEXT_COND_RELEASE(rv, kcf_ctx) { \
95 if (KCF_CONTEXT_DONE(rv)) \
96 KCF_CONTEXT_REFRELE(kcf_ctx); \
100 * This macro determines whether we're done with a context.
102 #define KCF_CONTEXT_DONE(rv) \
103 ((rv) != CRYPTO_BUSY && (rv) != CRYPTO_BUFFER_TOO_SMALL)
106 #define KCF_SET_PROVIDER_MECHNUM(fmtype, pd, mechp) \
108 KCF_TO_PROV_MECHNUM(pd, fmtype);
111 * A crypto_ctx_template_t is internally a pointer to this struct
113 typedef struct kcf_ctx_template
{
114 size_t ct_size
; /* for freeing */
115 crypto_spi_ctx_template_t ct_prov_tmpl
; /* context template */
116 /* from the provider */
117 } kcf_ctx_template_t
;
120 extern void kcf_free_triedlist(kcf_prov_tried_t
*);
121 extern kcf_prov_tried_t
*kcf_insert_triedlist(kcf_prov_tried_t
**,
122 kcf_provider_desc_t
*, int);
123 extern kcf_provider_desc_t
*kcf_get_mech_provider(crypto_mech_type_t
,
124 kcf_mech_entry_t
**, int *, kcf_prov_tried_t
*, crypto_func_group_t
);
125 extern crypto_ctx_t
*kcf_new_ctx(kcf_provider_desc_t
*);
126 extern void kcf_sched_destroy(void);
127 extern void kcf_sched_init(void);
128 extern void kcf_free_context(kcf_context_t
*);
134 #endif /* _SYS_CRYPTO_SCHED_IMPL_H */