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

Go to the source code of this file.

Macros

#define ALG   SHA224
 
#define Alg   Sha224
 
#define ALG   SHA256
 
#define Alg   Sha256
 
#define MAJ(x, y, z)   ((((z) | (y)) & (x) ) | ((z) & (y)))
 
#define CH(x, y, z)   ((((z) ^ (y)) & (x)) ^ (z))
 
#define USE_CSIGMA0_MULTIROT   0
 
#define USE_CSIGMA1_MULTIROT   0
 
#define USE_LSIGMA0_MULTIROT   0
 
#define USE_LSIGMA1_MULTIROT   0
 
#define CSIGMA0(x)   (ROR32((x), 2) ^ ROR32((x), 13) ^ ROR32((x), 22))
 
#define CSIGMA1(x)   (ROR32((x), 6) ^ ROR32((x), 11) ^ ROR32((x), 25))
 
#define LSIGMA0(x)   (ROR32((x), 7) ^ ROR32((x), 18) ^ ((x)>> 3))
 
#define LSIGMA1(x)   (ROR32((x), 17) ^ ROR32((x), 19) ^ ((x)>>10))
 
#define CROUND(r16, r)
 
#define IROUND(r)
 
#define FROUND(r16, rb)
 
#define EXPAND(a, b, c, d, r)
 
#define DO_ROUND(a, b, c, d, t, r)
 

Functions

 SYMCRYPT_ALIGN_AT (256) const
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Init (_Out_ PSYMCRYPT_SHA256_STATE pState)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Init (_Out_ PSYMCRYPT_SHA224_STATE pState)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Append (_Inout_ PSYMCRYPT_SHA256_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Append (_Inout_ PSYMCRYPT_SHA224_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Result (_Inout_ PSYMCRYPT_SHA256_STATE pState, _Out_writes_(SYMCRYPT_SHA256_RESULT_SIZE) PBYTE pbResult)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Result (_Inout_ PSYMCRYPT_SHA224_STATE pState, _Out_writes_(SYMCRYPT_SHA224_RESULT_SIZE) PBYTE pbResult)
 
VOID SYMCRYPT_CALL SymCryptSha256StateExportCore (_In_ PCSYMCRYPT_SHA256_STATE pState, _Out_writes_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PBYTE pbBlob, _In_ UINT32 type)
 
VOID SYMCRYPT_CALL SymCryptSha256StateExport (_In_ PCSYMCRYPT_SHA256_STATE pState, _Out_writes_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PBYTE pbBlob)
 
VOID SYMCRYPT_CALL SymCryptSha224StateExport (_In_ PCSYMCRYPT_SHA224_STATE pState, _Out_writes_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PBYTE pbBlob)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSha256StateImportCore (_Out_ PSYMCRYPT_SHA256_STATE pState, _In_reads_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PCBYTE pbBlob, _In_ UINT32 type)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSha256StateImport (_Out_ PSYMCRYPT_SHA256_STATE pState, _In_reads_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PCBYTE pbBlob)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSha224StateImport (_Out_ PSYMCRYPT_SHA224_STATE pState, _In_reads_bytes_(SYMCRYPT_SHA224_STATE_EXPORT_SIZE) PCBYTE pbBlob)
 
VOID SYMCRYPT_CALL SymCryptSha256Selftest (void)
 
VOID SYMCRYPT_CALL SymCryptSha224Selftest (void)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul1 (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul2 (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 

Variables

const SYMCRYPT_HASH SymCryptSha224Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha256Algorithm_default
 
const PCSYMCRYPT_HASH SymCryptSha224Algorithm = &SymCryptSha224Algorithm_default
 
const PCSYMCRYPT_HASH SymCryptSha256Algorithm = &SymCryptSha256Algorithm_default
 
static const UINT32 sha224InitialState [8]
 
static const UINT32 sha256InitialState [8]
 
const BYTE SymCryptSha256KATAnswer [32]
 
const BYTE SymCryptSha224KATAnswer [28]
 

Macro Definition Documentation

◆ ALG [1/2]

#define ALG   SHA224

Definition at line 111 of file sha256.c.

◆ Alg [1/2]

#define Alg   Sha224

Definition at line 112 of file sha256.c.

◆ ALG [2/2]

#define ALG   SHA256

Definition at line 111 of file sha256.c.

◆ Alg [2/2]

#define Alg   Sha256

Definition at line 112 of file sha256.c.

◆ CH

#define CH (   x,
  y,
  z 
)    ((((z) ^ (y)) & (x)) ^ (z))

Definition at line 555 of file sha256.c.

◆ CROUND

#define CROUND (   r16,
  r 
)
Value:
{;\
ah[ r16 &7] += CSIGMA1(ah[(r16+3)&7]) + CH(ah[(r16+3)&7], ah[(r16+2)&7], ah[(r16+1)&7]) + SymCryptSha256K[r] + Wt;\
ah[(r16+4)&7] += ah[r16 &7];\
ah[ r16 &7] += CSIGMA0(ah[(r16+7)&7]) + MAJ(ah[(r16+7)&7], ah[(r16+6)&7], ah[(r16+5)&7]);\
}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define CH(x, y, z)
Definition: sha256.c:555
#define CSIGMA0(x)
Definition: sha256.c:612
#define MAJ(x, y, z)
Definition: sha256.c:554
#define CSIGMA1(x)
Definition: sha256.c:630

Definition at line 707 of file sha256.c.

◆ CSIGMA0

#define CSIGMA0 (   x)    (ROR32((x), 2) ^ ROR32((x), 13) ^ ROR32((x), 22))

Definition at line 612 of file sha256.c.

◆ CSIGMA1

#define CSIGMA1 (   x)    (ROR32((x), 6) ^ ROR32((x), 11) ^ ROR32((x), 25))

Definition at line 630 of file sha256.c.

◆ DO_ROUND

#define DO_ROUND (   a,
  b,
  c,
  d,
  t,
  r 
)
Value:
t = W[r] + CSIGMA1( W[r-5] ) + W[r-8] + CH( W[r-5], W[r-6], W[r-7] ) + SymCryptSha256K[r]; \
W[r-4] = t + d; \
d = t + CSIGMA0( a ) + MAJ( c, b, a );
GLdouble GLdouble t
Definition: gl.h:2047
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define d
Definition: ke_i.h:81
Definition: polytest.cpp:36

◆ EXPAND

#define EXPAND (   a,
  b,
  c,
  d,
  r 
)
Value:
c = W[r-15]; \
b = d + LSIGMA1( b ) + W[r-7] + LSIGMA0( c ); \
W[r] = b; \
#define b
Definition: ke_i.h:79
#define LSIGMA1(x)
Definition: sha256.c:664
#define LSIGMA0(x)
Definition: sha256.c:647

◆ FROUND

#define FROUND (   r16,
  rb 
)
Value:
{ \
Wt = LSIGMA1( W[(r16-2) & 15] ) + W[(r16-7) & 15] + \
LSIGMA0( W[(r16-15) & 15]) + W[r16 & 15]; \
W[r16] = Wt; \
CROUND( r16, r16+rb ); \
}

Definition at line 727 of file sha256.c.

◆ IROUND

#define IROUND (   r)
Value:
{\
W[r] = Wt; \
CROUND(r,r);\
}
#define SYMCRYPT_LOAD_MSBFIRST32(p)
Definition: symcrypt.h:303
PCBYTE pbData

Definition at line 717 of file sha256.c.

◆ LSIGMA0

#define LSIGMA0 (   x)    (ROR32((x), 7) ^ ROR32((x), 18) ^ ((x)>> 3))

Definition at line 647 of file sha256.c.

◆ LSIGMA1

#define LSIGMA1 (   x)    (ROR32((x), 17) ^ ROR32((x), 19) ^ ((x)>>10))

Definition at line 664 of file sha256.c.

◆ MAJ

#define MAJ (   x,
  y,
  z 
)    ((((z) | (y)) & (x) ) | ((z) & (y)))

Definition at line 554 of file sha256.c.

◆ USE_CSIGMA0_MULTIROT

#define USE_CSIGMA0_MULTIROT   0

Definition at line 591 of file sha256.c.

◆ USE_CSIGMA1_MULTIROT

#define USE_CSIGMA1_MULTIROT   0

Definition at line 592 of file sha256.c.

◆ USE_LSIGMA0_MULTIROT

#define USE_LSIGMA0_MULTIROT   0

Definition at line 593 of file sha256.c.

◆ USE_LSIGMA1_MULTIROT

#define USE_LSIGMA1_MULTIROT   0

Definition at line 594 of file sha256.c.

Function Documentation

◆ SYMCRYPT_ALIGN_AT()

SYMCRYPT_ALIGN_AT ( 256  ) const

Definition at line 54 of file sha256.c.

54 {
55 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
56 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
57 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
58 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
59 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
60 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
61 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
62 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
63 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
64 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
65 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
66 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
67 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
68 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
69 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
70 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
71};

◆ SymCryptSha224Append()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Append ( _Inout_ PSYMCRYPT_SHA224_STATE  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 247 of file sha256.c.

251{
253}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Append(_Inout_ PSYMCRYPT_SHA256_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: sha256.c:171
PCBYTE PBYTE SIZE_T cbData
* PSYMCRYPT_SHA256_STATE
PSYMCRYPT_COMMON_HASH_STATE pState

◆ SymCryptSha224Init()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Init ( _Out_ PSYMCRYPT_SHA224_STATE  pState)

Definition at line 148 of file sha256.c.

149{
151
152 pState->dataLengthL = 0;
153 //pState->dataLengthH = 0; // not used
154 pState->bytesInBuffer = 0;
155
156 memcpy( &pState->chain.H[0], &sha224InitialState[0], sizeof( sha224InitialState ) );
157
158 //
159 // There is no need to initialize the buffer part of the state as that will be
160 // filled before it is used.
161 //
162}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static const UINT32 sha224InitialState[8]
Definition: sha256.c:77
#define SYMCRYPT_SET_MAGIC(p)

Referenced by SymCryptSha224Result().

◆ SymCryptSha224Result()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Result ( _Inout_ PSYMCRYPT_SHA224_STATE  pState,
_Out_writes_(SYMCRYPT_SHA224_RESULT_SIZE) PBYTE  pbResult 
)

Definition at line 330 of file sha256.c.

333{
334 SYMCRYPT_ALIGN BYTE sha256Result[SYMCRYPT_SHA256_RESULT_SIZE]; // Buffer for SHA-256 output
335
336 //
337 // The SHA-3224 result is the first 28 bytes of the SHA-256 result of our state
338 //
341
342 //
343 // The buffer was already wiped by the SymCryptSha256Result function, we
344 // just have to re-initialize for SHA-224
345 //
347
348 SymCryptWipeKnownSize( sha256Result, sizeof( sha256Result ) );
349}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Result(_Inout_ PSYMCRYPT_SHA256_STATE pState, _Out_writes_(SYMCRYPT_SHA256_RESULT_SIZE) PBYTE pbResult)
Definition: sha256.c:262
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Init(_Out_ PSYMCRYPT_SHA224_STATE pState)
Definition: sha256.c:148
static const BYTE pbResult[]
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_SHA256_RESULT_SIZE
Definition: symcrypt.h:1222
#define SYMCRYPT_SHA224_RESULT_SIZE
Definition: symcrypt.h:1157
#define SYMCRYPT_ALIGN
unsigned char BYTE
Definition: xxhash.c:193

◆ SymCryptSha224Selftest()

VOID SYMCRYPT_CALL SymCryptSha224Selftest ( void  )

Definition at line 511 of file sha256.c.

512{
514
516
517 SymCryptInjectError( result, sizeof( result ) );
518
519 if( memcmp( result, SymCryptSha224KATAnswer, sizeof( result ) ) != 0 ) {
520 SymCryptFatal( 'SH22' );
521 }
522}
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
GLuint64EXT * result
Definition: glext.h:11304
VOID SYMCRYPT_CALL SymCryptInjectError(PBYTE pbData, SIZE_T cbData)
const BYTE SymCryptTestMsg3[3]
Definition: selftest.c:8
const BYTE SymCryptSha224KATAnswer[28]
Definition: sha256.c:502
VOID SYMCRYPT_CALL SymCryptSha224(_In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_SHA224_RESULT_SIZE) PBYTE pbResult)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)

◆ SymCryptSha224StateExport()

Definition at line 401 of file sha256.c.

404{
406}
@ SymCryptBlobTypeSha224State
Definition: sc_lib.h:1071
VOID SYMCRYPT_CALL SymCryptSha256StateExportCore(_In_ PCSYMCRYPT_SHA256_STATE pState, _Out_writes_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PBYTE pbBlob, _In_ UINT32 type)
Definition: sha256.c:354

◆ SymCryptSha224StateImport()

Definition at line 463 of file sha256.c.

466{
468}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSha256StateImportCore(_Out_ PSYMCRYPT_SHA256_STATE pState, _In_reads_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PCBYTE pbBlob, _In_ UINT32 type)
Definition: sha256.c:411

◆ SymCryptSha256Append()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Append ( _Inout_ PSYMCRYPT_SHA256_STATE  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 171 of file sha256.c.

175{
177 UINT32 freeInBuffer;
178 SIZE_T tmp;
179
181
182 pState->dataLengthL += cbData; // dataLengthH is not used...
183
184 bytesInBuffer = pState->bytesInBuffer;
185
186 //
187 // If previous data in buffer, buffer new input and transform if possible.
188 //
189 if( bytesInBuffer > 0 )
190 {
192
194 if( cbData < freeInBuffer )
195 {
196 //
197 // All the data will fit in the buffer.
198 // We don't do anything here.
199 // As cbData < inputBlockSize the bulk data processing is skipped,
200 // and the data will be copied to the buffer at the end
201 // of this code.
202 } else {
203 //
204 // Enough data to fill the whole buffer & process it
205 //
206 memcpy(&pState->buffer[bytesInBuffer], pbData, freeInBuffer);
207 pbData += freeInBuffer;
208 cbData -= freeInBuffer;
210
211 bytesInBuffer = 0;
212 }
213 }
214
215 //
216 // Internal buffer is empty; process all remaining whole blocks in the input
217 //
219 {
222 pbData += cbData - tmp;
223 cbData = tmp;
224 }
225
227
228 //
229 // buffer remaining input if necessary.
230 //
231 if( cbData > 0 )
232 {
233 memcpy( &pState->buffer[bytesInBuffer], pbData, cbData );
235 }
236
237 pState->bytesInBuffer = bytesInBuffer;
238}
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
Definition: sha256.c:1812
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
#define SYMCRYPT_SHA256_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1223
SIZE_T bytesInBuffer
#define SYMCRYPT_CHECK_MAGIC(p)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptSha224Append().

◆ SymCryptSha256AppendBlocks()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 1812 of file sha256.c.

1817{
1818#if SYMCRYPT_CPU_AMD64
1819
1820 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1821
1823 SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1824 {
1825 SymCryptSha256AppendBlocks_shani(pChain, pbData, cbData, pcbRemaining);
1826
1827 SymCryptRestoreXmm(&SaveData);
1828 }
1829 // Temporarily disabling use of Ymm in SHA2
1830 // else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_AVX2 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1831 // SymCryptSaveYmm(&SaveData) == SYMCRYPT_NO_ERROR)
1832 // {
1833 // //SymCryptSha256AppendBlocks_ul1(pChain, pbData, cbData, pcbRemaining);
1834 // //SymCryptSha256AppendBlocks_ymm_8blocks(pChain, pbData, cbData, pcbRemaining);
1835 // SymCryptSha256AppendBlocks_ymm_avx2_asm(pChain, pbData, cbData, pcbRemaining);
1836
1837 // SymCryptRestoreYmm(&SaveData);
1838 // }
1839 else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1840 SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1841 {
1842 //SymCryptSha256AppendBlocks_xmm_4blocks(pChain, pbData, cbData, pcbRemaining);
1844
1845 SymCryptRestoreXmm(&SaveData);
1846 }
1847 else
1848 {
1849 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1850 //SymCryptSha256AppendBlocks_ul2(pChain, pbData, cbData, pcbRemaining);
1851 }
1852#elif SYMCRYPT_CPU_X86
1853 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1854
1855 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE | SYMCRYPT_CPU_FEATURE_SAVEXMM_NOFAIL ) &&
1856 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
1857 {
1858 SymCryptSha256AppendBlocks_shani( pChain, pbData, cbData, pcbRemaining );
1859 SymCryptRestoreXmm( &SaveData );
1860 }
1861 else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_BMI2)
1862 && SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1863 {
1865 SymCryptRestoreXmm(&SaveData);
1866 }
1867 else {
1868 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1869 }
1870#elif SYMCRYPT_CPU_ARM64
1871 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_SHA256 ) )
1872 {
1873 SymCryptSha256AppendBlocks_instr( pChain, pbData, cbData, pcbRemaining );
1874 } else {
1875 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1876 }
1877#else
1878 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1879#endif
1880
1881 //SymCryptSha256AppendBlocks_ul2( pChain, pbData, cbData, pcbRemaining );
1882 //SymCryptSha256AppendBlocks_xmm1( pChain, pbData, cbData, pcbRemaining ); !!! Needs Save/restore logic
1883 //SymCryptSha256AppendBlocks_xmm2( pChain, pbData, cbData, pcbRemaining );
1884}
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_4blocks(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
#define SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE
Definition: sc_lib.h:312
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_ssse3_asm(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul1(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
Definition: sha256.c:739
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)

Referenced by SymCryptSha256Append(), and SymCryptSha256Result().

◆ SymCryptSha256AppendBlocks_ul1()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul1 ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 739 of file sha256.c.

744{
747 int round;
748 UINT32 Wt;
749
750 while( cbData >= 64 )
751 {
752 ah[7] = pChain->H[0];
753 ah[6] = pChain->H[1];
754 ah[5] = pChain->H[2];
755 ah[4] = pChain->H[3];
756 ah[3] = pChain->H[4];
757 ah[2] = pChain->H[5];
758 ah[1] = pChain->H[6];
759 ah[0] = pChain->H[7];
760
761 //
762 // initial rounds 1 to 16
763 //
764
765 IROUND( 0 );
766 IROUND( 1 );
767 IROUND( 2 );
768 IROUND( 3 );
769 IROUND( 4 );
770 IROUND( 5 );
771 IROUND( 6 );
772 IROUND( 7 );
773 IROUND( 8 );
774 IROUND( 9 );
775 IROUND( 10 );
776 IROUND( 11 );
777 IROUND( 12 );
778 IROUND( 13 );
779 IROUND( 14 );
780 IROUND( 15 );
781
782
783 //
784 // rounds 16 to 64.
785 //
786 for( round=16; round<64; round += 16 )
787 {
788 FROUND( 0, round );
789 FROUND( 1, round );
790 FROUND( 2, round );
791 FROUND( 3, round );
792 FROUND( 4, round );
793 FROUND( 5, round );
794 FROUND( 6, round );
795 FROUND( 7, round );
796 FROUND( 8, round );
797 FROUND( 9, round );
798 FROUND( 10, round );
799 FROUND( 11, round );
800 FROUND( 12, round );
801 FROUND( 13, round );
802 FROUND( 14, round );
803 FROUND( 15, round );
804 }
805
806 pChain->H[0] = ah[7] + pChain->H[0];
807 pChain->H[1] = ah[6] + pChain->H[1];
808 pChain->H[2] = ah[5] + pChain->H[2];
809 pChain->H[3] = ah[4] + pChain->H[3];
810 pChain->H[4] = ah[3] + pChain->H[4];
811 pChain->H[5] = ah[2] + pChain->H[5];
812 pChain->H[6] = ah[1] + pChain->H[6];
813 pChain->H[7] = ah[0] + pChain->H[7];
814
815 pbData += 64;
816 cbData -= 64;
817
818 }
819
820 *pcbRemaining = cbData;
821
822 //
823 // Wipe the variables;
824 //
825 SymCryptWipeKnownSize( ah, sizeof( ah ) );
826 SymCryptWipeKnownSize( W, sizeof( W ) );
827 SYMCRYPT_FORCE_WRITE32( &Wt, 0 );
828}
#define IROUND(r)
Definition: sha256.c:717
#define FROUND(r16, rb)
Definition: sha256.c:727
#define SYMCRYPT_FORCE_WRITE32(_p, _v)
Definition: symcrypt.h:423
#define round(x)
Definition: opentype.c:51

Referenced by SymCryptSha256AppendBlocks().

◆ SymCryptSha256AppendBlocks_ul2()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul2 ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 832 of file sha256.c.

837{
838 //
839 // Different arrangement of the code, currently 25 c/B vs 20 c/b for the version above.
840 // On Atom: 50 c/B vs 41 c/B for the one above.
841 //
842 SYMCRYPT_ALIGN UINT32 buf[4 + 8 + 64]; // chaining state concatenated with the expanded input block
843 UINT32 * W = &buf[4 + 8];
844 UINT32 * ha = &buf[4]; // initial state words, in order h, g, ..., b, a
845 UINT32 A, B, C, D, T;
846 int r;
847
848 ha[7] = pChain->H[0]; buf[3] = ha[7];
849 ha[6] = pChain->H[1]; buf[2] = ha[6];
850 ha[5] = pChain->H[2]; buf[1] = ha[5];
851 ha[4] = pChain->H[3]; buf[0] = ha[4];
852 ha[3] = pChain->H[4];
853 ha[2] = pChain->H[5];
854 ha[1] = pChain->H[6];
855 ha[0] = pChain->H[7];
856
857 while( cbData >= 64 )
858 {
859 //
860 // Capture the input into W[0..15]
861 //
862 for( r=0; r<16; r++ )
863 {
864 W[r] = SYMCRYPT_LOAD_MSBFIRST32( &pbData[ 4*r ] );
865 }
866
867 //
868 // Expand the message
869 //
870 A = W[15];
871 B = W[14];
872 D = W[0];
873 for( r=16; r<64; r+= 2 )
874 {
875 // Loop invariant: A=W[r-1], B = W[r-2], D = W[r-16]
876
877 //
878 // Macro for one word of message expansion.
879 // Invariant:
880 // on entry: a = W[r-1], b = W[r-2], d = W[r-16]
881 // on exit: W[r] computed, a = W[r-1], b = W[r], c = W[r-15]
882 //
883 #define EXPAND( a, b, c, d, r ) \
884 c = W[r-15]; \
885 b = d + LSIGMA1( b ) + W[r-7] + LSIGMA0( c ); \
886 W[r] = b; \
887
888 EXPAND( A, B, C, D, r );
889 EXPAND( B, A, D, C, (r+1));
890
891 #undef EXPAND
892 }
893
894 A = ha[7];
895 B = ha[6];
896 C = ha[5];
897 D = ha[4];
898
899 for( r=0; r<64; r += 4 )
900 {
901 //
902 // Loop invariant:
903 // A, B, C, and D are the a,b,c,d values of the current state.
904 // W[r] is the next expanded message word to be processed.
905 // W[r-8 .. r-5] contain the current state words h, g, f, e.
906 //
907
908 //
909 // Macro to compute one round
910 //
911 #define DO_ROUND( a, b, c, d, t, r ) \
912 t = W[r] + CSIGMA1( W[r-5] ) + W[r-8] + CH( W[r-5], W[r-6], W[r-7] ) + SymCryptSha256K[r]; \
913 W[r-4] = t + d; \
914 d = t + CSIGMA0( a ) + MAJ( c, b, a );
915
916 DO_ROUND( A, B, C, D, T, r );
917 DO_ROUND( D, A, B, C, T, (r+1) );
918 DO_ROUND( C, D, A, B, T, (r+2) );
919 DO_ROUND( B, C, D, A, T, (r+3) );
920 #undef DO_ROUND
921 }
922
923 buf[3] = ha[7] = buf[3] + A;
924 buf[2] = ha[6] = buf[2] + B;
925 buf[1] = ha[5] = buf[1] + C;
926 buf[0] = ha[4] = buf[0] + D;
927 ha[3] += W[r-5];
928 ha[2] += W[r-6];
929 ha[1] += W[r-7];
930 ha[0] += W[r-8];
931
932 pbData += 64;
933 cbData -= 64;
934 }
935
936 pChain->H[0] = ha[7];
937 pChain->H[1] = ha[6];
938 pChain->H[2] = ha[5];
939 pChain->H[3] = ha[4];
940 pChain->H[4] = ha[3];
941 pChain->H[5] = ha[2];
942 pChain->H[6] = ha[1];
943 pChain->H[7] = ha[0];
944
945 *pcbRemaining = cbData;
946
947 SymCryptWipeKnownSize( buf, sizeof( buf ) );
952}
#define D(d)
Definition: builtin.c:4557
#define C(c)
Definition: builtin.c:4556
Definition: ehthrow.cxx:93
Definition: ehthrow.cxx:54
Definition: terminate.cpp:24
#define A(row, col)
#define B(row, col)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define T(num)
Definition: thunks.c:311
#define DO_ROUND(a, b, c, d, t, r)
#define EXPAND(a, b, c, d, r)

◆ SymCryptSha256Init()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Init ( _Out_ PSYMCRYPT_SHA256_STATE  pState)

Definition at line 125 of file sha256.c.

126{
128
129 pState->dataLengthL = 0;
130 //pState->dataLengthH = 0; // not used
131 pState->bytesInBuffer = 0;
132
133 memcpy( &pState->chain.H[0], &sha256InitialState[0], sizeof( sha256InitialState ) );
134
135 //
136 // There is no need to initialize the buffer part of the state as that will be
137 // filled before it is used.
138 //
139}
static const UINT32 sha256InitialState[8]
Definition: sha256.c:88

◆ SymCryptSha256Result()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Result ( _Inout_ PSYMCRYPT_SHA256_STATE  pState,
_Out_writes_(SYMCRYPT_SHA256_RESULT_SIZE) PBYTE  pbResult 
)

Definition at line 262 of file sha256.c.

265{
266 //
267 // We don't use the common padding code as that is slower, and SHA-256 is very frequently used in
268 // performance-sensitive areas.
269 //
271 SIZE_T tmp;
272
274
275 bytesInBuffer = pState->bytesInBuffer;
276
277 //
278 // The buffer is never completely full, so we can always put the first
279 // padding byte in.
280 //
281 pState->buffer[bytesInBuffer++] = 0x80;
282
283 if( bytesInBuffer > 64-8 ) {
284 //
285 // No room for the rest of the padding. Pad with zeroes & process block
286 // bytesInBuffer is at most 64, so we do not have an integer underflow
287 //
289 SymCryptSha256AppendBlocks( &pState->chain, pState->buffer, 64, &tmp );
290 bytesInBuffer = 0;
291 }
292
293 //
294 // Set rest of padding
295 // At this point bytesInBuffer <= 64-8, so we don't have an underflow
296 // We wipe to the end of the buffer as it is 16-aligned,
297 // and it is faster to wipe to an aligned point
298 //
300 SYMCRYPT_STORE_MSBFIRST64( &pState->buffer[64-8], pState->dataLengthL * 8 );
301
302 //
303 // Process the final block
304 //
305 SymCryptSha256AppendBlocks( &pState->chain, pState->buffer, 64, &tmp );
306
307 //
308 // Write the output in the correct byte order
309 //
310 SymCryptUint32ToMsbFirst( &pState->chain.H[0], pbResult, 8 );
311
312 //
313 // Wipe & re-initialize
314 // We have to wipe the whole state because the Init call
315 // might be optimized away by a smart compiler.
316 //
317 SymCryptWipeKnownSize( pState, sizeof( *pState ) );
318
319 memcpy( &pState->chain.H[0], &sha256InitialState[0], sizeof( sha256InitialState ) );
321}
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint32ToMsbFirst(_In_reads_(cuData) PCUINT32 puData, _Out_writes_(4 *cuData) PBYTE pbResult, SIZE_T cuData)
Definition: sc_lib.h:405
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
Definition: symcrypt.h:312

Referenced by SymCryptSha224Result().

◆ SymCryptSha256Selftest()

VOID SYMCRYPT_CALL SymCryptSha256Selftest ( void  )

Definition at line 485 of file sha256.c.

486{
488
490
491 SymCryptInjectError( result, sizeof( result ) );
492
493 if( memcmp( result, SymCryptSha256KATAnswer, sizeof( result ) ) != 0 ) {
494 SymCryptFatal( 'SH25' );
495 }
496}
const BYTE SymCryptSha256KATAnswer[32]
Definition: sha256.c:476
VOID SYMCRYPT_CALL SymCryptSha256(_In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_SHA256_RESULT_SIZE) PBYTE pbResult)

◆ SymCryptSha256StateExport()

Definition at line 391 of file sha256.c.

394{
396}
@ SymCryptBlobTypeSha256State
Definition: sc_lib.h:1065

◆ SymCryptSha256StateExportCore()

VOID SYMCRYPT_CALL SymCryptSha256StateExportCore ( _In_ PCSYMCRYPT_SHA256_STATE  pState,
_Out_writes_bytes_(SYMCRYPT_SHA256_STATE_EXPORT_SIZE) PBYTE  pbBlob,
_In_ UINT32  type 
)

Definition at line 354 of file sha256.c.

358{
359 SYMCRYPT_ALIGN SYMCRYPT_SHA256_STATE_EXPORT_BLOB blob; // local copy to have proper alignment.
361
363
364 SymCryptWipeKnownSize( &blob, sizeof( blob ) ); // wipe to avoid any data leakage
365
366 blob.header.magic = SYMCRYPT_BLOB_MAGIC;
368 blob.header.type = type;
369
370 //
371 // Copy the relevant data. Buffer will be 0-padded.
372 //
373
374 SymCryptUint32ToMsbFirst( &pState->chain.H[0], &blob.chain[0], 8 );
375 blob.dataLength = pState->dataLengthL;
376 memcpy( &blob.buffer[0], &pState->buffer[0], blob.dataLength & 0x3f );
377
378 SYMCRYPT_ASSERT( (PCBYTE) &blob + sizeof( blob ) - sizeof( SYMCRYPT_BLOB_TRAILER ) == (PCBYTE) &blob.trailer );
379 SymCryptMarvin32( SymCryptMarvin32DefaultSeed, (PCBYTE) &blob, sizeof( blob ) - sizeof( SYMCRYPT_BLOB_TRAILER ), &blob.trailer.checksum[0] );
380
381 memcpy( pbBlob, &blob, sizeof( blob ) );
382
383//cleanup:
384 SymCryptWipeKnownSize( &blob, sizeof( blob ) );
385 return;
386}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define C_ASSERT(e)
Definition: intsafe.h:73
#define SYMCRYPT_BLOB_MAGIC
Definition: sc_lib.h:1077
Definition: image.c:229
VOID SYMCRYPT_CALL SymCryptMarvin32(_In_ PCSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedSeed, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_MARVIN32_RESULT_SIZE) PBYTE pbResult)
Definition: marvin32.c:239
PCSYMCRYPT_MARVIN32_EXPANDED_SEED const SymCryptMarvin32DefaultSeed
Definition: marvin32.c:29
#define SYMCRYPT_SHA256_STATE_EXPORT_SIZE
const BYTE * PCBYTE

Referenced by SymCryptSha224StateExport(), and SymCryptSha256StateExport().

◆ SymCryptSha256StateImport()

Definition at line 453 of file sha256.c.

◆ SymCryptSha256StateImportCore()

Definition at line 411 of file sha256.c.

415{
416 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
417 SYMCRYPT_ALIGN SYMCRYPT_SHA256_STATE_EXPORT_BLOB blob; // local copy to have proper alignment.
418 BYTE checksum[8];
419
421 memcpy( &blob, pbBlob, sizeof( blob ) );
422
423 if( blob.header.magic != SYMCRYPT_BLOB_MAGIC ||
425 blob.header.type != type )
426 {
427 scError = SYMCRYPT_INVALID_BLOB;
428 goto cleanup;
429 }
430
432 if( memcmp( checksum, &blob.trailer.checksum[0], 8 ) != 0 )
433 {
434 scError = SYMCRYPT_INVALID_BLOB;
435 goto cleanup;
436 }
437
438 SymCryptMsbFirstToUint32( &blob.chain[0], &pState->chain.H[0], 8 );
439 pState->dataLengthL = blob.dataLength;
440 pState->bytesInBuffer = blob.dataLength & 0x3f;
441 memcpy( &pState->buffer[0], &blob.buffer[0], pState->bytesInBuffer );
442
444
445cleanup:
446 SymCryptWipeKnownSize( &blob, sizeof(blob) );
447 return scError;
448}
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
static void cleanup(void)
Definition: main.c:1335
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMsbFirstToUint32(_In_reads_(4 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT32 puResult, SIZE_T cuResult)
Definition: sc_lib.h:422
SYMCRYPT_ERROR
Definition: symcrypt.h:227

Referenced by SymCryptSha224StateImport(), and SymCryptSha256StateImport().

Variable Documentation

◆ sha224InitialState

const UINT32 sha224InitialState[8]
static
Initial value:
= {
0xc1059ed8UL,
0x367cd507UL,
0x3070dd17UL,
0xf70e5939UL,
0xffc00b31UL,
0x68581511UL,
0x64f98fa7UL,
0xbefa4fa4UL,
}

Definition at line 77 of file sha256.c.

Referenced by SymCryptSha224Init().

◆ sha256InitialState

const UINT32 sha256InitialState[8]
static
Initial value:
= {
0x6a09e667UL,
0xbb67ae85UL,
0x3c6ef372UL,
0xa54ff53aUL,
0x510e527fUL,
0x9b05688cUL,
0x1f83d9abUL,
0x5be0cd19UL,
}

Definition at line 88 of file sha256.c.

Referenced by SymCryptSha256Init(), and SymCryptSha256Result().

◆ SymCryptSha224Algorithm

Definition at line 45 of file sha256.c.

◆ SymCryptSha224Algorithm_default

const SYMCRYPT_HASH SymCryptSha224Algorithm_default
Initial value:
= {
}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Append(_Inout_ PSYMCRYPT_SHA224_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: sha256.c:247
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha224Result(_Inout_ PSYMCRYPT_SHA224_STATE pState, _Out_writes_(SYMCRYPT_SHA224_RESULT_SIZE) PBYTE pbResult)
Definition: sha256.c:330
#define SYMCRYPT_SHA224_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1158
VOID SYMCRYPT_CALL SymCryptSha224StateCopy(_In_ PCSYMCRYPT_SHA224_STATE pSrc, _Out_ PSYMCRYPT_SHA224_STATE pDst)
#define SYMCRYPT_FIELD_SIZE(type, field)
SYMCRYPT_SHA224_STATE
#define SYMCRYPT_FIELD_OFFSET(type, field)
struct sock * chain
Definition: tcpcore.h:1

Definition at line 19 of file sha256.c.

◆ SymCryptSha224KATAnswer

const BYTE SymCryptSha224KATAnswer[28]
Initial value:
= {
0x23, 0x09, 0x7d, 0x22, 0x34, 0x05, 0xd8, 0x22,
0x86, 0x42, 0xa4, 0x77, 0xbd, 0xa2, 0x55, 0xb3,
0x2a, 0xad, 0xbc, 0xe4, 0xbd, 0xa0, 0xb3, 0xf7,
0xe3, 0x6c, 0x9d, 0xa7,
}

Definition at line 502 of file sha256.c.

Referenced by SymCryptSha224Selftest().

◆ SymCryptSha256Algorithm

Definition at line 46 of file sha256.c.

Referenced by init_hash_impl(), and SymCryptSshKdfSha256SelfTest().

◆ SymCryptSha256Algorithm_default

const SYMCRYPT_HASH SymCryptSha256Algorithm_default
Initial value:
= {
}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptSha256Init(_Out_ PSYMCRYPT_SHA256_STATE pState)
Definition: sha256.c:125
VOID SYMCRYPT_CALL SymCryptSha256StateCopy(_In_ PCSYMCRYPT_SHA256_STATE pSrc, _Out_ PSYMCRYPT_SHA256_STATE pDst)
SYMCRYPT_SHA256_STATE

Definition at line 32 of file sha256.c.

◆ SymCryptSha256KATAnswer

const BYTE SymCryptSha256KATAnswer[32]
Initial value:
= {
0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad,
}

Definition at line 476 of file sha256.c.

Referenced by SymCryptSha256Selftest().