xref: /freebsd/sys/contrib/openzfs/module/icp/include/modes/gcm_impl.h (revision 271171e0d97b88ba2a7c3bf750c9672b484c1c13)
1eda14cbcSMatt Macy /*
2eda14cbcSMatt Macy  * CDDL HEADER START
3eda14cbcSMatt Macy  *
4eda14cbcSMatt Macy  * The contents of this file are subject to the terms of the
5eda14cbcSMatt Macy  * Common Development and Distribution License (the "License").
6eda14cbcSMatt Macy  * You may not use this file except in compliance with the License.
7eda14cbcSMatt Macy  *
8eda14cbcSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*271171e0SMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
10eda14cbcSMatt Macy  * See the License for the specific language governing permissions
11eda14cbcSMatt Macy  * and limitations under the License.
12eda14cbcSMatt Macy  *
13eda14cbcSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
14eda14cbcSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15eda14cbcSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
16eda14cbcSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
17eda14cbcSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
18eda14cbcSMatt Macy  *
19eda14cbcSMatt Macy  * CDDL HEADER END
20eda14cbcSMatt Macy  */
21eda14cbcSMatt Macy /*
22eda14cbcSMatt Macy  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23eda14cbcSMatt Macy  */
24eda14cbcSMatt Macy 
25eda14cbcSMatt Macy #ifndef	_GCM_IMPL_H
26eda14cbcSMatt Macy #define	_GCM_IMPL_H
27eda14cbcSMatt Macy 
28eda14cbcSMatt Macy /*
29eda14cbcSMatt Macy  * GCM function dispatcher.
30eda14cbcSMatt Macy  */
31eda14cbcSMatt Macy 
32eda14cbcSMatt Macy #ifdef	__cplusplus
33eda14cbcSMatt Macy extern "C" {
34eda14cbcSMatt Macy #endif
35eda14cbcSMatt Macy 
36eda14cbcSMatt Macy #include <sys/zfs_context.h>
37eda14cbcSMatt Macy #include <sys/crypto/common.h>
38eda14cbcSMatt Macy 
39eda14cbcSMatt Macy /*
40eda14cbcSMatt Macy  * Methods used to define GCM implementation
41eda14cbcSMatt Macy  *
42eda14cbcSMatt Macy  * @gcm_mul_f Perform carry-less multiplication
43eda14cbcSMatt Macy  * @gcm_will_work_f Function tests whether implementation will function
44eda14cbcSMatt Macy  */
45eda14cbcSMatt Macy typedef void		(*gcm_mul_f)(uint64_t *, uint64_t *, uint64_t *);
46eda14cbcSMatt Macy typedef boolean_t	(*gcm_will_work_f)(void);
47eda14cbcSMatt Macy 
48eda14cbcSMatt Macy #define	GCM_IMPL_NAME_MAX (16)
49eda14cbcSMatt Macy 
50eda14cbcSMatt Macy typedef struct gcm_impl_ops {
51eda14cbcSMatt Macy 	gcm_mul_f mul;
52eda14cbcSMatt Macy 	gcm_will_work_f is_supported;
53eda14cbcSMatt Macy 	char name[GCM_IMPL_NAME_MAX];
54eda14cbcSMatt Macy } gcm_impl_ops_t;
55eda14cbcSMatt Macy 
56eda14cbcSMatt Macy extern const gcm_impl_ops_t gcm_generic_impl;
57eda14cbcSMatt Macy #if defined(__x86_64) && defined(HAVE_PCLMULQDQ)
58eda14cbcSMatt Macy extern const gcm_impl_ops_t gcm_pclmulqdq_impl;
59eda14cbcSMatt Macy #endif
60eda14cbcSMatt Macy 
61eda14cbcSMatt Macy /*
62eda14cbcSMatt Macy  * Initializes fastest implementation
63eda14cbcSMatt Macy  */
64eda14cbcSMatt Macy void gcm_impl_init(void);
65eda14cbcSMatt Macy 
66eda14cbcSMatt Macy /*
67eda14cbcSMatt Macy  * Returns optimal allowed GCM implementation
68eda14cbcSMatt Macy  */
69eda14cbcSMatt Macy const struct gcm_impl_ops *gcm_impl_get_ops(void);
70eda14cbcSMatt Macy 
71eda14cbcSMatt Macy #ifdef	__cplusplus
72eda14cbcSMatt Macy }
73eda14cbcSMatt Macy #endif
74eda14cbcSMatt Macy 
75eda14cbcSMatt Macy #endif	/* _GCM_IMPL_H */
76