ReactOS 0.4.17-dev-1005-g171e1de
cshake_pattern.c
Go to the documentation of this file.
1//
2// cshake_pattern.c
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#if 0
8#pragma makedep header
9#endif
10
11//
12// This source file implements cSHAKE128 and cSHAKE256
13//
14// See the symcrypt.h file for documentation on what the various functions do.
15//
16
17
18//
19// SymCryptCShake
20//
21VOID
24 _In_reads_( cbFunctionNameString ) PCBYTE pbFunctionNameString,
25 SIZE_T cbFunctionNameString,
26 _In_reads_( cbCustomizationString ) PCBYTE pbCustomizationString,
27 SIZE_T cbCustomizationString,
30 _Out_writes_( cbResult ) PBYTE pbResult,
31 SIZE_T cbResult)
32{
34
36 pbFunctionNameString, cbFunctionNameString,
37 pbCustomizationString, cbCustomizationString);
38
41}
42
43
44//
45// SymCryptCShakeInit
46//
47VOID
51 _In_reads_( cbFunctionNameString ) PCBYTE pbFunctionNameString,
52 SIZE_T cbFunctionNameString,
53 _In_reads_( cbCustomizationString ) PCBYTE pbCustomizationString,
54 SIZE_T cbCustomizationString)
55{
57
59
60 // Perform cSHAKE processing of input strings when any of the input strings is non-empty
61 if (cbFunctionNameString != 0 || cbCustomizationString != 0)
62 {
63 // cSHAKE and SHAKE have different paddings. pState->paddingValue
64 // is set to SYMCRYPT_SHAKE_PADDING_VALUE in the SHAKE initialization above.
65 // We update the padding value here because at least one of the input strings
66 // is non-empty and cSHAKE will not default to SHAKE.
67 pState->ks.paddingValue = SYMCRYPT_CSHAKE_PADDING_VALUE;
68
70 pbFunctionNameString, cbFunctionNameString,
71 pbCustomizationString, cbCustomizationString);
72 }
73
75}
76
77//
78// SymCryptCShakeAppend
79//
80VOID
86{
87 // Fixing of the padding value
88 //
89 // SymCryptKeccakAppend will reset the state, switch to absorb mode,
90 // and append data to the empty state if the state was in squeeze mode
91 // when Append is called. This behavior is equivalent to initializing
92 // cSHAKE with empty input strings, which makes cSHAKE a SHAKE instance.
93 //
94 // cSHAKE and SHAKE have different paddings, so we have to update the
95 // padding value in case it was cSHAKE padding before.
96 if (pState->ks.squeezeMode)
97 {
98 pState->ks.paddingValue = SYMCRYPT_SHAKE_PADDING_VALUE;
99 }
100
102}
103
104//
105// SymCryptCShakeExtract
106//
107VOID
111 _Out_writes_(cbResult) PBYTE pbResult,
112 SIZE_T cbResult,
113 BOOLEAN bWipe)
114{
115 SymCryptKeccakExtract(&pState->ks, pbResult, cbResult, bWipe);
116
117 if (bWipe)
118 {
119 // If the state was wiped, set the state as if cSHAKE was initialized
120 // with empty strings, which is equivalent to empty SHAKE state.
121 // We have no way to store the Function Name string and Customization
122 // string information to go back to the initial cSHAKE state.
123 pState->ks.paddingValue = SYMCRYPT_SHAKE_PADDING_VALUE;
124 }
125}
126
127//
128// SymCryptCShakeResult
129//
130VOID
135{
137
138 // Revert to cSHAKE initialized with empty strings state, i.e., empty SHAKE state
139 pState->ks.paddingValue = SYMCRYPT_SHAKE_PADDING_VALUE;
140}
141
142//
143// SymCryptCShakeStateCopy
144//
145VOID
148{
150 *pDst = *pSrc;
151 SYMCRYPT_SET_MAGIC(pDst);
152}
unsigned char BOOLEAN
Definition: actypes.h:127
static int state
Definition: maze.c:121
#define TRUE
Definition: types.h:120
#define C_ASSERT(e)
Definition: intsafe.h:73
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
BYTE * PBYTE
Definition: pedump.c:66
#define SYMCRYPT_XxxExtract
Definition: sc_lib.h:138
#define SYMCRYPT_XxxInit
Definition: sc_lib.h:123
#define SYMCRYPT_XxxAppend
Definition: sc_lib.h:124
VOID SYMCRYPT_CALL SymCryptCShakeEncodeInputStrings(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbFunctionNameString) PCBYTE pbFunctionNameString, SIZE_T cbFunctionNameString, _In_reads_(cbCustomizationString) PCBYTE pbCustomizationString, SIZE_T cbCustomizationString)
Definition: shake.c:221
VOID SYMCRYPT_CALL SymCryptKeccakAppend(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: sha3.c:285
#define SYMCRYPT_SHAKE_PADDING_VALUE
Definition: sc_lib.h:1809
#define SYMCRYPT_XXX_STATE
Definition: sc_lib.h:116
#define SYMCRYPT_CSHAKE_PADDING_VALUE
Definition: sc_lib.h:1810
#define SYMCRYPT_Xxx
Definition: sc_lib.h:120
#define PSYMCRYPT_XXX_STATE
Definition: sc_lib.h:117
#define SYMCRYPT_XxxResult
Definition: sc_lib.h:125
VOID SYMCRYPT_CALL SymCryptKeccakExtract(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
Definition: sha3.c:411
#define SYMCRYPT_XxxStateCopy
Definition: sc_lib.h:122
#define SYMCRYPT_SHAKEXXX_STATE
Definition: shake.c:172
#define SYMCRYPT_CSHAKEXXX_RESULT_SIZE
Definition: shake.c:174
#define SYMCRYPT_SHAKEXXX_INIT
Definition: shake.c:171
static const BYTE pbResult[]
#define SYMCRYPT_CALL
PCBYTE PBYTE SIZE_T cbData
#define SYMCRYPT_SET_MAGIC(p)
PSYMCRYPT_COMMON_HASH_STATE pState
const BYTE * PCBYTE
PCBYTE pbData
#define SYMCRYPT_CHECK_MAGIC(p)
ULONG_PTR SIZE_T
Definition: typedefs.h:80