110500SHai-May.Chao@Sun.COM /*
210500SHai-May.Chao@Sun.COM * CDDL HEADER START
310500SHai-May.Chao@Sun.COM *
410500SHai-May.Chao@Sun.COM * The contents of this file are subject to the terms of the
510500SHai-May.Chao@Sun.COM * Common Development and Distribution License (the "License").
610500SHai-May.Chao@Sun.COM * You may not use this file except in compliance with the License.
710500SHai-May.Chao@Sun.COM *
810500SHai-May.Chao@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910500SHai-May.Chao@Sun.COM * or http://www.opensolaris.org/os/licensing.
1010500SHai-May.Chao@Sun.COM * See the License for the specific language governing permissions
1110500SHai-May.Chao@Sun.COM * and limitations under the License.
1210500SHai-May.Chao@Sun.COM *
1310500SHai-May.Chao@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
1410500SHai-May.Chao@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510500SHai-May.Chao@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
1610500SHai-May.Chao@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
1710500SHai-May.Chao@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
1810500SHai-May.Chao@Sun.COM *
1910500SHai-May.Chao@Sun.COM * CDDL HEADER END
2010500SHai-May.Chao@Sun.COM */
2110500SHai-May.Chao@Sun.COM /*
22*12929SMisaki.Miyashita@Oracle.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2310500SHai-May.Chao@Sun.COM */
2410500SHai-May.Chao@Sun.COM
2510500SHai-May.Chao@Sun.COM #include <sys/types.h>
2610500SHai-May.Chao@Sun.COM #include <sys/param.h>
2710500SHai-May.Chao@Sun.COM #include <sys/errno.h>
2810500SHai-May.Chao@Sun.COM #include <sys/kmem.h>
2910500SHai-May.Chao@Sun.COM #include <sys/systm.h>
3010500SHai-May.Chao@Sun.COM #include <sys/sha1.h>
3110500SHai-May.Chao@Sun.COM #include <sys/crypto/common.h>
3210500SHai-May.Chao@Sun.COM #include <sys/cmn_err.h>
3310500SHai-May.Chao@Sun.COM #ifndef _KERNEL
3410500SHai-May.Chao@Sun.COM #include <stdlib.h>
3510500SHai-May.Chao@Sun.COM #include <string.h>
3610500SHai-May.Chao@Sun.COM #include <strings.h>
3710500SHai-May.Chao@Sun.COM #include <stdio.h>
3810500SHai-May.Chao@Sun.COM #include <security/cryptoki.h>
3910500SHai-May.Chao@Sun.COM #include <cryptoutil.h>
4010500SHai-May.Chao@Sun.COM #include "softMAC.h"
4110500SHai-May.Chao@Sun.COM #endif
4210500SHai-May.Chao@Sun.COM #include <sha1/sha1_impl.h>
43*12929SMisaki.Miyashita@Oracle.COM #define _SHA1_FIPS_POST
44*12929SMisaki.Miyashita@Oracle.COM #include <fips/fips_test_vectors.h>
4510500SHai-May.Chao@Sun.COM
4610500SHai-May.Chao@Sun.COM /*
4710500SHai-May.Chao@Sun.COM * fips_sha1_build_context()
4810500SHai-May.Chao@Sun.COM *
4910500SHai-May.Chao@Sun.COM * Description:
5010500SHai-May.Chao@Sun.COM * This function allocates and initializes SHA1 context
5110500SHai-May.Chao@Sun.COM * context.
5210500SHai-May.Chao@Sun.COM */
5310500SHai-May.Chao@Sun.COM SHA1_CTX *
fips_sha1_build_context(void)5410500SHai-May.Chao@Sun.COM fips_sha1_build_context(void)
5510500SHai-May.Chao@Sun.COM {
5610500SHai-May.Chao@Sun.COM SHA1_CTX *sha1_context;
5710500SHai-May.Chao@Sun.COM
5810500SHai-May.Chao@Sun.COM
5910500SHai-May.Chao@Sun.COM #ifndef _KERNEL
6010500SHai-May.Chao@Sun.COM if ((sha1_context = malloc(sizeof (SHA1_CTX))) == NULL)
6110500SHai-May.Chao@Sun.COM #else
6210500SHai-May.Chao@Sun.COM if ((sha1_context = kmem_zalloc(sizeof (SHA1_CTX),
6310500SHai-May.Chao@Sun.COM KM_SLEEP)) == NULL)
6410500SHai-May.Chao@Sun.COM #endif
6510500SHai-May.Chao@Sun.COM return (NULL);
6610500SHai-May.Chao@Sun.COM
6710500SHai-May.Chao@Sun.COM SHA1Init(sha1_context);
6810500SHai-May.Chao@Sun.COM
6910500SHai-May.Chao@Sun.COM return (sha1_context);
7010500SHai-May.Chao@Sun.COM
7110500SHai-May.Chao@Sun.COM }
7210500SHai-May.Chao@Sun.COM
7310500SHai-May.Chao@Sun.COM /*
7410500SHai-May.Chao@Sun.COM * fips_sha1_hash()
7510500SHai-May.Chao@Sun.COM *
7610500SHai-May.Chao@Sun.COM * Arguments:
7710500SHai-May.Chao@Sun.COM * sha1_context: pointer to SHA1 context
7810500SHai-May.Chao@Sun.COM * in: pointer to the input data to be hashed
7910500SHai-May.Chao@Sun.COM * inlen: length of the input data
8010500SHai-May.Chao@Sun.COM * out: pointer to the output data after hashing
8110500SHai-May.Chao@Sun.COM *
8210500SHai-May.Chao@Sun.COM * Description:
8310500SHai-May.Chao@Sun.COM * This function calls the low-level SHA1 routines for hashing.
8410500SHai-May.Chao@Sun.COM *
8510500SHai-May.Chao@Sun.COM */
8610500SHai-May.Chao@Sun.COM int
fips_sha1_hash(SHA1_CTX * sha1_context,uchar_t * in,ulong_t inlen,uchar_t * out)8710500SHai-May.Chao@Sun.COM fips_sha1_hash(SHA1_CTX *sha1_context, uchar_t *in, ulong_t inlen, uchar_t *out)
8810500SHai-May.Chao@Sun.COM {
8910500SHai-May.Chao@Sun.COM
9010979SHai-May.Chao@Sun.COM int rv;
9110979SHai-May.Chao@Sun.COM
9210500SHai-May.Chao@Sun.COM if (in != NULL) {
9310500SHai-May.Chao@Sun.COM #ifdef __sparcv9
9410500SHai-May.Chao@Sun.COM SHA1Update((SHA1_CTX *)sha1_context, in, (uint_t)inlen);
9510500SHai-May.Chao@Sun.COM #else /* !__sparcv9 */
9610500SHai-May.Chao@Sun.COM SHA1Update((SHA1_CTX *)sha1_context, in, inlen);
9710500SHai-May.Chao@Sun.COM #endif /* __sparcv9 */
9810500SHai-May.Chao@Sun.COM SHA1Final(out, (SHA1_CTX *)sha1_context);
9910979SHai-May.Chao@Sun.COM rv = CKR_OK;
10010500SHai-May.Chao@Sun.COM } else
10110979SHai-May.Chao@Sun.COM rv = CKR_ARGUMENTS_BAD;
10210500SHai-May.Chao@Sun.COM
10310979SHai-May.Chao@Sun.COM if (sha1_context)
10410979SHai-May.Chao@Sun.COM #ifdef _KERNEL
10510979SHai-May.Chao@Sun.COM kmem_free(sha1_context, sizeof (SHA1_CTX));
10610979SHai-May.Chao@Sun.COM #else
10710979SHai-May.Chao@Sun.COM free(sha1_context);
10810979SHai-May.Chao@Sun.COM #endif
10910979SHai-May.Chao@Sun.COM return (rv);
11010500SHai-May.Chao@Sun.COM }
11110500SHai-May.Chao@Sun.COM
11210500SHai-May.Chao@Sun.COM
11310500SHai-May.Chao@Sun.COM #ifndef _KERNEL
11410500SHai-May.Chao@Sun.COM soft_hmac_ctx_t *
fips_sha1_hmac_build_context(uint8_t * secret_key,unsigned int secret_key_length)11510500SHai-May.Chao@Sun.COM fips_sha1_hmac_build_context(uint8_t *secret_key,
11610500SHai-May.Chao@Sun.COM unsigned int secret_key_length)
11710500SHai-May.Chao@Sun.COM {
11810500SHai-May.Chao@Sun.COM
11910500SHai-May.Chao@Sun.COM soft_hmac_ctx_t *hmac_ctx;
12010500SHai-May.Chao@Sun.COM uint32_t sha1_ipad[SHA1_HMAC_INTS_PER_BLOCK];
12110500SHai-May.Chao@Sun.COM uint32_t sha1_opad[SHA1_HMAC_INTS_PER_BLOCK];
12210500SHai-May.Chao@Sun.COM
12310500SHai-May.Chao@Sun.COM hmac_ctx = malloc(sizeof (soft_hmac_ctx_t));
12410500SHai-May.Chao@Sun.COM
12510500SHai-May.Chao@Sun.COM if (hmac_ctx == NULL) {
12610500SHai-May.Chao@Sun.COM return (NULL);
12710500SHai-May.Chao@Sun.COM }
12810500SHai-May.Chao@Sun.COM
12910500SHai-May.Chao@Sun.COM hmac_ctx->hmac_len = SHA1_HASH_SIZE;
13010500SHai-May.Chao@Sun.COM bzero(sha1_ipad, SHA1_HMAC_BLOCK_SIZE);
13110500SHai-May.Chao@Sun.COM bzero(sha1_opad, SHA1_HMAC_BLOCK_SIZE);
13210500SHai-May.Chao@Sun.COM
13310500SHai-May.Chao@Sun.COM (void) memcpy(sha1_ipad, secret_key, secret_key_length);
13410500SHai-May.Chao@Sun.COM (void) memcpy(sha1_opad, secret_key, secret_key_length);
13510500SHai-May.Chao@Sun.COM
13610500SHai-May.Chao@Sun.COM sha1_hmac_ctx_init(&hmac_ctx->hc_ctx_u.sha1_ctx, sha1_ipad,
13710500SHai-May.Chao@Sun.COM sha1_opad);
13810500SHai-May.Chao@Sun.COM
13910500SHai-May.Chao@Sun.COM return (hmac_ctx);
14010500SHai-May.Chao@Sun.COM
14110500SHai-May.Chao@Sun.COM }
14210500SHai-May.Chao@Sun.COM
14310500SHai-May.Chao@Sun.COM CK_RV
fips_hmac_sha1_hash(unsigned char * hmac_computed,uint8_t * secret_key,unsigned int secret_key_length,uint8_t * message,unsigned int message_length)14410500SHai-May.Chao@Sun.COM fips_hmac_sha1_hash(unsigned char *hmac_computed,
14510500SHai-May.Chao@Sun.COM uint8_t *secret_key,
14610500SHai-May.Chao@Sun.COM unsigned int secret_key_length,
14710500SHai-May.Chao@Sun.COM uint8_t *message,
14810500SHai-May.Chao@Sun.COM unsigned int message_length)
14910500SHai-May.Chao@Sun.COM {
15010500SHai-May.Chao@Sun.COM
15110500SHai-May.Chao@Sun.COM soft_hmac_ctx_t *hmac_ctx = NULL;
15210500SHai-May.Chao@Sun.COM
15310500SHai-May.Chao@Sun.COM hmac_ctx = fips_sha1_hmac_build_context(secret_key,
15410500SHai-May.Chao@Sun.COM secret_key_length);
15510500SHai-May.Chao@Sun.COM
15610500SHai-May.Chao@Sun.COM if (hmac_ctx == NULL)
15710500SHai-May.Chao@Sun.COM return (CKR_HOST_MEMORY);
15810500SHai-May.Chao@Sun.COM
15910500SHai-May.Chao@Sun.COM if (message != NULL) {
16010500SHai-May.Chao@Sun.COM SOFT_MAC_UPDATE(SHA1, &(hmac_ctx->hc_ctx_u.sha1_ctx),
16110500SHai-May.Chao@Sun.COM message, message_length);
16210500SHai-May.Chao@Sun.COM }
16310500SHai-May.Chao@Sun.COM
16410500SHai-May.Chao@Sun.COM SOFT_MAC_FINAL(SHA1, &(hmac_ctx->hc_ctx_u.sha1_ctx), hmac_computed);
16510500SHai-May.Chao@Sun.COM
16610500SHai-May.Chao@Sun.COM free(hmac_ctx);
16710500SHai-May.Chao@Sun.COM return (CKR_OK);
16810500SHai-May.Chao@Sun.COM }
16910500SHai-May.Chao@Sun.COM
17010500SHai-May.Chao@Sun.COM #else /* _KERNEL */
17110500SHai-May.Chao@Sun.COM
17210500SHai-May.Chao@Sun.COM /*
17310500SHai-May.Chao@Sun.COM * Initialize a SHA1-HMAC context.
17410500SHai-May.Chao@Sun.COM */
17510500SHai-May.Chao@Sun.COM void
sha1_mac_init_ctx(sha1_hmac_ctx_t * ctx,void * keyval,uint_t length_in_bytes)17610500SHai-May.Chao@Sun.COM sha1_mac_init_ctx(sha1_hmac_ctx_t *ctx, void *keyval, uint_t length_in_bytes)
17710500SHai-May.Chao@Sun.COM {
17810500SHai-May.Chao@Sun.COM uint32_t ipad[SHA1_HMAC_INTS_PER_BLOCK];
17910500SHai-May.Chao@Sun.COM uint32_t opad[SHA1_HMAC_INTS_PER_BLOCK];
18010500SHai-May.Chao@Sun.COM uint_t i;
18110500SHai-May.Chao@Sun.COM
18210500SHai-May.Chao@Sun.COM bzero(ipad, SHA1_HMAC_BLOCK_SIZE);
18310500SHai-May.Chao@Sun.COM bzero(opad, SHA1_HMAC_BLOCK_SIZE);
18410500SHai-May.Chao@Sun.COM
18510500SHai-May.Chao@Sun.COM bcopy(keyval, ipad, length_in_bytes);
18610500SHai-May.Chao@Sun.COM bcopy(keyval, opad, length_in_bytes);
18710500SHai-May.Chao@Sun.COM
18810500SHai-May.Chao@Sun.COM /* XOR key with ipad (0x36) and opad (0x5c) */
18910500SHai-May.Chao@Sun.COM for (i = 0; i < SHA1_HMAC_INTS_PER_BLOCK; i++) {
19010500SHai-May.Chao@Sun.COM ipad[i] ^= 0x36363636;
19110500SHai-May.Chao@Sun.COM opad[i] ^= 0x5c5c5c5c;
19210500SHai-May.Chao@Sun.COM }
19310500SHai-May.Chao@Sun.COM
19410500SHai-May.Chao@Sun.COM /* perform SHA1 on ipad */
19510500SHai-May.Chao@Sun.COM SHA1Init(&ctx->hc_icontext);
19610500SHai-May.Chao@Sun.COM SHA1Update(&ctx->hc_icontext, (uint8_t *)ipad, SHA1_HMAC_BLOCK_SIZE);
19710500SHai-May.Chao@Sun.COM
19810500SHai-May.Chao@Sun.COM /* perform SHA1 on opad */
19910500SHai-May.Chao@Sun.COM SHA1Init(&ctx->hc_ocontext);
20010500SHai-May.Chao@Sun.COM SHA1Update(&ctx->hc_ocontext, (uint8_t *)opad, SHA1_HMAC_BLOCK_SIZE);
20110500SHai-May.Chao@Sun.COM }
20210500SHai-May.Chao@Sun.COM
20310500SHai-May.Chao@Sun.COM sha1_hmac_ctx_t *
fips_sha1_hmac_build_context(uint8_t * secret_key,unsigned int secret_key_length)20410500SHai-May.Chao@Sun.COM fips_sha1_hmac_build_context(uint8_t *secret_key,
20510500SHai-May.Chao@Sun.COM unsigned int secret_key_length)
20610500SHai-May.Chao@Sun.COM {
20710500SHai-May.Chao@Sun.COM sha1_hmac_ctx_t *sha1_hmac_ctx_tmpl;
20810500SHai-May.Chao@Sun.COM
20910500SHai-May.Chao@Sun.COM
21010500SHai-May.Chao@Sun.COM /*
21110500SHai-May.Chao@Sun.COM * Allocate and initialize SHA1 context.
21210500SHai-May.Chao@Sun.COM */
21310500SHai-May.Chao@Sun.COM sha1_hmac_ctx_tmpl = kmem_alloc(sizeof (sha1_hmac_ctx_t),
21410500SHai-May.Chao@Sun.COM KM_SLEEP);
21510500SHai-May.Chao@Sun.COM if (sha1_hmac_ctx_tmpl == NULL)
21610500SHai-May.Chao@Sun.COM return (NULL);
21710500SHai-May.Chao@Sun.COM
21810500SHai-May.Chao@Sun.COM /*
21910500SHai-May.Chao@Sun.COM * initialize ctx->hc_icontext and ctx->hc_ocontext
22010500SHai-May.Chao@Sun.COM */
22110500SHai-May.Chao@Sun.COM sha1_mac_init_ctx(sha1_hmac_ctx_tmpl, secret_key,
22210500SHai-May.Chao@Sun.COM secret_key_length);
22310500SHai-May.Chao@Sun.COM
22410500SHai-May.Chao@Sun.COM
22510500SHai-May.Chao@Sun.COM sha1_hmac_ctx_tmpl->hc_mech_type = SHA1_HMAC_MECH_INFO_TYPE;
22610500SHai-May.Chao@Sun.COM
22710500SHai-May.Chao@Sun.COM
22810500SHai-May.Chao@Sun.COM return (sha1_hmac_ctx_tmpl);
22910500SHai-May.Chao@Sun.COM }
23010500SHai-May.Chao@Sun.COM
23110500SHai-May.Chao@Sun.COM void
fips_hmac_sha1_hash(sha1_hmac_ctx_t * sha1_hmac_ctx,uint8_t * message,uint32_t message_len,uint8_t * hmac_computed)23210500SHai-May.Chao@Sun.COM fips_hmac_sha1_hash(sha1_hmac_ctx_t *sha1_hmac_ctx,
23310500SHai-May.Chao@Sun.COM uint8_t *message, uint32_t message_len,
23410500SHai-May.Chao@Sun.COM uint8_t *hmac_computed)
23510500SHai-May.Chao@Sun.COM {
23610500SHai-May.Chao@Sun.COM
23710500SHai-May.Chao@Sun.COM /* do a SHA1 update of the inner context using the specified data */
23810500SHai-May.Chao@Sun.COM SHA1Update(&((sha1_hmac_ctx)->hc_icontext), message,
23910500SHai-May.Chao@Sun.COM message_len);
24010500SHai-May.Chao@Sun.COM
24110500SHai-May.Chao@Sun.COM /*
24210500SHai-May.Chao@Sun.COM * Do a SHA1 final on the inner context.
24310500SHai-May.Chao@Sun.COM */
24410500SHai-May.Chao@Sun.COM SHA1Final(hmac_computed, &((sha1_hmac_ctx)->hc_icontext));
24510500SHai-May.Chao@Sun.COM
24610500SHai-May.Chao@Sun.COM /*
24710500SHai-May.Chao@Sun.COM * Do an SHA1 update on the outer context, feeding the inner
24810500SHai-May.Chao@Sun.COM * digest as data.
24910500SHai-May.Chao@Sun.COM */
25010500SHai-May.Chao@Sun.COM SHA1Update(&((sha1_hmac_ctx)->hc_ocontext), hmac_computed,
25110500SHai-May.Chao@Sun.COM SHA1_HASH_SIZE);
25210500SHai-May.Chao@Sun.COM
25310500SHai-May.Chao@Sun.COM /*
25410500SHai-May.Chao@Sun.COM * Do a SHA1 final on the outer context, storing the computed
25510500SHai-May.Chao@Sun.COM * digest in the caller's buffer.
25610500SHai-May.Chao@Sun.COM */
25710500SHai-May.Chao@Sun.COM SHA1Final(hmac_computed, &((sha1_hmac_ctx)->hc_ocontext));
25810500SHai-May.Chao@Sun.COM
25910979SHai-May.Chao@Sun.COM kmem_free(sha1_hmac_ctx, sizeof (sha1_hmac_ctx_t));
26010500SHai-May.Chao@Sun.COM }
26110500SHai-May.Chao@Sun.COM
26210500SHai-May.Chao@Sun.COM #endif
26310500SHai-May.Chao@Sun.COM
26410500SHai-May.Chao@Sun.COM /*
26510500SHai-May.Chao@Sun.COM * SHA1 Power-On SelfTest(s).
26610500SHai-May.Chao@Sun.COM */
26710500SHai-May.Chao@Sun.COM int
fips_sha1_post(void)26810500SHai-May.Chao@Sun.COM fips_sha1_post(void)
26910500SHai-May.Chao@Sun.COM {
27010500SHai-May.Chao@Sun.COM static uint8_t HMAC_known_secret_key_length
27110500SHai-May.Chao@Sun.COM = sizeof (HMAC_known_secret_key);
27210500SHai-May.Chao@Sun.COM
27310500SHai-May.Chao@Sun.COM /* SHA-1 variables. */
27410500SHai-May.Chao@Sun.COM uint8_t sha1_computed_digest[SHA1_DIGEST_LENGTH];
27510500SHai-May.Chao@Sun.COM uint8_t hmac_computed[SHA1_HMAC_BLOCK_SIZE];
27610500SHai-May.Chao@Sun.COM SHA1_CTX *sha1_context = NULL;
27710500SHai-May.Chao@Sun.COM
27810500SHai-May.Chao@Sun.COM #ifdef _KERNEL
27910500SHai-May.Chao@Sun.COM sha1_hmac_ctx_t *sha1_hmac_ctx = NULL;
28010500SHai-May.Chao@Sun.COM #endif
28110500SHai-May.Chao@Sun.COM
28210500SHai-May.Chao@Sun.COM int rv;
28310500SHai-May.Chao@Sun.COM
28410500SHai-May.Chao@Sun.COM /* SHA-1 Known Answer Hashing Test. */
28510500SHai-May.Chao@Sun.COM sha1_context = fips_sha1_build_context();
28610500SHai-May.Chao@Sun.COM if (sha1_context == NULL)
28710500SHai-May.Chao@Sun.COM return (CKR_HOST_MEMORY);
28810500SHai-May.Chao@Sun.COM
28910500SHai-May.Chao@Sun.COM rv = fips_sha1_hash(sha1_context, sha1_known_hash_message,
29010500SHai-May.Chao@Sun.COM FIPS_KNOWN_HMAC_MESSAGE_LENGTH, sha1_computed_digest);
29110500SHai-May.Chao@Sun.COM
29210500SHai-May.Chao@Sun.COM if ((rv != CKR_OK) ||
29310500SHai-May.Chao@Sun.COM (memcmp(sha1_computed_digest, sha1_known_digest,
29410500SHai-May.Chao@Sun.COM SHA1_DIGEST_LENGTH) != 0))
29510500SHai-May.Chao@Sun.COM return (CKR_DEVICE_ERROR);
29610500SHai-May.Chao@Sun.COM
29710500SHai-May.Chao@Sun.COM #ifdef _KERNEL
29810500SHai-May.Chao@Sun.COM /* SHA-1 HMAC Known Answer Hashing Test */
29910500SHai-May.Chao@Sun.COM sha1_hmac_ctx = fips_sha1_hmac_build_context(HMAC_known_secret_key,
30010500SHai-May.Chao@Sun.COM HMAC_known_secret_key_length);
30110500SHai-May.Chao@Sun.COM
30210500SHai-May.Chao@Sun.COM if (sha1_hmac_ctx == NULL)
30310500SHai-May.Chao@Sun.COM return (CKR_HOST_MEMORY);
30410500SHai-May.Chao@Sun.COM
30510500SHai-May.Chao@Sun.COM fips_hmac_sha1_hash(sha1_hmac_ctx, hmac_sha1_known_hash_message,
30610500SHai-May.Chao@Sun.COM sizeof (hmac_sha1_known_hash_message), hmac_computed);
30710500SHai-May.Chao@Sun.COM #else
30810500SHai-May.Chao@Sun.COM rv = fips_hmac_sha1_hash(hmac_computed, HMAC_known_secret_key,
30910500SHai-May.Chao@Sun.COM HMAC_known_secret_key_length, hmac_sha1_known_hash_message,
31010500SHai-May.Chao@Sun.COM sizeof (hmac_sha1_known_hash_message));
31110500SHai-May.Chao@Sun.COM
31210500SHai-May.Chao@Sun.COM #endif
31310500SHai-May.Chao@Sun.COM
31410500SHai-May.Chao@Sun.COM #ifdef _KERNEL
31510500SHai-May.Chao@Sun.COM if (memcmp(hmac_computed, known_SHA1_hmac,
31610500SHai-May.Chao@Sun.COM sizeof (known_SHA1_hmac)) != 0)
31710500SHai-May.Chao@Sun.COM return (CKR_DEVICE_ERROR);
31810500SHai-May.Chao@Sun.COM #else
31910500SHai-May.Chao@Sun.COM if ((rv != CKR_OK) ||
32010500SHai-May.Chao@Sun.COM (memcmp(hmac_computed, known_SHA1_hmac,
32110500SHai-May.Chao@Sun.COM sizeof (known_SHA1_hmac)) != 0))
32210500SHai-May.Chao@Sun.COM return (CKR_DEVICE_ERROR);
32310500SHai-May.Chao@Sun.COM #endif
32410500SHai-May.Chao@Sun.COM
32510500SHai-May.Chao@Sun.COM return (rv);
32610500SHai-May.Chao@Sun.COM
32710500SHai-May.Chao@Sun.COM }
328