REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3885 Parallel hash patch redefines uint_64 type in CrtLibSupport.h which has been defined in openssl/include/openssl/e_os2.h. CryptMd5.c including e_os2.h cause redefinition bug. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com> Cc: Guomin Jiang <guomin.jiang@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Signed-off-by: Zhihao Li <zhihao.li@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
		
			
				
	
	
		
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @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
 | 
						|
  );
 |