Path: blob/master/libs/symcrypt/lib/ec_internal_curves.c
15010 views
//1// ec_internal_curves.c Internally allocated elliptic curves.2//3// These curves are lazy-initialized. Currently only used4// for composite algorithms to avoid per-key allocation overhead.5//67#include "precomp.h"89static PCSYMCRYPT_ECURVE rgpCachedCurves[SYMCRYPT_CACHED_ECURVE_ID_COUNT] = { 0 };1011static12PCSYMCRYPT_ECURVE_PARAMS13SYMCRYPT_CALL14SymCryptGetCachedEcurveParams(15SYMCRYPT_CACHED_ECURVE_ID curveId )16{17switch (curveId)18{19case SYMCRYPT_CACHED_ECURVE_ID_NIST_P256:20return SymCryptEcurveParamsNistP256;21case SYMCRYPT_CACHED_ECURVE_ID_NIST_P384:22return SymCryptEcurveParamsNistP384;23case SYMCRYPT_CACHED_ECURVE_ID_CURVE_25519:24return SymCryptEcurveParamsCurve25519;25default:26return NULL;27}28}2930PCSYMCRYPT_ECURVE31SYMCRYPT_CALL32SymCryptGetCachedEcurve(33SYMCRYPT_CACHED_ECURVE_ID curveId )34{35PCSYMCRYPT_ECURVE pCachedCurve = NULL;36PSYMCRYPT_ECURVE pNewCurve = NULL;37PSYMCRYPT_ECURVE pCurrCurve = NULL;38PCSYMCRYPT_ECURVE_PARAMS pParams = NULL;3940if ( curveId < 0 || curveId >= SYMCRYPT_CACHED_ECURVE_ID_COUNT )41{42return NULL;43}4445pCachedCurve = (PCSYMCRYPT_ECURVE) SYMCRYPT_ATOMIC_LOADPTR_ACQUIRE( &rgpCachedCurves[curveId] );46if ( pCachedCurve != NULL )47{48return pCachedCurve;49}5051pParams = SymCryptGetCachedEcurveParams( curveId );52if ( pParams == NULL )53{54return NULL;55}5657pNewCurve = SymCryptEcurveAllocate( pParams, 0 );58if ( pNewCurve == NULL )59{60return NULL;61}6263pCurrCurve = SYMCRYPT_ATOMIC_CAS_PTR_ACQUIRE_RELEASE(64&rgpCachedCurves[curveId],65pNewCurve,66NULL);6768// Means the original curve was already filled69// and that our new curve was not used. So we70// free the new curve and return the existing one.71if ( pCurrCurve != NULL )72{73SymCryptEcurveFree( pNewCurve );74return pCurrCurve;75}7677return pNewCurve;78}798081