Home | History | Annotate | Download | only in fips
      1 /*
      2  * CDDL HEADER START
      3  *
      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.
      7  *
      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.
     12  *
     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]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include <sys/types.h>
     27 #include <sys/errno.h>
     28 #include <sys/kmem.h>
     29 #include <sys/systm.h>
     30 #define	_SHA2_IMPL
     31 #include <sys/sha2.h>
     32 #include <sys/crypto/common.h>
     33 #include <sys/cmn_err.h>
     34 #ifndef _KERNEL
     35 #include <stdlib.h>
     36 #include <string.h>
     37 #include <strings.h>
     38 #include <stdio.h>
     39 #include <security/cryptoki.h>
     40 #include <cryptoutil.h>
     41 #include "softMAC.h"
     42 #endif
     43 #include <sha2/sha2_impl.h>
     44 
     45 
     46 /*
     47  * fips_sha2_build_context()
     48  *
     49  * Description:
     50  *	This function allocates and initializes SHA2 context.
     51  */
     52 #ifndef _KERNEL
     53 SHA2_CTX *
     54 fips_sha2_build_context(CK_MECHANISM_TYPE mechanism)
     55 {
     56 	SHA2_CTX *sha2_context;
     57 
     58 	if ((sha2_context = malloc(sizeof (SHA2_CTX))) == NULL)
     59 		return (NULL);
     60 
     61 	switch (mechanism) {
     62 	case CKM_SHA256:
     63 		SHA2Init(SHA256, sha2_context);
     64 		break;
     65 
     66 	case CKM_SHA384:
     67 		SHA2Init(SHA384, sha2_context);
     68 		break;
     69 
     70 	case CKM_SHA512:
     71 		SHA2Init(SHA512, sha2_context);
     72 		break;
     73 	}
     74 
     75 	return (sha2_context);
     76 }
     77 
     78 #else
     79 SHA2_CTX *
     80 fips_sha2_build_context(sha2_mech_t mechanism)
     81 {
     82 	SHA2_CTX *sha2_context;
     83 
     84 	if ((sha2_context = kmem_zalloc(sizeof (SHA2_CTX),
     85 	    KM_SLEEP)) == NULL)
     86 		return (NULL);
     87 
     88 	switch (mechanism) {
     89 	case SHA256_TYPE:
     90 		SHA2Init(SHA256, sha2_context);
     91 		break;
     92 
     93 	case SHA384_TYPE:
     94 		SHA2Init(SHA384, sha2_context);
     95 		break;
     96 
     97 	case SHA512_TYPE:
     98 		SHA2Init(SHA512, sha2_context);
     99 		break;
    100 	}
    101 
    102 	return (sha2_context);
    103 }
    104 #endif
    105 
    106 /*
    107  * fips_sha2_hash()
    108  *
    109  * Arguments:
    110  *	sha2_context:	pointer to SHA2 context
    111  *	in:	pointer to the input data to be hashed
    112  *	inlen:	length of the input data
    113  *	out:	pointer to the output data after hashing
    114  *
    115  * Description:
    116  *	This function calls the low-level SHA2 routines for hashing.
    117  *
    118  */
    119 int
    120 fips_sha2_hash(SHA2_CTX *sha2_context, uchar_t *in,
    121 	ulong_t inlen, uchar_t *out)
    122 {
    123 
    124 	int rv;
    125 
    126 	if (in != NULL) {
    127 		SHA2Update((SHA2_CTX *)sha2_context, in, inlen);
    128 		SHA2Final(out, (SHA2_CTX *)sha2_context);
    129 		rv = CKR_OK;
    130 	} else {
    131 		rv = CKR_ARGUMENTS_BAD;
    132 	}
    133 
    134 	if (sha2_context)
    135 #ifdef _KERNEL
    136 		kmem_free(sha2_context, sizeof (SHA2_CTX));
    137 #else
    138 		free(sha2_context);
    139 #endif
    140 	return (rv);
    141 
    142 }
    143 
    144 #ifndef _KERNEL
    145 soft_hmac_ctx_t *
    146 fips_sha2_hmac_build_context(CK_MECHANISM_TYPE mechanism,
    147 	uint8_t *secret_key,
    148 	unsigned int secret_key_length)
    149 {
    150 
    151 	soft_hmac_ctx_t *hmac_ctx;
    152 
    153 	hmac_ctx = malloc(sizeof (soft_hmac_ctx_t));
    154 
    155 	if (hmac_ctx == NULL) {
    156 		return (NULL);
    157 	}
    158 
    159 	switch (mechanism) {
    160 	case CKM_SHA256_HMAC:
    161 	{
    162 		uint64_t sha_ipad[SHA256_HMAC_INTS_PER_BLOCK];
    163 		uint64_t sha_opad[SHA256_HMAC_INTS_PER_BLOCK];
    164 
    165 		hmac_ctx->hmac_len = SHA256_DIGEST_LENGTH;
    166 		bzero(sha_ipad, SHA256_HMAC_BLOCK_SIZE);
    167 		bzero(sha_opad, SHA256_HMAC_BLOCK_SIZE);
    168 
    169 		(void) memcpy(sha_ipad, secret_key, secret_key_length);
    170 		(void) memcpy(sha_opad, secret_key, secret_key_length);
    171 
    172 		sha2_hmac_ctx_init(CKM_TO_SHA2(mechanism),
    173 		    &hmac_ctx->hc_ctx_u.sha2_ctx,
    174 		    sha_ipad, sha_opad,
    175 		    SHA256_HMAC_INTS_PER_BLOCK,
    176 		    SHA256_HMAC_BLOCK_SIZE);
    177 
    178 		break;
    179 	}
    180 
    181 	case CKM_SHA384_HMAC:
    182 	{
    183 		uint64_t sha_ipad[SHA512_HMAC_INTS_PER_BLOCK];
    184 		uint64_t sha_opad[SHA512_HMAC_INTS_PER_BLOCK];
    185 
    186 		hmac_ctx->hmac_len = SHA384_DIGEST_LENGTH;
    187 		bzero(sha_ipad, SHA512_HMAC_BLOCK_SIZE);
    188 		bzero(sha_opad, SHA512_HMAC_BLOCK_SIZE);
    189 
    190 		(void) memcpy(sha_ipad, secret_key, secret_key_length);
    191 		(void) memcpy(sha_opad, secret_key, secret_key_length);
    192 
    193 		sha2_hmac_ctx_init(CKM_TO_SHA2(mechanism),
    194 		    &hmac_ctx->hc_ctx_u.sha2_ctx,
    195 		    sha_ipad, sha_opad,
    196 		    SHA512_HMAC_INTS_PER_BLOCK,
    197 		    SHA512_HMAC_BLOCK_SIZE);
    198 		break;
    199 	}
    200 
    201 	case CKM_SHA512_HMAC:
    202 	{
    203 		uint64_t sha_ipad[SHA512_HMAC_INTS_PER_BLOCK];
    204 		uint64_t sha_opad[SHA512_HMAC_INTS_PER_BLOCK];
    205 
    206 		hmac_ctx->hmac_len = SHA512_DIGEST_LENGTH;
    207 		bzero(sha_ipad, SHA512_HMAC_BLOCK_SIZE);
    208 		bzero(sha_opad, SHA512_HMAC_BLOCK_SIZE);
    209 
    210 		(void) memcpy(sha_ipad, secret_key, secret_key_length);
    211 		(void) memcpy(sha_opad, secret_key, secret_key_length);
    212 
    213 		sha2_hmac_ctx_init(CKM_TO_SHA2(mechanism),
    214 		    &hmac_ctx->hc_ctx_u.sha2_ctx,
    215 		    sha_ipad, sha_opad,
    216 		    SHA512_HMAC_INTS_PER_BLOCK,
    217 		    SHA512_HMAC_BLOCK_SIZE);
    218 
    219 		break;
    220 	}
    221 	}
    222 
    223 	return (hmac_ctx);
    224 }
    225 
    226 CK_RV
    227 fips_hmac_sha2_hash(unsigned char *hmac_computed,
    228 	uint8_t *secret_key,
    229 	unsigned int secret_key_length,
    230 	uint8_t *message,
    231 	unsigned int message_length,
    232 	CK_MECHANISM_TYPE mechanism)
    233 {
    234 
    235 	soft_hmac_ctx_t *hmac_ctx = NULL;
    236 
    237 	hmac_ctx = fips_sha2_hmac_build_context(mechanism,
    238 	    secret_key, secret_key_length);
    239 
    240 	if (hmac_ctx == NULL)
    241 		return (CKR_HOST_MEMORY);
    242 
    243 	switch (mechanism) {
    244 	case CKM_SHA256_HMAC:
    245 		if (message != NULL)
    246 			SHA2Update(&(hmac_ctx->hc_ctx_u.sha2_ctx.hc_icontext),
    247 			    message, message_length);
    248 
    249 		SOFT_MAC_FINAL_2(SHA256, &(hmac_ctx->hc_ctx_u.sha2_ctx),
    250 		    hmac_computed);
    251 		break;
    252 
    253 	case CKM_SHA384_HMAC:
    254 		if (message != NULL)
    255 			SHA2Update(&(hmac_ctx->hc_ctx_u.sha2_ctx.hc_icontext),
    256 			    message, message_length);
    257 
    258 		SOFT_MAC_FINAL_2(SHA384, &(hmac_ctx->hc_ctx_u.sha2_ctx),
    259 		    hmac_computed);
    260 		break;
    261 
    262 	case CKM_SHA512_HMAC:
    263 		if (message != NULL)
    264 			SHA2Update(&(hmac_ctx->hc_ctx_u.sha2_ctx.hc_icontext),
    265 			    message, message_length);
    266 
    267 		SOFT_MAC_FINAL_2(SHA512, &(hmac_ctx->hc_ctx_u.sha2_ctx),
    268 		    hmac_computed);
    269 		break;
    270 	}
    271 
    272 	free(hmac_ctx);
    273 	return (CKR_OK);
    274 }
    275 
    276 #else
    277 
    278 /*
    279  * Initialize a SHA2-HMAC context.
    280  */
    281 void
    282 sha2_mac_init_ctx(sha2_hmac_ctx_t *ctx, void *keyval, uint_t length_in_bytes)
    283 {
    284 	uint64_t ipad[SHA512_HMAC_BLOCK_SIZE / sizeof (uint64_t)];
    285 	uint64_t opad[SHA512_HMAC_BLOCK_SIZE / sizeof (uint64_t)];
    286 	int i, block_size, blocks_per_int64;
    287 
    288 	/* Determine the block size */
    289 	if (ctx->hc_mech_type <= SHA256_HMAC_GEN_MECH_INFO_TYPE) {
    290 		block_size = SHA256_HMAC_BLOCK_SIZE;
    291 		blocks_per_int64 = SHA256_HMAC_BLOCK_SIZE / sizeof (uint64_t);
    292 	} else {
    293 		block_size = SHA512_HMAC_BLOCK_SIZE;
    294 		blocks_per_int64 = SHA512_HMAC_BLOCK_SIZE / sizeof (uint64_t);
    295 	}
    296 
    297 	(void) bzero(ipad, block_size);
    298 	(void) bzero(opad, block_size);
    299 	(void) bcopy(keyval, ipad, length_in_bytes);
    300 	(void) bcopy(keyval, opad, length_in_bytes);
    301 
    302 	/* XOR key with ipad (0x36) and opad (0x5c) */
    303 	for (i = 0; i < blocks_per_int64; i ++) {
    304 		ipad[i] ^= 0x3636363636363636;
    305 		opad[i] ^= 0x5c5c5c5c5c5c5c5c;
    306 	}
    307 
    308 	/* perform SHA2 on ipad */
    309 	SHA2Init(ctx->hc_mech_type, &ctx->hc_icontext);
    310 	SHA2Update(&ctx->hc_icontext, (uint8_t *)ipad, block_size);
    311 
    312 	/* perform SHA2 on opad */
    313 	SHA2Init(ctx->hc_mech_type, &ctx->hc_ocontext);
    314 	SHA2Update(&ctx->hc_ocontext, (uint8_t *)opad, block_size);
    315 
    316 }
    317 
    318 sha2_hmac_ctx_t *
    319 fips_sha2_hmac_build_context(sha2_mech_t mechanism,
    320 	uint8_t *secret_key,
    321 	unsigned int secret_key_length)
    322 {
    323 	sha2_hmac_ctx_t *sha2_hmac_ctx_tmpl;
    324 
    325 	/*
    326 	 * Allocate and initialize SHA2 context.
    327 	 */
    328 	sha2_hmac_ctx_tmpl = kmem_alloc(sizeof (sha2_hmac_ctx_t),
    329 	    KM_SLEEP);
    330 	if (sha2_hmac_ctx_tmpl == NULL)
    331 		return (NULL);
    332 
    333 	switch (mechanism) {
    334 	case SHA256_TYPE:
    335 		sha2_hmac_ctx_tmpl->hc_mech_type =
    336 		    SHA256_HMAC_MECH_INFO_TYPE;
    337 		break;
    338 
    339 	case SHA384_TYPE:
    340 		sha2_hmac_ctx_tmpl->hc_mech_type =
    341 		    SHA384_HMAC_MECH_INFO_TYPE;
    342 		break;
    343 
    344 	case SHA512_TYPE:
    345 		sha2_hmac_ctx_tmpl->hc_mech_type =
    346 		    SHA512_HMAC_MECH_INFO_TYPE;
    347 		break;
    348 	}
    349 
    350 	/*
    351 	 * initialize ctx->hc_icontext and ctx->hc_ocontext
    352 	 */
    353 	sha2_mac_init_ctx(sha2_hmac_ctx_tmpl, secret_key,
    354 	    secret_key_length);
    355 
    356 	return (sha2_hmac_ctx_tmpl);
    357 }
    358 
    359 void
    360 fips_hmac_sha2_hash(sha2_hmac_ctx_t *sha2_hmac_ctx,
    361 	uint8_t *message,
    362 	uint32_t message_len,
    363 	uint8_t *hmac_computed,
    364 	sha2_mech_t mechanism)
    365 
    366 {
    367 
    368 	SHA2Update(&((sha2_hmac_ctx)->hc_icontext), message,
    369 	    message_len);
    370 	SHA2Final(hmac_computed, &((sha2_hmac_ctx)->hc_icontext));
    371 
    372 	switch (mechanism) {
    373 	case SHA256_TYPE:
    374 		SHA2Update(&((sha2_hmac_ctx)->hc_ocontext),
    375 		    hmac_computed, SHA256_DIGEST_LENGTH);
    376 		break;
    377 
    378 	case SHA384_TYPE:
    379 		SHA2Update(&((sha2_hmac_ctx)->hc_ocontext),
    380 		    hmac_computed, SHA384_DIGEST_LENGTH);
    381 		break;
    382 
    383 	case SHA512_TYPE:
    384 		SHA2Update(&((sha2_hmac_ctx)->hc_ocontext),
    385 			hmac_computed, SHA512_DIGEST_LENGTH);
    386 		break;
    387 	}
    388 
    389 	SHA2Final(hmac_computed, &((sha2_hmac_ctx)->hc_ocontext));
    390 
    391 	kmem_free(sha2_hmac_ctx, sizeof (sha2_hmac_ctx_t));
    392 }
    393 
    394 #endif
    395 
    396 /*
    397  * SHA2 Power-On SelfTest(s).
    398  */
    399 int
    400 fips_sha2_post(void)
    401 {
    402 
    403 	/*
    404 	 * SHA-256 Known Hash Message (512-bits).
    405 	 * Source from NIST SHA256ShortMsg (Len = 512)
    406 	 */
    407 	static uint8_t sha256_known_hash_message[] = {
    408 		0x35, 0x92, 0xec, 0xfd, 0x1e, 0xac, 0x61, 0x8f,
    409 		0xd3, 0x90, 0xe7, 0xa9, 0xc2, 0x4b, 0x65, 0x65,
    410 		0x32, 0x50, 0x93, 0x67, 0xc2, 0x1a, 0x0e, 0xac,
    411 		0x12, 0x12, 0xac, 0x83, 0xc0, 0xb2, 0x0c, 0xd8,
    412 		0x96, 0xeb, 0x72, 0xb8, 0x01, 0xc4, 0xd2, 0x12,
    413 		0xc5, 0x45, 0x2b, 0xbb, 0xf0, 0x93, 0x17, 0xb5,
    414 		0x0c, 0x5c, 0x9f, 0xb1, 0x99, 0x75, 0x53, 0xd2,
    415 		0xbb, 0xc2, 0x9b, 0xb4, 0x2f, 0x57, 0x48, 0xad
    416 	};
    417 
    418 	/* known SHA256 Digest Message (32 bytes) */
    419 	static uint8_t known_sha256_digest[] = {
    420 		0x10, 0x5a, 0x60, 0x86, 0x58, 0x30, 0xac, 0x3a,
    421 		0x37, 0x1d, 0x38, 0x43, 0x32, 0x4d, 0x4b, 0xb5,
    422 		0xfa, 0x8e, 0xc0, 0xe0, 0x2d, 0xda, 0xa3, 0x89,
    423 		0xad, 0x8d, 0xa4, 0xf1, 0x02, 0x15, 0xc4, 0x54
    424 	};
    425 
    426 	/*
    427 	 * SHA-384 Known Hash Message (512-bits).
    428 	 * Source from NIST SHA384ShortMsg (Len = 512)
    429 	 */
    430 	static uint8_t sha384_known_hash_message[] = {
    431 		0x58, 0xbe, 0xab, 0xf9, 0x79, 0xab, 0x35, 0xab,
    432 		0xba, 0x29, 0x37, 0x6d, 0x5d, 0xc2, 0x27, 0xab,
    433 		0xb3, 0xd2, 0xff, 0x4d, 0x90, 0x30, 0x49, 0x82,
    434 		0xfc, 0x10, 0x79, 0xbc, 0x2b, 0x28, 0x80, 0xfc,
    435 		0xb0, 0x12, 0x9e, 0x4f, 0xed, 0xf2, 0x78, 0x98,
    436 		0xce, 0x58, 0x6a, 0x91, 0xb7, 0x68, 0x1e, 0x0d,
    437 		0xba, 0x38, 0x5e, 0x80, 0x0e, 0x79, 0x26, 0xc0,
    438 		0xbc, 0x5a, 0xfe, 0x0d, 0x9c, 0xa9, 0x86, 0x50
    439 	};
    440 
    441 	/* known SHA384 Digest Message (48 bytes) */
    442 	static uint8_t known_sha384_digest[] = {
    443 		0xa0, 0x88, 0x8e, 0x1c, 0x4d, 0x7e, 0x80, 0xcb,
    444 		0xaa, 0xaf, 0xa8, 0xbb, 0x1c, 0xa1, 0xca, 0x91,
    445 		0x2a, 0x93, 0x21, 0x75, 0xc2, 0xef, 0x98, 0x2c,
    446 		0xe1, 0xf1, 0x23, 0xa8, 0xc1, 0xae, 0xe9, 0x63,
    447 		0x5a, 0xd7, 0x5b, 0xe5, 0x25, 0x90, 0xa9, 0x24,
    448 		0xbe, 0xd3, 0xf5, 0xec, 0x36, 0xc3, 0x56, 0x90
    449 	};
    450 
    451 	/*
    452 	 * SHA-512 Known Hash Message (512-bits).
    453 	 * Source from NIST SHA512ShortMsg (Len = 512)
    454 	 */
    455 	static uint8_t sha512_known_hash_message[] = {
    456 		0x09, 0x5c, 0x7f, 0x30, 0x82, 0x4f, 0xc9, 0x28,
    457 		0x58, 0xcc, 0x93, 0x47, 0xc0, 0x85, 0xd5, 0x78,
    458 		0x88, 0x5f, 0xf3, 0x61, 0x4d, 0xd3, 0x8e, 0xe7,
    459 		0xee, 0x94, 0xa0, 0xf4, 0x40, 0x72, 0xc8, 0x77,
    460 		0x04, 0x7e, 0xe2, 0xad, 0x16, 0x6f, 0xdb, 0xa0,
    461 		0xe7, 0x44, 0xc3, 0xed, 0x2c, 0x2b, 0x24, 0xc9,
    462 		0xd8, 0xa2, 0x93, 0x46, 0x48, 0xdc, 0x84, 0xd3,
    463 		0xbe, 0x66, 0x63, 0x02, 0x11, 0x0a, 0xe0, 0x8f
    464 	};
    465 
    466 	/* known SHA512 Digest Message (64 bytes) */
    467 	static uint8_t known_sha512_digest[] = {
    468 		0xd5, 0xcd, 0xaf, 0x83, 0xbb, 0x4a, 0x27, 0xea,
    469 		0xad, 0x8d, 0x8f, 0x18, 0xe4, 0xbe, 0xe9, 0xc2,
    470 		0x5b, 0xe9, 0x49, 0xa7, 0x61, 0xa0, 0xfd, 0x0f,
    471 		0xb2, 0x28, 0x4c, 0xab, 0x14, 0x3c, 0xad, 0x60,
    472 		0xbe, 0xb5, 0x68, 0x87, 0x34, 0xb2, 0xf8, 0x1e,
    473 		0x9e, 0x2d, 0x64, 0x0b, 0x42, 0x5f, 0xd3, 0x2c,
    474 		0xcb, 0x3d, 0x20, 0xd0, 0x2d, 0x63, 0xc2, 0xc9,
    475 		0x4c, 0x03, 0xab, 0x3d, 0x9e, 0x7d, 0x9b, 0x4a
    476 	};
    477 
    478 	/* SHA-2 HMAC Test Vectors */
    479 
    480 	/*
    481 	 * SHA-256 HMAC Known Hash Message (512-bits).
    482 	 */
    483 	static uint8_t sha256_hmac_known_hash_message[] = {
    484 		0x54, 0x68, 0x65, 0x20, 0x74, 0x65, 0x73, 0x74,
    485 		0x20, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
    486 		0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65,
    487 		0x20, 0x4D, 0x44, 0x32, 0x2C, 0x20, 0x4D, 0x44,
    488 		0x35, 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x53,
    489 		0x48, 0x41, 0x2D, 0x31, 0x20, 0x68, 0x61, 0x73,
    490 		0x68, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x6C, 0x67,
    491 		0x6F, 0x72, 0x69, 0x74, 0x68, 0x6D, 0x73, 0x2E
    492 	};
    493 
    494 	static uint8_t sha256_hmac_known_secret_key[] = {
    495 		0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
    496 		0x74, 0x68, 0x65, 0x20, 0x53, 0x48, 0x41, 0x2D,
    497 		0x32, 0x35, 0x36, 0x20, 0x48, 0x4D, 0x41, 0x43,
    498 		0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20,
    499 		0x6B, 0x65, 0x79, 0x21
    500 	};
    501 
    502 	static uint8_t sha256_hmac_known_secret_key_length
    503 	    = sizeof (sha256_hmac_known_secret_key);
    504 
    505 
    506 	/* known SHA256 hmac (32 bytes) */
    507 	static uint8_t known_sha256_hmac[] = {
    508 		0x02, 0x87, 0x21, 0x93, 0x84, 0x8a, 0x35, 0xae,
    509 		0xdb, 0xb6, 0x79, 0x26, 0x96, 0xf0, 0x50, 0xeb,
    510 		0x33, 0x49, 0x57, 0xf1, 0xb2, 0x32, 0xd3, 0x63,
    511 		0x03, 0x65, 0x57, 0xa2, 0xba, 0xa2, 0x5f, 0x35
    512 	};
    513 
    514 	/*
    515 	 * SHA-384 HMAC Known Hash Message (512-bits).
    516 	 * Source from NIST HMAC.txt (Count = 15, Klen = 16, Tlen = 48)
    517 	 */
    518 	static uint8_t sha384_hmac_known_secret_key[] = {
    519 		0x01, 0xac, 0x59, 0xf4, 0x2f, 0x8b, 0xb9, 0x1d,
    520 		0x1b, 0xd1, 0x0f, 0xe6, 0x99, 0x0d, 0x7a, 0x87
    521 	};
    522 
    523 	static uint8_t sha384_hmac_known_secret_key_length
    524 	    = sizeof (sha384_hmac_known_secret_key);
    525 
    526 	static uint8_t sha384_hmac_known_hash_message[] = {
    527 		0x3c, 0xaf, 0x18, 0xc4, 0x76, 0xed, 0xd5, 0x61,
    528 		0x5f, 0x34, 0x3a, 0xc7, 0xb7, 0xd3, 0xa9, 0xda,
    529 		0x9e, 0xfa, 0xde, 0x75, 0x56, 0x72, 0xd5, 0xba,
    530 		0x4b, 0x8a, 0xe8, 0xa7, 0x50, 0x55, 0x39, 0xea,
    531 		0x2c, 0x12, 0x4f, 0xf7, 0x55, 0xec, 0x04, 0x57,
    532 		0xfb, 0xe4, 0x9e, 0x43, 0x48, 0x0b, 0x3c, 0x71,
    533 		0xe7, 0xf4, 0x74, 0x2e, 0xc3, 0x69, 0x3a, 0xad,
    534 		0x11, 0x5d, 0x03, 0x9f, 0x90, 0x22, 0x2b, 0x03,
    535 		0x0f, 0xdc, 0x94, 0x40, 0x31, 0x36, 0x91, 0x71,
    536 		0x6d, 0x53, 0x02, 0x00, 0x58, 0x08, 0xc0, 0x76,
    537 		0x27, 0x48, 0x3b, 0x91, 0x6f, 0xdf, 0x61, 0x98,
    538 		0x30, 0x63, 0xc2, 0xeb, 0x12, 0x68, 0xf2, 0xde,
    539 		0xee, 0xf4, 0x2f, 0xc7, 0x90, 0x33, 0x44, 0x56,
    540 		0xbc, 0x6b, 0xad, 0x25, 0x6e, 0x31, 0xfc, 0x90,
    541 		0x66, 0xde, 0x7c, 0xc7, 0xe4, 0x3d, 0x13, 0x21,
    542 		0xb1, 0x86, 0x6d, 0xb4, 0x5e, 0x90, 0x56, 0x22
    543 	};
    544 
    545 	/* known SHA384 hmac (48 bytes) */
    546 	static uint8_t known_sha384_hmac[] = {
    547 		0x19, 0x85, 0xfa, 0x21, 0x63, 0xa5, 0x94, 0x3f,
    548 		0xc5, 0xd9, 0x2f, 0x1f, 0xe8, 0x83, 0x12, 0x15,
    549 		0xe7, 0xe9, 0x1f, 0x0b, 0xff, 0x53, 0x32, 0xbc,
    550 		0x71, 0x3a, 0x07, 0x2b, 0xdb, 0x3a, 0x8f, 0x9e,
    551 		0x5c, 0x51, 0x57, 0x46, 0x3a, 0x3b, 0xfe, 0xb3,
    552 		0x62, 0x31, 0x41, 0x6e, 0x65, 0x97, 0x3e, 0x64
    553 	};
    554 
    555 	/*
    556 	 * SHA-512 HMAC Known Hash Message (512-bits).
    557 	 * Source from NIST HMAC.txt (Count = 30, Klen = 20, Tlen = 64)
    558 	 */
    559 	static uint8_t sha512_hmac_known_secret_key[] = {
    560 		0xa7, 0x36, 0xf2, 0x74, 0xfd, 0xa6, 0x8e, 0x1b,
    561 		0xd5, 0xf9, 0x47, 0x1e, 0x85, 0xfd, 0x41, 0x5d,
    562 		0x7f, 0x2b, 0xa1, 0xbc
    563 	};
    564 
    565 	static uint8_t sha512_hmac_known_secret_key_length
    566 	    = sizeof (sha512_hmac_known_secret_key);
    567 
    568 	static uint8_t sha512_hmac_known_hash_message[] = {
    569 		0xa6, 0xcc, 0xc3, 0x55, 0x2c, 0x33, 0xe9, 0x17,
    570 		0x8b, 0x6b, 0x82, 0xc6, 0x53, 0xd6, 0x3d, 0xe2,
    571 		0x54, 0x0f, 0x17, 0x08, 0x07, 0xc3, 0xd9, 0x6a,
    572 		0x2a, 0xc2, 0xe2, 0x7d, 0xab, 0x55, 0x26, 0xf1,
    573 		0xc7, 0xd3, 0x77, 0xe6, 0x73, 0x6f, 0x04, 0x5d,
    574 		0xfb, 0x54, 0x1f, 0xec, 0xe9, 0xf4, 0x43, 0xb7,
    575 		0x28, 0x9c, 0x55, 0x9b, 0x69, 0x4c, 0x2a, 0xac,
    576 		0xc6, 0xc7, 0x4a, 0xe2, 0xa5, 0xe6, 0xf3, 0x0f,
    577 		0xe0, 0x31, 0x61, 0x14, 0x23, 0xb0, 0x4d, 0x55,
    578 		0x95, 0xff, 0xb4, 0x6a, 0xba, 0xa1, 0xd9, 0x18,
    579 		0x98, 0x96, 0x8d, 0x7f, 0x18, 0x30, 0xae, 0x94,
    580 		0xb0, 0x22, 0xee, 0xd2, 0x3f, 0xda, 0xd5, 0x2d,
    581 		0x38, 0x11, 0x0a, 0x48, 0x03, 0xa0, 0xce, 0xe7,
    582 		0xa0, 0x95, 0xc9, 0xa7, 0x8e, 0x86, 0x09, 0xed,
    583 		0xeb, 0x25, 0x48, 0x1c, 0xdc, 0x15, 0x6d, 0x0b,
    584 		0x2f, 0xfc, 0x56, 0xb6, 0x3f, 0xda, 0xd5, 0x33
    585 	};
    586 
    587 	/* known SHA512 hmac (64 bytes) */
    588 	static uint8_t known_sha512_hmac[] = {
    589 		0xf7, 0x18, 0x03, 0x43, 0x1e, 0x07, 0xa5, 0xa6,
    590 		0xe5, 0xfd, 0x4a, 0xe4, 0xcf, 0xc2, 0x75, 0x3b,
    591 		0xc8, 0x0d, 0x26, 0xe1, 0x67, 0x23, 0xd9, 0xe8,
    592 		0x8b, 0x40, 0x5a, 0x02, 0x34, 0x8e, 0xf4, 0xb9,
    593 		0x67, 0x92, 0xc9, 0x9c, 0xed, 0x64, 0xdc, 0x70,
    594 		0xea, 0x47, 0x53, 0x78, 0xb7, 0x46, 0x6a, 0xc2,
    595 		0xca, 0xf4, 0xa4, 0x20, 0xb0, 0x1f, 0xf6, 0x1e,
    596 		0x72, 0xc5, 0xb5, 0xee, 0x8e, 0xaa, 0xd4, 0xd4
    597 	};
    598 
    599 	/* SHA-2 variables. */
    600 	uint8_t sha256_computed_digest[SHA256_DIGEST_LENGTH];
    601 	uint8_t sha384_computed_digest[SHA384_DIGEST_LENGTH];
    602 	uint8_t sha512_computed_digest[SHA512_DIGEST_LENGTH];
    603 
    604 	uint8_t hmac_computed[SHA512_DIGEST_LENGTH];
    605 	SHA2_CTX *sha2_context = NULL;
    606 
    607 #ifdef _KERNEL
    608 	sha2_hmac_ctx_t *sha2_hmac_ctx;
    609 #endif
    610 
    611 	int rv;
    612 
    613 	/*
    614 	 * SHA-2 Known Answer Hashing Test.
    615 	 */
    616 
    617 	/* SHA-256 POST */
    618 
    619 #ifdef _KERNEL
    620 	sha2_context = fips_sha2_build_context(SHA256_TYPE);
    621 #else
    622 	sha2_context = fips_sha2_build_context(CKM_SHA256);
    623 #endif
    624 
    625 	if (sha2_context == NULL)
    626 		return (CKR_HOST_MEMORY);
    627 
    628 	rv = fips_sha2_hash(sha2_context,
    629 	    sha256_known_hash_message,
    630 	    FIPS_KNOWN_HMAC_MESSAGE_LENGTH,
    631 	    sha256_computed_digest);
    632 
    633 	if ((rv != CKR_OK) ||
    634 	    (memcmp(sha256_computed_digest, known_sha256_digest,
    635 	    SHA256_DIGEST_LENGTH) != 0))
    636 	return (CKR_DEVICE_ERROR);
    637 
    638 	/* SHA-384 POST */
    639 
    640 #ifdef _KERNEL
    641 	sha2_context = fips_sha2_build_context(SHA384_TYPE);
    642 #else
    643 	sha2_context = fips_sha2_build_context(CKM_SHA384);
    644 #endif
    645 
    646 	if (sha2_context == NULL)
    647 		return (CKR_HOST_MEMORY);
    648 
    649 	rv = fips_sha2_hash(sha2_context,
    650 	    sha384_known_hash_message,
    651 	    FIPS_KNOWN_HMAC_MESSAGE_LENGTH,
    652 	    sha384_computed_digest);
    653 
    654 	if ((rv != CKR_OK) ||
    655 	    (memcmp(sha384_computed_digest, known_sha384_digest,
    656 	    SHA384_DIGEST_LENGTH) != 0))
    657 	return (CKR_DEVICE_ERROR);
    658 
    659 	/* SHA-512 POST */
    660 
    661 #ifdef _KERNEL
    662 	sha2_context = fips_sha2_build_context(SHA512_TYPE);
    663 #else
    664 	sha2_context = fips_sha2_build_context(CKM_SHA512);
    665 #endif
    666 
    667 	if (sha2_context == NULL)
    668 		return (CKR_HOST_MEMORY);
    669 
    670 	rv = fips_sha2_hash(sha2_context,
    671 	    sha512_known_hash_message,
    672 	    FIPS_KNOWN_HMAC_MESSAGE_LENGTH,
    673 	    sha512_computed_digest);
    674 
    675 	if ((rv != CKR_OK) ||
    676 	    (memcmp(sha512_computed_digest, known_sha512_digest,
    677 	    SHA512_DIGEST_LENGTH) != 0))
    678 	return (CKR_DEVICE_ERROR);
    679 
    680 	/*
    681 	 * SHA-2 HMAC Known Answer Hashing Test.
    682 	 */
    683 
    684 	/* HMAC SHA-256 POST */
    685 
    686 #ifdef _KERNEL
    687 	sha2_hmac_ctx = fips_sha2_hmac_build_context(
    688 	    SHA256_TYPE,
    689 	    sha256_hmac_known_secret_key,
    690 	    sha256_hmac_known_secret_key_length);
    691 
    692 	if (sha2_hmac_ctx == NULL)
    693 		return (CKR_HOST_MEMORY);
    694 
    695 	fips_hmac_sha2_hash(sha2_hmac_ctx,
    696 	    sha256_hmac_known_hash_message,
    697 	    FIPS_KNOWN_HMAC_MESSAGE_LENGTH,
    698 	    hmac_computed,
    699 	    SHA256_TYPE);
    700 
    701 	if (memcmp(hmac_computed, known_sha256_hmac,
    702 	    SHA256_DIGEST_LENGTH) != 0)
    703 	return (CKR_DEVICE_ERROR);
    704 
    705 #else
    706 	rv = fips_hmac_sha2_hash(hmac_computed,
    707 	    sha256_hmac_known_secret_key,
    708 	    sha256_hmac_known_secret_key_length,
    709 	    sha256_hmac_known_hash_message,
    710 	    FIPS_KNOWN_HMAC_MESSAGE_LENGTH,
    711 	    CKM_SHA256_HMAC);
    712 
    713 	if ((rv != CKR_OK) ||
    714 	    (memcmp(hmac_computed, known_sha256_hmac,
    715 	    SHA256_DIGEST_LENGTH) != 0))
    716 	return (CKR_DEVICE_ERROR);
    717 
    718 #endif
    719 
    720 	/* HMAC SHA-384 POST */
    721 
    722 #ifdef _KERNEL
    723 	sha2_hmac_ctx = fips_sha2_hmac_build_context(
    724 	    SHA384_TYPE,
    725 	    sha384_hmac_known_secret_key,
    726 	    sha384_hmac_known_secret_key_length);
    727 
    728 	if (sha2_hmac_ctx == NULL)
    729 		return (CKR_HOST_MEMORY);
    730 
    731 	fips_hmac_sha2_hash(sha2_hmac_ctx,
    732 	    sha384_hmac_known_hash_message,
    733 	    sizeof (sha384_hmac_known_hash_message),
    734 	    hmac_computed,
    735 	    SHA384_TYPE);
    736 
    737 	if (memcmp(hmac_computed, known_sha384_hmac,
    738 	    SHA384_DIGEST_LENGTH) != 0)
    739 	return (CKR_DEVICE_ERROR);
    740 #else
    741 	rv = fips_hmac_sha2_hash(hmac_computed,
    742 	    sha384_hmac_known_secret_key,
    743 	    sha384_hmac_known_secret_key_length,
    744 	    sha384_hmac_known_hash_message,
    745 	    sizeof (sha384_hmac_known_hash_message),
    746 	    CKM_SHA384_HMAC);
    747 
    748 	if ((rv != CKR_OK) ||
    749 	    (memcmp(hmac_computed, known_sha384_hmac,
    750 	    SHA384_DIGEST_LENGTH) != 0))
    751 	return (CKR_DEVICE_ERROR);
    752 
    753 #endif
    754 
    755 	/* HMAC SHA-512 POST */
    756 
    757 #ifdef _KERNEL
    758 	sha2_hmac_ctx = fips_sha2_hmac_build_context(
    759 	    SHA512_TYPE,
    760 	    sha512_hmac_known_secret_key,
    761 	    sha512_hmac_known_secret_key_length);
    762 
    763 	if (sha2_hmac_ctx == NULL)
    764 		return (CKR_HOST_MEMORY);
    765 
    766 	fips_hmac_sha2_hash(sha2_hmac_ctx,
    767 	    sha512_hmac_known_hash_message,
    768 	    sizeof (sha512_hmac_known_hash_message),
    769 	    hmac_computed,
    770 	    SHA512_TYPE);
    771 
    772 	if (memcmp(hmac_computed, known_sha512_hmac,
    773 	    SHA512_DIGEST_LENGTH) != 0)
    774 		return (CKR_DEVICE_ERROR);
    775 
    776 #else
    777 	rv = fips_hmac_sha2_hash(hmac_computed,
    778 	    sha512_hmac_known_secret_key,
    779 	    sha512_hmac_known_secret_key_length,
    780 	    sha512_hmac_known_hash_message,
    781 	    sizeof (sha512_hmac_known_hash_message),
    782 	    CKM_SHA512_HMAC);
    783 
    784 	if ((rv != CKR_OK) ||
    785 	    (memcmp(hmac_computed, known_sha512_hmac,
    786 	    SHA512_DIGEST_LENGTH) != 0))
    787 	return (CKR_DEVICE_ERROR);
    788 
    789 #endif
    790 
    791 	return (CKR_OK);
    792 }
    793