/** @file
  Encode realted functions from Xkcp.

Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

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 "CryptParallelHash.h"

/**
  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
  )
{
  UINT32  BlockNum;
  UINT32  EncLen;
  UINT32  Index;
  UINTN   ValueCopy;

  for ( ValueCopy = Value, BlockNum = 0; ValueCopy && (BlockNum < sizeof (UINTN)); ++BlockNum, ValueCopy >>= 8 ) {
    //
    // Empty
    //
  }

  if (BlockNum == 0) {
    BlockNum = 1;
  }

  for (Index = 1; Index <= BlockNum; ++Index) {
    EncBuf[Index] = (UINT8)(Value >> (8 * (BlockNum - Index)));
  }

  EncBuf[0] = (UINT8)BlockNum;
  EncLen    = BlockNum + 1;

  return EncLen;
}

/**
  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
  )
{
  UINT32  BlockNum;
  UINT32  EncLen;
  UINT32  Index;
  UINTN   ValueCopy;

  for (ValueCopy = Value, BlockNum = 0; ValueCopy && (BlockNum < sizeof (UINTN)); ++BlockNum, ValueCopy >>= 8) {
    //
    // Empty
    //
  }

  if (BlockNum == 0) {
    BlockNum = 1;
  }

  for (Index = 1; Index <= BlockNum; ++Index) {
    EncBuf[Index-1] = (UINT8)(Value >> (8 * (BlockNum-Index)));
  }

  EncBuf[BlockNum] = (UINT8)BlockNum;
  EncLen           = BlockNum + 1;

  return EncLen;
}
