Fix O_APPEND for Linux 3.15 and older kernels
[zfs.git] / module / icp / include / sys / crypto / spi.h
blobef525265747ef730f489048396cc7547313a2e93
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_CRYPTO_SPI_H
27 #define _SYS_CRYPTO_SPI_H
30 * CSPI: Cryptographic Service Provider Interface.
33 #include <sys/zfs_context.h>
34 #include <sys/crypto/common.h>
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
40 #ifdef CONSTIFY_PLUGIN
41 #define __no_const __attribute__((no_const))
42 #else
43 #define __no_const
44 #endif /* CONSTIFY_PLUGIN */
47 * Context templates can be used to by providers to pre-process
48 * keying material, such as key schedules. They are allocated by
49 * a provider create_ctx_template(9E) entry point, and passed
50 * as argument to initialization and atomic provider entry points.
52 typedef void *crypto_spi_ctx_template_t;
55 * The context structure is passed from the kernel to a provider.
56 * It contains the information needed to process a multi-part or
57 * single part operation. The context structure is not used
58 * by atomic operations.
60 * Parameters needed to perform a cryptographic operation, such
61 * as keys, mechanisms, input and output buffers, are passed
62 * as separate arguments to Provider routines.
64 typedef struct crypto_ctx {
65 void *cc_provider_private; /* owned by provider */
66 void *cc_framework_private; /* owned by framework */
67 } crypto_ctx_t;
70 * The crypto_digest_ops structure contains pointers to digest
71 * operations for cryptographic providers. It is passed through
72 * the crypto_ops(9S) structure when providers register with the
73 * kernel using crypto_register_provider(9F).
75 typedef struct crypto_digest_ops {
76 int (*digest_init)(crypto_ctx_t *, crypto_mechanism_t *);
77 int (*digest)(crypto_ctx_t *, crypto_data_t *, crypto_data_t *);
78 int (*digest_update)(crypto_ctx_t *, crypto_data_t *);
79 int (*digest_key)(crypto_ctx_t *, crypto_key_t *);
80 int (*digest_final)(crypto_ctx_t *, crypto_data_t *);
81 int (*digest_atomic)(crypto_mechanism_t *, crypto_data_t *,
82 crypto_data_t *);
83 } __no_const crypto_digest_ops_t;
86 * The crypto_cipher_ops structure contains pointers to encryption
87 * and decryption operations for cryptographic providers. It is
88 * passed through the crypto_ops(9S) structure when providers register
89 * with the kernel using crypto_register_provider(9F).
91 typedef struct crypto_cipher_ops {
92 int (*encrypt_init)(crypto_ctx_t *,
93 crypto_mechanism_t *, crypto_key_t *,
94 crypto_spi_ctx_template_t);
95 int (*encrypt)(crypto_ctx_t *,
96 crypto_data_t *, crypto_data_t *);
97 int (*encrypt_update)(crypto_ctx_t *,
98 crypto_data_t *, crypto_data_t *);
99 int (*encrypt_final)(crypto_ctx_t *,
100 crypto_data_t *);
101 int (*encrypt_atomic)(crypto_mechanism_t *, crypto_key_t *,
102 crypto_data_t *, crypto_data_t *, crypto_spi_ctx_template_t);
104 int (*decrypt_init)(crypto_ctx_t *,
105 crypto_mechanism_t *, crypto_key_t *,
106 crypto_spi_ctx_template_t);
107 int (*decrypt)(crypto_ctx_t *,
108 crypto_data_t *, crypto_data_t *);
109 int (*decrypt_update)(crypto_ctx_t *,
110 crypto_data_t *, crypto_data_t *);
111 int (*decrypt_final)(crypto_ctx_t *,
112 crypto_data_t *);
113 int (*decrypt_atomic)(crypto_mechanism_t *, crypto_key_t *,
114 crypto_data_t *, crypto_data_t *, crypto_spi_ctx_template_t);
115 } __no_const crypto_cipher_ops_t;
118 * The crypto_mac_ops structure contains pointers to MAC
119 * operations for cryptographic providers. It is passed through
120 * the crypto_ops(9S) structure when providers register with the
121 * kernel using crypto_register_provider(9F).
123 typedef struct crypto_mac_ops {
124 int (*mac_init)(crypto_ctx_t *,
125 crypto_mechanism_t *, crypto_key_t *,
126 crypto_spi_ctx_template_t);
127 int (*mac)(crypto_ctx_t *,
128 crypto_data_t *, crypto_data_t *);
129 int (*mac_update)(crypto_ctx_t *,
130 crypto_data_t *);
131 int (*mac_final)(crypto_ctx_t *,
132 crypto_data_t *);
133 int (*mac_atomic)(crypto_mechanism_t *, crypto_key_t *,
134 crypto_data_t *, crypto_data_t *, crypto_spi_ctx_template_t);
135 int (*mac_verify_atomic)(crypto_mechanism_t *, crypto_key_t *,
136 crypto_data_t *, crypto_data_t *, crypto_spi_ctx_template_t);
137 } __no_const crypto_mac_ops_t;
140 * The crypto_ctx_ops structure contains points to context and context
141 * templates management operations for cryptographic providers. It is
142 * passed through the crypto_ops(9S) structure when providers register
143 * with the kernel using crypto_register_provider(9F).
145 typedef struct crypto_ctx_ops {
146 int (*create_ctx_template)(crypto_mechanism_t *, crypto_key_t *,
147 crypto_spi_ctx_template_t *, size_t *);
148 int (*free_context)(crypto_ctx_t *);
149 } __no_const crypto_ctx_ops_t;
152 * The crypto_ops(9S) structure contains the structures containing
153 * the pointers to functions implemented by cryptographic providers.
154 * It is specified as part of the crypto_provider_info(9S)
155 * supplied by a provider when it registers with the kernel
156 * by calling crypto_register_provider(9F).
158 typedef struct crypto_ops {
159 const crypto_digest_ops_t *co_digest_ops;
160 const crypto_cipher_ops_t *co_cipher_ops;
161 const crypto_mac_ops_t *co_mac_ops;
162 const crypto_ctx_ops_t *co_ctx_ops;
163 } crypto_ops_t;
166 * The mechanism info structure crypto_mech_info_t contains a function group
167 * bit mask cm_func_group_mask. This field, of type crypto_func_group_t,
168 * specifies the provider entry point that can be used a particular
169 * mechanism. The function group mask is a combination of the following values.
172 typedef uint32_t crypto_func_group_t;
175 #define CRYPTO_FG_ENCRYPT 0x00000001 /* encrypt_init() */
176 #define CRYPTO_FG_DECRYPT 0x00000002 /* decrypt_init() */
177 #define CRYPTO_FG_DIGEST 0x00000004 /* digest_init() */
178 #define CRYPTO_FG_MAC 0x00001000 /* mac_init() */
179 #define CRYPTO_FG_ENCRYPT_ATOMIC 0x00008000 /* encrypt_atomic() */
180 #define CRYPTO_FG_DECRYPT_ATOMIC 0x00010000 /* decrypt_atomic() */
181 #define CRYPTO_FG_MAC_ATOMIC 0x00020000 /* mac_atomic() */
182 #define CRYPTO_FG_DIGEST_ATOMIC 0x00040000 /* digest_atomic() */
185 * Maximum length of the pi_provider_description field of the
186 * crypto_provider_info structure.
188 #define CRYPTO_PROVIDER_DESCR_MAX_LEN 64
192 * The crypto_mech_info structure specifies one of the mechanisms
193 * supported by a cryptographic provider. The pi_mechanisms field of
194 * the crypto_provider_info structure contains a pointer to an array
195 * of crypto_mech_info's.
197 typedef struct crypto_mech_info {
198 crypto_mech_name_t cm_mech_name;
199 crypto_mech_type_t cm_mech_number;
200 crypto_func_group_t cm_func_group_mask;
201 } crypto_mech_info_t;
204 * crypto_kcf_provider_handle_t is a handle allocated by the kernel.
205 * It is returned after the provider registers with
206 * crypto_register_provider(), and must be specified by the provider
207 * when calling crypto_unregister_provider(), and
208 * crypto_provider_notification().
210 typedef uint_t crypto_kcf_provider_handle_t;
213 * Provider information. Passed as argument to crypto_register_provider(9F).
214 * Describes the provider and its capabilities.
216 typedef struct crypto_provider_info {
217 const char *pi_provider_description;
218 const crypto_ops_t *pi_ops_vector;
219 uint_t pi_mech_list_count;
220 const crypto_mech_info_t *pi_mechanisms;
221 } crypto_provider_info_t;
224 * Functions exported by Solaris to cryptographic providers. Providers
225 * call these functions to register and unregister, notify the kernel
226 * of state changes, and notify the kernel when a asynchronous request
227 * completed.
229 extern int crypto_register_provider(const crypto_provider_info_t *,
230 crypto_kcf_provider_handle_t *);
231 extern int crypto_unregister_provider(crypto_kcf_provider_handle_t);
234 #ifdef __cplusplus
236 #endif
238 #endif /* _SYS_CRYPTO_SPI_H */