19{
21
25 SIZE_T cbScratchInternal = 0;
26
28
31
33
34
37 {
38 scError = SYMCRYPT_INVALID_ARGUMENT;
40 }
41
42
43
44 if ( (
flags != 0) || (!pkPrivate->fHasPrivateKey) )
45 {
46 scError = SYMCRYPT_INVALID_ARGUMENT;
48 }
49
50
52 {
54 }
55 else
56 {
57 scError = SYMCRYPT_INVALID_ARGUMENT;
59 }
60
61
63 {
64 scError = SYMCRYPT_WRONG_BLOCK_SIZE;
66 }
67
68
73
74
76 if ( pbScratch ==
NULL )
77 {
78 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
80 }
81
82
83 pbScratchInternal = pbScratch;
86 pbScratchInternal += cbModelement;
87 cbScratchInternal -= cbModelement;
88
90
91
92 if (pkPrivate->fPrivateModQ)
93 {
94 nBitsOfExp = pkPrivate->nBitsPriv;
95 }
96 else
97 {
99 }
100
101
104 pkPublic->pePublicKey,
105 pkPrivate->piPrivateKey,
106 nBitsOfExp,
107 0,
108 peRes,
109 pbScratchInternal,
110 cbScratchInternal );
111
112
114 {
115 scError = SYMCRYPT_INVALID_BLOB;
117 }
118
119
122 peRes,
123 pbAgreedSecret,
124 cbAgreedSecret,
126 pbScratchInternal,
127 cbScratchInternal );
128 if ( scError != SYMCRYPT_NO_ERROR )
129 {
131 }
132
134 if ( pbScratch !=
NULL )
135 {
138 }
139
140 return scError;
141}
static void cleanup(void)
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
UINT32 SYMCRYPT_CALL SymCryptDlkeySizeofPublicKey(_In_ PCSYMCRYPT_DLKEY pkDlkey)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_FLAG_DLKEY_DH
BOOLEAN SYMCRYPT_CALL SymCryptDlgroupIsSame(_In_ PCSYMCRYPT_DLGROUP pDlgroup1, _In_ PCSYMCRYPT_DLGROUP pDlgroup2)
PCSYMCRYPT_DLGROUP pDlgroup
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_MAX(_a, _b)
const SYMCRYPT_DLGROUP * PCSYMCRYPT_DLGROUP
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModElementGetValue(PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
VOID SYMCRYPT_CALL SymCryptModExp(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peBase, _In_ PCSYMCRYPT_INT piExp, UINT32 nBitsExp, UINT32 flags, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)