Path: blob/main/sys/contrib/openzfs/module/icp/algs/modes/gcm_generic.c
48775 views
// SPDX-License-Identifier: CDDL-1.01/*2* CDDL HEADER START3*4* The contents of this file are subject to the terms of the5* 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.LICENSE9* or https://opensource.org/licenses/CDDL-1.0.10* See the License for the specific language governing permissions11* and limitations under the License.12*13* When distributing Covered Code, include this CDDL HEADER in each14* file and include the License file at usr/src/OPENSOLARIS.LICENSE.15* If applicable, add the following below this CDDL HEADER, with the16* fields enclosed by brackets "[]" replaced with your own identifying17* information: Portions Copyright [yyyy] [name of copyright owner]18*19* CDDL HEADER END20*/21/*22* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.23*/2425#include <modes/gcm_impl.h>2627struct aes_block {28uint64_t a;29uint64_t b;30};3132/*33* Perform a carry-less multiplication (that is, use XOR instead of the34* multiply operator) on *x_in and *y and place the result in *res.35*36* Byte swap the input (*x_in and *y) and the output (*res).37*38* Note: x_in, y, and res all point to 16-byte numbers (an array of two39* 64-bit integers).40*/41static void42gcm_generic_mul(uint64_t *x_in, uint64_t *y, uint64_t *res)43{44static const uint64_t R = 0xe100000000000000ULL;45struct aes_block z = {0, 0};46struct aes_block v;47uint64_t x;48int i, j;4950v.a = ntohll(y[0]);51v.b = ntohll(y[1]);5253for (j = 0; j < 2; j++) {54x = ntohll(x_in[j]);55for (i = 0; i < 64; i++, x <<= 1) {56if (x & 0x8000000000000000ULL) {57z.a ^= v.a;58z.b ^= v.b;59}60if (v.b & 1ULL) {61v.b = (v.a << 63)|(v.b >> 1);62v.a = (v.a >> 1) ^ R;63} else {64v.b = (v.a << 63)|(v.b >> 1);65v.a = v.a >> 1;66}67}68}69res[0] = htonll(z.a);70res[1] = htonll(z.b);71}7273static boolean_t74gcm_generic_will_work(void)75{76return (B_TRUE);77}7879const gcm_impl_ops_t gcm_generic_impl = {80.mul = &gcm_generic_mul,81.is_supported = &gcm_generic_will_work,82.name = "generic"83};848586