sha2.c revision 673007c6bdf2eee5b45916949d1b2e7ed00efbe3
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Use is subject to license terms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#pragma ident "%Z%%M% %I% %E% SMI"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The basic framework for this code came from the reference
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * implementation for MD5. That implementation is Copyright (C)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * License to copy and use this software is granted provided that it
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * is identified as the "RSA Data Security, Inc. MD5 Message-Digest
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Algorithm" in all material mentioning or referencing this software
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * or this function.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * License is also granted to make and use derivative works provided
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * that such works are identified as "derived from the RSA Data
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Security, Inc. MD5 Message-Digest Algorithm" in all material
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * mentioning or referencing the derived work.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * RSA Data Security, Inc. makes no representations concerning either
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * the merchantability of this software or the suitability of this
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * software for any particular purpose. It is provided "as is"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * without express or implied warranty of any kind.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * These notices must be retained in any copies of any part of this
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * documentation and/or software.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * NOTE: Cleaned-up and optimized, version of SHA2, based on the FIPS 180-2
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * standard, available at http://www.itl.nist.gov/div897/pubs/fip180-2.htm
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Not as fast as one would like -- further optimizations are encouraged
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * and appreciated.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The sha2 module is created with two modlinkages:
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * - a modlmisc that allows consumers to directly call the entry points
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * SHA2Init, SHA2Update, and SHA2Final.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * - a modlcrypto that allows the module to register with the Kernel
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Cryptographic Framework (KCF) as a software provider for the SHA2
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * mechanisms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif /* !_KERNEL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void SHA256Transform(SHA2_CTX *, const uint8_t *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void SHA512Transform(SHA2_CTX *, const uint8_t *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic uint8_t PADDING[128] = { 0x80, /* all zeros */ };
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Ch and Maj are the basic SHA2 functions. */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define Ch(b, c, d) (((b) & (c)) ^ ((~b) & (d)))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define Maj(b, c, d) (((b) & (c)) ^ ((b) & (d)) ^ ((c) & (d)))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Rotates x right n bits. */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define ROTR(x, n) \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (((x) >> (n)) | ((x) << ((sizeof (x) * NBBY)-(n))))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Shift x right n bits */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SHR(x, n) ((x) >> (n))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* SHA256 Functions */
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire#define BIGSIGMA0_256(x) (ROTR((x), 2) ^ ROTR((x), 13) ^ ROTR((x), 22))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define BIGSIGMA1_256(x) (ROTR((x), 6) ^ ROTR((x), 11) ^ ROTR((x), 25))
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire#define SIGMA0_256(x) (ROTR((x), 7) ^ ROTR((x), 18) ^ SHR((x), 3))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SIGMA1_256(x) (ROTR((x), 17) ^ ROTR((x), 19) ^ SHR((x), 10))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SHA256ROUND(a, b, c, d, e, f, g, h, i, w) \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica T1 = h + BIGSIGMA1_256(e) + Ch(e, f, g) + SHA256_CONST(i) + w; \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* SHA384/512 Functions */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define BIGSIGMA0(x) (ROTR((x), 28) ^ ROTR((x), 34) ^ ROTR((x), 39))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define BIGSIGMA1(x) (ROTR((x), 14) ^ ROTR((x), 18) ^ ROTR((x), 41))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SIGMA0(x) (ROTR((x), 1) ^ ROTR((x), 8) ^ SHR((x), 7))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SIGMA1(x) (ROTR((x), 19) ^ ROTR((x), 61) ^ SHR((x), 6))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SHA512ROUND(a, b, c, d, e, f, g, h, i, w) \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica T1 = h + BIGSIGMA1(e) + Ch(e, f, g) + SHA512_CONST(i) + w; \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "SHA2 Message-Digest Algorithm"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "SHA2 Kernel SW Provider %I%"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CSPI information (entry points, provider info, etc.)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif /* _KERNEL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * List of support mechanisms in this module.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * It is important to note that in the module, division or modulus calculations
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * are used on the enumerated type to determine which mechanism is being used;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * therefore, changing the order or additional mechanisms should be done
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * carefully
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricatypedef enum sha2_mech_type {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica SHA256_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC_GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica SHA384_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC_GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica SHA512_HMAC_GEN_MECH_INFO_TYPE /* SUN_CKM_SHA512_HMAC_GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Context for SHA2 mechanism.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricatypedef struct sha2_ctx {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Context for SHA2 HMAC and HMAC GENERAL mechanisms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricatypedef struct sha2_hmac_ctx {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Macros to access the SHA2 or SHA2-HMAC contexts from a context passed
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * by KCF to one of the entry points.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define PROV_SHA2_CTX(ctx) ((sha2_ctx_t *)(ctx)->cc_provider_private)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define PROV_SHA2_HMAC_CTX(ctx) ((sha2_hmac_ctx_t *)(ctx)->cc_provider_private)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* to extract the digest length passed as mechanism parameter */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define PROV_SHA2_DIGEST_KEY(mech, ctx, key, len, digest) { \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Mechanism info structure passed to KCF during registration.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA256 */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA256-HMAC */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA256-HMAC GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica {SUN_CKM_SHA256_HMAC_GENERAL, SHA256_HMAC_GEN_MECH_INFO_TYPE,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA384 */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA384-HMAC */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA384-HMAC GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica {SUN_CKM_SHA384_HMAC_GENERAL, SHA384_HMAC_GEN_MECH_INFO_TYPE,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA512 */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA512-HMAC */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* SHA512-HMAC GENERAL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica {SUN_CKM_SHA512_HMAC_GENERAL, SHA512_HMAC_GEN_MECH_INFO_TYPE,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void sha2_provider_status(crypto_provider_handle_t, uint_t *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_digest_init(crypto_ctx_t *, crypto_mechanism_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_digest(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_digest_update(crypto_ctx_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_digest_final(crypto_ctx_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_digest_atomic(crypto_provider_handle_t, crypto_session_id_t,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica crypto_mechanism_t *, crypto_data_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_mac_init(crypto_ctx_t *, crypto_mechanism_t *, crypto_key_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_mac_update(crypto_ctx_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_mac_final(crypto_ctx_t *, crypto_data_t *, crypto_req_handle_t);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_mac_atomic(crypto_provider_handle_t, crypto_session_id_t,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_mac_verify_atomic(crypto_provider_handle_t, crypto_session_id_t,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int sha2_create_ctx_template(crypto_provider_handle_t,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica crypto_mechanism_t *, crypto_key_t *, crypto_spi_ctx_template_t *,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "SHA2 Software Provider",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (sha2_mech_info_tab)/sizeof (crypto_mech_info_t),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic crypto_kcf_provider_handle_t sha2_prov_handle = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Register with KCF. If the registration fails, log an
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * error but do not uninstall the module, since the functionality
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * provided by misc/sha2 should still be available.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif /* _KERNEL */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * sparc optimization:
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * on the sparc, we can load big endian 32-bit data easily. note that
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * special care must be taken to ensure the address is 32-bit aligned.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * in the interest of speed, we don't check to make sure, since
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * careful programming can guarantee this for us.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#else /* little endian -- will work on big endian, but slowly */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (((addr)[0] << 24) | ((addr)[1] << 16) | ((addr)[2] << 8) | (addr)[3])
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#else /* little endian -- will work on big endian, but slowly */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (((uint64_t)(addr)[0] << 56) | ((uint64_t)(addr)[1] << 48) | \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ((uint64_t)(addr)[2] << 40) | ((uint64_t)(addr)[3] << 32) | \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ((uint64_t)(addr)[4] << 24) | ((uint64_t)(addr)[5] << 16) | \
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* SHA256 Transform */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#if defined(__sparc)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica bcopy(blk, ctx->buf_un.buf32, sizeof (ctx->buf_un.buf32));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#if defined(__sparc)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*LINTED*/
#if defined(__sparc)
#if defined(__sparc)
#ifdef __RESTRICT
#define restrict _Restrict
size_t i, j;
#if defined(__sparc)
#if defined(__sparc)
size_t i, j;
#if defined(__sparc)
#if defined(__sparc)
#ifdef _KERNEL
return (CRYPTO_HOST_MEMORY);
return (CRYPTO_SUCCESS);
return (CRYPTO_ARGUMENTS_BAD);
return (CRYPTO_DATA_LEN_RANGE);
vec_idx++;
offset = 0;
return (CRYPTO_DATA_LEN_RANGE);
return (CRYPTO_SUCCESS);
return (CRYPTO_ARGUMENTS_BAD);
return (CRYPTO_DATA_LEN_RANGE);
sha2_ctx);
cur_len =
cur_len);
vec_idx++;
offset = 0;
return (CRYPTO_DATA_LEN_RANGE);
return (CRYPTO_SUCCESS);
return (CRYPTO_DATA_LEN_RANGE);
offset = 0;
return (CRYPTO_DATA_LEN_RANGE);
return (CRYPTO_SUCCESS);
return (CRYPTO_DATA_LEN_RANGE);
offset = 0;
return (CRYPTO_DATA_LEN_RANGE);
return (CRYPTO_SUCCESS);
case SHA256_MECH_INFO_TYPE:
case SHA384_MECH_INFO_TYPE:
case SHA512_MECH_INFO_TYPE:
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_BUFFER_TOO_SMALL);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
data);
case CRYPTO_DATA_MBLK:
data);
return (ret);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
data);
case CRYPTO_DATA_MBLK:
data);
return (ret);
case SHA256_MECH_INFO_TYPE:
case SHA384_MECH_INFO_TYPE:
case SHA512_MECH_INFO_TYPE:
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_BUFFER_TOO_SMALL);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
for (i = 0; i < blocks_per_int64; i ++) {
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_ARGUMENTS_BAD);
return (CRYPTO_HOST_MEMORY);
sizeof (sha2_hmac_ctx_t));
return (ret);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
return (CRYPTO_BUFFER_TOO_SMALL);
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (ret);
case CRYPTO_DATA_RAW: \
case CRYPTO_DATA_UIO: \
case CRYPTO_DATA_MBLK: \
data); \
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_ARGUMENTS_BAD);
goto bail;
goto bail;
goto bail;
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO:
case CRYPTO_DATA_MBLK:
return (CRYPTO_SUCCESS);
bail:
return (ret);
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_ARGUMENTS_BAD);
goto bail;
goto bail;
goto bail;
goto bail;
case CRYPTO_DATA_RAW:
case CRYPTO_DATA_UIO: {
return (CRYPTO_ARGUMENTS_BAD);
for (vec_idx = 0;
cur_len) != 0) {
vec_idx++;
offset = 0;
case CRYPTO_DATA_MBLK: {
offset = 0;
return (ret);
bail:
return (ret);
return (CRYPTO_MECHANISM_INVALID);
return (CRYPTO_ARGUMENTS_BAD);
return (CRYPTO_HOST_MEMORY);
return (CRYPTO_SUCCESS);
return (CRYPTO_SUCCESS);
return (CRYPTO_SUCCESS);
switch (mech) {
case SHA256_MECH_INFO_TYPE:
case SHA384_MECH_INFO_TYPE:
case SHA512_MECH_INFO_TYPE:
#ifdef _KERNEL
if (input_len == 0)
if (buf_index) {
i = buf_len;
if (input_len == i)
buf_index = 0;
sizeof (bitcount_be64));