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