xref: /freebsd/sys/contrib/openzfs/include/sys/sha2.h (revision 2a58b312)
1*2a58b312SMartin Matuska /*
2*2a58b312SMartin Matuska  * CDDL HEADER START
3*2a58b312SMartin Matuska  *
4*2a58b312SMartin Matuska  * The contents of this file are subject to the terms of the
5*2a58b312SMartin Matuska  * Common Development and Distribution License (the "License").
6*2a58b312SMartin Matuska  * You may not use this file except in compliance with the License.
7*2a58b312SMartin Matuska  *
8*2a58b312SMartin Matuska  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*2a58b312SMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
10*2a58b312SMartin Matuska  * See the License for the specific language governing permissions
11*2a58b312SMartin Matuska  * and limitations under the License.
12*2a58b312SMartin Matuska  *
13*2a58b312SMartin Matuska  * When distributing Covered Code, include this CDDL HEADER in each
14*2a58b312SMartin Matuska  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*2a58b312SMartin Matuska  * If applicable, add the following below this CDDL HEADER, with the
16*2a58b312SMartin Matuska  * fields enclosed by brackets "[]" replaced with your own identifying
17*2a58b312SMartin Matuska  * information: Portions Copyright [yyyy] [name of copyright owner]
18*2a58b312SMartin Matuska  *
19*2a58b312SMartin Matuska  * CDDL HEADER END
20*2a58b312SMartin Matuska  */
21*2a58b312SMartin Matuska 
22*2a58b312SMartin Matuska /*
23*2a58b312SMartin Matuska  * Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
24*2a58b312SMartin Matuska  */
25*2a58b312SMartin Matuska 
26*2a58b312SMartin Matuska #ifndef	_SYS_SHA2_H
27*2a58b312SMartin Matuska #define	_SYS_SHA2_H
28*2a58b312SMartin Matuska 
29*2a58b312SMartin Matuska #ifdef  _KERNEL
30*2a58b312SMartin Matuska #include <sys/types.h>
31*2a58b312SMartin Matuska #else
32*2a58b312SMartin Matuska #include <stdint.h>
33*2a58b312SMartin Matuska #include <stdlib.h>
34*2a58b312SMartin Matuska #endif
35*2a58b312SMartin Matuska 
36*2a58b312SMartin Matuska #ifdef __cplusplus
37*2a58b312SMartin Matuska extern "C" {
38*2a58b312SMartin Matuska #endif
39*2a58b312SMartin Matuska 
40*2a58b312SMartin Matuska #define	SHA224_BLOCK_LENGTH		64
41*2a58b312SMartin Matuska #define	SHA256_BLOCK_LENGTH		64
42*2a58b312SMartin Matuska #define	SHA384_BLOCK_LENGTH		128
43*2a58b312SMartin Matuska #define	SHA512_BLOCK_LENGTH		128
44*2a58b312SMartin Matuska 
45*2a58b312SMartin Matuska #define	SHA224_DIGEST_LENGTH		28
46*2a58b312SMartin Matuska #define	SHA256_DIGEST_LENGTH		32
47*2a58b312SMartin Matuska #define	SHA384_DIGEST_LENGTH		48
48*2a58b312SMartin Matuska #define	SHA512_DIGEST_LENGTH		64
49*2a58b312SMartin Matuska 
50*2a58b312SMartin Matuska #define	SHA512_224_DIGEST_LENGTH	28
51*2a58b312SMartin Matuska #define	SHA512_256_DIGEST_LENGTH	32
52*2a58b312SMartin Matuska 
53*2a58b312SMartin Matuska #define	SHA256_HMAC_BLOCK_SIZE		64
54*2a58b312SMartin Matuska #define	SHA512_HMAC_BLOCK_SIZE		128
55*2a58b312SMartin Matuska 
56*2a58b312SMartin Matuska /* sha256 context */
57*2a58b312SMartin Matuska typedef struct {
58*2a58b312SMartin Matuska 	uint32_t state[8];
59*2a58b312SMartin Matuska 	uint64_t count[2];
60*2a58b312SMartin Matuska 	uint8_t wbuf[64];
61*2a58b312SMartin Matuska 
62*2a58b312SMartin Matuska 	/* const sha256_ops_t *ops */
63*2a58b312SMartin Matuska 	const void *ops;
64*2a58b312SMartin Matuska } sha256_ctx;
65*2a58b312SMartin Matuska 
66*2a58b312SMartin Matuska /* sha512 context */
67*2a58b312SMartin Matuska typedef struct {
68*2a58b312SMartin Matuska 	uint64_t state[8];
69*2a58b312SMartin Matuska 	uint64_t count[2];
70*2a58b312SMartin Matuska 	uint8_t wbuf[128];
71*2a58b312SMartin Matuska 
72*2a58b312SMartin Matuska 	/* const sha256_ops_t *ops */
73*2a58b312SMartin Matuska 	const void *ops;
74*2a58b312SMartin Matuska } sha512_ctx;
75*2a58b312SMartin Matuska 
76*2a58b312SMartin Matuska /* SHA2 context */
77*2a58b312SMartin Matuska typedef struct {
78*2a58b312SMartin Matuska 	union {
79*2a58b312SMartin Matuska 		sha256_ctx sha256;
80*2a58b312SMartin Matuska 		sha512_ctx sha512;
81*2a58b312SMartin Matuska 	};
82*2a58b312SMartin Matuska 
83*2a58b312SMartin Matuska 	/* algorithm type */
84*2a58b312SMartin Matuska 	int algotype;
85*2a58b312SMartin Matuska } SHA2_CTX;
86*2a58b312SMartin Matuska 
87*2a58b312SMartin Matuska /* SHA2 algorithm types */
88*2a58b312SMartin Matuska typedef enum sha2_mech_type {
89*2a58b312SMartin Matuska 	SHA256_MECH_INFO_TYPE,		/* SUN_CKM_SHA256 */
90*2a58b312SMartin Matuska 	SHA256_HMAC_MECH_INFO_TYPE,	/* SUN_CKM_SHA256_HMAC */
91*2a58b312SMartin Matuska 	SHA256_HMAC_GEN_MECH_INFO_TYPE,	/* SUN_CKM_SHA256_HMAC_GENERAL */
92*2a58b312SMartin Matuska 	SHA384_MECH_INFO_TYPE,		/* SUN_CKM_SHA384 */
93*2a58b312SMartin Matuska 	SHA384_HMAC_MECH_INFO_TYPE,	/* SUN_CKM_SHA384_HMAC */
94*2a58b312SMartin Matuska 	SHA384_HMAC_GEN_MECH_INFO_TYPE,	/* SUN_CKM_SHA384_HMAC_GENERAL */
95*2a58b312SMartin Matuska 	SHA512_MECH_INFO_TYPE,		/* SUN_CKM_SHA512 */
96*2a58b312SMartin Matuska 	SHA512_HMAC_MECH_INFO_TYPE,	/* SUN_CKM_SHA512_HMAC */
97*2a58b312SMartin Matuska 	SHA512_HMAC_GEN_MECH_INFO_TYPE,	/* SUN_CKM_SHA512_HMAC_GENERAL */
98*2a58b312SMartin Matuska 	SHA512_224_MECH_INFO_TYPE,	/* SUN_CKM_SHA512_224 */
99*2a58b312SMartin Matuska 	SHA512_256_MECH_INFO_TYPE	/* SUN_CKM_SHA512_256 */
100*2a58b312SMartin Matuska } sha2_mech_type_t;
101*2a58b312SMartin Matuska 
102*2a58b312SMartin Matuska #define	SHA256			0
103*2a58b312SMartin Matuska #define	SHA256_HMAC		1
104*2a58b312SMartin Matuska #define	SHA256_HMAC_GEN		2
105*2a58b312SMartin Matuska #define	SHA384			3
106*2a58b312SMartin Matuska #define	SHA384_HMAC		4
107*2a58b312SMartin Matuska #define	SHA384_HMAC_GEN		5
108*2a58b312SMartin Matuska #define	SHA512			6
109*2a58b312SMartin Matuska #define	SHA512_HMAC		7
110*2a58b312SMartin Matuska #define	SHA512_HMAC_GEN		8
111*2a58b312SMartin Matuska #define	SHA512_224		9
112*2a58b312SMartin Matuska #define	SHA512_256		10
113*2a58b312SMartin Matuska 
114*2a58b312SMartin Matuska /* SHA2 Init function */
115*2a58b312SMartin Matuska extern void SHA2Init(int algotype, SHA2_CTX *ctx);
116*2a58b312SMartin Matuska 
117*2a58b312SMartin Matuska /* SHA2 Update function */
118*2a58b312SMartin Matuska extern void SHA2Update(SHA2_CTX *ctx, const void *data, size_t len);
119*2a58b312SMartin Matuska 
120*2a58b312SMartin Matuska /* SHA2 Final function */
121*2a58b312SMartin Matuska extern void SHA2Final(void *digest, SHA2_CTX *ctx);
122*2a58b312SMartin Matuska 
123*2a58b312SMartin Matuska #ifdef __cplusplus
124*2a58b312SMartin Matuska }
125*2a58b312SMartin Matuska #endif
126*2a58b312SMartin Matuska 
127*2a58b312SMartin Matuska #endif	/* SYS_SHA2_H */
128