ReactOS 0.4.17-dev-1005-g171e1de
sc_lib.h File Reference
#include <symcrypt_low_level.h>
#include "sc_lib_mlkem.h"
#include "sc_lib_mldsa.h"
Include dependency graph for sc_lib.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _SYMCRYPT_BLOB_HEADER
 
struct  _SYMCRYPT_BLOB_TRAILER
 
struct  _SYMCRYPT_MD2_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_MD4_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_MD5_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_SHA1_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_SHA256_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_SHA512_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_KECCAK_STATE_EXPORT_BLOB
 
struct  _SYMCRYPT_MODULAR_FUNCTIONS
 
struct  _SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY
 
struct  _SYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS
 
struct  _SYMCRYPT_ECURVE_FUNCTIONS
 
struct  _SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS
 
struct  _XMSS_OTS_ADDRESS
 
struct  _XMSS_LTREE_ADDRESS
 
struct  _XMSS_HASHTREE_ADDRESS
 
struct  _XMSS_ADRS
 
struct  _SYMCRYPT_TREEHASH_NODE
 
struct  _SYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT
 
struct  _SYMCRYPT_INCREMENTAL_TREEHASH
 

Macros

#define SYMCRYPT_DISABLE_CFG
 
#define SYMCRYPT_FLAG_LIB_INITIALIZED   0x00000001
 
#define TRUE   (1)
 
#define FALSE   (0)
 
#define UNREFERENCED_PARAMETER(x)   ((void)x)
 
#define FAST_FAIL_CRYPTO_LIBRARY   22
 
#define NATIVE_BITS   (32)
 
#define NATIVE_BYTES   (4)
 
#define NATIVE_BYTES_LOG2   (2)
 
#define CONCAT_I2(a, b)   a##b
 
#define CONCAT_I3(a, b, c)   a##b##c
 
#define CONCAT2(a, b)   CONCAT_I2( a, b )
 
#define CONCAT3(a, b, c)   CONCAT_I3( a, b, c )
 
#define SYMCRYPT_XXX_STATE   CONCAT3( SYMCRYPT_, ALG, _STATE )
 
#define PSYMCRYPT_XXX_STATE   CONCAT3( PSYMCRYPT_, ALG, _STATE )
 
#define PCSYMCRYPT_XXX_STATE   CONCAT3( PCSYMCRYPT_, ALG, _STATE )
 
#define SYMCRYPT_Xxx   CONCAT2( SymCrypt, Alg )
 
#define SYMCRYPT_XxxStateCopy   CONCAT3( SymCrypt, Alg, StateCopy )
 
#define SYMCRYPT_XxxInit   CONCAT3( SymCrypt, Alg, Init )
 
#define SYMCRYPT_XxxAppend   CONCAT3( SymCrypt, Alg, Append )
 
#define SYMCRYPT_XxxResult   CONCAT3( SymCrypt, Alg, Result )
 
#define SYMCRYPT_XxxAppendBlocks   CONCAT3( SymCrypt, Alg, AppendBlocks )
 
#define SYMCRYPT_XxxStateImport   CONCAT3( SymCrypt, Alg, StateImport)
 
#define SYMCRYPT_XxxStateExport   CONCAT3( SymCrypt, Alg, StateExport)
 
#define SYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( SYMCRYPT_, ALG, _EXPANDED_KEY )
 
#define PSYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( PSYMCRYPT_, ALG, _EXPANDED_KEY )
 
#define PCSYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( PCSYMCRYPT_, ALG, _EXPANDED_KEY )
 
#define SYMCRYPT_XxxEx   CONCAT3( SymCrypt, Alg, Ex)
 
#define SYMCRYPT_XxxDefault   CONCAT3( SymCrypt, Alg, Default )
 
#define SYMCRYPT_XxxExpandKey   CONCAT3( SymCrypt, Alg, ExpandKey )
 
#define SYMCRYPT_XxxExpandKeyEx   CONCAT3( SymCrypt, Alg, ExpandKeyEx )
 
#define SYMCRYPT_XxxExtract   CONCAT3( SymCrypt, Alg, Extract )
 
#define SYMCRYPT_XxxResultEx   CONCAT3( SymCrypt, Alg, ResultEx )
 
#define SYMCRYPT_XxxKeyCopy   CONCAT3( SymCrypt, Alg, KeyCopy )
 
#define SYMCRYPT_HmacXxx   CONCAT2( SymCryptHmac, Alg )
 
#define SYMCRYPT_HmacXxxStateCopy   CONCAT3( SymCryptHmac, Alg, StateCopy )
 
#define SYMCRYPT_HmacXxxKeyCopy   CONCAT3( SymCryptHmac, Alg, KeyCopy )
 
#define SYMCRYPT_HmacXxxExpandKey   CONCAT3( SymCryptHmac, Alg, ExpandKey )
 
#define SYMCRYPT_HmacXxxInit   CONCAT3( SymCryptHmac, Alg, Init )
 
#define SYMCRYPT_HmacXxxAppend   CONCAT3( SymCryptHmac, Alg, Append )
 
#define SYMCRYPT_HmacXxxResult   CONCAT3( SymCryptHmac, Alg, Result )
 
#define SYMCRYPT_XXX_INPUT_BLOCK_SIZE   CONCAT3( SYMCRYPT_, ALG, _INPUT_BLOCK_SIZE )
 
#define SYMCRYPT_XXX_RESULT_SIZE   CONCAT3( SYMCRYPT_, ALG, _RESULT_SIZE )
 
#define SYMCRYPT_HMAC_XXX_INPUT_BLOCK_SIZE   SYMCRYPT_XXX_INPUT_BLOCK_SIZE
 
#define SYMCRYPT_HMAC_XXX_RESULT_SIZE   SYMCRYPT_XXX_RESULT_SIZE
 
#define PSYMCRYPT_HMAC_XXX_EXPANDED_KEY   CONCAT3( PSYMCRYPT_HMAC_, ALG, _EXPANDED_KEY )
 
#define PCSYMCRYPT_HMAC_XXX_EXPANDED_KEY   CONCAT3( PCSYMCRYPT_HMAC_, ALG, _EXPANDED_KEY )
 
#define SYMCRYPT_HMAC_XXX_STATE   CONCAT3( SYMCRYPT_HMAC_, ALG, _STATE )
 
#define PSYMCRYPT_HMAC_XXX_STATE   CONCAT3( PSYMCRYPT_HMAC_, ALG, _STATE )
 
#define PCSYMCRYPT_HMAC_XXX_STATE   CONCAT3( PCSYMCRYPT_HMAC_, ALG, _STATE )
 
#define HMAC_IPAD_BYTE   0x36
 
#define HMAC_OPAD_BYTE   0x5c
 
#define SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE   (SYMCRYPT_CPU_FEATURE_PCLMULQDQ | SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_SAVEXMM_NOFAIL )
 
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE   (SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_AESNI)
 
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_PCLMULQDQ_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE)
 
#define SYMCRYPT_CPU_FEATURES_FOR_VAES_256_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURE_AVX2 | SYMCRYPT_CPU_FEATURE_VAES)
 
#define SYMCRYPT_CPU_FEATURES_FOR_VAES_512_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURE_AVX512 | SYMCRYPT_CPU_FEATURE_VAES)
 
#define SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE   (SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_SHANI)
 
#define SYMCRYPT_CPU_FEATURES_FOR_MULX   (SYMCRYPT_CPU_FEATURE_BMI2 | SYMCRYPT_CPU_FEATURE_ADX | SYMCRYPT_CPU_FEATURE_SSE2 )
 
#define ROL16(x, n)   ((UINT16)( ( ((x) << (n)) | ((x) >> (16-(n))) ) ))
 
#define ROR16(x, n)   ((UINT16)( ( ((x) >> (n)) | ((x) << (16-(n))) ) ))
 
#define SYMCRYPT_ARRAY_SIZE(_x)   (sizeof(_x)/sizeof(_x[0]))
 
#define REPEAT_BYTE_TO_UINT32(x)   (((UINT32)x << 24) | ((UINT32)x << 16) | ((UINT32)x << 8) | x)
 
#define REPEAT_BYTE_TO_UINT64(x)   ( ((UINT64)REPEAT_BYTE_TO_UINT32(x) << 32) | REPEAT_BYTE_TO_UINT32(x) )
 
#define SYMCRYPT_CPUID_DETECT_FLAG_CHECK_OS_SUPPORT_FOR_YMM   1
 
#define SYMCRYPT_BLOB_MAGIC   ('cmys')
 
#define GCM_YMM_MINBLOCKS   16
 
#define PAR_SCRATCH_ELEMENTS_256   (4+8+64)
 
#define PAR_SCRATCH_ELEMENTS_512   (4+8+80)
 
#define SYMCRYPT_SHA3_PADDING_VALUE   0x06
 
#define SYMCRYPT_SHAKE_PADDING_VALUE   0x1f
 
#define SYMCRYPT_CSHAKE_PADDING_VALUE   0x04
 
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)   SYMCRYPT_ASSERT( ((SIZE_T)(_p) & (SYMCRYPT_ASYM_ALIGN_VALUE - 1)) == 0 );
 
#define SYMCRYPT_FDEF_DIGIT_NUINT32   ((UINT32)(SYMCRYPT_FDEF_DIGIT_SIZE / sizeof( UINT32 ) ))
 
#define SYMCRYPT_OBJ_NDIGITS(_p)   ((_p)->nDigits)
 
#define SYMCRYPT_OBJ_NBYTES(_p)   ((_p)->nDigits * SYMCRYPT_FDEF_DIGIT_SIZE)
 
#define SYMCRYPT_OBJ_NUINT32(_p)   ((_p)->nDigits * SYMCRYPT_FDEF_DIGIT_SIZE / sizeof( UINT32 ))
 
#define SYMCRYPT_MODULAR_FUNCTIONS_SIZE   (sizeof( SYMCRYPT_MODULAR_FUNCTIONS ) )
 
#define SYMCRYPT_MODULUS_FEATURE_MONTGOMERY   1
 
#define SYMCRYPT_MODULUS_FEATURE_NISTP384   8
 
#define SYMCRYPT_MOD_CALL(v)   ((SYMCRYPT_MODULAR_FUNCTIONS *)(( SYMCRYPT_FORCE_READ32( &(v)->type) & g_SymCryptModFnsMask) + (PBYTE)(&g_SymCryptModFns) ))->
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_GENERIC
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64256
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64P384
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX256
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULXP256
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX384
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULXP384
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF369_MONTGOMERY
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY512
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY1024
 
#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX1024
 
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
 
#define SYMCRYPT_RUN_KEY_GEN_PCT(KeySelftestFunction, Key, KeySelftestFlag)
 
#define CHECK_ALGORITHM_INFO_FLAG_POW2(flag)    C_ASSERT( (flag != 0) && ((flag & (flag-1)) == 0) );
 
#define CHECK_ALGORITHM_INFO_FLAGS_DISTINCT(flag0, flag1, flag2, flag3, flag4)    C_ASSERT( (flag0 < flag1) && (flag1 < flag2) && (flag2 < flag3) && (flag3 < flag4) );
 
#define SYMCRYPT_DH_SAFEPRIME_GROUP_COUNT   (10)
 
#define SYMCRYPT_ECURVE_FUNCTIONS_SIZE   (sizeof( SYMCRYPT_ECURVE_FUNCTIONS ) )
 
#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS   (256)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P256   (65)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P384   (97)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_CURVE_25519   (32)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_MAX_ENCODED_EC_PUBLIC_KEY   SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P384
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P256   (51)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P384   (64)
 
#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_CURVE_25519   (32)
 
#define SYMCRYPT_SIZEOF_TREEHASH_NODE(cbValue)   (sizeof(SYMCRYPT_TREEHASH_NODE) - 1 + (cbValue))
 
#define SYMCRYPT_TREEHASH_NODE_GET(aNodes, cbValue, i)   ((PSYMCRYPT_TREEHASH_NODE)((PBYTE)(aNodes) + (i) * SYMCRYPT_SIZEOF_TREEHASH_NODE(cbValue)))
 
#define SYMCRYPT_IS_VALID_WINTERNITZ_WIDTH(w)   ( ((w) == 1) || ((w) == 2) || ((w) == 4) || ((w) == 8) )
 
#define SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE   16
 
#define SYMCRYPT_LMS_MAX_N   32
 
#define SYMCRYPT_LMS_MAX_P   265
 
#define SYMCRYPT_LMS_MAX_H   25
 
#define SYMCRYPT_LMS_MAX_CUSTOM_TREE_HEIGHT   31
 
#define SYMCRYPT_LMS_CHECKSUM_SIZE   16
 
#define SYMCRYPT_LMS_PUB_KEY_SIZE(cbHashOutput)   (8 + SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE + cbHashOutput)
 
#define SYMCRYPT_LMS_PRIV_KEY_SIZE(cbHashOutput)   (SYMCRYPT_LMS_PUB_KEY_SIZE(cbHashOutput) + sizeof(UINT32) + cbHashOutput)
 

Typedefs

typedef int BOOL
 
typedef INT32 NATIVE_INT
 
typedef UINT32 NATIVE_UINT
 
typedef enum _SYMCRYPT_BLOB_TYPE SYMCRYPT_BLOB_TYPE
 
typedef struct _SYMCRYPT_BLOB_HEADER SYMCRYPT_BLOB_HEADER
 
typedef struct _SYMCRYPT_BLOB_HEADER * PSYMCRYPT_BLOB_HEADER
 
typedef struct _SYMCRYPT_BLOB_TRAILER SYMCRYPT_BLOB_TRAILER
 
typedef struct _SYMCRYPT_BLOB_TRAILER * PSYMCRYPT_BLOB_TRAILER
 
typedef struct _SYMCRYPT_MD2_STATE_EXPORT_BLOB SYMCRYPT_MD2_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_MD4_STATE_EXPORT_BLOB SYMCRYPT_MD4_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_MD5_STATE_EXPORT_BLOB SYMCRYPT_MD5_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_SHA1_STATE_EXPORT_BLOB SYMCRYPT_SHA1_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_SHA256_STATE_EXPORT_BLOB SYMCRYPT_SHA256_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_SHA512_STATE_EXPORT_BLOB SYMCRYPT_SHA512_STATE_EXPORT_BLOB
 
typedef struct _SYMCRYPT_KECCAK_STATE_EXPORT_BLOB SYMCRYPT_KECCAK_STATE_EXPORT_BLOB
 
typedef SYMCRYPT_KECCAK_STATE_EXPORT_BLOB SYMCRYPT_SHA3_224_STATE_EXPORT_BLOB
 
typedef SYMCRYPT_KECCAK_STATE_EXPORT_BLOB SYMCRYPT_SHA3_256_STATE_EXPORT_BLOB
 
typedef SYMCRYPT_KECCAK_STATE_EXPORT_BLOB SYMCRYPT_SHA3_384_STATE_EXPORT_BLOB
 
typedef SYMCRYPT_KECCAK_STATE_EXPORT_BLOB SYMCRYPT_SHA3_512_STATE_EXPORT_BLOB
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_BINARY_OP_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_UNARY_OP_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef SYMCRYPT_ERROR(SYMCRYPT_CALL * SYMCRYPT_MOD_UNARY_OP_FLAG_STATUS_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_SET_POST_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef PCUINT32(SYMCRYPT_CALL * SYMCRYPT_MOD_PRE_GET_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_COPY_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MODULUS_COPYFIXUP_FN) (_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
 
typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MODULUS_INIT_FN) (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef struct _SYMCRYPT_MODULAR_FUNCTIONS SYMCRYPT_MODULAR_FUNCTIONS
 
typedef struct _SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY
 
typedef struct _SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY * PSYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY
 
typedef const SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY * PCSYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY
 
typedef struct _SYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS
 
typedef const SYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS * PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_ZERO_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_DISTINGUISHED_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_RANDOM_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_INT piScalar, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef UINT32(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ISEQUAL_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef UINT32(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ONCURVE_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef UINT32(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ISZERO_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ADD_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ADD_DIFF_NONZERO_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_DOUBLE_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_NEGATE_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Inout_ PSYMCRYPT_ECPOINT poSrc, UINT32 mask, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef SYMCRYPT_ERROR(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SCALAR_MUL_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_INT piScalar, _In_opt_ PCSYMCRYPT_ECPOINT poSrc, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef SYMCRYPT_ERROR(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_MULTI_SCALAR_MUL_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_reads_(nPoints) PCSYMCRYPT_INT *piSrcScalarArray, _In_reads_(nPoints) PCSYMCRYPT_ECPOINT *poSrcEcpointArray, UINT32 nPoints, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECURVE_FILL_SCRATCH_SPACES_FUNC) (_Inout_ PSYMCRYPT_ECURVE pCurve)
 
typedef struct _SYMCRYPT_ECURVE_FUNCTIONS SYMCRYPT_ECURVE_FUNCTIONS
 
typedef struct _SYMCRYPT_ECURVE_FUNCTIONS * PSYMCRYPT_ECURVE_FUNCTIONS
 
typedef const SYMCRYPT_ECURVE_FUNCTIONS * PCSYMCRYPT_ECURVE_FUNCTIONS
 
typedef enum SYMCRYPT_CACHED_ECURVE_ID * PSYMCRYPT_CACHED_ECURVE_ID
 
typedef struct _SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS
 
typedef struct _SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS * PSYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS
 
typedef const SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS * PCSYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS
 
typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_COMPOSITE_MLKEMKEY
 
typedef const SYMCRYPT_COMPOSITE_MLKEMKEY * PCSYMCRYPT_COMPOSITE_MLKEMKEY
 
typedef enum _XMSS_ADRS_TYPE XMSS_ADRS_TYPE
 
typedef struct _XMSS_OTS_ADDRESS XMSS_OTS_ADDRESS
 
typedef struct _XMSS_OTS_ADDRESS * PXMSS_OTS_ADDRESS
 
typedef struct _XMSS_LTREE_ADDRESS XMSS_LTREE_ADDRESS
 
typedef struct _XMSS_LTREE_ADDRESS * PXMSS_LTREE_ADDRESS
 
typedef struct _XMSS_HASHTREE_ADDRESS XMSS_HASHTREE_ADDRESS
 
typedef struct _XMSS_HASHTREE_ADDRESS * PXMSS_HASHTREE_ADDRESS
 
typedef struct _XMSS_ADRS XMSS_ADRS
 
typedef struct _XMSS_ADRS * PXMSS_ADRS
 
typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_XMSS_KEY
 
typedef SYMCRYPT_XMSS_KEY * PSYMCRYPT_XMSS_KEY
 
typedef struct _SYMCRYPT_TREEHASH_NODE SYMCRYPT_TREEHASH_NODE
 
typedef struct _SYMCRYPT_TREEHASH_NODE * PSYMCRYPT_TREEHASH_NODE
 
typedef struct _SYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT SYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT
 
typedef struct _SYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT * PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT
 
typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC) (_In_ PSYMCRYPT_TREEHASH_NODE pNodeLeft, _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight, _Out_ PSYMCRYPT_TREEHASH_NODE pNodeOut, _Inout_ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext)
 
typedef struct _SYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_INCREMENTAL_TREEHASH
 
typedef struct _SYMCRYPT_INCREMENTAL_TREEHASH * PSYMCRYPT_INCREMENTAL_TREEHASH
 
typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_LMS_KEY
 
typedef SYMCRYPT_LMS_KEY * PSYMCRYPT_LMS_KEY
 
typedef const SYMCRYPT_LMS_KEY * PCSYMCRYPT_LMS_KEY
 

Enumerations

enum  {
  STATE_NEXT = 0 , STATE_DATA_START , STATE_DATA_END , STATE_RESULT2 ,
  STATE_RESULT_DONE
}
 
enum  _SYMCRYPT_BLOB_TYPE {
  SymCryptBlobTypeUnknown = 0 , SymCryptBlobTypeHashState = 0x100 , SymCryptBlobTypeMd2State = SymCryptBlobTypeHashState + 1 , SymCryptBlobTypeMd4State = SymCryptBlobTypeHashState + 2 ,
  SymCryptBlobTypeMd5State = SymCryptBlobTypeHashState + 3 , SymCryptBlobTypeSha1State = SymCryptBlobTypeHashState + 4 , SymCryptBlobTypeSha256State = SymCryptBlobTypeHashState + 5 , SymCryptBlobTypeSha384State = SymCryptBlobTypeHashState + 6 ,
  SymCryptBlobTypeSha512State = SymCryptBlobTypeHashState + 7 , SymCryptBlobTypeSha3_256State = SymCryptBlobTypeHashState + 8 , SymCryptBlobTypeSha3_384State = SymCryptBlobTypeHashState + 9 , SymCryptBlobTypeSha3_512State = SymCryptBlobTypeHashState + 10 ,
  SymCryptBlobTypeSha224State = SymCryptBlobTypeHashState + 11 , SymCryptBlobTypeSha512_224State = SymCryptBlobTypeHashState + 12 , SymCryptBlobTypeSha512_256State = SymCryptBlobTypeHashState + 13 , SymCryptBlobTypeSha3_224State = SymCryptBlobTypeHashState + 14
}
 
enum  SYMCRYPT_CACHED_ECURVE_ID { SYMCRYPT_CACHED_ECURVE_ID_NIST_P256 = 0 , SYMCRYPT_CACHED_ECURVE_ID_NIST_P384 , SYMCRYPT_CACHED_ECURVE_ID_CURVE_25519 , SYMCRYPT_CACHED_ECURVE_ID_COUNT }
 
enum  _XMSS_ADRS_TYPE { XMSS_ADRS_TYPE_OTS = 0 , XMSS_ADRS_TYPE_LTREE = 1 , XMSS_ADRS_TYPE_HASH_TREE = 2 }
 

Functions

VOID SYMCRYPT_CALL SymCryptInitEnvCommon (UINT32 version)
 
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatalHang (UINT32 fatalcode)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptCheckLibraryInitialized (void)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint32ToMsbFirst (_In_reads_(cuData) PCUINT32 puData, _Out_writes_(4 *cuData) PBYTE pbResult, SIZE_T cuData)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMsbFirstToUint32 (_In_reads_(4 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT32 puResult, SIZE_T cuResult)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint32ToLsbFirst (_In_reads_(cuData) PCUINT32 puData, _Out_writes_(4 *cuData) PBYTE pbResult, SIZE_T cuData)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptLsbFirstToUint32 (_In_reads_(4 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT32 puResult, SIZE_T cuResult)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint64ToLsbFirst (_In_reads_(cuData) PCUINT64 puData, _Out_writes_(8 *cuData) PBYTE pbResult, SIZE_T cuData)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptLsbFirstToUint64 (_In_reads_(8 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT64 puResult, SIZE_T cuResult)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint64ToMsbFirst (_In_reads_(cuData) PCUINT64 puData, _Out_writes_(8 *cuData) PBYTE pbResult, SIZE_T cuData)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMsbFirstToUint64 (_In_reads_(8 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT64 puResult, SIZE_T cuResult)
 
VOID SYMCRYPT_CALL SymCryptSha1AppendBlocks (_Inout_ SYMCRYPT_SHA1_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_4blocks (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_ssse3_asm (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ymm_8blocks (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ymm_avx2_asm (_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_xmm (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_1block (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_2blocks (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_4blocks (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_avx2_asm (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_avx512vl_asm (_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptMd5AppendBlocks (_Inout_ SYMCRYPT_MD5_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptMd4AppendBlocks (_Inout_ SYMCRYPT_MD4_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
VOID SYMCRYPT_CALL SymCryptMd2AppendBlocks (_Inout_ SYMCRYPT_MD2_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
 
FORCEINLINE VOID SYMCRYPT_CALL XorByteIntoBuffer (_Inout_updates_(8 *cqBuf) PBYTE pbBuf, SIZE_T cqBuf, BYTE v)
 
VOID SYMCRYPT_CALL SymCryptGHashExpandKey (_Out_ PSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
 
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyC (_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
 
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyX86 (_Out_ PSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
 
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyAmd64 (_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
 
VOID SYMCRYPT_CALL SymCryptGHashAppendData (_In_ PCSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGHashAppendDataC (_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGHashAppendDataXmm (_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGHashAppendDataNeon (_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGHashAppendDataPclmulqdq (_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGHashResult (_In_ PCSYMCRYPT_GF128_ELEMENT pState, _Out_writes_(SYMCRYPT_GF128_BLOCK_SIZE) PBYTE pbResult)
 
VOID SYMCRYPT_CALL SymCryptMarvin32AppendBlocks (_Inout_ PSYMCRYPT_MARVIN32_CHAINING_STATE pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptInjectError (PBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesByCpuid (UINT32 flags)
 
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromRegisters (void)
 
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromRegistersNoTry (void)
 
VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent (void)
 
VOID SYMCRYPT_CALL SymCryptCpuidExFunc (int cpuInfo[4], int function_id, int subfunction_id)
 
 C_ASSERT (sizeof(SYMCRYPT_MD2_STATE_EXPORT_BLOB)==SYMCRYPT_MD2_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_MD4_STATE_EXPORT_BLOB)==SYMCRYPT_MD4_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_MD5_STATE_EXPORT_BLOB)==SYMCRYPT_MD5_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_SHA1_STATE_EXPORT_BLOB)==SYMCRYPT_SHA1_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_SHA256_STATE_EXPORT_BLOB)==SYMCRYPT_SHA256_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_SHA512_STATE_EXPORT_BLOB)==SYMCRYPT_SHA512_STATE_EXPORT_SIZE)
 
 C_ASSERT (sizeof(SYMCRYPT_SHA3_224_STATE_EXPORT_BLOB)==SYMCRYPT_SHA3_224_STATE_EXPORT_SIZE)
 
VOID SYMCRYPT_CALL SymCryptAes4Sbox (_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut, BOOL UseSimd)
 
VOID SYMCRYPT_CALL SymCryptAes4SboxC (_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
 
VOID SYMCRYPT_CALL SymCryptAes4SboxXmm (_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
 
VOID SYMCRYPT_CALL SymCryptAes4SboxNeon (_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKey (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey, BOOL UseSimd)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyXmm (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyNeon (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
 
VOID SYMCRYPT_CALL SymCryptAesEncryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesEncryptAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesEncryptXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesEncryptNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesDecryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesDecryptAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesDecryptXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesDecryptNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbDecryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcMacXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcMacNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Asm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Xmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Neon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Xmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Neon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitZmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitZmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitYmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitYmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit (_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit (_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedXmm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedYmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedYmm_2048 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedNeon (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPart (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPart (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGcmEncryptPartTwoPass (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptGcmDecryptPartTwoPass (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptCtrMsb32 (_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptParallelHashProcess_serial (_In_ PCSYMCRYPT_PARALLEL_HASH pParHash, _Inout_updates_bytes_(nStates *pParHash->pHash->stateSize) PVOID pStates, SIZE_T nStates, _Inout_updates_(nOperations) PSYMCRYPT_PARALLEL_HASH_OPERATION pOperations, SIZE_T nOperations, _Out_writes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptParallelHashProcess (_In_ PCSYMCRYPT_PARALLEL_HASH pParHash, _Inout_updates_bytes_(nStates *pParHash->pHash->stateSize) PVOID pStates, SIZE_T nStates, _Inout_updates_(nOperations) PSYMCRYPT_PARALLEL_HASH_OPERATION pOperations, SIZE_T nOperations, _Out_writes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, UINT32 maxParallel)
 
VOID SYMCRYPT_CALL SymCryptHashAppendInternal (_In_ PCSYMCRYPT_HASH pHash, _Inout_ PSYMCRYPT_COMMON_HASH_STATE pState, _In_reads_bytes_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptHashCommonPaddingMd4Style (_In_ PCSYMCRYPT_HASH pHash, _Inout_ PSYMCRYPT_COMMON_HASH_STATE pState)
 
VOID SYMCRYPT_CALL SymCryptParallelSha256AppendBlocks_ymm (_Inout_updates_(8) PSYMCRYPT_SHA256_CHAINING_STATE *pChain, _Inout_updates_(8) PCBYTE *ppByte, SIZE_T nBytes, _Out_writes_(PAR_SCRATCH_ELEMENTS_256 *32) PBYTE pScratch)
 
VOID SYMCRYPT_CALL SymCryptParallelSha512AppendBlocks_ymm (_Inout_updates_(4) PSYMCRYPT_SHA512_CHAINING_STATE *pChain, _Inout_updates_(4) PCBYTE *ppByte, SIZE_T nBytes, _Out_writes_(PAR_SCRATCH_ELEMENTS_512 *32) PBYTE pScratch)
 
VOID SYMCRYPT_CALL SymCryptKeccakPermute (_Inout_updates_(25) UINT64 *pState)
 
VOID SYMCRYPT_CALL SymCryptKeccakInit (_Out_ PSYMCRYPT_KECCAK_STATE pState, UINT32 inputBlockSize, UINT8 padding)
 
VOID SYMCRYPT_CALL SymCryptKeccakReset (_Out_ PSYMCRYPT_KECCAK_STATE pState)
 
VOID SYMCRYPT_CALL SymCryptKeccakZeroAppendBlock (_Inout_ PSYMCRYPT_KECCAK_STATE pState)
 
VOID SYMCRYPT_CALL SymCryptKeccakAppend (_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptKeccakExtract (_Inout_ PSYMCRYPT_KECCAK_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
 
VOID SYMCRYPT_CALL SymCryptKeccakStateExport (SYMCRYPT_BLOB_TYPE type, _In_ PCSYMCRYPT_KECCAK_STATE pState, _Out_writes_bytes_(SYMCRYPT_KECCAK_STATE_EXPORT_SIZE) PBYTE pbBlob)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptKeccakStateImport (SYMCRYPT_BLOB_TYPE type, _Out_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_bytes_(SYMCRYPT_KECCAK_STATE_EXPORT_SIZE) PCBYTE pbBlob)
 
VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodeTimes8 (_Inout_ SYMCRYPT_KECCAK_STATE *pState, UINT64 uValue, BOOLEAN bLeftEncode)
 
VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodedString (_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbString) PCBYTE pbString, SIZE_T cbString)
 
VOID SYMCRYPT_CALL SymCryptCShakeEncodeInputStrings (_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbFunctionNameString) PCBYTE pbFunctionNameString, SIZE_T cbFunctionNameString, _In_reads_(cbCustomizationString) PCBYTE pbCustomizationString, SIZE_T cbCustomizationString)
 
VOID SYMCRYPT_CALL SymCryptFatalIntercept (UINT32 fatalCode)
 
 C_ASSERT ((SYMCRYPT_MODULAR_FUNCTIONS_SIZE &(SYMCRYPT_MODULAR_FUNCTIONS_SIZE-1))==0)
 
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopy (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
 
VOID SYMCRYPT_CALL SymCryptFdefConditionalSwap (_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc1, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc2, UINT32 nDigits, UINT32 cond)
 
VOID SYMCRYPT_CALL SymCryptFdefClaimScratch (PBYTE pbScratch, SIZE_T cbScratch, SIZE_T cbMin)
 
UINT32 SymCryptFdefDigitsFromBits (UINT32 nBits)
 
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntAllocate (UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofIntFromDigits (UINT32 nDigits)
 
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
 
VOID SymCryptFdefIntCopy (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
 
VOID SymCryptFdefIntMaskedCopy (_In_ PCSYMCRYPT_INT piSrc, _Inout_ PSYMCRYPT_INT piDst, UINT32 mask)
 
VOID SYMCRYPT_CALL SymCryptFdefIntConditionalCopy (_In_ PCSYMCRYPT_INT piSrc, _Inout_ PSYMCRYPT_INT piDst, UINT32 cond)
 
VOID SYMCRYPT_CALL SymCryptFdefIntConditionalSwap (_Inout_ PSYMCRYPT_INT piSrc1, _Inout_ PSYMCRYPT_INT piSrc2, UINT32 cond)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntBitsizeOfObject (_In_ PCSYMCRYPT_INT piSrc)
 
UINT32 SYMCRYPT_CALL SymCryptFdefNumberofDigitsFromInt (_In_ PCSYMCRYPT_INT piSrc)
 
SYMCRYPT_ERROR SymCryptFdefIntCopyMixedSize (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntBitsizeOfValue (_In_ PCSYMCRYPT_INT piSrc)
 
VOID SYMCRYPT_CALL SymCryptFdefIntSetValueUint32 (UINT32 u32Src, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntSetValueUint64 (UINT64 u64Src, _Out_ PSYMCRYPT_INT piDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefIntSetValue (_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_ PSYMCRYPT_INT piDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefIntGetValue (_In_ PCSYMCRYPT_INT piSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntGetValueLsbits32 (_In_ PCSYMCRYPT_INT piSrc)
 
UINT64 SYMCRYPT_CALL SymCryptFdefIntGetValueLsbits64 (_In_ PCSYMCRYPT_INT piSrc)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntAddUint32 (_In_ PCSYMCRYPT_INT piSrc1, UINT32 u32Src2, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntAddSameSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntAddMixedSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntSubUint32 (_In_ PCSYMCRYPT_INT piSrc1, UINT32 u32Src2, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntSubSameSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntSubMixedSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntNeg (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntMulPow2 (_In_ PCSYMCRYPT_INT piSrc, SIZE_T Exp, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntDivPow2 (_In_ PCSYMCRYPT_INT piSrc, SIZE_T exp, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntShr1 (UINT32 highestBit, _In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntModPow2 (_In_ PCSYMCRYPT_INT piSrc, SIZE_T exp, _Out_ PSYMCRYPT_INT piDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntGetBit (_In_ PCSYMCRYPT_INT piSrc, UINT32 iBit)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntGetBits (_In_ PCSYMCRYPT_INT piSrc, UINT32 iBit, UINT32 nBits)
 
VOID SYMCRYPT_CALL SymCryptFdefIntSetBits (_In_ PSYMCRYPT_INT piDst, UINT32 value, UINT32 iBit, UINT32 nBits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntIsEqualUint32 (_In_ PCSYMCRYPT_INT piSrc1, _In_ UINT32 u32Src2)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntIsEqual (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntIsLessThan (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntMulUint32 (_In_ PCSYMCRYPT_INT piSrc1, UINT32 Src2, _Out_ PSYMCRYPT_INT piDst)
 
VOID SYMCRYPT_CALL SymCryptFdefIntMulSameSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefIntSquare (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefIntMulMixedSize (_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorAllocate (UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofDivisorFromDigits (UINT32 nDigits)
 
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
 
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorRetrieveHandle (_In_ PBYTE pbBuffer)
 
VOID SymCryptFdefDivisorCopy (_In_ PCSYMCRYPT_DIVISOR pdSrc, _Out_ PSYMCRYPT_DIVISOR pdDst)
 
VOID SymCryptFdefDivisorCopyFixup (_In_ PCSYMCRYPT_DIVISOR pSrc, _Out_ PSYMCRYPT_DIVISOR pDst)
 
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntFromDivisor (_In_ PSYMCRYPT_DIVISOR pdSrc)
 
VOID SYMCRYPT_CALL SymCryptFdefIntToDivisor (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_DIVISOR pdDst, UINT32 totalOperations, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefIntDivMod (_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_DIVISOR pdDivisor, _Out_opt_ PSYMCRYPT_INT piQuotient, _Out_opt_ PSYMCRYPT_INT piRemainder, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefRawDivMod (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pNum, UINT32 nDigits, _In_ PCSYMCRYPT_DIVISOR pdDivisor, _Out_writes_opt_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pQuotient, _Out_writes_opt_(SYMCRYPT_OBJ_NUINT32(pdDivisor)) PUINT32 pRemainder, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusAllocate (UINT32 nDigits)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusFree (_Out_ PSYMCRYPT_MODULUS pmObj)
 
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModulusFromDigits (UINT32 nDigits)
 
PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
 
PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusRetrieveHandle (_In_ PBYTE pbBuffer)
 
VOID SymCryptFdefModulusCopy (_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
 
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementAllocate (_In_ PCSYMCRYPT_MODULUS pmMod)
 
VOID SYMCRYPT_CALL SymCryptFdefModElementFree (_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peObj)
 
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModElementFromModulus (PCSYMCRYPT_MODULUS pmMod)
 
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, PCSYMCRYPT_MODULUS pmMod)
 
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementRetrieveHandle (_In_ PBYTE pbBuffer)
 
VOID SYMCRYPT_CALL SymCryptFdefModElementWipe (_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SymCryptFdefModElementCopy (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SymCryptFdefModElementMaskedCopy (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 mask)
 
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorFromModulus (_In_ PSYMCRYPT_MODULUS pmSrc)
 
VOID SymCryptFdefModElementConditionalSwap (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peData1, _Inout_ PSYMCRYPT_MODELEMENT peData2, _In_ UINT32 cond)
 
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntFromModulus (_In_ PSYMCRYPT_MODULUS pmSrc)
 
VOID SYMCRYPT_CALL SymCryptFdefIntToModulus (_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_MODULUS pmDst, UINT32 averageOperations, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefIntToModElement (_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModElementToIntGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_reads_bytes_(pmMod->nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawSetValue (_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_writes_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst, UINT32 nDigits)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModElementSetValueGeneric (_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModElementSetValueUint32Generic (UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModElementSetValueNegUint32 (UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawGetValue (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModElementGetValue (_In_ 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)
 
UINT32 SYMCRYPT_CALL SymCryptFdefModElementIsEqual (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2)
 
UINT32 SYMCRYPT_CALL SymCryptFdefModElementIsZero (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
 
VOID SYMCRYPT_CALL SymCryptFdefModAddGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModAddMulx256Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModAddMulx384Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModAdd256Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModAdd384Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModAddGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSubGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModSubGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSub256Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModSub384Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModNegGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSetPostGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomery (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulx256 (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulxP384 (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModSetPostMontgomery (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery256 (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
PCUINT32 SYMCRYPT_CALL SymCryptFdef369ModPreGetMontgomery (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupGeneric (_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupMontgomery (_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusInitGeneric (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomeryInternal (_Inout_ PSYMCRYPT_MODULUS pmObj, UINT32 nUint32Used, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery256 (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModulusInitMontgomery (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawAdd (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawSub (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawSubUint32 (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, UINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulGeneric (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx256Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulxP384Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery256Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryP384Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModMulMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx1024 (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareGeneric (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx256Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulxP384Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery256Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryP384Asm (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369ModSquareMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx1024 (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMul (_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMulMulx (_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMulMulx1024 (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquare (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquareMulx (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquareMulx1024 (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369RawMul (_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsEqualUint32 (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits, _In_ UINT32 u32Src2)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawNeg (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, UINT32 carryIn, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawMaskedAdd (_Inout_updates_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pAcc, _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 mask, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawMaskedSub (_Inout_updates_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pAcc, _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 mask, UINT32 nDigits)
 
VOID SYMCRYPT_CALL SymCryptFdefModDivPow2 (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2 (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Mulx (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvGeneric (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery256 (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdef369ModInvMontgomery (_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptModExpGeneric (_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)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModMultiExpGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _In_reads_(nBases) PCSYMCRYPT_MODELEMENT *peBaseArray, _In_reads_(nBases) PCSYMCRYPT_INT *piExpArray, UINT32 nBases, UINT32 nBitsExp, UINT32 flags, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefModSetRandomGeneric (_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawAddUint32 (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, UINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawAddAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdef369RawAddAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawSubAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdef369RawSubAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsLessThan (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, UINT32 nDigits)
 
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopyAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
 
VOID SYMCRYPT_CALL SymCryptFdef369MaskedCopyAsm (_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMulAsm (_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquareAsm (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369RawMulAsm (_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMul512Asm (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquare512Asm (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawMul1024Asm (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefRawSquare1024Asm (_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceAsm (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce256Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce512Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce1024Asm (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduce (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduceAsm (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceMulx (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceMulx1024 (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_PCT_DSA)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_PCT_ECDSA)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_PCT_RSA_SIGN)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_KEY_NO_FIPS)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_DLKEY_DSA)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_DLKEY_DH)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_ECKEY_ECDSA)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_ECKEY_ECDH)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_RSAKEY_SIGN)
 
 CHECK_ALGORITHM_INFO_FLAG_POW2 (SYMCRYPT_FLAG_RSAKEY_ENCRYPT)
 
 CHECK_ALGORITHM_INFO_FLAGS_DISTINCT (SYMCRYPT_PCT_DSA, SYMCRYPT_FLAG_KEY_NO_FIPS, SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION, SYMCRYPT_FLAG_DLKEY_DSA, SYMCRYPT_FLAG_DLKEY_DH)
 
 CHECK_ALGORITHM_INFO_FLAGS_DISTINCT (SYMCRYPT_PCT_ECDSA, SYMCRYPT_FLAG_KEY_NO_FIPS, SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION, SYMCRYPT_FLAG_ECKEY_ECDSA, SYMCRYPT_FLAG_ECKEY_ECDH)
 
 CHECK_ALGORITHM_INFO_FLAGS_DISTINCT (SYMCRYPT_PCT_RSA_SIGN, SYMCRYPT_FLAG_KEY_NO_FIPS, SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION, SYMCRYPT_FLAG_RSAKEY_SIGN, SYMCRYPT_FLAG_RSAKEY_ENCRYPT)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaSignVerifyPct (PCSYMCRYPT_RSAKEY pkRsakey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDsaPct (PCSYMCRYPT_DLKEY pkDlkey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcDsaPct (PCSYMCRYPT_ECKEY pkEckey)
 
 C_ASSERT ((SYMCRYPT_ECURVE_FUNCTIONS_SIZE &(SYMCRYPT_ECURVE_FUNCTIONS_SIZE-1))==0)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassFillScratchSpaces (_In_ PSYMCRYPT_ECURVE pCurve)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassSetZero (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassSetDistinguished (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsEqual (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassOnCurve (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassAdd (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassAddDiffNonZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassDouble (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassNegate (_In_ PCSYMCRYPT_ECURVE pCurve, _Inout_ PSYMCRYPT_ECPOINT poSrc, UINT32 mask, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptShortWeierstrassDoubleSpecializedAm3 (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsFillScratchSpaces (_In_ PSYMCRYPT_ECURVE pCurve)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetDistinguished (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAdd (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAddDiffNonZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsDouble (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsEqual (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsOnCurve (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetZero (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsNegate (_In_ PCSYMCRYPT_ECURVE pCurve, _Inout_ PSYMCRYPT_ECPOINT poSrc, UINT32 mask, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptMontgomeryFillScratchSpaces (_In_ PSYMCRYPT_ECURVE pCurve)
 
VOID SYMCRYPT_CALL SymCryptMontgomerySetDistinguished (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptMontgomeryIsEqual (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptMontgomeryIsZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMontgomeryPointScalarMul (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_INT piScalar, _In_opt_ PCSYMCRYPT_ECPOINT poSrc, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptOfflinePrecomputation (_In_ PSYMCRYPT_ECURVE pCurve, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointScalarMulFixedWindow (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_INT piScalar, _In_opt_ PCSYMCRYPT_ECPOINT poSrc, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointMultiScalarMulWnafWithInterleaving (_In_ PCSYMCRYPT_ECURVE pCurve, _In_reads_(nPoints) PCSYMCRYPT_INT *piSrcScalarArray, _In_reads_(nPoints) PCSYMCRYPT_ECPOINT *poSrcEcpointArray, UINT32 nPoints, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptEcpointGenericSetRandom (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_INT piScalar, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptEcurveFillScratchSpaces (_Inout_ PSYMCRYPT_ECURVE pCurve)
 
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointEx (UINT32 cbModElement, UINT32 numOfCoordinates)
 
PCSYMCRYPT_TRIALDIVISION_CONTEXT SYMCRYPT_CALL SymCryptFdefCreateTrialDivisionContext (UINT32 nDigits)
 
UINT32 SYMCRYPT_CALL SymCryptFdefIntFindSmallDivisor (_In_ PCSYMCRYPT_TRIALDIVISION_CONTEXT pContext, _In_ PCSYMCRYPT_INT piSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptFdefFreeTrialDivisionContext (PCSYMCRYPT_TRIALDIVISION_CONTEXT pContext)
 
UINT64 SymCryptInverseMod2e64 (UINT64 m)
 
VOID SYMCRYPT_CALL SymCryptEckeyWipePrivateState (_Inout_ PSYMCRYPT_ECKEY pkEckey)
 
VOID SYMCRYPT_CALL SymCryptFixedWindowRecoding (UINT32 W, _Inout_ PSYMCRYPT_INT piK, _Inout_ PSYMCRYPT_INT piTmp, _Out_writes_(nRecodedDigits) PUINT32 absofKIs, _Out_writes_(nRecodedDigits) PUINT32 sigofKIs, UINT32 nRecodedDigits)
 
VOID SYMCRYPT_CALL SymCryptWidthNafRecoding (UINT32 W, _Inout_ PSYMCRYPT_INT piK, _Out_writes_(nRecodedDigits) PUINT32 absofKIs, _Out_writes_(nRecodedDigits) PUINT32 sigofKIs, UINT32 nRecodedDigits)
 
VOID SYMCRYPT_CALL SymCryptPositiveWidthNafRecoding (UINT32 W, _In_ PCSYMCRYPT_INT piK, UINT32 nBitsExp, _Out_writes_(nRecodedDigits) PUINT32 absofKIs, UINT32 nRecodedDigits)
 
PCSYMCRYPT_ECURVE SYMCRYPT_CALL SymCryptGetCachedEcurve (SYMCRYPT_CACHED_ECURVE_ID curveId)
 
UINT32 SYMCRYPT_CALL SymCryptCompositeGetSizeOfEncodedEcSk (SYMCRYPT_CACHED_ECURVE_ID curveId)
 
UINT32 SYMCRYPT_CALL SymCryptCompositeGetSizeOfEncodedEcPk (SYMCRYPT_CACHED_ECURVE_ID curveId)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeyGetValueCompositeEncodingSk (_In_ PCSYMCRYPT_ECKEY pEckey, SYMCRYPT_CACHED_ECURVE_ID curveId, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeyGetValueCompositeEncodingPk (_In_ PCSYMCRYPT_ECKEY pEckey, SYMCRYPT_CACHED_ECURVE_ID curveId, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeySetValueCompositeEncodingPk (_In_ SYMCRYPT_CACHED_ECURVE_ID curveId, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, _Inout_ PSYMCRYPT_ECKEY pEckey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeySetValueCompositeEncodingSk (SYMCRYPT_CACHED_ECURVE_ID curveId, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, _Inout_ PSYMCRYPT_ECKEY pEckey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCompositeMlKemGetRandomScalarForEcKeyEx (SYMCRYPT_CACHED_ECURVE_ID ecurveId, SYMCRYPT_NUMBER_FORMAT numFormat, _In_reads_bytes_(cbSeed) PCBYTE pbSeed, SIZE_T cbSeed, _Out_writes_bytes_(cbScalar) PBYTE pbScalar, SIZE_T cbScalar)
 
SYMCRYPT_MAGIC_FIELD SYMCRYPT_ALIGN_AT (16) UINT64 Idx
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssComputePublicRoot (_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(cbSeed) PCBYTE pbSeed, SIZE_T cbSeed, _In_reads_bytes_(cbSkXmss) PCBYTE pbSkXmss, SIZE_T cbSkXmss, _Out_writes_bytes_(cbRoot) PBYTE pbRoot, SIZE_T cbRoot)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyVerifyRoot (_In_ PCSYMCRYPT_XMSS_KEY pKey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssVerifyInternal (_Inout_ PSYMCRYPT_XMSS_KEY pKey, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, UINT32 flags, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature)
 
VOID SYMCRYPT_CALL SymCryptHbsGetWinternitzLengths (UINT32 n, UINT32 w, _Out_ PUINT32 puLen1, _Out_ PUINT32 puLen2)
 
PSYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_CALL SymCryptHbsIncrementalTreehashInit (UINT32 nLeaves, PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 cbHashResult, PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes, PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext)
 
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetNode (_In_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, SIZE_T index)
 
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashAllocNode (_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, UINT32 nLeafIndex)
 
VOID SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetTopNodes (_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeLeft, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeRight)
 
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcessCommon (_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, BOOLEAN fFinal)
 
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcess (_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
 
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashFinalize (_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
 
UINT32 SYMCRYPT_CALL SymCryptHbsIncrementalTreehashStackDepth (UINT32 nLeaves)
 
SIZE_T SYMCRYPT_CALL SymCryptHbsSizeofScratchBytesForIncrementalTreehash (UINT32 cbNode, UINT32 nLeaves)
 
UINT32 SYMCRYPT_CALL SymCryptHbsGetDigit (UINT32 width, _In_ PCBYTE pbBuffer, SIZE_T cbBuffer, UINT32 index)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptLmsVerifyInternal (_In_ PCSYMCRYPT_LMS_KEY pKey, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, UINT32 flags, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature)
 
FORCEINLINE UINT32 SymCryptCountTrailingZeros32 (UINT32 value)
 
FORCEINLINE UINT32 SymCryptCountTrailingZeros64 (UINT64 value)
 
FORCEINLINE UINT32 SymCryptCountLeadingZeros32 (UINT32 value)
 
FORCEINLINE UINT32 SymCryptCountLeadingZeros64 (UINT64 value)
 

Variables

UINT32 g_SymCryptFlags
 
const BYTE SymCryptTestMsg3 [3]
 
const BYTE SymCryptTestMsg16 [16]
 
const BYTE SymCryptTestKey32 [32]
 
const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
 
const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha256Algorithm
 
const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha384Algorithm
 
const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha512Algorithm
 
const SYMCRYPT_HASH SymCryptMd2Algorithm_default
 
const SYMCRYPT_HASH SymCryptMd4Algorithm_default
 
const SYMCRYPT_HASH SymCryptMd5Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha1Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha224Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha256Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha384Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha512Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha512_224Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha512_256Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha3_224Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha3_256Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha3_384Algorithm_default
 
const SYMCRYPT_HASH SymCryptSha3_512Algorithm_default
 
const SYMCRYPT_HASH SymCryptShake128HashAlgorithm_default
 
const SYMCRYPT_HASH SymCryptShake256HashAlgorithm_default
 
const BYTE SymCryptSha256KATAnswer [32]
 
const BYTE SymCryptSha384KATAnswer [48]
 
const BYTE SymCryptSha512KATAnswer [64]
 
const SYMCRYPT_MODULAR_FUNCTIONS g_SymCryptModFns []
 
const UINT32 g_SymCryptModFnsMask
 
const SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY SymCryptModulusTypeSelections []
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp2048
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp3072
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp4096
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp6144
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp8192
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe2048
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe3072
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe4096
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe6144
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe8192
 
const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptNamedSafePrimeGroups [SYMCRYPT_DH_SAFEPRIME_GROUP_COUNT]
 
const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionShortWeierstrass
 
const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionTwistedEdwards
 
const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionMontgomery
 
const UINT32 SymCryptEcpointFormatNumberofElements [4]
 
PSYMCRYPT_MLKEMKEY pkMlKemkey
 
PSYMCRYPT_ECKEY pkEcKey
 
BOOLEAN hasPrivateSeed
 
BYTE privateSeed [SYMCRYPT_COMPOSITE_MLKEM_IRTF_PRIVATE_SEED_SIZE]
 
SYMCRYPT_MAGIC_FIELD SYMCRYPT_COMPOSITE_MLKEMKEY
 
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_COMPOSITE_MLKEMKEY
 
SYMCRYPT_XMSS_PARAMS params
 
SYMCRYPT_XMSSKEY_TYPE keyType
 
BYTE Root [SYMCRYPT_HASH_MAX_RESULT_SIZE]
 
BYTE Seed [SYMCRYPT_HASH_MAX_RESULT_SIZE]
 
BYTE SkXmss [SYMCRYPT_HASH_MAX_RESULT_SIZE]
 
BYTE SkPrf [SYMCRYPT_HASH_MAX_RESULT_SIZE]
 
 SYMCRYPT_XMSS_KEY
 
UINT64 nNextUnusedLeaf
 
BYTE abId [SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE]
 
BYTE abPublicRoot [SYMCRYPT_LMS_MAX_N]
 
BYTE abSeed [SYMCRYPT_LMS_MAX_N]
 
SYMCRYPT_MAGIC_FIELD SYMCRYPT_LMS_KEY
 

Macro Definition Documentation

◆ CHECK_ALGORITHM_INFO_FLAG_POW2

#define CHECK_ALGORITHM_INFO_FLAG_POW2 (   flag)     C_ASSERT( (flag != 0) && ((flag & (flag-1)) == 0) );

Definition at line 3708 of file sc_lib.h.

◆ CHECK_ALGORITHM_INFO_FLAGS_DISTINCT

#define CHECK_ALGORITHM_INFO_FLAGS_DISTINCT (   flag0,
  flag1,
  flag2,
  flag3,
  flag4 
)     C_ASSERT( (flag0 < flag1) && (flag1 < flag2) && (flag2 < flag3) && (flag3 < flag4) );

Definition at line 3712 of file sc_lib.h.

◆ CONCAT2

#define CONCAT2 (   a,
  b 
)    CONCAT_I2( a, b )

Definition at line 110 of file sc_lib.h.

◆ CONCAT3

#define CONCAT3 (   a,
  b,
  c 
)    CONCAT_I3( a, b, c )

Definition at line 111 of file sc_lib.h.

◆ CONCAT_I2

#define CONCAT_I2 (   a,
  b 
)    a##b

Definition at line 106 of file sc_lib.h.

◆ CONCAT_I3

#define CONCAT_I3 (   a,
  b,
  c 
)    a##b##c

Definition at line 107 of file sc_lib.h.

◆ FALSE

#define FALSE   (0)

Definition at line 50 of file sc_lib.h.

◆ FAST_FAIL_CRYPTO_LIBRARY

#define FAST_FAIL_CRYPTO_LIBRARY   22

Definition at line 58 of file sc_lib.h.

◆ GCM_YMM_MINBLOCKS

#define GCM_YMM_MINBLOCKS   16

Definition at line 1611 of file sc_lib.h.

◆ HMAC_IPAD_BYTE

#define HMAC_IPAD_BYTE   0x36

Definition at line 301 of file sc_lib.h.

◆ HMAC_OPAD_BYTE

#define HMAC_OPAD_BYTE   0x5c

Definition at line 302 of file sc_lib.h.

◆ NATIVE_BITS

#define NATIVE_BITS   (32)

Definition at line 78 of file sc_lib.h.

◆ NATIVE_BYTES

#define NATIVE_BYTES   (4)

Definition at line 79 of file sc_lib.h.

◆ NATIVE_BYTES_LOG2

#define NATIVE_BYTES_LOG2   (2)

Definition at line 80 of file sc_lib.h.

◆ PAR_SCRATCH_ELEMENTS_256

#define PAR_SCRATCH_ELEMENTS_256   (4+8+64)

Definition at line 1767 of file sc_lib.h.

◆ PAR_SCRATCH_ELEMENTS_512

#define PAR_SCRATCH_ELEMENTS_512   (4+8+80)

Definition at line 1768 of file sc_lib.h.

◆ PCSYMCRYPT_HMAC_XXX_EXPANDED_KEY

#define PCSYMCRYPT_HMAC_XXX_EXPANDED_KEY   CONCAT3( PCSYMCRYPT_HMAC_, ALG, _EXPANDED_KEY )

Definition at line 158 of file sc_lib.h.

◆ PCSYMCRYPT_HMAC_XXX_STATE

#define PCSYMCRYPT_HMAC_XXX_STATE   CONCAT3( PCSYMCRYPT_HMAC_, ALG, _STATE )

Definition at line 161 of file sc_lib.h.

◆ PCSYMCRYPT_XXX_EXPANDED_KEY

#define PCSYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( PCSYMCRYPT_, ALG, _EXPANDED_KEY )

Definition at line 133 of file sc_lib.h.

◆ PCSYMCRYPT_XXX_STATE

#define PCSYMCRYPT_XXX_STATE   CONCAT3( PCSYMCRYPT_, ALG, _STATE )

Definition at line 118 of file sc_lib.h.

◆ PSYMCRYPT_HMAC_XXX_EXPANDED_KEY

#define PSYMCRYPT_HMAC_XXX_EXPANDED_KEY   CONCAT3( PSYMCRYPT_HMAC_, ALG, _EXPANDED_KEY )

Definition at line 157 of file sc_lib.h.

◆ PSYMCRYPT_HMAC_XXX_STATE

#define PSYMCRYPT_HMAC_XXX_STATE   CONCAT3( PSYMCRYPT_HMAC_, ALG, _STATE )

Definition at line 160 of file sc_lib.h.

◆ PSYMCRYPT_XXX_EXPANDED_KEY

#define PSYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( PSYMCRYPT_, ALG, _EXPANDED_KEY )

Definition at line 132 of file sc_lib.h.

◆ PSYMCRYPT_XXX_STATE

#define PSYMCRYPT_XXX_STATE   CONCAT3( PSYMCRYPT_, ALG, _STATE )

Definition at line 117 of file sc_lib.h.

◆ REPEAT_BYTE_TO_UINT32

#define REPEAT_BYTE_TO_UINT32 (   x)    (((UINT32)x << 24) | ((UINT32)x << 16) | ((UINT32)x << 8) | x)

Definition at line 889 of file sc_lib.h.

◆ REPEAT_BYTE_TO_UINT64

#define REPEAT_BYTE_TO_UINT64 (   x)    ( ((UINT64)REPEAT_BYTE_TO_UINT32(x) << 32) | REPEAT_BYTE_TO_UINT32(x) )

Definition at line 890 of file sc_lib.h.

◆ ROL16

#define ROL16 (   x,
  n 
)    ((UINT16)( ( ((x) << (n)) | ((x) >> (16-(n))) ) ))

Definition at line 324 of file sc_lib.h.

◆ ROR16

#define ROR16 (   x,
  n 
)    ((UINT16)( ( ((x) >> (n)) | ((x) << (16-(n))) ) ))

Definition at line 325 of file sc_lib.h.

◆ SYMCRYPT_ARRAY_SIZE

#define SYMCRYPT_ARRAY_SIZE (   _x)    (sizeof(_x)/sizeof(_x[0]))

Definition at line 342 of file sc_lib.h.

◆ SYMCRYPT_ASSERT_ASYM_ALIGNED

#define SYMCRYPT_ASSERT_ASYM_ALIGNED (   _p)    SYMCRYPT_ASSERT( ((SIZE_T)(_p) & (SYMCRYPT_ASYM_ALIGN_VALUE - 1)) == 0 );

Definition at line 1912 of file sc_lib.h.

◆ SYMCRYPT_BLOB_MAGIC

#define SYMCRYPT_BLOB_MAGIC   ('cmys')

Definition at line 1077 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_CURVE_25519

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_CURVE_25519   (32)

Definition at line 4377 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P256

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P256   (51)

Definition at line 4375 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P384

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PRIVATE_KEY_P384   (64)

Definition at line 4376 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_CURVE_25519

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_CURVE_25519   (32)

Definition at line 4371 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P256

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P256   (65)

Definition at line 4369 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P384

#define SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P384   (97)

Definition at line 4370 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_SIZEOF_MAX_ENCODED_EC_PUBLIC_KEY

#define SYMCRYPT_COMPOSITE_SIZEOF_MAX_ENCODED_EC_PUBLIC_KEY   SYMCRYPT_COMPOSITE_SIZEOF_ENCODED_EC_PUBLIC_KEY_P384

Definition at line 4373 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE   (SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_AESNI)

Definition at line 307 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_AESNI_PCLMULQDQ_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_PCLMULQDQ_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE)

Definition at line 308 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_MULX

#define SYMCRYPT_CPU_FEATURES_FOR_MULX   (SYMCRYPT_CPU_FEATURE_BMI2 | SYMCRYPT_CPU_FEATURE_ADX | SYMCRYPT_CPU_FEATURE_SSE2 )

Definition at line 314 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE   (SYMCRYPT_CPU_FEATURE_PCLMULQDQ | SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_SAVEXMM_NOFAIL )

Definition at line 305 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE   (SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_SHANI)

Definition at line 312 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_VAES_256_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_VAES_256_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURE_AVX2 | SYMCRYPT_CPU_FEATURE_VAES)

Definition at line 309 of file sc_lib.h.

◆ SYMCRYPT_CPU_FEATURES_FOR_VAES_512_CODE

#define SYMCRYPT_CPU_FEATURES_FOR_VAES_512_CODE   (SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE | SYMCRYPT_CPU_FEATURE_AVX512 | SYMCRYPT_CPU_FEATURE_VAES)

Definition at line 310 of file sc_lib.h.

◆ SYMCRYPT_CPUID_DETECT_FLAG_CHECK_OS_SUPPORT_FOR_YMM

#define SYMCRYPT_CPUID_DETECT_FLAG_CHECK_OS_SUPPORT_FOR_YMM   1

Definition at line 1025 of file sc_lib.h.

◆ SYMCRYPT_CSHAKE_PADDING_VALUE

#define SYMCRYPT_CSHAKE_PADDING_VALUE   0x04

Definition at line 1810 of file sc_lib.h.

◆ SYMCRYPT_DH_SAFEPRIME_GROUP_COUNT

#define SYMCRYPT_DH_SAFEPRIME_GROUP_COUNT   (10)

Definition at line 3788 of file sc_lib.h.

◆ SYMCRYPT_DISABLE_CFG

#define SYMCRYPT_DISABLE_CFG

Definition at line 15 of file sc_lib.h.

◆ SYMCRYPT_ECURVE_FUNCTIONS_SIZE

#define SYMCRYPT_ECURVE_FUNCTIONS_SIZE   (sizeof( SYMCRYPT_ECURVE_FUNCTIONS ) )

Definition at line 3922 of file sc_lib.h.

◆ SYMCRYPT_FDEF_DIGIT_NUINT32

#define SYMCRYPT_FDEF_DIGIT_NUINT32   ((UINT32)(SYMCRYPT_FDEF_DIGIT_SIZE / sizeof( UINT32 ) ))

Definition at line 1916 of file sc_lib.h.

◆ SYMCRYPT_FLAG_LIB_INITIALIZED

#define SYMCRYPT_FLAG_LIB_INITIALIZED   0x00000001

Definition at line 22 of file sc_lib.h.

◆ SYMCRYPT_HMAC_XXX_INPUT_BLOCK_SIZE

#define SYMCRYPT_HMAC_XXX_INPUT_BLOCK_SIZE   SYMCRYPT_XXX_INPUT_BLOCK_SIZE

Definition at line 154 of file sc_lib.h.

◆ SYMCRYPT_HMAC_XXX_RESULT_SIZE

#define SYMCRYPT_HMAC_XXX_RESULT_SIZE   SYMCRYPT_XXX_RESULT_SIZE

Definition at line 155 of file sc_lib.h.

◆ SYMCRYPT_HMAC_XXX_STATE

#define SYMCRYPT_HMAC_XXX_STATE   CONCAT3( SYMCRYPT_HMAC_, ALG, _STATE )

Definition at line 159 of file sc_lib.h.

◆ SYMCRYPT_HmacXxx

#define SYMCRYPT_HmacXxx   CONCAT2( SymCryptHmac, Alg )

Definition at line 142 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxAppend

#define SYMCRYPT_HmacXxxAppend   CONCAT3( SymCryptHmac, Alg, Append )

Definition at line 147 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxExpandKey

#define SYMCRYPT_HmacXxxExpandKey   CONCAT3( SymCryptHmac, Alg, ExpandKey )

Definition at line 145 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxInit

#define SYMCRYPT_HmacXxxInit   CONCAT3( SymCryptHmac, Alg, Init )

Definition at line 146 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxKeyCopy

#define SYMCRYPT_HmacXxxKeyCopy   CONCAT3( SymCryptHmac, Alg, KeyCopy )

Definition at line 144 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxResult

#define SYMCRYPT_HmacXxxResult   CONCAT3( SymCryptHmac, Alg, Result )

Definition at line 148 of file sc_lib.h.

◆ SYMCRYPT_HmacXxxStateCopy

#define SYMCRYPT_HmacXxxStateCopy   CONCAT3( SymCryptHmac, Alg, StateCopy )

Definition at line 143 of file sc_lib.h.

◆ SYMCRYPT_IS_VALID_WINTERNITZ_WIDTH

#define SYMCRYPT_IS_VALID_WINTERNITZ_WIDTH (   w)    ( ((w) == 1) || ((w) == 2) || ((w) == 4) || ((w) == 8) )

Definition at line 4701 of file sc_lib.h.

◆ SYMCRYPT_LMS_CHECKSUM_SIZE

#define SYMCRYPT_LMS_CHECKSUM_SIZE   16

Definition at line 4707 of file sc_lib.h.

◆ SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE

#define SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE   16

Definition at line 4702 of file sc_lib.h.

◆ SYMCRYPT_LMS_MAX_CUSTOM_TREE_HEIGHT

#define SYMCRYPT_LMS_MAX_CUSTOM_TREE_HEIGHT   31

Definition at line 4706 of file sc_lib.h.

◆ SYMCRYPT_LMS_MAX_H

#define SYMCRYPT_LMS_MAX_H   25

Definition at line 4705 of file sc_lib.h.

◆ SYMCRYPT_LMS_MAX_N

#define SYMCRYPT_LMS_MAX_N   32

Definition at line 4703 of file sc_lib.h.

◆ SYMCRYPT_LMS_MAX_P

#define SYMCRYPT_LMS_MAX_P   265

Definition at line 4704 of file sc_lib.h.

◆ SYMCRYPT_LMS_PRIV_KEY_SIZE

#define SYMCRYPT_LMS_PRIV_KEY_SIZE (   cbHashOutput)    (SYMCRYPT_LMS_PUB_KEY_SIZE(cbHashOutput) + sizeof(UINT32) + cbHashOutput)

Definition at line 4713 of file sc_lib.h.

◆ SYMCRYPT_LMS_PUB_KEY_SIZE

#define SYMCRYPT_LMS_PUB_KEY_SIZE (   cbHashOutput)    (8 + SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE + cbHashOutput)

Definition at line 4710 of file sc_lib.h.

◆ SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS

#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS   (256)

Definition at line 4347 of file sc_lib.h.

◆ SYMCRYPT_MOD_CALL

#define SYMCRYPT_MOD_CALL (   v)    ((SYMCRYPT_MODULAR_FUNCTIONS *)(( SYMCRYPT_FORCE_READ32( &(v)->type) & g_SymCryptModFnsMask) + (PBYTE)(&g_SymCryptModFns) ))->

Definition at line 2039 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF369_MONTGOMERY

#define SYMCRYPT_MOD_FUNCTIONS_FDEF369_MONTGOMERY
Value:
{\
}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdef369ModInvMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModMulMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PCUINT32 SYMCRYPT_CALL SymCryptFdef369ModPreGetMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModAddGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupMontgomery(_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
Definition: fdef_mod.c:1304
VOID SYMCRYPT_CALL SymCryptFdef369ModulusInitMontgomery(_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModSetPostMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModSubGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModSquareMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModNegGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:609

Definition at line 2145 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_GENERIC

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_GENERIC
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModSquareGeneric(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:935
VOID SYMCRYPT_CALL SymCryptFdefModAddGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:548
VOID SYMCRYPT_CALL SymCryptFdefModSubGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:584
VOID SYMCRYPT_CALL SymCryptFdefModulusInitGeneric(_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:112
VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupGeneric(_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
Definition: fdef_mod.c:145
VOID SYMCRYPT_CALL SymCryptFdefModSetPostGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:354
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvGeneric(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:960
VOID SYMCRYPT_CALL SymCryptFdefModMulGeneric(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:909
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:368

Definition at line 2041 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY
Value:
{\
}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1440
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1261
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1282
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery(_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1191
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1316
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1380

Definition at line 2054 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY1024

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY1024

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY512

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY512

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64256

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64256
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModSub256Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery256Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_UNARY_OP_FN)(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: sc_lib.h:1937
VOID SYMCRYPT_CALL SymCryptFdefModAdd256Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery256Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_BINARY_OP_FN)(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: sc_lib.h:1929

Definition at line 2067 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64P384

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_ARM64P384
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryP384Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryP384Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID SYMCRYPT_CALL SymCryptFdefModAdd384Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
VOID SYMCRYPT_CALL SymCryptFdefModSub384Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)

Definition at line 2080 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 2158 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX1024

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX1024
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx1024(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx1024(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 2197 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX256

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX256
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx256Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery256(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx256Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulx256(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery256(_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModAddMulx256Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)
PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery256(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 2093 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX384

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULX384
Value:
{\
(SYMCRYPT_MOD_BINARY_OP_FN) &SymCryptFdefModMulMontgomeryMulx384Asm,\
(SYMCRYPT_MOD_UNARY_OP_FN) &SymCryptFdefModSquareMontgomeryMulx384Asm,\
&SymCryptFdefModSetPostMontgomeryMulx384,\
}
VOID SYMCRYPT_CALL SymCryptFdefModAddMulx384Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst)

Definition at line 2119 of file sc_lib.h.

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULXP256

◆ SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULXP384

#define SYMCRYPT_MOD_FUNCTIONS_FDEF_MONTGOMERY_MULXP384
Value:
{\
}
VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulxP384Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst)
VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulxP384(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulxP384Asm(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst)

Definition at line 2132 of file sc_lib.h.

◆ SYMCRYPT_MODULAR_FUNCTIONS_SIZE

#define SYMCRYPT_MODULAR_FUNCTIONS_SIZE   (sizeof( SYMCRYPT_MODULAR_FUNCTIONS ) )

Definition at line 2007 of file sc_lib.h.

◆ SYMCRYPT_MODULUS_FEATURE_MONTGOMERY

#define SYMCRYPT_MODULUS_FEATURE_MONTGOMERY   1

Definition at line 2018 of file sc_lib.h.

◆ SYMCRYPT_MODULUS_FEATURE_NISTP384

#define SYMCRYPT_MODULUS_FEATURE_NISTP384   8

Definition at line 2021 of file sc_lib.h.

◆ SYMCRYPT_OBJ_NBYTES

#define SYMCRYPT_OBJ_NBYTES (   _p)    ((_p)->nDigits * SYMCRYPT_FDEF_DIGIT_SIZE)

Definition at line 1919 of file sc_lib.h.

◆ SYMCRYPT_OBJ_NDIGITS

#define SYMCRYPT_OBJ_NDIGITS (   _p)    ((_p)->nDigits)

Definition at line 1918 of file sc_lib.h.

◆ SYMCRYPT_OBJ_NUINT32

#define SYMCRYPT_OBJ_NUINT32 (   _p)    ((_p)->nDigits * SYMCRYPT_FDEF_DIGIT_SIZE / sizeof( UINT32 ))

Definition at line 1920 of file sc_lib.h.

◆ SYMCRYPT_RUN_KEY_GEN_PCT

#define SYMCRYPT_RUN_KEY_GEN_PCT (   KeySelftestFunction,
  Key,
  KeySelftestFlag 
)
Value:
if( ( Key->fAlgorithmInfo & (KeySelftestFlag | SYMCRYPT_FLAG_KEY_NO_FIPS) ) == 0 ) \
{ \
/* PCT should never fail on key generation - FIPS assert that it does not */ \
SYMCRYPT_FIPS_ASSERT( KeySelftestFunction( Key ) == SYMCRYPT_NO_ERROR ); \
SYMCRYPT_ATOMIC_OR32_PRE_RELAXED(&Key->fAlgorithmInfo, KeySelftestFlag); \
}
#define SYMCRYPT_FLAG_KEY_NO_FIPS
Definition: symcrypt.h:7579

Definition at line 3699 of file sc_lib.h.

◆ SYMCRYPT_RUN_SELFTEST_ONCE

#define SYMCRYPT_RUN_SELFTEST_ONCE (   AlgorithmSelftestFunction,
  AlgorithmSelftestFlag 
)
Value:
if( ( g_SymCryptFipsSelftestsPerformed & AlgorithmSelftestFlag ) == 0 ) \
{ \
AlgorithmSelftestFunction( ); \
SYMCRYPT_ATOMIC_OR32_PRE_RELAXED( &g_SymCryptFipsSelftestsPerformed, AlgorithmSelftestFlag ); \
}
UINT32 g_SymCryptFipsSelftestsPerformed
Definition: implglue.c:61

Definition at line 3686 of file sc_lib.h.

◆ SYMCRYPT_SHA3_PADDING_VALUE

#define SYMCRYPT_SHA3_PADDING_VALUE   0x06

Definition at line 1808 of file sc_lib.h.

◆ SYMCRYPT_SHAKE_PADDING_VALUE

#define SYMCRYPT_SHAKE_PADDING_VALUE   0x1f

Definition at line 1809 of file sc_lib.h.

◆ SYMCRYPT_SIZEOF_TREEHASH_NODE

#define SYMCRYPT_SIZEOF_TREEHASH_NODE (   cbValue)    (sizeof(SYMCRYPT_TREEHASH_NODE) - 1 + (cbValue))

Definition at line 4597 of file sc_lib.h.

◆ SYMCRYPT_TREEHASH_NODE_GET

#define SYMCRYPT_TREEHASH_NODE_GET (   aNodes,
  cbValue,
  i 
)    ((PSYMCRYPT_TREEHASH_NODE)((PBYTE)(aNodes) + (i) * SYMCRYPT_SIZEOF_TREEHASH_NODE(cbValue)))

Definition at line 4599 of file sc_lib.h.

◆ SYMCRYPT_Xxx

#define SYMCRYPT_Xxx   CONCAT2( SymCrypt, Alg )

Definition at line 120 of file sc_lib.h.

◆ SYMCRYPT_XXX_EXPANDED_KEY

#define SYMCRYPT_XXX_EXPANDED_KEY   CONCAT3( SYMCRYPT_, ALG, _EXPANDED_KEY )

Definition at line 131 of file sc_lib.h.

◆ SYMCRYPT_XXX_INPUT_BLOCK_SIZE

#define SYMCRYPT_XXX_INPUT_BLOCK_SIZE   CONCAT3( SYMCRYPT_, ALG, _INPUT_BLOCK_SIZE )

Definition at line 151 of file sc_lib.h.

◆ SYMCRYPT_XXX_RESULT_SIZE

#define SYMCRYPT_XXX_RESULT_SIZE   CONCAT3( SYMCRYPT_, ALG, _RESULT_SIZE )

Definition at line 152 of file sc_lib.h.

◆ SYMCRYPT_XXX_STATE

#define SYMCRYPT_XXX_STATE   CONCAT3( SYMCRYPT_, ALG, _STATE )

Definition at line 116 of file sc_lib.h.

◆ SYMCRYPT_XxxAppend

#define SYMCRYPT_XxxAppend   CONCAT3( SymCrypt, Alg, Append )

Definition at line 124 of file sc_lib.h.

◆ SYMCRYPT_XxxAppendBlocks

#define SYMCRYPT_XxxAppendBlocks   CONCAT3( SymCrypt, Alg, AppendBlocks )

Definition at line 126 of file sc_lib.h.

◆ SYMCRYPT_XxxDefault

#define SYMCRYPT_XxxDefault   CONCAT3( SymCrypt, Alg, Default )

Definition at line 135 of file sc_lib.h.

◆ SYMCRYPT_XxxEx

#define SYMCRYPT_XxxEx   CONCAT3( SymCrypt, Alg, Ex)

Definition at line 134 of file sc_lib.h.

◆ SYMCRYPT_XxxExpandKey

#define SYMCRYPT_XxxExpandKey   CONCAT3( SymCrypt, Alg, ExpandKey )

Definition at line 136 of file sc_lib.h.

◆ SYMCRYPT_XxxExpandKeyEx

#define SYMCRYPT_XxxExpandKeyEx   CONCAT3( SymCrypt, Alg, ExpandKeyEx )

Definition at line 137 of file sc_lib.h.

◆ SYMCRYPT_XxxExtract

#define SYMCRYPT_XxxExtract   CONCAT3( SymCrypt, Alg, Extract )

Definition at line 138 of file sc_lib.h.

◆ SYMCRYPT_XxxInit

#define SYMCRYPT_XxxInit   CONCAT3( SymCrypt, Alg, Init )

Definition at line 123 of file sc_lib.h.

◆ SYMCRYPT_XxxKeyCopy

#define SYMCRYPT_XxxKeyCopy   CONCAT3( SymCrypt, Alg, KeyCopy )

Definition at line 140 of file sc_lib.h.

◆ SYMCRYPT_XxxResult

#define SYMCRYPT_XxxResult   CONCAT3( SymCrypt, Alg, Result )

Definition at line 125 of file sc_lib.h.

◆ SYMCRYPT_XxxResultEx

#define SYMCRYPT_XxxResultEx   CONCAT3( SymCrypt, Alg, ResultEx )

Definition at line 139 of file sc_lib.h.

◆ SYMCRYPT_XxxStateCopy

#define SYMCRYPT_XxxStateCopy   CONCAT3( SymCrypt, Alg, StateCopy )

Definition at line 122 of file sc_lib.h.

◆ SYMCRYPT_XxxStateExport

#define SYMCRYPT_XxxStateExport   CONCAT3( SymCrypt, Alg, StateExport)

Definition at line 128 of file sc_lib.h.

◆ SYMCRYPT_XxxStateImport

#define SYMCRYPT_XxxStateImport   CONCAT3( SymCrypt, Alg, StateImport)

Definition at line 127 of file sc_lib.h.

◆ TRUE

#define TRUE   (1)

Definition at line 46 of file sc_lib.h.

◆ UNREFERENCED_PARAMETER

#define UNREFERENCED_PARAMETER (   x)    ((void)x)

Definition at line 54 of file sc_lib.h.

Typedef Documentation

◆ _SYMCRYPT_COMPOSITE_MLKEMKEY

typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_COMPOSITE_MLKEMKEY

◆ _SYMCRYPT_LMS_KEY

typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_LMS_KEY
Initial value:
{
UINT32 cbSize
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Definition at line 4718 of file sc_lib.h.

◆ _SYMCRYPT_XMSS_KEY

typedef SYMCRYPT_ASYM_ALIGN_STRUCT _SYMCRYPT_XMSS_KEY
Initial value:
{
static const WCHAR version[]
Definition: asmname.c:66
uint32_t UINT32
Definition: typedefs.h:59

Definition at line 4519 of file sc_lib.h.

◆ BOOL

typedef int BOOL

Definition at line 43 of file sc_lib.h.

◆ NATIVE_INT

typedef INT32 NATIVE_INT

Definition at line 76 of file sc_lib.h.

◆ NATIVE_UINT

Definition at line 77 of file sc_lib.h.

◆ PCSYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS

◆ PCSYMCRYPT_COMPOSITE_MLKEMKEY

◆ PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS

◆ PCSYMCRYPT_ECURVE_FUNCTIONS

◆ PCSYMCRYPT_LMS_KEY

Definition at line 4740 of file sc_lib.h.

◆ PCSYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY

◆ PSYMCRYPT_BLOB_HEADER

◆ PSYMCRYPT_BLOB_TRAILER

◆ PSYMCRYPT_CACHED_ECURVE_ID

◆ PSYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS

◆ PSYMCRYPT_ECPOINT_ADD_DIFF_NONZERO_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ADD_DIFF_NONZERO_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3852 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_ADD_FUNC

Definition at line 3842 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_DOUBLE_FUNC

Definition at line 3861 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_ISEQUAL_FUNC

Definition at line 3819 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_ISZERO_FUNC

Definition at line 3835 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_MULTI_SCALAR_MUL_FUNC

typedef SYMCRYPT_ERROR(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_MULTI_SCALAR_MUL_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_reads_(nPoints) PCSYMCRYPT_INT *piSrcScalarArray, _In_reads_(nPoints) PCSYMCRYPT_ECPOINT *poSrcEcpointArray, UINT32 nPoints, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3889 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_NEGATE_FUNC

Definition at line 3870 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_ONCURVE_FUNC

typedef UINT32(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_ONCURVE_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3828 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_SCALAR_MUL_FUNC

Definition at line 3878 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_SET_DISTINGUISHED_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_DISTINGUISHED_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3804 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_SET_RANDOM_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_RANDOM_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_INT piScalar, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3811 of file sc_lib.h.

◆ PSYMCRYPT_ECPOINT_SET_ZERO_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECPOINT_SET_ZERO_FUNC) (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 3797 of file sc_lib.h.

◆ PSYMCRYPT_ECURVE_FILL_SCRATCH_SPACES_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_ECURVE_FILL_SCRATCH_SPACES_FUNC) (_Inout_ PSYMCRYPT_ECURVE pCurve)

Definition at line 3899 of file sc_lib.h.

◆ PSYMCRYPT_ECURVE_FUNCTIONS

◆ PSYMCRYPT_INCREMENTAL_TREEHASH

◆ PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC

typedef VOID(SYMCRYPT_CALL * PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC) (_In_ PSYMCRYPT_TREEHASH_NODE pNodeLeft, _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight, _Out_ PSYMCRYPT_TREEHASH_NODE pNodeOut, _Inout_ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext)

Definition at line 4612 of file sc_lib.h.

◆ PSYMCRYPT_LMS_KEY

Definition at line 4739 of file sc_lib.h.

◆ PSYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY

◆ PSYMCRYPT_TREEHASH_NODE

◆ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT

◆ PSYMCRYPT_XMSS_KEY

Definition at line 4541 of file sc_lib.h.

◆ PXMSS_ADRS

◆ PXMSS_HASHTREE_ADDRESS

◆ PXMSS_LTREE_ADDRESS

◆ PXMSS_OTS_ADDRESS

◆ SYMCRYPT_BLOB_HEADER

◆ SYMCRYPT_BLOB_TRAILER

◆ SYMCRYPT_BLOB_TYPE

◆ SYMCRYPT_COMPOSITE_MLKEM_INTERNAL_PARAMS

◆ SYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS

◆ SYMCRYPT_ECURVE_FUNCTIONS

◆ SYMCRYPT_INCREMENTAL_TREEHASH

◆ SYMCRYPT_KECCAK_STATE_EXPORT_BLOB

◆ SYMCRYPT_MD2_STATE_EXPORT_BLOB

◆ SYMCRYPT_MD4_STATE_EXPORT_BLOB

◆ SYMCRYPT_MD5_STATE_EXPORT_BLOB

◆ SYMCRYPT_MOD_BINARY_OP_FN

Definition at line 1929 of file sc_lib.h.

◆ SYMCRYPT_MOD_COPY_FN

typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_COPY_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)

Definition at line 1964 of file sc_lib.h.

◆ SYMCRYPT_MOD_PRE_GET_FN

Definition at line 1958 of file sc_lib.h.

◆ SYMCRYPT_MOD_SET_POST_FN

typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MOD_SET_POST_FN) (_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 1952 of file sc_lib.h.

◆ SYMCRYPT_MOD_UNARY_OP_FLAG_STATUS_FN

Definition at line 1944 of file sc_lib.h.

◆ SYMCRYPT_MOD_UNARY_OP_FN

Definition at line 1937 of file sc_lib.h.

◆ SYMCRYPT_MODULAR_FUNCTIONS

◆ SYMCRYPT_MODULUS_COPYFIXUP_FN

typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MODULUS_COPYFIXUP_FN) (_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)

Definition at line 1969 of file sc_lib.h.

◆ SYMCRYPT_MODULUS_INIT_FN

typedef VOID(SYMCRYPT_CALL * SYMCRYPT_MODULUS_INIT_FN) (_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

Definition at line 1973 of file sc_lib.h.

◆ SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY

◆ SYMCRYPT_SHA1_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA256_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA3_224_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA3_256_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA3_384_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA3_512_STATE_EXPORT_BLOB

◆ SYMCRYPT_SHA512_STATE_EXPORT_BLOB

◆ SYMCRYPT_TREEHASH_NODE

◆ SYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT

◆ XMSS_ADRS

◆ XMSS_ADRS_TYPE

◆ XMSS_HASHTREE_ADDRESS

◆ XMSS_LTREE_ADDRESS

◆ XMSS_OTS_ADDRESS

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
STATE_NEXT 
STATE_DATA_START 
STATE_DATA_END 
STATE_RESULT2 
STATE_RESULT_DONE 

Definition at line 344 of file sc_lib.h.

344 {
345 STATE_NEXT = 0, // starting state = 0, set by structure wipe.
348 STATE_RESULT2, // 2nd phase of result computation (1st phase is at STATE_NEXT when the result operation is found)
349 STATE_RESULT_DONE, // 3rd phase of result computation
350};
@ STATE_NEXT
Definition: sc_lib.h:345
@ STATE_RESULT_DONE
Definition: sc_lib.h:349
@ STATE_DATA_START
Definition: sc_lib.h:346
@ STATE_RESULT2
Definition: sc_lib.h:348
@ STATE_DATA_END
Definition: sc_lib.h:347

◆ _SYMCRYPT_BLOB_TYPE

Enumerator
SymCryptBlobTypeUnknown 
SymCryptBlobTypeHashState 
SymCryptBlobTypeMd2State 
SymCryptBlobTypeMd4State 
SymCryptBlobTypeMd5State 
SymCryptBlobTypeSha1State 
SymCryptBlobTypeSha256State 
SymCryptBlobTypeSha384State 
SymCryptBlobTypeSha512State 
SymCryptBlobTypeSha3_256State 
SymCryptBlobTypeSha3_384State 
SymCryptBlobTypeSha3_512State 
SymCryptBlobTypeSha224State 
SymCryptBlobTypeSha512_224State 
SymCryptBlobTypeSha512_256State 
SymCryptBlobTypeSha3_224State 

Definition at line 1058 of file sc_lib.h.

1058 {
1061 SymCryptBlobTypeMd2State = SymCryptBlobTypeHashState + 1, // explicit constants as these have to remain the same forever.
@ SymCryptBlobTypeSha512_224State
Definition: sc_lib.h:1072
@ SymCryptBlobTypeSha224State
Definition: sc_lib.h:1071
@ SymCryptBlobTypeSha512_256State
Definition: sc_lib.h:1073
@ SymCryptBlobTypeMd4State
Definition: sc_lib.h:1062
@ SymCryptBlobTypeSha3_256State
Definition: sc_lib.h:1068
@ SymCryptBlobTypeSha3_224State
Definition: sc_lib.h:1074
@ SymCryptBlobTypeMd2State
Definition: sc_lib.h:1061
@ SymCryptBlobTypeSha384State
Definition: sc_lib.h:1066
@ SymCryptBlobTypeUnknown
Definition: sc_lib.h:1059
@ SymCryptBlobTypeSha512State
Definition: sc_lib.h:1067
@ SymCryptBlobTypeHashState
Definition: sc_lib.h:1060
@ SymCryptBlobTypeSha3_384State
Definition: sc_lib.h:1069
@ SymCryptBlobTypeSha3_512State
Definition: sc_lib.h:1070
@ SymCryptBlobTypeSha256State
Definition: sc_lib.h:1065
@ SymCryptBlobTypeMd5State
Definition: sc_lib.h:1063
@ SymCryptBlobTypeSha1State
Definition: sc_lib.h:1064
enum _SYMCRYPT_BLOB_TYPE SYMCRYPT_BLOB_TYPE

◆ _XMSS_ADRS_TYPE

Enumerator
XMSS_ADRS_TYPE_OTS 
XMSS_ADRS_TYPE_LTREE 
XMSS_ADRS_TYPE_HASH_TREE 

Definition at line 4474 of file sc_lib.h.

4475{
enum _XMSS_ADRS_TYPE XMSS_ADRS_TYPE
@ XMSS_ADRS_TYPE_HASH_TREE
Definition: sc_lib.h:4478
@ XMSS_ADRS_TYPE_LTREE
Definition: sc_lib.h:4477
@ XMSS_ADRS_TYPE_OTS
Definition: sc_lib.h:4476

◆ SYMCRYPT_CACHED_ECURVE_ID

Enumerator
SYMCRYPT_CACHED_ECURVE_ID_NIST_P256 
SYMCRYPT_CACHED_ECURVE_ID_NIST_P384 
SYMCRYPT_CACHED_ECURVE_ID_CURVE_25519 
SYMCRYPT_CACHED_ECURVE_ID_COUNT 

Definition at line 4357 of file sc_lib.h.

4357 {
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
enum SYMCRYPT_CACHED_ECURVE_ID * PSYMCRYPT_CACHED_ECURVE_ID

Function Documentation

◆ C_ASSERT() [1/9]

◆ C_ASSERT() [2/9]

◆ C_ASSERT() [3/9]

◆ C_ASSERT() [4/9]

◆ C_ASSERT() [5/9]

◆ C_ASSERT() [6/9]

◆ C_ASSERT() [7/9]

◆ C_ASSERT() [8/9]

◆ C_ASSERT() [9/9]

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [1/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_DLKEY_DH  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [2/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_DLKEY_DSA  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [3/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_ECKEY_ECDH  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [4/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_ECKEY_ECDSA  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [5/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [6/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_KEY_NO_FIPS  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [7/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_RSAKEY_ENCRYPT  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [8/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_FLAG_RSAKEY_SIGN  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [9/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_PCT_DSA  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [10/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_PCT_ECDSA  )

◆ CHECK_ALGORITHM_INFO_FLAG_POW2() [11/11]

CHECK_ALGORITHM_INFO_FLAG_POW2 ( SYMCRYPT_PCT_RSA_SIGN  )

◆ CHECK_ALGORITHM_INFO_FLAGS_DISTINCT() [1/3]

◆ CHECK_ALGORITHM_INFO_FLAGS_DISTINCT() [2/3]

◆ CHECK_ALGORITHM_INFO_FLAGS_DISTINCT() [3/3]

◆ SYMCRYPT_ALIGN_AT()

SYMCRYPT_MAGIC_FIELD SYMCRYPT_ALIGN_AT ( 16  )

◆ SymCryptAes4Sbox()

VOID SYMCRYPT_CALL SymCryptAes4Sbox ( _In_reads_(4) PCBYTE  pIn,
_Out_writes_(4) PBYTE  pOut,
BOOL  UseSimd 
)

Definition at line 44 of file aes-default.c.

45{
46#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
47 if( UseSimd )
48 {
49 SymCryptAes4SboxXmm( pIn, pOut );
50 } else {
51 SymCryptAes4SboxC( pIn, pOut );
52 }
53#elif SYMCRYPT_CPU_ARM64
54 if( UseSimd )
55 {
56 SymCryptAes4SboxNeon( pIn, pOut );
57 } else {
58 SymCryptAes4SboxC( pIn, pOut );
59 }
60#else
61 UNREFERENCED_PARAMETER( UseSimd );
62 SymCryptAes4SboxC( pIn, pOut ); // never use XMM on SaveXmm arch, save/restore overhead is too large.
63#endif
64}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
VOID SYMCRYPT_CALL SymCryptAes4SboxNeon(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
VOID SYMCRYPT_CALL SymCryptAes4SboxC(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
VOID SYMCRYPT_CALL SymCryptAes4SboxXmm(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)

Referenced by SymCryptAesExpandKeyInternal().

◆ SymCryptAes4SboxC()

VOID SYMCRYPT_CALL SymCryptAes4SboxC ( _In_reads_(4) PCBYTE  pIn,
_Out_writes_(4) PBYTE  pOut 
)

Referenced by SymCryptAes4Sbox().

◆ SymCryptAes4SboxNeon()

VOID SYMCRYPT_CALL SymCryptAes4SboxNeon ( _In_reads_(4) PCBYTE  pIn,
_Out_writes_(4) PBYTE  pOut 
)

Referenced by SymCryptAes4Sbox().

◆ SymCryptAes4SboxXmm()

VOID SYMCRYPT_CALL SymCryptAes4SboxXmm ( _In_reads_(4) PCBYTE  pIn,
_Out_writes_(4) PBYTE  pOut 
)

Referenced by SymCryptAes4Sbox().

◆ SymCryptAesCbcDecryptAsm()

VOID SYMCRYPT_CALL SymCryptAesCbcDecryptAsm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcDecrypt().

◆ SymCryptAesCbcDecryptNeon()

VOID SYMCRYPT_CALL SymCryptAesCbcDecryptNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcDecrypt().

◆ SymCryptAesCbcDecryptXmm()

VOID SYMCRYPT_CALL SymCryptAesCbcDecryptXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcDecrypt().

◆ SymCryptAesCbcEncryptAsm()

VOID SYMCRYPT_CALL SymCryptAesCbcEncryptAsm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcEncrypt().

◆ SymCryptAesCbcEncryptNeon()

VOID SYMCRYPT_CALL SymCryptAesCbcEncryptNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcEncrypt().

◆ SymCryptAesCbcEncryptXmm()

VOID SYMCRYPT_CALL SymCryptAesCbcEncryptXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcEncrypt().

◆ SymCryptAesCbcMacNeon()

VOID SYMCRYPT_CALL SymCryptAesCbcMacNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcMac().

◆ SymCryptAesCbcMacXmm()

VOID SYMCRYPT_CALL SymCryptAesCbcMacXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCryptAesCbcMac().

◆ SymCryptAesCreateDecryptionRoundKey()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKey ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey,
BOOL  UseSimd 
)

Definition at line 68 of file aes-default.c.

72{
73#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
74 if( UseSimd )
75 {
76 SymCryptAesCreateDecryptionRoundKeyXmm( pEncryptionRoundKey, pDecryptionRoundKey );
77 } else {
78 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey );
79 }
80#elif SYMCRYPT_CPU_ARM64
81 if( UseSimd )
82 {
83 SymCryptAesCreateDecryptionRoundKeyNeon( pEncryptionRoundKey, pDecryptionRoundKey );
84 } else {
85 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey );
86 }
87#else
88 UNREFERENCED_PARAMETER( UseSimd );
89 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey ); // never use XMM on SaveXmm arch, save/restore overhead is too large.
90#endif
91}
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
Definition: aes-c.c:81
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyNeon(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyXmm(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)

Referenced by SymCryptAesExpandKeyInternal().

◆ SymCryptAesCreateDecryptionRoundKeyC()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey 
)

Definition at line 81 of file aes-c.c.

90{
91 int i;
92 PBYTE p = pDecryptionRoundKey;
93 PCBYTE q = pEncryptionRoundKey;
94
95 for( i=0; i<4; i++ ) {
96 *(UINT32 *)p =
97 *(UINT32 *)SymCryptAesInvMatrixMult[0][q[0]] ^
98 *(UINT32 *)SymCryptAesInvMatrixMult[1][q[1]] ^
99 *(UINT32 *)SymCryptAesInvMatrixMult[2][q[2]] ^
100 *(UINT32 *)SymCryptAesInvMatrixMult[3][q[3]];
101 p += 4;
102 q += 4;
103 }
104
105}
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BYTE * PBYTE
Definition: pedump.c:66
const BYTE * PCBYTE

Referenced by SymCryptAesCreateDecryptionRoundKey().

◆ SymCryptAesCreateDecryptionRoundKeyNeon()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyNeon ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey 
)

◆ SymCryptAesCreateDecryptionRoundKeyXmm()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyXmm ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey 
)

◆ SymCryptAesCtrMsb32()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb32 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 359 of file aes-default.c.

365{
366#if SYMCRYPT_CPU_AMD64
368 {
370 } else {
371 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
373 }
374
375#elif SYMCRYPT_CPU_X86
376 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
377
379 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
380 {
382 SymCryptRestoreXmm( &SaveData );
383 } else {
384 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
386 }
387
388#elif SYMCRYPT_CPU_ARM64
389 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
390 {
392 } else {
394 }
395
396#else
397 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
399#endif
400}
const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
Definition: aes-default.c:20
VOID SYMCRYPT_CALL SymCryptCtrMsb32(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Neon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Xmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE
Definition: sc_lib.h:307
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
#define SYMCRYPT_AES_BLOCK_SIZE
Definition: symcrypt.h:4255
PBYTE pbChainingValue
PCBYTE pbSrc
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
PCBYTE PBYTE SIZE_T cbData
PCBYTE PBYTE pbDst
PCVOID pExpandedKey

Referenced by SymCryptAesGcmDecryptPartOnePass(), and SymCryptAesGcmEncryptPartOnePass().

◆ SymCryptAesCtrMsb32Neon()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Neon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCtrMsb32().

◆ SymCryptAesCtrMsb32Xmm()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Xmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCtrMsb32().

◆ SymCryptAesCtrMsb64Asm()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Asm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCtrMsb64().

◆ SymCryptAesCtrMsb64Neon()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Neon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCtrMsb64().

◆ SymCryptAesCtrMsb64Xmm()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Xmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesCtrMsb64().

◆ SymCryptAesDecryptAsm()

◆ SymCryptAesDecryptC()

Definition at line 242 of file aes-c.c.

246{
247 SYMCRYPT_ALIGN BYTE state[4][4] = { 0 };
248 SYMCRYPT_ALIGN UINT32 state2[4] = { 0 };
249
250 const BYTE (*keyPtr)[4][4];
251 const BYTE (*keyLimit)[4][4];
252
253#if NEED_ALIGN
255#endif
256
257#if NEED_ALIGN
258 //
259 // Callers who don't have their buffers aligned don't care about speed,
260 // so we do this in the simplest way.
261 //
262 if( !(IS_UINT32_ALIGNED( pbPlaintext ) & IS_UINT32_ALIGNED( pbCiphertext )) ) {
263 memcpy( alignBuffer, pbCiphertext, SYMCRYPT_AES_BLOCK_SIZE );
264 SymCryptAesDecrypt( pExpandedKey, alignBuffer, alignBuffer );
265 memcpy( pbPlaintext, alignBuffer, SYMCRYPT_AES_BLOCK_SIZE );
266 SymCryptWipeKnownSize( alignBuffer, sizeof( alignBuffer ) );
267 return;
268 }
269#endif
270
272
273 keyPtr = &pExpandedKey->lastEncRoundKey[0]; // First round key
274 keyLimit = &pExpandedKey->lastDecRoundKey[0]; // Last round key
275
276 // Initial round (AddRoundKey)
277 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ *(UINT32 *) &pbCiphertext[0];
278 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ *(UINT32 *) &pbCiphertext[4];
279 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ *(UINT32 *) &pbCiphertext[8];
280 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ *(UINT32 *) &pbCiphertext[12];
281
282 keyPtr += 1;
283
284 // Main rounds
285 while (keyPtr < keyLimit)
286 {
287
288 // SubBytes/ShiftRows/MixColumns for col. 0
289 state2[0] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[0][0] ]);
290 state2[1] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[0][1] ]);
291 state2[2] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[0][2] ]);
292 state2[3] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[0][3] ]);
293
294 // SubBytes/ShiftRows/MixColumns for col. 1
295 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[1][0] ]);
296 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[1][1] ]);
297 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[1][2] ]);
298 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[1][3] ]);
299
300 // SubBytes/ShiftRows/MixColumns for col. 2
301 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[2][0] ]);
302 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[2][1] ]);
303 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[2][2] ]);
304 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[2][3] ]);
305
306 // SubBytes/ShiftRows/MixColumns for col. 3
307 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[3][0] ]);
308 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[3][1] ]);
309 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[3][2] ]);
310 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[3][3] ]);
311
312 // AddRoundKey
313 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
314 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
315 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
316 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
317
318 keyPtr += 1;
319 }
320
321 // Final round
322
323 // SubBytes/ShiftRows for col. 0
324 state2[0] = (UINT32) SymCryptAesInvSbox[ state[0][0] ];
325 state2[1] = (UINT32) SymCryptAesInvSbox[ state[0][1] ] << 8;
326 state2[2] = (UINT32) SymCryptAesInvSbox[ state[0][2] ] << 16;
327 state2[3] = (UINT32) SymCryptAesInvSbox[ state[0][3] ] << 24;
328
329 // SubBytes/ShiftRows for col. 1
330 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[1][0] ];
331 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[1][1] ] << 8;
332 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[1][2] ] << 16;
333 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[1][3] ] << 24;
334
335 // SubBytes/ShiftRows for col. 2
336 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[2][0] ];
337 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[2][1] ] << 8;
338 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[2][2] ] << 16;
339 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[2][3] ] << 24;
340
341 // SubBytes/ShiftRows for col. 3
342 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[3][0] ];
343 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[3][1] ] << 8;
344 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[3][2] ] << 16;
345 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[3][3] ] << 24;
346
347 // AddRoundKey
348 *((UINT32 *) &pbPlaintext[0 ]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
349 *((UINT32 *) &pbPlaintext[4 ]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
350 *((UINT32 *) &pbPlaintext[8 ]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
351 *((UINT32 *) &pbPlaintext[12]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
352
353 SymCryptWipeKnownSize( state, sizeof( state ) );
354 SymCryptWipeKnownSize( state2, sizeof( state2 ) );
355
356 return;
357}
#define IS_UINT32_ALIGNED(__p)
static int state
Definition: maze.c:121
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
VOID SYMCRYPT_CALL SymCryptAesDecrypt(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
Definition: aes-default.c:134
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_ALIGN
#define SYMCRYPT_CHECK_MAGIC(p)
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptAesDecrypt(), and SymCryptAesEcbDecryptC().

◆ SymCryptAesDecryptNeon()

◆ SymCryptAesDecryptXmm()

◆ SymCryptAesEcbDecryptC()

VOID SYMCRYPT_CALL SymCryptAesEcbDecryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 378 of file aes-c.c.

383{
385 {
390 }
391}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesDecryptC(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbCiphertext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbPlaintext)
Definition: aes-c.c:242

◆ SymCryptAesEcbEncryptAsm()

VOID SYMCRYPT_CALL SymCryptAesEcbEncryptAsm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesEcbEncrypt().

◆ SymCryptAesEcbEncryptC()

VOID SYMCRYPT_CALL SymCryptAesEcbEncryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 361 of file aes-c.c.

366{
368 {
373 }
374}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesEncryptC(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbPlaintext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbCiphertext)
Definition: aes-c.c:115

Referenced by SymCryptAesEcbEncrypt().

◆ SymCryptAesEcbEncryptNeon()

VOID SYMCRYPT_CALL SymCryptAesEcbEncryptNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesEcbEncrypt().

◆ SymCryptAesEcbEncryptXmm()

VOID SYMCRYPT_CALL SymCryptAesEcbEncryptXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Referenced by SymCryptAesEcbEncrypt().

◆ SymCryptAesEncryptAsm()

◆ SymCryptAesEncryptC()

Definition at line 115 of file aes-c.c.

119{
120 SYMCRYPT_ALIGN BYTE state[4][4] = { 0 };
121 SYMCRYPT_ALIGN UINT32 state2[4] = { 0 };
122
123 const BYTE (*keyPtr)[4][4];
124 const BYTE (*keyLimit)[4][4];
125
126#if NEED_ALIGN
128#endif
129
130#if NEED_ALIGN
131
132 //
133 // Callers who don't have their buffers aligned don't care about speed,
134 // so we do this in the simplest way.
135 //
136 if( !(IS_UINT32_ALIGNED( pbPlaintext ) & IS_UINT32_ALIGNED( pbCiphertext )) ) {
137 memcpy( alignBuffer, pbPlaintext, SYMCRYPT_AES_BLOCK_SIZE );
138 SymCryptAesEncrypt( pExpandedKey, alignBuffer, alignBuffer );
139 memcpy( pbCiphertext, alignBuffer, SYMCRYPT_AES_BLOCK_SIZE );
140 SymCryptWipeKnownSize( alignBuffer, sizeof( alignBuffer ) );
141 return;
142 }
143#endif
144
146
147 //
148 // From this point on all our data is UINT32 aligned or better on those
149 // platforms that have alignment restrictions.
150 //
151
152 keyPtr = &pExpandedKey->RoundKey[0]; // First round key
153 keyLimit = &pExpandedKey->lastEncRoundKey[0]; // Last round key
154
155 // Initial round (AddRoundKey)
156 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ *(UINT32 *) &pbPlaintext[0];
157 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ *(UINT32 *) &pbPlaintext[4];
158 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ *(UINT32 *) &pbPlaintext[8];
159 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ *(UINT32 *) &pbPlaintext[12];
160
161 keyPtr += 1;
162
163 // Main rounds
164 while (keyPtr < keyLimit)
165 {
166
167 // SubBytes/ShiftRows/MixColumns for col. 0
168 state2[0] = *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[0][0] ]);
169 state2[3] = *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[0][1] ]);
170 state2[2] = *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[0][2] ]);
171 state2[1] = *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[0][3] ]);
172
173 // SubBytes/ShiftRows/MixColumns for col. 1
174 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[1][0] ]);
175 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[1][1] ]);
176 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[1][2] ]);
177 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[1][3] ]);
178
179 // SubBytes/ShiftRows/MixColumns for col. 2
180 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[2][0] ]);
181 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[2][1] ]);
182 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[2][2] ]);
183 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[2][3] ]);
184
185 // SubBytes/ShiftRows/MixColumns for col. 3
186 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[3][0] ]);
187 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[3][1] ]);
188 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[3][2] ]);
189 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[3][3] ]);
190
191 // AddRoundKey
192 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
193 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
194 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
195 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
196
197 keyPtr += 1;
198 }
199
200 // Final round
201
202 // SubBytes/ShiftRows for col. 0
203 state2[0] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][0] ][1];
204 state2[3] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][1] ][1] << 8;
205 state2[2] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][2] ][1] << 16;
206 state2[1] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][3] ][1] << 24;
207
208 // SubBytes/ShiftRows for col. 1
209 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][0] ][1];
210 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][1] ][1] << 8;
211 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][2] ][1] << 16;
212 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][3] ][1] << 24;
213
214 // SubBytes/ShiftRows for col. 2
215 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][0] ][1];
216 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][1] ][1] << 8;
217 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][2] ][1] << 16;
218 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][3] ][1] << 24;
219
220 // SubBytes/ShiftRows for col. 3
221 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][0] ][1];
222 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][1] ][1] << 8;
223 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][2] ][1] << 16;
224 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][3] ][1] << 24;
225
226 // AddRoundKey
227 *((UINT32 *) &pbCiphertext[0 ]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
228 *((UINT32 *) &pbCiphertext[4 ]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
229 *((UINT32 *) &pbCiphertext[8 ]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
230 *((UINT32 *) &pbCiphertext[12]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
231
232 SymCryptWipeKnownSize( state, sizeof( state ) );
233 SymCryptWipeKnownSize( state2, sizeof( state2 ) );
234
235 return;
236}
VOID SYMCRYPT_CALL SymCryptAesEncrypt(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
Definition: aes-default.c:95

Referenced by SymCryptAesEcbEncryptC(), and SymCryptAesEncrypt().

◆ SymCryptAesEncryptNeon()

◆ SymCryptAesEncryptXmm()

◆ SymCryptAesGcmDecryptPart()

VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPart ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 835 of file aes-default.c.

840{
841#if SYMCRYPT_CPU_AMD64
843 {
845 } else {
847 }
848
849#elif SYMCRYPT_CPU_X86
850 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
851
853 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
854 {
856 SymCryptRestoreXmm( &SaveData );
857 } else {
859 }
860
861#elif SYMCRYPT_CPU_ARM64
862 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES | SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
863 {
865 } else {
867 }
868
869#else
871#endif
872}
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPartOnePass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-default.c:623
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_PCLMULQDQ_CODE
Definition: sc_lib.h:308
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptGcmDecryptPartTwoPass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: gcm.c:543
PSYMCRYPT_COMMON_HASH_STATE pState

◆ SymCryptAesGcmDecryptStitchedNeon()

◆ SymCryptAesGcmDecryptStitchedXmm()

◆ SymCryptAesGcmDecryptStitchedYmm_2048()

VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedYmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptAesGcmEncryptPart()

VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPart ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 794 of file aes-default.c.

799{
800#if SYMCRYPT_CPU_AMD64
802 {
804 } else {
806 }
807
808#elif SYMCRYPT_CPU_X86
809 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
810
812 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
813 {
815 SymCryptRestoreXmm( &SaveData );
816 } else {
818 }
819
820#elif SYMCRYPT_CPU_ARM64
821 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES | SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
822 {
824 } else {
826 }
827
828#else
830#endif
831}
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPartOnePass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-default.c:450
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptGcmEncryptPartTwoPass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: gcm.c:481

◆ SymCryptAesGcmEncryptStitchedNeon()

◆ SymCryptAesGcmEncryptStitchedXmm()

◆ SymCryptAesGcmEncryptStitchedYmm_2048()

VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedYmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptCheckLibraryInitialized()

FORCEINLINE VOID SYMCRYPT_CALL SymCryptCheckLibraryInitialized ( void  )

Definition at line 296 of file sc_lib.h.

297{
298}

◆ SymCryptCompositeGetSizeOfEncodedEcPk()

UINT32 SYMCRYPT_CALL SymCryptCompositeGetSizeOfEncodedEcPk ( SYMCRYPT_CACHED_ECURVE_ID  curveId)

◆ SymCryptCompositeGetSizeOfEncodedEcSk()

UINT32 SYMCRYPT_CALL SymCryptCompositeGetSizeOfEncodedEcSk ( SYMCRYPT_CACHED_ECURVE_ID  curveId)

◆ SymCryptCompositeMlKemGetRandomScalarForEcKeyEx()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCompositeMlKemGetRandomScalarForEcKeyEx ( SYMCRYPT_CACHED_ECURVE_ID  ecurveId,
SYMCRYPT_NUMBER_FORMAT  numFormat,
_In_reads_bytes_(cbSeed) PCBYTE  pbSeed,
SIZE_T  cbSeed,
_Out_writes_bytes_(cbScalar) PBYTE  pbScalar,
SIZE_T  cbScalar 
)

◆ SymCryptCountLeadingZeros32()

FORCEINLINE UINT32 SymCryptCountLeadingZeros32 ( UINT32  value)

Definition at line 5079 of file sc_lib.h.

5080{
5081 unsigned long zeros = 0;
5082
5083 if(value == 0)
5084 {
5085 return 32;
5086 }
5087
5088#if SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM)
5089 _BitScanReverse(&zeros, value);
5090 zeros = 31 - zeros;
5091#elif SYMCRYPT_GNUC
5092 zeros = __builtin_clz(value);
5093#else
5094 while( (value & 0x80000000) == 0 )
5095 {
5096 zeros++;
5097 value <<= 1;
5098 }
5099#endif
5100
5101 return (UINT32)zeros;
5102}
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:180
Definition: pdh_main.c:64

Referenced by SymCryptHbsGetWinternitzLengths(), and SymCryptHbsIncrementalTreehashStackDepth().

◆ SymCryptCountLeadingZeros64()

FORCEINLINE UINT32 SymCryptCountLeadingZeros64 ( UINT64  value)

Definition at line 5106 of file sc_lib.h.

5107{
5108 unsigned long zeros = 0;
5109
5110 if(value == 0)
5111 {
5112 return 64;
5113 }
5114
5115#if SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64)
5116 _BitScanReverse64(&zeros, value);
5117 zeros = 63 - zeros;
5118#elif SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM)
5119 if( (value >> 32) == 0 )
5120 {
5121 _BitScanReverse(&zeros, (UINT32)value);
5122 zeros = 63 - zeros;
5123 } else {
5124 _BitScanReverse(&zeros, (UINT32)(value >> 32));
5125 zeros = 31 - zeros;
5126 }
5127#elif SYMCRYPT_GNUC
5128 zeros = __builtin_clzll(value);
5129#else
5130 while( (value & 0x8000000000000000) == 0 )
5131 {
5132 zeros++;
5133 value <<= 1;
5134 }
5135#endif
5136
5137 return (UINT32)zeros;
5138}
__INTRIN_INLINE unsigned char _BitScanReverse64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:124

◆ SymCryptCountTrailingZeros32()

FORCEINLINE UINT32 SymCryptCountTrailingZeros32 ( UINT32  value)

Definition at line 5020 of file sc_lib.h.

5021{
5022 unsigned long index = 0;
5023 if( value == 0 )
5024 {
5025 return 32;
5026 }
5027
5028#if SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM)
5030#elif SYMCRYPT_GNUC
5031 index = __builtin_ctz(value);
5032#else
5033 while( (value & 1) == 0 )
5034 {
5035 index++;
5036 value >>= 1;
5037 }
5038#endif
5039
5040 return (UINT32)index;
5041}
#define index(s, c)
Definition: various.h:29
GLuint index
Definition: glext.h:6031
unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:57

Referenced by SymCryptFdefModInvGeneric().

◆ SymCryptCountTrailingZeros64()

FORCEINLINE UINT32 SymCryptCountTrailingZeros64 ( UINT64  value)

Definition at line 5045 of file sc_lib.h.

5046{
5047 unsigned long index = 0;
5048 if( value == 0 )
5049 {
5050 return 64;
5051 }
5052
5053#if SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64)
5055#elif SYMCRYPT_PLATFORM_WINDOWS && (SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM)
5056 if( ((UINT32)value) == 0 )
5057 {
5059 index += 32;
5060 } else {
5062 }
5063
5064#elif SYMCRYPT_GNUC
5065 index = __builtin_ctzll(value);
5066#else
5067 while( (value & 1) == 0 )
5068 {
5069 index++;
5070 value >>= 1;
5071 }
5072#endif
5073
5074 return (UINT32)index;
5075}
__INTRIN_INLINE unsigned char _BitScanForward64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:113

Referenced by SymCryptRsakeyCalculatePrimesFromPrivateExponent().

◆ SymCryptCpuidExFunc()

VOID SYMCRYPT_CALL SymCryptCpuidExFunc ( int  cpuInfo[4],
int  function_id,
int  subfunction_id 
)

◆ SymCryptCShakeEncodeInputStrings()

VOID SYMCRYPT_CALL SymCryptCShakeEncodeInputStrings ( _Inout_ PSYMCRYPT_KECCAK_STATE  pState,
_In_reads_(cbFunctionNameString) PCBYTE  pbFunctionNameString,
SIZE_T  cbFunctionNameString,
_In_reads_(cbCustomizationString) PCBYTE  pbCustomizationString,
SIZE_T  cbCustomizationString 
)

Definition at line 221 of file shake.c.

227{
228 SYMCRYPT_ASSERT((cbFunctionNameString > 0) || (cbCustomizationString > 0));
229
230 // left_encode( inputBlockSize ) for byte_pad function
231 //
232 // SymCryptKeccakEncodeTimes8 function encodes 8 times the value passed to
233 // it. Here, we want the actual value of pState->inputBlockSize to be encoded,
234 // hence the division by 8.
235 SymCryptKeccakAppendEncodeTimes8(pState, pState->inputBlockSize / 8, TRUE);
236
237 SymCryptKeccakAppendEncodedString(pState, pbFunctionNameString, cbFunctionNameString);
238 SymCryptKeccakAppendEncodedString(pState, pbCustomizationString, cbCustomizationString);
239
240 // Appending of Customization String may have already called the permutation
241 // if the appended data is aligned to input block size, in which case the zero
242 // padding has been done.
243 if (pState->stateIndex != 0)
244 {
246 }
247}
#define TRUE
Definition: types.h:120
VOID SYMCRYPT_CALL SymCryptKeccakZeroAppendBlock(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
Definition: sha3.c:273
VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodeTimes8(_Inout_ SYMCRYPT_KECCAK_STATE *pState, UINT64 uValue, BOOLEAN bLeftEncode)
Definition: shake.c:310
VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodedString(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbString) PCBYTE pbString, SIZE_T cbString)
Definition: shake.c:330

Referenced by SYMCRYPT_XxxInit().

◆ SymCryptCtrMsb32()

VOID SYMCRYPT_CALL SymCryptCtrMsb32 ( _In_ PCSYMCRYPT_BLOCKCIPHER  pBlockCipher,
_In_ PCVOID  pExpandedKey,
_Inout_updates_(pBlockCipher->blockSize) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 249 of file blockciphermodes.c.

257{
259 PBYTE count = &buf[0];
261 SIZE_T blockSize;
262 PCBYTE pbSrcEnd;
263
264 blockSize = pBlockCipher->blockSize;
266
267 //
268 // Compute the end of the data, rounding the size down to a multiple of the block size.
269 //
270 pbSrcEnd = &pbSrc[ cbData & ~(blockSize - 1) ];
271
272 //
273 // We keep the chaining state in a local buffer to enforce the read-once write-once rule.
274 // It also improves memory locality.
275 //
276 #pragma warning(suppress: 22105)
277 memcpy( count, pbChainingValue, blockSize );
278 while( pbSrc < pbSrcEnd )
279 {
280 SYMCRYPT_ASSERT( pbSrc <= pbSrcEnd - blockSize ); // help PreFast
282 SymCryptXorBytes( keystream, pbSrc, pbDst, blockSize );
283
284 //
285 // We only need to increment the last 32 bits of the counter value.
286 //
287 SYMCRYPT_STORE_MSBFIRST32( &count[ blockSize-4 ], 1 + SYMCRYPT_LOAD_MSBFIRST32( &count[ blockSize-4 ] ) );
288
289 pbSrc += blockSize;
290 pbDst += blockSize;
291 }
292
293 memcpy( pbChainingValue, count, blockSize );
294
295 SymCryptWipeKnownSize( buf, sizeof( buf ));
296}
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
PSYMCRYPT_BLOCKCIPHER_CRYPT encryptFunc
#define SYMCRYPT_LOAD_MSBFIRST32(p)
Definition: symcrypt.h:303
VOID SYMCRYPT_CALL SymCryptXorBytes(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, _Out_writes_(cbBytes) PBYTE pbResult, SIZE_T cbBytes)
Definition: libmain.c:236
#define SYMCRYPT_STORE_MSBFIRST32(p, v)
Definition: symcrypt.h:311
#define SYMCRYPT_MAX_BLOCK_SIZE
PCSYMCRYPT_BLOCKCIPHER pBlockCipher
BYTE keystream[64]

Referenced by SymCryptAesCtrMsb32(), SymCryptGcmComputeTag(), SymCryptGcmDecrypt(), SymCryptGcmEncrypt(), and SymCryptGcmEncryptDecryptPart().

◆ SymCryptDetectCpuFeaturesByCpuid()

VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesByCpuid ( UINT32  flags)

◆ SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent()

VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent ( void  )

◆ SymCryptDetectCpuFeaturesFromRegisters()

VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromRegisters ( void  )

◆ SymCryptDetectCpuFeaturesFromRegistersNoTry()

VOID SYMCRYPT_CALL SymCryptDetectCpuFeaturesFromRegistersNoTry ( void  )

◆ SymCryptDsaPct()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDsaPct ( PCSYMCRYPT_DLKEY  pkDlkey)

Referenced by SymCryptDlkeyGenerate().

◆ SymCryptEcDsaPct()

◆ SymCryptEckeyGetValueCompositeEncodingPk()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeyGetValueCompositeEncodingPk ( _In_ PCSYMCRYPT_ECKEY  pEckey,
SYMCRYPT_CACHED_ECURVE_ID  curveId,
_Out_writes_bytes_(cbDst) PBYTE  pbDst,
SIZE_T  cbDst 
)

◆ SymCryptEckeyGetValueCompositeEncodingSk()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeyGetValueCompositeEncodingSk ( _In_ PCSYMCRYPT_ECKEY  pEckey,
SYMCRYPT_CACHED_ECURVE_ID  curveId,
_Out_writes_bytes_(cbDst) PBYTE  pbDst,
SIZE_T  cbDst 
)

◆ SymCryptEckeySetValueCompositeEncodingPk()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeySetValueCompositeEncodingPk ( _In_ SYMCRYPT_CACHED_ECURVE_ID  curveId,
_In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
UINT32  flags,
_Inout_ PSYMCRYPT_ECKEY  pEckey 
)

◆ SymCryptEckeySetValueCompositeEncodingSk()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEckeySetValueCompositeEncodingSk ( SYMCRYPT_CACHED_ECURVE_ID  curveId,
_In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
UINT32  flags,
_Inout_ PSYMCRYPT_ECKEY  pEckey 
)

◆ SymCryptEckeyWipePrivateState()

VOID SYMCRYPT_CALL SymCryptEckeyWipePrivateState ( _Inout_ PSYMCRYPT_ECKEY  pkEckey)

Definition at line 106 of file eckey.c.

108{
109 SymCryptIntSetValueUint32( 0, pkEckey->piPrivateKey );
110 pkEckey->hasPrivateKey = FALSE;
111}
#define FALSE
Definition: types.h:117
VOID SYMCRYPT_CALL SymCryptIntSetValueUint32(UINT32 u32Src, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:230

◆ SymCryptEcpointGenericSetRandom()

VOID SYMCRYPT_CALL SymCryptEcpointGenericSetRandom ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_INT  piScalar,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 546 of file ec_mul.c.

553{
554 PSYMCRYPT_MODELEMENT peScalar = NULL;
557 SYMCRYPT_ASSERT( cbScratch >= pCurve->cbModElement );
558
559 peScalar = SymCryptModElementCreate( pbScratch, pCurve->cbModElement, pCurve->GOrd );
560 SYMCRYPT_ASSERT( peScalar != NULL );
561
562 // Setting a random mod element in the [1, SubgroupOrder-1] set
564
565 // Setting the integer
566 SymCryptModElementToInt( pCurve->GOrd, peScalar, piScalar, pbScratch + pCurve->cbModElement, cbScratch - pCurve->cbModElement );
567
568 // Do the multiplication (pass over the entire scratch space as it is not needed anymore)
569 // !! Explicitly not checking the error return here as the only error is from specifying invalid flags !!
570 SymCryptEcpointScalarMul( pCurve, piScalar, NULL, 0, poDst, pbScratch, cbScratch );
571}
#define NULL
Definition: types.h:112
UINT32 UINT32 UINT32 UINT32 cbScratch
BOOLEAN SYMCRYPT_CALL SymCryptEcurveIsSame(_In_ PCSYMCRYPT_ECURVE pCurve1, _In_ PCSYMCRYPT_ECURVE pCurve2)
Definition: ecurve.c:745
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
PCSYMCRYPT_ECURVE pCurve
#define SYMCRYPT_INTERNAL_SCRATCH_BYTES_FOR_SCALAR_ECURVE_OPERATIONS(_pCurve, _nPoints)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointScalarMul(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_INT piScalar, _In_opt_ PCSYMCRYPT_ECPOINT poSrc, UINT32 flags, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:262
VOID SYMCRYPT_CALL SymCryptModSetRandom(_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:993
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:665
VOID SYMCRYPT_CALL SymCryptModElementToInt(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:762
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_MINUSONE

◆ SymCryptEcpointMultiScalarMulWnafWithInterleaving()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointMultiScalarMulWnafWithInterleaving ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_reads_(nPoints) PCSYMCRYPT_INT *  piSrcScalarArray,
_In_reads_(nPoints) PCSYMCRYPT_ECPOINT *  poSrcEcpointArray,
UINT32  nPoints,
UINT32  flags,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptEcpointScalarMulFixedWindow()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointScalarMulFixedWindow ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_INT  piScalar,
_In_opt_ PCSYMCRYPT_ECPOINT  poSrc,
UINT32  flags,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 90 of file ec_mul.c.

100{
101 SYMCRYPT_ERROR scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
102
104
105 UINT32 i, j;
106
107 UINT32 w = pCurve->info.sw.window;
108 UINT32 nPrecompPoints = pCurve->info.sw.nPrecompPoints;
109 // dcl - assuming that nRecodedDigits has some reasonably small range - please document
110 // so that we can know usage of this variable will not cause problems
111 // Also, documentation of inputs, notes, etc at the function definition would be quite helpful
112 UINT32 nRecodedDigits = ((pCurve->GOrdBitsize + w - 2) / (w-1)) + 1;
113
114 // Masks
115 UINT32 fZero = 0;
116 UINT32 fEven = 0;
117 UINT32 indexMask = 0;
118
119 BOOLEAN bPrecompOffline = FALSE;
120
121 // ====================================================
122 // Temporaries
126 PSYMCRYPT_ECPOINT poTmp = NULL;
127 PSYMCRYPT_INT piRem = NULL;
128 PSYMCRYPT_INT piTmp = NULL;
129 PUINT32 absofKIs = NULL;
130 PUINT32 sigofKIs = NULL;
131 // ===================================================
132
136
138 SIZE_T cbScalar = SymCryptSizeofIntFromDigits( pCurve->GOrdDigits );
139
140 // Make sure we only specify the correct flags
142 {
143 scError = SYMCRYPT_INVALID_ARGUMENT;
144 goto exit;
145 }
146
147 // Check if poSrc is NULL and if yes set it to G
148 if (poSrc == NULL)
149 {
150 poSrc = pCurve->G;
151 bPrecompOffline = TRUE;
152 }
153
156 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
158
160 pCurve->cbModElement +
161 (nPrecompPoints+2)*cbEcpoint +
162 2*cbScalar +
165
166 // Creating temporary modelement
167 peT = SymCryptModElementCreate( pbScratch, pCurve->cbModElement, FMod );
168 SYMCRYPT_ASSERT( peT != NULL );
169 pbScratch += pCurve->cbModElement;
170
171 // Creating temporary precomputed points (if needed)
173 for (i=0; i<nPrecompPoints; i++)
174 {
175 if (bPrecompOffline)
176 {
177 poPIs[i] = pCurve->info.sw.poPrecompPoints[i];
178 }
179 else
180 {
181 poPIs[i] = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
182 SYMCRYPT_ASSERT( poPIs[i] != NULL );
183 pbScratch += cbEcpoint;
184 }
185 }
186
187 // Creating temporary points
188 poQ = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
189 SYMCRYPT_ASSERT( poQ != NULL );
190 pbScratch += cbEcpoint;
191
192 poTmp = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
193 SYMCRYPT_ASSERT( poTmp != NULL );
194 pbScratch += cbEcpoint;
195
196 // Creating temporary scalar for the remainder
197 piRem = SymCryptIntCreate( pbScratch, cbScalar, pCurve->GOrdDigits );
198 SYMCRYPT_ASSERT( piRem != NULL);
199 pbScratch += cbScalar;
200
201 piTmp = SymCryptIntCreate( pbScratch, cbScalar, pCurve->GOrdDigits );
202 SYMCRYPT_ASSERT( piTmp != NULL);
203 pbScratch += cbScalar;
204
205 // Fixing pointers to recoded digits (be careful that the remaining space is SYMCRYPT_ASYM_ALIGNed)
206 absofKIs = (PUINT32) pbScratch;
207 pbScratch += nRecodedDigits * sizeof(UINT32);
208 sigofKIs = (PUINT32) pbScratch;
209 pbScratch += nRecodedDigits * sizeof(UINT32);
210 pbScratch = (PBYTE) ( ((SIZE_T)pbScratch + SYMCRYPT_ASYM_ALIGN_VALUE - 1) & ~(SYMCRYPT_ASYM_ALIGN_VALUE - 1) );
211
212 // Fixing remaining scratch space size
213 cbScratch -= ( pCurve->cbModElement + (nPrecompPoints+2)*cbEcpoint + 2*cbScalar );
215
216 //
217 // Main algorithm
218 //
219
220 // It is the caller's responsibility to ensure that the provided piScalar <= GOrd, double check this in debug mode
222
223 // Store k into an int
224 SymCryptIntCopy( piScalar, piRem );
225
226 // Check if k is 0
227 fZero = SymCryptIntIsEqualUint32( piRem, 0 );
228
229 // Or if the src point is zero
230 fZero |= SymCryptEcpointIsZero( pCurve, poSrc, pbScratch, cbScratch );
231
232 // Check if k is even and convert it to r-k if true
233 fEven = SYMCRYPT_MASK32_ZERO(SymCryptIntGetBit( piRem, 0 ));
235 SymCryptIntMaskedCopy( piTmp, piRem, fEven );
236
237 // Recoding stage
238 SymCryptFixedWindowRecoding( w, piRem, piTmp, absofKIs, sigofKIs, nRecodedDigits );
239
240 // Precomputation stage
241 if (!bPrecompOffline)
242 {
243 // Copy the first point in the start of the poPIs array
244 SymCryptEcpointCopy( pCurve, poSrc, poPIs[0] );
245
246 SymCryptPrecomputation( pCurve, nPrecompPoints, poPIs, poQ, pbScratch, cbScratch );
247 }
248
249
250 // Get the pointers to Q
254
255 // Q = P[ (|k_t|-1)/2 ] in memory access side-channel safe way
256 // That is, we touch all the precomputed points. The access pattern of KIs is fixed.
257 for (j=0; j<nPrecompPoints; j++)
258 {
259 indexMask = DELTA_MASK( j, absofKIs[nRecodedDigits-1] );
260 SymCryptEcpointMaskedCopy( pCurve, poPIs[j], poQ, indexMask);
261 }
262
263 for (i=nRecodedDigits - 2; i>0; i--)
264 {
265 // Q = 2^(w-1) * Q
266 for (j=0; j<w-1; j++)
267 {
268 SymCryptEcpointDouble( pCurve, poQ, poQ, 0, pbScratch, cbScratch );
269 }
270
271 // Copy the required precomputed point into poTmp (touch all points)
272 for (j=0; j<nPrecompPoints; j++)
273 {
274 indexMask = DELTA_MASK( j, absofKIs[i] );
275 SymCryptEcpointMaskedCopy( pCurve, poPIs[j], poTmp, indexMask);
276 }
277
278 // Negate if needed
279 SymCryptEcpointNegate( pCurve, poTmp, sigofKIs[i], pbScratch, cbScratch );
280
281 // Do the addition Q + s_i P[k_i]
282 SymCryptEcpointAddDiffNonZero( pCurve, poQ, poTmp, poQ, pbScratch, cbScratch );
283 }
284
285 // Q = 2^(w-1) * Q
286 for (j=0; j<w-1; j++)
287 {
288 SymCryptEcpointDouble( pCurve, poQ, poQ, 0, pbScratch, cbScratch );
289 }
290
291 // Copy the point s_0 P[k_0] into poTmp
292 for (j=0; j<nPrecompPoints; j++)
293 {
294 indexMask = DELTA_MASK( j, absofKIs[0] );
295 SymCryptEcpointMaskedCopy( pCurve, poPIs[j], poTmp, indexMask);
296 }
297
298 // Negate if needed
299 SymCryptEcpointNegate( pCurve, poTmp, sigofKIs[0], pbScratch, cbScratch );
300
301 // Complete addition routine
302 SymCryptEcpointAdd( pCurve, poQ, poTmp, poQ, 0, pbScratch, cbScratch );
303
304 // If even invert
305 SymCryptEcpointNegate( pCurve, poQ, fEven, pbScratch, cbScratch );
306
307 // Multiply by the cofactor (if needed) by continuing the doubling
308 if ((pCurve->coFactorPower!=0) && ((flags & SYMCRYPT_FLAG_ECC_LL_COFACTOR_MUL) != 0))
309 {
310 for (j=0; j<pCurve->coFactorPower; j++)
311 {
312 SymCryptEcpointDouble( pCurve, poQ, poQ, 0, pbScratch, cbScratch );
313 }
314 }
315
316 // If the resultant point is zero, ensure it will be set to the canonical zero point
317 fZero |= SymCryptEcpointIsZero( pCurve, poQ, pbScratch, cbScratch );
318
319 // Set the zero point
320 SymCryptEcpointSetZero( pCurve, poTmp, pbScratch, cbScratch );
321 SymCryptEcpointMaskedCopy( pCurve, poTmp, poQ, fZero );
322
323 // Output the result (normalized flag == FALSE)
324 SymCryptEcpointCopy( pCurve, poQ, poDst );
325
326 scError = SYMCRYPT_NO_ERROR;
327
328exit:
329
330 return scError;
331}
unsigned char BOOLEAN
Definition: actypes.h:127
unsigned int * PUINT32
Definition: basetsd.h:119
VOID SYMCRYPT_CALL SymCryptPrecomputation(_In_ PCSYMCRYPT_ECURVE pCurve, UINT32 nPoints, _In_reads_(SYMCRYPT_ECURVE_SW_MAX_NPRECOMP_POINTS) PSYMCRYPT_ECPOINT *poPIs, _Out_ PSYMCRYPT_ECPOINT poQ, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_mul.c:32
#define DELTA_MASK(_index, _target)
Definition: ec_mul.c:82
GLbitfield flags
Definition: glext.h:7161
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
VOID SYMCRYPT_CALL SymCryptFixedWindowRecoding(UINT32 W, _Inout_ PSYMCRYPT_INT piK, _Inout_ PSYMCRYPT_INT piTmp, _Out_writes_(nRecodedDigits) PUINT32 absofKIs, _Out_writes_(nRecodedDigits) PUINT32 sigofKIs, UINT32 nRecodedDigits)
Definition: recoding.c:44
#define exit(n)
Definition: config.h:202
SYMCRYPT_ERROR
Definition: symcrypt.h:227
#define SYMCRYPT_INTERNAL_ECPOINT_COORDINATE(_ord, _pCurve, _pEcpoint)
#define SYMCRYPT_CURVE_IS_SHORT_WEIERSTRASS_TYPE(_pCurve)
#define SYMCRYPT_CURVE_IS_TWISTED_EDWARDS_TYPE(_pCurve)
PSYMCRYPT_MODULUS FMod
#define SYMCRYPT_ASYM_ALIGN_VALUE
SYMCRYPT_ECPOINT * PSYMCRYPT_ECPOINT
const SYMCRYPT_MODULUS * PCSYMCRYPT_MODULUS
#define SYMCRYPT_MASK32_ZERO(_v)
SYMCRYPT_INT * PSYMCRYPT_INT
#define SYMCRYPT_ECURVE_SW_MAX_NPRECOMP_POINTS
VOID SYMCRYPT_CALL SymCryptEcpointAdd(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:202
VOID SYMCRYPT_CALL SymCryptEcpointAddDiffNonZero(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:218
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
Definition: a_dispatch.c:442
VOID SYMCRYPT_CALL SymCryptIntCopy(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:161
VOID SymCryptEcpointMaskedCopy(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 mask)
Definition: ecpoint.c:190
UINT32 SYMCRYPT_CALL SymCryptEcpointIsZero(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:176
VOID SYMCRYPT_CALL SymCryptIntMaskedCopy(_In_ PCSYMCRYPT_INT piSrc, _Inout_ PSYMCRYPT_INT piDst, UINT32 mask)
Definition: a_dispatch.c:170
UINT32 SYMCRYPT_CALL SymCryptIntGetBit(_In_ PCSYMCRYPT_INT piSrc, UINT32 iBit)
Definition: a_dispatch.c:394
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecpoint.c:142
VOID SymCryptEcpointCopy(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst)
Definition: ecpoint.c:173
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointFromCurve(PCSYMCRYPT_ECURVE pCurve)
Definition: ecpoint.c:41
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:720
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_ECURVE_OPERATIONS(_pCurve)
VOID SYMCRYPT_CALL SymCryptEcpointSetZero(_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:121
#define SYMCRYPT_FLAG_ECC_LL_COFACTOR_MUL
VOID SYMCRYPT_CALL SymCryptEcpointNegate(_In_ PCSYMCRYPT_ECURVE pCurve, _Inout_ PSYMCRYPT_ECPOINT poSrc, UINT32 mask, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:248
UINT32 SYMCRYPT_CALL SymCryptIntIsEqualUint32(_In_ PCSYMCRYPT_INT piSrc1, _In_ UINT32 u32Src2)
Definition: a_dispatch.c:424
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
Definition: a_dispatch.c:134
UINT32 SYMCRYPT_CALL SymCryptIntSubSameSize(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:324
VOID SYMCRYPT_CALL SymCryptEcpointDouble(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ec_dispatch.c:233
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: a_dispatch.c:141

◆ SymCryptEcurveFillScratchSpaces()

VOID SYMCRYPT_CALL SymCryptEcurveFillScratchSpaces ( _Inout_ PSYMCRYPT_ECURVE  pCurve)

Definition at line 296 of file ec_dispatch.c.

298{
299 SYMCRYPT_ECURVE_CALL( pCurve ) fillScratchSpacesFunc( pCurve );
300}
#define SYMCRYPT_ECURVE_CALL(v)
Definition: ec_dispatch.c:112

Referenced by SymCryptEcurveInitialize().

◆ SymCryptFatalHang()

_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatalHang ( UINT32  fatalcode)

Definition at line 101 of file libmain.c.

106{
107 UINT32 fcode;
108
109 //
110 // Put the fatal code in a location we can find
111 //
112 SYMCRYPT_FORCE_WRITE32( &fcode, fatalCode );
113
114fatalInfiniteLoop:
115 goto fatalInfiniteLoop;
116}
#define SYMCRYPT_FORCE_WRITE32(_p, _v)
Definition: symcrypt.h:423

Referenced by SymCryptFatalEnvWindowsUsermodeWin8_1nLater().

◆ SymCryptFatalIntercept()

VOID SYMCRYPT_CALL SymCryptFatalIntercept ( UINT32  fatalCode)

Definition at line 20 of file FatalIntercept.c.

21{
22 UNREFERENCED_PARAMETER( fatalCode );
23}

Referenced by SymCryptFatalEnvWindowsUsermodeWin8_1nLater().

◆ SymCryptFdef369MaskedCopyAsm()

VOID SYMCRYPT_CALL SymCryptFdef369MaskedCopyAsm ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE  pbSrc,
_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE  pbDst,
UINT32  nDigits,
UINT32  mask 
)

◆ SymCryptFdef369ModAddGeneric()

VOID SYMCRYPT_CALL SymCryptFdef369ModAddGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModInvMontgomery()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdef369ModInvMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModMulMontgomery()

VOID SYMCRYPT_CALL SymCryptFdef369ModMulMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModPreGetMontgomery()

PCUINT32 SYMCRYPT_CALL SymCryptFdef369ModPreGetMontgomery ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModSetPostMontgomery()

VOID SYMCRYPT_CALL SymCryptFdef369ModSetPostMontgomery ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModSquareMontgomery()

VOID SYMCRYPT_CALL SymCryptFdef369ModSquareMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModSubGeneric()

VOID SYMCRYPT_CALL SymCryptFdef369ModSubGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369ModulusInitMontgomery()

VOID SYMCRYPT_CALL SymCryptFdef369ModulusInitMontgomery ( _Inout_ PSYMCRYPT_MODULUS  pmObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdef369MontgomeryReduce()

VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduce ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdef369MontgomeryReduceAsm()

VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduceAsm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdef369RawAddAsm()

◆ SymCryptFdef369RawMul()

VOID SYMCRYPT_CALL SymCryptFdef369RawMul ( _In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits1,
_In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits2,
_Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdef369RawMulAsm()

VOID SYMCRYPT_CALL SymCryptFdef369RawMulAsm ( _In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits1,
_In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits2,
_Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdef369RawSubAsm()

◆ SymCryptFdefClaimScratch()

◆ SymCryptFdefConditionalSwap()

VOID SYMCRYPT_CALL SymCryptFdefConditionalSwap ( _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE  pbSrc1,
_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE  pbSrc2,
UINT32  nDigits,
UINT32  cond 
)

Definition at line 122 of file fdef_general.c.

127{
128 SymCryptFdefConditionalSwapC( pbSrc1, pbSrc2, nDigits, cond );
129}
VOID SYMCRYPT_CALL SymCryptFdefConditionalSwapC(_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc1, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc2, UINT32 nDigits, UINT32 cond)
Definition: fdef_general.c:91

Referenced by SymCryptFdefIntConditionalSwap(), and SymCryptFdefModElementConditionalSwap().

◆ SymCryptFdefCreateTrialDivisionContext()

PCSYMCRYPT_TRIALDIVISION_CONTEXT SYMCRYPT_CALL SymCryptFdefCreateTrialDivisionContext ( UINT32  nDigits)

Definition at line 1136 of file fdef_general.c.

1137{
1139 PBYTE pAlloc;
1140 UINT32 nBytes;
1141 UINT32 iPrime;
1142 UINT32 iGroup;
1144 UINT32 nGroups;
1145 UINT32 M;
1146 UINT32 iGroupSpec;
1147 UINT32 i;
1148 UINT32 j;
1149 UINT64 cRabinMillerCost;
1150 UINT64 cPerPrimeCost;
1151 UINT64 tmp64;
1152 UINT32 maxPrime;
1153 UINT32 minPrime;
1154 UINT32 nSmallPrimes = 0;
1155 UINT32 n;
1156 UINT32 nP;
1157 UINT32 nG;
1158 PUINT32 pSmallPrimeList = NULL;
1159
1160 // First we estimate the largest prime we will do trial division with
1161 // Inputs:
1162 // - cycles/digit of reduction per group of primes
1163 // - cycles/prime of divide test
1164 // - cycles per digit^3 for a Rabin-Miller test
1165 // We optimize in this model, which is pretty accurate for large inputs but underestimates the RM cost
1166 // for smaller sizes.
1167
1168 // Compute the Rabin-Miller cost estimate. We reduce it by 20% because our cost model does not take
1169 // into account some of the trial-division cost such as memory footprint, cache pressure,
1170 // setup cost, etc. Reducing the Rabin-Miller cost leads us to do fewer trial divisions to approximately
1171 // balance the hidden costs.
1172
1173 if( nDigits <= 1000 )
1174 {
1175 // nDigits is small enough to not have any overflows in this computation
1176 if( nDigits == 0 )
1177 {
1178 goto cleanup; // return NULL
1179 }
1180
1181 cRabinMillerCost = (UINT64) nDigits * nDigits * nDigits * (SYMCRYPT_RABINMILLER_DIGIT_CYCLES * 8 / 10);
1182 i = 0;
1183 minPrime = 0;
1184 for(;;)
1185 {
1190
1191 // If the last group isn't worth it, we shouldn't go to even fewer primes
1192 if( nGroups == 0 || maxPrime * cPerPrimeCost >= cRabinMillerCost)
1193 {
1194 break;
1195 }
1196 i++;
1197 minPrime = maxPrime;
1198 }
1199
1200 // Now we know how many primes are in the last groups, let's find out how large the largest prime should be
1201 tmp64 = cRabinMillerCost / cPerPrimeCost;
1203 maxPrime = (UINT32) tmp64;
1204 maxPrime = SYMCRYPT_MAX( maxPrime, minPrime ); // Make sure we don't fall into the previous group size that we don't want
1205 }
1206 else
1207 {
1209 }
1210
1211 nSmallPrimes = SymCryptGenerateSmallPrimes( maxPrime, &pSmallPrimeList );
1212
1213 // Find out how many groups we'll have, and how many actual primes we'll use
1214 n = nSmallPrimes;
1215 nG = 0;
1216 nP = 0;
1217 i = 0;
1218 for(;;)
1219 {
1222
1223 if( n < nPrimes * nGroups || nGroups == 0 )
1224 {
1225 // At the right nPrimes, compute exactly how many groups to add
1226 n = n / nPrimes;
1227 nG += n;
1228 nP += n * nPrimes;
1229 n = 0; // No primes left
1230 break;
1231 }
1232
1233 // Use up all the groups of this size...
1234 nG += nGroups;
1235 nP += nPrimes * nGroups;
1236 n -= nPrimes * nGroups;
1237 i++;
1238 }
1239
1240 // dcl - Potential integer overflow
1241 // Need to document sizes, and limits of nG, nP, and confirm
1242 // an overflow is not possible, also recall that size_t varies in size, but nBytes is 32-bit
1243 nBytes = sizeof( SYMCRYPT_TRIALDIVISION_CONTEXT )
1244 + (nG + 1) * sizeof( SYMCRYPT_TRIALDIVISION_GROUP ) // + 1 for 0 sentinel
1245 + (nP + 1) * sizeof( SYMCRYPT_TRIALDIVISION_PRIME ) // + 1 for 0 sentinel
1246 + (nP + 1) * sizeof( UINT32 ); // + 1 for 0 sentinel
1247
1248 pAlloc = SymCryptCallbackAlloc( nBytes );
1249 if( pAlloc == NULL )
1250 {
1251 goto cleanup;
1252 }
1253
1254 pRes = (PSYMCRYPT_TRIALDIVISION_CONTEXT) pAlloc;
1255 pAlloc += sizeof( *pRes );
1256
1257 pRes->nBytesAlloc = nBytes;
1258
1260 pAlloc += (nG + 1) * sizeof( SYMCRYPT_TRIALDIVISION_GROUP );
1261
1263 pAlloc += (nP + 1) * sizeof( SYMCRYPT_TRIALDIVISION_PRIME );
1264
1265 pRes->pPrimes = (PUINT32) pAlloc;
1266 pAlloc += (nP + 1) * sizeof( UINT32 );
1267
1268 SYMCRYPT_ASSERT( nBytes == (SIZE_T)(pAlloc - (PBYTE)pRes) );
1269
1270 // Initialize the primes 3, 5, and 17
1274
1275 memcpy( pRes->pPrimes, pSmallPrimeList, nP * sizeof( UINT32 ) );
1276 pRes->pPrimes[nP] = 0;
1277 pRes->maxTrialPrime = pRes->pPrimes[nP-1];
1278
1279 /*
1280 *** Old code to decrypt the nibble encoding. Keep in case we want it back later...
1281 // Generate the other primes from the difference table.
1282 // We initialize the prime structures, and a list of the primes that is used to compute the group specs
1283
1284 pNibs = &g_SymCryptSmallPrimeDifferenceNibbles[0];
1285
1286 smallPrime = 3;
1287 nPrimes = 0;
1288 while( smallPrime < SYMCRYPT_MAX_SMALL_PRIME )
1289 {
1290 b = *pNibs++;
1291 nib = b & 0xf;
1292
1293 if( nib == 0 )
1294 {
1295 smallPrime += 30;
1296 // No check for termination here as we wouldn't encode a 0 if there wasn't another prime.
1297 } else {
1298 smallPrime += 2*nib;
1299 pRes->pPrimes[nPrimes] = smallPrime;
1300 SymCryptFdefInitTrialdivisionPrime( smallPrime, &pRes->pPrimeList[nPrimes] );
1301 nPrimes++;
1302 if( smallPrime >= SYMCRYPT_MAX_SMALL_PRIME )
1303 {
1304 break;
1305 }
1306 }
1307 nib = b >> 4;
1308 if( nib == 0 )
1309 {
1310 smallPrime += 30;
1311 } else {
1312 smallPrime += 2*nib;
1313 pRes->pPrimes[nPrimes] = smallPrime;
1314 SymCryptFdefInitTrialdivisionPrime( smallPrime, &pRes->pPrimeList[nPrimes] );
1315 nPrimes++;
1316 }
1317 }
1318 SYMCRYPT_ASSERT( smallPrime == SYMCRYPT_MAX_SMALL_PRIME && nPrimes == SYMCRYPT_N_SMALL_PRIMES_ENCODED );
1319 */
1320
1321 for( iPrime = 0; iPrime < nP; iPrime++ )
1322 {
1323 SymCryptFdefInitTrialdivisionPrime( pRes->pPrimes[iPrime], &pRes->pPrimeList[iPrime] );
1324 }
1325
1326 // Add the trailing 0s
1327 pRes->pPrimeList[nP].invMod2e64 = 0;
1328 pRes->pPrimeList[nP].compareLimit = 0;
1329
1330 // Make sure we have the 32-bit tables, not the 64-bit ones.
1331 // dcl - warning suppression is not portable. Also, if it is a compile time constant, shouldn't it be a compile assert?
1332#pragma warning( suppress: 4127 ) // conditional expression is constant
1334
1335 iGroup = 0;
1336 iPrime = 0;
1337 iGroupSpec = 0;
1339 nGroups = g_SymCryptSmallPrimeGroupsSpec[iGroupSpec].nGroups;
1340 while( iPrime < nP )
1341 {
1342 if( nGroups == 0 )
1343 {
1344 iGroupSpec +=1 ;
1346 nGroups = g_SymCryptSmallPrimeGroupsSpec[iGroupSpec].nGroups;
1347 if( nGroups == 0 )
1348 {
1349 nGroups = nG - iGroup;
1350 }
1351 }
1352
1353 SYMCRYPT_ASSERT( iPrime + nPrimes <= nP );
1354 M = pRes->pPrimes[iPrime++];
1355 for( j=1; j<nPrimes; j++ )
1356 {
1357 SYMCRYPT_ASSERT( M <= SYMCRYPT_MAX_SMALL_PRIME_GROUP_PRODUCT / pRes->pPrimes[iPrime] );
1358 M *= pRes->pPrimes[iPrime++];
1359 }
1361 iGroup++;
1362
1363 nGroups--;
1364 }
1365
1366 SYMCRYPT_ASSERT( iPrime == nP && iGroup == nG );
1367
1368 // Add the trailing sentinel group
1369 pRes->pGroupList[iGroup].nPrimes = 0;
1370
1371cleanup:
1372 if( pSmallPrimeList != NULL )
1373 {
1374 SymCryptWipe( pSmallPrimeList, nSmallPrimes * sizeof( UINT32 ) );
1375 SymCryptCallbackFree( pSmallPrimeList );
1376 pSmallPrimeList = NULL;
1377 }
1378 return pRes;
1379}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#define M(row, col)
static void cleanup(void)
Definition: main.c:1335
#define SYMCRYPT_RABINMILLER_DIGIT_CYCLES
Definition: fdef_general.c:29
UINT32 SYMCRYPT_CALL SymCryptGenerateSmallPrimes(UINT32 maxPrime, PUINT32 *ppList)
VOID SYMCRYPT_CALL SymCryptFdefInitTrialdivisionPrime(UINT32 prime, _Out_ PSYMCRYPT_TRIALDIVISION_PRIME pPrime)
Definition: fdef_general.c:998
#define SYMCRYPT_TRIALDIVISION_DIGIT_REDUCTION_CYCLES
Definition: fdef_general.c:27
#define SYMCRYPT_TRIALDIVISION_DIVIDE_TEST_CYCLES
Definition: fdef_general.c:28
VOID SYMCRYPT_CALL SymCryptFdefInitTrialDivisionGroup(PSYMCRYPT_TRIALDIVISION_GROUP pGroup, UINT32 nPrimes, UINT32 primeProd)
#define SYMCRYPT_TRIALDIVISION_MAX_SMALL_PRIME
Definition: fdef_general.c:34
GLdouble n
Definition: glext.h:7729
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
const SYMCRYPT_SMALL_PRIME_GROUPS_SPEC g_SymCryptSmallPrimeGroupsSpec[]
Definition: smallPrimes32.h:22
#define SYMCRYPT_MAX_SMALL_PRIME_GROUP_PRODUCT
Definition: smallPrimes32.h:20
SYMCRYPT_TRIALDIVISION_PRIME Primes3_5_17[3]
PSYMCRYPT_TRIALDIVISION_PRIME pPrimeList
PSYMCRYPT_TRIALDIVISION_GROUP pGroupList
struct _SYMCRYPT_TRIALDIVISION_PRIME SYMCRYPT_TRIALDIVISION_PRIME
struct _SYMCRYPT_TRIALDIVISION_CONTEXT SYMCRYPT_TRIALDIVISION_CONTEXT
struct _SYMCRYPT_TRIALDIVISION_GROUP * PSYMCRYPT_TRIALDIVISION_GROUP
struct _SYMCRYPT_TRIALDIVISION_PRIME * PSYMCRYPT_TRIALDIVISION_PRIME
#define SYMCRYPT_MIN(_a, _b)
#define SYMCRYPT_MAX(_a, _b)
UINT32 nPrimes
struct _SYMCRYPT_TRIALDIVISION_GROUP SYMCRYPT_TRIALDIVISION_GROUP
struct _SYMCRYPT_TRIALDIVISION_CONTEXT * PSYMCRYPT_TRIALDIVISION_CONTEXT

Referenced by SymCryptCreateTrialDivisionContext().

◆ SymCryptFdefDigitsFromBits()

UINT32 SymCryptFdefDigitsFromBits ( UINT32  nBits)

Definition at line 133 of file fdef_general.c.

134{
135 UINT32 res;
136
137 if( nBits == 0 )
138 {
139 res = 1;
140 }
141 else
142 {
144
145 // Callers with integers larger than SYMCRYPT_INT_MAX_BITS should not occur in real use cases
146 // To avoid overflow issues, return the 0 digits to indicate an error which can be handled by
147 // callers, or flow through into object allocation which will in turn recognize the invalid
148 // digit count.
150 {
151 res = 0;
152 } else {
154 }
155 }
156
157 return res;
158}
GLuint res
Definition: glext.h:9613
int nBits
Definition: pcmconverter.c:96
#define SYMCRYPT_INT_MAX_BITS
#define SYMCRYPT_FDEF_DIGITS_FROM_BITS(_bits)

Referenced by SymCryptDigitsFromBits().

◆ SymCryptFdefDivisorAllocate()

PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorAllocate ( UINT32  nDigits)

Definition at line 796 of file fdef_general.c.

797{
798 PVOID p = NULL;
799 UINT32 cb;
801
802 //
803 // The nDigits requirements are enforced by SymCryptFdefSizeofDivisorFromDigits. Thus
804 // the result does not overflow and is upper bounded by 2^19.
805 //
807
808 if( cb != 0 )
809 {
811 }
812
813 if( p == NULL )
814 {
815 goto cleanup;
816 }
817
818 res = SymCryptFdefDivisorCreate( p, cb, nDigits );
819
820cleanup:
821 return res;
822}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: fdef_general.c:842
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofDivisorFromDigits(UINT32 nDigits)
Definition: fdef_general.c:826
SYMCRYPT_DIVISOR * PSYMCRYPT_DIVISOR

Referenced by SymCryptDivisorAllocate().

◆ SymCryptFdefDivisorCopy()

VOID SymCryptFdefDivisorCopy ( _In_ PCSYMCRYPT_DIVISOR  pdSrc,
_Out_ PSYMCRYPT_DIVISOR  pdDst 
)

Definition at line 891 of file fdef_general.c.

894{
895 SYMCRYPT_CHECK_MAGIC( pdSrc );
896 SYMCRYPT_CHECK_MAGIC( pdDst );
897
898 SYMCRYPT_ASSERT( pdSrc->nDigits == pdDst->nDigits );
899
900 // in-place copy is somewhat common, and addresses are always public, so we can test for a no-op copy.
901 if( pdSrc != pdDst )
902 {
903 memcpy( pdDst, pdSrc, pdDst->cbSize );
904
905 SymCryptFdefDivisorCopyFixup( pdSrc, pdDst );
906 }
907}
VOID SymCryptFdefDivisorCopyFixup(_In_ PCSYMCRYPT_DIVISOR pdSrc, _Out_ PSYMCRYPT_DIVISOR pdDst)
Definition: fdef_general.c:878

Referenced by SymCryptDivisorCopy().

◆ SymCryptFdefDivisorCopyFixup()

VOID SymCryptFdefDivisorCopyFixup ( _In_ PCSYMCRYPT_DIVISOR  pSrc,
_Out_ PSYMCRYPT_DIVISOR  pDst 
)

Definition at line 878 of file fdef_general.c.

881{
882 UNREFERENCED_PARAMETER( pdSrc );
883 UNREFERENCED_PARAMETER( pdDst );
884
885 SymCryptFdefIntCopyFixup( &pdSrc->Int, &pdDst->Int );
886
887 SYMCRYPT_SET_MAGIC( pdDst );
888}
VOID SymCryptFdefIntCopyFixup(_In_ PCSYMCRYPT_INT pSrc, _Out_ PSYMCRYPT_INT pDst)
Definition: fdef_general.c:248
#define SYMCRYPT_SET_MAGIC(p)

Referenced by SymCryptFdefDivisorCopy(), and SymCryptFdefModulusCopy().

◆ SymCryptFdefDivisorCreate()

PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
SIZE_T  cbBuffer,
UINT32  nDigits 
)

Definition at line 842 of file fdef_general.c.

846{
847 PSYMCRYPT_DIVISOR pdDiv = NULL;
849
850 SYMCRYPT_ASSERT( cb >= sizeof(SYMCRYPT_DIVISOR) );
852 if( (cb == 0) || (cbBuffer < cb) )
853 {
854 goto cleanup; // return NULL
855 }
856
858 pdDiv = (PSYMCRYPT_DIVISOR) pbBuffer;
859
860 pdDiv->type = 'gD' << 16;
861 pdDiv->nDigits = nDigits;
862
863 //
864 // The nDigits requirements are enforced by SymCryptFdefSizeofDivisorFromDigits. Thus
865 // the result does not overflow and is upper bounded by 2^19.
866 //
867 pdDiv->cbSize = cb;
868
869 SYMCRYPT_SET_MAGIC( pdDiv );
870
872
873cleanup:
874 return pdDiv;
875}
int Int
Definition: definitions.h:37
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
Definition: sc_lib.h:1912
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
#define SYMCRYPT_FIELD_OFFSET(type, field)
struct _SYMCRYPT_DIVISOR SYMCRYPT_DIVISOR
UINT32 SYMCRYPT_CALL SymCryptSizeofDivisorFromDigits(UINT32 nDigits)
Definition: a_dispatch.c:512

Referenced by SymCryptDivisorCreate(), SymCryptFdefDivisorAllocate(), and SymCryptFdefModulusCreate().

◆ SymCryptFdefDivisorFromModulus()

PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorFromModulus ( _In_ PSYMCRYPT_MODULUS  pmSrc)

Definition at line 265 of file fdef_mod.c.

266{
267 return &pmSrc->Divisor;
268}

Referenced by SymCryptDivisorFromModulus().

◆ SymCryptFdefDivisorRetrieveHandle()

PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptFdefDivisorRetrieveHandle ( _In_ PBYTE  pbBuffer)

◆ SymCryptFdefFreeTrialDivisionContext()

VOID SYMCRYPT_CALL SymCryptFdefFreeTrialDivisionContext ( PCSYMCRYPT_TRIALDIVISION_CONTEXT  pContext)

Definition at line 1383 of file fdef_general.c.

1384{
1385 // No security reason to wipe it, but our test code verifies that we wipe everything...
1386 // Perf cost is minor
1387 SymCryptWipe( (PBYTE) pContext, pContext->nBytesAlloc );
1389}

Referenced by SymCryptFreeTrialDivisionContext().

◆ SymCryptFdefIntAddMixedSize()

UINT32 SYMCRYPT_CALL SymCryptFdefIntAddMixedSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 113 of file fdef_int.c.

117{
118 UINT32 nS1 = piSrc1->nDigits;
119 UINT32 nS2 = piSrc2->nDigits;
120 UINT32 nD = piDst->nDigits;
121 UINT32 c;
122 UINT32 nW;
123
124 SYMCRYPT_ASSERT( nD >= nS1 && nD >= nS2 );
125
126 if( nS1 < nS2 )
127 {
130 nW = nS2;
131 } else {
132 // nS2 < nS1
135 nW = nS1;
136 }
137
138 if( nW < nD )
139 {
142 c = 0;
143 }
144
145 return c;
146}
UINT32 SYMCRYPT_CALL SymCryptFdefRawAdd(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:45
UINT32 SYMCRYPT_CALL SymCryptFdefRawAddUint32(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, UINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
Definition: fdef_int.c:61
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
#define SYMCRYPT_FDEF_DIGIT_NUINT32
Definition: sc_lib.h:1916
#define SYMCRYPT_FDEF_DIGIT_SIZE
#define SYMCRYPT_FDEF_INT_PUINT32(p)

Referenced by SymCryptIntAddMixedSize().

◆ SymCryptFdefIntAddSameSize()

UINT32 SYMCRYPT_CALL SymCryptFdefIntAddSameSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 98 of file fdef_int.c.

102{
103 SYMCRYPT_ASSERT( piSrc1->nDigits == piSrc2->nDigits && piSrc2->nDigits == piDst->nDigits );
104
108 piDst->nDigits );
109}

Referenced by SymCryptIntAddSameSize().

◆ SymCryptFdefIntAddUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefIntAddUint32 ( _In_ PCSYMCRYPT_INT  piSrc1,
UINT32  u32Src2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 83 of file fdef_int.c.

87{
88 SYMCRYPT_CHECK_MAGIC( piSrc1 );
89 SYMCRYPT_CHECK_MAGIC( piDst );
90
91 SYMCRYPT_ASSERT( piSrc1->nDigits == piDst->nDigits );
92
93 return SymCryptFdefRawAddUint32( SYMCRYPT_FDEF_INT_PUINT32( piSrc1 ), u32Src2, SYMCRYPT_FDEF_INT_PUINT32( piDst ), piDst->nDigits );
94}

Referenced by SymCryptIntAddUint32().

◆ SymCryptFdefIntAllocate()

PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntAllocate ( UINT32  nDigits)

Definition at line 165 of file fdef_general.c.

166{
167 PVOID p = NULL;
168 UINT32 cb;
170
171 //
172 // The nDigits requirements are enforced by SymCryptFdefSizeofIntFromDigits. Thus
173 // the result does not overflow and is upper bounded by 2^18.
174 //
176
177 if( cb != 0 )
178 {
180 }
181
182 if( p == NULL )
183 {
184 goto cleanup;
185 }
186
187 res = SymCryptIntCreate( p, cb, nDigits );
188
189cleanup:
190 return res;
191}
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofIntFromDigits(UINT32 nDigits)
Definition: fdef_general.c:196

Referenced by SymCryptIntAllocate().

◆ SymCryptFdefIntBitsizeOfObject()

UINT32 SYMCRYPT_CALL SymCryptFdefIntBitsizeOfObject ( _In_ PCSYMCRYPT_INT  piSrc)

Definition at line 328 of file fdef_general.c.

329{
330 // This does not overflow since the nDigits field is
331 // bounded by SYMCRYPT_FDEF_UPB_DIGITS.
332 return SYMCRYPT_FDEF_DIGIT_BITS * piSrc->nDigits;
333}
#define SYMCRYPT_FDEF_DIGIT_BITS

Referenced by SymCryptIntBitsizeOfObject().

◆ SymCryptFdefIntBitsizeOfValue()

UINT32 SYMCRYPT_CALL SymCryptFdefIntBitsizeOfValue ( _In_ PCSYMCRYPT_INT  piSrc)

Definition at line 451 of file fdef_general.c.

452{
453 UINT32 nUint32 = SYMCRYPT_OBJ_NUINT32( piSrc );
454
455 UINT32 res = 0;
456 UINT32 msNonzeroWord = 0; // most significant nonzero digit
457 UINT32 searchingMask = SYMCRYPT_MASK32_SET; // Set if still searching, 0 otherwise
458 UINT32 d;
459 UINT32 dIsNonzeroMask;
460 UINT32 foundMask;
461
462 SYMCRYPT_CHECK_MAGIC( piSrc );
463
464 // This while loop reveals the value of nUint32, is that OK?
465 // If so, document why
466 while( nUint32 > 0 )
467 {
468 //
469 // Invariant:
470 // If no nonzero digit has been found, res = 0 and updateMask = -1.
471 // If a nonzero digit has been found:
472 // msNonzeroDigit = most significant nonzero digit in Src
473 // res = index where most-significant nonzero digit was found
474 // updateMask = 0
475 //
476
477 nUint32--;
478 d = SYMCRYPT_FDEF_INT_PUINT32( piSrc )[nUint32];
479
480 dIsNonzeroMask = SYMCRYPT_MASK32_NONZERO( d );
481 foundMask = dIsNonzeroMask & searchingMask;
482 res |= nUint32 & foundMask;
483 msNonzeroWord |= d & foundMask;
484 searchingMask &= ~foundMask;
485 }
486
487 //
488 // If all words are zero, then res == 0 and msNonzeroDigit == 0.
489 //
490 res = res * 8 * sizeof( UINT32 ) + SymCryptFdefBitsizeOfUint32( msNonzeroWord );
491
492 return res;
493}
UINT32 SYMCRYPT_CALL SymCryptFdefBitsizeOfUint32(UINT32 v)
Definition: fdef_general.c:399
#define d
Definition: ke_i.h:81
#define SYMCRYPT_OBJ_NUINT32(_p)
Definition: sc_lib.h:1920
#define SYMCRYPT_MASK32_NONZERO(_v)
#define SYMCRYPT_MASK32_SET

Referenced by SymCryptIntBitsizeOfValue().

◆ SymCryptFdefIntConditionalCopy()

VOID SYMCRYPT_CALL SymCryptFdefIntConditionalCopy ( _In_ PCSYMCRYPT_INT  piSrc,
_Inout_ PSYMCRYPT_INT  piDst,
UINT32  cond 
)

Definition at line 298 of file fdef_general.c.

302{
303 SYMCRYPT_CHECK_MAGIC( piSrc );
304 SYMCRYPT_CHECK_MAGIC( piDst );
305
306 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
307
309}
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopy(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
Definition: fdef_general.c:74

Referenced by SymCryptIntConditionalCopy().

◆ SymCryptFdefIntConditionalSwap()

VOID SYMCRYPT_CALL SymCryptFdefIntConditionalSwap ( _Inout_ PSYMCRYPT_INT  piSrc1,
_Inout_ PSYMCRYPT_INT  piSrc2,
UINT32  cond 
)

Definition at line 313 of file fdef_general.c.

317{
318 SYMCRYPT_CHECK_MAGIC( piSrc1 );
319 SYMCRYPT_CHECK_MAGIC( piSrc2 );
320
321 SYMCRYPT_ASSERT( piSrc1->nDigits == piSrc2->nDigits );
322
323 SymCryptFdefConditionalSwap( (PBYTE) SYMCRYPT_FDEF_INT_PUINT32( piSrc1 ), (PBYTE) SYMCRYPT_FDEF_INT_PUINT32( piSrc2 ), piSrc1->nDigits, cond );
324}
VOID SYMCRYPT_CALL SymCryptFdefConditionalSwap(_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc1, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbSrc2, UINT32 nDigits, UINT32 cond)
Definition: fdef_general.c:122

Referenced by SymCryptIntConditionalSwap().

◆ SymCryptFdefIntCopy()

VOID SymCryptFdefIntCopy ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 259 of file fdef_general.c.

262{
263 SYMCRYPT_CHECK_MAGIC( piSrc );
264 SYMCRYPT_CHECK_MAGIC( piDst );
265
266 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
267
268 //
269 // in-place copy is somewhat common, and addresses are always public, so we can test for a no-op copy.
270 //
271 if( piSrc != piDst )
272 {
273 // This is normally considered a banned, unsafe function. A note about why it is safe in this use
274 // would be good.
276 }
277}
#define SYMCRYPT_OBJ_NBYTES(_p)
Definition: sc_lib.h:1919

Referenced by SymCryptFdefIntToDivisor(), and SymCryptIntCopy().

◆ SymCryptFdefIntCopyMixedSize()

SYMCRYPT_ERROR SymCryptFdefIntCopyMixedSize ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 343 of file fdef_general.c.

346{
347 UINT32 n;
348 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
349
350 SYMCRYPT_CHECK_MAGIC( piSrc );
351 SYMCRYPT_CHECK_MAGIC( piDst );
352
353 // in-place copy is somewhat common, and addresses are always public, so we can test for a no-op copy.
354 if( piSrc == piDst )
355 {
356 goto cleanup;
357 }
358
359 //
360 // Copy the digits that are available in both
361 //
362 n = SYMCRYPT_MIN( piSrc->nDigits, piDst->nDigits );
364
365 if( piDst->nDigits > n )
366 {
368 }
369
370 if( piSrc->nDigits > n )
371 {
372 // Check that the rest of the source is zero
374 UINT64 v = 0;
375 UINT32 i = (piSrc->nDigits - n) * SYMCRYPT_FDEF_DIGIT_SIZE / sizeof( UINT64 );
376 while( i > 0 )
377 {
378 v |= *p++;
379 i--;
380 }
381
382 //
383 // If the Src doesn't fit, we are allowed to publish that fact, so we can use an IF.
384 //
385 if( v != 0 )
386 {
387 scError = SYMCRYPT_BUFFER_TOO_SMALL;
388 goto cleanup;
389 }
390 }
391
392cleanup:
393 return scError;
394}
unsigned __int64 * PUINT64
Definition: basetsd.h:181
const GLdouble * v
Definition: gl.h:2040

Referenced by SymCryptIntCopyMixedSize().

◆ SymCryptFdefIntCreate()

PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
SIZE_T  cbBuffer,
UINT32  nDigits 
)

Definition at line 213 of file fdef_general.c.

217{
218 PSYMCRYPT_INT pInt = NULL;
220
221 SYMCRYPT_ASSERT( cb >= sizeof(SYMCRYPT_INT) );
223 if( (cb == 0) || (cbBuffer < cb) )
224 {
225 goto cleanup; // return NULL
226 }
227
229 pInt = (PSYMCRYPT_INT) pbBuffer;
230
231 pInt->type = 'gI' << 16;
232 pInt->nDigits = nDigits;
233
234 //
235 // The nDigits requirements are enforced by SymCryptFdefSizeofIntFromDigits. Thus
236 // the result does not overflow and is upper bounded by 2^18.
237 //
238 pInt->cbSize = cb;
239
240 SYMCRYPT_SET_MAGIC( pInt );
241
242cleanup:
243 return pInt;
244}
struct _SYMCRYPT_INT SYMCRYPT_INT

Referenced by SymCryptIntCreate().

◆ SymCryptFdefIntDivMod()

VOID SYMCRYPT_CALL SymCryptFdefIntDivMod ( _In_ PCSYMCRYPT_INT  piSrc,
_In_ PCSYMCRYPT_DIVISOR  pdDivisor,
_Out_opt_ PSYMCRYPT_INT  piQuotient,
_Out_opt_ PSYMCRYPT_INT  piRemainder,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1219 of file fdef_int.c.

1226{
1227 UINT32 nDigits = SYMCRYPT_OBJ_NDIGITS( piSrc );
1228
1229 SYMCRYPT_ASSERT( piQuotient == NULL || piQuotient->nDigits >= piSrc->nDigits );
1230 SYMCRYPT_ASSERT( piRemainder == NULL || piRemainder->nDigits >= pdDivisor->nDigits );
1231
1234 nDigits,
1235 pdDivisor,
1236 piQuotient == NULL ? NULL : SYMCRYPT_FDEF_INT_PUINT32( piQuotient ),
1237 piRemainder == NULL ? NULL : SYMCRYPT_FDEF_INT_PUINT32( piRemainder ),
1238 pbScratch,
1239 cbScratch
1240 );
1241
1242 if ((piQuotient != NULL) && (piQuotient->nDigits > piSrc->nDigits))
1243 {
1244 SymCryptWipe( &SYMCRYPT_FDEF_INT_PUINT32( piQuotient )[piSrc->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32], (piQuotient->nDigits - piSrc->nDigits) * SYMCRYPT_FDEF_DIGIT_SIZE );
1245 }
1246
1247 if ((piRemainder != NULL) && (piRemainder->nDigits > pdDivisor->nDigits))
1248 {
1249 SymCryptWipe( &SYMCRYPT_FDEF_INT_PUINT32( piRemainder )[pdDivisor->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32], (piRemainder->nDigits - pdDivisor->nDigits) * SYMCRYPT_FDEF_DIGIT_SIZE );
1250 }
1251}
VOID SYMCRYPT_CALL SymCryptFdefRawDivMod(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pNum, UINT32 nDigits, _In_ PCSYMCRYPT_DIVISOR pdDivisor, _Out_writes_opt_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pQuotient, _Out_writes_opt_(SYMCRYPT_OBJ_NUINT32(pdDivisor)) PUINT32 pRemainder, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_int.c:1106
#define SYMCRYPT_OBJ_NDIGITS(_p)
Definition: sc_lib.h:1918

Referenced by SymCryptIntDivMod().

◆ SymCryptFdefIntDivPow2()

VOID SYMCRYPT_CALL SymCryptFdefIntDivPow2 ( _In_ PCSYMCRYPT_INT  piSrc,
SIZE_T  exp,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 469 of file fdef_int.c.

473{
474 SIZE_T shiftWords = exp / NATIVE_BITS;
475 SIZE_T shiftRightBits = exp % NATIVE_BITS;
476 SIZE_T shiftLeftBits = (NATIVE_BITS-1) - shiftRightBits;
477 NATIVE_UINT lowWord, highWord, highPart;
478 SIZE_T i = 0;
479
480 NATIVE_UINT nWords = piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NNATIVE_UINT;
481
482 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
483
484 shiftWords = SYMCRYPT_MIN(shiftWords, nWords);
485 if( shiftWords < nWords )
486 {
487 lowWord = SYMCRYPT_FDEF_INT_PNATIVE_UINT(piSrc)[shiftWords];
488 while( i+shiftWords+1 < nWords )
489 {
490 highWord = SYMCRYPT_FDEF_INT_PNATIVE_UINT(piSrc)[i+shiftWords+1];
491
492 // We always shift highWord left by 1 to keep variable shiftLeftBits in range [0,NATIVE_BITS-1]
493 highPart = (highWord << shiftLeftBits)<<1;
494
495 SYMCRYPT_FDEF_INT_PNATIVE_UINT(piDst)[i] = (lowWord >> shiftRightBits) | highPart;
496
497 lowWord = highWord;
498 i++;
499 }
500 SYMCRYPT_FDEF_INT_PNATIVE_UINT(piDst)[i] = (lowWord >> shiftRightBits);
501 i++;
502 }
503
504 SYMCRYPT_ASSERT(i + shiftWords == nWords);
505
506 SymCryptWipe( &SYMCRYPT_FDEF_INT_PNATIVE_UINT( piDst )[nWords-shiftWords], shiftWords * NATIVE_BYTES );
507}
#define SYMCRYPT_FDEF_INT_PNATIVE_UINT(p)
Definition: fdef_int.c:458
#define SYMCRYPT_FDEF_DIGIT_NNATIVE_UINT
Definition: fdef_int.c:462
DWORD exp
Definition: msg.c:18625
UINT32 NATIVE_UINT
Definition: sc_lib.h:77
#define NATIVE_BYTES
Definition: sc_lib.h:79
#define NATIVE_BITS
Definition: sc_lib.h:78

Referenced by SymCryptIntDivPow2().

◆ SymCryptFdefIntFindSmallDivisor()

UINT32 SYMCRYPT_CALL SymCryptFdefIntFindSmallDivisor ( _In_ PCSYMCRYPT_TRIALDIVISION_CONTEXT  pContext,
_In_ PCSYMCRYPT_INT  piSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1393 of file fdef_general.c.

1398{
1399 PCUINT32 pSrc = SYMCRYPT_FDEF_INT_PUINT32( piSrc );
1400 PCUINT32 p;
1401 UINT32 nDigits = piSrc->nDigits;
1402 UINT32 nUint32 = nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
1403 UINT64 Acc;
1407 UINT32 res;
1408
1409 // Check for 2. Not really needed for prime generation, but it makes the function easier to test/document/describe.
1410 if( (*pSrc & 1) == 0 )
1411 {
1412 res = 2;
1413 goto cleanup;
1414 }
1415
1416 // Check the factors 3, 5, 17. These are special as they divide 2^32 - 1
1417 // (We could also do 257 and 65537 but that doesn't seem worth the added complexity.)
1418 Acc = 0;
1419 p = pSrc;
1420 do {
1421#if SYMCRYPT_FDEF_DIGIT_SIZE == 16
1422 Acc = Acc + p[0] + p[1] + p[2] + p[3];
1423 p += 4;
1424#elif (SYMCRYPT_FDEF_DIGIT_SIZE % 32) == 0
1425 Acc = Acc + p[0] + p[1] + p[2] + p[3] + p[4] + p[5] + p[6] + p[7];
1426 p += 8;
1427#else
1428 // dcl - ideally, #error would have a descriptive message so it is easily found in code if encountered, same below
1429#error ??
1430#endif
1431 } while( p < pSrc + nUint32 );
1432
1433 if( SymCryptIsMultipleOfSmallPrime( Acc, &pContext->Primes3_5_17[0] ) )
1434 {
1435 res = 3;
1436 goto cleanup;
1437 }
1438
1439 if( SymCryptIsMultipleOfSmallPrime( Acc, &pContext->Primes3_5_17[1] ) )
1440 {
1441 res = 5;
1442 goto cleanup;
1443 }
1444
1445 if( SymCryptIsMultipleOfSmallPrime( Acc, &pContext->Primes3_5_17[2] ) )
1446 {
1447 res = 17;
1448 goto cleanup;
1449 }
1450
1451 pGroup = pContext->pGroupList;
1452 pPrime = pContext->pPrimeList;
1453 while( (nPrimes = pGroup->nPrimes) != 0 )
1454 {
1455 // Reduce Src modulo the group product to a 64-bit value
1456 Acc = 0;
1457 p = pSrc + nUint32;
1458
1459#if SYMCRYPT_FDEF_DIGIT_SIZE == 16
1460 if( (nUint32 & 4) != 0 )
1461 {
1462 // nUInt32 is 4 mod 8, process the top 4 words only
1463 p -= 4;
1464 Acc =
1465 p[0] +
1466 SYMCRYPT_MUL32x32TO64( p[1], pGroup->factor[0] ) +
1467 SYMCRYPT_MUL32x32TO64( p[2], pGroup->factor[1] ) +
1468 SYMCRYPT_MUL32x32TO64( p[3], pGroup->factor[2] );
1469 } else {
1470 // Process 8 words to start
1471 p -= 8;
1472 Acc =
1473 p[0] +
1474 SYMCRYPT_MUL32x32TO64( p[1], pGroup->factor[0] ) +
1475 SYMCRYPT_MUL32x32TO64( p[2], pGroup->factor[1] ) +
1476 SYMCRYPT_MUL32x32TO64( p[3], pGroup->factor[2] ) +
1477 SYMCRYPT_MUL32x32TO64( p[4], pGroup->factor[3] ) +
1478 SYMCRYPT_MUL32x32TO64( p[5], pGroup->factor[4] ) +
1479 SYMCRYPT_MUL32x32TO64( p[6], pGroup->factor[5] ) +
1480 SYMCRYPT_MUL32x32TO64( p[7], pGroup->factor[6] );
1481 }
1482#elif (SYMCRYPT_FDEF_DIGIT_SIZE % 32) == 0
1483
1484 p -= 8;
1485 Acc =
1486 p[0] +
1487 SYMCRYPT_MUL32x32TO64( p[1], pGroup->factor[0] ) +
1488 SYMCRYPT_MUL32x32TO64( p[2], pGroup->factor[1] ) +
1489 SYMCRYPT_MUL32x32TO64( p[3], pGroup->factor[2] ) +
1490 SYMCRYPT_MUL32x32TO64( p[4], pGroup->factor[3] ) +
1491 SYMCRYPT_MUL32x32TO64( p[5], pGroup->factor[4] ) +
1492 SYMCRYPT_MUL32x32TO64( p[6], pGroup->factor[5] ) +
1493 SYMCRYPT_MUL32x32TO64( p[7], pGroup->factor[6] );
1494
1495#else
1496#error ??
1497#endif
1498 while( p > pSrc )
1499 {
1500 p -= 8;
1501 Acc =
1502 p[0] +
1503 SYMCRYPT_MUL32x32TO64( p[1], pGroup->factor[0] ) +
1504 SYMCRYPT_MUL32x32TO64( p[2], pGroup->factor[1] ) +
1505 SYMCRYPT_MUL32x32TO64( p[3], pGroup->factor[2] ) +
1506 SYMCRYPT_MUL32x32TO64( p[4], pGroup->factor[3] ) +
1507 SYMCRYPT_MUL32x32TO64( p[5], pGroup->factor[4] ) +
1508 SYMCRYPT_MUL32x32TO64( p[6], pGroup->factor[5] ) +
1509 SYMCRYPT_MUL32x32TO64( p[7], pGroup->factor[6] ) +
1510 SYMCRYPT_MUL32x32TO64( (UINT32) Acc , pGroup->factor[7] ) +
1511 SYMCRYPT_MUL32x32TO64( (UINT32)(Acc >> 32), pGroup->factor[8] );
1512 }
1513
1514 // Now we check whether we have a multiple of one of the primes
1515 while( nPrimes > 0 )
1516 {
1517 if( SymCryptIsMultipleOfSmallPrime( Acc, pPrime ) )
1518 {
1519 res = pContext->pPrimes[ (pPrime - pContext->pPrimeList) ]; // pointer subtraction auto-divides by size...
1520 goto cleanup;
1521 }
1522 pPrime++;
1523 nPrimes--;
1524 }
1525
1526 pGroup++;
1527 }
1528
1529 UNREFERENCED_PARAMETER( pbScratch );
1531
1532 // Did not find a small factor, return zero
1533 res = 0;
1534
1535cleanup:
1536 return res;
1537}
FORCEINLINE UINT32 SymCryptIsMultipleOfSmallPrime(UINT64 value, PCSYMCRYPT_TRIALDIVISION_PRIME pPrime)
const UINT32 * PCUINT32

Referenced by SymCryptIntFindSmallDivisor().

◆ SymCryptFdefIntFromDivisor()

PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntFromDivisor ( _In_ PSYMCRYPT_DIVISOR  pdSrc)

Definition at line 915 of file fdef_int.c.

916{
917 return &pdSrc->Int;
918}

Referenced by SymCryptFdefIntFromModulus(), and SymCryptIntFromDivisor().

◆ SymCryptFdefIntFromModulus()

PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntFromModulus ( _In_ PSYMCRYPT_MODULUS  pmSrc)

Definition at line 282 of file fdef_mod.c.

283{
284
285 return SymCryptFdefIntFromDivisor( &pmSrc->Divisor );
286}
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptFdefIntFromDivisor(_In_ PSYMCRYPT_DIVISOR pdSrc)
Definition: fdef_int.c:915

Referenced by SymCryptIntFromModulus().

◆ SymCryptFdefIntGetBit()

UINT32 SYMCRYPT_CALL SymCryptFdefIntGetBit ( _In_ PCSYMCRYPT_INT  piSrc,
UINT32  iBit 
)

Definition at line 580 of file fdef_int.c.

583{
584 SYMCRYPT_ASSERT( iBit < piSrc->nDigits * SYMCRYPT_FDEF_DIGIT_BITS );
585
586 return (((SYMCRYPT_FDEF_INT_PUINT32( piSrc)[iBit / 32]) >> (iBit % 32)) & 1);
587}

Referenced by SymCryptIntGetBit().

◆ SymCryptFdefIntGetBits()

UINT32 SYMCRYPT_CALL SymCryptFdefIntGetBits ( _In_ PCSYMCRYPT_INT  piSrc,
UINT32  iBit,
UINT32  nBits 
)

Definition at line 591 of file fdef_int.c.

595{
596 UINT32 mainMask = 0;
597 UINT32 result = 0;
598
599 SYMCRYPT_ASSERT( (nBits > 0) &&
600 (nBits < 33) &&
601 (iBit < piSrc->nDigits * SYMCRYPT_FDEF_DIGIT_BITS) &&
602 (iBit + nBits <= piSrc->nDigits * SYMCRYPT_FDEF_DIGIT_BITS) );
603
604 mainMask = (UINT32)(-1) >> (32-nBits);
605
606 // Get the lower word first (it exists since iBit is smaller than the max bit)
607 result = SYMCRYPT_FDEF_INT_PUINT32(piSrc)[iBit/32];
608
609 // Shift to the right accordingly
610 result >>= (iBit%32);
611
612 // Get the upper word (if we need it)
613 // Note: the iBit and nBits values are public
614 if ((iBit%32!=0) && ( iBit/32 + 1 < piSrc->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32 ))
615 {
616 result |= ( SYMCRYPT_FDEF_INT_PUINT32(piSrc)[iBit/32+1] << (32 - iBit%32) );
617 }
618
619 // Mask out the top bits
620 result &= mainMask;
621
622 return result;
623}
GLuint64EXT * result
Definition: glext.h:11304

Referenced by SymCryptIntGetBits().

◆ SymCryptFdefIntGetValue()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefIntGetValue ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_writes_bytes_(cbDst) PBYTE  pbDst,
SIZE_T  cbDst,
SYMCRYPT_NUMBER_FORMAT  format 
)

Definition at line 695 of file fdef_general.c.

700{
701 SYMCRYPT_ERROR scError;
702
703 SYMCRYPT_CHECK_MAGIC( piSrc );
704
705 scError = SymCryptFdefRawGetValue( &SYMCRYPT_FDEF_INT_PUINT32( piSrc )[0], piSrc->nDigits, pbDst, cbDst, format );
706
707 return scError;
708}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawGetValue(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format)
Definition: fdef_general.c:619

Referenced by SymCryptIntGetValue().

◆ SymCryptFdefIntGetValueLsbits32()

UINT32 SYMCRYPT_CALL SymCryptFdefIntGetValueLsbits32 ( _In_ PCSYMCRYPT_INT  piSrc)

Definition at line 713 of file fdef_general.c.

714{
715 // nDigits cannot be zero, so we don't have to test
716 return SYMCRYPT_FDEF_INT_PUINT32( piSrc )[0];
717}

Referenced by SymCryptIntGetValueLsbits32().

◆ SymCryptFdefIntGetValueLsbits64()

UINT64 SYMCRYPT_CALL SymCryptFdefIntGetValueLsbits64 ( _In_ PCSYMCRYPT_INT  piSrc)

Definition at line 721 of file fdef_general.c.

722{
723 // nDigits cannot be zero, so we don't have to test
725 return ((UINT64)(p[1]) << 32) | p[0];
726}

Referenced by SymCryptIntGetValueLsbits64().

◆ SymCryptFdefIntIsEqual()

UINT32 SYMCRYPT_CALL SymCryptFdefIntIsEqual ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2 
)

Definition at line 758 of file fdef_general.c.

761{
762 UINT32 d;
763 UINT32 n1 = SYMCRYPT_OBJ_NUINT32( piSrc1 );
764 UINT32 n2 = SYMCRYPT_OBJ_NUINT32( piSrc2 );
765 UINT32 i;
766 UINT32 n;
767 PCUINT32 pSrc1 = SYMCRYPT_FDEF_INT_PUINT32( piSrc1 );
768 PCUINT32 pSrc2 = SYMCRYPT_FDEF_INT_PUINT32( piSrc2 );
769
770 n = SYMCRYPT_MIN( n1, n2 );
771 d = 0;
772 for( i=0; i < n ; i++ )
773 {
774 d |= pSrc1[i] ^ pSrc2[i];
775 }
776
777 // i == n1 or i == n2, so at most one of the 2 loops below is ever run
778
779 while( i < n1 )
780 {
781 d |= pSrc1[i];
782 i++;
783 }
784
785 while( i < n2 )
786 {
787 d |= pSrc2[i];
788 i++;
789 }
790
791 return SYMCRYPT_MASK32_ZERO( d );
792}
int n2
Definition: dwarfget.c:147
int n1
Definition: dwarfget.c:147

Referenced by SymCryptIntIsEqual().

◆ SymCryptFdefIntIsEqualUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefIntIsEqualUint32 ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ UINT32  u32Src2 
)

Definition at line 749 of file fdef_general.c.

752{
753 return SymCryptFdefRawIsEqualUint32( &SYMCRYPT_FDEF_INT_PUINT32( piSrc1 )[0], piSrc1->nDigits, u32Src2 );
754}
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsEqualUint32(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits, _In_ UINT32 u32Src2)
Definition: fdef_general.c:730

Referenced by SymCryptIntIsEqualUint32().

◆ SymCryptFdefIntIsLessThan()

UINT32 SYMCRYPT_CALL SymCryptFdefIntIsLessThan ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2 
)

Definition at line 368 of file fdef_int.c.

371{
372 UINT32 nD1 = piSrc1->nDigits;
373 UINT32 nD2 = piSrc2->nDigits;
374
375 UINT32 res;
376
377 if( nD1 == nD2 )
378 {
380 } else if( nD1 < nD2 ) {
382 res |= ~SymCryptFdefRawIsZero( &SYMCRYPT_FDEF_INT_PUINT32( piSrc2 )[ nD1 * SYMCRYPT_FDEF_DIGIT_NUINT32 ], nD2 - nD1 );
383 } else {
386 }
387
388 return res;
389}
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsLessThan(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, UINT32 nDigits)
Definition: fdef_int.c:322
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsZero(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, UINT32 nDigits)
Definition: fdef_int.c:355

Referenced by SymCryptIntIsLessThan().

◆ SymCryptFdefIntMaskedCopy()

VOID SymCryptFdefIntMaskedCopy ( _In_ PCSYMCRYPT_INT  piSrc,
_Inout_ PSYMCRYPT_INT  piDst,
UINT32  mask 
)

Definition at line 280 of file fdef_general.c.

287{
288 SYMCRYPT_CHECK_MAGIC( piSrc );
289 SYMCRYPT_CHECK_MAGIC( piDst );
290
291 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
292
294}
GLenum GLint GLuint mask
Definition: glext.h:6028

Referenced by SymCryptIntMaskedCopy().

◆ SymCryptFdefIntModPow2()

VOID SYMCRYPT_CALL SymCryptFdefIntModPow2 ( _In_ PCSYMCRYPT_INT  piSrc,
SIZE_T  exp,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 539 of file fdef_int.c.

543{
544 SIZE_T expWords = exp / 32; // index of word with the partial mask
545 SIZE_T expBits = exp % 32; // # bits to leave in that word
546
547 UINT32 nWords = piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
548
549 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
550
551 if( piSrc != piDst )
552 {
553 memcpy( SYMCRYPT_FDEF_INT_PUINT32( piDst ), SYMCRYPT_FDEF_INT_PUINT32( piSrc ), nWords * sizeof( UINT32 ) );
554 }
555
556 if( expWords >= nWords )
557 {
558 // exp is so large that Dst = Src is sufficient.
559 goto cleanup;
560 }
561
562 for( SIZE_T i=expWords + 1; i < nWords; i++ )
563 {
564 SYMCRYPT_FDEF_INT_PUINT32( piDst )[i] = 0;
565 }
566
567 if( expBits != 0 )
568 {
569 SYMCRYPT_FDEF_INT_PUINT32( piDst )[expWords] &= ((UINT32) -1) >> (32 - expBits );
570 } else {
571 SYMCRYPT_FDEF_INT_PUINT32( piDst )[expWords] = 0;
572 }
573
574cleanup:
575 ;
576}

Referenced by SymCryptIntModPow2().

◆ SymCryptFdefIntMulMixedSize()

VOID SYMCRYPT_CALL SymCryptFdefIntMulMixedSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 889 of file fdef_int.c.

895{
896 UINT32 nS1 = piSrc1->nDigits;
897 UINT32 nS2 = piSrc2->nDigits;
898 UINT32 nD = piDst ->nDigits;
899
901
902 SYMCRYPT_ASSERT( nS1 + nS2 <= nD );
903
905
906 if( nS1 + nS2 < nD )
907 {
908 SymCryptWipe( &SYMCRYPT_FDEF_INT_PUINT32( piDst )[(nS1 + nS2) * SYMCRYPT_FDEF_DIGIT_NUINT32], (nD - (nS1 + nS2)) * SYMCRYPT_FDEF_DIGIT_SIZE );
909 }
910}
VOID SYMCRYPT_CALL SymCryptFdefClaimScratch(PBYTE pbScratch, SIZE_T cbScratch, SIZE_T cbMin)
Definition: fdef_general.c:912
VOID SYMCRYPT_CALL SymCryptFdefRawMul(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
Definition: fdef_int.c:773
#define SYMCRYPT_FDEF_SCRATCH_BYTES_FOR_INT_MUL(_nDigits)

Referenced by SymCryptFdefIntMulSameSize(), and SymCryptIntMulMixedSize().

◆ SymCryptFdefIntMulPow2()

VOID SYMCRYPT_CALL SymCryptFdefIntMulPow2 ( _In_ PCSYMCRYPT_INT  piSrc,
SIZE_T  Exp,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 407 of file fdef_int.c.

411{
412 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
413
414 SIZE_T shiftWords = Exp / (8 * sizeof( UINT32 ) );
415 SIZE_T shiftBits = Exp % (8 * sizeof( UINT32 ) );
416
417 UINT32 nWords = piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
418
419 if( shiftWords >= nWords )
420 {
421 SymCryptWipe( SYMCRYPT_FDEF_INT_PUINT32( piDst ), nWords * sizeof( UINT32 ) );
422 goto cleanup;
423 }
424
425 SIZE_T i = nWords;
426 while( i > shiftWords )
427 {
428 i--;
429 UINT64 t = (UINT64)SYMCRYPT_FDEF_INT_PUINT32( piSrc )[i - shiftWords] << 32;
430 if( i > shiftWords )
431 {
432 t |= SYMCRYPT_FDEF_INT_PUINT32( piSrc )[i - shiftWords - 1];
433 }
434 SYMCRYPT_FDEF_INT_PUINT32( piDst )[i] = (UINT32)(t >> (32 - shiftBits));
435 }
436
437 while( i > 0 )
438 {
439 i--;
440 SYMCRYPT_FDEF_INT_PUINT32( piDst )[i] = 0;
441 }
442
443cleanup:
444 ;
445}
GLdouble GLdouble t
Definition: gl.h:2047

Referenced by SymCryptIntMulPow2().

◆ SymCryptFdefIntMulSameSize()

VOID SYMCRYPT_CALL SymCryptFdefIntMulSameSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 704 of file fdef_int.c.

710{
711 SymCryptFdefIntMulMixedSize( piSrc1, piSrc2, piDst, pbScratch, cbScratch );
712}
VOID SYMCRYPT_CALL SymCryptFdefIntMulMixedSize(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_int.c:889

Referenced by SymCryptIntMulSameSize().

◆ SymCryptFdefIntMulUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefIntMulUint32 ( _In_ PCSYMCRYPT_INT  piSrc1,
UINT32  Src2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 681 of file fdef_int.c.

685{
686 UINT32 nWords = piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
687
688 SYMCRYPT_ASSERT( piSrc1->nDigits == piDst->nDigits );
689
690 UINT64 c = 0;
691 for( UINT32 i=0; i<nWords; i++ )
692 {
693 c += SYMCRYPT_MUL32x32TO64( SYMCRYPT_FDEF_INT_PUINT32( piSrc1 )[i], Src2 );
694 SYMCRYPT_FDEF_INT_PUINT32( piDst )[i] = (UINT32) c;
695 c >>= 32;
696 }
697
698 return (UINT32) c;
699}

Referenced by SymCryptIntMulUint32().

◆ SymCryptFdefIntNeg()

VOID SYMCRYPT_CALL SymCryptFdefIntNeg ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 394 of file fdef_int.c.

397{
398 UINT32 nDigits = piDst->nDigits;
399 SYMCRYPT_ASSERT( piSrc->nDigits == nDigits );
400
402}
UINT32 SYMCRYPT_CALL SymCryptFdefRawNeg(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, UINT32 carryIn, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:213

Referenced by SymCryptIntNeg().

◆ SymCryptFdefIntSetBits()

VOID SYMCRYPT_CALL SymCryptFdefIntSetBits ( _In_ PSYMCRYPT_INT  piDst,
UINT32  value,
UINT32  iBit,
UINT32  nBits 
)

Definition at line 627 of file fdef_int.c.

632{
633 UINT32 mainMask = 0;
634
635 UINT32 alignedVal = 0;
636 UINT32 alignedMask = 0;
637
638 SYMCRYPT_ASSERT( (nBits > 0) &&
639 (nBits < 33) &&
640 (iBit < piDst->nDigits * SYMCRYPT_FDEF_DIGIT_BITS) &&
641 (iBit + nBits <= piDst->nDigits * SYMCRYPT_FDEF_DIGIT_BITS) );
642
643 // Zero out the not needed bits of the value
644 mainMask = (UINT32)(-1) >> (32-nBits);
645 value &= mainMask;
646
647 //
648 // Lower word
649 //
650
651 // Create the needed mask
652 alignedMask = mainMask << (iBit%32);
653
654 // Align the value
655 alignedVal = value << (iBit%32);
656
657 // Set the lower word first (it exists since iBit is smaller than the max bit)
658 SYMCRYPT_FDEF_INT_PUINT32(piDst)[iBit/32] = (SYMCRYPT_FDEF_INT_PUINT32(piDst)[iBit/32] & ~alignedMask) | alignedVal;
659
660 //
661 // Upper word
662 //
663
664 if ((iBit%32!=0) && ( iBit/32 + 1 < piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32 ))
665 {
666 // Create the needed mask
667 alignedMask = mainMask >> (32 - iBit%32);
668
669 // Align the value
670 alignedVal = value >> (32 - iBit%32);
671
672 // Set the upper word
673 SYMCRYPT_FDEF_INT_PUINT32(piDst)[iBit/32 + 1] = (SYMCRYPT_FDEF_INT_PUINT32(piDst)[iBit/32 + 1] & ~alignedMask) | alignedVal;
674 }
675
676}

Referenced by SymCryptIntSetBits().

◆ SymCryptFdefIntSetValue()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefIntSetValue ( _In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
SYMCRYPT_NUMBER_FORMAT  format,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 601 of file fdef_general.c.

606{
607 SYMCRYPT_ERROR scError;
608
609 SYMCRYPT_CHECK_MAGIC( piDst );
610
611 scError = SymCryptFdefRawSetValue( pbSrc, cbSrc, format, SYMCRYPT_FDEF_INT_PUINT32( piDst ), piDst->nDigits );
612
613 return scError;
614}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_writes_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_general.c:524

Referenced by SymCryptIntSetValue().

◆ SymCryptFdefIntSetValueUint32()

VOID SYMCRYPT_CALL SymCryptFdefIntSetValueUint32 ( UINT32  u32Src,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 497 of file fdef_general.c.

500{
501 SYMCRYPT_CHECK_MAGIC( piDst );
502
504 SYMCRYPT_FDEF_INT_PUINT32( piDst )[0] = u32Src;
505}

Referenced by SymCryptIntSetValueUint32().

◆ SymCryptFdefIntSetValueUint64()

VOID SYMCRYPT_CALL SymCryptFdefIntSetValueUint64 ( UINT64  u64Src,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 511 of file fdef_general.c.

514{
515 SYMCRYPT_CHECK_MAGIC( piDst );
516
518 SYMCRYPT_FDEF_INT_PUINT32( piDst )[0] = (UINT32) u64Src;
519 SYMCRYPT_FDEF_INT_PUINT32( piDst )[1] = (UINT32)(u64Src >> 32);
520}

Referenced by SymCryptIntSetValueUint64().

◆ SymCryptFdefIntShr1()

VOID SYMCRYPT_CALL SymCryptFdefIntShr1 ( UINT32  highestBit,
_In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 511 of file fdef_int.c.

515{
516 UINT32 nWords = piDst->nDigits * SYMCRYPT_FDEF_DIGIT_NNATIVE_UINT;
517
518 SYMCRYPT_ASSERT( piSrc->nDigits == piDst->nDigits );
519 SYMCRYPT_ASSERT( highestBit < 2 );
520
521 SIZE_T i = 0;
523 NATIVE_UINT highWord = 0;
524 while( i+1 < nWords )
525 {
526 highWord = SYMCRYPT_FDEF_INT_PNATIVE_UINT(piSrc)[i+1];
527
528 SYMCRYPT_FDEF_INT_PNATIVE_UINT(piDst)[i] = (lowWord >> 1) | (highWord << (NATIVE_BITS - 1));
529
530 lowWord = highWord;
531 i++;
532 }
533
534 SYMCRYPT_FDEF_INT_PNATIVE_UINT(piDst)[i] = (lowWord >> 1) | ((NATIVE_UINT)highestBit) << (NATIVE_BITS - 1);
535}

Referenced by SymCryptIntShr1().

◆ SymCryptFdefIntSquare()

VOID SYMCRYPT_CALL SymCryptFdefIntSquare ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_INT  piDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 716 of file fdef_int.c.

721{
722 UINT32 nS = piSrc->nDigits;
723 UINT32 nD = piDst->nDigits;
724
726
727 SYMCRYPT_ASSERT( 2*nS <= nD );
728
730
731 if( 2*nS < nD )
732 {
734 }
735}
VOID SYMCRYPT_CALL SymCryptFdefRawSquare(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
Definition: fdef_int.c:866

Referenced by SymCryptIntSquare().

◆ SymCryptFdefIntSubMixedSize()

UINT32 SYMCRYPT_CALL SymCryptFdefIntSubMixedSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 260 of file fdef_int.c.

264{
265 UINT32 nS1 = piSrc1->nDigits;
266 UINT32 nS2 = piSrc2->nDigits;
267 UINT32 nD = piDst->nDigits;
268 UINT32 c;
269 UINT32 n;
270
271 SYMCRYPT_ASSERT( nD >= nS1 && nD >= nS2 );
272
273 if( nS1 < nS2 )
274 {
278 } else {
279 // nS2 < nS1
283 }
284
285 //
286 // Set the rest of the result to 0s or 1s
287 //
288 while( n < nD * SYMCRYPT_FDEF_DIGIT_NUINT32 )
289 {
290 SYMCRYPT_FDEF_INT_PUINT32( piDst )[n++] = 0 - c;
291 }
292
293 return c;
294}
UINT32 SYMCRYPT_CALL SymCryptFdefRawSub(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:174
UINT32 SYMCRYPT_CALL SymCryptFdefRawSubUint32(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, UINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:190

Referenced by SymCryptIntSubMixedSize().

◆ SymCryptFdefIntSubSameSize()

UINT32 SYMCRYPT_CALL SymCryptFdefIntSubSameSize ( _In_ PCSYMCRYPT_INT  piSrc1,
_In_ PCSYMCRYPT_INT  piSrc2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 248 of file fdef_int.c.

252{
253 SYMCRYPT_ASSERT( piSrc1->nDigits == piSrc2->nDigits && piSrc1->nDigits == piDst->nDigits );
254
255 return SymCryptFdefRawSub( SYMCRYPT_FDEF_INT_PUINT32( piSrc1 ), SYMCRYPT_FDEF_INT_PUINT32( piSrc2 ), SYMCRYPT_FDEF_INT_PUINT32( piDst ), piDst->nDigits );
256}

Referenced by SymCryptIntSubSameSize().

◆ SymCryptFdefIntSubUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefIntSubUint32 ( _In_ PCSYMCRYPT_INT  piSrc1,
UINT32  u32Src2,
_Out_ PSYMCRYPT_INT  piDst 
)

Definition at line 236 of file fdef_int.c.

240{
241 SYMCRYPT_ASSERT( piSrc1->nDigits == piDst->nDigits );
242
243 return SymCryptFdefRawSubUint32( SYMCRYPT_FDEF_INT_PUINT32( piSrc1 ), u32Src2, SYMCRYPT_FDEF_INT_PUINT32( piDst ), piDst->nDigits );
244}

Referenced by SymCryptIntSubUint32().

◆ SymCryptFdefIntToDivisor()

VOID SYMCRYPT_CALL SymCryptFdefIntToDivisor ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_DIVISOR  pdDst,
UINT32  totalOperations,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 922 of file fdef_int.c.

929{
930 UINT32 W;
932 UINT32 nWords;
933 UINT32 bitToTest;
934 UINT64 P;
935
936 UNREFERENCED_PARAMETER( totalOperations );
938
939 SYMCRYPT_CHECK_MAGIC( piSrc );
940 SYMCRYPT_CHECK_MAGIC( pdDst );
941
942 SYMCRYPT_ASSERT( piSrc->nDigits == pdDst->nDigits );
943
945
946 //
947 // Copy the Int.
948 //
949 SymCryptFdefIntCopy( piSrc, &pdDst->Int );
950
951 //
952 // For an N-bit divisor M, and D-bit divisor digit size,
953 // the value W is defined as
954 // floor( (2^{N+D} - 1) / M } - 2^D
955 // which is the largest W such that (W * M + 2^D * M )< 2^{N+D}
956 // To compute W we use a binary search.
957 // This can be optimized, but this is the simplest side-channel safe solution.
958 // We can compute the upper bits of W * M + 2^D * M in a simple loop.
959 //
960 // For now we only compute a 32-bit W for a 32-bit digit divisor size.
961 //
962
963 nBits = SymCryptIntBitsizeOfValue( &pdDst->Int );
964
965 SYMCRYPT_ASSERT( nBits != 0 );
966 if( nBits == 0 )
967 {
968 // Can't create a divisor from a Int whose value is 0
969
970 // We really should not have any callers which get here (it is a requirement that Src != 0)
971 // We assert in CHKed builds
972 // In release set the divisor to 1 instead
973 SymCryptIntSetValueUint32( 1, &pdDst->Int );
974 }
975
976 pdDst->nBits = nBits;
977
978 nWords = (nBits + 31)/32;
979 bitToTest = (UINT32)1 << 31;
980 W = 0;
981 while( bitToTest > 0 )
982 {
983 W |= bitToTest;
984 // Do the multiplication
985 P = 0;
986 for( UINT32 i=0; i<nWords; i++ )
987 {
988 // Invariant:
989 // P <= 2^{2D} - 2 which ensures the mul-add doesn't generate an overflow
990 // P = floor( (W + 2^32)*M[0..i-1] / 2^{32*i} )
991 P += SYMCRYPT_MUL32x32TO64( W, SYMCRYPT_FDEF_INT_PUINT32( &pdDst->Int )[i] );
992 P >>= 32;
993 P += SYMCRYPT_FDEF_INT_PUINT32( &pdDst->Int )[i];
994 }
995 // We are interested in bit N+D, and P[0] is bit nWords*D, this shift brings the relevant bit to position 0
996 P >>= ((nBits+31) % 32) + 1;
997 // If the bit is 1, W*M is too large and we reset the corresponding bit in W.
998 W ^= bitToTest & (0 - ((UINT32)P & 1));
999 bitToTest >>= 1;
1000 }
1001 pdDst->td.fdef.W = W;
1002
1003 SYMCRYPT_SET_MAGIC( pdDst );
1004}
#define W(I)
#define P(row, col)
VOID SymCryptFdefIntCopy(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
Definition: fdef_general.c:259
Definition: polytest.cpp:36
#define SYMCRYPT_FDEF_SCRATCH_BYTES_FOR_INT_TO_DIVISOR(_nDigits)
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfValue(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:223

Referenced by SymCryptIntToDivisor().

◆ SymCryptFdefIntToModElement()

VOID SYMCRYPT_CALL SymCryptFdefIntToModElement ( _In_ PCSYMCRYPT_INT  piSrc,
_In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 407 of file fdef_mod.c.

413{
416 piSrc->nDigits,
417 &pmMod->Divisor,
418 NULL, // throw away the quotient
419 &peDst->d.uint32[0],
420 pbScratch,
421 cbScratch );
422
423 SYMCRYPT_MOD_CALL( pmMod ) modSetPost( pmMod, peDst, pbScratch, cbScratch );
424}
#define SYMCRYPT_MOD_CALL(v)
Definition: sc_lib.h:2039

Referenced by SymCryptIntToModElement().

◆ SymCryptFdefIntToModulus()

VOID SYMCRYPT_CALL SymCryptFdefIntToModulus ( _In_ PCSYMCRYPT_INT  piSrc,
_Out_ PSYMCRYPT_MODULUS  pmDst,
UINT32  averageOperations,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 385 of file fdef_mod.c.

392{
393 pmDst->flags = flags;
394 SymCryptIntToDivisor( piSrc, &pmDst->Divisor, averageOperations, flags & SYMCRYPT_FLAG_DATA_PUBLIC, pbScratch, cbScratch );
395
396 pmDst->type = SymCryptFdefDecideModulusType( piSrc, pmDst->nDigits, averageOperations, flags );
397
398 // Set inv64 - note the value is only valid if the modulus is odd, but the computation
399 // is constant time regardless of the parity, so we can safely compute it in all cases
400 pmDst->inv64 = 0 - SymCryptInverseMod2e64( SymCryptIntGetValueLsbits64(piSrc) );
401
402 SYMCRYPT_MOD_CALL( pmDst ) modulusInit( pmDst, pbScratch, cbScratch );
403}
UINT64 SymCryptInverseMod2e64(UINT64 m)
Definition: fdef_general.c:932
UINT32 SYMCRYPT_CALL SymCryptFdefDecideModulusType(PCSYMCRYPT_INT piSrc, UINT32 nDigits, UINT32 averageOperations, UINT32 flags)
Definition: fdef_mod.c:290
UINT64 SYMCRYPT_CALL SymCryptIntGetValueLsbits64(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:277
VOID SYMCRYPT_CALL SymCryptIntToDivisor(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_DIVISOR pdDst, UINT32 totalOperations, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:560
#define SYMCRYPT_FLAG_DATA_PUBLIC

Referenced by SymCryptIntToModulus().

◆ SymCryptFdefMaskedCopy()

VOID SYMCRYPT_CALL SymCryptFdefMaskedCopy ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE  pbSrc,
_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE  pbDst,
UINT32  nDigits,
UINT32  mask 
)

Definition at line 74 of file fdef_general.c.

79{
80#if SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_ARM
84#else
86#endif
87}
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopyC(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
Definition: fdef_general.c:40
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopyAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)

Referenced by SymCryptEcpointMaskedCopy(), SymCryptFdefIntConditionalCopy(), SymCryptFdefIntMaskedCopy(), SymCryptFdefModAddGeneric(), SymCryptFdefModElementMaskedCopy(), SymCryptFdefModSubGeneric(), and SymCryptFdefMontgomeryReduceC().

◆ SymCryptFdefMaskedCopyAsm()

VOID SYMCRYPT_CALL SymCryptFdefMaskedCopyAsm ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE  pbSrc,
_Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE  pbDst,
UINT32  nDigits,
UINT32  mask 
)

Referenced by SymCryptFdefMaskedCopy().

◆ SymCryptFdefModAdd256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModAdd256Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModAdd384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModAdd384Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModAddGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModAddGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 548 of file fdef_mod.c.

555{
556 UINT32 c;
557 UINT32 d;
558 UINT32 nDigits = pmMod->nDigits;
559
562
563 //
564 // Doing add/cmp/sub might be faster or not.
565 // Masked add is hard because the mask operations destroy the carry flag.
566 //
567
568 // dcl - cleanup?
569
570// c = SymCryptFdefRawAdd( &pSrc1->uint32[0], &pSrc2->uint32[0], &pDst->uint32[0], nDigits);
571// d = SymCryptFdefRawSub( &pDst->uint32[0], &pMod->Divisor.Int.uint32[0], &pDst->uint32[0], nDigits );
572// e = SymCryptFdefRawMaskedAdd( &pDst->uint32[0], &pMod->Divisor.Int.uint32[0], 0 - (c^d), nDigits );
573
574 c = SymCryptFdefRawAdd( &peSrc1->d.uint32[0], &peSrc2->d.uint32[0], &peDst->d.uint32[0], nDigits );
575 d = SymCryptFdefRawSub( &peDst->d.uint32[0], SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), (PUINT32) pbScratch, nDigits );
576 SymCryptFdefMaskedCopy( pbScratch, (PBYTE) &peDst->d.uint32[0], nDigits, (c^d) - 1 );
577
578 // We can't have a carry in the first addition, and no carry in the subtraction.
579 SYMCRYPT_ASSERT( !( c == 1 && d == 0 ) );
580}
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)

◆ SymCryptFdefModAddMulx256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModAddMulx256Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModAddMulx384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModAddMulx384Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModDivPow2()

VOID SYMCRYPT_CALL SymCryptFdefModDivPow2 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
UINT32  exp,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 872 of file fdef_mod.c.

879{
880 UINT32 shiftAmount;
881
882 UNREFERENCED_PARAMETER(pbScratch);
884
885 // mod must be odd
886 SYMCRYPT_ASSERT( (SYMCRYPT_FDEF_INT_PUINT32(&pmMod->Divisor.Int)[0] & 1) != 0 );
887
888 if( exp == 0 )
889 {
890 // If exp is 0 we just need to copy peSrc to peDst
891 SymCryptFdefModElementCopy( pmMod, peSrc, peDst );
892 return;
893 }
894
895 do
896 {
897 shiftAmount = SYMCRYPT_MIN(NATIVE_BITS, exp);
898 SymCryptFdefModDivSmallPow2( pmMod, peSrc, shiftAmount, peDst );
899 exp -= shiftAmount;
900
901 // First iteration reads from peSrc and writes to peDst
902 // subsequent iterations must read from and write to peDst
903 peSrc = peDst;
904 } while( exp > 0 );
905}
VOID SymCryptFdefModElementCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: fdef_mod.c:241
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: fdef_mod.c:844

Referenced by SymCryptModDivPow2().

◆ SymCryptFdefModDivSmallPow2()

VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_In_range_(1, NATIVE_BITS) UINT32  exp,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

Definition at line 844 of file fdef_mod.c.

849{
850
851#if SYMCRYPT_CPU_AMD64
853 {
854 SymCryptFdefModDivSmallPow2Mulx( pmMod, peSrc, exp, peDst );
855 }
856 else
857 {
858 // Currently SymCryptAsm does not support AMD64 functions with shl/shr/shrd
859 // by a variable count, as this needs special handling of the rcx (cl) register
860 // For now we just fallback to the generic implementation on machines without MULX
861 SymCryptFdefModDivSmallPow2Generic( pmMod, peSrc, exp, peDst );
862 }
863#elif SYMCRYPT_CPU_ARM64
864 SymCryptFdefModDivSmallPow2Asm( pmMod, peSrc, exp, peDst );
865#else
866 SymCryptFdefModDivSmallPow2Generic( pmMod, peSrc, exp, peDst );
867#endif
868}
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Generic(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: fdef_mod.c:795
#define SYMCRYPT_CPU_FEATURES_FOR_MULX
Definition: sc_lib.h:314
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Mulx(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)
VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Asm(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _In_range_(1, NATIVE_BITS) UINT32 exp, _Out_ PSYMCRYPT_MODELEMENT peDst)

Referenced by SymCryptFdefModDivPow2(), and SymCryptFdefModInvGeneric().

◆ SymCryptFdefModDivSmallPow2Asm()

VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_In_range_(1, NATIVE_BITS) UINT32  exp,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModDivSmallPow2Mulx()

VOID SYMCRYPT_CALL SymCryptFdefModDivSmallPow2Mulx ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_In_range_(1, NATIVE_BITS) UINT32  exp,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModElementAllocate()

PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementAllocate ( _In_ PCSYMCRYPT_MODULUS  pmMod)

Definition at line 157 of file fdef_mod.c.

158{
159 PVOID p;
160 UINT32 cb;
162
163 //
164 // The nDigits requirements are enforced by the modulus object. Thus
165 // the result does not overflow and is upper bounded by 2^17.
166 //
168
170
171 if( p == NULL )
172 {
173 goto cleanup;
174 }
175
177
178cleanup:
179 return res;
180}
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, PCSYMCRYPT_MODULUS pmMod)
Definition: fdef_mod.c:202
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: fdef_mod.c:194

Referenced by SymCryptModElementAllocate().

◆ SymCryptFdefModElementConditionalSwap()

VOID SymCryptFdefModElementConditionalSwap ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peData1,
_Inout_ PSYMCRYPT_MODELEMENT  peData2,
_In_ UINT32  cond 
)

Definition at line 271 of file fdef_mod.c.

276{
277 SymCryptFdefConditionalSwap( (PBYTE) &peData1->d.uint32[0], (PBYTE) &peData2->d.uint32[0], pmMod->nDigits, cond );
278}

Referenced by SymCryptModElementConditionalSwap().

◆ SymCryptFdefModElementCopy()

VOID SymCryptFdefModElementCopy ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

Definition at line 241 of file fdef_mod.c.

245{
246 if( peSrc != peDst )
247 {
248 memcpy( peDst, peSrc, pmMod->cbModElement );
249 }
250}

Referenced by SymCryptFdefModDivPow2(), and SymCryptModElementCopy().

◆ SymCryptFdefModElementCreate()

PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
SIZE_T  cbBuffer,
PCSYMCRYPT_MODULUS  pmMod 
)

Definition at line 202 of file fdef_mod.c.

206{
208
209 UNREFERENCED_PARAMETER( pmMod );
211
215
216 //
217 // We have various optimizations where we use only part of the last digit
218 // Simple and fast solution: always wipe the last digit
219 //
220#if (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64)
221 UINT32 nDigits = pmMod->nDigits;
222
224#endif
225
226 // There is nothing to initialize...
227
228 return pDst;
229}

Referenced by SymCryptFdefModElementAllocate(), and SymCryptModElementCreate().

◆ SymCryptFdefModElementFree()

VOID SYMCRYPT_CALL SymCryptFdefModElementFree ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peObj 
)

Definition at line 184 of file fdef_mod.c.

187{
188 SymCryptFdefModElementWipe( pmMod, peObj );
189 SymCryptCallbackFree( peObj );
190}
VOID SYMCRYPT_CALL SymCryptFdefModElementWipe(_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: fdef_mod.c:233

Referenced by SymCryptModElementFree().

◆ SymCryptFdefModElementGetValue()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModElementGetValue ( _In_ 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 at line 484 of file fdef_mod.c.

492{
493 SYMCRYPT_ERROR scError;
494 PCUINT32 pUint32;
495 UINT32 nDigits = pmMod->nDigits;
496
497
499
500 SYMCRYPT_ASSERT( cbDst <= nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
501
502 pUint32 = SYMCRYPT_MOD_CALL( pmMod ) modPreGet( pmMod, peSrc, pbScratch, cbScratch );
503
504 scError = SymCryptFdefRawGetValue( pUint32, nDigits, pbDst, cbDst, format );
505
506 return scError;
507}

Referenced by SymCryptModElementGetValue().

◆ SymCryptFdefModElementIsEqual()

UINT32 SYMCRYPT_CALL SymCryptFdefModElementIsEqual ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2 
)

Definition at line 511 of file fdef_mod.c.

515{
516 UINT32 d;
517 UINT32 i;
518
519 d = 0;
520 for( i=0; i < pmMod->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32 ; i++ )
521 {
522 d |= peSrc1->d.uint32[i] ^ peSrc2->d.uint32[i];
523 }
524
525 return SYMCRYPT_MASK32_ZERO( d );
526}

Referenced by SymCryptModElementIsEqual().

◆ SymCryptFdefModElementIsZero()

UINT32 SYMCRYPT_CALL SymCryptFdefModElementIsZero ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc 
)

Definition at line 530 of file fdef_mod.c.

533{
534 UINT32 d;
535 UINT32 i;
536
537 d = 0;
538 for( i=0; i < pmMod->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32 ; i++ )
539 {
540 d |= peSrc->d.uint32[i]; // Check that all bits are zero
541 }
542
543 return SYMCRYPT_MASK32_ZERO( d );
544}

Referenced by SymCryptModElementIsZero().

◆ SymCryptFdefModElementMaskedCopy()

VOID SymCryptFdefModElementMaskedCopy ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
UINT32  mask 
)

Definition at line 253 of file fdef_mod.c.

258{
259 SymCryptFdefMaskedCopy( (PCBYTE) peSrc, (PBYTE) peDst, pmMod->nDigits, mask );
260}

Referenced by SymCryptModElementMaskedCopy().

◆ SymCryptFdefModElementRetrieveHandle()

PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptFdefModElementRetrieveHandle ( _In_ PBYTE  pbBuffer)

◆ SymCryptFdefModElementSetValueGeneric()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModElementSetValueGeneric ( _In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
SYMCRYPT_NUMBER_FORMAT  format,
_In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 445 of file fdef_mod.c.

453{
454 SYMCRYPT_ERROR scError;
455 UINT32 nDigits = pmMod->nDigits;
456
458
459 SYMCRYPT_ASSERT( cbSrc <= nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
460
461 scError = SymCryptFdefRawSetValue( pbSrc, cbSrc, format, &peDst->d.uint32[0], nDigits );
462 if( scError != SYMCRYPT_NO_ERROR )
463 {
464 goto cleanup;
465 }
466
468 &peDst->d.uint32[0],
469 nDigits,
470 &pmMod->Divisor,
471 NULL,
472 &peDst->d.uint32[0],
473 pbScratch,
474 cbScratch );
475
476 scError = SYMCRYPT_NO_ERROR;
477
478cleanup:
479 return scError;
480}

Referenced by SymCryptModElementSetValue().

◆ SymCryptFdefModElementSetValueNegUint32()

VOID SYMCRYPT_CALL SymCryptFdefModElementSetValueNegUint32 ( UINT32  value,
_In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 663 of file fdef_mod.c.

669{
670 UINT32 nDigits = pmMod->nDigits;
671
673
674 if( pmMod->Divisor.nBits <= 32 && value >= SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int )[0] )
675 {
676 // The value is >= the modulus; this is not supported.
677
678 // For now do a possibly non-sidechannel safe, but mathematically correct modulo operation
679 value %= SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int )[0];
680 }
681
682 if( value == 0 )
683 {
684 SymCryptWipe( &peDst->d.uint32[0], nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
685 } else {
686 SymCryptFdefRawSubUint32( SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), value, &peDst->d.uint32[0], nDigits );
687 }
688
689 //
690 // Possible future optimization: we can optimize the value==0 and value==1 cases on a per-type basis
691 //
692 SYMCRYPT_MOD_CALL( pmMod ) modSetPost( pmMod, peDst, pbScratch, cbScratch );
693}

Referenced by SymCryptModElementSetValueNegUint32().

◆ SymCryptFdefModElementSetValueUint32Generic()

VOID SYMCRYPT_CALL SymCryptFdefModElementSetValueUint32Generic ( UINT32  value,
_In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 637 of file fdef_mod.c.

643{
644 UINT32 nDigits = pmMod->nDigits;
645
647
648 if( pmMod->Divisor.nBits <= 32 && value >= SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int )[0] )
649 {
650 // The value is >= the modulus; this is not supported
651
652 // For now do a possibly non-sidechannel safe, but mathematically correct modulo operation
653 value %= SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int )[0];
654 }
655
656 peDst->d.uint32[0] = value;
657
658 SymCryptWipe( &peDst->d.uint32[1], nDigits * SYMCRYPT_FDEF_DIGIT_SIZE - sizeof( UINT32 ) );
659}

Referenced by SymCryptFdefModInvGeneric(), and SymCryptModElementSetValueUint32().

◆ SymCryptFdefModElementToIntGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModElementToIntGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_reads_bytes_(pmMod->nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  pSrc,
_Out_ PSYMCRYPT_INT  piDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 428 of file fdef_mod.c.

435{
436 memcpy( SYMCRYPT_FDEF_INT_PUINT32( piDst ), pSrc, pmMod->nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
437
438 SymCryptWipe( &SYMCRYPT_FDEF_INT_PUINT32( piDst )[pmMod->nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32], (piDst->nDigits - pmMod->nDigits) * SYMCRYPT_FDEF_DIGIT_SIZE );
439
441}

Referenced by SymCryptFdefModInvGeneric(), and SymCryptModElementToInt().

◆ SymCryptFdefModElementWipe()

VOID SYMCRYPT_CALL SymCryptFdefModElementWipe ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

Definition at line 233 of file fdef_mod.c.

236{
237 SymCryptWipe( peDst, pmMod->cbModElement );
238}

Referenced by SymCryptFdefModElementFree(), and SymCryptModElementWipe().

◆ SymCryptFdefModInvGeneric()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvGeneric ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 960 of file fdef_mod.c.

967{
968 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
969 UINT32 nDigits = pmMod->nDigits;
970 UINT32 nBytes;
971 UINT32 c;
972 UINT32 leastSignificantUint32;
973 UINT32 trailingZeros;
974
975 //
976 // This function is called on Montgomery moduli so we can't directly call specifically optimized modular operations from here.
977 //
978 // For now we use dispatch functions with pmMod to perform potentially optimized modular operations.
979 // This approach makes sense when on average the cost of dispatch is less than the benefit using an optimized operation.
980 // The alternative is to make specialized ModInv routines for different types of moduli, but we do not yet do this to
981 // reduce code duplication / code size.
982 //
983
985
987 {
988 // Inversion over non-public or non-prime moduli currently not supported.
989 // Our blinding below only works for prime moduli.
990 // As the modulus cannot be blinded, it requires a fully side-channel safe algorithm which is much more complicated and
991 // slower.
992 // When this is necessary, we will add a second ModInv implementation for those cases.
993 scError = SYMCRYPT_INVALID_ARGUMENT;
994 goto cleanup;
995 }
996
997 //
998 // Algorithm:
999 // R = random nonzero value mod Mod
1000 // X := Src * R (mod Mod)
1001 // A = X
1002 // B = Mod
1003 // Va = 1
1004 // Vb = 0
1005 // invariant: A = Va*X (mod Mod), B = Vb*X (mod Mod),
1006 //
1007 // if( A == 0 ): error
1008 //
1009 // verify (A | B) is odd
1010 // if B even: swap (A,B), swap( Va, Vb)
1011 //
1012 // repeat:
1013 // while( A even ):
1014 // A /= 2; Va /= 2 (mod Mod)
1015 // if( A == 1 ): break1
1016 // (A, Va, B, Vb) = (B-A, Vb - Va, A, Va)
1017 // if( A == 0 ): error (not co-prime)
1018
1019 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
1020
1021 SYMCRYPT_ASSERT( cbScratch >= 4*nBytes );
1022 PSYMCRYPT_MODELEMENT peR = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
1023 pbScratch += nBytes;
1024 PSYMCRYPT_MODELEMENT peX = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
1025 pbScratch += nBytes;
1026 PSYMCRYPT_MODELEMENT peVa = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
1027 pbScratch += nBytes;
1028 PSYMCRYPT_MODELEMENT peVb = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
1029 pbScratch += nBytes;
1030 cbScratch -= 4*nBytes;
1031
1032 PSYMCRYPT_MODELEMENT peVtmpPtr;
1033
1034 nBytes = SymCryptSizeofIntFromDigits( nDigits );
1035 SYMCRYPT_ASSERT( cbScratch >= 3 * nBytes );
1036 PSYMCRYPT_INT piA = SymCryptIntCreate( pbScratch, nBytes, nDigits );
1037 pbScratch += nBytes;
1038 PSYMCRYPT_INT piB = SymCryptIntCreate( pbScratch, nBytes, nDigits );
1039 pbScratch += nBytes;
1040 PSYMCRYPT_INT piT = SymCryptIntCreate( pbScratch, nBytes, nDigits );
1041 pbScratch += nBytes;
1042 cbScratch -= 3*nBytes;
1043
1044 PSYMCRYPT_INT piTmpPtr;
1045
1047
1048 // If the data is not public, multiply by a random blinding factor; otherwise copy the value
1049 if( (flags & SYMCRYPT_FLAG_DATA_PUBLIC) == 0 )
1050 {
1052 SymCryptModMul( pmMod, peR, peSrc, peX, pbScratch, cbScratch ); // X = R * Src
1053 } else
1054 {
1055 SymCryptModElementCopy( pmMod, peSrc, peX );
1056 }
1057
1058 // Set up piA and piB
1059 SymCryptFdefModElementToIntGeneric( pmMod, &peX->d.uint32[0], piA, pbScratch, cbScratch ); // A = X
1060 SymCryptIntCopy( SymCryptIntFromModulus( (PSYMCRYPT_MODULUS) pmMod ), piB ); // B = Mod
1061
1062 // Reject if A = 0, B = 0, or A and B both even
1063 if( SymCryptIntIsEqualUint32( piA, 0 ) |
1064 SymCryptIntIsEqualUint32( piB, 0 ) |
1065 (((SymCryptIntGetValueLsbits32( piA ) | SymCryptIntGetValueLsbits32( piB )) & 1) ^ 1) )
1066 {
1067 scError = SYMCRYPT_INVALID_ARGUMENT;
1068 goto cleanup;
1069 }
1070
1071 if( SymCryptIntIsEqualUint32( piB, 2 ) )
1072 {
1073 // Mod = 2 is a valid input. Luckily, modular inversion is easy.
1074 // The rest of the code assumes that Mod is odd. Other even values are not prime.
1075 SymCryptModElementCopy( pmMod, peSrc, peDst);
1076 goto cleanup;
1077 }
1078
1079 SymCryptFdefModElementSetValueUint32Generic( 1, pmMod, peVa, pbScratch, cbScratch ); // Va = 1
1080 SymCryptFdefModElementSetValueUint32Generic( 0, pmMod, peVb, pbScratch, cbScratch ); // Vb = 0
1081
1082 for(;;)
1083 {
1084 // invariant: A = Va*X (mod Mod), B = Vb*X (mod Mod), A != 0, B > 1.
1085 // Remove factors of 2 from A. This loop terminates because A != 0
1086 leastSignificantUint32 = SymCryptIntGetValueLsbits32(piA);
1087 while( (leastSignificantUint32 & 1) == 0 )
1088 {
1089 trailingZeros = SymCryptCountTrailingZeros32( leastSignificantUint32 );
1090 SymCryptIntDivPow2( piA, trailingZeros, piA );
1091 SymCryptFdefModDivSmallPow2( pmMod, peVa, trailingZeros, peVa );
1092 leastSignificantUint32 = SymCryptIntGetValueLsbits32(piA);
1093 }
1094
1095 if( SymCryptIntIsEqualUint32( piA, 1 ) )
1096 {
1097 // A = 1 = Va * X (mod Mod), so Va is the inverse of X
1098 break;
1099 }
1100
1101 c = SymCryptIntSubSameSize( piB, piA, piT );
1102
1103 // If A != 1 and A=B, then A is the GCD of the original inputs, and there is no inverse
1104 if( SymCryptIntIsEqualUint32( piT, 0 ) )
1105 {
1106 scError = SYMCRYPT_INVALID_ARGUMENT;
1107 goto cleanup;
1108 }
1109
1110 if( c == 0 )
1111 {
1112 // B > A, we set B to B-A and swap (B,A)
1113 // that way we continue our halving on B-A
1114
1115 SymCryptIntCopy( piT, piB );
1116 SymCryptModSub( pmMod, peVb, peVa, peVb, pbScratch, cbScratch );
1117
1118 piTmpPtr = piB; piB = piA; piA = piTmpPtr;
1119 peVtmpPtr = peVb; peVb = peVa; peVa = peVtmpPtr;
1120 } else {
1121 // B < A, Set A to A-B and continue halving A
1122 SymCryptIntNeg( piT, piA );
1123 SymCryptModSub( pmMod, peVa, peVb, peVa, pbScratch, cbScratch );
1124 }
1125 }
1126
1127 // 1 = A = Va * X (mod Mod), so Va is the inverse of X
1128 // Check computation that we can test in the debugger
1129 SymCryptModMul( pmMod, peVa, peX, peVb, pbScratch, cbScratch );
1130
1131 // Actual answer
1132
1133 // If the data is not public, multiply by the random blinding factor; otherwise copy the value
1134 if( (flags & SYMCRYPT_FLAG_DATA_PUBLIC) == 0 )
1135 {
1136 SymCryptModMul( pmMod, peVa, peR, peDst, pbScratch, cbScratch );
1137 } else
1138 {
1139 SymCryptModElementCopy( pmMod, peVa, peDst );
1140 }
1141
1142cleanup:
1143 return scError;
1144}
VOID SYMCRYPT_CALL SymCryptFdefModElementToIntGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_reads_bytes_(pmMod->nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:428
VOID SYMCRYPT_CALL SymCryptFdefModElementSetValueUint32Generic(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:637
FORCEINLINE UINT32 SymCryptCountTrailingZeros32(UINT32 value)
Definition: sc_lib.h:5020
SYMCRYPT_MODULUS * PSYMCRYPT_MODULUS
VOID SYMCRYPT_CALL SymCryptIntNeg(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:344
UINT32 SYMCRYPT_CALL SymCryptIntGetValueLsbits32(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:270
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:658
VOID SYMCRYPT_CALL SymCryptIntDivPow2(_In_ PCSYMCRYPT_INT piSrc, SIZE_T exp, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:364
VOID SYMCRYPT_CALL SymCryptModSub(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:852
VOID SymCryptModElementCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: a_dispatch.c:683
#define SYMCRYPT_FLAG_MODULUS_PRIME
VOID SYMCRYPT_CALL SymCryptModMul(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:867
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODINV(_nDigits)

Referenced by SymCryptFdefModInvMontgomery().

◆ SymCryptFdefModInvMontgomery()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1440 of file fdef_mod.c.

1447{
1448 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1449 UINT32 nDigits = pmMod->nDigits;
1450 UINT32 nBytes = nDigits * SYMCRYPT_FDEF_DIGIT_SIZE;
1451 PUINT32 pTmp = (PUINT32) pbScratch;
1452
1454
1455 //
1456 // We have R*X; we first apply the montgomery reduction twice to get X/R, and then invert that
1457 // using the generic inversion to get R/X.
1458 //
1459 SYMCRYPT_ASSERT( cbScratch >= 2 * nBytes );
1460 memcpy( pTmp, &peSrc->d.uint32[0], nBytes );
1461
1462 SymCryptWipe( (PBYTE)pTmp + nBytes, nBytes );
1463 SymCryptFdefMontgomeryReduce( pmMod, pTmp, pTmp );
1464
1465 SymCryptWipe( (PBYTE)pTmp + nBytes, nBytes );
1466 SymCryptFdefMontgomeryReduce( pmMod, pTmp, &peDst->d.uint32[0] );
1467
1468 scError = SymCryptFdefModInvGeneric( pmMod, peDst, peDst, flags, pbScratch, cbScratch );
1469
1470 return scError;
1471}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:960
VOID SymCryptFdefMontgomeryReduce(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_updates_(2 *pmMod->nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pSrc, _Out_writes_(pmMod->nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
Definition: fdef_mod.c:1239

◆ SymCryptFdefModInvMontgomery256()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvMontgomery256 ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModMulGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModMulGeneric ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 909 of file fdef_mod.c.

916{
917 UINT32 nDigits = pmMod->nDigits;
918 PUINT32 pTmp = (PUINT32) pbScratch;
919 UINT32 scratchOffset = 2 * nDigits * SYMCRYPT_FDEF_DIGIT_SIZE;
920
924 SYMCRYPT_ASSERT_ASYM_ALIGNED( pbScratch );
925
926 // Tmp space is enough for the product plus the DivMod scratch
927
928 SymCryptFdefRawMul( &peSrc1->d.uint32[0], nDigits, &peSrc2->d.uint32[0], nDigits, pTmp );
929
930 SymCryptFdefRawDivMod( pTmp, 2*nDigits, &pmMod->Divisor, NULL, &peDst->d.uint32[0], pbScratch + scratchOffset, cbScratch - scratchOffset );
931}
#define SYMCRYPT_FDEF_SCRATCH_BYTES_FOR_INT_DIVMOD(_nSrcDigits, _nDivisorDigits)

◆ SymCryptFdefModMulMontgomery()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1316 of file fdef_mod.c.

1323{
1324 UINT32 nDigits = pmMod->nDigits;
1325 PUINT32 pTmp = (PUINT32) pbScratch;
1326
1327 // dcl - missing assert?
1330
1331 SymCryptFdefRawMul( &peSrc1->d.uint32[0], nDigits, &peSrc2->d.uint32[0], nDigits, pTmp );
1332 SymCryptFdefMontgomeryReduce( pmMod, pTmp, &peDst->d.uint32[0] );
1333}

◆ SymCryptFdefModMulMontgomery256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomery256Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModMulMontgomeryMulx()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModMulMontgomeryMulx1024()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx1024 ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModMulMontgomeryMulx256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulx256Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModMulMontgomeryMulxP384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryMulxP384Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModMulMontgomeryP384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModMulMontgomeryP384Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModNegGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModNegGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 609 of file fdef_mod.c.

615{
616 UINT32 nDigits = pmMod->nDigits;
617 UINT32 isZero;
618 UINT32 i;
619
621
622 //
623 // We have to be careful to handle the value 0 properly as it does NOT map to Modulus - Value.
624 //
625 isZero = SymCryptFdefRawIsEqualUint32( &peSrc->d.uint32[0], nDigits , 0 );
626 SymCryptFdefRawSub( SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), &peSrc->d.uint32[0], &peDst->d.uint32[0], nDigits );
627
628 // Now we set the result to zero if the input was zero
629 for( i=0; i< nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32; i++ )
630 {
631 peDst->d.uint32[i] &= ~isZero;
632 }
633}

◆ SymCryptFdefModPreGetGeneric()

PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 368 of file fdef_mod.c.

373{
374 UNREFERENCED_PARAMETER( pmMod );
375 UNREFERENCED_PARAMETER( pbScratch );
377
378 return &peObj->d.uint32[0];
379}

◆ SymCryptFdefModPreGetMontgomery()

PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1282 of file fdef_mod.c.

1287{
1288 PUINT32 pTmp = (PUINT32) pbScratch;
1289 UINT32 nDigits = pmMod->nDigits;
1290
1291 // dcl - this should not incur significant cost, consider checking always
1294
1295 memcpy( pTmp, &peObj->d.uint32[0], nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
1297 SymCryptFdefMontgomeryReduce( pmMod, pTmp, pTmp );
1298
1299 return pTmp;
1300}

◆ SymCryptFdefModPreGetMontgomery256()

PCUINT32 SYMCRYPT_CALL SymCryptFdefModPreGetMontgomery256 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModSetPostGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModSetPostGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 354 of file fdef_mod.c.

359{
360 UNREFERENCED_PARAMETER( pmMod );
361 UNREFERENCED_PARAMETER( peObj );
362 UNREFERENCED_PARAMETER( pbScratch );
364}

◆ SymCryptFdefModSetPostMontgomery()

VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomery ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1261 of file fdef_mod.c.

1266{
1267 // Montgomery representation for X is R*X mod M where R = 2^<nDigits * bits-per-digit>
1268 // Montgomery reduction performs an implicit division by R
1269 // This function converts to the internal representation by multiplying by R^2 mod M and then performing a Montgomery reduction
1270 UINT32 nDigits = pmMod->nDigits;
1271
1272 // dcl - this should not incur significant cost, consider checking always
1275
1276 SymCryptFdefRawMul( &peObj->d.uint32[0], nDigits, pmMod->tm.montgomery.Rsqr, nDigits, (PUINT32) pbScratch );
1277 SymCryptFdefMontgomeryReduce( pmMod, (PUINT32) pbScratch, &peObj->d.uint32[0] );
1278}

◆ SymCryptFdefModSetPostMontgomeryMulx256()

VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulx256 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModSetPostMontgomeryMulxP384()

VOID SYMCRYPT_CALL SymCryptFdefModSetPostMontgomeryMulxP384 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PSYMCRYPT_MODELEMENT  peObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModSetRandomGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModSetRandomGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 703 of file fdef_mod.c.

709{
711 UINT32 ulimit;
712 UINT32 nDigits = pmMod->nDigits;
713 PUINT32 pTmp = (PUINT32) pbScratch;
714 UINT32 nUsedBytes;
715 UINT32 mask;
716 UINT32 c;
717 UINT32 cntr;
718 PUINT32 pDst = &peDst->d.uint32[0];
719 PCUINT32 pMod = SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int );
720
722
724 {
725 // SYMCRYPT_FLAG_MODRANDOM_ALLOW_ZERO => SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE
726 offset = 0;
727 } else if( (flags & SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE) != 0 )
728 {
729 offset = 1;
730 } else
731 {
732 offset = 2;
733 }
734
736 {
737 ulimit = 0;
738 } else {
739 ulimit = 1;
740 }
741
742 //
743 // Special case for small divisors:
744 // When the divisor is 1, 2, or 3 we always allow returning -1
745 // We may also allow returning 1 or 0 depending on the flags specified
746 if ( pmMod->Divisor.nBits < 3 )
747 {
748 // At a minimum, allow -1
749 offset = SYMCRYPT_MIN(offset, pMod[0] - 1);
750 ulimit = 0;
751 }
752
753 // Set pTmp to pMod-(offset+ulimit)
755 c = SymCryptFdefRawSubUint32( pMod, offset + ulimit, pTmp, nDigits );
756 SYMCRYPT_ASSERT( c == 0 );
757
758 nUsedBytes = (pmMod->Divisor.nBits + 7)/8;
759 mask = 0x100 >> ( (8-pmMod->Divisor.nBits) & 7);
760 mask -= 1;
761
762 // Wipe any bytes we won't fill with random
763 SymCryptWipe( (PBYTE)pDst + nUsedBytes, (nDigits * SYMCRYPT_FDEF_DIGIT_SIZE) - nUsedBytes );
764
765 for(cntr=0; cntr<FDEF_MOD_SET_RANDOM_GENERIC_LIMIT; cntr++)
766 {
767 // Try random values until we get one we like
768 SymCryptCallbackRandom( (PBYTE)pDst, nUsedBytes );
769 ((PBYTE)pDst)[nUsedBytes-1] &= (BYTE) mask;
770
771 // Compare value to pMod-(offset+ulimit)
772 if( SymCryptFdefRawIsLessThan( pDst, pTmp, nDigits ) )
773 {
774 // The value is within required range [0, Divisor-offset-ulimit)
775 break;
776 }
777 }
778
779 // Wipe all the digits in pTmp
780 SymCryptWipe( pTmp, nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
781
783 {
784 SymCryptFatal( 'rndc');
785 }
786
787 // Add the offset which allows us to avoid 0 and/or 1 if required.
788 // Now result is in range [offset, Divisor-ulimit)
789 c = SymCryptFdefRawAddUint32( pDst, offset, pDst, nDigits );
790 SYMCRYPT_ASSERT( c == 0 );
791}
#define FDEF_MOD_SET_RANDOM_GENERIC_LIMIT
Definition: fdef_mod.c:699
GLintptr offset
Definition: glext.h:5920
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
Definition: implglue.c:56
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_ZERO

Referenced by SymCryptModSetRandom().

◆ SymCryptFdefModSquareGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModSquareGeneric ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 935 of file fdef_mod.c.

941{
942 UINT32 nDigits = pmMod->nDigits;
943 PUINT32 pTmp = (PUINT32) pbScratch;
944 UINT32 scratchOffset = 2 * nDigits * SYMCRYPT_FDEF_DIGIT_SIZE;
945
949 SYMCRYPT_ASSERT_ASYM_ALIGNED( pbScratch );
950
951 // Tmp space is enough for the product plus the DivMod scratch
952
953 SymCryptFdefRawSquare( &peSrc->d.uint32[0], nDigits, pTmp );
954
955 SymCryptFdefRawDivMod( pTmp, 2*nDigits, &pmMod->Divisor, NULL, &peDst->d.uint32[0], pbScratch + scratchOffset, cbScratch - scratchOffset );
956}

◆ SymCryptFdefModSquareMontgomery()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1380 of file fdef_mod.c.

1386{
1387 UINT32 nDigits = pmMod->nDigits;
1388 PUINT32 pTmp = (PUINT32) pbScratch;
1389
1392
1393 SymCryptFdefRawSquare( &peSrc->d.uint32[0], nDigits, pTmp );
1394 SymCryptFdefMontgomeryReduce( pmMod, pTmp, &peDst->d.uint32[0] );
1395}

◆ SymCryptFdefModSquareMontgomery256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomery256Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModSquareMontgomeryMulx()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModSquareMontgomeryMulx1024()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx1024 ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModSquareMontgomeryMulx256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulx256Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModSquareMontgomeryMulxP384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryMulxP384Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModSquareMontgomeryP384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSquareMontgomeryP384Asm ( _In_ PCSYMCRYPT_MODULUS  pMod,
_In_ PCSYMCRYPT_MODELEMENT  pSrc1,
_In_ PCSYMCRYPT_MODELEMENT  pSrc2,
_Out_ PSYMCRYPT_MODELEMENT  pDst 
)

◆ SymCryptFdefModSub256Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSub256Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModSub384Asm()

VOID SYMCRYPT_CALL SymCryptFdefModSub384Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst 
)

◆ SymCryptFdefModSubGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModSubGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_ PCSYMCRYPT_MODELEMENT  peSrc1,
_In_ PCSYMCRYPT_MODELEMENT  peSrc2,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 584 of file fdef_mod.c.

591{
592 UINT32 c;
593 UINT32 d;
594 UINT32 nDigits = pmMod->nDigits;
595
598
599 c = SymCryptFdefRawSub( &peSrc1->d.uint32[0], &peSrc2->d.uint32[0], &peDst->d.uint32[0], nDigits );
600 d = SymCryptFdefRawAdd( &peDst->d.uint32[0], SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), (PUINT32) pbScratch, nDigits );
601 SymCryptFdefMaskedCopy( pbScratch, (PBYTE) &peDst->d.uint32[0], nDigits, 0 - c );
602
603 SYMCRYPT_ASSERT( !(c == 1 && d == 0) );
604}

◆ SymCryptFdefModulusAllocate()

PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusAllocate ( UINT32  nDigits)

Definition at line 11 of file fdef_mod.c.

12{
13 PVOID p = NULL;
14 UINT32 cb;
16
17 //
18 // The nDigits requirements are enforced by SymCryptFdefSizeofModulusFromDigits. Thus
19 // the result does not overflow and is upper bounded by 2^19.
20 //
22
23 if( cb != 0 )
24 {
26 }
27
28 if( p == NULL )
29 {
30 goto cleanup;
31 }
32
33 res = SymCryptFdefModulusCreate( p, cb, nDigits );
34
36 return res;
37}
PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: fdef_mod.c:67
UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModulusFromDigits(UINT32 nDigits)
Definition: fdef_mod.c:49

Referenced by SymCryptModulusAllocate().

◆ SymCryptFdefModulusCopy()

VOID SymCryptFdefModulusCopy ( _In_ PCSYMCRYPT_MODULUS  pmSrc,
_Out_ PSYMCRYPT_MODULUS  pmDst 
)

Definition at line 124 of file fdef_mod.c.

127{
128 SYMCRYPT_ASSERT( pmSrc->nDigits == pmDst->nDigits );
129
130 if( pmSrc != pmDst )
131 {
132 memcpy( pmDst, pmSrc, pmDst->cbSize );
133
134 SymCryptFdefDivisorCopyFixup( &pmSrc->Divisor, &pmDst->Divisor );
135
136 // Copy the type-specific fields
137 SYMCRYPT_MOD_CALL( pmSrc ) modulusCopyFixup( pmSrc, pmDst );
138
139 SYMCRYPT_SET_MAGIC( pmDst );
140 }
141}

Referenced by SymCryptModulusCopy().

◆ SymCryptFdefModulusCopyFixupGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupGeneric ( _In_ PCSYMCRYPT_MODULUS  pmSrc,
_Out_ PSYMCRYPT_MODULUS  pmDst 
)

Definition at line 145 of file fdef_mod.c.

148{
149 // Only have to handle the type-specific fields, which we don't have any of.
150 UNREFERENCED_PARAMETER( pmSrc );
151 UNREFERENCED_PARAMETER( pmDst );
152}

◆ SymCryptFdefModulusCopyFixupMontgomery()

VOID SYMCRYPT_CALL SymCryptFdefModulusCopyFixupMontgomery ( _In_ PCSYMCRYPT_MODULUS  pmSrc,
_Out_ PSYMCRYPT_MODULUS  pmDst 
)

Definition at line 1304 of file fdef_mod.c.

1307{
1308 // We only have to fix up the Montgomery-specific stuff here
1309 // dcl - not sure I understand why you pass pmSrc here
1310 UNREFERENCED_PARAMETER( pmSrc );
1311 pmDst->tm.montgomery.Rsqr = (PUINT32)((PBYTE)&pmDst->Divisor + SymCryptFdefSizeofDivisorFromDigits( pmDst->nDigits ));
1312}

◆ SymCryptFdefModulusCreate()

PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
SIZE_T  cbBuffer,
UINT32  nDigits 
)

Definition at line 67 of file fdef_mod.c.

71{
72 PSYMCRYPT_MODULUS pmMod = NULL;
74
76
79 if( (cb == 0) || (cbBuffer < cb) )
80 {
81 goto cleanup; // return NULL
82 }
83
85 pmMod = (PSYMCRYPT_MODULUS) pbBuffer;
86
87 pmMod->type = 'gM' << 16;
88 pmMod->nDigits = nDigits;
89
90 //
91 // The nDigits requirements are enforced by SymCryptFdefSizeofModulusFromDigits. Thus
92 // the result does not overflow and is upper bounded by 2^19.
93 //
94 pmMod->cbSize = cb;
95 pmMod->flags = 0;
96
97 // The following is bounded by 2^17
98 pmMod->cbModElement = nDigits * SYMCRYPT_FDEF_DIGIT_SIZE;
99
100 SymCryptFdefDivisorCreate( pbBuffer + offset, cbBuffer - offset, nDigits );
101
102 // We don't have a modulus value yet, so we don't create/initialize any implementation-specific things.
103
104 SYMCRYPT_SET_MAGIC( pmMod );
105
106cleanup:
107 return pmMod;
108}
struct _SYMCRYPT_MODULUS SYMCRYPT_MODULUS
_In_ LARGE_INTEGER Divisor
Definition: rtlfuncs.h:3068

Referenced by SymCryptFdefModulusAllocate(), and SymCryptModulusCreate().

◆ SymCryptFdefModulusFree()

VOID SYMCRYPT_CALL SymCryptFdefModulusFree ( _Out_ PSYMCRYPT_MODULUS  pmObj)

Definition at line 41 of file fdef_mod.c.

42{
43 SymCryptModulusWipe( pmObj );
44 SymCryptCallbackFree( pmObj );
45}
VOID SYMCRYPT_CALL SymCryptModulusWipe(_Out_ PSYMCRYPT_MODULUS pmObj)
Definition: a_dispatch.c:618

Referenced by SymCryptModulusFree().

◆ SymCryptFdefModulusInitGeneric()

VOID SYMCRYPT_CALL SymCryptFdefModulusInitGeneric ( _Inout_ PSYMCRYPT_MODULUS  pmObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 112 of file fdef_mod.c.

116{
117 UNREFERENCED_PARAMETER( pmMod );
118 UNREFERENCED_PARAMETER( pbScratch );
120}

◆ SymCryptFdefModulusInitMontgomery()

VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery ( _Inout_ PSYMCRYPT_MODULUS  pmObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1191 of file fdef_mod.c.

1195{
1197}
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomeryInternal(_Inout_ PSYMCRYPT_MODULUS pmMod, UINT32 nUint32Used, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1152

◆ SymCryptFdefModulusInitMontgomery256()

VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomery256 ( _Inout_ PSYMCRYPT_MODULUS  pmObj,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptFdefModulusInitMontgomeryInternal()

VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomeryInternal ( _Inout_ PSYMCRYPT_MODULUS  pmObj,
UINT32  nUint32Used,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1152 of file fdef_mod.c.

1157{
1158 // Scratch space is big enough for an nDigit+1 byte value + sufficient divmod scratch
1159 PUINT32 pR2;
1160 UINT32 cbR2;
1161 UINT32 nDigits;
1162
1163 PUINT32 modR2;
1164 PUINT32 negDivisor;
1165
1166 nDigits = pmMod->nDigits;
1167 modR2 = (PUINT32)((PBYTE)&pmMod->Divisor + SymCryptFdefSizeofDivisorFromDigits( nDigits ));
1168
1169 SYMCRYPT_ASSERT_ASYM_ALIGNED( pbScratch );
1170
1171 pmMod->tm.montgomery.Rsqr = modR2;
1172 negDivisor = (PUINT32)((PBYTE)modR2 + (nDigits * SYMCRYPT_FDEF_DIGIT_SIZE));
1173
1174 // We pre-compute R^2 mod M
1175
1176 pR2 = (PUINT32) pbScratch;
1177 cbR2 = (2*nDigits + 1) * SYMCRYPT_FDEF_DIGIT_SIZE;
1178 SYMCRYPT_ASSERT( cbScratch >= cbR2 );
1179 SYMCRYPT_ASSERT( cbScratch >= 2 * nUint32Used * sizeof(UINT32) );
1180
1181 // Set it to R^2
1182 SymCryptWipe( pR2, cbR2 );
1183 pR2[ 2 * nUint32Used ] = 1;
1184 SymCryptFdefRawDivMod( pR2, 2*nDigits + 1, &pmMod->Divisor, NULL, modR2, pbScratch + cbR2, cbScratch - cbR2 );
1185
1186 SymCryptFdefRawNeg( SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), 0, negDivisor, nDigits );
1187}
static double pR2[6]
Definition: j0_y0.c:326

Referenced by SymCryptFdefModulusInitMontgomery().

◆ SymCryptFdefModulusRetrieveHandle()

PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptFdefModulusRetrieveHandle ( _In_ PBYTE  pbBuffer)

◆ SymCryptFdefMontgomeryReduce1024Asm()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce1024Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefMontgomeryReduce256Asm()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce256Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefMontgomeryReduce512Asm()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduce512Asm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefMontgomeryReduceAsm()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceAsm ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefMontgomeryReduceMulx()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceMulx ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefMontgomeryReduceMulx1024()

VOID SYMCRYPT_CALL SymCryptFdefMontgomeryReduceMulx1024 ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_Inout_ PUINT32  pSrc,
_Out_ PUINT32  pDst 
)

◆ SymCryptFdefNumberofDigitsFromInt()

UINT32 SYMCRYPT_CALL SymCryptFdefNumberofDigitsFromInt ( _In_ PCSYMCRYPT_INT  piSrc)

Definition at line 337 of file fdef_general.c.

338{
339 return piSrc->nDigits;
340}

◆ SymCryptFdefRawAdd()

Definition at line 45 of file fdef_int.c.

50{
51#if SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_ARM
52 return SymCryptFdefRawAddAsm( pSrc1, pSrc2, pDst, nDigits );
53#else
54 return SymCryptFdefRawAddC( pSrc1, pSrc2, pDst, nDigits );
55#endif
56}
UINT32 SYMCRYPT_CALL SymCryptFdefRawAddC(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:23
UINT32 SYMCRYPT_CALL SymCryptFdefRawAddAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)

Referenced by SymCryptFdefIntAddMixedSize(), SymCryptFdefIntAddSameSize(), SymCryptFdefModAddGeneric(), and SymCryptFdefModSubGeneric().

◆ SymCryptFdefRawAddAsm()

◆ SymCryptFdefRawAddUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefRawAddUint32 ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  Src1,
UINT32  Src2,
_Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32  Dst,
UINT32  nDigits 
)

Definition at line 61 of file fdef_int.c.

66{
67 UINT32 i;
68 UINT64 t;
69
70 t = Src2;
71 for( i=0; i<nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32; i++ )
72 {
73 t = t + Src1[i];
74 Dst[i] = (UINT32) t;
75 t >>= 32;
76 }
77
78 return (UINT32) t;
79}
#define Dst
Definition: mesh.h:153

Referenced by SymCryptFdefIntAddMixedSize(), SymCryptFdefIntAddUint32(), and SymCryptFdefModSetRandomGeneric().

◆ SymCryptFdefRawDivMod()

VOID SYMCRYPT_CALL SymCryptFdefRawDivMod ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pNum,
UINT32  nDigits,
_In_ PCSYMCRYPT_DIVISOR  pdDivisor,
_Out_writes_opt_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pQuotient,
_Out_writes_opt_(SYMCRYPT_OBJ_NUINT32(pdDivisor)) PUINT32  pRemainder,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 1106 of file fdef_int.c.

1114{
1115 UINT32 nWords = nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
1116 UINT32 activeDivWords = (pdDivisor->nBits + 8 * sizeof(UINT32) - 1) / (8 * sizeof( UINT32 ) );
1117 UINT32 remainderWords = SYMCRYPT_OBJ_NUINT32( pdDivisor );
1118
1119 UINT32 cbScratchNeeded = (nWords+4) * sizeof( UINT32 );
1120 PUINT32 pTmp = (PUINT32) pbScratch;
1121 UINT32 Qest;
1122 UINT32 Q;
1123 UINT32 c;
1124 UINT32 d;
1125 UINT32 shift;
1126 UINT32 X0, X1;
1127 UINT32 W;
1128 UINT64 T;
1129 UINT32 nQ;
1130
1131 SYMCRYPT_ASSERT( cbScratch >= cbScratchNeeded );
1132 SYMCRYPT_ASSERT_ASYM_ALIGNED( pbScratch );
1133
1134 if( nWords < activeDivWords )
1135 {
1136 //
1137 // input is smaller in size than the significant size of the divisor, no division to do.
1138 // Note that both values in the if() statement are public, so this does not create a side channel.
1139 //
1140
1141 // Set quotient to zero, and the remainder to the input value
1142 if( pQuotient != NULL )
1143 {
1144 SymCryptWipe( pQuotient, nDigits * SYMCRYPT_FDEF_DIGIT_SIZE );
1145 }
1146
1147 if( pRemainder != NULL )
1148 {
1149 SYMCRYPT_ASSERT( remainderWords >= nWords );
1150 memcpy( pRemainder, pNum, nWords * sizeof( UINT32 ) );
1151 SymCryptWipe( &pRemainder[nWords], (remainderWords - nWords) * sizeof( UINT32 ) ); // clear the rest of the remainder words
1152 }
1153
1154 SymCryptFdefClaimScratch( pbScratch, cbScratch, cbScratchNeeded );
1155 goto cleanup;
1156 }
1157
1158 //
1159 // We have two zero words in front and two zero words behind the tmp value to allow unrestricted accesses.
1160 // We keep the explicit offset of 2 rather than adjust the pTmp pointer to avoid negative indexes which appear
1161 // to be buffer overflows, and cause trouble with unsigned computations of negative index values that overflow
1162 // to 2^32 - 1 on a 64-bit CPU.
1163 //
1164 pTmp[0] = pTmp[1] = 0;
1165 memcpy( &pTmp[2], pNum, nWords * sizeof( UINT32 ) );
1166 pTmp[nWords + 2] = pTmp[nWords + 3] = 0;
1167 shift = (0 - pdDivisor->nBits) & 31; // # bits we have to shift top words to the left to align with the W value
1168
1169 // We generate the quotient words one at a time, starting at the most significant position
1170 // The top (divWords - 1) words are always zero
1171
1172 if( pQuotient != NULL )
1173 {
1174 SymCryptWipe( &pQuotient[nWords - activeDivWords + 1], (activeDivWords - 1) * sizeof( UINT32 ) );
1175 }
1176
1177 nQ = nWords - activeDivWords + 1;
1178
1179 // There is always at least one word of Q to be computed, so we can use a do-while loop which
1180 // also avoids the UINT32 underflow.
1181 do
1182 {
1183 nQ--;
1184 X0 = ( ((UINT64) pTmp[nQ + activeDivWords + 2] << 32) + pTmp[nQ + activeDivWords + 1] ) >> (32 - shift);
1185 X1 = ( ((UINT64) pTmp[nQ + activeDivWords + 1] << 32) + pTmp[nQ + activeDivWords + 0] ) >> (32 - shift);
1186
1187 W = (UINT32) pdDivisor->td.fdef.W;
1188 T = SYMCRYPT_MUL32x32TO64( W, X0 ) + (((UINT64)X0) << 32) + X1 + ((W>>1) & ((UINT32)0 - (X1 >> 31)));
1189 Qest = (UINT32)(T >> 32);
1190 // At this point the estimator is correct or one too small, add one but don't overflow
1191 Qest += 1;
1192 Qest += SYMCRYPT_MASK32_ZERO( Qest );
1193
1194 c = SymCryptFdefRawMultSubUint32( &pTmp[nQ+2], SYMCRYPT_FDEF_INT_PUINT32( &pdDivisor->Int ), Qest, activeDivWords );
1195 Q = Qest - c;
1196 d = SymCryptFdefRawMaskedAddSubdigit( &pTmp[nQ+2], SYMCRYPT_FDEF_INT_PUINT32( &pdDivisor->Int ), (0-c), activeDivWords );
1197 SYMCRYPT_ASSERT( c == d );
1198 SYMCRYPT_ASSERT( pTmp[nQ + activeDivWords+2] == (0 - c) );
1199
1200 if( pQuotient != NULL )
1201 {
1202 pQuotient[nQ] = Q;
1203 }
1204 } while( nQ > 0 );
1205
1206 if( pRemainder != NULL )
1207 {
1208 memcpy( pRemainder, pTmp+2, activeDivWords * sizeof( UINT32 ) );
1209 SymCryptWipe( &pRemainder[activeDivWords], (remainderWords - activeDivWords) * sizeof( UINT32 ) );
1210 }
1211
1212cleanup:
1213 return; // label needs a statement to follow it...
1214}
UINT32 SYMCRYPT_CALL SymCryptFdefRawMaskedAddSubdigit(_Inout_updates_(nUint32) PUINT32 pAcc, _In_reads_(nUint32) PCUINT32 pSrc, UINT32 mask, UINT32 nUint32)
Definition: fdef_int.c:1048
UINT32 SYMCRYPT_CALL SymCryptFdefRawMultSubUint32(_Inout_updates_(nUint32+1) PUINT32 pAcc, _In_reads_(nUint32) PCUINT32 pSrc1, UINT32 Src2, UINT32 nUint32)
Definition: fdef_int.c:1008
#define shift
Definition: input.c:3280
#define T(num)
Definition: thunks.c:311

Referenced by SymCryptFdefIntDivMod(), SymCryptFdefIntToModElement(), SymCryptFdefModElementSetValueGeneric(), SymCryptFdefModMulGeneric(), SymCryptFdefModSquareGeneric(), and SymCryptFdefModulusInitMontgomeryInternal().

◆ SymCryptFdefRawGetValue()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawGetValue ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_bytes_(cbDst) PBYTE  pbDst,
SIZE_T  cbDst,
SYMCRYPT_NUMBER_FORMAT  format 
)

Definition at line 619 of file fdef_general.c.

625{
626 SYMCRYPT_ERROR scError;
627 UINT32 b;
628 INT32 step;
629 UINT32 w;
630 UINT32 windex;
631 UINT32 i;
632 UINT32 nWords = nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
633
634 //
635 // This is a very simple and slow generic implementation;
636 // We'll create optimized versions for specific CPU platforms
637 // (e.g. use of memcpy)
638 //
639
640 switch( format )
641 {
643 step = 1;
644 break;
646 step = -1;
647 pbDst += cbDst; // avoid tripping pointer overflow sanitizer with cbSrc == 0
648 pbDst--;
649 break;
650 default:
651 scError = SYMCRYPT_INVALID_ARGUMENT;
652 goto cleanup;
653 }
654
655 for( windex = 0; windex < nWords; windex++ )
656 {
657 w = pSrc[windex];
658 for( i=0; i<4; i++ )
659 {
660 b = w & 0xff;
661 w >>= 8;
662
663 // write the next byte
664 if( cbDst > 0 )
665 {
666 *pbDst = (BYTE)b;
667 cbDst -= 1;
668 pbDst += step;
669 } else {
670 if( b != 0 )
671 {
672 scError = SYMCRYPT_BUFFER_TOO_SMALL;
673 goto cleanup;
674 }
675 }
676 }
677 }
678
679 // Zero any remaining output bytes
680 while( cbDst > 0 )
681 {
682 *pbDst = 0;
683 pbDst += step;
684 cbDst -= 1;
685 }
686
687 scError = SYMCRYPT_NO_ERROR;
688
689cleanup:
690 return scError;
691}
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
#define b
Definition: ke_i.h:79
@ SYMCRYPT_NUMBER_FORMAT_MSB_FIRST
Definition: symcrypt.h:7017
@ SYMCRYPT_NUMBER_FORMAT_LSB_FIRST
Definition: symcrypt.h:7016
int32_t INT32
Definition: typedefs.h:58

Referenced by SymCryptFdefDecideModulusType(), SymCryptFdefIntGetValue(), and SymCryptFdefModElementGetValue().

◆ SymCryptFdefRawIsEqualUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefRawIsEqualUint32 ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits,
_In_ UINT32  u32Src2 
)

Definition at line 730 of file fdef_general.c.

734{
735 UINT32 d;
736 UINT32 nWords = nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
737
738 d = pSrc1[0] ^ u32Src2;
739 for( UINT32 i=1; i<nWords; i++)
740 {
741 d |= pSrc1[i];
742 }
743
744 return SYMCRYPT_MASK32_ZERO( d );
745}

Referenced by SymCryptDlkeyGenerate(), SymCryptFdefIntIsEqualUint32(), and SymCryptFdefModNegGeneric().

◆ SymCryptFdefRawIsLessThan()

UINT32 SYMCRYPT_CALL SymCryptFdefRawIsLessThan ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  pSrc1,
_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  pSrc2,
UINT32  nDigits 
)

Definition at line 322 of file fdef_int.c.

326{
327#if 0 & SYMCRYPT_CPU_AMD64
328// return SymCryptFdefRawIsLessThanAsm( pSrc1, pSrc2, nDigits );
329#else
330 return SymCryptFdefRawIsLessThanC( pSrc1, pSrc2, nDigits );
331#endif
332}
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsLessThanC(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, UINT32 nDigits)
Definition: fdef_int.c:298

Referenced by SymCryptFdefIntIsLessThan(), and SymCryptFdefModSetRandomGeneric().

◆ SymCryptFdefRawMaskedAdd()

UINT32 SYMCRYPT_CALL SymCryptFdefRawMaskedAdd ( _Inout_updates_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pAcc,
_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  mask,
UINT32  nDigits 
)

Definition at line 1070 of file fdef_int.c.

1075{
1076 return SymCryptFdefRawMaskedAddSubdigit( pAcc, pSrc, mask, nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32 );
1077}

◆ SymCryptFdefRawMaskedSub()

UINT32 SYMCRYPT_CALL SymCryptFdefRawMaskedSub ( _Inout_updates_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pAcc,
_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  mask,
UINT32  nDigits 
)

Definition at line 1081 of file fdef_int.c.

1086{
1087 UINT32 i;
1088 UINT64 t;
1089 UINT32 c;
1090
1091 c = 0;
1092 for( i=0; i<nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32; i++ )
1093 {
1094 t = (UINT64) pAcc[i] - (mask & pSrc[i]) - c;
1095 pAcc[i] = (UINT32) t;
1096 c = (UINT32)(t >>= 32) & 1;
1097 }
1098
1099 return c;
1100}

◆ SymCryptFdefRawMul()

VOID SYMCRYPT_CALL SymCryptFdefRawMul ( _In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits1,
_In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits2,
_Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

Definition at line 773 of file fdef_int.c.

779{
780#if SYMCRYPT_CPU_AMD64
782 {
783 SymCryptFdefRawMulMulx( pSrc1, nDigits1, pSrc2, nDigits2, pDst );
784 } else {
785 SymCryptFdefRawMulAsm( pSrc1, nDigits1, pSrc2, nDigits2, pDst );
786 }
787#elif SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_ARM
788 SymCryptFdefRawMulAsm( pSrc1, nDigits1, pSrc2, nDigits2, pDst );
789#else
790 SymCryptFdefRawMulC( pSrc1, nDigits1, pSrc2, nDigits2, pDst );
791#endif
792}
VOID SYMCRYPT_CALL SymCryptFdefRawMulC(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
Definition: fdef_int.c:740
VOID SYMCRYPT_CALL SymCryptFdefRawMulMulx(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
VOID SYMCRYPT_CALL SymCryptFdefRawMulAsm(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)

Referenced by SymCryptFdefIntMulMixedSize(), SymCryptFdefModMulGeneric(), SymCryptFdefModMulMontgomery(), and SymCryptFdefModSetPostMontgomery().

◆ SymCryptFdefRawMul1024Asm()

VOID SYMCRYPT_CALL SymCryptFdefRawMul1024Asm ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawMul512Asm()

VOID SYMCRYPT_CALL SymCryptFdefRawMul512Asm ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawMulAsm()

VOID SYMCRYPT_CALL SymCryptFdefRawMulAsm ( _In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits1,
_In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits2,
_Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawMulMulx()

VOID SYMCRYPT_CALL SymCryptFdefRawMulMulx ( _In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
UINT32  nDigits1,
_In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits2,
_Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

Referenced by SymCryptFdefRawMul().

◆ SymCryptFdefRawMulMulx1024()

VOID SYMCRYPT_CALL SymCryptFdefRawMulMulx1024 ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc1,
_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc2,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawNeg()

UINT32 SYMCRYPT_CALL SymCryptFdefRawNeg ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  pSrc1,
UINT32  carryIn,
_Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32  pDst,
UINT32  nDigits 
)

Definition at line 213 of file fdef_int.c.

218{
219 UINT32 i;
220 UINT64 t;
221 UINT32 c;
222
223 c = carryIn;
224 for( i=0; i<nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32; i++ )
225 {
226 t = (UINT64)0 - pSrc1[i] - c;
227 pDst[i] = (UINT32) t;
228 c = (UINT32)(t >> 32) & 1;
229 }
230
231 return c;
232}

Referenced by SymCryptFdefIntNeg(), SymCryptFdefIntSubMixedSize(), and SymCryptFdefModulusInitMontgomeryInternal().

◆ SymCryptFdefRawSetValue()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefRawSetValue ( _In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
SYMCRYPT_NUMBER_FORMAT  format,
_Out_writes_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst,
UINT32  nDigits 
)

Definition at line 524 of file fdef_general.c.

530{
531 SYMCRYPT_ERROR scError;
532 UINT32 b;
533 INT32 step;
534 UINT32 w;
535 UINT32 windex;
536 UINT32 i;
537 UINT32 nWords = nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32;
538
539 //
540 // This is a very simple and slow generic implementation;
541 // We'll create optimized versions for specific CPU platforms
542 // (e.g. use of memcpy)
543 //
544
545 // I assume the number format is public?
546 switch( format )
547 {
549 step = 1;
550 break;
552 step = -1;
553 pbSrc += cbSrc; // avoid tripping pointer overflow sanitizer with cbSrc == 0
554 pbSrc--;
555 break;
556 default:
557 scError = SYMCRYPT_INVALID_ARGUMENT;
558 goto cleanup;
559 }
560
561 for( windex = 0; windex < nWords; windex++ )
562 {
563 w = 0;
564 for( i=0; i<4; i++ )
565 {
566 // read the next byte into b
567 if( cbSrc > 0 )
568 {
569 b = *pbSrc;
570 cbSrc -= 1;
571 pbSrc += step;
572 w |= b << 8*i;
573 }
574 }
575 pDst[windex] = w;
576 }
577
578 // Inspect any remaining input bytes
579 b = 0;
580 while( cbSrc > 0 )
581 {
582 b |= *pbSrc;
583 pbSrc += step;
584 cbSrc -= 1;
585 }
586
587 if( b > 0 )
588 {
589 scError = SYMCRYPT_BUFFER_TOO_SMALL;
590 goto cleanup;
591 }
592
593 scError = SYMCRYPT_NO_ERROR;
594
595cleanup:
596 return scError;
597}

Referenced by SymCryptFdefIntSetValue(), and SymCryptFdefModElementSetValueGeneric().

◆ SymCryptFdefRawSquare()

VOID SYMCRYPT_CALL SymCryptFdefRawSquare ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

Definition at line 866 of file fdef_int.c.

870{
871#if SYMCRYPT_CPU_AMD64
873 {
874 SymCryptFdefRawSquareMulx( pSrc, nDigits, pDst );
875 } else {
876 SymCryptFdefRawSquareAsm( pSrc, nDigits, pDst );
877 }
878#elif SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_ARM
879 SymCryptFdefRawSquareAsm( pSrc, nDigits, pDst );
880#elif SYMCRYPT_CPU_X86
881 SymCryptFdefRawMulAsm( pSrc, nDigits, pSrc, nDigits, pDst );
882#else
883 SymCryptFdefRawSquareC( pSrc, nDigits, pDst );
884#endif
885}
VOID SYMCRYPT_CALL SymCryptFdefRawSquareC(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
Definition: fdef_int.c:796
VOID SYMCRYPT_CALL SymCryptFdefRawSquareMulx(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
VOID SYMCRYPT_CALL SymCryptFdefRawSquareAsm(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc, UINT32 nDigits, _Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)

Referenced by SymCryptFdefIntSquare(), SymCryptFdefModSquareGeneric(), and SymCryptFdefModSquareMontgomery().

◆ SymCryptFdefRawSquare1024Asm()

VOID SYMCRYPT_CALL SymCryptFdefRawSquare1024Asm ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawSquare512Asm()

VOID SYMCRYPT_CALL SymCryptFdefRawSquare512Asm ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawSquareAsm()

VOID SYMCRYPT_CALL SymCryptFdefRawSquareAsm ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

Referenced by SymCryptFdefRawSquare().

◆ SymCryptFdefRawSquareMulx()

VOID SYMCRYPT_CALL SymCryptFdefRawSquareMulx ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

Referenced by SymCryptFdefRawSquare().

◆ SymCryptFdefRawSquareMulx1024()

VOID SYMCRYPT_CALL SymCryptFdefRawSquareMulx1024 ( _In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32  pSrc,
UINT32  nDigits,
_Out_writes_(2 *nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32  pDst 
)

◆ SymCryptFdefRawSub()

Definition at line 174 of file fdef_int.c.

179{
180#if SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM64 | SYMCRYPT_CPU_ARM
181 return SymCryptFdefRawSubAsm( pSrc1, pSrc2, pDst, nDigits );
182#else
183 return SymCryptFdefRawSubC( pSrc1, pSrc2, pDst, nDigits );
184#endif
185}
UINT32 SYMCRYPT_CALL SymCryptFdefRawSubC(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
Definition: fdef_int.c:150
UINT32 SYMCRYPT_CALL SymCryptFdefRawSubAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)

Referenced by SymCryptFdefIntSubMixedSize(), SymCryptFdefIntSubSameSize(), SymCryptFdefModAddGeneric(), SymCryptFdefModNegGeneric(), SymCryptFdefModSubGeneric(), and SymCryptFdefMontgomeryReduceC().

◆ SymCryptFdefRawSubAsm()

◆ SymCryptFdefRawSubUint32()

UINT32 SYMCRYPT_CALL SymCryptFdefRawSubUint32 ( _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32  pSrc1,
UINT32  Src2,
_Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32  pDst,
UINT32  nDigits 
)

Definition at line 190 of file fdef_int.c.

195{
196 UINT32 i;
197 UINT64 t;
198 UINT32 c;
199
200 c = Src2;
201 for( i=0; i<nDigits * SYMCRYPT_FDEF_DIGIT_NUINT32; i++ )
202 {
203 t = (UINT64)pSrc1[i] - c;
204 pDst[i] = (UINT32) t;
205 c = (UINT32)(t >> 32) & 1;
206 }
207
208 return c;
209}

Referenced by SymCryptFdefIntSubMixedSize(), SymCryptFdefIntSubUint32(), SymCryptFdefModElementSetValueNegUint32(), and SymCryptFdefModSetRandomGeneric().

◆ SymCryptFdefSizeofDivisorFromDigits()

UINT32 SYMCRYPT_CALL SymCryptFdefSizeofDivisorFromDigits ( UINT32  nDigits)

Definition at line 826 of file fdef_general.c.

827{
828 SYMCRYPT_ASSERT( nDigits != 0 );
830
831 // Ensure we do not overflow the following calculation when provided with invalid inputs
832 if( nDigits == 0 || nDigits > SYMCRYPT_FDEF_UPB_DIGITS )
833 {
834 return 0;
835 }
836
838}
#define SYMCRYPT_FDEF_UPB_DIGITS

Referenced by SymCryptFdefDivisorAllocate(), SymCryptFdefModulusCopyFixupMontgomery(), SymCryptFdefModulusInitMontgomeryInternal(), SymCryptFdefSizeofModulusFromDigits(), and SymCryptSizeofDivisorFromDigits().

◆ SymCryptFdefSizeofIntFromDigits()

UINT32 SYMCRYPT_CALL SymCryptFdefSizeofIntFromDigits ( UINT32  nDigits)

Definition at line 196 of file fdef_general.c.

197{
198 SYMCRYPT_ASSERT( nDigits != 0 );
200
201 // Ensure we do not overflow the following calculation when provided with invalid inputs
202 if( nDigits == 0 || nDigits > SYMCRYPT_FDEF_UPB_DIGITS )
203 {
204 return 0;
205 }
206
207 // Note: ti stands for 'Type-Int' and it helps catch type errors when type-casting macros are used.
209}
SYMCRYPT_MAGIC_FIELD SYMCRYPT_ASYM_ALIGN union @5237 ti

Referenced by SymCryptFdefIntAllocate(), SymCryptFdefIntCreate(), SymCryptFdefSizeofDivisorFromDigits(), and SymCryptSizeofIntFromDigits().

◆ SymCryptFdefSizeofModElementFromModulus()

UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModElementFromModulus ( PCSYMCRYPT_MODULUS  pmMod)

Definition at line 194 of file fdef_mod.c.

195{
196 // Upper bounded by 2^17 since the modulus is up to SYMCRYPT_INT_MAXBITS = 2^20 bits.
197 return pmMod->cbModElement;
198}

Referenced by SymCryptFdefModElementAllocate(), SymCryptFdefModElementCreate(), and SymCryptSizeofModElementFromModulus().

◆ SymCryptFdefSizeofModulusFromDigits()

UINT32 SYMCRYPT_CALL SymCryptFdefSizeofModulusFromDigits ( UINT32  nDigits)

Definition at line 49 of file fdef_mod.c.

50{
51 SYMCRYPT_ASSERT( nDigits != 0 );
53
54 // Ensure we do not overflow the following calculation when provided with invalid inputs
55 if( nDigits == 0 || nDigits > SYMCRYPT_FDEF_UPB_DIGITS )
56 {
57 return 0;
58 }
59
60 // Room for the Modulus structure, the Divisor, the negated divisor, and the R^2 Montgomery factor
61 //
63}

Referenced by SymCryptFdefModulusAllocate(), SymCryptFdefModulusCreate(), and SymCryptSizeofModulusFromDigits().

◆ SymCryptFixedWindowRecoding()

VOID SYMCRYPT_CALL SymCryptFixedWindowRecoding ( UINT32  W,
_Inout_ PSYMCRYPT_INT  piK,
_Inout_ PSYMCRYPT_INT  piTmp,
_Out_writes_(nRecodedDigits) PUINT32  absofKIs,
_Out_writes_(nRecodedDigits) PUINT32  sigofKIs,
UINT32  nRecodedDigits 
)

Definition at line 44 of file recoding.c.

53{
54 UINT32 T1 = 0;
55 UINT32 T2 = 0;
56 UINT32 mask = ~(0xffffffff << W); // Window mask = 2^w - 1 (e.g. 0x0000003f for w = 6)
57 UINT32 smask = 0x1 << (W-1); // Sign mask = 2^(w-1) (e.g. 0x00000020 for w = 6)
58
59 SYMCRYPT_ASSERT( W < 32 );
60
61 for (UINT32 i=0; i < nRecodedDigits - 1; i++)
62 {
63 T1 = SymCryptIntGetValueLsbits32( piK ) & mask; // T1 = k mod 2^W
64
65 // At this point if the w-th bit of T1 is 1 then we know that T1 > 2^(w-1)
66 // (Since k = odd is a loop invariant).
67 //
68 // In this case, (case A), T1 & ~smask is equal to (k mod 2^w) - 2^(w-1) = k_i = |k_i|.
69 //
70 // Otherwise, (case B), we know that T1 < 2^(w-1). Therefore 2^(w-1) - T1 = |k_i|.
71
72 sigofKIs[i] = SYMCRYPT_MASK32_ZERO( T1 & smask ); // If the sign of k_i is - this mask is set to 0xffffffff. (Case B)
73
74 T2 = T1 & ~smask; // |k_i| in case A
75 T1 = smask - T1; // |k_i| in case B
76
77 absofKIs[i] = ((T1 & sigofKIs[i]) | (T2 & ~sigofKIs[i])) >> 1; // Setting (masked) the absolute value of k_i in absofKIs (divided by 2)
78
79 SymCryptIntSubUint32( piK, T2, piTmp ); // This gives k - k_i in case (A)
80 SymCryptIntAddUint32( piK, T1, piK ); // This gives k - k_i in case (B)
81
82 SymCryptIntMaskedCopy( piTmp, piK, ~sigofKIs[i] ); // Copy the result to piK in case (B)
83
84 SymCryptIntDivPow2( piK, W-1, piK ); // k := k / 2^(w-1)
85 }
86
87 // The last sign is positive given k < GOrd => k_t < 2^w
88 sigofKIs[nRecodedDigits - 1] = 0;
89 // Belts and braces, select only the bottom w-1 bits (ensure all absofKIs represent odd values in range [1,2^(w-1)-1])
90 absofKIs[nRecodedDigits - 1] = (SymCryptIntGetValueLsbits32( piK ) & mask & ~smask) >> 1;
91}
UINT32 SYMCRYPT_CALL SymCryptIntAddUint32(_In_ PCSYMCRYPT_INT piSrc1, UINT32 u32Src2, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:284
UINT32 SYMCRYPT_CALL SymCryptIntSubUint32(_In_ PCSYMCRYPT_INT piSrc1, UINT32 Src2, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:314

Referenced by SymCryptEcpointScalarMulFixedWindow().

◆ SymCryptGcmDecryptPartTwoPass()

VOID SYMCRYPT_CALL SymCryptGcmDecryptPartTwoPass ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 543 of file gcm.c.

548{
550
551 //
552 // Do the actual decryption
553 // This violates the read-once rule, but it is safe for the same reasons as above
554 // in the encryption case.
555 //
556
558}
VOID SYMCRYPT_CALL SymCryptGcmAddMacData(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_opt_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: gcm.c:65
VOID SYMCRYPT_CALL SymCryptGcmEncryptDecryptPart(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: gcm.c:129

Referenced by SymCryptAesGcmDecryptPart(), SymCryptGcmDecrypt(), and SymCryptGcmDecryptPart().

◆ SymCryptGcmEncryptPartTwoPass()

VOID SYMCRYPT_CALL SymCryptGcmEncryptPartTwoPass ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 481 of file gcm.c.

486{
487 //
488 // Do the actual encryption
489 //
491
492 //
493 // We break the read-once/write once rule here by reading the pbDst data back.
494 // In this particular situation this is safe, and avoiding it is expensive as it
495 // requires an extra copy and an extra memory buffer.
496 // The first write exposes the GCM key stream, independent of the underlying data that
497 // we are processing. From an attacking point of view we can think of this as literally
498 // handing over the key stream. So encryption consists of two steps:
499 // - hand over the key stream
500 // - MAC some ciphertext
501 // In this view (which has equivalent security properties to GCM) is obviously doesn't
502 // matter that we read pbDst back.
503 //
504
506}

Referenced by SymCryptAesGcmEncryptPart(), SymCryptGcmEncrypt(), and SymCryptGcmEncryptPart().

◆ SymCryptGetCachedEcurve()

PCSYMCRYPT_ECURVE SYMCRYPT_CALL SymCryptGetCachedEcurve ( SYMCRYPT_CACHED_ECURVE_ID  curveId)

Definition at line 33 of file ec_internal_curves.c.

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}
static PCSYMCRYPT_ECURVE_PARAMS SYMCRYPT_CALL SymCryptGetCachedEcurveParams(SYMCRYPT_CACHED_ECURVE_ID curveId)
static PCSYMCRYPT_ECURVE rgpCachedCurves[SYMCRYPT_CACHED_ECURVE_ID_COUNT]
VOID SYMCRYPT_CALL SymCryptEcurveFree(_Out_ PSYMCRYPT_ECURVE pCurve)
Definition: ecurve.c:657
PSYMCRYPT_ECURVE SYMCRYPT_CALL SymCryptEcurveAllocate(_In_ PCSYMCRYPT_ECURVE_PARAMS pParams, _In_ UINT32 flags)
Definition: ecurve.c:606
const SYMCRYPT_ECURVE * PCSYMCRYPT_ECURVE
SYMCRYPT_ECURVE * PSYMCRYPT_ECURVE

◆ SymCryptGHashAppendData()

VOID SYMCRYPT_CALL SymCryptGHashAppendData ( _In_ PCSYMCRYPT_GHASH_EXPANDED_KEY  expandedKey,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 884 of file ghash.c.

889{
890#if SYMCRYPT_CPU_X86
891 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
892 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
893
894 pExpandedKeyTable = (PSYMCRYPT_GF128_ELEMENT)&expandedKey->tableSpace[expandedKey->tableOffset];
895
897 {
898 if( SymCryptSaveXmm( &SaveData ) != SYMCRYPT_NO_ERROR )
899 {
900 SymCryptFatal( 'pclm' );
901 }
903 SymCryptRestoreXmm( &SaveData );
904 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
905 {
906 SymCryptGHashAppendDataXmm( pExpandedKeyTable, pState, pbData, cbData );
907 SymCryptRestoreXmm( &SaveData );
908 } else {
909 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
910 }
911
912#elif SYMCRYPT_CPU_AMD64
913 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
914
915 pExpandedKeyTable = &expandedKey->table[0];
917 {
919 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
920 {
921 SymCryptGHashAppendDataXmm( pExpandedKeyTable, pState, pbData, cbData );
922 } else {
923 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
924 }
925#elif SYMCRYPT_CPU_ARM
926 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
927
928 pExpandedKeyTable = &expandedKey->table[0];
929 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
930 {
931 SymCryptGHashAppendDataNeon( pExpandedKeyTable, pState, pbData, cbData );
932 } else {
933 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
934 }
935#elif SYMCRYPT_CPU_ARM64
936 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
937
938 pExpandedKeyTable = &expandedKey->table[0];
939 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
940 {
941 SymCryptGHashAppendDataPmull( pExpandedKeyTable, pState, pbData, cbData );
942 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
943 {
944 SymCryptGHashAppendDataNeon( pExpandedKeyTable, pState, pbData, cbData );
945 } else {
946 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
947 }
948#else
949 SymCryptGHashAppendDataC( &expandedKey->table[0], pState, pbData, cbData );
950#endif
951}
VOID SYMCRYPT_CALL SymCryptGHashAppendDataC(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: ghash.c:61
#define SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE
Definition: sc_lib.h:305
VOID SYMCRYPT_CALL SymCryptGHashAppendDataXmm(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashAppendDataPclmulqdq(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashAppendDataNeon(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
const SYMCRYPT_GF128_ELEMENT * PCSYMCRYPT_GF128_ELEMENT
* PSYMCRYPT_GF128_ELEMENT
PCBYTE pbData

Referenced by SymCryptAesGcmDecryptPartOnePass(), SymCryptAesGcmEncryptPartOnePass(), SymCryptGcmAddMacData(), SymCryptGcmComputeTag(), SymCryptGcmDecrypt(), SymCryptGcmEncrypt(), SymCryptGcmPadMacData(), and SymCryptGcmSetNonce().

◆ SymCryptGHashAppendDataC()

VOID SYMCRYPT_CALL SymCryptGHashAppendDataC ( _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 61 of file ghash.c.

66{
67 UINT64 R0, R1;
69 SYMCRYPT_ALIGN UINT32 state32[4];
70 UINT32 t;
71 int i,j;
73 {
74 R0 = R1 = 0;
75
76 //
77 // We have two nested loops so that we can do most of our operations
78 // on 32-bit words. 64-bit rotates/shifts can be really slow on a 32-bit CPU.
79 // On AMD64 we use the XMM version which is much faster.
80 //
81 state32[0] = (UINT32)pState->ull[0];
82 state32[1] = (UINT32)(pState->ull[0] >> 32);
83 state32[2] = (UINT32)pState->ull[1];
84 state32[3] = (UINT32)(pState->ull[1] >> 32);
85 for( i=0; i<4; i++ )
86 {
87 t = SYMCRYPT_LOAD_MSBFIRST32( &pbData[4*i] ) ^ state32[3-i];
88 for( j=31; j>=0; j-- )
89 {
90 mask = (UINT64)( -(INT64)(t & 1 ));
91 R0 ^= expandedKeyTable[32*i+j].ull[0] & mask;
92 R1 ^= expandedKeyTable[32*i+j].ull[1] & mask;
93 t >>= 1;
94 }
95 }
96 pState->ull[0] = R0;
97 pState->ull[1] = R1;
100 }
101
102 SymCryptWipeKnownSize( state32, sizeof( state32 ) );
103}
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
#define R1(v, w, x, y, z, i)
Definition: sha1.c:36
#define R0(v, w, x, y, z, i)
Definition: sha1.c:35
#define SYMCRYPT_GF128_BLOCK_SIZE

Referenced by SymCryptGHashAppendData().

◆ SymCryptGHashAppendDataNeon()

VOID SYMCRYPT_CALL SymCryptGHashAppendDataNeon ( _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCryptGHashAppendData().

◆ SymCryptGHashAppendDataPclmulqdq()

VOID SYMCRYPT_CALL SymCryptGHashAppendDataPclmulqdq ( _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCryptGHashAppendData().

◆ SymCryptGHashAppendDataXmm()

VOID SYMCRYPT_CALL SymCryptGHashAppendDataXmm ( _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT  expandedKeyTable,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCryptGHashAppendData().

◆ SymCryptGHashExpandKey()

Definition at line 816 of file ghash.c.

819{
820#if SYMCRYPT_CPU_X86
821 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
822 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
823
824 //
825 // Initialize offset into table space for 16-alignment.
826 //
827 expandedKey->tableOffset = (0 -((UINT_PTR) &expandedKey->tableSpace[0])) % sizeof(SYMCRYPT_GF128_ELEMENT);
828
829 pExpandedKeyTable = (PSYMCRYPT_GF128_ELEMENT)&expandedKey->tableSpace[expandedKey->tableOffset];
830
832 {
833 //
834 // We can only use the PCLMULQDQ data representation if the SaveXmm never fails.
835 // This is one of the CPU features required.
836 // We check anyway...
837 //
838 if( SymCryptSaveXmm( &SaveData ) != SYMCRYPT_NO_ERROR )
839 {
840 SymCryptFatal( 'pclm' );
841 }
842 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
843 SymCryptRestoreXmm( &SaveData );
844 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
845 {
846 SymCryptGHashExpandKeyXmm( pExpandedKeyTable, pH );
847 SymCryptRestoreXmm( &SaveData );
848 } else {
849 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
850 }
851
852#elif SYMCRYPT_CPU_AMD64
853 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
854 pExpandedKeyTable = &expandedKey->table[0];
855
857 {
858 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
859 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
860 {
861 SymCryptGHashExpandKeyXmm( pExpandedKeyTable, pH );
862 } else {
863 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
864 }
865
866#elif SYMCRYPT_CPU_ARM64
867 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
868 pExpandedKeyTable = &expandedKey->table[0];
869
870 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
871 {
872 SymCryptGHashExpandKeyPmull( pExpandedKeyTable, pH );
873 } else {
874 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
875 }
876
877#else
878 SymCryptGHashExpandKeyC( &expandedKey->table[0], pH ); // Default expansion (does not need alignment)
879#endif
880}
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyC(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
Definition: ghash.c:27
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyXmm(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
Definition: ghash.c:122
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
SYMCRYPT_GF128_ELEMENT

Referenced by SymCryptGcmExpandKey().

◆ SymCryptGHashExpandKeyAmd64()

◆ SymCryptGHashExpandKeyC()

Definition at line 27 of file ghash.c.

30{
31 UINT64 H0, H1, t;
32 UINT32 i;
33
34 //
35 // (H1, H0) form a 128-bit integer, H1 is the upper part, H0 the lower part.
36 // Convert pH[] to (H1, H0) using MSByte first convention.
37 //
38 H1 = SYMCRYPT_LOAD_MSBFIRST64( &pH[0] );
39 H0 = SYMCRYPT_LOAD_MSBFIRST64( &pH[8] );
40
41 for( i=0; i<SYMCRYPT_GF128_FIELD_SIZE; i++ )
42 {
43 expandedKey[i].ull[0] = H0;
44 expandedKey[i].ull[1] = H1;
45 //
46 // Multiply (H1,H0) by x in the GF(2^128) field using the field encoding from SP800-38D
47 //
48 t = UINT64_NEG(H0 & 1) & ((UINT64)GF128_FIELD_R_BYTE << (8 * ( sizeof( UINT64 ) - 1 )) ) ;
49 H0 = (H0 >> 1) | (H1 << 63);
50 H1 = (H1 >> 1) ^ t;
51 }
52}
#define UINT64_NEG(x)
#define GF128_FIELD_R_BYTE
#define SYMCRYPT_LOAD_MSBFIRST64(p)
Definition: symcrypt.h:304
#define SYMCRYPT_GF128_FIELD_SIZE

Referenced by SymCryptGHashExpandKey(), and SymCryptGHashExpandKeyXmm().

◆ SymCryptGHashExpandKeyX86()

VOID SYMCRYPT_CALL SymCryptGHashExpandKeyX86 ( _Out_ PSYMCRYPT_GHASH_EXPANDED_KEY  expandedKey,
_In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE  pH 
)

◆ SymCryptGHashResult()

Definition at line 108 of file ghash.c.

111{
114}
static const BYTE pbResult[]
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
Definition: symcrypt.h:312

Referenced by SymCryptGcmSetNonce().

◆ SymCryptHashAppendInternal()

VOID SYMCRYPT_CALL SymCryptHashAppendInternal ( _In_ PCSYMCRYPT_HASH  pHash,
_Inout_ PSYMCRYPT_COMMON_HASH_STATE  pState,
_In_reads_bytes_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 10 of file hash.c.

15{
17 UINT32 freeInBuffer;
18 SIZE_T tmp;
19
21
22 pState->dataLengthL += cbData;
23 if( pState->dataLengthL < cbData ) {
24 pState->dataLengthH ++; // This is almost-unreachable code as it requires 2^64 bytes to be hashed.
25 }
26
27 bytesInBuffer = pState->bytesInBuffer;
28
29 //
30 // If previous data in buffer, buffer new input and transform if possible.
31 //
32 if( bytesInBuffer > 0 )
33 {
34 SYMCRYPT_ASSERT( pHash->inputBlockSize > bytesInBuffer );
35
36 freeInBuffer = pHash->inputBlockSize - bytesInBuffer;
37 if( cbData < freeInBuffer )
38 {
39 //
40 // All the data will fit in the buffer.
41 // We don't do anything here.
42 // As cbData < inputBlockSize the bulk data processing is skipped,
43 // and the data will be copied to the buffer at the end
44 // of this code.
45 } else {
46 //
47 // Enough data to fill the whole buffer & process it
48 //
49 memcpy(&pState->buffer[bytesInBuffer], pbData, freeInBuffer);
50 pbData += freeInBuffer;
51 cbData -= freeInBuffer;
52 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, &pState->buffer[0], pHash->inputBlockSize, &tmp );
53
54 bytesInBuffer = 0;
55 }
56 }
57
58 //
59 // Internal buffer is empty; process all remaining whole blocks in the input
60 //
61 if( cbData >= pHash->inputBlockSize )
62 {
63 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pbData, cbData, &tmp );
64 SYMCRYPT_ASSERT( tmp < pHash->inputBlockSize );
65 pbData += cbData - tmp;
66 cbData = tmp;
67 }
68
69 SYMCRYPT_ASSERT( cbData < pHash->inputBlockSize );
70
71 //
72 // buffer remaining input if necessary.
73 //
74 if( cbData > 0 )
75 {
78 }
79
80 pState->bytesInBuffer = bytesInBuffer;
81}
SIZE_T bytesInBuffer
UINT32 inputBlockSize

Referenced by SymCryptMd2Append(), SymCryptMd4Append(), SymCryptMd5Append(), and SymCryptSha1Append().

◆ SymCryptHashCommonPaddingMd4Style()

VOID SYMCRYPT_CALL SymCryptHashCommonPaddingMd4Style ( _In_ PCSYMCRYPT_HASH  pHash,
_Inout_ PSYMCRYPT_COMMON_HASH_STATE  pState 
)

Definition at line 85 of file hash.c.

88{
89 SIZE_T tmp;
90 SIZE_T bytesInBuffer = pState->bytesInBuffer;
91
93 SYMCRYPT_ASSERT( pHash->inputBlockSize == 64 );
94 SYMCRYPT_ASSERT( bytesInBuffer == (pState->dataLengthL & 0x3f) );
95
96 //
97 // The buffer is never completely full, so we can always put the first
98 // padding byte in.
99 //
100 pState->buffer[bytesInBuffer++] = 0x80;
101
102 if( bytesInBuffer > 64-8 ) {
103 //
104 // No room for the rest of the padding. Pad with zeroes & process block
105 // bytesInBuffer is at most 64, so we do not have an integer underflow
106 //
108 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pState->buffer, 64, &tmp );
109 SYMCRYPT_ASSERT( tmp == 0 );
110 bytesInBuffer = 0;
111 }
112
113 //
114 // Set rest of padding
115 // At this point bytesInBuffer <= 64-8, so we don't have an underflow
116 // We wipe to the end of the buffer as it is 16-aligned,
117 // and it is faster to wipe to an aligned point
118 //
120 SYMCRYPT_STORE_LSBFIRST64( &pState->buffer[64-8], pState->dataLengthL * 8 );
121
122 //
123 // Process the final block
124 //
125 (*pHash->appendBlockFunc)( (PBYTE)pState + pHash->chainOffset, pState->buffer, 64, &tmp );
126}
#define SYMCRYPT_STORE_LSBFIRST64(p, v)
Definition: symcrypt.h:308

Referenced by SymCryptMd4Result(), and SymCryptMd5Result().

◆ SymCryptHbsGetDigit()

UINT32 SYMCRYPT_CALL SymCryptHbsGetDigit ( UINT32  width,
_In_ PCBYTE  pbBuffer,
SIZE_T  cbBuffer,
UINT32  index 
)

Definition at line 1429 of file xmss.c.

1434{
1436
1437 SYMCRYPT_ASSERT(width == 1 || width == 2 || width == 4 || width == 8);
1438 SYMCRYPT_ASSERT(index < ((cbBuffer * 8) / width));
1439
1440 UINT32 digitsPerByte = 8 / width;
1441
1442 BYTE value = pbBuffer[index / digitsPerByte];
1443
1444 value >>= width * (digitsPerByte - 1 - (index % digitsPerByte));
1445
1446 value &= (1 << width) - 1;
1447
1448 return value;
1449}
GLint GLint GLsizei width
Definition: gl.h:1546

Referenced by LmsComputeOtsPubKeyCandidate(), LmsOtsCalculateChecksum(), LmsOtskeySign(), SymCryptXmssWotspPublickeyFromSignature(), and SymCryptXmssWotspSign().

◆ SymCryptHbsGetWinternitzLengths()

VOID SYMCRYPT_CALL SymCryptHbsGetWinternitzLengths ( UINT32  n,
UINT32  w,
_Out_ PUINT32  puLen1,
_Out_ PUINT32  puLen2 
)

Definition at line 188 of file xmss.c.

194{
195 UINT32 len1;
196 UINT32 len2;
197 UINT32 maxChecksum;
198 UINT32 msb;
199
200 SYMCRYPT_ASSERT(n > 0);
201 SYMCRYPT_ASSERT(w >= 1 && w <= 8);
202
203 // number of w-bit digits in an n-byte input
204 len1 = (8 * n + (w - 1)) / w;
205
206 // maximum value the checksum can take (each w-bit digit can have value at most 2^w-1)
207 maxChecksum = len1 * ((1 << w) - 1);
208
209 msb = 31 - SymCryptCountLeadingZeros32(maxChecksum);
210
211 // msb + 1 bits are required to store the maxChecksum,
212 // calculate the number of w-bit blocks to represent that
213 len2 = (msb + 1 + (w - 1)) / w;
214
215 *puLen1 = len1;
216 *puLen2 = len2;
217}
FORCEINLINE UINT32 SymCryptCountLeadingZeros32(UINT32 value)
Definition: sc_lib.h:5079
UINT32 len2
UINT32 len1

Referenced by SymCryptLmsParamsFromAlgId(), SymCryptLmsSetParams(), and SymCryptXmssDeriveParams().

◆ SymCryptHbsIncrementalTreehashAllocNode()

PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashAllocNode ( _Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH  pIncHash,
UINT32  nLeafIndex 
)

Definition at line 623 of file xmss.c.

626{
627 SYMCRYPT_ASSERT(pIncHash->nSize < pIncHash->nCapacity);
628
629 PSYMCRYPT_TREEHASH_NODE pNode = SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize);
630
631 pNode->height = 0;
632 pNode->index = nLeafIndex;
633
634 pIncHash->nSize++;
635
636 return pNode;
637}
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetNode(_In_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, SIZE_T index)
Definition: xmss.c:609

Referenced by SymCryptXmssComputeSubtreeRoot(), SymCryptXmssCreateWotspPublickey(), and SymCryptXmssWotspPublickeyFromSignature().

◆ SymCryptHbsIncrementalTreehashFinalize()

PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashFinalize ( _Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH  pIncHash)

Definition at line 695 of file xmss.c.

697{
699}
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcessCommon(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, BOOLEAN fFinal)
Definition: xmss.c:655

Referenced by SymCryptXmssComputeSubtreeRoot(), SymCryptXmssCreateWotspPublickey(), and SymCryptXmssWotspPublickeyFromSignature().

◆ SymCryptHbsIncrementalTreehashGetNode()

PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetNode ( _In_ PSYMCRYPT_INCREMENTAL_TREEHASH  pIncHash,
SIZE_T  index 
)

Definition at line 609 of file xmss.c.

612{
613 PBYTE pNode = (PBYTE)pIncHash->arrNodes;
614
615 pNode += index * pIncHash->cbNode;
616
618}
return
Definition: dirsup.c:529

Referenced by SymCryptHbsIncrementalTreehashAllocNode(), and SymCryptHbsIncrementalTreehashGetTopNodes().

◆ SymCryptHbsIncrementalTreehashGetTopNodes()

VOID SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetTopNodes ( _Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH  pIncHash,
_Out_ PSYMCRYPT_TREEHASH_NODE *  ppNodeLeft,
_Out_ PSYMCRYPT_TREEHASH_NODE *  ppNodeRight 
)

Definition at line 642 of file xmss.c.

646{
647 *ppNodeRight = (pIncHash->nSize < 1) ? NULL : SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize - 1);
648
649 *ppNodeLeft = (pIncHash->nSize < 2) ? NULL : SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize - 2);
650}

Referenced by SymCryptHbsIncrementalTreehashProcessCommon().

◆ SymCryptHbsIncrementalTreehashInit()

PSYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_CALL SymCryptHbsIncrementalTreehashInit ( UINT32  nLeaves,
PBYTE  pbBuffer,
SIZE_T  cbBuffer,
UINT32  cbHashResult,
PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC  funcCompressNodes,
PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT  pContext 
)

Definition at line 582 of file xmss.c.

589{
591
593
595
596 pIncHash->cbNode = 2 * sizeof(UINT32) + cbHashResult;
597 pIncHash->nSize = 0;
599 pIncHash->nLastLeafIndex = 0;
600 pIncHash->funcCompressNodes = funcCompressNodes;
601 pIncHash->pContext = pContext;
602
603 return pIncHash;
604}
struct _SYMCRYPT_INCREMENTAL_TREEHASH * PSYMCRYPT_INCREMENTAL_TREEHASH
PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes
Definition: sc_lib.h:4626
PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext
Definition: sc_lib.h:4627
UINT32 SYMCRYPT_CALL SymCryptHbsIncrementalTreehashStackDepth(UINT32 nLeaves)
Definition: xmss.c:704
SIZE_T SYMCRYPT_CALL SymCryptHbsSizeofScratchBytesForIncrementalTreehash(UINT32 cbNode, UINT32 nLeaves)
Definition: xmss.c:719

Referenced by SymCryptXmssComputeSubtreeRoot(), SymCryptXmssCreateWotspPublickey(), and SymCryptXmssWotspPublickeyFromSignature().

◆ SymCryptHbsIncrementalTreehashProcess()

◆ SymCryptHbsIncrementalTreehashProcessCommon()

PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcessCommon ( _Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH  pIncHash,
BOOLEAN  fFinal 
)

Definition at line 655 of file xmss.c.

658{
659 PSYMCRYPT_TREEHASH_NODE pNodeLeft = NULL;
660 PSYMCRYPT_TREEHASH_NODE pNodeRight = NULL;
661
662 SYMCRYPT_ASSERT(pIncHash->nSize > 0);
663
664 SymCryptHbsIncrementalTreehashGetTopNodes(pIncHash, &pNodeLeft, &pNodeRight);
665
666 while ( pNodeLeft &&
667 (fFinal || (pNodeLeft->height == pNodeRight->height)) )
668 {
669 pIncHash->funcCompressNodes(
670 pNodeLeft,
671 pNodeRight,
672 pNodeLeft,
673 pIncHash->pContext);
674
675 pIncHash->nSize--;
676
677 SymCryptHbsIncrementalTreehashGetTopNodes(pIncHash, &pNodeLeft, &pNodeRight);
678 }
679
680 return pNodeRight;
681}
VOID SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetTopNodes(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeLeft, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeRight)
Definition: xmss.c:642

Referenced by SymCryptHbsIncrementalTreehashFinalize(), and SymCryptHbsIncrementalTreehashProcess().

◆ SymCryptHbsIncrementalTreehashStackDepth()

UINT32 SYMCRYPT_CALL SymCryptHbsIncrementalTreehashStackDepth ( UINT32  nLeaves)

Definition at line 704 of file xmss.c.

706{
707 UINT32 h;
708
709 // Minimum height binary tree that contains nLeaves many leaves is h+1
710 h = 31 - SymCryptCountLeadingZeros32(nLeaves);
711
712 // Tree root computation will require a stack of depth equal to tree height plus 1
713 return (h + 2);
714}
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723

Referenced by SymCryptHbsIncrementalTreehashInit(), and SymCryptHbsSizeofScratchBytesForIncrementalTreehash().

◆ SymCryptHbsSizeofScratchBytesForIncrementalTreehash()

SIZE_T SYMCRYPT_CALL SymCryptHbsSizeofScratchBytesForIncrementalTreehash ( UINT32  cbNode,
UINT32  nLeaves 
)

Definition at line 719 of file xmss.c.

722{
723 SIZE_T nodeSize = cbNode + 2 * sizeof(UINT32);
725
727 return result;
728}
struct _SYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_INCREMENTAL_TREEHASH

Referenced by SymCryptHbsIncrementalTreehashInit(), SymCryptXmssComputePublicRoot(), SymCryptXmssComputeSubtreeRoot(), SymCryptXmssCreateWotspPublickey(), SymCryptXmssSign(), and SymCryptXmssVerifyInternal().

◆ SymCryptInitEnvCommon()

VOID SYMCRYPT_CALL SymCryptInitEnvCommon ( UINT32  version)

Definition at line 43 of file libmain.c.

45{
46 UINT32 tmp;
47
48 const CHAR * p;
49
50 // Assertion that verifies that the calling application was compiled with
51 // the same version header files as the library.
53 {
54 SymCryptFatal( 'apiv' );
55 }
56
57 //
58 // Use an interlocked to set the flag in case we add other flags
59 // that are modified by different threads.
60 //
61 SYMCRYPT_ATOMIC_OR32_PRE_RELAXED( &g_SymCryptFlags, SYMCRYPT_FLAG_LIB_INITIALIZED );
62
63 //
64 // Do a forced write of our code version. This ensures that the code
65 // version is part of the binary, so we can look at a binary and figure
66 // out which version of SymCrypt it was linked with.
67 //
69
70 //
71 // Force the build string to be in memory, because otherwise the
72 // compiler might get smart and remove it.
73 // This ensures we can always track back to the SymCrypt source code from
74 // any binary that links this library
75 //
76 for( p = SymCryptBuildString; *p!=0; p++ )
77 {
78 SYMCRYPT_FORCE_WRITE8( (PBYTE) &tmp, *p );
79 }
80
81 //
82 // Make an inverted copy of the CPU detection results.
83 // This helps us diagnose corruption of our flags
84 // Force-write otherwise the compiler optimizes it away
85 //
87
88 //
89 // Test that the C and assembler code agree on the various structure member offsets.
90 // This gets optimized away in FRE builds as all the values are compile-time computable.
91 //
92#define SYMCRYPT_CHECK_ASM_OFFSET( a, b ) if( (a) != (b) ) {SymCryptFatal( b );}
93 SYMCRYPT_CHECK_ASM_OFFSETS;
94#undef SYMCRYPT_CHECK_ASM_OFFSET
95}
SYMCRYPT_CPU_FEATURES g_SymCryptCpuFeaturesNotPresent
Definition: libmain.c:20
UINT32 g_SymCryptFlags
Definition: libmain.c:18
const CHAR *const SymCryptBuildString
Definition: libmain.c:35
SYMCRYPT_CPU_FEATURES g_SymCryptCpuFeaturesPresentCheck
Definition: libmain.c:21
char CHAR
Definition: pedump.c:57
#define SYMCRYPT_FLAG_LIB_INITIALIZED
Definition: sc_lib.h:22
#define SYMCRYPT_FORCE_WRITE8( _p, _v)
Definition: symcrypt.h:421
#define SYMCRYPT_API_VERSION
Definition: symcrypt.h:16

Referenced by SymCryptInitEnvWindowsUsermodeWin8_1nLater().

◆ SymCryptInjectError()

VOID SYMCRYPT_CALL SymCryptInjectError ( PBYTE  pbData,
SIZE_T  cbData 
)

Referenced by SymCrypt3DesSelftest(), SymCryptAesCmacSelftest(), SymCryptCcmSelftest(), SymCryptChaCha20Poly1305Selftest(), SymCryptChaCha20Selftest(), SymCryptCShake128Selftest(), SymCryptCShake256Selftest(), SymCryptDesSelftest(), SymCryptDesxSelftest(), SymCryptGcmSelftest(), SymCryptHmacMd5Selftest(), SymCryptHmacSha1Selftest(), SymCryptHmacSha224Selftest(), SymCryptHmacSha256Selftest(), SymCryptHmacSha384Selftest(), SymCryptHmacSha3_224Selftest(), SymCryptHmacSha3_256Selftest(), SymCryptHmacSha3_384Selftest(), SymCryptHmacSha3_512Selftest(), SymCryptHmacSha512_224Selftest(), SymCryptHmacSha512_256Selftest(), SymCryptHmacSha512Selftest(), SymCryptKmac128Selftest(), SymCryptKmac256Selftest(), SymCryptMarvin32Selftest(), SymCryptMd2Selftest(), SymCryptMd4Selftest(), SymCryptMd5Selftest(), SymCryptPbkdf2_HmacSha1SelfTest(), SymCryptPbkdf2_HmacSha256SelfTest(), SymCryptPoly1305Selftest(), SymCryptRc2Selftest(), SymCryptRc4Selftest(), SymCryptRngAesTestGenerate(), SymCryptRngAesTestInstantiate(), SymCryptRngAesTestReseed(), SymCryptSha1Selftest(), SymCryptSha224Selftest(), SymCryptSha256Selftest(), SymCryptSha384Selftest(), SymCryptSha3_224Selftest(), SymCryptSha3_256Selftest(), SymCryptSha3_384Selftest(), SymCryptSha3_512Selftest(), SymCryptSha512_224Selftest(), SymCryptSha512_256Selftest(), SymCryptSha512Selftest(), SymCryptShake128Selftest(), SymCryptShake256Selftest(), SymCryptSp800_108_HmacSha1SelfTest(), SymCryptSp800_108_HmacSha256SelfTest(), SymCryptSp800_108_HmacSha384SelfTest(), SymCryptSp800_108_HmacSha512SelfTest(), SymCryptSshKdfSha256SelfTest(), SymCryptSshKdfSha512SelfTest(), and SymCryptXtsAesSelftest().

◆ SymCryptInverseMod2e64()

UINT64 SymCryptInverseMod2e64 ( UINT64  m)

Definition at line 932 of file fdef_general.c.

933{
934 // Compute the inv64 value such that inv64 * m = 1 mod 2^64 for odd m.
935 // If m is even, there exists no inverse, this function will return a
936 // useless value in constant time.
937 //
938 // We use Newton's method to search for a zero of f(x) := x^-1 - m, working modulo 2^64
939 // We get the iteration formula
940 // x_{i+1} = x_i - f(x_i)/f'(x_i)
941 // = x_i - (x_i^-1 - m)/(-x_i^-2)
942 // = x_i + x_i^2(1/x_i - m)
943 // = x_i + x_i - (x_i^2 * m)
944 // = x_i (2 - x_i*m)
945 //
946 // Let x_i = d + 2^n * e where d = inv64 = m^-1 mod 2^64, and 2^n * e is the error term that is zero in the n least
947 // significant bits. We have
948 // x_{i+1} = (d + 2^n * e) (2 - (d + 2^n * e) * m)
949 // = (d + 2^n * e) (2 - d*m - 2^n * e * m)
950 // = (d + 2^n * e) (2 - 1 - 2^n * e * m)
951 // = (d + 2^n * e) (1 - 2^n * e * m)
952 // = d - (2^n * e * (d*m)) + (2^n * e) - (2^{2n} * e^2 * m)
953 // = d - (2^{2n} * e^2 * m)
954 // In other words, the error has been squared and multiplied by m. In our case, working modulo 2^64, the number of correct bits
955 // on the least significant side is doubled.
956 //
957 // To get a 4-bit correct estimate for m^-1 given odd m, we consider the least significant 4 bits of m and inv:
958 // m = ... m_3 m_2 m_1 m_0
959 // inv = ... i_3 i_2 i_1 i_0
960 // We want to directly compute i_[3..0] s.t. (m*inv) & 0xf == 1
961 // working through some simple simultaneous equations it is easily shown that:
962 // i_0 = m_0 = 1
963 // i_1 = m_1
964 // i_2 = m_2
965 // i_3 = m_1 ^ m_2 ^ m_3
966 // Once we have 4 correct bits, we can double that multiple times using Newton's method.
967 //
968 // We use 32-bit operations for most of the iterations for speed on 32-bit platforms.
969 //
970 UINT32 inv32;
972 UINT32 m32;
973
974 m32 = (UINT32)m;
975
976 inv32 = m32 ^ (((m32 - 1) * 0x6) & 0x8); // sets inv32 bits [3..0]
977 SYMCRYPT_ASSERT( ((m&1) == 0) || (((inv32 * m32) & 0xf) == 1) );
978
979 inv32 = inv32 * (2 - inv32 * m32 );
980 SYMCRYPT_ASSERT( ((m&1) == 0) || (((inv32 * m32) & 0xff) == 1) );
981
982 inv32 = inv32 * (2 - inv32 * m32 );
983 SYMCRYPT_ASSERT( ((m&1) == 0) || (((inv32 * m32) & 0xffff) == 1) );
984
985 inv32 = inv32 * (2 - inv32 * m32 );
986 SYMCRYPT_ASSERT( ((m&1) == 0) || ((inv32 * m32) == 1) );
987
988 inv64 = inv32;
989 inv64 = inv64 * (2 - inv64 * m );
990 SYMCRYPT_ASSERT( ((m&1) == 0) || ((inv64 * m) == 1) );
991
992 return inv64;
993}
#define m32
const GLfloat * m
Definition: glext.h:10848
UINT64 inv64

Referenced by SymCryptFdefInitTrialdivisionPrime(), and SymCryptFdefIntToModulus().

◆ SymCryptKeccakAppend()

VOID SYMCRYPT_CALL SymCryptKeccakAppend ( _Inout_ PSYMCRYPT_KECCAK_STATE  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 285 of file sha3.c.

289{
290 SYMCRYPT_ASSERT(pState->inputBlockSize % 8 == 0);
291
292 // If we were in squeeze mode (Append is called after an Extract without wiping),
293 // switch to absorb mode to start a new hash computation.
294 if (pState->squeezeMode)
295 {
297 }
298
299 SYMCRYPT_ASSERT(pState->stateIndex < pState->inputBlockSize);
300
301 // Make pState->stateIndex a multiple of 8.
302 // Message block boundary will not be crossed, check
303 // if permutation is needed after this part.
304 while (cbData > 0 && (pState->stateIndex & 0x7))
305 {
307 pbData++;
308 cbData--;
309 }
310
311 // Permute if input message block is filled
312 if (pState->stateIndex == pState->inputBlockSize)
313 {
315 pState->stateIndex = 0;
316 }
317
318 // Append full lanes
319 SIZE_T uFullLanes = cbData / sizeof(UINT64);
320 if (uFullLanes > 0)
321 {
323 pbData += uFullLanes * sizeof(UINT64);
324 cbData -= uFullLanes * sizeof(UINT64);
325 }
326
327 SYMCRYPT_ASSERT(cbData < sizeof(UINT64));
329
330 SYMCRYPT_ASSERT(pState->stateIndex != pState->inputBlockSize);
331}
VOID SYMCRYPT_CALL SymCryptKeccakReset(_Out_ PSYMCRYPT_KECCAK_STATE pState)
Definition: sha3.c:186
FORCEINLINE VOID SYMCRYPT_CALL SymCryptKeccakAppendByte(_Inout_ PSYMCRYPT_KECCAK_STATE pState, BYTE val)
Definition: sha3.c:205
FORCEINLINE VOID SYMCRYPT_CALL SymCryptKeccakAppendBytes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, PCBYTE pbBuffer, SIZE_T cbBuffer)
Definition: sha3.c:220
VOID SYMCRYPT_CALL SymCryptKeccakPermute(_Inout_updates_(25) UINT64 *pState)
Definition: sha3.c:160
VOID SYMCRYPT_CALL SymCryptKeccakAppendLanes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(uLaneCount *sizeof(UINT64)) PCBYTE pbData, SIZE_T uLaneCount)
Definition: sha3.c:239

Referenced by SYMCRYPT_XxxAppend(), SymCryptKeccakAppendEncodedString(), SymCryptKeccakAppendEncodeTimes8(), SymCryptSha3_224Append(), SymCryptSha3_256Append(), SymCryptSha3_384Append(), and SymCryptSha3_512Append().

◆ SymCryptKeccakAppendEncodedString()

VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodedString ( _Inout_ PSYMCRYPT_KECCAK_STATE  pState,
_In_reads_(cbString) PCBYTE  pbString,
SIZE_T  cbString 
)

Definition at line 330 of file shake.c.

334{
336 SymCryptKeccakAppend(pState, pbString, cbString);
337}
VOID SYMCRYPT_CALL SymCryptKeccakAppend(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: sha3.c:285

Referenced by SYMCRYPT_XxxExpandKeyEx(), and SymCryptCShakeEncodeInputStrings().

◆ SymCryptKeccakAppendEncodeTimes8()

VOID SYMCRYPT_CALL SymCryptKeccakAppendEncodeTimes8 ( _Inout_ SYMCRYPT_KECCAK_STATE *  pState,
UINT64  uValue,
BOOLEAN  bLeftEncode 
)

Definition at line 310 of file shake.c.

315{
316 BYTE encoding[1 + (1 + sizeof(UINT64))];
317 SIZE_T ret;
318
319 ret = SymCryptKeccakEncodeTimes8(uValue, encoding, sizeof(encoding), bLeftEncode);
320
321 SymCryptKeccakAppend(pState, encoding, ret);
322}
return ret
Definition: mutex.c:147
SIZE_T SYMCRYPT_CALL SymCryptKeccakEncodeTimes8(UINT64 uInput, _Out_writes_(cbOutput) PBYTE pbOutput, SIZE_T cbOutput, BOOLEAN bLeftEncode)
Definition: shake.c:254

Referenced by SYMCRYPT_XxxExpandKeyEx(), SYMCRYPT_XxxExtract(), SYMCRYPT_XxxResultEx(), SymCryptCShakeEncodeInputStrings(), and SymCryptKeccakAppendEncodedString().

◆ SymCryptKeccakExtract()

VOID SYMCRYPT_CALL SymCryptKeccakExtract ( _Inout_ PSYMCRYPT_KECCAK_STATE  pState,
_Out_writes_(cbResult) PBYTE  pbResult,
SIZE_T  cbResult,
BOOLEAN  bWipe 
)

Definition at line 411 of file sha3.c.

416{
417 // Apply padding and switch to squeeze mode if this is the first call to Extract
418 if (!pState->squeezeMode)
419 {
421 }
422
423 // Do the permutation if there are no bytes available in the state
424 if ( (cbResult > 0) && (pState->stateIndex == pState->inputBlockSize) )
425 {
427 pState->stateIndex= 0;
428 }
429
430 // Make stateIndex a multiple of 8 so that the extraction can be performed in lanes.
431 // We don't call the permutation as soon as the stateIndex reaches inputBlockSize,
432 // cbResult must also be non-zero for that. This condition is checked
433 // in ExtractLanes or in the 'remaining bytes' block that follows it.
434 while (cbResult > 0 && (pState->stateIndex & 0x7))
435 {
437 pbResult++;
438 cbResult--;
439 }
440
441 SYMCRYPT_ASSERT((cbResult == 0) || ((pState->stateIndex & 0x7) == 0));
442
443 // Extract full lanes
444 SIZE_T uFullLanes = cbResult / sizeof(UINT64);
445 if (uFullLanes > 0)
446 {
448 pbResult += uFullLanes * sizeof(UINT64);
449 cbResult -= uFullLanes * sizeof(UINT64);
450 }
451
452 // Extract the remaining bytes
453 SYMCRYPT_ASSERT(cbResult < sizeof(UINT64));
454 while (cbResult > 0)
455 {
456 if (pState->stateIndex == pState->inputBlockSize)
457 {
459 pState->stateIndex = 0;
460 }
461
463 pbResult++;
464 cbResult--;
465 }
466
467 if (bWipe)
468 {
469 // Wipe the Keccak state and make it ready for a new hash computation
471 }
472}
FORCEINLINE BYTE SYMCRYPT_CALL SymCryptKeccakExtractByte(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
Definition: sha3.c:362
VOID SYMCRYPT_CALL SymCryptKeccakExtractLanes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _Out_writes_(uLaneCount *sizeof(UINT64)) PBYTE pbResult, SIZE_T uLaneCount)
Definition: sha3.c:377
VOID SYMCRYPT_CALL SymCryptKeccakApplyPadding(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
Definition: sha3.c:338

Referenced by SYMCRYPT_XxxExtract(), SYMCRYPT_XxxResult(), SYMCRYPT_XxxResultEx(), SymCryptSha3_224Result(), SymCryptSha3_256Result(), SymCryptSha3_384Result(), and SymCryptSha3_512Result().

◆ SymCryptKeccakInit()

VOID SYMCRYPT_CALL SymCryptKeccakInit ( _Out_ PSYMCRYPT_KECCAK_STATE  pState,
UINT32  inputBlockSize,
UINT8  padding 
)

Definition at line 174 of file sha3.c.

175{
176 pState->inputBlockSize = inputBlockSize;
177 pState->paddingValue = paddingValue;
178
179 // Initialize the Keccak permutation state and set mutable state variables
180 // to their default values.
182}
UINT8 paddingValue

Referenced by SYMCRYPT_XxxInit(), SymCryptSha3_224Init(), SymCryptSha3_256Init(), SymCryptSha3_384Init(), and SymCryptSha3_512Init().

◆ SymCryptKeccakPermute()

VOID SYMCRYPT_CALL SymCryptKeccakPermute ( _Inout_updates_(25) UINT64 *  pState)

Definition at line 160 of file sha3.c.

161{
162 for (int r = 0; r < 24; r++)
163 {
165 }
166}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define KECCAK_PERM_ROUND(state, rnd)
Definition: sha3.c:146

Referenced by SymCryptKeccakAppend(), SymCryptKeccakAppendLanes(), SymCryptKeccakApplyPadding(), SymCryptKeccakExtract(), SymCryptKeccakExtractLanes(), and SymCryptKeccakZeroAppendBlock().

◆ SymCryptKeccakReset()

VOID SYMCRYPT_CALL SymCryptKeccakReset ( _Out_ PSYMCRYPT_KECCAK_STATE  pState)

Definition at line 186 of file sha3.c.

187{
188 //
189 // Wipe & re-initialize
190 //
191 // Wipe the Keccak permutation state and set the mutable state variables to their
192 // default values. Non-mutable state variables retain their values. State becomes
193 // re-initialized after this call.
194 SymCryptWipeKnownSize(pState->state, sizeof(pState->state));
195 pState->stateIndex = 0;
196 pState->squeezeMode = FALSE;
197}

Referenced by SymCryptKeccakAppend(), SymCryptKeccakExtract(), and SymCryptKeccakInit().

◆ SymCryptKeccakStateExport()

Definition at line 479 of file sha3.c.

483{
484
485 SYMCRYPT_ALIGN SYMCRYPT_KECCAK_STATE_EXPORT_BLOB blob; // local copy to have proper alignment.
487
488 SymCryptWipeKnownSize(&blob, sizeof(blob)); // wipe to avoid any data leakage
489
490 blob.header.magic = SYMCRYPT_BLOB_MAGIC;
492 blob.header.type = type;
493
494 //
495 // Copy the relevant data. Buffer will be 0-padded.
496 //
497
498 SymCryptUint64ToLsbFirst(&pState->state[0], &blob.state[0], 25);
499 blob.stateIndex = pState->stateIndex;
500 blob.paddingValue = pState->paddingValue;
501 blob.squeezeMode = pState->squeezeMode;
502
503 SYMCRYPT_ASSERT((PCBYTE)&blob + sizeof(blob) - sizeof(SYMCRYPT_BLOB_TRAILER) == (PCBYTE)&blob.trailer);
504 SymCryptMarvin32(SymCryptMarvin32DefaultSeed, (PCBYTE)&blob, sizeof(blob) - sizeof(SYMCRYPT_BLOB_TRAILER), &blob.trailer.checksum[0]);
505
506 memcpy(pbBlob, &blob, sizeof(blob));
507
509 return;
510}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define C_ASSERT(e)
Definition: intsafe.h:73
#define SYMCRYPT_BLOB_MAGIC
Definition: sc_lib.h:1077
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint64ToLsbFirst(_In_reads_(cuData) PCUINT64 puData, _Out_writes_(8 *cuData) PBYTE pbResult, SIZE_T cuData)
Definition: sc_lib.h:538
Definition: image.c:229
VOID SYMCRYPT_CALL SymCryptMarvin32(_In_ PCSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedSeed, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_MARVIN32_RESULT_SIZE) PBYTE pbResult)
Definition: marvin32.c:239
PCSYMCRYPT_MARVIN32_EXPANDED_SEED const SymCryptMarvin32DefaultSeed
Definition: marvin32.c:29
#define SYMCRYPT_KECCAK_STATE_EXPORT_SIZE

Referenced by SymCryptSha3_224StateExport(), SymCryptSha3_256StateExport(), SymCryptSha3_384StateExport(), and SymCryptSha3_512StateExport().

◆ SymCryptKeccakStateImport()

Definition at line 518 of file sha3.c.

522{
523 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
524
525 SYMCRYPT_ALIGN SYMCRYPT_KECCAK_STATE_EXPORT_BLOB blob; // local copy to have proper alignment.
526 BYTE checksum[8];
527
529 memcpy(&blob, pbBlob, sizeof(blob));
530
531 if (blob.header.magic != SYMCRYPT_BLOB_MAGIC ||
533 blob.header.type != (UINT32)type)
534 {
535 scError = SYMCRYPT_INVALID_BLOB;
536 goto cleanup;
537 }
538
540 if (memcmp(checksum, &blob.trailer.checksum[0], 8) != 0)
541 {
542 scError = SYMCRYPT_INVALID_BLOB;
543 goto cleanup;
544 }
545
546 SymCryptLsbFirstToUint64(&blob.state[0], &pState->state[0], 25);
547 pState->stateIndex = blob.stateIndex;
548 pState->paddingValue = blob.paddingValue;
549 pState->squeezeMode = blob.squeezeMode;
550
551 //
552 // Set state fields based on the blob type and do validation
553 //
554
555 // default values indicate error
556 pState->inputBlockSize = 0;
557 pState->paddingValue = 0;
558
559 switch (blob.header.type)
560 {
563 if (blob.paddingValue == SYMCRYPT_SHA3_PADDING_VALUE)
564 {
565 pState->paddingValue = blob.paddingValue;
566 }
567 break;
570 if (blob.paddingValue == SYMCRYPT_SHA3_PADDING_VALUE)
571 {
572 pState->paddingValue = blob.paddingValue;
573 }
574 break;
575
578 if (blob.paddingValue == SYMCRYPT_SHA3_PADDING_VALUE)
579 {
580 pState->paddingValue = blob.paddingValue;
581 }
582 break;
583
586 if (blob.paddingValue == SYMCRYPT_SHA3_PADDING_VALUE)
587 {
588 pState->paddingValue = blob.paddingValue;
589 }
590 break;
591 default:
592 scError = SYMCRYPT_INVALID_BLOB;
593 goto cleanup;
594 }
595
596 if (pState->inputBlockSize == 0 || pState->paddingValue == 0)
597 {
598 scError = SYMCRYPT_INVALID_BLOB;
599 goto cleanup;
600 }
601
602 if (pState->stateIndex > pState->inputBlockSize)
603 {
604 scError = SYMCRYPT_INVALID_BLOB;
605 goto cleanup;
606 }
607
608 // Allow stateIndex = inputBlockSize only in squeeze mode
609 if ((pState->stateIndex == pState->inputBlockSize) && !pState->squeezeMode)
610 {
611 scError = SYMCRYPT_INVALID_BLOB;
612 goto cleanup;
613 }
614
615cleanup:
617
618 return scError;
619}
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
FORCEINLINE VOID SYMCRYPT_CALL SymCryptLsbFirstToUint64(_In_reads_(8 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT64 puResult, SIZE_T cuResult)
Definition: sc_lib.h:554
#define SYMCRYPT_SHA3_PADDING_VALUE
Definition: sc_lib.h:1808
#define SYMCRYPT_SHA3_256_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1615
#define SYMCRYPT_SHA3_224_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1561
#define SYMCRYPT_SHA3_512_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1723
#define SYMCRYPT_SHA3_384_INPUT_BLOCK_SIZE
Definition: symcrypt.h:1669

Referenced by SymCryptSha3_224StateImport(), SymCryptSha3_256StateImport(), SymCryptSha3_384StateImport(), and SymCryptSha3_512StateImport().

◆ SymCryptKeccakZeroAppendBlock()

VOID SYMCRYPT_CALL SymCryptKeccakZeroAppendBlock ( _Inout_ PSYMCRYPT_KECCAK_STATE  pState)

Definition at line 273 of file sha3.c.

274{
275 SYMCRYPT_ASSERT(!pState->squeezeMode);
277 pState->stateIndex = 0;
278}

Referenced by SYMCRYPT_XxxExpandKeyEx(), and SymCryptCShakeEncodeInputStrings().

◆ SymCryptLmsVerifyInternal()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptLmsVerifyInternal ( _In_ PCSYMCRYPT_LMS_KEY  pKey,
_In_reads_bytes_(cbMessage) PCBYTE  pbMessage,
SIZE_T  cbMessage,
UINT32  flags,
_In_reads_bytes_(cbSignature) PCBYTE  pbSignature,
SIZE_T  cbSignature 
)

Definition at line 1048 of file lms.c.

1055{
1059
1060 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1061 UINT32 cbHashOutput = pKey->params.cbHashOutput;
1062 PCSYMCRYPT_LMS_PARAMS pLmsKeyParams = &pKey->params;
1063 PCBYTE pbLocSignature = pbSignature;
1064 BYTE abRootCandidate[SYMCRYPT_LMS_MAX_N] = { 0 };
1065 BYTE abOtsPubKeyCandidate[SYMCRYPT_LMS_MAX_N] = { 0 };
1066
1067 if (flags != 0)
1068 {
1069 scError = SYMCRYPT_INVALID_ARGUMENT;
1070 goto cleanup;
1071 }
1072
1073 if (cbSignature != SymCryptLmsSizeofSignatureFromParams(&pKey->params))
1074 {
1075 scError = SYMCRYPT_INVALID_ARGUMENT;
1076 goto cleanup;
1077 }
1078
1079 UINT32 nLeafNumber = SYMCRYPT_LOAD_MSBFIRST32(pbLocSignature);
1080 pbLocSignature += sizeof(UINT32);
1081 if (nLeafNumber >= ((UINT32)1 << pKey->params.nTreeHeight))
1082 {
1083 scError = SYMCRYPT_INVALID_ARGUMENT;
1084 goto cleanup;
1085 }
1086
1087 UINT32 nOtsSigtype = SYMCRYPT_LOAD_MSBFIRST32(pbLocSignature);
1088 pbLocSignature += sizeof(UINT32);
1089
1090 if (nOtsSigtype != pLmsKeyParams->lmsOtsAlgID)
1091 {
1092 scError = SYMCRYPT_INVALID_ARGUMENT;
1093 goto cleanup;
1094 }
1095
1096 pbLocSignature += cbHashOutput * (pKey->params.nByteStringCount + 1); // +1 is for the randomizer
1097 UINT32 nSigType = SYMCRYPT_LOAD_MSBFIRST32(pbLocSignature);
1098 pbLocSignature += sizeof(UINT32);
1099
1100 if (nSigType != pLmsKeyParams->lmsAlgID)
1101 {
1102 scError = SYMCRYPT_INVALID_ARGUMENT;
1103 goto cleanup;
1104 }
1105
1107 nLeafNumber,
1108 pbMessage,
1109 cbMessage,
1110 pbSignature + sizeof(UINT32), //the +sizeof(UINT32) is to skip the leaf number and reach the LMS-OTS signature
1112 pKey->abId,
1113 pLmsKeyParams,
1114 abOtsPubKeyCandidate);
1115 if (scError != SYMCRYPT_NO_ERROR)
1116 {
1117 goto cleanup;
1118 }
1119
1121 nLeafNumber,
1122 pLmsKeyParams,
1123 pKey->abId,
1124 pbLocSignature,
1125 abOtsPubKeyCandidate,
1126 abRootCandidate);
1127 if (!SymCryptEqual(abRootCandidate, pKey->abPublicRoot, cbHashOutput))
1128 {
1129 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1130 goto cleanup;
1131 }
1132
1133cleanup:
1134 return scError;
1135}
static SYMCRYPT_ERROR SYMCRYPT_CALL LmsComputeOtsPubKeyCandidate(UINT32 nLeafNumber, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, _In_reads_bytes_(cbOtsSignature) PCBYTE pbOtsSignature, SIZE_T cbOtsSignature, _In_reads_bytes_(SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE) PCBYTE pbId, _In_ PCSYMCRYPT_LMS_PARAMS pSigParams, _Out_writes_bytes_(pSigParams->cbHashOutput) PBYTE pbOtsPubKeyCandidate)
Definition: lms.c:914
static VOID SYMCRYPT_CALL LmsComputeRootCandidate(UINT32 nLeafNumber, _In_ PCSYMCRYPT_LMS_PARAMS pParams, _In_reads_bytes_(SYMCRYPT_LMS_KEY_PAIR_IDENTIFIER_SIZE) PCBYTE pbId, _In_reads_bytes_(pParams->nTreeHeight *pParams->cbHashOutput) PCBYTE pbPath, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbPubKeyCandidate, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbRootCandidate)
Definition: lms.c:997
SIZE_T SYMCRYPT_CALL SymCryptLmsSizeofSignatureFromParams(_In_ PCSYMCRYPT_LMS_PARAMS pParams)
Definition: lms.c:446
static SIZE_T SYMCRYPT_CALL LmsOtsSizeofSignatureFromParams(_In_ PCSYMCRYPT_LMS_PARAMS pParams)
Definition: lms.c:190
#define SYMCRYPT_LMS_MAX_N
Definition: sc_lib.h:4703
@ SYMCRYPT_LMSKEY_TYPE_NONE
Definition: symcrypt.h:9622
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11
const SYMCRYPT_LMS_PARAMS * PCSYMCRYPT_LMS_PARAMS
UINT32 cbHashOutput
PCSYMCRYPT_HMAC_MD5_EXPANDED_KEY pKey

Referenced by SymCryptLmsVerify().

◆ SymCryptLsbFirstToUint32()

VOID SYMCRYPT_CALL SymCryptLsbFirstToUint32 ( _In_reads_(4 *cuResult) PCBYTE  pbData,
_Out_writes_(cuResult) PUINT32  puResult,
SIZE_T  cuResult 
)

Definition at line 487 of file sc_lib.h.

490{
491 while( cuResult != 0 )
492 {
493 *puResult = SYMCRYPT_LOAD_LSBFIRST32( pbData );
494 pbData += 4;
495 puResult++;
496 cuResult--;
497 }
498}
#define SYMCRYPT_LOAD_LSBFIRST32(p)
Definition: symcrypt.h:299

Referenced by SymCryptChaCha20Init(), SymCryptMd4StateImport(), and SymCryptMd5StateImport().

◆ SymCryptLsbFirstToUint64()

FORCEINLINE VOID SYMCRYPT_CALL SymCryptLsbFirstToUint64 ( _In_reads_(8 *cuResult) PCBYTE  pbData,
_Out_writes_(cuResult) PUINT64  puResult,
SIZE_T  cuResult 
)

Definition at line 554 of file sc_lib.h.

557{
558 while( cuResult != 0 )
559 {
560 *puResult = SYMCRYPT_LOAD_LSBFIRST64( pbData );
561 pbData += 8;
562 puResult++;
563 cuResult--;
564 }
565}
#define SYMCRYPT_LOAD_LSBFIRST64(p)
Definition: symcrypt.h:300

Referenced by SymCryptKeccakStateImport().

◆ SymCryptMarvin32AppendBlocks()

VOID SYMCRYPT_CALL SymCryptMarvin32AppendBlocks ( _Inout_ PSYMCRYPT_MARVIN32_CHAINING_STATE  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 194 of file marvin32.c.

198{
199 UINT32 s0 = pChain->s[0];
200 UINT32 s1 = pChain->s[1];
201
202 SIZE_T bytesInFirstBlock = cbData & 0xc; // 0, 4, 8, or 12
203
204 SYMCRYPT_ASSERT( (cbData & 3) == 0 );
205
206
207 pbData += bytesInFirstBlock;
208 cbData -= bytesInFirstBlock;
209
210 switch( bytesInFirstBlock )
211 {
212 case 0: // This handles the cbData == 0 case too
213 while( cbData > 0 )
214 {
215 pbData += 16;
216 cbData -= 16;
217
218 s0 += SYMCRYPT_LOAD_LSBFIRST32( pbData - 16 );
219 BLOCK( s0, s1 );
220 case 12:
221 s0 += SYMCRYPT_LOAD_LSBFIRST32( pbData - 12 );
222 BLOCK( s0, s1 );
223 case 8:
224 s0 += SYMCRYPT_LOAD_LSBFIRST32( pbData - 8 );
225 BLOCK( s0, s1 );
226 case 4:
227 s0 += SYMCRYPT_LOAD_LSBFIRST32( pbData - 4 );
228 BLOCK( s0, s1 );
229 }
230 }
231
232 pChain->s[0] = s0;
233 pChain->s[1] = s1;
234}
#define BLOCK(a, b)
Definition: marvin32.c:184
struct S1 s1

Referenced by SymCryptMarvin32Result().

◆ SymCryptMd2AppendBlocks()

VOID SYMCRYPT_CALL SymCryptMd2AppendBlocks ( _Inout_ SYMCRYPT_MD2_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptMd4AppendBlocks()

VOID SYMCRYPT_CALL SymCryptMd4AppendBlocks ( _Inout_ SYMCRYPT_MD4_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptMd5AppendBlocks()

VOID SYMCRYPT_CALL SymCryptMd5AppendBlocks ( _Inout_ SYMCRYPT_MD5_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 295 of file md5.c.

300{
301
302 UINT32 W[16];
303 UINT32 ad[4];
304 UINT32 Wt;
305
306 ad[0] = pChain->H[0];
307 ad[1] = pChain->H[3];
308 ad[2] = pChain->H[2];
309 ad[3] = pChain->H[1];
310
311 while( cbData >= 64 )
312 {
313 //
314 // initial rounds 1 to 16
315 //
316
317 IROUND( 0, F );
318 IROUND( 1, F );
319 IROUND( 2, F );
320 IROUND( 3, F );
321 IROUND( 4, F );
322 IROUND( 5, F );
323 IROUND( 6, F );
324 IROUND( 7, F );
325 IROUND( 8, F );
326 IROUND( 9, F );
327 IROUND( 10, F );
328 IROUND( 11, F );
329 IROUND( 12, F );
330 IROUND( 13, F );
331 IROUND( 14, F );
332 IROUND( 15, F );
333
334 FROUND( 16, G );
335 FROUND( 17, G );
336 FROUND( 18, G );
337 FROUND( 19, G );
338 FROUND( 20, G );
339 FROUND( 21, G );
340 FROUND( 22, G );
341 FROUND( 23, G );
342 FROUND( 24, G );
343 FROUND( 25, G );
344 FROUND( 26, G );
345 FROUND( 27, G );
346 FROUND( 28, G );
347 FROUND( 29, G );
348 FROUND( 30, G );
349 FROUND( 31, G );
350
351 FROUND( 32, H );
352 FROUND( 33, H );
353 FROUND( 34, H );
354 FROUND( 35, H );
355 FROUND( 36, H );
356 FROUND( 37, H );
357 FROUND( 38, H );
358 FROUND( 39, H );
359 FROUND( 40, H );
360 FROUND( 41, H );
361 FROUND( 42, H );
362 FROUND( 43, H );
363 FROUND( 44, H );
364 FROUND( 45, H );
365 FROUND( 46, H );
366 FROUND( 47, H );
367
368 FROUND( 48, I );
369 FROUND( 49, I );
370 FROUND( 50, I );
371 FROUND( 51, I );
372 FROUND( 52, I );
373 FROUND( 53, I );
374 FROUND( 54, I );
375 FROUND( 55, I );
376 FROUND( 56, I );
377 FROUND( 57, I );
378 FROUND( 58, I );
379 FROUND( 59, I );
380 FROUND( 60, I );
381 FROUND( 61, I );
382 FROUND( 62, I );
383 FROUND( 63, I );
384
385 pChain->H[0] = ad[0] = ad[0] + pChain->H[0];
386 pChain->H[3] = ad[1] = ad[1] + pChain->H[3];
387 pChain->H[2] = ad[2] = ad[2] + pChain->H[2];
388 pChain->H[1] = ad[3] = ad[3] + pChain->H[1];
389
390 pbData += 64;
391 cbData -= 64;
392 }
393
394 *pcbRemaining = cbData;
395
396 //
397 // Wipe the variables;
398 //
399 SymCryptWipeKnownSize( ad, sizeof( ad ) );
400 SymCryptWipeKnownSize( W, sizeof( W ) );
401 SymCryptWipeKnownSize( &Wt, sizeof( Wt ) );
402}
#define F(x, y, z)
Definition: md5.c:51
#define I(x, y, z)
Definition: md5.c:55
#define G(x, y, z)
Definition: md5.c:52
#define H(x, y, z)
Definition: md5.c:53
#define FROUND(r, Func)
Definition: md5.c:288
#define IROUND(r, Func)
Definition: md5.c:278

◆ SymCryptModExpGeneric()

VOID SYMCRYPT_CALL SymCryptModExpGeneric ( _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 at line 217 of file modexp.c.

226{
227 if ( ((flags & SYMCRYPT_FLAG_DATA_PUBLIC)!=0) && (nBitsExp <= sizeof(UINT32)*8) )
228 {
229 SymCryptModExpSquareAndMultiply32( pmMod, peBase, piExp, peDst, pbScratch, cbScratch );
230 }
231 else
232 {
233 SymCryptModExpWindowed( pmMod, peBase, piExp, nBitsExp, peDst, pbScratch, cbScratch ); // This is the default
234 }
235}
VOID SYMCRYPT_CALL SymCryptModExpWindowed(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peBase, _In_ PCSYMCRYPT_INT piExp, UINT32 nBitsExp, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: modexp.c:56
VOID SYMCRYPT_CALL SymCryptModExpSquareAndMultiply32(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peBase, _In_ PCSYMCRYPT_INT piExp, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: modexp.c:162

Referenced by SymCryptModExp().

◆ SymCryptModMultiExpGeneric()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModMultiExpGeneric ( _In_ PCSYMCRYPT_MODULUS  pmMod,
_In_reads_(nBases) PCSYMCRYPT_MODELEMENT *  peBaseArray,
_In_reads_(nBases) PCSYMCRYPT_INT *  piExpArray,
UINT32  nBases,
UINT32  nBitsExp,
UINT32  flags,
_Out_ PSYMCRYPT_MODELEMENT  peDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 449 of file modexp.c.

459{
460 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
461
462 if ( (nBases > SYMCRYPT_MODMULTIEXP_MAX_NBASES) ||
464 {
465 scError = SYMCRYPT_INVALID_ARGUMENT;
466 goto cleanup;
467 }
468
470 {
471 SymCryptModMultiExpWnafWithInterleaving( pmMod, peBaseArray, piExpArray, nBases, nBitsExp, peDst, pbScratch, cbScratch );
472 }
473 else
474 {
476 PSYMCRYPT_MODELEMENT peTemp = NULL;
478
479 // Use two temporary modelements to store the results
480 // *** Make sure that the scratch space is enough i.e. the scratch space of ModMultiExp is
481 // at least 2 modelements bigger than the scratch space of ModExp
483
487
488 peTemp = SymCryptModElementCreate( pbScratch, cbModElement, pmMod );
489 pbScratch += cbModElement; cbScratch -= cbModElement;
490
491 peAcc = SymCryptModElementCreate( pbScratch, cbModElement, pmMod );
492 pbScratch += cbModElement; cbScratch -= cbModElement;
493
494 // Set peAcc to 1
495 SymCryptModElementSetValueUint32( 1, pmMod, peAcc, pbScratch, cbScratch );
496
497 for (UINT32 i=0; i<nBases; i++)
498 {
499 SymCryptModExpWindowed( pmMod, peBaseArray[i], piExpArray[i], nBitsExp, peTemp, pbScratch, cbScratch );
500
501 SymCryptModMul( pmMod, peAcc, peTemp, peAcc, pbScratch, cbScratch );
502 }
503
504 // Copy the result into the destination
505 SymCryptModElementCopy( pmMod, peAcc, peDst );
506 }
507
508cleanup:
509 return scError;
510}
VOID SYMCRYPT_CALL SymCryptModMultiExpWnafWithInterleaving(_In_ PCSYMCRYPT_MODULUS pmMod, _In_reads_(nBases) PCSYMCRYPT_MODELEMENT *peBaseArray, _In_reads_(nBases) PCSYMCRYPT_INT *piExpArray, UINT32 nBases, UINT32 nBitsExp, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: modexp.c:289
UINT32 cbModElement
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODMULTIEXP(_nDigits, _nBases, _nBitsExp)
#define SYMCRYPT_MODMULTIEXP_MAX_NBASES
VOID SYMCRYPT_CALL SymCryptModElementSetValueUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:908
#define SYMCRYPT_MODMULTIEXP_MAX_NBITSEXP
UINT32 SYMCRYPT_CALL SymCryptModulusDigitsizeOfObject(_In_ PCSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:635
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)

Referenced by SymCryptModMultiExp().

◆ SymCryptMontgomeryFillScratchSpaces()

VOID SYMCRYPT_CALL SymCryptMontgomeryFillScratchSpaces ( _In_ PSYMCRYPT_ECURVE  pCurve)

Definition at line 11 of file ec_montgomery.c.

12{
13 UINT32 nDigits = SymCryptDigitsFromBits( pCurve->FModBitsize );
16 UINT32 cbModElement = pCurve->cbModElement;
17 UINT32 nDigitsFieldLength = pCurve->FModDigits;
18
19 //
20 // All the scratch space computations are upper bounded by the SizeofXXX bound (2^19) and
21 // the SCRATCH_BYTES_FOR_XXX bound (2^24) (see symcrypt_internal.h).
22 //
23 // One caveat is SymCryptSizeofEcpointFromCurve and SymCryptSizeofEcpointEx which calculate the
24 // size of EcPoint with 4 coordinates (each one a modelement of max size 2^17). Thus upper
25 // bounded by 2^20.
26 //
27
28 pCurve->cbScratchCommon = nCommon;
29 pCurve->cbScratchScalar =
31 6 * nBytes +
32 nCommon;
33
34 pCurve->cbScratchScalarMulti = 0;
35 pCurve->cbScratchGetSetValue =
37 2 * cbModElement +
39 SYMCRYPT_SCRATCH_BYTES_FOR_MODINV( nDigitsFieldLength ) );
40
41 pCurve->cbScratchGetSetValue = SYMCRYPT_MAX( pCurve->cbScratchGetSetValue, SymCryptSizeofIntFromDigits( nDigits ) );
42
43 pCurve->cbScratchEckey =
46 SYMCRYPT_MAX( pCurve->cbScratchScalar, pCurve->cbScratchGetSetValue );
47}
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointEx(UINT32 cbModElement, UINT32 numOfCoordinates)
Definition: ecpoint.c:19
#define SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH
UINT32 SymCryptDigitsFromBits(UINT32 nBits)
Definition: a_dispatch.c:111
UINT32 SYMCRYPT_CALL SymCryptEcurveDigitsofScalarMultiplier(_In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecurve.c:710

◆ SymCryptMontgomeryIsEqual()

UINT32 SYMCRYPT_CALL SymCryptMontgomeryIsEqual ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 78 of file ec_montgomery.c.

86{
87 PSYMCRYPT_MODELEMENT peTemp[2];
88 PSYMCRYPT_MODELEMENT peSrc1X, peSrc1Z;
89 PSYMCRYPT_MODELEMENT peSrc2X, peSrc2Z;
90 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
91 SIZE_T nBytes;
92
95 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) );
97
99
100 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
101
102 SYMCRYPT_ASSERT( cbScratch >= 2 * nBytes );
103
104 for (UINT32 i = 0; i < 2; ++i)
105 {
106 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
107 pbScratch += nBytes;
108 cbScratch -= nBytes;
109 }
110
111 peSrc1X = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc1 );
112 peSrc1Z = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc1 );
113
114 peSrc2X = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc2 );
115 peSrc2Z = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc2 );
116
117 // peTemp[0] = X1 * Z2
118 SymCryptModMul( pmMod, peSrc1X, peSrc2Z, peTemp[0], pbScratch, cbScratch );
119
120 // peTemp[1] = X2 * Z1
121 SymCryptModMul( pmMod, peSrc2X, peSrc1Z, peTemp[1], pbScratch, cbScratch );
122
123 return SymCryptModElementIsEqual( pmMod, peTemp[0], peTemp[1] );
124}
#define SYMCRYPT_INTERNAL_SCRATCH_BYTES_FOR_COMMON_ECURVE_OPERATIONS(_pCurve)
#define SYMCRYPT_CURVE_IS_MONTGOMERY_TYPE(_pCurve)
UINT32 SYMCRYPT_CALL SymCryptModElementIsEqual(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2)
Definition: a_dispatch.c:818
#define SYMCRYPT_FLAG_ECPOINT_NEG_EQUAL
#define SYMCRYPT_FLAG_ECPOINT_EQUAL

◆ SymCryptMontgomeryIsZero()

UINT32 SYMCRYPT_CALL SymCryptMontgomeryIsZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 128 of file ec_montgomery.c.

134{
136 PSYMCRYPT_MODELEMENT peZ = NULL; // Pointer to Z
137
140
141 UNREFERENCED_PARAMETER( pbScratch );
143
144 // Getting pointer to Z of the source point
146
147 return SymCryptModElementIsZero( FMod, peZ );
148}
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
Definition: a_dispatch.c:828

◆ SymCryptMontgomeryPointScalarMul()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMontgomeryPointScalarMul ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_INT  piScalar,
_In_opt_ PCSYMCRYPT_ECPOINT  poSrc,
UINT32  flags,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 297 of file ec_montgomery.c.

307{
308 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
309
310 PSYMCRYPT_MODULUS pmMod;
311 PSYMCRYPT_MODELEMENT peX1, peZ1, peA24, peX2, peZ2, peX3, peZ3, peTemp1, peTemp2, peResult;
312 UINT32 i, nBytes, nDigits, cond, newcond, nCommon;
313 PBYTE pBegin;
314 SIZE_T cbAllScratch;
315
317 SYMCRYPT_ASSERT( (poSrc == NULL || SymCryptEcurveIsSame(pCurve, poSrc->pCurve)) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
318
319 // Make sure we only specify the correct flags
321 {
322 scError = SYMCRYPT_INVALID_ARGUMENT;
323 goto cleanup;
324 }
325
326 if (poSrc == NULL)
327 {
328 poSrc = pCurve->G;
329 }
330
331 //
332 // Set up structure for X2, Z2, X3, Z3, Temp1, and Temp2, and the scratch space.
333 //
334 pmMod = pCurve->FMod;
335
336 nDigits = SymCryptDigitsFromBits( pCurve->FModBitsize );
337 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
339
340 SYMCRYPT_ASSERT( cbScratch >= 6 * nBytes + nCommon );
341
342 cbAllScratch = cbScratch;
343 pBegin = pbScratch;
344
345 //
346 // Create mod elements
347 //
348 peX2 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
349 pbScratch += nBytes;
350
351 peZ2 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
352 pbScratch += nBytes;
353
354 peX3 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
355 pbScratch += nBytes;
356
357 peZ3 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
358 pbScratch += nBytes;
359
360 peTemp1 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
361 pbScratch += nBytes;
362
363 peTemp2 = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
364 pbScratch += nBytes;
365
366 cbScratch = nCommon;
367
368 //
369 // Set up values
370 //
371
372 peA24 = pCurve->A;
373
374 // X1 = X, Z1 = Z
377
378 // X2 = 1, Z2 = 0, X3 = X, Z3 = Z
379 SymCryptModElementSetValueUint32( 1, pmMod, peX2, pbScratch, cbScratch );
380 SymCryptModElementSetValueUint32( 0, pmMod, peZ2, pbScratch, cbScratch );
381 SymCryptModElementCopy( pmMod, peX1, peX3 );
382 SymCryptModElementCopy( pmMod, peZ1, peZ3 );
383
384 if ( poSrc->normalized )
385 {
386 // Set peZ1 to NULL to avoid redundant multiplications in SymCryptMontgomeryDoubleAndAdd
387 peZ1 = NULL;
388 }
389
390 //
391 // Montgomery ladder scalar multiplication
392 //
393
394 i = (pCurve->GOrdBitsize + pCurve->coFactorPower);
395 cond = 0;
396 while ( i != 0 )
397 {
398 // If cond = 0, we have (X2, Z2, X3, Z3)
399 // if cond = 1, we have (X3, Z3, X2, Z2)
400 i--;
401 newcond = SymCryptIntGetBit( piScalar, i );
402 cond ^= newcond;
403
404 SymCryptModElementConditionalSwap( pmMod, peX2, peX3, cond);
405 SymCryptModElementConditionalSwap( pmMod, peZ2, peZ3, cond);
406
407 cond = newcond;
408
409 SymCryptMontgomeryDoubleAndAdd( pmMod, peX1, peZ1, peA24, peX2, peZ2, peX3, peZ3, peTemp1, peTemp2, pbScratch, cbScratch );
410 }
411
412 // Now put them back in the normal order
413 SymCryptModElementConditionalSwap( pmMod, peX2, peX3, cond);
414 SymCryptModElementConditionalSwap( pmMod, peZ2, peZ3, cond);
415
416 // Multiply by the cofactor (if needed) by continuing the doubling
418 {
419 i = pCurve->coFactorPower;
420 while (i!=0)
421 {
422 i--;
423 // We only use the doubling output here, so we definitely don't need to provide Z1
424 // We could refactor to have a separate SymCryptMontgomeryDouble function but for Curve25519 this loop is ~1% of runtime
425 SymCryptMontgomeryDoubleAndAdd( pmMod, peX1, NULL, peA24, peX2, peZ2, peX3, peZ3, peTemp1, peTemp2, pbScratch, cbScratch );
426 }
427 }
428
429 // Set X coordinate
430 peResult = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst);
431 SymCryptModElementCopy( pCurve->FMod, peX2, peResult );
432
433 // Set Z coordinate
434 peResult = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst);
435 SymCryptModElementCopy( pCurve->FMod, peZ2, peResult );
436
437 poDst->normalized = FALSE;
438
439 scError = SYMCRYPT_NO_ERROR;
440
441cleanup:
442 return scError;
443}
VOID SymCryptMontgomeryDoubleAndAdd(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peX1, _In_opt_ PCSYMCRYPT_MODELEMENT peZ1, _In_ PCSYMCRYPT_MODELEMENT peA24, _Inout_ PSYMCRYPT_MODELEMENT peX2, _Inout_ PSYMCRYPT_MODELEMENT peZ2, _Inout_ PSYMCRYPT_MODELEMENT peX3, _Inout_ PSYMCRYPT_MODELEMENT peZ3, _Inout_ PSYMCRYPT_MODELEMENT peTemp1, _Inout_ PSYMCRYPT_MODELEMENT peTemp2, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SymCryptModElementConditionalSwap(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peData1, _Inout_ PSYMCRYPT_MODELEMENT peData2, _In_ UINT32 cond)
Definition: a_dispatch.c:709

◆ SymCryptMontgomerySetDistinguished()

VOID SYMCRYPT_CALL SymCryptMontgomerySetDistinguished ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptMsbFirstToUint32()

VOID SYMCRYPT_CALL SymCryptMsbFirstToUint32 ( _In_reads_(4 *cuResult) PCBYTE  pbData,
_Out_writes_(cuResult) PUINT32  puResult,
SIZE_T  cuResult 
)

Definition at line 422 of file sc_lib.h.

425{
426 while( cuResult != 0 )
427 {
428 *puResult = SYMCRYPT_LOAD_MSBFIRST32( pbData );
429 puResult++;
430 pbData += 4;
431 cuResult--;
432 }
433}

Referenced by SymCryptSha1StateImport(), and SymCryptSha256StateImportCore().

◆ SymCryptMsbFirstToUint64()

VOID SYMCRYPT_CALL SymCryptMsbFirstToUint64 ( _In_reads_(8 *cuResult) PCBYTE  pbData,
_Out_writes_(cuResult) PUINT64  puResult,
SIZE_T  cuResult 
)

Definition at line 592 of file sc_lib.h.

595{
596 while( cuResult != 0 )
597 {
598 *puResult = SYMCRYPT_LOAD_MSBFIRST64( pbData );
599 puResult++;
600 pbData += 8;
601 cuResult--;
602 }
603}

Referenced by SymCryptSha512StateImportCore().

◆ SymCryptOfflinePrecomputation()

VOID SYMCRYPT_CALL SymCryptOfflinePrecomputation ( _In_ PSYMCRYPT_ECURVE  pCurve,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 55 of file ec_mul.c.

60{
62
64
66
67 poQ = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
68 SYMCRYPT_ASSERT( poQ != NULL );
69 pbScratch += cbEcpoint;
70 cbScratch -= cbEcpoint;
71
73 pCurve,
74 pCurve->info.sw.nPrecompPoints,
75 pCurve->info.sw.poPrecompPoints,
76 poQ,
77 pbScratch,
78 cbScratch );
79}

Referenced by SymCryptEcurveInitialize().

◆ SymCryptParallelHashProcess()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptParallelHashProcess ( _In_ PCSYMCRYPT_PARALLEL_HASH  pParHash,
_Inout_updates_bytes_(nStates *pParHash->pHash->stateSize) PVOID  pStates,
SIZE_T  nStates,
_Inout_updates_(nOperations) PSYMCRYPT_PARALLEL_HASH_OPERATION  pOperations,
SIZE_T  nOperations,
_Out_writes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch,
UINT32  maxParallel 
)

◆ SymCryptParallelHashProcess_serial()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptParallelHashProcess_serial ( _In_ PCSYMCRYPT_PARALLEL_HASH  pParHash,
_Inout_updates_bytes_(nStates *pParHash->pHash->stateSize) PVOID  pStates,
SIZE_T  nStates,
_Inout_updates_(nOperations) PSYMCRYPT_PARALLEL_HASH_OPERATION  pOperations,
SIZE_T  nOperations,
_Out_writes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptParallelSha256AppendBlocks_ymm()

VOID SYMCRYPT_CALL SymCryptParallelSha256AppendBlocks_ymm ( _Inout_updates_(8) PSYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_Inout_updates_(8) PCBYTE *  ppByte,
SIZE_T  nBytes,
_Out_writes_(PAR_SCRATCH_ELEMENTS_256 *32) PBYTE  pScratch 
)

◆ SymCryptParallelSha512AppendBlocks_ymm()

VOID SYMCRYPT_CALL SymCryptParallelSha512AppendBlocks_ymm ( _Inout_updates_(4) PSYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_Inout_updates_(4) PCBYTE *  ppByte,
SIZE_T  nBytes,
_Out_writes_(PAR_SCRATCH_ELEMENTS_512 *32) PBYTE  pScratch 
)

◆ SymCryptPositiveWidthNafRecoding()

VOID SYMCRYPT_CALL SymCryptPositiveWidthNafRecoding ( UINT32  W,
_In_ PCSYMCRYPT_INT  piK,
UINT32  nBitsExp,
_Out_writes_(nRecodedDigits) PUINT32  absofKIs,
UINT32  nRecodedDigits 
)

Definition at line 180 of file recoding.c.

187{
188 UINT32 T1 = 0;
189 UINT32 cntrZ = W; // Counter that specifies when we filled the last non-zero NAF digit
190
191 SYMCRYPT_ASSERT( nRecodedDigits <= SymCryptIntBitsizeOfObject( piK ) );
192
193 for (UINT32 i=0; i < nRecodedDigits; i++)
194 {
195 T1 = SymCryptIntGetBits( piK, i, SYMCRYPT_MIN(W, nBitsExp-i) ); // Get a batch of W bits (but don't go over nBitsExp)
196
197 if ((cntrZ>=W) && ((T1 & 0x01) > 0)) // Only store odd digits
198 {
199 absofKIs[i] = T1;
200 cntrZ = 0;
201 }
202 else
203 {
204 absofKIs[i] = 0;
205 }
206
207 cntrZ++; // Prepare the counter for the next iteration
208 }
209}
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfObject(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:200
UINT32 SYMCRYPT_CALL SymCryptIntGetBits(_In_ PCSYMCRYPT_INT piSrc, UINT32 iBit, UINT32 nBits)
Definition: a_dispatch.c:403

Referenced by SymCryptModMultiExpWnafWithInterleaving().

◆ SymCryptRsaSignVerifyPct()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaSignVerifyPct ( PCSYMCRYPT_RSAKEY  pkRsakey)

Definition at line 51 of file implglue.c.

52{
53 return SYMCRYPT_NO_ERROR;
54}

Referenced by SymCryptRsakeyGenerate().

◆ SymCryptSha1AppendBlocks()

VOID SYMCRYPT_CALL SymCryptSha1AppendBlocks ( _Inout_ SYMCRYPT_SHA1_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 230 of file sha1.c.

235{
236
238 UINT32 A, B, C, D, E;
239 UINT32 Wt;
240
241 A = pChain->H[0];
242 B = pChain->H[1];
243 C = pChain->H[2];
244 D = pChain->H[3];
245 E = pChain->H[4];
246
247 while( cbData >= 64 )
248 {
249 //
250 // initial rounds 1 to 16
251 //
252
253 IROUND( A, B, C, D, E, 0, CH );
254 IROUND( E, A, B, C, D, 1, CH );
255 IROUND( D, E, A, B, C, 2, CH );
256 IROUND( C, D, E, A, B, 3, CH );
257 IROUND( B, C, D, E, A, 4, CH );
258 IROUND( A, B, C, D, E, 5, CH );
259 IROUND( E, A, B, C, D, 6, CH );
260 IROUND( D, E, A, B, C, 7, CH );
261 IROUND( C, D, E, A, B, 8, CH );
262 IROUND( B, C, D, E, A, 9, CH );
263 IROUND( A, B, C, D, E, 10, CH );
264 IROUND( E, A, B, C, D, 11, CH );
265 IROUND( D, E, A, B, C, 12, CH );
266 IROUND( C, D, E, A, B, 13, CH );
267 IROUND( B, C, D, E, A, 14, CH );
268 IROUND( A, B, C, D, E, 15, CH );
269
270 //
271 // Full rounds (including msg expansion) from here on
272 //
273 FROUND( E, A, B, C, D, 16, CH );
274 FROUND( D, E, A, B, C, 17, CH );
275 FROUND( C, D, E, A, B, 18, CH );
276 FROUND( B, C, D, E, A, 19, CH );
277
278
279 FROUND( A, B, C, D, E, 20, PARITY );
280 FROUND( E, A, B, C, D, 21, PARITY );
281 FROUND( D, E, A, B, C, 22, PARITY );
282 FROUND( C, D, E, A, B, 23, PARITY );
283 FROUND( B, C, D, E, A, 24, PARITY );
284 FROUND( A, B, C, D, E, 25, PARITY );
285 FROUND( E, A, B, C, D, 26, PARITY );
286 FROUND( D, E, A, B, C, 27, PARITY );
287 FROUND( C, D, E, A, B, 28, PARITY );
288 FROUND( B, C, D, E, A, 29, PARITY );
289 FROUND( A, B, C, D, E, 30, PARITY );
290 FROUND( E, A, B, C, D, 31, PARITY );
291 FROUND( D, E, A, B, C, 32, PARITY );
292 FROUND( C, D, E, A, B, 33, PARITY );
293 FROUND( B, C, D, E, A, 34, PARITY );
294 FROUND( A, B, C, D, E, 35, PARITY );
295 FROUND( E, A, B, C, D, 36, PARITY );
296 FROUND( D, E, A, B, C, 37, PARITY );
297 FROUND( C, D, E, A, B, 38, PARITY );
298 FROUND( B, C, D, E, A, 39, PARITY );
299
300
301 FROUND( A, B, C, D, E, 40, MAJ );
302 FROUND( E, A, B, C, D, 41, MAJ );
303 FROUND( D, E, A, B, C, 42, MAJ );
304 FROUND( C, D, E, A, B, 43, MAJ );
305 FROUND( B, C, D, E, A, 44, MAJ );
306 FROUND( A, B, C, D, E, 45, MAJ );
307 FROUND( E, A, B, C, D, 46, MAJ );
308 FROUND( D, E, A, B, C, 47, MAJ );
309 FROUND( C, D, E, A, B, 48, MAJ );
310 FROUND( B, C, D, E, A, 49, MAJ );
311 FROUND( A, B, C, D, E, 50, MAJ );
312 FROUND( E, A, B, C, D, 51, MAJ );
313 FROUND( D, E, A, B, C, 52, MAJ );
314 FROUND( C, D, E, A, B, 53, MAJ );
315 FROUND( B, C, D, E, A, 54, MAJ );
316 FROUND( A, B, C, D, E, 55, MAJ );
317 FROUND( E, A, B, C, D, 56, MAJ );
318 FROUND( D, E, A, B, C, 57, MAJ );
319 FROUND( C, D, E, A, B, 58, MAJ );
320 FROUND( B, C, D, E, A, 59, MAJ );
321
322 FROUND( A, B, C, D, E, 60, PARITY );
323 FROUND( E, A, B, C, D, 61, PARITY );
324 FROUND( D, E, A, B, C, 62, PARITY );
325 FROUND( C, D, E, A, B, 63, PARITY );
326 FROUND( B, C, D, E, A, 64, PARITY );
327 FROUND( A, B, C, D, E, 65, PARITY );
328 FROUND( E, A, B, C, D, 66, PARITY );
329 FROUND( D, E, A, B, C, 67, PARITY );
330 FROUND( C, D, E, A, B, 68, PARITY );
331 FROUND( B, C, D, E, A, 69, PARITY );
332 FROUND( A, B, C, D, E, 70, PARITY );
333 FROUND( E, A, B, C, D, 71, PARITY );
334 FROUND( D, E, A, B, C, 72, PARITY );
335 FROUND( C, D, E, A, B, 73, PARITY );
336 FROUND( B, C, D, E, A, 74, PARITY );
337 FROUND( A, B, C, D, E, 75, PARITY );
338 FROUND( E, A, B, C, D, 76, PARITY );
339 FROUND( D, E, A, B, C, 77, PARITY );
340 FROUND( C, D, E, A, B, 78, PARITY );
341 FROUND( B, C, D, E, A, 79, PARITY );
342
343
344 pChain->H[0] = A = A + pChain->H[0];
345 pChain->H[1] = B = B + pChain->H[1];
346 pChain->H[2] = C = C + pChain->H[2];
347 pChain->H[3] = D = D + pChain->H[3];
348 pChain->H[4] = E = E + pChain->H[4];
349
350 pbData += 64;
351 cbData -= 64;
352 }
353
354 *pcbRemaining = cbData;
355
356 //
357 // Wipe the variables;
358 //
359 SymCryptWipeKnownSize( W, sizeof( W ) );
364 SYMCRYPT_FORCE_WRITE32( &E, 0 );
365 SYMCRYPT_FORCE_WRITE32( &Wt, 0 );
366}
#define D(d)
Definition: builtin.c:4557
#define C(c)
Definition: builtin.c:4556
Definition: ehthrow.cxx:93
Definition: ehthrow.cxx:54
Definition: terminate.cpp:24
#define A(row, col)
#define B(row, col)
enum _CH CH
#define IROUND(a, b, c, d, e, r, F)
Definition: sha1.c:213
#define FROUND(a, b, c, d, e, r, F)
Definition: sha1.c:223
#define PARITY(x, y, z)
Definition: sha1.c:178
#define MAJ(x, y, z)
Definition: sha1.c:175

Referenced by SymCryptSha1Result().

◆ SymCryptSha256AppendBlocks()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 1812 of file sha256.c.

1817{
1818#if SYMCRYPT_CPU_AMD64
1819
1820 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1821
1823 SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1824 {
1825 SymCryptSha256AppendBlocks_shani(pChain, pbData, cbData, pcbRemaining);
1826
1827 SymCryptRestoreXmm(&SaveData);
1828 }
1829 // Temporarily disabling use of Ymm in SHA2
1830 // else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_AVX2 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1831 // SymCryptSaveYmm(&SaveData) == SYMCRYPT_NO_ERROR)
1832 // {
1833 // //SymCryptSha256AppendBlocks_ul1(pChain, pbData, cbData, pcbRemaining);
1834 // //SymCryptSha256AppendBlocks_ymm_8blocks(pChain, pbData, cbData, pcbRemaining);
1835 // SymCryptSha256AppendBlocks_ymm_avx2_asm(pChain, pbData, cbData, pcbRemaining);
1836
1837 // SymCryptRestoreYmm(&SaveData);
1838 // }
1839 else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1840 SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1841 {
1842 //SymCryptSha256AppendBlocks_xmm_4blocks(pChain, pbData, cbData, pcbRemaining);
1844
1845 SymCryptRestoreXmm(&SaveData);
1846 }
1847 else
1848 {
1849 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1850 //SymCryptSha256AppendBlocks_ul2(pChain, pbData, cbData, pcbRemaining);
1851 }
1852#elif SYMCRYPT_CPU_X86
1853 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1854
1855 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE | SYMCRYPT_CPU_FEATURE_SAVEXMM_NOFAIL ) &&
1856 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
1857 {
1858 SymCryptSha256AppendBlocks_shani( pChain, pbData, cbData, pcbRemaining );
1859 SymCryptRestoreXmm( &SaveData );
1860 }
1861 else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_SSSE3 | SYMCRYPT_CPU_FEATURE_BMI2)
1862 && SymCryptSaveXmm(&SaveData) == SYMCRYPT_NO_ERROR)
1863 {
1865 SymCryptRestoreXmm(&SaveData);
1866 }
1867 else {
1868 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1869 }
1870#elif SYMCRYPT_CPU_ARM64
1871 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_SHA256 ) )
1872 {
1873 SymCryptSha256AppendBlocks_instr( pChain, pbData, cbData, pcbRemaining );
1874 } else {
1875 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1876 }
1877#else
1878 SymCryptSha256AppendBlocks_ul1( pChain, pbData, cbData, pcbRemaining );
1879#endif
1880
1881 //SymCryptSha256AppendBlocks_ul2( pChain, pbData, cbData, pcbRemaining );
1882 //SymCryptSha256AppendBlocks_xmm1( pChain, pbData, cbData, pcbRemaining ); !!! Needs Save/restore logic
1883 //SymCryptSha256AppendBlocks_xmm2( pChain, pbData, cbData, pcbRemaining );
1884}
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_4blocks(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
#define SYMCRYPT_CPU_FEATURES_FOR_SHANI_CODE
Definition: sc_lib.h:312
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_ssse3_asm(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ul1(_Inout_ SYMCRYPT_SHA256_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
Definition: sha256.c:739

Referenced by SymCryptSha256Append(), and SymCryptSha256Result().

◆ SymCryptSha256AppendBlocks_xmm_4blocks()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_4blocks ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha256AppendBlocks_xmm_ssse3_asm()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_xmm_ssse3_asm ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha256AppendBlocks_ymm_8blocks()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ymm_8blocks ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha256AppendBlocks_ymm_avx2_asm()

VOID SYMCRYPT_CALL SymCryptSha256AppendBlocks_ymm_avx2_asm ( _Inout_ SYMCRYPT_SHA256_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

Definition at line 1643 of file sha512.c.

1648{
1649#if SYMCRYPT_CPU_AMD64
1650
1651 // Temporarily disabling use of Ymm in SHA2
1652 // SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1653
1654 // if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_AVX512 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1655 // SymCryptSaveYmm(&SaveData) == SYMCRYPT_NO_ERROR)
1656 // {
1657 // SymCryptSha512AppendBlocks_ymm_avx512vl_asm(pChain, pbData, cbData, pcbRemaining);
1658
1659 // SymCryptRestoreYmm(&SaveData);
1660 // }
1661 // else if (SYMCRYPT_CPU_FEATURES_PRESENT(SYMCRYPT_CPU_FEATURE_AVX2 | SYMCRYPT_CPU_FEATURE_BMI2) &&
1662 // SymCryptSaveYmm(&SaveData) == SYMCRYPT_NO_ERROR)
1663 // {
1664 // //SymCryptSha512AppendBlocks_ymm_1block(pChain, pbData, cbData, pcbRemaining);
1665 // //SymCryptSha512AppendBlocks_ymm_2blocks(pChain, pbData, cbData, pcbRemaining);
1666 // //SymCryptSha512AppendBlocks_ymm_4blocks(pChain, pbData, cbData, pcbRemaining);
1667 // SymCryptSha512AppendBlocks_ymm_avx2_asm(pChain, pbData, cbData, pcbRemaining);
1668
1669 // SymCryptRestoreYmm(&SaveData);
1670 // }
1671 // else
1672 {
1673 SymCryptSha512AppendBlocks_ull( pChain, pbData, cbData, pcbRemaining );
1674 //SymCryptSha512AppendBlocks_ull2( pChain, pbData, cbData, pcbRemaining );
1675 //SymCryptSha512AppendBlocks_ull3( pChain, pbData, cbData, pcbRemaining );
1676 }
1677
1678
1679#elif SYMCRYPT_CPU_ARM
1680
1681 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
1682 {
1683 SymCryptSha512AppendBlocks_neon( pChain, pbData, cbData, pcbRemaining ); // Tegra T3: 48 c/B
1684 } else {
1685 SymCryptSha512AppendBlocks_ull( pChain, pbData, cbData, pcbRemaining ); // Tegra T3: 65.34 c/B
1686 //SymCryptSha512AppendBlocks_ull2( pChain, pbData, cbData, pcbRemaining ); // Tegra T3: 77.4 c/B
1687 //SymCryptSha512AppendBlocks_ull3( pChain, pbData, cbData, pcbRemaining ); // Tegra T3: 71.6 c/B
1688 }
1689
1690#elif SYMCRYPT_CPU_X86
1691
1692 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
1693
1694 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSSE3 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
1695 {
1696 SymCryptSha512AppendBlocks_xmm( pChain, pbData, cbData, pcbRemaining );
1697 SymCryptRestoreXmm( &SaveData );
1698 } else {
1699 SymCryptSha512AppendBlocks_ull( pChain, pbData, cbData, pcbRemaining ); // core2: 36.40 c/B
1700 //SymCryptSha512AppendBlocks_ull2( pChain, pbData, cbData, pcbRemaining ); // core2: 49.09 c/B
1701 //SymCryptSha512AppendBlocks_ull3( pChain, pbData, cbData, pcbRemaining ); // core2: 38.29 c/B
1702 }
1703
1704#else
1705
1706 SymCryptSha512AppendBlocks_ull( pChain, pbData, cbData, pcbRemaining ); // need tuning...
1707
1708#endif
1709}
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_xmm(_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ull(_Inout_ SYMCRYPT_SHA512_CHAINING_STATE *pChain, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_ SIZE_T *pcbRemaining)
Definition: sha512.c:907

Referenced by SymCryptSha512Append(), and SymCryptSha512Result().

◆ SymCryptSha512AppendBlocks_xmm()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_xmm ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks_ymm_1block()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_1block ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks_ymm_2blocks()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_2blocks ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks_ymm_4blocks()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_4blocks ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks_ymm_avx2_asm()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_avx2_asm ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptSha512AppendBlocks_ymm_avx512vl_asm()

VOID SYMCRYPT_CALL SymCryptSha512AppendBlocks_ymm_avx512vl_asm ( _Inout_ SYMCRYPT_SHA512_CHAINING_STATE *  pChain,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData,
_Out_ SIZE_T *  pcbRemaining 
)

◆ SymCryptShortWeierstrassAdd()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassAdd ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
_Out_ PSYMCRYPT_ECPOINT  poDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 843 of file ec_short_weierstrass.c.

852{
853 UINT32 dSrc1Zero = 0;
854 UINT32 dSrc2Zero = 0;
855 UINT32 dSrcEqual = 0;
856
857 // Temporary points
858 PSYMCRYPT_ECPOINT poQ0 = NULL;
859 PSYMCRYPT_ECPOINT poQ1 = NULL;
860
862
864 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
866
867 SYMCRYPT_ASSERT( cbScratch > 2*cbEcpoint );
868
869 if ((flags & SYMCRYPT_FLAG_DATA_PUBLIC) != 0)
870 {
871 SymCryptShortWeierstrassAddSideChannelUnsafe( pCurve, poSrc1, poSrc2, poDst, pbScratch, cbScratch );
872 }
873 else
874 {
875 // Creating temporary points
876 poQ0 = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
877 SYMCRYPT_ASSERT( poQ0 != NULL);
878 pbScratch += cbEcpoint;
879
880 poQ1 = SymCryptEcpointCreate( pbScratch, cbEcpoint, pCurve );
881 SYMCRYPT_ASSERT( poQ1 != NULL);
882 pbScratch += cbEcpoint;
883
884 // Fixing remaining scratch space size
885 cbScratch -= 2*cbEcpoint;
886
887 // Calculate the masks
888 dSrc1Zero = SymCryptShortWeierstrassIsZero( pCurve, poSrc1, pbScratch, cbScratch );
889 dSrc2Zero = SymCryptShortWeierstrassIsZero( pCurve, poSrc2, pbScratch, cbScratch );
890 dSrcEqual = SymCryptShortWeierstrassIsEqual( pCurve, poSrc1, poSrc2, SYMCRYPT_FLAG_ECPOINT_EQUAL, pbScratch, cbScratch );
891
892 // Side-channel safe computations
893 SymCryptShortWeierstrassAddDiffNonZero( pCurve, poSrc1, poSrc2, poQ0, pbScratch, cbScratch ); // This covers the cases where Src1 != Src2 or Src1 = -Src2
894
895 SymCryptEcpointDouble( pCurve, poSrc1, poQ1, 0, pbScratch, cbScratch ); // Dispatch to Double function; enables type assertion on SymCryptShortWeierstrassDouble to be specific
896 SymCryptEcpointMaskedCopy( pCurve, poQ1, poQ0, dSrcEqual ); // (Masked) copy if the points are equal
897
898 SymCryptEcpointMaskedCopy( pCurve, poSrc1, poQ0, dSrc2Zero ); // (Masked) copy if Src2 = 0
899 SymCryptEcpointMaskedCopy( pCurve, poSrc2, poQ0, dSrc1Zero ); // (Masked) copy if Src1 = 0
900
901 SymCryptEcpointCopy( pCurve, poQ0, poDst ); // Copy the final result to destination
902 }
903}
UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsEqual(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsZero(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptShortWeierstrassAddSideChannelUnsafe(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptShortWeierstrassAddDiffNonZero(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

◆ SymCryptShortWeierstrassAddDiffNonZero()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassAddDiffNonZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 603 of file ec_short_weierstrass.c.

611{
613
617
621
625
626 PSYMCRYPT_MODELEMENT peT[7] = { 0 }; // Temporaries
627
629 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
631
632 // Creating temporaries
633 for (UINT32 i=0; i<7; i++)
634 {
636 pbScratch,
637 pCurve->cbModElement,
638 FMod );
639
640 SYMCRYPT_ASSERT( peT[i] != NULL);
641
642 pbScratch += pCurve->cbModElement;
643 }
644
645 // Fixing remaining scratch space size
646 cbScratch -= 7*pCurve->cbModElement;
647
648 // Calculation
649
650 SymCryptModSquare( FMod, peZ1, peT[0], pbScratch, cbScratch ); /* T0 := Z1 * Z1 = Z1Z1 */
651 SymCryptModMul( FMod, peZ1, peT[0], peT[1], pbScratch, cbScratch ); /* T1 := Z1*Z1Z1 */
652
653 SymCryptModSquare( FMod, peZ2, peT[6], pbScratch, cbScratch ); /* T6 := Z2 * Z2 = Z2Z2 */
654 SymCryptModMul( FMod, peX1, peT[6], peT[2], pbScratch, cbScratch ); /* T2 := X1 * T6 = X1*Z2Z2 = U1 */
655 SymCryptModMul( FMod, peX2, peT[0], peT[3], pbScratch, cbScratch ); /* T3 := X2 * Z1Z1 = U2 */
656 SymCryptModSub( FMod, peT[3], peT[2], peT[5], pbScratch, cbScratch ); /* T5 := T3 - T2 = U2 - U1 = H */
657 SymCryptModAdd( FMod, peT[5], peT[5], peT[3], pbScratch, cbScratch ); /* T3 := T5 + T5 = 2H */
658
659 SymCryptModMul( FMod, peZ1, peZ2, peT[4], pbScratch, cbScratch ); /* T4 := Z1 * Z2 */
660
661 SymCryptModMul( FMod, peZ2, peT[6], peT[6], pbScratch, cbScratch ); /* T6 := Z2 * T6 = Z2*Z2Z2 */
662 SymCryptModMul( FMod, peT[4], peT[3], peZ3, pbScratch, cbScratch ); /* Z3 := T4 * T3 = Z1*Z2*2H */
663
664 SymCryptModMul( FMod, peY1, peT[6], peT[6], pbScratch, cbScratch ); /* T6 := Y1 * T6 = Y1*Z2*Z2Z2 = S1 */
665 SymCryptModMul( FMod, peY2, peT[1], peT[4], pbScratch, cbScratch ); /* T4 := Y2*Z1*Z1Z1 = S2 */
666 SymCryptModSub( FMod, peT[4], peT[6], peT[4], pbScratch, cbScratch ); /* T4 := T4 - T6 = S2-S1 */
667 SymCryptModAdd( FMod, peT[4], peT[4], peT[4], pbScratch, cbScratch ); /* T4 := T4 + T4 = 2*(S2-S1) = r */
668
669 SymCryptModSquare( FMod, peT[3], peT[3], pbScratch, cbScratch ); /* T3 := T3 * T3 = (2*H)^2 = I */
670 SymCryptModMul( FMod, peT[3], peT[5], peT[5], pbScratch, cbScratch ); /* T5 := T3 * T5 = H*I = J */
671 SymCryptModMul( FMod, peT[2], peT[3], peT[3], pbScratch, cbScratch ); /* T3 := T2 * T3 = U1*I = V */
672
673 SymCryptModSquare( FMod, peT[4], peT[2], pbScratch, cbScratch ); /* T2 := T4 * T4 = r^2 */
674 SymCryptModSub( FMod, peT[2], peT[5], peT[2], pbScratch, cbScratch ); /* T2 := T2 - T5 = r^2 - J */
675 SymCryptModSub( FMod, peT[2], peT[3], peT[2], pbScratch, cbScratch ); /* T2 := T2 - T3 = r^2 - J - V */
676 SymCryptModSub( FMod, peT[2], peT[3], peX3, pbScratch, cbScratch ); /* T2 := T2 - T3 = r^2 - J - 2*V = X3 */
677
678 SymCryptModSub( FMod, peT[3], peX3, peT[3], pbScratch, cbScratch ); /* T3 := T3 - T2 = V - X3 */
679 SymCryptModMul( FMod, peT[3], peT[4], peT[3], pbScratch, cbScratch ); /* T3 := T3 * T4 = r*(V-X3) */
680 SymCryptModMul( FMod, peT[6], peT[5], peT[6], pbScratch, cbScratch ); /* T6 := T6 * T5 = S1*J */
681 SymCryptModAdd( FMod, peT[6], peT[6], peT[6], pbScratch, cbScratch ); /* T6 := T6 + T6 = 2*S1*J */
682 SymCryptModSub( FMod, peT[3], peT[6], peY3, pbScratch, cbScratch ); /* Y3 := T6 - T3 = r*(V-X3) - 2*S1*J */
683}
const SYMCRYPT_MODELEMENT * PCSYMCRYPT_MODELEMENT
VOID SYMCRYPT_CALL SymCryptModAdd(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:838
VOID SYMCRYPT_CALL SymCryptModSquare(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:881

Referenced by SymCryptShortWeierstrassAdd().

◆ SymCryptShortWeierstrassDouble()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassDouble ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_ PSYMCRYPT_ECPOINT  poDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 391 of file ec_short_weierstrass.c.

399{
401 PSYMCRYPT_MODELEMENT peT[3] = { 0 }; // Temporaries
402
406
410
412 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
414
416
417 // Creating temporaries
418 for (UINT32 i=0; i<3; i++)
419 {
421 pbScratch,
422 pCurve->cbModElement,
423 FMod );
424
425 SYMCRYPT_ASSERT( peT[i] != NULL);
426
427 pbScratch += pCurve->cbModElement;
428 }
429
430 // Fixing remaining scratch space size
431 cbScratch -= 3*pCurve->cbModElement;
432
433 // Calculate the points
434 SymCryptModAdd( FMod, peY1, peY1, peT[0], pbScratch, cbScratch ); /* T0 := Y1 + Y1 = 2Y */
435 SymCryptModSquare( FMod, peZ1, peT[1], pbScratch, cbScratch ); /* T1 := Z1 * Z1 = ZZ */
436 SymCryptModMul( FMod, peT[0], peZ1, peZ3, pbScratch, cbScratch ); /* Z3 := 2Y * Z1 = 2YZ */
437
438 SymCryptModMul( FMod, peY1, peT[0], peY3, pbScratch, cbScratch ); /* Y3 := 2Y * Y1 = 2YY */
439 SymCryptModAdd( FMod, peY3, peY3, peT[0], pbScratch, cbScratch ); /* T0 := 2YY + 2YY = 4YY */
440 SymCryptModMul( FMod, peT[0], peY3, peY3, pbScratch, cbScratch ); /* Y3 := 2YY * 4YY = 8YYYY */
441
442 SymCryptModMul( FMod, peT[0], peX1, peT[0], pbScratch, cbScratch ); /* T0 := X1 * 4YY = 4XYY = S */
443
444 SymCryptModSquare( FMod, peT[1], peT[1], pbScratch, cbScratch ); /* T1 := T1 * T1 = ZZZZ */
445 SymCryptModSquare( FMod, peX1, peT[2], pbScratch, cbScratch ); /* T2 := X1 * X1 = XX */
446 SymCryptModMul( FMod, peT[1], pCurve->A, peT[1], pbScratch, cbScratch ); /* T1 := T1 * a = a*ZZZZ */
447 SymCryptModAdd( FMod, peT[2], peT[1], peT[1], pbScratch, cbScratch ); /* T1 := T2 + T1 = XX + a*ZZZZ */
448 SymCryptModAdd( FMod, peT[2], peT[2], peT[2], pbScratch, cbScratch ); /* T2 := T2 + T2 = 2*XX */
449 SymCryptModAdd( FMod, peT[0], peT[0], peX3, pbScratch, cbScratch ); /* X3 := 2*S */
450 SymCryptModAdd( FMod, peT[2], peT[1], peT[1], pbScratch, cbScratch ); /* T1 := T2 + T1 = 3*XX + a*ZZZZ = M */
451
452 SymCryptModSquare( FMod, peT[1], peT[2], pbScratch, cbScratch ); /* T2 := M^2 */
453 SymCryptModSub( FMod, peT[2], peX3, peX3, pbScratch, cbScratch ); /* X3 := M^2 - 2*S = T */
454
455 SymCryptModSub( FMod, peT[0], peX3, peT[0], pbScratch, cbScratch ); /* T0 := S - T */
456 SymCryptModMul( FMod, peT[1], peT[0], peT[0], pbScratch, cbScratch ); /* T0 := M * (S - T) */
457 SymCryptModSub( FMod, peT[0], peY3, peY3, pbScratch, cbScratch ); /* Y3 := M * (S - T) - 8*YYYY */
458}
@ SYMCRYPT_INTERNAL_ECURVE_TYPE_SHORT_WEIERSTRASS

◆ SymCryptShortWeierstrassDoubleSpecializedAm3()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassDoubleSpecializedAm3 ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_ PSYMCRYPT_ECPOINT  poDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 499 of file ec_short_weierstrass.c.

507{
509 PSYMCRYPT_MODELEMENT peT[3] = { 0 }; // Temporaries
510
514
518
520 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
522
524
525 // Creating temporaries
526 for (UINT32 i=0; i<3; i++)
527 {
529 pbScratch,
530 pCurve->cbModElement,
531 FMod );
532
533 SYMCRYPT_ASSERT( peT[i] != NULL);
534
535 pbScratch += pCurve->cbModElement;
536 }
537
538 // Fixing remaining scratch space size
539 cbScratch -= 3*pCurve->cbModElement;
540
541 // Calculate the points
542 SymCryptModAdd( FMod, peY1, peY1, peT[0], pbScratch, cbScratch ); /* T0 := Y1 + Y1 = 2Y */
543 SymCryptModSquare( FMod, peZ1, peT[1], pbScratch, cbScratch ); /* T1 := Z1 * Z1 = ZZ */
544 SymCryptModMul( FMod, peY1, peT[0], peY3, pbScratch, cbScratch ); /* Y3 := 2Y * Y1 = 2YY */
545
546 SymCryptModMul( FMod, peT[0], peZ1, peZ3, pbScratch, cbScratch ); /* Z3 := 2Y * Z1 = 2YZ */
547
548 SymCryptModAdd( FMod, peY3, peY3, peT[0], pbScratch, cbScratch ); /* T0 := 2YY + 2YY = 4YY */
549 SymCryptModAdd( FMod, peX1, peT[1], peT[2], pbScratch, cbScratch ); /* T2 := X1 + ZZ */
550 SymCryptModMul( FMod, peT[0], peY3, peY3, pbScratch, cbScratch ); /* Y3 := 2YY * 4YY = 8YYYY */
551
552 SymCryptModSub( FMod, peX1, peT[1], peT[1], pbScratch, cbScratch ); /* T1 := X1 - ZZ */
553 SymCryptModMul( FMod, peT[0], peX1, peT[0], pbScratch, cbScratch ); /* T0 := X1 * 4YY = 4XYY = S */
554
555 SymCryptModMul( FMod, peT[2], peT[1], peT[2], pbScratch, cbScratch ); /* T2 := (X1 + ZZ)*(X1 - ZZ) = XX - ZZZZ */
556 SymCryptModAdd( FMod, peT[2], peT[2], peT[1], pbScratch, cbScratch ); /* T1 := 2*(XX - ZZZZ) */
557 SymCryptModAdd( FMod, peT[0], peT[0], peX3, pbScratch, cbScratch ); /* X3 := 2*S */
558 SymCryptModAdd( FMod, peT[1], peT[2], peT[1], pbScratch, cbScratch ); /* T1 := 3*(XX - ZZZZ) = M */
559
560 SymCryptModSquare( FMod, peT[1], peT[2], pbScratch, cbScratch ); /* T2 := M^2 */
561 SymCryptModSub( FMod, peT[2], peX3, peX3, pbScratch, cbScratch ); /* X3 := M^2 - 2*S = T */
562
563 SymCryptModSub( FMod, peT[0], peX3, peT[0], pbScratch, cbScratch ); /* T0 := S - T */
564 SymCryptModMul( FMod, peT[1], peT[0], peT[0], pbScratch, cbScratch ); /* T0 := M * (S - T) */
565 SymCryptModSub( FMod, peT[0], peY3, peY3, pbScratch, cbScratch ); /* Y3 := M * (S - T) - 8*YYYY */
566}
@ SYMCRYPT_INTERNAL_ECURVE_TYPE_SHORT_WEIERSTRASS_AM3

◆ SymCryptShortWeierstrassFillScratchSpaces()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassFillScratchSpaces ( _In_ PSYMCRYPT_ECURVE  pCurve)

Definition at line 62 of file ec_short_weierstrass.c.

63{
64 UINT32 nDigits = SymCryptDigitsFromBits( pCurve->FModBitsize );
65
66 //
67 // All the scratch space computations are upper bounded by the SizeofXXX bound (2^19) and
68 // the SCRATCH_BYTES_FOR_XXX bound (2^24) (see symcrypt_internal.h).
69 //
70 // One caveat is SymCryptSizeofEcpointFromCurve and SymCryptSizeofEcpointEx which calculate
71 // the size of EcPoint with 4 coordinates (each one a modelement of max size 2^17). Thus upper
72 // bounded by 2^20.
73 //
74 // Another is the precomp points computation where the nPrecompPoints are up to
75 // 2^SYMCRYPT_ECURVE_SW_DEF_WINDOW = 2^6 and the nRecodedDigits are equal to the
76 // GOrd bitsize < 2^20.
77 //
78 // Thus cbScratchScalarMulti is upper bounded by 2^6*2^20 + 2*2^20*2^4 ~ 2^26.
79 //
80
81 // Common
82 pCurve->cbScratchCommon =
83 8 * pCurve->cbModElement +
86
87 // Scalar (Overhead)
88 pCurve->cbScratchScalar =
89 pCurve->cbModElement +
91 2 * SymCryptSizeofIntFromDigits( pCurve->GOrdDigits ) +
93
94 // Scalar dependent on precomp points (be careful to align the UINT32 arrays properly)
95 pCurve->cbScratchScalarMulti =
96 pCurve->info.sw.nPrecompPoints * SymCryptSizeofEcpointFromCurve( pCurve ) +
97 ((2*pCurve->info.sw.nRecodedDigits * sizeof(UINT32) + SYMCRYPT_ASYM_ALIGN_VALUE - 1 )/SYMCRYPT_ASYM_ALIGN_VALUE) * SYMCRYPT_ASYM_ALIGN_VALUE;
98
99 // GetSetValue
100 pCurve->cbScratchGetSetValue =
102 2 * pCurve->cbModElement +
105
106 pCurve->cbScratchGetSetValue = SYMCRYPT_MAX( pCurve->cbScratchGetSetValue, SymCryptSizeofIntFromDigits( nDigits ) );
107
108 // Eckey
109 pCurve->cbScratchEckey =
112 SYMCRYPT_MAX( pCurve->cbScratchScalar + pCurve->cbScratchScalarMulti, pCurve->cbScratchGetSetValue );
113}

◆ SymCryptShortWeierstrassIsEqual()

UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsEqual ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 181 of file ec_short_weierstrass.c.

189{
191
192 PSYMCRYPT_MODELEMENT peX1 = NULL; // Pointer to X1
193 PSYMCRYPT_MODELEMENT peY1 = NULL; // Pointer to Y1
194 PSYMCRYPT_MODELEMENT peZ1 = NULL; // Pointer to Z1
195 PSYMCRYPT_MODELEMENT peX2 = NULL; // Pointer to X2
196 PSYMCRYPT_MODELEMENT peY2 = NULL; // Pointer to Y2
197 PSYMCRYPT_MODELEMENT peZ2 = NULL; // Pointer to Z2
198
199 UINT32 dResX = 0;
200 UINT32 dResY = 0;
201 UINT32 dResYN = 0;
202
203 PSYMCRYPT_MODELEMENT peT[4] = { 0 }; // Temporaries
204
206 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) );
209
210 // Creating temporaries
211 for (UINT32 i=0; i<4; i++)
212 {
214 pbScratch,
215 pCurve->cbModElement,
216 FMod );
217
218 SYMCRYPT_ASSERT( peT[i] != NULL);
219
220 pbScratch += pCurve->cbModElement;
221 }
222
223 // Fixing remaining scratch space size
224 cbScratch -= 4 * pCurve->cbModElement;
225
226 // Getting pointers to x and y of the source point
227 peX1 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc1 );
228 peY1 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc1 );
229 peZ1 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc1 );
230 peX2 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc2 );
231 peY2 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc2 );
232 peZ2 = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc2 );
233
234 // Setting the default flag if flags == 0
236
237 // Calculation
238 SymCryptModSquare( FMod, peZ1, peT[0], pbScratch, cbScratch ); // T0 := Z1 * Z1 = Z1^2
239 SymCryptModSquare( FMod, peZ2, peT[1], pbScratch, cbScratch ); // T1 := Z2 * Z2 = Z2^2
240 SymCryptModMul( FMod, peX1, peT[1], peT[2], pbScratch, cbScratch ); // T2 := X1 * T1 = X1*Z2^2
241 SymCryptModMul( FMod, peX2, peT[0], peT[3], pbScratch, cbScratch ); // T3 := X2 * T0 = X2*Z1^2
242
243 dResX = SymCryptModElementIsEqual( FMod, peT[2], peT[3] );
244
245 SymCryptModMul( FMod, peZ1, peT[0], peT[0], pbScratch, cbScratch ); // T0 := Z1 * T0 = Z1^3
246 SymCryptModMul( FMod, peZ2, peT[1], peT[1], pbScratch, cbScratch ); // T1 := Z2 * T1 = Z2^3
247 SymCryptModMul( FMod, peY1, peT[1], peT[2], pbScratch, cbScratch ); // T2 := Y1 * T1 = Y1*Z2^3
248 SymCryptModMul( FMod, peY2, peT[0], peT[3], pbScratch, cbScratch ); // T3 := Y2 * T0 = Y2*Z1^3
249
250 dResY = SymCryptModElementIsEqual( FMod, peT[2], peT[3] );
251
252 SymCryptModNeg( FMod, peT[3], peT[3], pbScratch, cbScratch ); // T3 := -T3 = -Y2*Z1^3
253
254 dResYN = SymCryptModElementIsEqual( FMod, peT[2], peT[3] );
255
256 return (SYMCRYPT_MASK32_NONZERO(flags & SYMCRYPT_FLAG_ECPOINT_EQUAL) & dResX & dResY) |
258}
VOID SYMCRYPT_CALL SymCryptModNeg(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:895

Referenced by SymCryptShortWeierstrassAdd().

◆ SymCryptShortWeierstrassIsZero()

UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassIsZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 262 of file ec_short_weierstrass.c.

268{
270 PSYMCRYPT_MODELEMENT peZ = NULL; // Pointer to Z
271
274
275 UNREFERENCED_PARAMETER( pbScratch );
277
278 // Getting pointer to Z of the source point
280
281 // Setting temporary to 0
282 return SymCryptModElementIsZero( FMod, peZ );
283}

Referenced by SymCryptShortWeierstrassAdd().

◆ SymCryptShortWeierstrassNegate()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassNegate ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Inout_ PSYMCRYPT_ECPOINT  poSrc,
UINT32  mask,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 907 of file ec_short_weierstrass.c.

914{
917
919
923
925 pbScratch,
926 pCurve->cbModElement,
927 FMod );
928 SYMCRYPT_ASSERT( peTmp != NULL);
929
930 pbScratch += pCurve->cbModElement;
931 cbScratch -= pCurve->cbModElement;
932
933 SymCryptModNeg( FMod, peY, peTmp, pbScratch, cbScratch );
934 SymCryptModElementMaskedCopy( FMod, peTmp, peY, mask );
935}
VOID SymCryptModElementMaskedCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 mask)
Definition: a_dispatch.c:692

◆ SymCryptShortWeierstrassOnCurve()

UINT32 SYMCRYPT_CALL SymCryptShortWeierstrassOnCurve ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 291 of file ec_short_weierstrass.c.

297{
299
300 PSYMCRYPT_MODELEMENT peX = NULL; // Pointer to X
301 PSYMCRYPT_MODELEMENT peY = NULL; // Pointer to Y
302 PSYMCRYPT_MODELEMENT peZ = NULL; // Pointer to Z
303
304 PSYMCRYPT_MODELEMENT peT[2] = { 0 }; // Temporaries
305
309
310 // Creating temporaries
311 for (UINT32 i=0; i<2; i++)
312 {
314 pbScratch,
315 pCurve->cbModElement,
316 FMod );
317
318 SYMCRYPT_ASSERT( peT[i] != NULL);
319
320 pbScratch += pCurve->cbModElement;
321 }
322
323 // Fixing remaining scratch space size
324 cbScratch -= 2*pCurve->cbModElement;
325
326 // Getting pointers to coordinates of the source point
330
331 // Calculation
332 SymCryptModSquare( FMod, peZ, peT[0], pbScratch, cbScratch ); // T1 := Z * Z = Z^2
333 SymCryptModSquare( FMod, peT[0], peT[1], pbScratch, cbScratch ); // T2 := T1 * T1 = Z^4
334 SymCryptModMul( FMod, peT[0], peT[1], peT[0], pbScratch, cbScratch ); // T1 := T1 * T2 = Z^6
335
336 SymCryptModMul( FMod, peT[0], pCurve->B, peT[0], pbScratch, cbScratch ); // T1 := T1 * b = bZ^6
337
338 SymCryptModMul( FMod, peT[1], peX, peT[1], pbScratch, cbScratch ); // T2 := T2 * X = XZ^4
339 SymCryptModMul( FMod, peT[1], pCurve->A, peT[1], pbScratch, cbScratch ); // T2 := T2 * a = aXZ^4
340
341 SymCryptModAdd( FMod, peT[0], peT[1], peT[1], pbScratch, cbScratch ); // T2 := T1 + T2 = aXZ^4 + bZ^6
342
343 SymCryptModSquare( FMod, peX, peT[0], pbScratch, cbScratch ); // T1 := X * X = X^2
344 SymCryptModMul( FMod, peT[0], peX, peT[0], pbScratch, cbScratch ); // T1 := T1 * X = X^3
345 SymCryptModAdd( FMod, peT[0], peT[1], peT[1], pbScratch, cbScratch ); // T2 := T1 + T2 = X^3 + aXZ^4 + bZ^6
346
347 SymCryptModSquare( FMod, peY, peT[0], pbScratch, cbScratch ); // T1 := Y * Y = Y^2
348
349 return SymCryptModElementIsEqual( FMod, peT[0], peT[1] );
350}

◆ SymCryptShortWeierstrassSetDistinguished()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassSetDistinguished ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptShortWeierstrassSetZero()

VOID SYMCRYPT_CALL SymCryptShortWeierstrassSetZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 120 of file ec_short_weierstrass.c.

126{
129
133
134 // Getting handle to X
135 peTmp = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
136
137 // Setting the right value (always 1)
138 SymCryptModElementSetValueUint32( 1, FMod, peTmp, pbScratch, cbScratch );
139
140 // Getting handle to Y
141 peTmp = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
142
143 // Setting the right value (always 1)
144 SymCryptModElementSetValueUint32( 1, FMod, peTmp, pbScratch, cbScratch );
145
146 // Getting handle to Z
147 peTmp = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poDst );
148
149 // Setting the right value (always 0)
150 SymCryptModElementSetValueUint32( 0, pCurve->FMod, peTmp, pbScratch, cbScratch );
151}

◆ SymCryptSizeofEcpointEx()

UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointEx ( UINT32  cbModElement,
UINT32  numOfCoordinates 
)

Definition at line 19 of file ecpoint.c.

22{
23 SYMCRYPT_ASSERT(numOfCoordinates > 0);
25
26 // Callers should never specify numOfCoordinates equal to 0 or greater than
27 // SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH
28 // Return 0 to indicate failure if a caller does specify invalid numOfCoordinates
29 if( (numOfCoordinates == 0) || (numOfCoordinates > SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH) )
30 {
31 return 0;
32 }
33
34 // Since the maximum number of coordinates is 4 this result is bounded
35 // by 4*2^17 + overhead ~ 2^20
36 return sizeof(SYMCRYPT_ECPOINT) + numOfCoordinates * cbModElement;
37}
struct _SYMCRYPT_ECPOINT SYMCRYPT_ECPOINT

Referenced by SymCryptEcpointCreateEx(), SymCryptEcpointGetValue(), SymCryptEcpointSetValue(), SymCryptEcurveValidateAndComputeSizes(), SymCryptMontgomeryFillScratchSpaces(), SymCryptShortWeierstrassFillScratchSpaces(), SymCryptSizeofEcpointFromCurve(), and SymCryptTwistedEdwardsFillScratchSpaces().

◆ SymCryptTwistedEdwardsAdd()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAdd ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
_Out_ PSYMCRYPT_ECPOINT  poDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 313 of file ec_twisted_edwards.c.

322{
323 PSYMCRYPT_MODELEMENT peTemp[8];
324 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
325 SIZE_T nBytes;
326
328 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
330
332
333 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
334
335 SYMCRYPT_ASSERT( cbScratch >= 8*nBytes );
336
337 for (UINT32 i = 0; i < 8; ++i)
338 {
339 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
340 pbScratch += nBytes;
341 cbScratch -= nBytes;
342 }
343
348
353
358
359 PSYMCRYPT_MODELEMENT peA = peTemp[0];
360 PSYMCRYPT_MODELEMENT peB = peTemp[1];
361 PSYMCRYPT_MODELEMENT peC = peTemp[2];
362 PSYMCRYPT_MODELEMENT peD = peTemp[3];
363 PSYMCRYPT_MODELEMENT peE = peTemp[4];
364 PSYMCRYPT_MODELEMENT peF = peTemp[5];
365 PSYMCRYPT_MODELEMENT peG = peTemp[6];
366 PSYMCRYPT_MODELEMENT peH = peTemp[7];
367
368 // A = X1 * X2
369 SymCryptModMul( pmMod, peSrc1X, peSrc2X, peA, pbScratch, cbScratch );
370
371 // B = Y1 * Y2
372 SymCryptModMul( pmMod, peSrc1Y, peSrc2Y, peB, pbScratch, cbScratch );
373
374 // C1 = T1 * T2
375 SymCryptModMul( pmMod, peSrc1T, peSrc2T, peC, pbScratch, cbScratch );
376
377 // C = d * C1 = d * T1 * T2
378 SymCryptModMul( pmMod, pCurve->B, peC, peC, pbScratch, cbScratch );
379
380 // D = Z1 * Z2
381 SymCryptModMul( pmMod, peSrc1Z, peSrc2Z, peD, pbScratch, cbScratch );
382
383 // E1 = X1 + Y1
384 SymCryptModAdd( pmMod, peSrc1X, peSrc1Y, peE, pbScratch, cbScratch );
385
386 // E2 = X2 + Y2
387 SymCryptModAdd( pmMod, peSrc2X, peSrc2Y, peF, pbScratch, cbScratch );
388
389 // E = E * F
390 SymCryptModMul( pmMod, peE, peF, peE, pbScratch, cbScratch );
391
392 // E = E - A
393 SymCryptModSub( pmMod, peE, peA, peE, pbScratch, cbScratch );
394
395 // E = E - B
396 SymCryptModSub( pmMod, peE, peB, peE, pbScratch, cbScratch );
397
398 // F = D - C
399 SymCryptModSub( pmMod, peD, peC, peF, pbScratch, cbScratch );
400
401 // G = D + C
402 SymCryptModAdd( pmMod, peD, peC, peG, pbScratch, cbScratch );
403
404 // H = a * A
405 SymCryptModMul( pmMod, pCurve->A, peA, peH, pbScratch, cbScratch );
406
407 // H = B - a * A
408 SymCryptModSub( pmMod, peB, peH, peH, pbScratch, cbScratch );
409
410 // X3 = E * F
411 SymCryptModMul( pmMod, peE, peF, peDstX, pbScratch, cbScratch );
412
413 // Y3 = G * H
414 SymCryptModMul( pmMod, peG, peH, peDstY, pbScratch, cbScratch );
415
416 // T3 = E * H
417 SymCryptModMul( pmMod, peE, peH, peDstT, pbScratch, cbScratch );
418
419 // Y3 = F * G
420 SymCryptModMul( pmMod, peF, peG, peDstZ, pbScratch, cbScratch );
421}
PSYMCRYPT_MODELEMENT peG

Referenced by SymCryptTwistedEdwardsAddDiffNonZero().

◆ SymCryptTwistedEdwardsAddDiffNonZero()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAddDiffNonZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 425 of file ec_twisted_edwards.c.

433{
434 SymCryptTwistedEdwardsAdd( pCurve, poSrc1, poSrc2, poDst, 0, pbScratch, cbScratch );
435}
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAdd(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)

◆ SymCryptTwistedEdwardsDouble()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsDouble ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_ PSYMCRYPT_ECPOINT  poDst,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 195 of file ec_twisted_edwards.c.

203{
204 PSYMCRYPT_MODELEMENT peTemp[8];
205 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
206 SIZE_T nBytes;
207
209 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
211
213
214 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
215
216 SYMCRYPT_ASSERT( cbScratch >= 8*nBytes );
217
218 for (UINT32 i = 0; i < 8; ++i)
219 {
220 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
221 pbScratch += nBytes;
222 cbScratch -= nBytes;
223 }
224
228
233
234 PSYMCRYPT_MODELEMENT peA = peTemp[0];
235 PSYMCRYPT_MODELEMENT peB = peTemp[1];
236 PSYMCRYPT_MODELEMENT peC = peTemp[2];
237 PSYMCRYPT_MODELEMENT peD = peTemp[3];
238 PSYMCRYPT_MODELEMENT peE = peTemp[4];
239 PSYMCRYPT_MODELEMENT peF = peTemp[5];
240 PSYMCRYPT_MODELEMENT peG = peTemp[6];
241 PSYMCRYPT_MODELEMENT peH = peTemp[7];
242
243
244 // A = X1^2
245 SymCryptModSquare( pmMod, peSrcX, peA, pbScratch, cbScratch );
246
247 // B = Y1^2
248 SymCryptModSquare( pmMod, peSrcY, peB, pbScratch, cbScratch );
249
250 // C1 = Z1^2
251 SymCryptModSquare( pmMod, peSrcZ, peC, pbScratch, cbScratch );
252
253 // C = C1 + C1 = Z1^2 + Z1^2 = 2 * Z1^2
254 SymCryptModAdd( pmMod, peC, peC, peC, pbScratch, cbScratch );
255
256 // D = a * A
257 SymCryptModMul( pmMod, pCurve->A, peA, peD, pbScratch, cbScratch );
258
259 // E1 = X1 + Y1
260 SymCryptModAdd( pmMod, peSrcX, peSrcY, peE, pbScratch, cbScratch );
261
262 // E2 = E1^2 = (X1 + Y1)^2
263 SymCryptModSquare( pmMod, peE, peE, pbScratch, cbScratch );
264
265 // E3 = E2 - A = (X1 + Y1)^2 - A
266 SymCryptModSub( pmMod, peE, peA, peE, pbScratch, cbScratch );
267
268 // E = E3 - B = (X1 + Y1)^2 - A - B
269 SymCryptModSub( pmMod, peE, peB, peE, pbScratch, cbScratch );
270
271 // G = D + B
272 SymCryptModAdd( pmMod, peD, peB, peG, pbScratch, cbScratch );
273
274 // F = G - C
275 SymCryptModSub( pmMod, peG, peC, peF, pbScratch, cbScratch );
276
277 // H = D - B
278 SymCryptModSub( pmMod, peD, peB, peH, pbScratch, cbScratch );
279
280 // X3 = E * F
281 SymCryptModMul( pmMod, peE, peF, peDstX, pbScratch, cbScratch );
282
283 // Y3 = G * H
284 SymCryptModMul( pmMod, peG, peH, peDstY, pbScratch, cbScratch );
285
286 // T3 = E * H
287 SymCryptModMul( pmMod, peE, peH, peDstT, pbScratch, cbScratch );
288
289 // Z3 = F * G
290 SymCryptModMul( pmMod, peF, peG, peDstZ, pbScratch, cbScratch );
291}

◆ SymCryptTwistedEdwardsFillScratchSpaces()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsFillScratchSpaces ( _In_ PSYMCRYPT_ECURVE  pCurve)

Definition at line 11 of file ec_twisted_edwards.c.

12{
13 UINT32 nDigits = SymCryptDigitsFromBits( pCurve->FModBitsize );
14 UINT32 cbModElement = pCurve->cbModElement;
15 UINT32 nDigitsFieldLength = pCurve->FModDigits;
16
17 //
18 // All the scratch space computations are upper bounded by the SizeofXXX bound (2^19) and
19 // the SCRATCH_BYTES_FOR_XXX bound (2^24) (see symcrypt_internal.h).
20 //
21 // One caveat is SymCryptSizeofEcpointFromCurve and SymCryptSizeofEcpointEx which calculate
22 // the size of EcPoint with 4 coordinates (each one a modelement of max size 2^17). Thus upper
23 // bounded by 2^20.
24 //
25 // Another is the precomp points computation where the nPrecompPoints are up to
26 // 2^SYMCRYPT_ECURVE_SW_DEF_WINDOW = 2^6 and the nRecodedDigits are equal to the
27 // GOrd bitsize < 2^20.
28 //
29 // Thus cbScratchScalarMulti is upper bounded by 2^6*2^20 + 2*2^20*2^4 ~ 2^26.
30 //
31
33
34 pCurve->cbScratchScalar =
35 (pCurve->cbModElement) +
37 2 * SymCryptSizeofIntFromDigits( pCurve->GOrdDigits ) +
39
40 pCurve->cbScratchScalarMulti =
41 pCurve->info.sw.nPrecompPoints * SymCryptSizeofEcpointFromCurve( pCurve ) +
42 ((2*pCurve->info.sw.nRecodedDigits * sizeof(UINT32) + SYMCRYPT_ASYM_ALIGN_VALUE - 1 )/SYMCRYPT_ASYM_ALIGN_VALUE) * SYMCRYPT_ASYM_ALIGN_VALUE;
43
44 pCurve->cbScratchGetSetValue =
46 2 * cbModElement +
48 SYMCRYPT_SCRATCH_BYTES_FOR_MODINV(nDigitsFieldLength));
49
50 pCurve->cbScratchGetSetValue = SYMCRYPT_MAX( pCurve->cbScratchGetSetValue, SymCryptSizeofIntFromDigits( nDigits ) );
51
52 pCurve->cbScratchEckey =
55 SYMCRYPT_MAX( pCurve->cbScratchScalar + pCurve->cbScratchScalarMulti, pCurve->cbScratchGetSetValue );
56}

◆ SymCryptTwistedEdwardsIsEqual()

UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsEqual ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc1,
_In_ PCSYMCRYPT_ECPOINT  poSrc2,
UINT32  flags,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 447 of file ec_twisted_edwards.c.

455{
456 PSYMCRYPT_MODELEMENT peTemp[2];
457 PSYMCRYPT_MODELEMENT peSrc1X, peSrc1Y, peSrc1Z;
458 PSYMCRYPT_MODELEMENT peSrc2X, peSrc2Y, peSrc2Z;
459 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
460 SIZE_T nBytes;
461 UINT32 dResX = 0;
462 UINT32 dResXN = 0;
463 UINT32 dResY = 0;
464
466 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) );
468
469 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
470
471 SYMCRYPT_ASSERT( cbScratch >= 2*nBytes );
472
473 for (UINT32 i = 0; i < 2; ++i)
474 {
475 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
476 pbScratch += nBytes;
477 cbScratch -= nBytes;
478 }
479
480 peSrc1X = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc1 );
481 peSrc1Y = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc1 );
482 peSrc1Z = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc1 );
483
484 peSrc2X = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc2 );
485 peSrc2Y = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc2 );
486 peSrc2Z = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc2 );
487
488 // Setting the default flag if flags == 0
490
491 // peTemp[0] = X1 * Z2
492 SymCryptModMul( pmMod, peSrc1X, peSrc2Z, peTemp[0], pbScratch, cbScratch );
493
494 // peTemp[1] = X2 * Z1
495 SymCryptModMul( pmMod, peSrc2X, peSrc1Z, peTemp[1], pbScratch, cbScratch );
496
497 dResX = SymCryptModElementIsEqual( pmMod, peTemp[0], peTemp[1] );
498
499 // Neg peTemp[1]
500 SymCryptModNeg(pmMod, peTemp[1], peTemp[1], pbScratch, cbScratch);
501 dResXN = SymCryptModElementIsEqual(pmMod, peTemp[0], peTemp[1]);
502
503 // peTemp[0] = Y1 * Z2
504 SymCryptModMul( pmMod, peSrc1Y, peSrc2Z, peTemp[0], pbScratch, cbScratch );
505
506 // peTemp[1] = Y2 * Z1
507 SymCryptModMul( pmMod, peSrc2Y, peSrc1Z, peTemp[1], pbScratch, cbScratch );
508
509 dResY = SymCryptModElementIsEqual( pmMod, peTemp[0], peTemp[1] );
510
511 return (SYMCRYPT_MASK32_NONZERO( flags & SYMCRYPT_FLAG_ECPOINT_EQUAL ) & dResX & dResY ) |
513}

◆ SymCryptTwistedEdwardsIsZero()

UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 78 of file ec_twisted_edwards.c.

84{
85 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
86 UINT32 dResX = 0, dResY = 0;
87
90
91 UNREFERENCED_PARAMETER( pbScratch );
93
97
98 dResX = SymCryptModElementIsZero( pmMod, peSrcX );
99 dResY = SymCryptModElementIsEqual( pmMod, peSrcY, peSrcZ );
100
101 return ( dResX & dResY );
102}

◆ SymCryptTwistedEdwardsNegate()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsNegate ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Inout_ PSYMCRYPT_ECPOINT  poSrc,
UINT32  mask,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 543 of file ec_twisted_edwards.c.

550{
554
556
560
562 pbScratch,
563 pCurve->cbModElement,
564 FMod );
565 SYMCRYPT_ASSERT( peTmp != NULL);
566
567 pbScratch += pCurve->cbModElement;
568 cbScratch -= pCurve->cbModElement;
569
570 SymCryptModNeg( FMod, peX, peTmp, pbScratch, cbScratch );
571 SymCryptModElementMaskedCopy( FMod, peTmp, peX, mask );
572
573 SymCryptModNeg( FMod, peT, peTmp, pbScratch, cbScratch );
574 SymCryptModElementMaskedCopy( FMod, peTmp, peT, mask );
575}

◆ SymCryptTwistedEdwardsOnCurve()

UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsOnCurve ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_In_ PCSYMCRYPT_ECPOINT  poSrc,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

Definition at line 113 of file ec_twisted_edwards.c.

119{
120 PSYMCRYPT_MODELEMENT peTemp[4];
121 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
122 SIZE_T nBytes;
123
127
128 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
129
130 SYMCRYPT_ASSERT( cbScratch >= 4*nBytes );
131
132 for (UINT32 i = 0; i < 4; ++i)
133 {
134 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
135 pbScratch += nBytes;
136 cbScratch -= nBytes;
137 }
138
142
143 // peTemp[0] = X^2
144 SymCryptModSquare( pmMod, peSrcX, peTemp[0], pbScratch, cbScratch);
145
146 // peTemp[1] = Y^2
147 SymCryptModSquare( pmMod, peSrcY, peTemp[1], pbScratch, cbScratch);
148
149 // peTemp[2] = Z^2
150 SymCryptModSquare( pmMod, peSrcZ, peTemp[2], pbScratch, cbScratch);
151
152 // peTemp[3] = a * X^2
153 SymCryptModMul( pmMod, pCurve->A, peTemp[0], peTemp[3], pbScratch, cbScratch );
154
155 // peTemp[3] = a * X^2 + Y^2
156 SymCryptModAdd( pmMod, peTemp[3], peTemp[1], peTemp[3], pbScratch, cbScratch );
157
158 // peTemp[3] = Z^2 (a * X^2 + Y^2)
159 SymCryptModMul( pmMod, peTemp[3], peTemp[2], peTemp[3], pbScratch, cbScratch );
160
161 // peTemp[1] = X^2 * Y^2
162 SymCryptModMul( pmMod, peTemp[0], peTemp[1], peTemp[1], pbScratch, cbScratch );
163
164 // peTemp[1] = d * X^2 *Y^2
165 SymCryptModMul( pmMod, pCurve->B, peTemp[1], peTemp[1], pbScratch, cbScratch );
166
167 // peTemp[2] = Z^4
168 SymCryptModMul( pmMod, peTemp[2], peTemp[2], peTemp[2], pbScratch, cbScratch );
169
170 // peTemp[1] = Z^4 + d * X^2 * Y^2
171 SymCryptModAdd( pmMod, peTemp[2], peTemp[1], peTemp[1], pbScratch, cbScratch );
172
173 return SymCryptModElementIsEqual( pmMod, peTemp[1], peTemp[3] );
174}

◆ SymCryptTwistedEdwardsSetDistinguished()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetDistinguished ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptTwistedEdwardsSetZero()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetZero ( _In_ PCSYMCRYPT_ECURVE  pCurve,
_Out_ PSYMCRYPT_ECPOINT  poDst,
_Out_writes_bytes_(cbScratch) PBYTE  pbScratch,
SIZE_T  cbScratch 
)

◆ SymCryptUint32ToLsbFirst()

VOID SYMCRYPT_CALL SymCryptUint32ToLsbFirst ( _In_reads_(cuData) PCUINT32  puData,
_Out_writes_(4 *cuData) PBYTE  pbResult,
SIZE_T  cuData 
)

Definition at line 471 of file sc_lib.h.

474{
475 while( cuData != 0 )
476 {
478 puData++;
479 pbResult += 4;
480 cuData--;
481 }
482}
#define SYMCRYPT_STORE_LSBFIRST32(p, v)
Definition: symcrypt.h:307

Referenced by SymCryptMd4Result(), SymCryptMd4StateExport(), SymCryptMd5Result(), and SymCryptMd5StateExport().

◆ SymCryptUint32ToMsbFirst()

VOID SYMCRYPT_CALL SymCryptUint32ToMsbFirst ( _In_reads_(cuData) PCUINT32  puData,
_Out_writes_(4 *cuData) PBYTE  pbResult,
SIZE_T  cuData 
)

Definition at line 405 of file sc_lib.h.

408{
409 while( cuData != 0 )
410 {
412 puData++;
413 pbResult += 4;
414 cuData--;
415 }
416}

Referenced by SymCryptSha1Result(), SymCryptSha1StateExport(), SymCryptSha256Result(), SymCryptSha256StateExportCore(), and SymCryptTlsCbcHmacVerify().

◆ SymCryptUint64ToLsbFirst()

FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint64ToLsbFirst ( _In_reads_(cuData) PCUINT64  puData,
_Out_writes_(8 *cuData) PBYTE  pbResult,
SIZE_T  cuData 
)

Definition at line 538 of file sc_lib.h.

541{
542 while( cuData != 0 )
543 {
545 puData++;
546 pbResult += 8;
547 cuData--;
548 }
549}

Referenced by SymCryptKeccakStateExport().

◆ SymCryptUint64ToMsbFirst()

VOID SYMCRYPT_CALL SymCryptUint64ToMsbFirst ( _In_reads_(cuData) PCUINT64  puData,
_Out_writes_(8 *cuData) PBYTE  pbResult,
SIZE_T  cuData 
)

Definition at line 576 of file sc_lib.h.

579{
580 while( cuData != 0 )
581 {
583 pbResult += 8;
584 puData ++;
585 cuData --;
586 }
587}

Referenced by SymCryptSha512Result(), SymCryptSha512StateExportCore(), and SymCryptTlsCbcHmacVerify().

◆ SymCryptWidthNafRecoding()

VOID SYMCRYPT_CALL SymCryptWidthNafRecoding ( UINT32  W,
_Inout_ PSYMCRYPT_INT  piK,
_Out_writes_(nRecodedDigits) PUINT32  absofKIs,
_Out_writes_(nRecodedDigits) PUINT32  sigofKIs,
UINT32  nRecodedDigits 
)

Definition at line 125 of file recoding.c.

133{
134 UINT32 T1 = 0;
135 UINT32 mask = ~(0xffffffff << W); // Window mask = 2^w - 1 (e.g. 0x0000003f for w = 6)
136 UINT32 modulus = mask + 1; // 2^w
137 UINT32 smask = 0x1 << (W-1); // Sign mask = 2^(w-1) (e.g. 0x00000020 for w = 6)
138
139 SYMCRYPT_ASSERT( W < 32 );
140
141 for (UINT32 i=0; i < nRecodedDigits; i++)
142 {
143 T1 = SymCryptIntGetValueLsbits32( piK ) & mask; // T1 = k mod 2^W
144
145 if (T1 & 0x1)
146 {
147 if (T1 > smask)
148 {
149 sigofKIs[i] = 0xffffffff;
150 absofKIs[i] = modulus - T1; // 2^W - T1 = |T1 - 2^W|
151 SymCryptIntAddUint32( piK, absofKIs[i], piK ); // k-k_i
152 }
153 else
154 {
155 // Here (k mod 2^W) is already in the specified range
156 sigofKIs[i] = 0x00000001;
157 absofKIs[i] = T1;
158 SymCryptIntSubUint32( piK, absofKIs[i], piK ); // k-k_i
159 }
160 }
161 else
162 {
163 absofKIs[i] = 0;
164 sigofKIs[i] = 0;
165 }
166
167 SymCryptIntDivPow2( piK, 1, piK ); // k := k / 2
168 }
169}

Referenced by SymCryptEcpointMultiScalarMulWnafWithInterleaving().

◆ SymCryptXmssComputePublicRoot()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssComputePublicRoot ( _In_ PCSYMCRYPT_XMSS_PARAMS  pParams,
_In_reads_bytes_(cbSeed) PCBYTE  pbSeed,
SIZE_T  cbSeed,
_In_reads_bytes_(cbSkXmss) PCBYTE  pbSkXmss,
SIZE_T  cbSkXmss,
_Out_writes_bytes_(cbRoot) PBYTE  pbRoot,
SIZE_T  cbRoot 
)

Definition at line 1069 of file xmss.c.

1077{
1078 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1079 PBYTE pbScratch = NULL;
1080 SIZE_T cbScratch = 0;
1081 XMSS_ADRS adrs;
1082
1083 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
1084
1085 if (pbRoot == NULL || cbRoot != pParams->cbHashOutput ||
1086 pbSeed == NULL || cbSeed != pParams->cbHashOutput ||
1087 pbSkXmss == NULL || cbSkXmss != pParams->cbHashOutput)
1088 {
1089 scError = SYMCRYPT_INVALID_ARGUMENT;
1090 goto cleanup;
1091 }
1092
1093 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight);
1094 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len);
1095
1097 pbScratch = SymCryptCallbackAlloc(cbScratch);
1098
1099 if (pbScratch == NULL)
1100 {
1101 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1102 goto cleanup;
1103 }
1104
1105 SymCryptWipeKnownSize(&adrs, sizeof(XMSS_ADRS));
1106 SYMCRYPT_STORE_MSBFIRST32(adrs.en32Layer, pParams->nLayers - 1);
1107
1109 pParams,
1110 &adrs,
1111 pbSkXmss,
1112 pbSeed,
1113 0,
1114 pParams->nLayerHeight,
1115 pbScratch,
1116 cbScratch,
1117 pbRoot );
1118
1119cleanup:
1120
1121 if (pbScratch != NULL)
1122 {
1123 SymCryptWipe(pbScratch, cbScratch);
1124 SymCryptCallbackFree(pbScratch);
1125 }
1126
1127 return scError;
1128}
BYTE en32Layer[4]
Definition: sc_lib.h:4504
UINT32 cbSeed
PBYTE pbSeed
VOID SYMCRYPT_CALL SymCryptXmssComputeSubtreeRoot(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, UINT32 uLeaf, UINT32 uHeight, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbRoot)
Definition: xmss.c:1003

Referenced by SymCryptXmsskeyGenerate(), and SymCryptXmsskeyVerifyRoot().

◆ SymCryptXmsskeyVerifyRoot()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyVerifyRoot ( _In_ PCSYMCRYPT_XMSS_KEY  pKey)

Definition at line 1133 of file xmss.c.

1135{
1137 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1138
1140
1141 // key to be verified has to be a private key
1142 if (pKey->keyType != SYMCRYPT_XMSSKEY_TYPE_PRIVATE)
1143 {
1144 scError = SYMCRYPT_INVALID_ARGUMENT;
1145 goto cleanup;
1146 }
1147
1149
1151 &pKey->params,
1152 pKey->Seed,
1153 pKey->params.cbHashOutput,
1154 pKey->SkXmss,
1155 pKey->params.cbHashOutput,
1156 Root,
1157 pKey->params.cbHashOutput);
1158
1159 if (scError != SYMCRYPT_NO_ERROR)
1160 {
1161 goto cleanup;
1162 }
1163
1164 if (!SymCryptEqual(Root, pKey->Root, pKey->params.cbHashOutput))
1165 {
1166 scError = SYMCRYPT_HBS_PUBLIC_ROOT_MISMATCH;
1167 }
1168
1169cleanup:
1170
1171 return scError;
1172}
@ Root
Definition: cmtypes.h:261
@ SYMCRYPT_XMSSKEY_TYPE_PRIVATE
Definition: symcrypt.h:9154
#define SYMCRYPT_HASH_MAX_RESULT_SIZE
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssComputePublicRoot(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(cbSeed) PCBYTE pbSeed, SIZE_T cbSeed, _In_reads_bytes_(cbSkXmss) PCBYTE pbSkXmss, SIZE_T cbSkXmss, _Out_writes_bytes_(cbRoot) PBYTE pbRoot, SIZE_T cbRoot)
Definition: xmss.c:1069

Referenced by SymCryptXmsskeySetValue().

◆ SymCryptXmssVerifyInternal()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssVerifyInternal ( _Inout_ PSYMCRYPT_XMSS_KEY  pKey,
_In_reads_bytes_(cbMessage) PCBYTE  pbMessage,
SIZE_T  cbMessage,
UINT32  flags,
_In_reads_bytes_(cbSignature) PCBYTE  pbSignature,
SIZE_T  cbSignature 
)

Definition at line 1736 of file xmss.c.

1743{
1744 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1745 PBYTE pbScratch = NULL;
1746 SIZE_T cbScratch = 0;
1747 PCSYMCRYPT_XMSS_PARAMS pParams = &pKey->params;
1748 BYTE RandomizedHash[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1749 BYTE ComputedRoot[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1750 XMSS_ADRS adrs;
1751 UINT32 uLayer;
1752 UINT64 uTree;
1753 UINT32 uLeaf;
1754 const UINT64 LeafMask = (1ULL << pParams->nLayerHeight) - 1;
1755
1757
1758 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
1759
1760 if (flags != 0 ||
1761 pbSignature == NULL ||
1762 cbSignature != SymCryptXmssSizeofSignatureFromParams(pParams) ||
1763 pKey->keyType == SYMCRYPT_XMSSKEY_TYPE_NONE )
1764 {
1765 scError = SYMCRYPT_INVALID_ARGUMENT;
1766 goto cleanup;
1767 }
1768
1769 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len);
1770 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight);
1771
1773
1774 if (pbScratch == NULL)
1775 {
1776 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1777 goto cleanup;
1778 }
1779
1780 PBYTE pbRandomness = SymCryptXmssSignatureGetRandomness(pParams, pbSignature);
1781 UINT64 Idx = SymCryptXmssSignatureGetIdx(pParams, pbSignature);
1782
1784 pParams,
1785 Idx,
1786 pbRandomness,
1787 pKey->Root,
1788 pbMessage,
1789 cbMessage,
1790 RandomizedHash);
1791
1792 SymCryptWipeKnownSize(&adrs, sizeof(XMSS_ADRS));
1793
1794 for (uLayer = 0; uLayer < pParams->nLayers; uLayer++)
1795 {
1796 uTree = Idx >> pParams->nLayerHeight;
1797 uLeaf = (UINT32)(Idx & LeafMask);
1798
1802 pParams,
1803 &adrs,
1804 pKey->Seed,
1805 uLayer == 0 ? RandomizedHash : ComputedRoot,
1806 uLeaf,
1807 SymCryptXmssSignatureGetWotspSig(pParams, pbSignature, uLayer),
1808 SymCryptXmssSignatureGetAuthNodes(pParams, pbSignature, uLayer),
1809 ComputedRoot,
1810 pbScratch,
1811 cbScratch);
1812
1813 Idx >>= pParams->nLayerHeight;
1814 }
1815
1816 if (!SymCryptEqual(ComputedRoot, pKey->Root, pParams->cbHashOutput))
1817 {
1818 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1819 goto cleanup;
1820 }
1821
1822cleanup:
1823
1824 if (pbScratch)
1825 {
1826 SymCryptWipe(pbScratch, cbScratch);
1827 SymCryptCallbackFree(pbScratch);
1828 }
1829
1830 return scError;
1831}
BYTE en64Tree[8]
Definition: sc_lib.h:4505
@ SYMCRYPT_XMSSKEY_TYPE_NONE
Definition: symcrypt.h:9152
const SYMCRYPT_XMSS_PARAMS * PCSYMCRYPT_XMSS_PARAMS
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetRandomness(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
Definition: xmss.c:1689
VOID SYMCRYPT_CALL SymCryptXmssTreeRootFromSignature(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbHash, UINT32 uLeaf, _In_reads_bytes_(pParams->cbHashOutput *pParams->len) PCBYTE pbWotspSig, _In_reads_bytes_(pParams->cbHashOutput *pParams->nLayerHeight) PCBYTE pbAuthNodes, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: xmss.c:1612
UINT64 SYMCRYPT_CALL SymCryptXmssSignatureGetIdx(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
Definition: xmss.c:1672
VOID SYMCRYPT_CALL SymCryptXmssRandomizedHash(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, UINT64 Idx, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbRandomizer, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbRoot, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbMsg, SIZE_T cbMsg, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
Definition: xmss.c:1501
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetWotspSig(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
Definition: xmss.c:1703
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetAuthNodes(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
Definition: xmss.c:1721
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofSignatureFromParams(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:477

Referenced by SymCryptXmssVerify().

◆ SymCryptXtsAesDecryptDataUnitAsm()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitAsm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 629 of file xtsaes.c.

635{
636 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
640 pbTweakBlock,
641 pbSrc,
642 pbDst,
643 cbData );
644}
VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:524

◆ SymCryptXtsAesDecryptDataUnitC()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 668 of file xtsaes.c.

674{
675 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
679 pbTweakBlock,
680 pbSrc,
681 pbDst,
682 cbData );
683
684}

◆ SymCryptXtsAesDecryptDataUnitNeon()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesDecryptDataUnitXmm()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesDecryptDataUnitYmm_2048()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitYmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesDecryptDataUnitZmm_2048()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitZmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesEncryptDataUnitAsm()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitAsm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 610 of file xtsaes.c.

616{
617 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
621 pbTweakBlock,
622 pbSrc,
623 pbDst,
624 cbData );
625}
VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:444

◆ SymCryptXtsAesEncryptDataUnitC()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 648 of file xtsaes.c.

654{
655 // No special optimizations...
656 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
660 pbTweakBlock,
661 pbSrc,
662 pbDst,
663 cbData );
664}

◆ SymCryptXtsAesEncryptDataUnitNeon()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitNeon ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesEncryptDataUnitXmm()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitXmm ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesEncryptDataUnitYmm_2048()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitYmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsAesEncryptDataUnitZmm_2048()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitZmm_2048 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbTweakBlock,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE  pbScratch,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

◆ SymCryptXtsDecryptDataUnit()

VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit ( _In_ PCSYMCRYPT_BLOCKCIPHER  pBlockCipher,
_In_ PCVOID  pExpandedKey,
_Inout_updates_(pBlockCipher->blockSize) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 524 of file xtsaes.c.

531{
534
535 while( cbData >= 2*SYMCRYPT_AES_BLOCK_SIZE )
536 {
540
542 SymCryptXtsUpdateTweak( pbTweakBlock );
543
547 }
548
550 {
551 // Ciphertext stealing decryption
552 //
553 // +--------------+
554 // | |
555 // | V
556 // +-----------------+ | +-----+-----------+
557 // | C_m-1 | | | C_m |++++CP+++++|
558 // +-----------------+ | +-----+-----------+
559 // | | |
560 // dec_m | dec_m-1
561 // | | |
562 // V | V
563 // +-----+-----------+ | +-----------------+
564 // | P_m |++++CP+++++|--+ | P_m-1 |
565 // +-----+-----------+ +-----------------+
566 // | /
567 // +---------------- / --+
568 // / |
569 // | V
570 // +-----------------+ | +-----+
571 // | P_m-1 |<-+ | P_m |
572 // +-----------------+ +-----+
573
574 // Save penultimate value of tweak to tweakBuf
575 memcpy( tweakBuf, pbTweakBlock, SYMCRYPT_AES_BLOCK_SIZE );
576
577 // Do final tweak update
578 SymCryptXtsUpdateTweak( pbTweakBlock );
579
580 // Decrypt penultimate ciphertext block into buf
584
586
587 // Copy buf to buf[SYMCRYPT_AES_BLOCK_SIZE]
589 // Copy final ciphertext bytes to prefix of buf - we must read before writing to support in-place decryption
591 // Copy prefix of buf[SYMCRYPT_AES_BLOCK_SIZE] to the right place in the destination buffer
593
594 // Set pbSrc and pbTweakBlock correctly to share code with non-ciphertext stealing case
595 pbSrc = &buf[0];
596 pbTweakBlock = &tweakBuf[0];
597 }
598
599 // Final full block decryption
603
604 SymCryptWipeKnownSize( buf, sizeof(buf) );
605 SymCryptWipeKnownSize( tweakBuf, sizeof(tweakBuf) );
606}
PSYMCRYPT_BLOCKCIPHER_CRYPT decryptFunc
VOID SYMCRYPT_CALL SymCryptXtsUpdateTweak(_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE buf)
Definition: xtsaes.c:401

Referenced by SymCryptXtsAesDecryptDataUnitAsm(), and SymCryptXtsAesDecryptDataUnitC().

◆ SymCryptXtsEncryptDataUnit()

VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit ( _In_ PCSYMCRYPT_BLOCKCIPHER  pBlockCipher,
_In_ PCVOID  pExpandedKey,
_Inout_updates_(pBlockCipher->blockSize) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 444 of file xtsaes.c.

451{
453
454 while( cbData >= 2*SYMCRYPT_AES_BLOCK_SIZE )
455 {
459
461 SymCryptXtsUpdateTweak( pbTweakBlock );
462
466 }
467
469 {
470 // Ciphertext stealing encryption
471 //
472 // +--------------+
473 // | |
474 // | V
475 // +-----------------+ | +-----+-----------+
476 // | P_m-1 | | | P_m |++++CP+++++|
477 // +-----------------+ | +-----+-----------+
478 // | | |
479 // enc_m-1 | enc_m
480 // | | |
481 // V | V
482 // +-----+-----------+ | +-----------------+
483 // | C_m |++++CP+++++|--+ | C_m-1 |
484 // +-----+-----------+ +-----------------+
485 // | /
486 // +---------------- / --+
487 // / |
488 // | V
489 // +-----------------+ | +-----+
490 // | C_m-1 |<-+ | C_m |
491 // +-----------------+ +-----+
492
493 // Encrypt penultimate plaintext block into buf
497
499
500 // Copy buf to buf[SYMCRYPT_AES_BLOCK_SIZE]
502 // Copy final plaintext bytes to prefix of buf - we must read before writing to support in-place encryption
504 // Copy prefix of buf[SYMCRYPT_AES_BLOCK_SIZE] to the right place in the destination buffer
506
507 // Do final tweak update
508 SymCryptXtsUpdateTweak( pbTweakBlock );
509
510 // Set pbSrc correctly to share code with non-ciphertext stealing case
511 pbSrc = &buf[0];
512 }
513
514 // Final full block encryption
518
519 SymCryptWipeKnownSize( buf, sizeof(buf) );
520}

Referenced by SymCryptXtsAesEncryptDataUnitAsm(), and SymCryptXtsAesEncryptDataUnitC().

◆ XorByteIntoBuffer()

FORCEINLINE VOID SYMCRYPT_CALL XorByteIntoBuffer ( _Inout_updates_(8 *cqBuf) PBYTE  pbBuf,
SIZE_T  cqBuf,
BYTE  v 
)

Definition at line 915 of file sc_lib.h.

916{
917 SIZE_T i;
918
919 for( i=0; i<8*cqBuf; i++ )
920 {
921 pbBuf[i] ^= v;
922 }
923}

Referenced by SYMCRYPT_HmacXxxExpandKey(), and SymCryptHmacExpandKey().

Variable Documentation

◆ abId

Definition at line 4729 of file sc_lib.h.

◆ abPublicRoot

BYTE abPublicRoot[SYMCRYPT_LMS_MAX_N]

Definition at line 4732 of file sc_lib.h.

Referenced by SymCryptLmskeyVerifyRoot().

◆ abSeed

◆ g_SymCryptFlags

UINT32 g_SymCryptFlags
extern

Definition at line 18 of file libmain.c.

Referenced by SymCryptInitEnvCommon(), and SymCryptInitEnvWindowsUsermodeWin8_1nLater().

◆ g_SymCryptModFns

const SYMCRYPT_MODULAR_FUNCTIONS g_SymCryptModFns[]
extern

Definition at line 21 of file a_dispatch.c.

◆ g_SymCryptModFnsMask

const UINT32 g_SymCryptModFnsMask
extern

Definition at line 72 of file a_dispatch.c.

◆ hasPrivateSeed

BOOLEAN hasPrivateSeed

Definition at line 4449 of file sc_lib.h.

◆ keyType

◆ nNextUnusedLeaf

UINT64 nNextUnusedLeaf

Definition at line 4723 of file sc_lib.h.

◆ params

Definition at line 4523 of file sc_lib.h.

◆ pkEcKey

PSYMCRYPT_ECKEY pkEcKey

Definition at line 4445 of file sc_lib.h.

◆ pkMlKemkey

◆ privateSeed

Definition at line 4450 of file sc_lib.h.

Referenced by SymCryptMlKemkeyGenerate().

◆ PSYMCRYPT_COMPOSITE_MLKEMKEY

◆ Root

Definition at line 4528 of file sc_lib.h.

◆ Seed

◆ SkPrf

Definition at line 4537 of file sc_lib.h.

◆ SkXmss

Definition at line 4536 of file sc_lib.h.

◆ SYMCRYPT_COMPOSITE_MLKEMKEY

◆ SYMCRYPT_LMS_KEY

Definition at line 4738 of file sc_lib.h.

◆ SYMCRYPT_XMSS_KEY

Definition at line 4539 of file sc_lib.h.

◆ SymCryptAesBlockCipherNoOpt

◆ SymCryptDlgroupDhSafePrimeParamsffdhe2048

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe2048
extern

Definition at line 902 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsffdhe3072

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe3072
extern

Definition at line 903 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsffdhe4096

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe4096
extern

Definition at line 904 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsffdhe6144

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe6144
extern

Definition at line 905 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsffdhe8192

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsffdhe8192
extern

Definition at line 906 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsModp2048

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp2048
extern

Definition at line 896 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsModp3072

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp3072
extern

Definition at line 897 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsModp4096

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp4096
extern

Definition at line 898 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsModp6144

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp6144
extern

Definition at line 899 of file dl_internal_groups.c.

◆ SymCryptDlgroupDhSafePrimeParamsModp8192

const PCSYMCRYPT_DLGROUP_DH_SAFEPRIME_PARAMS SymCryptDlgroupDhSafePrimeParamsModp8192
extern

Definition at line 900 of file dl_internal_groups.c.

◆ SymCryptEcpointFormatNumberofElements

const UINT32 SymCryptEcpointFormatNumberofElements[4]
extern

◆ SymCryptEcurveParamsV2ExtensionMontgomery

const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionMontgomery
extern

Definition at line 597 of file ec_internal_curve_params.c.

Referenced by SymCryptEcurveInitialize().

◆ SymCryptEcurveParamsV2ExtensionShortWeierstrass

const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionShortWeierstrass
extern

Definition at line 595 of file ec_internal_curve_params.c.

Referenced by SymCryptEcurveInitialize().

◆ SymCryptEcurveParamsV2ExtensionTwistedEdwards

const PCSYMCRYPT_ECURVE_PARAMS_V2_EXTENSION SymCryptEcurveParamsV2ExtensionTwistedEdwards
extern

Definition at line 596 of file ec_internal_curve_params.c.

Referenced by SymCryptEcurveInitialize().

◆ SymCryptMd2Algorithm_default

const SYMCRYPT_HASH SymCryptMd2Algorithm_default
extern

Definition at line 27 of file md2.c.

◆ SymCryptMd4Algorithm_default

const SYMCRYPT_HASH SymCryptMd4Algorithm_default
extern

Definition at line 33 of file md4.c.

◆ SymCryptMd5Algorithm_default

const SYMCRYPT_HASH SymCryptMd5Algorithm_default
extern

Definition at line 30 of file md5.c.

◆ SymCryptModulusTypeSelections

const SYMCRYPT_MODULUS_TYPE_SELECTION_ENTRY SymCryptModulusTypeSelections[]
extern

Definition at line 77 of file a_dispatch.c.

Referenced by SymCryptFdefDecideModulusType().

◆ SymCryptNamedSafePrimeGroups

◆ SymCryptParallelSha256Algorithm

const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha256Algorithm
extern

◆ SymCryptParallelSha384Algorithm

const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha384Algorithm
extern

◆ SymCryptParallelSha512Algorithm

const PCSYMCRYPT_PARALLEL_HASH SymCryptParallelSha512Algorithm
extern

◆ SymCryptSha1Algorithm_default

const SYMCRYPT_HASH SymCryptSha1Algorithm_default
extern

Definition at line 16 of file sha1.c.

◆ SymCryptSha224Algorithm_default

const SYMCRYPT_HASH SymCryptSha224Algorithm_default
extern

Definition at line 19 of file sha256.c.

◆ SymCryptSha256Algorithm_default

const SYMCRYPT_HASH SymCryptSha256Algorithm_default
extern

Definition at line 32 of file sha256.c.

◆ SymCryptSha256KATAnswer

const BYTE SymCryptSha256KATAnswer[32]
extern

Definition at line 476 of file sha256.c.

Referenced by SymCryptSha256Selftest().

◆ SymCryptSha384Algorithm_default

const SYMCRYPT_HASH SymCryptSha384Algorithm_default
extern

Definition at line 117 of file sha512.c.

◆ SymCryptSha384KATAnswer

const BYTE SymCryptSha384KATAnswer[48]
extern

Definition at line 728 of file sha512.c.

Referenced by SymCryptSha384Selftest().

◆ SymCryptSha3_224Algorithm_default

const SYMCRYPT_HASH SymCryptSha3_224Algorithm_default
extern

Definition at line 14 of file sha3_224.c.

◆ SymCryptSha3_256Algorithm_default

const SYMCRYPT_HASH SymCryptSha3_256Algorithm_default
extern

Definition at line 14 of file sha3_256.c.

◆ SymCryptSha3_384Algorithm_default

const SYMCRYPT_HASH SymCryptSha3_384Algorithm_default
extern

Definition at line 14 of file sha3_384.c.

◆ SymCryptSha3_512Algorithm_default

const SYMCRYPT_HASH SymCryptSha3_512Algorithm_default
extern

Definition at line 14 of file sha3_512.c.

◆ SymCryptSha512_224Algorithm_default

const SYMCRYPT_HASH SymCryptSha512_224Algorithm_default
extern

Definition at line 143 of file sha512.c.

◆ SymCryptSha512_256Algorithm_default

const SYMCRYPT_HASH SymCryptSha512_256Algorithm_default
extern

Definition at line 156 of file sha512.c.

◆ SymCryptSha512Algorithm_default

const SYMCRYPT_HASH SymCryptSha512Algorithm_default
extern

Definition at line 130 of file sha512.c.

◆ SymCryptSha512KATAnswer

const BYTE SymCryptSha512KATAnswer[64]
extern

Definition at line 695 of file sha512.c.

Referenced by SymCryptSha512Selftest().

◆ SymCryptShake128HashAlgorithm_default

const SYMCRYPT_HASH SymCryptShake128HashAlgorithm_default
extern

Definition at line 28 of file shake.c.

◆ SymCryptShake256HashAlgorithm_default

const SYMCRYPT_HASH SymCryptShake256HashAlgorithm_default
extern

Definition at line 80 of file shake.c.

◆ SymCryptTestKey32

◆ SymCryptTestMsg16

◆ SymCryptTestMsg3