1*2227535dSJoseph Chen // SPDX-License-Identifier: Apache-2.0 2*2227535dSJoseph Chen /* 3*2227535dSJoseph Chen * FIPS-180-2 compliant SHA-384/512 implementation 4*2227535dSJoseph Chen * 5*2227535dSJoseph Chen * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 6*2227535dSJoseph Chen * 7*2227535dSJoseph Chen * Licensed under the Apache License, Version 2.0 (the "License"); you may 8*2227535dSJoseph Chen * not use this file except in compliance with the License. 9*2227535dSJoseph Chen * You may obtain a copy of the License at 10*2227535dSJoseph Chen * 11*2227535dSJoseph Chen * http://www.apache.org/licenses/LICENSE-2.0 12*2227535dSJoseph Chen * 13*2227535dSJoseph Chen * Unless required by applicable law or agreed to in writing, software 14*2227535dSJoseph Chen * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15*2227535dSJoseph Chen * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*2227535dSJoseph Chen * See the License for the specific language governing permissions and 17*2227535dSJoseph Chen * limitations under the License. 18*2227535dSJoseph Chen * 19*2227535dSJoseph Chen * This file is part of mbed TLS (https://tls.mbed.org) 20*2227535dSJoseph Chen */ 21*2227535dSJoseph Chen /* 22*2227535dSJoseph Chen * The SHA-512 Secure Hash Standard was published by NIST in 2002. 23*2227535dSJoseph Chen * 24*2227535dSJoseph Chen * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf 25*2227535dSJoseph Chen */ 26*2227535dSJoseph Chen 27*2227535dSJoseph Chen #ifndef _SHA512_H 28*2227535dSJoseph Chen #define _SHA512_H 29*2227535dSJoseph Chen 30*2227535dSJoseph Chen #ifdef __cplusplus 31*2227535dSJoseph Chen extern "C" { 32*2227535dSJoseph Chen #endif 33*2227535dSJoseph Chen 34*2227535dSJoseph Chen /** 35*2227535dSJoseph Chen * \brief The SHA-512 context structure. 36*2227535dSJoseph Chen * 37*2227535dSJoseph Chen * The structure is used both for SHA-384 and for SHA-512 38*2227535dSJoseph Chen * checksum calculations. The choice between these two is 39*2227535dSJoseph Chen * made in the call to sha512_starts(). 40*2227535dSJoseph Chen */ 41*2227535dSJoseph Chen typedef struct sha512_context { 42*2227535dSJoseph Chen uint64_t total[2]; /*!< The number of Bytes processed. */ 43*2227535dSJoseph Chen uint64_t state[8]; /*!< The intermediate digest state. */ 44*2227535dSJoseph Chen unsigned char buffer[128]; /*!< The data block being processed. */ 45*2227535dSJoseph Chen int is384; /*!< Determines which function to use: 46*2227535dSJoseph Chen 0: Use SHA-512, or 1: Use SHA-384. */ 47*2227535dSJoseph Chen } sha512_context; 48*2227535dSJoseph Chen 49*2227535dSJoseph Chen /** 50*2227535dSJoseph Chen * \brief This function starts a SHA-384 or SHA-512 checksum 51*2227535dSJoseph Chen * calculation. 52*2227535dSJoseph Chen * 53*2227535dSJoseph Chen * \param ctx The SHA-512 context to initialize. 54*2227535dSJoseph Chen * \param is384 Determines which function to use: 55*2227535dSJoseph Chen * 0: Use SHA-512, or 1: Use SHA-384. 56*2227535dSJoseph Chen * 57*2227535dSJoseph Chen * \return \c 0 on success. 58*2227535dSJoseph Chen */ 59*2227535dSJoseph Chen int sha512_starts(sha512_context *ctx); 60*2227535dSJoseph Chen 61*2227535dSJoseph Chen /** 62*2227535dSJoseph Chen * \brief This function feeds an input buffer into an ongoing 63*2227535dSJoseph Chen * SHA-512 checksum calculation. 64*2227535dSJoseph Chen * 65*2227535dSJoseph Chen * \param ctx The SHA-512 context. 66*2227535dSJoseph Chen * \param input The buffer holding the input data. 67*2227535dSJoseph Chen * \param ilen The length of the input data. 68*2227535dSJoseph Chen * 69*2227535dSJoseph Chen * \return \c 0 on success. 70*2227535dSJoseph Chen */ 71*2227535dSJoseph Chen int sha512_update(sha512_context *ctx, const unsigned char *input, size_t ilen); 72*2227535dSJoseph Chen 73*2227535dSJoseph Chen /** 74*2227535dSJoseph Chen * \brief This function finishes the SHA-512 operation, and writes 75*2227535dSJoseph Chen * the result to the output buffer. 76*2227535dSJoseph Chen * 77*2227535dSJoseph Chen * \param ctx The SHA-512 context. 78*2227535dSJoseph Chen * \param output The SHA-384 or SHA-512 checksum result. 79*2227535dSJoseph Chen * 80*2227535dSJoseph Chen * \return \c 0 on success. 81*2227535dSJoseph Chen */ 82*2227535dSJoseph Chen int sha512_finish(sha512_context *ctx, unsigned char output[64]); 83*2227535dSJoseph Chen 84*2227535dSJoseph Chen /** 85*2227535dSJoseph Chen * \brief This function starts SHA-512 checksum for the input data. 86*2227535dSJoseph Chen * 87*2227535dSJoseph Chen * \param input The buffer holding the input data. 88*2227535dSJoseph Chen * \param ilen The length of the input data. 89*2227535dSJoseph Chen * \param output The SHA-384 or SHA-512 checksum result. 90*2227535dSJoseph Chen */ 91*2227535dSJoseph Chen void sha512_csum(const unsigned char *input, unsigned int ilen, 92*2227535dSJoseph Chen unsigned char output[64]); 93*2227535dSJoseph Chen 94*2227535dSJoseph Chen #ifdef __cplusplus 95*2227535dSJoseph Chen } 96*2227535dSJoseph Chen #endif 97*2227535dSJoseph Chen 98*2227535dSJoseph Chen #endif /* sha512.h */ 99