1*61145dc2SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
22a58b312SMartin Matuska /*
32a58b312SMartin Matuska * CDDL HEADER START
42a58b312SMartin Matuska *
52a58b312SMartin Matuska * The contents of this file are subject to the terms of the
62a58b312SMartin Matuska * Common Development and Distribution License (the "License").
72a58b312SMartin Matuska * You may not use this file except in compliance with the License.
82a58b312SMartin Matuska *
92a58b312SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
102a58b312SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0.
112a58b312SMartin Matuska * See the License for the specific language governing permissions
122a58b312SMartin Matuska * and limitations under the License.
132a58b312SMartin Matuska *
142a58b312SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each
152a58b312SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
162a58b312SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the
172a58b312SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying
182a58b312SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner]
192a58b312SMartin Matuska *
202a58b312SMartin Matuska * CDDL HEADER END
212a58b312SMartin Matuska */
222a58b312SMartin Matuska
232a58b312SMartin Matuska /*
242a58b312SMartin Matuska * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
252a58b312SMartin Matuska * Copyright 2013 Saso Kiselkov. All rights reserved.
262a58b312SMartin Matuska * Copyright (c) 2016 by Delphix. All rights reserved.
272a58b312SMartin Matuska */
282a58b312SMartin Matuska
292a58b312SMartin Matuska #include <sys/zfs_context.h>
302a58b312SMartin Matuska #include <sys/zio_checksum.h>
312a58b312SMartin Matuska #include <sys/sha2.h>
322a58b312SMartin Matuska #include <sys/abd.h>
332a58b312SMartin Matuska #include <sys/qat.h>
342a58b312SMartin Matuska
352a58b312SMartin Matuska static int
sha_incremental(void * buf,size_t size,void * arg)362a58b312SMartin Matuska sha_incremental(void *buf, size_t size, void *arg)
372a58b312SMartin Matuska {
382a58b312SMartin Matuska SHA2_CTX *ctx = arg;
392a58b312SMartin Matuska SHA2Update(ctx, buf, size);
402a58b312SMartin Matuska return (0);
412a58b312SMartin Matuska }
422a58b312SMartin Matuska
432a58b312SMartin Matuska void
abd_checksum_sha256(abd_t * abd,uint64_t size,const void * ctx_template,zio_cksum_t * zcp)442a58b312SMartin Matuska abd_checksum_sha256(abd_t *abd, uint64_t size,
452a58b312SMartin Matuska const void *ctx_template, zio_cksum_t *zcp)
462a58b312SMartin Matuska {
472a58b312SMartin Matuska (void) ctx_template;
482a58b312SMartin Matuska int ret;
492a58b312SMartin Matuska SHA2_CTX ctx;
502a58b312SMartin Matuska zio_cksum_t tmp;
512a58b312SMartin Matuska
522a58b312SMartin Matuska if (qat_checksum_use_accel(size)) {
532a58b312SMartin Matuska uint8_t *buf = abd_borrow_buf_copy(abd, size);
542a58b312SMartin Matuska ret = qat_checksum(ZIO_CHECKSUM_SHA256, buf, size, &tmp);
552a58b312SMartin Matuska abd_return_buf(abd, buf, size);
562a58b312SMartin Matuska if (ret == CPA_STATUS_SUCCESS)
572a58b312SMartin Matuska goto bswap;
582a58b312SMartin Matuska
592a58b312SMartin Matuska /* If the hardware implementation fails fall back to software */
602a58b312SMartin Matuska }
612a58b312SMartin Matuska
622a58b312SMartin Matuska SHA2Init(SHA256, &ctx);
632a58b312SMartin Matuska (void) abd_iterate_func(abd, 0, size, sha_incremental, &ctx);
642a58b312SMartin Matuska SHA2Final(&tmp, &ctx);
652a58b312SMartin Matuska
662a58b312SMartin Matuska bswap:
672a58b312SMartin Matuska /*
682a58b312SMartin Matuska * A prior implementation of this function had a
692a58b312SMartin Matuska * private SHA256 implementation always wrote things out in
702a58b312SMartin Matuska * Big Endian and there wasn't a byteswap variant of it.
712a58b312SMartin Matuska * To preserve on disk compatibility we need to force that
722a58b312SMartin Matuska * behavior.
732a58b312SMartin Matuska */
742a58b312SMartin Matuska zcp->zc_word[0] = BE_64(tmp.zc_word[0]);
752a58b312SMartin Matuska zcp->zc_word[1] = BE_64(tmp.zc_word[1]);
762a58b312SMartin Matuska zcp->zc_word[2] = BE_64(tmp.zc_word[2]);
772a58b312SMartin Matuska zcp->zc_word[3] = BE_64(tmp.zc_word[3]);
782a58b312SMartin Matuska }
792a58b312SMartin Matuska
802a58b312SMartin Matuska void
abd_checksum_sha512_native(abd_t * abd,uint64_t size,const void * ctx_template,zio_cksum_t * zcp)812a58b312SMartin Matuska abd_checksum_sha512_native(abd_t *abd, uint64_t size,
822a58b312SMartin Matuska const void *ctx_template, zio_cksum_t *zcp)
832a58b312SMartin Matuska {
842a58b312SMartin Matuska (void) ctx_template;
852a58b312SMartin Matuska SHA2_CTX ctx;
862a58b312SMartin Matuska
872a58b312SMartin Matuska SHA2Init(SHA512_256, &ctx);
882a58b312SMartin Matuska (void) abd_iterate_func(abd, 0, size, sha_incremental, &ctx);
892a58b312SMartin Matuska SHA2Final(zcp, &ctx);
902a58b312SMartin Matuska }
912a58b312SMartin Matuska
922a58b312SMartin Matuska void
abd_checksum_sha512_byteswap(abd_t * abd,uint64_t size,const void * ctx_template,zio_cksum_t * zcp)932a58b312SMartin Matuska abd_checksum_sha512_byteswap(abd_t *abd, uint64_t size,
942a58b312SMartin Matuska const void *ctx_template, zio_cksum_t *zcp)
952a58b312SMartin Matuska {
962a58b312SMartin Matuska zio_cksum_t tmp;
972a58b312SMartin Matuska
982a58b312SMartin Matuska abd_checksum_sha512_native(abd, size, ctx_template, &tmp);
992a58b312SMartin Matuska zcp->zc_word[0] = BSWAP_64(tmp.zc_word[0]);
1002a58b312SMartin Matuska zcp->zc_word[1] = BSWAP_64(tmp.zc_word[1]);
1012a58b312SMartin Matuska zcp->zc_word[2] = BSWAP_64(tmp.zc_word[2]);
1022a58b312SMartin Matuska zcp->zc_word[3] = BSWAP_64(tmp.zc_word[3]);
1032a58b312SMartin Matuska }
104