/*******************************************************************************
* Copyright 2014-2018 Intel Corporation
* All Rights Reserved.
*
* If this software was obtained under the Intel Simplified Software License,
* the following terms apply:
*
* The source code, information and material ("Material") contained herein is
* owned by Intel Corporation or its suppliers or licensors, and title to such
* Material remains with Intel Corporation or its suppliers or licensors. The
* Material contains proprietary information of Intel or its suppliers and
* licensors. The Material is protected by worldwide copyright laws and treaty
* provisions. No part of the Material may be used, copied, reproduced,
* modified, published, uploaded, posted, transmitted, distributed or disclosed
* in any way without Intel's prior express written permission. No license under
* any patent, copyright or other intellectual property rights in the Material
* is granted to or conferred upon you, either expressly, by implication,
* inducement, estoppel or otherwise. Any license under such intellectual
* property rights must be express and approved by Intel in writing.
*
* Unless otherwise agreed by Intel in writing, you may not remove or alter this
* notice or any other notice embedded in Materials by Intel or Intel's
* suppliers or licensors in any way.
*
*
* If this software was obtained under the Apache License, Version 2.0 (the
* "License"), the following terms apply:
*
* You may not use this file except in compliance with the License. You may
* obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
/*
//
// Purpose:
// Cryptography Primitive.
// Security Hash Standard
// Internal Definitions and Internal Functions Prototypes
//
//
*/
#if !defined(_PCP_HASH_H)
#define _PCP_HASH_H
/* messge block size */
#define MBS_SHA1 (64) /* SHA1 message block size (bytes) */
#define MBS_SHA256 (64) /* SHA256 and SHA224 */
#define MBS_SHA224 (64) /* SHA224 */
#define MBS_SHA512 (128) /* SHA512 and SHA384 */
#define MBS_SHA384 (128) /* SHA384 */
#define MBS_MD5 (64) /* MD5 */
#define MBS_SM3 (64) /* SM3 */
#define MBS_HASH_MAX (MBS_SHA512) /* max message block size (bytes) */
#define MAX_HASH_SIZE (IPP_SHA512_DIGEST_BITSIZE/8) /* hash of the max len (bytes) */
/* size of processed message length representation (bytes) */
#define MLR_SHA1 (sizeof(Ipp64u))
#define MLR_SHA256 (sizeof(Ipp64u))
#define MLR_SHA224 (sizeof(Ipp64u))
#define MLR_SHA512 (sizeof(Ipp64u)*2)
#define MLR_SHA384 (sizeof(Ipp64u)*2)
#define MLR_MD5 (sizeof(Ipp64u))
#define MLR_SM3 (sizeof(Ipp64u))
/* hold some old definition for a purpose */
typedef Ipp32u DigestSHA1[5]; /* SHA1 digest */
typedef Ipp32u DigestSHA224[7]; /* SHA224 digest */
typedef Ipp32u DigestSHA256[8]; /* SHA256 digest */
typedef Ipp64u DigestSHA384[6]; /* SHA384 digest */
typedef Ipp64u DigestSHA512[8]; /* SHA512 digest */
typedef Ipp32u DigestMD5[4]; /* MD5 digest */
typedef Ipp32u DigestSM3[8]; /* SM3 digest */
#define HASH_ALIGNMENT ((int)(sizeof(void*)))
#define SHA1_ALIGNMENT HASH_ALIGNMENT
#define SHA224_ALIGNMENT HASH_ALIGNMENT
#define SHA256_ALIGNMENT HASH_ALIGNMENT
#define SHA384_ALIGNMENT HASH_ALIGNMENT
#define SHA512_ALIGNMENT HASH_ALIGNMENT
#define MD5_ALIGNMENT HASH_ALIGNMENT
#define SM3_ALIGNMENT HASH_ALIGNMENT
struct _cpSHA1 {
IppCtxId idCtx; /* SHA1 identifier */
int msgBuffIdx; /* buffer entry */
Ipp64u msgLenLo; /* message length (bytes) */
Ipp8u msgBuffer[MBS_SHA1]; /* buffer */
DigestSHA1 msgHash; /* intermediate hash */
};
struct _cpSHA256 {
IppCtxId idCtx; /* SHA224 identifier */
int msgBuffIdx; /* buffer entry */
Ipp64u msgLenLo; /* message length */
Ipp8u msgBuffer[MBS_SHA256]; /* buffer */
DigestSHA256 msgHash; /* intermediate hash */
};
struct _cpSHA512 {
IppCtxId idCtx; /* SHA384 identifier */
int msgBuffIdx; /* buffer entry */
Ipp64u msgLenLo; /* message length */
Ipp64u msgLenHi; /* message length */
Ipp8u msgBuffer[MBS_SHA512]; /* buffer */
DigestSHA512 msgHash; /* intermediate hash */
};
struct _cpMD5 {
IppCtxId idCtx; /* MD5 identifier */
int msgBuffIdx; /* buffer entry */
Ipp64u msgLenLo; /* message length */
Ipp8u msgBuffer[MBS_MD5]; /* buffer */
DigestMD5 msgHash; /* intermediate hash */
};
struct _cpSM3 {
IppCtxId idCtx; /* SM3 identifier */
int msgBuffIdx; /* buffer entry */
Ipp64u msgLenLo; /* message length */
Ipp8u msgBuffer[MBS_SM3]; /* buffer */
DigestSM3 msgHash; /* intermediate hash */
};
/* hash alg attributes */
typedef struct _cpHashAttr {
int ivSize; /* attr: length (bytes) of initial value cpHashIV */
int hashSize; /* attr: length (bytes) of hash */
int msgBlkSize; /* attr: length (bytes) of message block */
int msgLenRepSize; /* attr: length (bytes) in representation of processed message length */
Ipp64u msgLenMax[2]; /* attr: max message length (bytes) (low high) */
} cpHashAttr;
/* hash value */
typedef Ipp64u cpHash[IPP_SHA512_DIGEST_BITSIZE/BITSIZE(Ipp64u)]; /* hash value */
/* hash update function */
typedef void (*cpHashProc)(void* pHash, const Ipp8u* pMsg, int msgLen, const void* pParam);
/* generalized hash context */
struct _cpHashCtx {
IppCtxId idCtx; /* hash identifier */
IppHashAlgId algID; /* hash algorithm ID */
Ipp64u msgLenLo; /* processed message:*/
Ipp64u msgLenHi; /* length */
cpHashProc hashProc; /* hash update func */
const void* pParam; /* hashProc's params */
cpHash msgHash; /* intermadiate hash */
int msgBuffIdx; /* buffer entry */
Ipp8u msgBuffer[MBS_HASH_MAX]; /* buffer */
};
/* accessors */
#define HASH_CTX_ID(stt) ((stt)->idCtx)
#define HASH_ALG_ID(stt) ((stt)->algID)
#define HASH_LENLO(stt) ((stt)->msgLenLo)
#define HASH_LENHI(stt) ((stt)->msgLenHi)
#define HASH_FUNC(stt) ((stt)->hashProc)
#define HASH_FUNC_PAR(stt) ((stt)->pParam)
#define HASH_VALUE(stt) ((stt)->msgHash)
#define HAHS_BUFFIDX(stt) ((stt)->msgBuffIdx)
#define HASH_BUFF(stt) ((stt)->msgBuffer)
#define HASH_VALID_ID(pCtx) (HASH_CTX_ID((pCtx))==idCtxHash)
/* initial hash values */
extern const Ipp32u SHA1_IV[];
extern const Ipp32u SHA256_IV[];
extern const Ipp32u SHA224_IV[];
extern const Ipp64u SHA512_IV[];
extern const Ipp64u SHA384_IV[];
extern const Ipp32u MD5_IV[];
extern const Ipp32u SM3_IV[];
extern const Ipp64u SHA512_224_IV[];
extern const Ipp64u SHA512_256_IV[];
/* hash alg additive constants */
extern __ALIGN16 const Ipp32u SHA1_cnt[];
extern __ALIGN16 const Ipp32u SHA256_cnt[];
extern __ALIGN16 const Ipp64u SHA512_cnt[];
extern __ALIGN16 const Ipp32u MD5_cnt[];
extern __ALIGN16 const Ipp32u SM3_cnt[];
/* hash alg opt argument */
extern const void* cpHashProcFuncOpt[];
/* enabled hash alg */
extern const IppHashAlgId cpEnabledHashAlgID[];
/* hash alg IV (init value) */
extern const Ipp8u* cpHashIV[];
/* hash alg attribute DB */
extern const cpHashAttr cpHashAlgAttr[];
/* IV size helper */
__INLINE int cpHashIvSize(IppHashAlgId algID)
{ return cpHashAlgAttr[algID].ivSize; }
/* hash size helper */
__INLINE int cpHashSize(IppHashAlgId algID)
{ return cpHashAlgAttr[algID].hashSize; }
/* message block size helper */
__INLINE int cpHashMBS(IppHashAlgId algID)
{ return cpHashAlgAttr[algID].msgBlkSize; }
/* maps algID into enabled IppHashAlgId value */
__INLINE IppHashAlgId cpValidHashAlg(IppHashAlgId algID)
{
/* maps algID into the valid range */
algID = (((int)ippHashAlg_Unknown < (int)algID) && ((int)algID < (int)ippHashAlg_MaxNo))? algID : ippHashAlg_Unknown;
return cpEnabledHashAlgID[algID];
}
/* common functions */
#define cpComputeDigest OWNAPI(cpComputeDigest)
void cpComputeDigest(Ipp8u* pHashTag, int hashTagLen, const IppsHashState* pCtx);
/* processing functions */
#define UpdateSHA1 OWNAPI(UpdateSHA1)
void UpdateSHA1 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#define UpdateSHA256 OWNAPI(UpdateSHA256)
void UpdateSHA256(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#define UpdateSHA512 OWNAPI(UpdateSHA512)
void UpdateSHA512(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#define UpdateMD5 OWNAPI(UpdateMD5)
void UpdateMD5 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#define UpdateSM3 OWNAPI(UpdateSM3)
void UpdateSM3 (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#if (_SHA_NI_ENABLING_ == _FEATURE_TICKTOCK_) || (_SHA_NI_ENABLING_ == _FEATURE_ON_)
#define UpdateSHA1ni OWNAPI(UpdateSHA1ni)
void UpdateSHA1ni (void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#define UpdateSHA256ni OWNAPI(UpdateSHA256ni)
void UpdateSHA256ni(void* pHash, const Ipp8u* mblk, int mlen, const void* pParam);
#endif
/* general methods */
#define cpInitHash OWNAPI(cpInitHash)
int cpInitHash(IppsHashState* pCtx, IppHashAlgId algID);
#define cpReInitHash OWNAPI(cpReInitHash)
int cpReInitHash(IppsHashState* pCtx, IppHashAlgId algID);
#endif /* _PCP_HASH_H */