FreeBSD ZFS
The Zettabyte File System
|
00001 /* 00002 * CDDL HEADER START 00003 * 00004 * The contents of this file are subject to the terms of the 00005 * Common Development and Distribution License (the "License"). 00006 * You may not use this file except in compliance with the License. 00007 * 00008 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 00009 * or http://www.opensolaris.org/os/licensing. 00010 * See the License for the specific language governing permissions 00011 * and limitations under the License. 00012 * 00013 * When distributing Covered Code, include this CDDL HEADER in each 00014 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 00015 * If applicable, add the following below this CDDL HEADER, with the 00016 * fields enclosed by brackets "[]" replaced with your own identifying 00017 * information: Portions Copyright [yyyy] [name of copyright owner] 00018 * 00019 * CDDL HEADER END 00020 */ 00021 /* 00022 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 00023 * Use is subject to license terms. 00024 */ 00025 #include <sys/zfs_context.h> 00026 #include <sys/zio.h> 00027 #ifdef _KERNEL 00028 #include <crypto/sha2/sha2.h> 00029 #else 00030 #include <sha256.h> 00031 #endif 00032 00033 void 00034 zio_checksum_SHA256(const void *buf, uint64_t size, zio_cksum_t *zcp) 00035 { 00036 SHA256_CTX ctx; 00037 zio_cksum_t tmp; 00038 00039 SHA256_Init(&ctx); 00040 SHA256_Update(&ctx, buf, size); 00041 SHA256_Final((unsigned char *)&tmp, &ctx); 00042 00043 /* 00044 * A prior implementation of this function had a 00045 * private SHA256 implementation always wrote things out in 00046 * Big Endian and there wasn't a byteswap variant of it. 00047 * To preseve on disk compatibility we need to force that 00048 * behaviour. 00049 */ 00050 zcp->zc_word[0] = BE_64(tmp.zc_word[0]); 00051 zcp->zc_word[1] = BE_64(tmp.zc_word[1]); 00052 zcp->zc_word[2] = BE_64(tmp.zc_word[2]); 00053 zcp->zc_word[3] = BE_64(tmp.zc_word[3]); 00054 }