/** @file | |
ParallelHash related function and type declaration. | |
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. | |
Licensed under the OpenSSL license (the "License"). You may not use | |
this file except in compliance with the License. You can obtain a copy | |
in the file LICENSE in the source distribution or at | |
https://www.openssl.org/source/license.html | |
Copyright 2022 The eXtended Keccak Code Package (XKCP) | |
https://github.com/XKCP/XKCP | |
Keccak, designed by Guido Bertoni, Joan Daemen, Michael Peeters and Gilles Van Assche. | |
Implementation by the designers, hereby denoted as "the implementer". | |
For more information, feedback or questions, please refer to the Keccak Team website: | |
https://keccak.team/ | |
To the extent possible under law, the implementer has waived all copyright | |
and related or neighboring rights to the source code in this file. | |
http://creativecommons.org/publicdomain/zero/1.0/ | |
**/ | |
#include "InternalCryptLib.h" | |
#define KECCAK1600_WIDTH 1600 | |
typedef UINT64 uint64_t; | |
// | |
// This struct referring to m_sha3.c from opessl and modified its type name. | |
// | |
typedef struct { | |
uint64_t A[5][5]; | |
size_t block_size; /* cached ctx->digest->block_size */ | |
size_t md_size; /* output length, variable in XOF */ | |
size_t num; /* used bytes in below buffer */ | |
unsigned char buf[KECCAK1600_WIDTH / 8 - 32]; | |
unsigned char pad; | |
} Keccak1600_Ctx; | |
/** | |
SHA3_absorb can be called multiple times, but at each invocation | |
largest multiple of |r| out of |len| bytes are processed. Then | |
remaining amount of bytes is returned. This is done to spare caller | |
trouble of calculating the largest multiple of |r|. |r| can be viewed | |
as blocksize. It is commonly (1600 - 256*n)/8, e.g. 168, 136, 104, | |
72, but can also be (1600 - 448)/8 = 144. All this means that message | |
padding and intermediate sub-block buffering, byte- or bitwise, is | |
caller's responsibility. | |
**/ | |
size_t | |
SHA3_absorb ( | |
uint64_t A[5][5], | |
const unsigned char *inp, | |
size_t len, | |
size_t r | |
); | |
/** | |
SHA3_squeeze is called once at the end to generate |out| hash value | |
of |len| bytes. | |
**/ | |
void | |
SHA3_squeeze ( | |
uint64_t A[5][5], | |
unsigned char *out, | |
size_t len, | |
size_t r | |
); | |
/** | |
Encode function from XKCP. | |
Encodes the input as a byte string in a way that can be unambiguously parsed | |
from the beginning of the string by inserting the length of the byte string | |
before the byte string representation of input. | |
@param[out] EncBuf Result of left encode. | |
@param[in] Value Input of left encode. | |
@retval EncLen Size of encode result in bytes. | |
**/ | |
UINTN | |
EFIAPI | |
LeftEncode ( | |
OUT UINT8 *EncBuf, | |
IN UINTN Value | |
); | |
/** | |
Encode function from XKCP. | |
Encodes the input as a byte string in a way that can be unambiguously parsed | |
from the end of the string by inserting the length of the byte string after | |
the byte string representation of input. | |
@param[out] EncBuf Result of right encode. | |
@param[in] Value Input of right encode. | |
@retval EncLen Size of encode result in bytes. | |
**/ | |
UINTN | |
EFIAPI | |
RightEncode ( | |
OUT UINT8 *EncBuf, | |
IN UINTN Value | |
); | |
/** | |
Keccak initial fuction. | |
Set up state with specified capacity. | |
@param[out] Context Pointer to the context being initialized. | |
@param[in] Pad Delimited Suffix. | |
@param[in] BlockSize Size of context block. | |
@param[in] MessageDigestLen Size of message digest in bytes. | |
@retval 1 Initialize successfully. | |
@retval 0 Fail to initialize. | |
**/ | |
UINT8 | |
EFIAPI | |
KeccakInit ( | |
OUT Keccak1600_Ctx *Context, | |
IN UINT8 Pad, | |
IN UINTN BlockSize, | |
IN UINTN MessageDigstLen | |
); | |
/** | |
Sha3 update fuction. | |
This function performs Sha3 digest on a data buffer of the specified size. | |
It can be called multiple times to compute the digest of long or discontinuous data streams. | |
@param[in,out] Context Pointer to the Keccak context. | |
@param[in] Data Pointer to the buffer containing the data to be hashed. | |
@param[in] DataSize Size of Data buffer in bytes. | |
@retval 1 Update successfully. | |
**/ | |
UINT8 | |
EFIAPI | |
Sha3Update ( | |
IN OUT Keccak1600_Ctx *Context, | |
IN const VOID *Data, | |
IN UINTN DataSize | |
); | |
/** | |
Completes computation of Sha3 message digest. | |
This function completes sha3 hash computation and retrieves the digest value into | |
the specified memory. After this function has been called, the keccak context cannot | |
be used again. | |
@param[in, out] Context Pointer to the keccak context. | |
@param[out] MessageDigest Pointer to a buffer that receives the message digest. | |
@retval 1 Meaasge digest computation succeeded. | |
**/ | |
UINT8 | |
EFIAPI | |
Sha3Final ( | |
IN OUT Keccak1600_Ctx *Context, | |
OUT UINT8 *MessageDigest | |
); | |
/** | |
Computes the CSHAKE-256 message digest of a input data buffer. | |
This function performs the CSHAKE-256 message digest of a given data buffer, and places | |
the digest value into the specified memory. | |
@param[in] Data Pointer to the buffer containing the data to be hashed. | |
@param[in] DataSize Size of Data buffer in bytes. | |
@param[in] OutputLen Size of output in bytes. | |
@param[in] Name Pointer to the function name string. | |
@param[in] NameLen Size of the function name in bytes. | |
@param[in] Customization Pointer to the customization string. | |
@param[in] CustomizationLen Size of the customization string in bytes. | |
@param[out] HashValue Pointer to a buffer that receives the CSHAKE-256 digest | |
value. | |
@retval TRUE CSHAKE-256 digest computation succeeded. | |
@retval FALSE CSHAKE-256 digest computation failed. | |
@retval FALSE This interface is not supported. | |
**/ | |
BOOLEAN | |
EFIAPI | |
CShake256HashAll ( | |
IN CONST VOID *Data, | |
IN UINTN DataSize, | |
IN UINTN OutputLen, | |
IN CONST VOID *Name, | |
IN UINTN NameLen, | |
IN CONST VOID *Customization, | |
IN UINTN CustomizationLen, | |
OUT UINT8 *HashValue | |
); | |
/** | |
Complete computation of digest of each block. | |
Each AP perform the function called by BSP. | |
@param[in] ProcedureArgument Argument of the procedure. | |
**/ | |
VOID | |
EFIAPI | |
ParallelHashApExecute ( | |
IN VOID *ProcedureArgument | |
); | |
/** | |
Dispatch the block task to each AP. | |
**/ | |
VOID | |
EFIAPI | |
DispatchBlockToAp ( | |
VOID | |
); |