ReactOS 0.4.17-dev-1005-g171e1de
ec_internal_curves.c
Go to the documentation of this file.
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
11
12static
17{
18 switch (curveId)
19 {
26 default:
27 return NULL;
28 }
29}
30
35{
36 PCSYMCRYPT_ECURVE pCachedCurve = NULL;
37 PSYMCRYPT_ECURVE pNewCurve = NULL;
38 PSYMCRYPT_ECURVE pCurrCurve = 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}
#define NULL
Definition: types.h:112
static PCSYMCRYPT_ECURVE_PARAMS SYMCRYPT_CALL SymCryptGetCachedEcurveParams(SYMCRYPT_CACHED_ECURVE_ID curveId)
PCSYMCRYPT_ECURVE SYMCRYPT_CALL SymCryptGetCachedEcurve(SYMCRYPT_CACHED_ECURVE_ID curveId)
static PCSYMCRYPT_ECURVE rgpCachedCurves[SYMCRYPT_CACHED_ECURVE_ID_COUNT]
SYMCRYPT_CACHED_ECURVE_ID
Definition: sc_lib.h:4357
@ SYMCRYPT_CACHED_ECURVE_ID_CURVE_25519
Definition: sc_lib.h:4360
@ SYMCRYPT_CACHED_ECURVE_ID_NIST_P256
Definition: sc_lib.h:4358
@ SYMCRYPT_CACHED_ECURVE_ID_COUNT
Definition: sc_lib.h:4361
@ SYMCRYPT_CACHED_ECURVE_ID_NIST_P384
Definition: sc_lib.h:4359
VOID SYMCRYPT_CALL SymCryptEcurveFree(_Out_ PSYMCRYPT_ECURVE pCurve)
Definition: ecurve.c:657
const PCSYMCRYPT_ECURVE_PARAMS SymCryptEcurveParamsNistP384
const PCSYMCRYPT_ECURVE_PARAMS SymCryptEcurveParamsNistP256
PSYMCRYPT_ECURVE SYMCRYPT_CALL SymCryptEcurveAllocate(_In_ PCSYMCRYPT_ECURVE_PARAMS pParams, _In_ UINT32 flags)
Definition: ecurve.c:606
const PCSYMCRYPT_ECURVE_PARAMS SymCryptEcurveParamsCurve25519
#define SYMCRYPT_CALL
const SYMCRYPT_ECURVE * PCSYMCRYPT_ECURVE
SYMCRYPT_ECURVE * PSYMCRYPT_ECURVE