Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/symcrypt/lib/ec_internal_curves.c
15010 views
1
//
2
// ec_internal_curves.c Internally allocated elliptic curves.
3
//
4
// These curves are lazy-initialized. Currently only used
5
// for composite algorithms to avoid per-key allocation overhead.
6
//
7
8
#include "precomp.h"
9
10
static PCSYMCRYPT_ECURVE rgpCachedCurves[SYMCRYPT_CACHED_ECURVE_ID_COUNT] = { 0 };
11
12
static
13
PCSYMCRYPT_ECURVE_PARAMS
14
SYMCRYPT_CALL
15
SymCryptGetCachedEcurveParams(
16
SYMCRYPT_CACHED_ECURVE_ID curveId )
17
{
18
switch (curveId)
19
{
20
case SYMCRYPT_CACHED_ECURVE_ID_NIST_P256:
21
return SymCryptEcurveParamsNistP256;
22
case SYMCRYPT_CACHED_ECURVE_ID_NIST_P384:
23
return SymCryptEcurveParamsNistP384;
24
case SYMCRYPT_CACHED_ECURVE_ID_CURVE_25519:
25
return SymCryptEcurveParamsCurve25519;
26
default:
27
return NULL;
28
}
29
}
30
31
PCSYMCRYPT_ECURVE
32
SYMCRYPT_CALL
33
SymCryptGetCachedEcurve(
34
SYMCRYPT_CACHED_ECURVE_ID curveId )
35
{
36
PCSYMCRYPT_ECURVE pCachedCurve = NULL;
37
PSYMCRYPT_ECURVE pNewCurve = NULL;
38
PSYMCRYPT_ECURVE pCurrCurve = NULL;
39
PCSYMCRYPT_ECURVE_PARAMS pParams = NULL;
40
41
if ( curveId < 0 || curveId >= SYMCRYPT_CACHED_ECURVE_ID_COUNT )
42
{
43
return NULL;
44
}
45
46
pCachedCurve = (PCSYMCRYPT_ECURVE) SYMCRYPT_ATOMIC_LOADPTR_ACQUIRE( &rgpCachedCurves[curveId] );
47
if ( pCachedCurve != NULL )
48
{
49
return pCachedCurve;
50
}
51
52
pParams = SymCryptGetCachedEcurveParams( curveId );
53
if ( pParams == NULL )
54
{
55
return NULL;
56
}
57
58
pNewCurve = SymCryptEcurveAllocate( pParams, 0 );
59
if ( pNewCurve == NULL )
60
{
61
return NULL;
62
}
63
64
pCurrCurve = SYMCRYPT_ATOMIC_CAS_PTR_ACQUIRE_RELEASE(
65
&rgpCachedCurves[curveId],
66
pNewCurve,
67
NULL);
68
69
// Means the original curve was already filled
70
// and that our new curve was not used. So we
71
// free the new curve and return the existing one.
72
if ( pCurrCurve != NULL )
73
{
74
SymCryptEcurveFree( pNewCurve );
75
return pCurrCurve;
76
}
77
78
return pNewCurve;
79
}
80
81