ReactOS 0.4.17-dev-1005-g171e1de
dh.c
Go to the documentation of this file.
1//
2// dh.c DH functions
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6//
7
8#include "precomp.h"
9
13 _In_ PCSYMCRYPT_DLKEY pkPrivate,
14 _In_ PCSYMCRYPT_DLKEY pkPublic,
17 _Out_writes_( cbAgreedSecret ) PBYTE pbAgreedSecret,
18 SIZE_T cbAgreedSecret )
19{
20 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
21
22 PBYTE pbScratch = NULL;
23 SIZE_T cbScratch = 0;
24 PBYTE pbScratchInternal = NULL;
25 SIZE_T cbScratchInternal = 0;
26
28
30 UINT32 cbModelement = 0;
31
32 UINT32 nBitsOfExp = 0;
33
34 // Make sure that the keys may be used in DH
35 if ( ((pkPrivate->fAlgorithmInfo & SYMCRYPT_FLAG_DLKEY_DH) == 0) ||
36 ((pkPublic->fAlgorithmInfo & SYMCRYPT_FLAG_DLKEY_DH) == 0) )
37 {
38 scError = SYMCRYPT_INVALID_ARGUMENT;
39 goto cleanup;
40 }
41
42 // Make sure we only specify the correct flags and that
43 // there is a private key
44 if ( (flags != 0) || (!pkPrivate->fHasPrivateKey) )
45 {
46 scError = SYMCRYPT_INVALID_ARGUMENT;
47 goto cleanup;
48 }
49
50 // Check that the group is the same for both keys
51 if ( SymCryptDlgroupIsSame( pkPrivate->pDlgroup, pkPublic->pDlgroup ) )
52 {
53 pDlgroup = pkPrivate->pDlgroup;
54 }
55 else
56 {
57 scError = SYMCRYPT_INVALID_ARGUMENT;
58 goto cleanup;
59 }
60
61 // Check the output buffer has the correct size
62 if (cbAgreedSecret != SymCryptDlkeySizeofPublicKey( pkPrivate ))
63 {
64 scError = SYMCRYPT_WRONG_BLOCK_SIZE;
65 goto cleanup;
66 }
67
68 // Objects and scratch space size calculation
69 cbModelement = SymCryptSizeofModElementFromModulus( pDlgroup->pmP );
70 cbScratch = cbModelement +
73
74 // Scratch space allocation
75 pbScratch = SymCryptCallbackAlloc( cbScratch );
76 if ( pbScratch == NULL )
77 {
78 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
79 goto cleanup;
80 }
81
82 // Creating temporary
83 pbScratchInternal = pbScratch;
84 cbScratchInternal = cbScratch;
85 peRes = SymCryptModElementCreate( pbScratchInternal, cbModelement, pDlgroup->pmP );
86 pbScratchInternal += cbModelement;
87 cbScratchInternal -= cbModelement;
88
89 SYMCRYPT_ASSERT( peRes != NULL);
90
91 // Fix the bits of the exponent (the private key might be either mod Q, mod 2^nBitsPriv, or mod P)
92 if (pkPrivate->fPrivateModQ)
93 {
94 nBitsOfExp = pkPrivate->nBitsPriv;
95 }
96 else
97 {
98 nBitsOfExp = pDlgroup->nBitsOfP;
99 }
100
101 // Calculate the secret
103 pDlgroup->pmP,
104 pkPublic->pePublicKey,
105 pkPrivate->piPrivateKey,
106 nBitsOfExp,
107 0, // SC safe
108 peRes,
109 pbScratchInternal,
110 cbScratchInternal );
111
112 // Check if the result is zero
113 if ( SymCryptModElementIsZero( pDlgroup->pmP, peRes ) )
114 {
115 scError = SYMCRYPT_INVALID_BLOB;
116 goto cleanup;
117 }
118
119 // Output the result
121 pDlgroup->pmP,
122 peRes,
123 pbAgreedSecret,
124 cbAgreedSecret,
125 format,
126 pbScratchInternal,
127 cbScratchInternal );
128 if ( scError != SYMCRYPT_NO_ERROR )
129 {
130 goto cleanup;
131 }
132
133cleanup:
134 if ( pbScratch != NULL )
135 {
136 SymCryptWipe( pbScratch, cbScratch );
137 SymCryptCallbackFree( pbScratch );
138 }
139
140 return scError;
141}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDhSecretAgreement(_In_ PCSYMCRYPT_DLKEY pkPrivate, _In_ PCSYMCRYPT_DLKEY pkPublic, SYMCRYPT_NUMBER_FORMAT format, UINT32 flags, _Out_writes_(cbAgreedSecret) PBYTE pbAgreedSecret, SIZE_T cbAgreedSecret)
Definition: dh.c:12
#define NULL
Definition: types.h:112
static void cleanup(void)
Definition: main.c:1335
GLbitfield flags
Definition: glext.h:7161
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _In_
Definition: no_sal2.h:158
BYTE * PBYTE
Definition: pedump.c:66
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
UINT32 SYMCRYPT_CALL SymCryptDlkeySizeofPublicKey(_In_ PCSYMCRYPT_DLKEY pkDlkey)
Definition: dlkey.c:160
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
enum _SYMCRYPT_NUMBER_FORMAT SYMCRYPT_NUMBER_FORMAT
#define SYMCRYPT_FLAG_DLKEY_DH
Definition: symcrypt.h:7593
BOOLEAN SYMCRYPT_CALL SymCryptDlgroupIsSame(_In_ PCSYMCRYPT_DLGROUP pDlgroup1, _In_ PCSYMCRYPT_DLGROUP pDlgroup2)
Definition: dlgroup.c:1233
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCSYMCRYPT_DLGROUP pDlgroup
#define SYMCRYPT_CALL
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_MAX(_a, _b)
const SYMCRYPT_DLKEY * PCSYMCRYPT_DLKEY
const SYMCRYPT_DLGROUP * PCSYMCRYPT_DLGROUP
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:658
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
Definition: a_dispatch.c:828
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)
Definition: a_dispatch.c:804
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:665
#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)
Definition: a_dispatch.c:961
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59