| /******************************************************************************* |
| * 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 */ |