19{
21
24 SIZE_T cbScratchInternal = 0;
26
28
31
34
35
38 {
39 scError = SYMCRYPT_INVALID_ARGUMENT;
41 }
42
43
44
46 (!pkPrivate->hasPrivateKey) )
47 {
48 scError = SYMCRYPT_INVALID_ARGUMENT;
50 }
51
52
54 {
55 pCurve = pkPrivate->pCurve;
56 }
57 else
58 {
59 scError = SYMCRYPT_INVALID_ARGUMENT;
61 }
62
63
66
67
68 if (cbAgreedSecret != cbX)
69 {
70 scError = SYMCRYPT_WRONG_BLOCK_SIZE;
72 }
73
77
78
79
80
81
82
83
84 cbScratch = cbScratchInternal + cbQ + cbX;
85
86
88 if ( pbScratch ==
NULL )
89 {
90 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
92 }
93
94
95 pCurr = pbScratch + cbScratchInternal;
97 pCurr += cbQ;
98 pbX = pCurr;
99
101
102
103
104
106 {
107 scError = SYMCRYPT_INVALID_ARGUMENT;
109 }
110
111
112
113
114
117 pkPrivate->piPrivateKey,
118 pkPublic->poPublicKey,
120 poQ,
121 pbScratch,
122 cbScratchInternal );
123 if ( scError != SYMCRYPT_NO_ERROR )
124 {
126 }
127
128
131 poQ,
132 pbScratch,
133 cbScratchInternal ) )
134 {
135 scError = SYMCRYPT_INVALID_BLOB;
137 }
138
139
141 if ( scError != SYMCRYPT_NO_ERROR )
142 {
144 }
145
146
147 memcpy( pbAgreedSecret, pbX, cbX);
148
150 if ( pbScratch !=
NULL )
151 {
154 }
155
156 return scError;
157}
static void cleanup(void)
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
#define memcpy(s1, s2, n)
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
@ SYMCRYPT_ECPOINT_FORMAT_X
BOOLEAN SYMCRYPT_CALL SymCryptEcurveIsSame(_In_ PCSYMCRYPT_ECURVE pCurve1, _In_ PCSYMCRYPT_ECURVE pCurve2)
UINT32 SYMCRYPT_CALL SymCryptEcurveSizeofFieldElement(_In_ PCSYMCRYPT_ECURVE pCurve)
#define SYMCRYPT_FLAG_ECKEY_ECDH
#define SYMCRYPT_MAX(_a, _b)
SYMCRYPT_ECPOINT * PSYMCRYPT_ECPOINT
const SYMCRYPT_ECURVE * PCSYMCRYPT_ECURVE
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointScalarMul(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_INT piScalar, _In_opt_ PCSYMCRYPT_ECPOINT poSrc, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptEcpointIsZero(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_SCRATCH_BYTES_FOR_SCALAR_ECURVE_OPERATIONS(_pCurve)
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_ECURVE pCurve)
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointFromCurve(PCSYMCRYPT_ECURVE pCurve)
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_ECURVE_OPERATIONS(_pCurve)
#define SYMCRYPT_FLAG_ECC_LL_COFACTOR_MUL
#define SYMCRYPT_SCRATCH_BYTES_FOR_GETSET_VALUE_ECURVE_OPERATIONS(_pCurve)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointGetValue(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, SYMCRYPT_NUMBER_FORMAT nformat, SYMCRYPT_ECPOINT_FORMAT eformat, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)