sha256.c revision 290757
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 * Copyright 2013 Saso Kiselkov. All rights reserved. 27 */ 28#include <sys/zfs_context.h> 29#include <sys/zio.h> 30#ifdef _KERNEL 31#include <crypto/sha2/sha2.h> 32#else 33#include <sha256.h> 34#endif 35 36/*ARGSUSED*/ 37void 38zio_checksum_SHA256(const void *buf, uint64_t size, 39 const void *ctx_template, zio_cksum_t *zcp) 40{ 41 SHA256_CTX ctx; 42 zio_cksum_t tmp; 43 44 SHA256_Init(&ctx); 45 SHA256_Update(&ctx, buf, size); 46 SHA256_Final((unsigned char *)&tmp, &ctx); 47 48 /* 49 * A prior implementation of this function had a 50 * private SHA256 implementation always wrote things out in 51 * Big Endian and there wasn't a byteswap variant of it. 52 * To preseve on disk compatibility we need to force that 53 * behaviour. 54 */ 55 zcp->zc_word[0] = BE_64(tmp.zc_word[0]); 56 zcp->zc_word[1] = BE_64(tmp.zc_word[1]); 57 zcp->zc_word[2] = BE_64(tmp.zc_word[2]); 58 zcp->zc_word[3] = BE_64(tmp.zc_word[3]); 59} 60 61#ifdef illumos 62/*ARGSUSED*/ 63void 64zio_checksum_SHA512_native(const void *buf, uint64_t size, 65 const void *ctx_template, zio_cksum_t *zcp) 66{ 67 SHA2_CTX ctx; 68 69 SHA2Init(SHA512_256, &ctx); 70 SHA2Update(&ctx, buf, size); 71 SHA2Final(zcp, &ctx); 72} 73 74/*ARGSUSED*/ 75void 76zio_checksum_SHA512_byteswap(const void *buf, uint64_t size, 77 const void *ctx_template, zio_cksum_t *zcp) 78{ 79 zio_cksum_t tmp; 80 81 zio_checksum_SHA512_native(buf, size, ctx_template, &tmp); 82 zcp->zc_word[0] = BSWAP_64(tmp.zc_word[0]); 83 zcp->zc_word[1] = BSWAP_64(tmp.zc_word[1]); 84 zcp->zc_word[2] = BSWAP_64(tmp.zc_word[2]); 85 zcp->zc_word[3] = BSWAP_64(tmp.zc_word[3]); 86} 87#endif 88