ReactOS 0.4.17-dev-1005-g171e1de
hash.c File Reference
#include "precomp.h"
Include dependency graph for hash.c:

Go to the source code of this file.

Functions

VOID SYMCRYPT_CALL SymCryptHashAppendInternal (_In_ PCSYMCRYPT_HASH pHash, _Inout_ PSYMCRYPT_COMMON_HASH_STATE pState, _In_reads_bytes_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptHashCommonPaddingMd4Style (_In_ PCSYMCRYPT_HASH pHash, _Inout_ PSYMCRYPT_COMMON_HASH_STATE pState)
 
SIZE_T SYMCRYPT_CALL SymCryptHashResultSize (_In_ PCSYMCRYPT_HASH pHash)
 
SIZE_T SYMCRYPT_CALL SymCryptHashInputBlockSize (_In_ PCSYMCRYPT_HASH pHash)
 
SIZE_T SYMCRYPT_CALL SymCryptHashStateSize (_In_ PCSYMCRYPT_HASH pHash)
 
VOID SYMCRYPT_CALL SymCryptHash (_In_ PCSYMCRYPT_HASH pHash, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE pbResult, SIZE_T cbResult)
 
VOID SYMCRYPT_CALL SymCryptHashInit (_In_ PCSYMCRYPT_HASH pHash, _Out_writes_bytes_(pHash->stateSize) PVOID pState)
 
VOID SYMCRYPT_CALL SymCryptHashAppend (_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptHashResult (_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE pbResult, SIZE_T cbResult)
 
VOID SYMCRYPT_CALL SymCryptHashStateCopy (_In_ PCSYMCRYPT_HASH pHash, _In_reads_(pHash->stateSize) PCVOID pSrc, _Out_writes_(pHash->stateSize) PVOID pDst)
 

Function Documentation

◆ SymCryptHash()

VOID SYMCRYPT_CALL SymCryptHash ( _In_ PCSYMCRYPT_HASH  pHash,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE  pbResult,
SIZE_T  cbResult 
)

Definition at line 155 of file hash.c.

161{
163
164 _Analysis_assume_( pHash->stateSize <= sizeof( hash ) );
165 SymCryptHashInit( pHash, &hash );
167 SymCryptHashResult( pHash, &hash, pbResult, cbResult );
168 SymCryptWipe( &hash, pHash->stateSize );
169}
#define _Analysis_assume_
Definition: no_sal2.h:388
VOID SYMCRYPT_CALL SymCryptHashAppend(_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: hash.c:182
VOID SYMCRYPT_CALL SymCryptHashInit(_In_ PCSYMCRYPT_HASH pHash, _Out_writes_bytes_(pHash->stateSize) PVOID pState)
Definition: hash.c:173
VOID SYMCRYPT_CALL SymCryptHashResult(_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE pbResult, SIZE_T cbResult)
Definition: hash.c:193
static const BYTE pbResult[]
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
PCBYTE PBYTE SIZE_T cbData
PCBYTE pbData

Referenced by SymCryptDlgroupGeneratePrimeP_FIPS(), SymCryptDlgroupGeneratePrimeQ_FIPS(), SymCryptHmacExpandKey(), SymCryptRsaOaepApplyEncryptionPadding(), SymCryptRsaOaepRemoveEncryptionPadding(), SymCryptRsaPssApplySignaturePadding(), and SymCryptRsaPssVerifySignaturePadding().

◆ SymCryptHashAppend()

◆ SymCryptHashAppendInternal()

VOID SYMCRYPT_CALL SymCryptHashAppendInternal ( _In_ PCSYMCRYPT_HASH  pHash,
_Inout_ PSYMCRYPT_COMMON_HASH_STATE  pState,
_In_reads_bytes_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 10 of file hash.c.

15{
17 UINT32 freeInBuffer;
18 SIZE_T tmp;
19
21
22 pState->dataLengthL += cbData;
23 if( pState->dataLengthL < cbData ) {
24 pState->dataLengthH ++; // This is almost-unreachable code as it requires 2^64 bytes to be hashed.
25 }
26
27 bytesInBuffer = pState->bytesInBuffer;
28
29 //
30 // If previous data in buffer, buffer new input and transform if possible.
31 //
32 if( bytesInBuffer > 0 )
33 {
34 SYMCRYPT_ASSERT( pHash->inputBlockSize > bytesInBuffer );
35
36 freeInBuffer = pHash->inputBlockSize - bytesInBuffer;
37 if( cbData < freeInBuffer )
38 {
39 //
40 // All the data will fit in the buffer.
41 // We don't do anything here.
42 // As cbData < inputBlockSize the bulk data processing is skipped,
43 // and the data will be copied to the buffer at the end
44 // of this code.
45 } else {
46 //
47 // Enough data to fill the whole buffer & process it
48 //
49 memcpy(&pState->buffer[bytesInBuffer], pbData, freeInBuffer);
50 pbData += freeInBuffer;
51 cbData -= freeInBuffer;
52 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, &pState->buffer[0], pHash->inputBlockSize, &tmp );
53
54 bytesInBuffer = 0;
55 }
56 }
57
58 //
59 // Internal buffer is empty; process all remaining whole blocks in the input
60 //
61 if( cbData >= pHash->inputBlockSize )
62 {
63 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pbData, cbData, &tmp );
64 SYMCRYPT_ASSERT( tmp < pHash->inputBlockSize );
65 pbData += cbData - tmp;
66 cbData = tmp;
67 }
68
69 SYMCRYPT_ASSERT( cbData < pHash->inputBlockSize );
70
71 //
72 // buffer remaining input if necessary.
73 //
74 if( cbData > 0 )
75 {
78 }
79
80 pState->bytesInBuffer = bytesInBuffer;
81}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
BYTE * PBYTE
Definition: pedump.c:66
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
SIZE_T bytesInBuffer
UINT32 inputBlockSize
#define SYMCRYPT_CHECK_MAGIC(p)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptMd2Append(), SymCryptMd4Append(), SymCryptMd5Append(), and SymCryptSha1Append().

◆ SymCryptHashCommonPaddingMd4Style()

VOID SYMCRYPT_CALL SymCryptHashCommonPaddingMd4Style ( _In_ PCSYMCRYPT_HASH  pHash,
_Inout_ PSYMCRYPT_COMMON_HASH_STATE  pState 
)

Definition at line 85 of file hash.c.

88{
89 SIZE_T tmp;
90 SIZE_T bytesInBuffer = pState->bytesInBuffer;
91
93 SYMCRYPT_ASSERT( pHash->inputBlockSize == 64 );
94 SYMCRYPT_ASSERT( bytesInBuffer == (pState->dataLengthL & 0x3f) );
95
96 //
97 // The buffer is never completely full, so we can always put the first
98 // padding byte in.
99 //
100 pState->buffer[bytesInBuffer++] = 0x80;
101
102 if( bytesInBuffer > 64-8 ) {
103 //
104 // No room for the rest of the padding. Pad with zeroes & process block
105 // bytesInBuffer is at most 64, so we do not have an integer underflow
106 //
108 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pState->buffer, 64, &tmp );
109 SYMCRYPT_ASSERT( tmp == 0 );
110 bytesInBuffer = 0;
111 }
112
113 //
114 // Set rest of padding
115 // At this point bytesInBuffer <= 64-8, so we don't have an underflow
116 // We wipe to the end of the buffer as it is 16-aligned,
117 // and it is faster to wipe to an aligned point
118 //
120 SYMCRYPT_STORE_LSBFIRST64( &pState->buffer[64-8], pState->dataLengthL * 8 );
121
122 //
123 // Process the final block
124 //
125 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pState->buffer, 64, &tmp );
126}
#define SYMCRYPT_STORE_LSBFIRST64(p, v)
Definition: symcrypt.h:308

Referenced by SymCryptMd4Result(), and SymCryptMd5Result().

◆ SymCryptHashInit()

◆ SymCryptHashInputBlockSize()

SIZE_T SYMCRYPT_CALL SymCryptHashInputBlockSize ( _In_ PCSYMCRYPT_HASH  pHash)

Definition at line 140 of file hash.c.

141{
142 return pHash->inputBlockSize;
143}

Referenced by hash_block_len_impl(), and SymCryptSskdfMacExpandSalt().

◆ SymCryptHashResult()

VOID SYMCRYPT_CALL SymCryptHashResult ( _In_ PCSYMCRYPT_HASH  pHash,
_Inout_updates_bytes_(pHash->stateSize) PVOID  pState,
_Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE  pbResult,
SIZE_T  cbResult 
)

◆ SymCryptHashResultSize()

◆ SymCryptHashStateCopy()

VOID SYMCRYPT_CALL SymCryptHashStateCopy ( _In_ PCSYMCRYPT_HASH  pHash,
_In_reads_(pHash->stateSize) PCVOID  pSrc,
_Out_writes_(pHash->stateSize) PVOID  pDst 
)

Definition at line 210 of file hash.c.

214{
215 (*pHash->stateCopyFunc)( pSrc, pDst );
216}

Referenced by SymCryptHmacInit(), SymCryptHmacKeyCopy(), SymCryptHmacResult(), SymCryptHmacStateCopy(), SymCryptSshKdfDerive(), SymCryptXmssChain(), and SymCryptXmssRandHash().

◆ SymCryptHashStateSize()