ReactOS 0.4.17-dev-1005-g171e1de
mldsa_primitives.c File Reference
#include "precomp.h"
Include dependency graph for mldsa_primitives.c:

Go to the source code of this file.

Classes

struct  _SYMCRYPT_HASH_OID_MAPPING
 

Macros

#define SYMCRYPT_MLDSA_Q_INV   (58728449)
 
#define SYMCRYPT_MLDSA_INTT_FIXUP_TIMES_R   (16382)
 
#define SYMCRYPT_MLDSA_RSQR   (2365951)
 
#define SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE   (34)
 
#define SYMCRYPT_MLDSA_REJBOUNDEDPOLY_SEED_SIZE   (66)
 
#define SYMCRYPT_POWER2ROUND_LOW_ORDER_BITS   (13)
 

Typedefs

typedef struct _SYMCRYPT_HASH_OID_MAPPING SYMCRYPT_HASH_OID_MAPPING
 
typedef struct _SYMCRYPT_HASH_OID_MAPPING * PSYMCRYPT_HASH_OID_MAPPING
 

Functions

 C_ASSERT (SYMCRYPT_SHA256_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA384_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA512_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA512_256_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA3_256_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA3_384_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHA3_512_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHAKE128_OID_COUNT==2)
 
 C_ASSERT (SYMCRYPT_SHAKE256_OID_COUNT==2)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaGetInternalParamsFromParams (SYMCRYPT_MLDSA_PARAMS params, PCSYMCRYPT_MLDSA_INTERNAL_PARAMS *pInternalParams)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSizeofKeyFormatFromParams (SYMCRYPT_MLDSA_PARAMS params, SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat, SIZE_T *pcbKeyFormat)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSizeofSignatureFromParams (SYMCRYPT_MLDSA_PARAMS params, SIZE_T *pcbSignature)
 
_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyInitialize (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams, PBYTE pbKey, UINT32 cbKey)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyComputeT (PCSYMCRYPT_MLDSA_MATRIX pmA, PCSYMCRYPT_MLDSA_VECTOR pvs1, PCSYMCRYPT_MLDSA_VECTOR pvs2, PSYMCRYPT_MLDSA_VECTOR pvt0, PSYMCRYPT_MLDSA_VECTOR pvt1, PSYMCRYPT_MLDSA_VECTOR pvTmp, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
 
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontReduce (UINT64 a)
 
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontMul (UINT32 a, UINT32 b)
 
UINT32 SYMCRYPT_CALL SymCryptMlDsaModAdd (UINT32 a, UINT32 b)
 
UINT32 SYMCRYPT_CALL SymCryptMlDsaModSub (UINT32 a, UINT32 b)
 
_Use_decl_annotations_ PSYMCRYPT_MLDSA_POLYELEMENT SYMCRYPT_CALL SymCryptMlDsaPolyElementCreate (PBYTE pbBuffer, SIZE_T cbBuffer)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementSetZero (PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementNTT (PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementINTT (PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMulR (PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMontMul (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementAdd (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementSub (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ PSYMCRYPT_MLDSA_VECTOR SYMCRYPT_CALL SymCryptMlDsaVectorCreate (PBYTE pbBuffer, UINT32 cbBuffer, UINT8 nElems)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorCopy (PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorSetZero (PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorAdd (PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorSub (PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPolyElementMontMul (PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorNTT (PSYMCRYPT_MLDSA_VECTOR pvSrc)
 
VOID SYMCRYPT_CALL SymCryptMlDsaVectorINTT (_Inout_ PSYMCRYPT_MLDSA_VECTOR pvSrc)
 
_Use_decl_annotations_ PSYMCRYPT_MLDSA_MATRIX SYMCRYPT_CALL SymCryptMlDsaMatrixCreate (PBYTE pbBuffer, UINT32 cbBuffer, UINT8 nRows, UINT8 nCols)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMatrixVectorMontMul (PCSYMCRYPT_MLDSA_MATRIX pmSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejNttPoly (PCBYTE pbRejNttPolySeed, SIZE_T cbRejNttPolySeed, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandA (PCBYTE pbPublicSeed, SIZE_T cbPublicSeed, PSYMCRYPT_MLDSA_MATRIX pmA)
 
_Use_decl_annotations_ FORCEINLINE INT8 SYMCRYPT_CALL SymCryptMlDsaCoeffFromHalfByte (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT8 halfByte)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejBoundedPoly (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbRejBoundedPolySeed, SIZE_T cbRejBoundedPolySeed, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandS (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbPrivateVectorSeed, SIZE_T cbPrivateVectorSeed, PSYMCRYPT_MLDSA_VECTOR pvs1, PSYMCRYPT_MLDSA_VECTOR pvs2)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSampleInBall (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PSYMCRYPT_MLDSA_POLYELEMENT peChallenge)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandMask (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PSYMCRYPT_SHAKE256_STATE pShakeState, PCBYTE pbPrivateRandom, SIZE_T cbPrivateRandom, UINT16 counter, PSYMCRYPT_MLDSA_VECTOR pvMask)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMakeHint (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PSYMCRYPT_MLDSA_VECTOR pvWMinusCs2, PSYMCRYPT_MLDSA_VECTOR pvWMinusCs2PlusCt0, PSYMCRYPT_MLDSA_VECTOR pvDst, UINT32 *nBitsSet)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaUseHint (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvHint, PSYMCRYPT_MLDSA_VECTOR pvCommitment)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkEncode (PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkDecode (PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkEncode (PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkDecode (PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSigEncode (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PCSYMCRYPT_MLDSA_VECTOR pvResponse, PCSYMCRYPT_MLDSA_VECTOR pvHint, PBYTE pbDst, SIZE_T cbDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSigDecode (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbSig, SIZE_T cbSig, PBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PSYMCRYPT_MLDSA_VECTOR pvResponse, PSYMCRYPT_MLDSA_VECTOR pvHint)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaHintBitPack (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PBYTE pbDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaHintBitUnpack (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaValidateHashAlgAndGetOid (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, SYMCRYPT_PQDSA_HASH_ID hashAlg, SIZE_T cbHash, PCSYMCRYPT_OID *ppOid)
 
FORCEINLINE INT32 SYMCRYPT_CALL SymCryptMlDsaModPlusMinus (UINT32 r, UINT32 modulus)
 
_Use_decl_annotations_ FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaPolyElementInfinityNorm (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc)
 
_Use_decl_annotations_ UINT32 SYMCRYPT_CALL SymCryptMlDsaVectorInfinityNorm (PCSYMCRYPT_MLDSA_VECTOR pvSrc)
 
_Use_decl_annotations_ FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlDsaDecompose (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT32 r, UINT32 *puR1, UINT32 *puR0)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorHighBits (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorLowBits (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPower2Round (UINT32 r, UINT32 *puR1, UINT32 *puR0)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementPower2Round (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc, PSYMCRYPT_MLDSA_POLYELEMENT peDst1, PSYMCRYPT_MLDSA_POLYELEMENT peDst0)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPower2Round (PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst1, PSYMCRYPT_MLDSA_VECTOR pvDst0)
 
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaSignedCoefficientModQ (INT32 coefficient)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementEncode (PCSYMCRYPT_MLDSA_POLYELEMENT peSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PBYTE pbDst)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPolyElementDecode (PCBYTE pbSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorEncode (PCSYMCRYPT_MLDSA_VECTOR pvSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PBYTE pbDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaVectorDecode (_In_reads_bytes_(pvDst->nElems *nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE pbSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, _Inout_ PSYMCRYPT_MLDSA_VECTOR pvDst)
 
_Use_decl_annotations_ PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES SYMCRYPT_CALL SymCryptMlDsaTemporariesAllocateAndInitialize (PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT32 nRowVectors, UINT32 nColVectors, UINT32 nPolyElements, UINT32 cbScratch)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaTemporariesFree (PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES pTemporaries)
 

Variables

const UINT32 MLDSA_ZETA_BITREV_TIMES_R [SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
 
const UINT32 MLDSA_NEGATIVE_ZETA_BITREV_TIMES_R [SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
 
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams44
 
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams65
 
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams87
 
const SYMCRYPT_HASH_OID_MAPPING g_hashOidMap []
 

Macro Definition Documentation

◆ SYMCRYPT_MLDSA_INTT_FIXUP_TIMES_R

#define SYMCRYPT_MLDSA_INTT_FIXUP_TIMES_R   (16382)

Definition at line 17 of file mldsa_primitives.c.

◆ SYMCRYPT_MLDSA_Q_INV

#define SYMCRYPT_MLDSA_Q_INV   (58728449)

Definition at line 12 of file mldsa_primitives.c.

◆ SYMCRYPT_MLDSA_REJBOUNDEDPOLY_SEED_SIZE

#define SYMCRYPT_MLDSA_REJBOUNDEDPOLY_SEED_SIZE   (66)

Definition at line 35 of file mldsa_primitives.c.

◆ SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE

#define SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE   (34)

Definition at line 29 of file mldsa_primitives.c.

◆ SYMCRYPT_MLDSA_RSQR

#define SYMCRYPT_MLDSA_RSQR   (2365951)

Definition at line 23 of file mldsa_primitives.c.

◆ SYMCRYPT_POWER2ROUND_LOW_ORDER_BITS

#define SYMCRYPT_POWER2ROUND_LOW_ORDER_BITS   (13)

Definition at line 40 of file mldsa_primitives.c.

Typedef Documentation

◆ PSYMCRYPT_HASH_OID_MAPPING

◆ SYMCRYPT_HASH_OID_MAPPING

Function Documentation

◆ C_ASSERT() [1/9]

C_ASSERT ( SYMCRYPT_SHA256_OID_COUNT  = =2)

◆ C_ASSERT() [2/9]

C_ASSERT ( SYMCRYPT_SHA384_OID_COUNT  = =2)

◆ C_ASSERT() [3/9]

C_ASSERT ( SYMCRYPT_SHA3_256_OID_COUNT  = =2)

◆ C_ASSERT() [4/9]

C_ASSERT ( SYMCRYPT_SHA3_384_OID_COUNT  = =2)

◆ C_ASSERT() [5/9]

C_ASSERT ( SYMCRYPT_SHA3_512_OID_COUNT  = =2)

◆ C_ASSERT() [6/9]

C_ASSERT ( SYMCRYPT_SHA512_256_OID_COUNT  = =2)

◆ C_ASSERT() [7/9]

C_ASSERT ( SYMCRYPT_SHA512_OID_COUNT  = =2)

◆ C_ASSERT() [8/9]

C_ASSERT ( SYMCRYPT_SHAKE128_OID_COUNT  = =2)

◆ C_ASSERT() [9/9]

C_ASSERT ( SYMCRYPT_SHAKE256_OID_COUNT  = =2)

◆ SymCryptHashMlDsaValidateHashAlgAndGetOid()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaValidateHashAlgAndGetOid ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
SYMCRYPT_PQDSA_HASH_ID  hashAlg,
SIZE_T  cbHash,
PCSYMCRYPT_OID *  ppOid 
)

Definition at line 1799 of file mldsa_primitives.c.

1804{
1805 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1806 PCSYMCRYPT_OID pHashOid = NULL;
1807 BOOLEAN fFound = FALSE;
1808 BOOLEAN fIsXof = FALSE;
1809 SIZE_T cbHashExpected = 0;
1810
1811 for( UINT32 i = 0; i < SYMCRYPT_ARRAY_SIZE(g_hashOidMap); ++i )
1812 {
1813 if( g_hashOidMap[i].hashId == hashAlg )
1814 {
1815 fFound = TRUE;
1816 pHashOid = g_hashOidMap[i].pOid;
1817 fIsXof = g_hashOidMap[i].fIsXof;
1818 cbHashExpected = g_hashOidMap[i].pHashAlgorithm->resultSize;
1819 break;
1820 }
1821 }
1822
1823 if( !fFound )
1824 {
1825 scError = SYMCRYPT_INVALID_ARGUMENT;
1826 goto cleanup;
1827 }
1828
1830
1831 // For traditional hash algorithms (non-XOFs), the hash length must exactly match the expected
1832 // value. For XOFs, the output length is arbitrary, and any length is acceptable as long as it
1833 // meets the minimum collision strength specified by the parameter set (cbCommitmentHash)
1834 if( (!fIsXof && cbHash != cbHashExpected ) ||
1835 ( cbHash < pParams->cbCommitmentHash ) )
1836 {
1837 scError = SYMCRYPT_INVALID_ARGUMENT;
1838 goto cleanup;
1839 }
1840
1841 *ppOid = pHashOid;
1842
1843cleanup:
1844 return scError;
1845}
unsigned char BOOLEAN
Definition: actypes.h:127
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static void cleanup(void)
Definition: main.c:1335
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
const SYMCRYPT_HASH_OID_MAPPING g_hashOidMap[]
#define SYMCRYPT_ARRAY_SIZE(_x)
Definition: sc_lib.h:342
#define SYMCRYPT_MLDSA_SUPPORTED_HASH_OID_SIZE
Definition: sc_lib_mldsa.h:55
const PCSYMCRYPT_HASH pHashAlgorithm
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
SYMCRYPT_ERROR
Definition: symcrypt.h:227
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptHashMlDsaSign(), and SymCryptHashMlDsaVerify().

◆ SymCryptMlDsaCoeffFromHalfByte()

_Use_decl_annotations_ FORCEINLINE INT8 SYMCRYPT_CALL SymCryptMlDsaCoeffFromHalfByte ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
UINT8  halfByte 
)

Definition at line 903 of file mldsa_primitives.c.

906{
907 SYMCRYPT_ASSERT( halfByte <= 15 );
908 SYMCRYPT_ASSERT( pParams->privateKeyRange == 2 || pParams->privateKeyRange == 4 );
909
910 if( pParams->privateKeyRange == 2 && halfByte < 15)
911 {
912 UINT8 halfByteDiv5 = (UINT8) ( ( halfByte * 13 ) >> 6 );
913 UINT8 halfByteMod5 = halfByte - (5 * halfByteDiv5);
914 return 2 - halfByteMod5;
915 }
916 else if( pParams->privateKeyRange == 4 && halfByte < 9 )
917 {
918 return 4 - halfByte;
919 }
920
921 return INT8_MIN;
922}
unsigned char UINT8
Definition: actypes.h:128
#define INT8_MIN
Definition: stdint.h:73

Referenced by SymCryptMlDsaRejBoundedPoly().

◆ SymCryptMlDsaDecompose()

_Use_decl_annotations_ FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlDsaDecompose ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
UINT32  r,
UINT32 *  puR1,
UINT32 *  puR0 
)

Definition at line 1918 of file mldsa_primitives.c.

1923{
1925 SYMCRYPT_ASSERT( puR1 != NULL || puR0 != NULL );
1926
1927 UINT32 r1 = 0;
1928 UINT32 mask = 0;
1929 INT32 r0 = 0;
1930
1931 // Some tricks for calculating this are borrowed from the reference implementation
1932 // https://github.com/pq-crystals/dilithium/blob/master/ref/rounding.c
1933 //
1934 // The multiplication constants for calculating r1 are in the PCSYMCRYPT_MLDSA_INTERNAL_PARAMS
1935 // structure. They are calculated as follows.
1936 //
1937 // To keep intermediate values in the 32-bit range, instead of using r directly, we calculate
1938 // ceil( r/128 ). We likewise divide the commitment rounding range by 128.
1939 //
1940 // For ML-DSA 44:
1941 // 2*commmitmentRoundingRange = 2 * 95,232 = 190,464
1942 // 190464 // 128 = 1488
1943 // 1 / 1488 ~= floor(2^24 // 1488) * 2^24 = 11,275 // 2^24
1944 // For ML-DSA 65 and 87:
1945 // 2*commmitmentRoundingRange = 2*261888 = 523776
1946 // 523776 // 128 = 4092
1947 // 1 / 4092 ~= floor(2^22 // 4092) * 2^22 = 1025 // 2^22 = 4100 // 2^24
1948 //
1949
1950 UINT32 rdiv128 = (r + 127) >> 7;
1951 r1 = ( rdiv128 * pParams->decomposeR1Factor + (1 << 23)) >> 24;
1952
1953 // Handle corner case: if r1 is outside of the expected range, set it to 0
1955 r1 &= mask;
1956
1957 r0 = r - ( r1 * 2 * pParams->commitmentRoundingRange );
1958
1959 // Handle corner case for r0
1960 r0 -= ((((SYMCRYPT_MLDSA_Q - 1) >> 1) - r0) >> 31) & SYMCRYPT_MLDSA_Q;
1962
1963 if( puR1 != NULL )
1964 {
1965 *puR1 = r1;
1966 }
1967
1968 if( puR0 != NULL )
1969 {
1970 *puR0 = r0;
1971 }
1972}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum GLint GLuint mask
Definition: glext.h:6028
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaSignedCoefficientModQ(INT32 coefficient)
static DNS_RECORDW r1
Definition: record.c:37
#define SYMCRYPT_MLDSA_Q
Definition: sc_lib_mldsa.h:13
#define SYMCRYPT_MASK32_LT(_a, _b)
int32_t INT32
Definition: typedefs.h:58

Referenced by SymCryptMlDsaUseHint(), SymCryptMlDsaVectorHighBits(), and SymCryptMlDsaVectorLowBits().

◆ SymCryptMlDsaExpandA()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandA ( PCBYTE  pbPublicSeed,
SIZE_T  cbPublicSeed,
PSYMCRYPT_MLDSA_MATRIX  pmA 
)

Definition at line 872 of file mldsa_primitives.c.

876{
879
880 // The expanded seed is the public seed concatenated with one byte each for the column and row
881 // indices of the matrix element being expanded.
883 memcpy( rejNttSeed, pbPublicSeed, cbPublicSeed );
884
885 for( UINT8 i = 0; i < pmA->nRows; ++i )
886 {
887 for( UINT8 j = 0; j < pmA->nCols; ++j )
888 {
889 rejNttSeed[SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE - 2] = j;
890 rejNttSeed[SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE - 1] = i;
891
892 #pragma prefast( suppress: 6385, "False warning - reading invalid data from rejNttSeed" );
893 SymCryptMlDsaRejNttPoly( rejNttSeed, sizeof(rejNttSeed), SYMCRYPT_INTERNAL_MLDSA_MATRIX_ELEMENT( i, j, pmA ) );
894
895 }
896 }
897}
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
#define C_ASSERT(e)
Definition: intsafe.h:73
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define SYMCRYPT_MLDSA_REJNTTPOLY_SEED_SIZE
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejNttPoly(PCBYTE pbRejNttPolySeed, SIZE_T cbRejNttPolySeed, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
#define SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE
Definition: sc_lib_mldsa.h:28
#define SYMCRYPT_INTERNAL_MLDSA_MATRIX_ELEMENT(_row, _col, _pMatrix)
Definition: sc_lib_mldsa.h:219
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptMlDsaKeyGenerateEx(), SymCryptMlDsaPkDecode(), and SymCryptMlDsaSkDecode().

◆ SymCryptMlDsaExpandMask()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandMask ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PSYMCRYPT_SHAKE256_STATE  pShakeState,
PCBYTE  pbPrivateRandom,
SIZE_T  cbPrivateRandom,
UINT16  counter,
PSYMCRYPT_MLDSA_VECTOR  pvMask 
)

Definition at line 1061 of file mldsa_primitives.c.

1068{
1069 SYMCRYPT_ASSERT( pParams->nCols == pvMask->nElems );
1070 SYMCRYPT_ASSERT( cbPrivateRandom == SYMCRYPT_SHAKE256_RESULT_SIZE );
1071
1072 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1073 BYTE seedSuffix[2];
1074
1075 UINT32 cbShakeOutput = (pParams->maskCoefficientRangeLog2 + 1) * (SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8);
1076 BYTE shakeOutput[20 * 32]; // Maximum size of the SHAKE output
1077 SYMCRYPT_ASSERT( cbShakeOutput <= sizeof(shakeOutput) );
1078
1079 for(UINT16 i = 0; i < pvMask->nElems; ++i)
1080 {
1081 SYMCRYPT_STORE_LSBFIRST16( seedSuffix, counter + i );
1082 SymCryptShake256Append( pShakeState, pbPrivateRandom, cbPrivateRandom );
1083 SymCryptShake256Append( pShakeState, (PBYTE) &seedSuffix, sizeof(seedSuffix) );
1084 SymCryptShake256Extract( pShakeState, shakeOutput, cbShakeOutput, TRUE );
1085
1087 shakeOutput,
1088 pParams->maskCoefficientRangeLog2 + 1,
1089 1 << pParams->maskCoefficientRangeLog2,
1091 SYMCRYPT_ASSERT( scError == SYMCRYPT_NO_ERROR );
1092 }
1093
1094 SymCryptMlDsaVectorNTT( pvMask );
1095}
unsigned short UINT16
Definition: actypes.h:129
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPolyElementDecode(PCBYTE pbSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorNTT(PSYMCRYPT_MLDSA_VECTOR pvSrc)
BYTE * PBYTE
Definition: pedump.c:66
#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS
Definition: sc_lib.h:4347
#define SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT(_row, _pVector)
Definition: sc_lib_mldsa.h:217
#define SYMCRYPT_SHAKE256_RESULT_SIZE
Definition: symcrypt.h:1964
#define SYMCRYPT_STORE_LSBFIRST16(p, v)
Definition: symcrypt.h:306
VOID SYMCRYPT_CALL SymCryptShake256Append(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptShake256Extract(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)

Referenced by SymCryptMlDsaSignEx().

◆ SymCryptMlDsaExpandS()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandS ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PCBYTE  pbPrivateVectorSeed,
SIZE_T  cbPrivateVectorSeed,
PSYMCRYPT_MLDSA_VECTOR  pvs1,
PSYMCRYPT_MLDSA_VECTOR  pvs2 
)

Definition at line 977 of file mldsa_primitives.c.

983{
986
987 UINT32 nRows = pParams->nRows;
988 UINT32 nCols = pParams->nCols;
989
990 // The expanded seed is the private vector seed concatenated with the (two-byte) row/column
991 // index of the vector element being expanded.
993 memcpy( rejBoundedPolySeed, pbPrivateVectorSeed, cbPrivateVectorSeed );
994
995 for(UINT16 i = 0; i < nCols; ++i)
996 {
998 SymCryptMlDsaRejBoundedPoly( pParams, rejBoundedPolySeed, sizeof(rejBoundedPolySeed),
1000 }
1001
1002 for(UINT16 i = 0; i < nRows; ++i)
1003 {
1005 #pragma prefast( suppress: 6385, "False warning - reading invalid data from rejBoundedPolySeed" ); // Doesn't trigger in previous loop for some reason
1006 SymCryptMlDsaRejBoundedPoly( pParams, rejBoundedPolySeed, sizeof(rejBoundedPolySeed),
1008 }
1009
1010 SymCryptWipeKnownSize( rejBoundedPolySeed, sizeof(rejBoundedPolySeed) );
1011}
int nCols
Definition: appswitch.c:55
#define SYMCRYPT_MLDSA_REJBOUNDEDPOLY_SEED_SIZE
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejBoundedPoly(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbRejBoundedPolySeed, SIZE_T cbRejBoundedPolySeed, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
#define SYMCRYPT_MLDSA_PRIVATE_VECTOR_SEED_SIZE
Definition: sc_lib_mldsa.h:43
UINT8 nRows
Definition: sc_lib_mlkem.h:69
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)

Referenced by SymCryptMlDsaKeyGenerateEx().

◆ SymCryptMlDsaGetInternalParamsFromParams()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaGetInternalParamsFromParams ( SYMCRYPT_MLDSA_PARAMS  params,
PCSYMCRYPT_MLDSA_INTERNAL_PARAMS *  pInternalParams 
)

Definition at line 243 of file mldsa_primitives.c.

246{
247 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
248
249 switch( params )
250 {
252 *pInternalParams = &SymCryptMlDsaInternalParams44;
253 break;
255 *pInternalParams = &SymCryptMlDsaInternalParams65;
256 break;
258 *pInternalParams = &SymCryptMlDsaInternalParams87;
259 break;
261 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
262 break;
263 default:
264 scError = SYMCRYPT_INVALID_ARGUMENT;
265 break;
266 }
267
268 return scError;
269}
GLenum const GLfloat * params
Definition: glext.h:5645
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams65
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams44
const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams87
@ SYMCRYPT_MLDSA_PARAMS_MLDSA44
Definition: symcrypt.h:10417
@ SYMCRYPT_MLDSA_PARAMS_MLDSA65
Definition: symcrypt.h:10418
@ SYMCRYPT_MLDSA_PARAMS_NULL
Definition: symcrypt.h:10416
@ SYMCRYPT_MLDSA_PARAMS_MLDSA87
Definition: symcrypt.h:10419

Referenced by SymCryptMlDsakeyAllocate(), SymCryptMlDsaSizeofKeyFormatFromParams(), and SymCryptMlDsaSizeofSignatureFromParams().

◆ SymCryptMlDsaHintBitPack()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaHintBitPack ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PCSYMCRYPT_MLDSA_VECTOR  pvSrc,
PBYTE  pbDst 
)

Definition at line 1707 of file mldsa_primitives.c.

1711{
1713
1714 UINT32 index = 0;
1715 for( UINT32 i = 0; i < pvSrc->nElems; ++i )
1716 {
1719 {
1720 // Side channel safety: the hint is public (part of the signature) so it's okay to
1721 // leak information here
1722 if( peElement->coeffs[j] != 0 )
1723 {
1724 // Each byte in the hint is the index of a non-zero coefficient
1725 pbDst[index] = (BYTE) j;
1726 index++;
1727 }
1728 }
1729
1730 // The number of non-zero coefficients in polynomials 0..i is stored in the
1731 // (nHintNonZeroCoeffs + i)th byte. This allows us to determine which indices correspond
1732 // to which polynomials during decoding while still only using one byte per index.
1733 SYMCRYPT_ASSERT( index <= pParams->nHintNonZeroCoeffs );
1734 pbDst[pParams->nHintNonZeroCoeffs + i] = (BYTE) index;
1735 }
1736}
#define index(s, c)
Definition: various.h:29
GLuint index
Definition: glext.h:6031
UINT32 coeffs[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
Definition: sc_lib_mldsa.h:64
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
PCBYTE PBYTE pbDst

Referenced by SymCryptMlDsaSigEncode().

◆ SymCryptMlDsaHintBitUnpack()

Definition at line 1741 of file mldsa_primitives.c.

1745{
1746 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1747 UINT32 index = 0;
1748 UINT32 maxIndex = 0;
1749 UINT32 first = 0;
1750
1751 for( UINT32 i = 0; i < pvDst->nElems; ++i )
1752 {
1754
1755 // Ensure pvDst is zeroed out before unpacking
1757
1758 maxIndex = pbSrc[pParams->nHintNonZeroCoeffs + i];
1759 if( ( maxIndex < index) ||
1760 ( maxIndex > pParams->nHintNonZeroCoeffs) )
1761 {
1762 // Invalid input
1763 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1764 goto cleanup;
1765 }
1766
1767 first = index;
1768 while( index < maxIndex )
1769 {
1770 if( index > first && pbSrc[index - 1] >= pbSrc[index])
1771 {
1772 // Invalid input
1773 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1774 goto cleanup;
1775 }
1776
1777 peElement->coeffs[pbSrc[index]] = 1;
1778 index++;
1779 }
1780 }
1781
1782 for(UINT32 leftover = index; leftover < pParams->nHintNonZeroCoeffs; ++leftover)
1783 {
1784 if( pbSrc[leftover] != 0 )
1785 {
1786 // Invalid input
1787 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1788 goto cleanup;
1789 }
1790 }
1791
1792cleanup:
1793 return scError;
1794}
const GLint * first
Definition: glext.h:5794
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementSetZero(PSYMCRYPT_MLDSA_POLYELEMENT peDst)
PCBYTE pbSrc

Referenced by SymCryptMlDsaSigDecode().

◆ SymCryptMlDsakeyComputeT()

Definition at line 384 of file mldsa_primitives.c.

392{
393 // T = InvNTT(NTT(A)*NTT(s1) + NTT(s2))
394 // pvTmp := NTT(A)*NTT(s1)
396 pmA,
397 pvs1,
398 pvTmp,
399 peTmp );
400
401 // TODO: should probably do multiplication by directly in the matrix multiplication function
402 for(UINT8 i = 0; i < pvTmp->nElems; ++i)
403 {
405 }
406
407 // pvTmp := pvTmp + NTT(s2)
408 SymCryptMlDsaVectorAdd( pvTmp, pvs2, pvTmp );
409
410 // T = pvTmp := InvNTT(NTT(A)*NTT(s1) + NTT(s2))
412
413 SymCryptMlDsaVectorPower2Round( pvTmp, pvt1, pvt0 );
414}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMatrixVectorMontMul(PCSYMCRYPT_MLDSA_MATRIX pmSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorAdd(PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPower2Round(PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst1, PSYMCRYPT_MLDSA_VECTOR pvDst0)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMulR(PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
VOID SYMCRYPT_CALL SymCryptMlDsaVectorINTT(_Inout_ PSYMCRYPT_MLDSA_VECTOR pvSrc)

Referenced by SymCryptMlDsaKeyGenerateEx(), and SymCryptMlDsaSkDecode().

◆ SymCryptMlDsakeyInitialize()

_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyInitialize ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pInternalParams,
PBYTE  pbKey,
UINT32  cbKey 
)

Definition at line 333 of file mldsa_primitives.c.

337{
339 SYMCRYPT_ASSERT( pkMlDsakey != NULL );
340
341 UINT8 nRows = pInternalParams->nRows;
342 UINT8 nCols = pInternalParams->nCols;
343
345
346 UINT32 cbMatrix = pInternalParams->cbMatrix; // A matrix
347 UINT32 cbRowVector = pInternalParams->cbRowVector; // s2, t vectors
348 UINT32 cbColVector = pInternalParams->cbColVector; // s1 vector
349
351
352 pkMlDsakey->pParams = pInternalParams;
353 pkMlDsakey->cbTotalSize = cbKey;
354
355 PBYTE pbCurrent = pbKey + sizeof(SYMCRYPT_MLDSAKEY);
356
357 // Public components
358 pkMlDsakey->pmA = SymCryptMlDsaMatrixCreate( pbCurrent, cbMatrix, nRows, nCols );
359 pbCurrent += cbMatrix;
360
361 pkMlDsakey->pvt1 = SymCryptMlDsaVectorCreate( pbCurrent, cbRowVector, nRows );
362 pbCurrent += cbRowVector;
363
364 // Private components
365 pkMlDsakey->pvs1 = SymCryptMlDsaVectorCreate( pbCurrent, cbColVector, nCols );
366 pbCurrent += cbColVector;
367
368 pkMlDsakey->pvs2 = SymCryptMlDsaVectorCreate( pbCurrent, cbRowVector, nRows );
369 pbCurrent += cbRowVector;
370
371 pkMlDsakey->pvt0 = SymCryptMlDsaVectorCreate( pbCurrent, cbRowVector, nRows );
372 pbCurrent += cbRowVector;
373
374 SYMCRYPT_ASSERT( pbCurrent == pbKey + cbKey );
375
376 SYMCRYPT_SET_MAGIC( pkMlDsakey );
377
378 return pkMlDsakey;
379}
_Use_decl_annotations_ PSYMCRYPT_MLDSA_MATRIX SYMCRYPT_CALL SymCryptMlDsaMatrixCreate(PBYTE pbBuffer, UINT32 cbBuffer, UINT8 nRows, UINT8 nCols)
_Use_decl_annotations_ PSYMCRYPT_MLDSA_VECTOR SYMCRYPT_CALL SymCryptMlDsaVectorCreate(PBYTE pbBuffer, UINT32 cbBuffer, UINT8 nElems)
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_KEY(_nRows, _nCols)
Definition: sc_lib_mldsa.h:211
UINT32 cbMatrix
Definition: sc_lib_mlkem.h:67
PCBYTE pbKey
struct _SYMCRYPT_MLDSAKEY SYMCRYPT_MLDSAKEY
PCBYTE SIZE_T cbKey
#define SYMCRYPT_SET_MAGIC(p)
SYMCRYPT_MLDSAKEY * PSYMCRYPT_MLDSAKEY

Referenced by SymCryptMlDsakeyAllocate().

◆ SymCryptMlDsaMakeHint()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMakeHint ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PSYMCRYPT_MLDSA_VECTOR  pvWMinusCs2,
PSYMCRYPT_MLDSA_VECTOR  pvWMinusCs2PlusCt0,
PSYMCRYPT_MLDSA_VECTOR  pvDst,
UINT32 *  nBitsSet 
)

Definition at line 1100 of file mldsa_primitives.c.

1106{
1107 SYMCRYPT_ASSERT( pvWMinusCs2->nElems == pvWMinusCs2PlusCt0->nElems );
1108 SYMCRYPT_ASSERT( pvWMinusCs2->nElems == pvDst->nElems );
1109
1110 *nBitsSet = 0;
1111
1112 SymCryptMlDsaVectorHighBits( pParams, pvWMinusCs2, pvWMinusCs2 );
1113 SymCryptMlDsaVectorHighBits( pParams, pvWMinusCs2PlusCt0, pvWMinusCs2PlusCt0 );
1114
1115 for( UINT32 i = 0; i < pvDst->nElems; ++i )
1116 {
1120
1122 {
1123 peDst->coeffs[j] = 1 & ~SYMCRYPT_MASK32_EQ(peVec0->coeffs[j], peVec1->coeffs[j]);
1124 *nBitsSet += peDst->coeffs[j];
1125 }
1126 }
1127}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorHighBits(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)

Referenced by SymCryptMlDsaSignEx().

◆ SymCryptMlDsaMatrixCreate()

_Use_decl_annotations_ PSYMCRYPT_MLDSA_MATRIX SYMCRYPT_CALL SymCryptMlDsaMatrixCreate ( PBYTE  pbBuffer,
UINT32  cbBuffer,
UINT8  nRows,
UINT8  nCols 
)

Definition at line 771 of file mldsa_primitives.c.

776{
782
784 SYMCRYPT_ASSERT( pMatrix != NULL );
785
786 pMatrix->nRows = nRows;
787 pMatrix->nCols = nCols;
788 pMatrix->cbTotalSize = cbBuffer;
789
790 PBYTE pbCurrent = pbBuffer + sizeof(SYMCRYPT_MLDSA_MATRIX);
791 for(UINT32 i = 0; i < (UINT32) nRows * nCols; ++i)
792 {
795 }
796
797 return pMatrix;
798}
_Use_decl_annotations_ PSYMCRYPT_MLDSA_POLYELEMENT SYMCRYPT_CALL SymCryptMlDsaPolyElementCreate(PBYTE pbBuffer, SIZE_T cbBuffer)
#define SYMCRYPT_MLDSA_MATRIX_MAX_NCOLS
Definition: sc_lib_mldsa.h:71
SYMCRYPT_MLDSA_MATRIX
Definition: sc_lib_mldsa.h:92
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_MATRIX(_nRows, _nCols)
Definition: sc_lib_mldsa.h:210
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_POLYELEMENT
Definition: sc_lib_mldsa.h:208
* PSYMCRYPT_MLDSA_MATRIX
Definition: sc_lib_mldsa.h:92
#define SYMCRYPT_MLDSA_MATRIX_MAX_NROWS
Definition: sc_lib_mldsa.h:70

Referenced by SymCryptMlDsakeyInitialize().

◆ SymCryptMlDsaMatrixVectorMontMul()

Definition at line 803 of file mldsa_primitives.c.

808{
809 SYMCRYPT_ASSERT( pmSrc1->nCols == pvSrc2->nElems );
810 SYMCRYPT_ASSERT( pmSrc1->nRows == pvDst->nElems );
811
812 PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, peSrc2;
814
816
817 _Analysis_assume_( pmSrc1->nRows > 0 );
818 _Analysis_assume_( pmSrc1->nCols > 0 );
819
820 for( UINT32 i = 0; i < pmSrc1->nRows; ++i )
821 {
822 // peDst = pvDst[i]
824
825 for( UINT32 j = 0; j < pmSrc1->nCols; ++j )
826 {
827 peSrc1 = SYMCRYPT_INTERNAL_MLDSA_MATRIX_ELEMENT( i, j, pmSrc1 );
828 peSrc2 = SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT( j, pvSrc2 );
829
830 SymCryptMlDsaPolyElementMontMul( peSrc1, peSrc2, peTmp );
831 SymCryptMlDsaPolyElementAdd( peDst, peTmp, peDst );
832 }
833 }
834}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorSetZero(PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementAdd(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMontMul(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)
#define _Analysis_assume_
Definition: no_sal2.h:388

Referenced by SymCryptMlDsakeyComputeT(), SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaModAdd()

UINT32 SYMCRYPT_CALL SymCryptMlDsaModAdd ( UINT32  a,
UINT32  b 
)

Definition at line 444 of file mldsa_primitives.c.

445{
448
449 UINT32 res = a + b;
450 UINT32 subtractionMask = SYMCRYPT_MASK32_LT( SYMCRYPT_MLDSA_Q - 1, res );
451
452 // If res >= Q, subtract Q
453 res = res - (SYMCRYPT_MLDSA_Q & subtractionMask);
454
455 return res;
456}
GLuint res
Definition: glext.h:9613
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define b
Definition: ke_i.h:79

Referenced by SymCryptMlDsaPolyElementAdd(), SymCryptMlDsaPolyElementINTT(), and SymCryptMlDsaPolyElementNTT().

◆ SymCryptMlDsaModPlusMinus()

FORCEINLINE INT32 SYMCRYPT_CALL SymCryptMlDsaModPlusMinus ( UINT32  r,
UINT32  modulus 
)

Definition at line 1850 of file mldsa_primitives.c.

1851{
1853
1854 // In most cases this function is used with even moduli, e.g. with Power2Round.
1855 // However, it's okay if the modulus is odd. FIPS 204 specifies that the output is in the range
1856 // (-ceil(modulus/2), floor(modulus/2) ]
1857 // = ( -((modulus + 1) // 2), modulus // 2 ]
1858 // = [ -modulus // 2, modulus // 2 ]
1859 const INT32 halfModulus = modulus >> 1;
1860
1861 // Mask for conditional subtraction: 0 if r <= (modulus/2), 0xFFFFFFFF otherwise
1862 UINT32 subtractionMask = SYMCRYPT_MASK32_LT( halfModulus, r );
1863
1864 INT32 r0 = (INT32) r - (modulus & subtractionMask);
1865 SYMCRYPT_ASSERT( r0 > -halfModulus && r0 <= halfModulus);
1866
1867 return r0;
1868}

Referenced by SymCryptMlDsaPolyElementInfinityNorm(), and SymCryptMlDsaPower2Round().

◆ SymCryptMlDsaModSub()

UINT32 SYMCRYPT_CALL SymCryptMlDsaModSub ( UINT32  a,
UINT32  b 
)

Definition at line 460 of file mldsa_primitives.c.

461{
464
465 UINT32 additionMask = SYMCRYPT_MASK32_LT( a, b );
466
467 // If a < b, result is negative, so we add Q
468 return (INT32) a - (INT32) b + (SYMCRYPT_MLDSA_Q & additionMask);
469}

Referenced by SymCryptMlDsaPolyElementINTT(), SymCryptMlDsaPolyElementNTT(), and SymCryptMlDsaPolyElementSub().

◆ SymCryptMlDsaMontMul()

UINT32 SYMCRYPT_CALL SymCryptMlDsaMontMul ( UINT32  a,
UINT32  b 
)

Definition at line 434 of file mldsa_primitives.c.

435{
438
439 return SymCryptMlDsaMontReduce((UINT64) a * b);
440}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontReduce(UINT64 a)

Referenced by SymCryptMlDsaPolyElementINTT(), SymCryptMlDsaPolyElementMontMul(), SymCryptMlDsaPolyElementMulR(), SymCryptMlDsaPolyElementNTT(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaMontReduce()

UINT32 SYMCRYPT_CALL SymCryptMlDsaMontReduce ( UINT64  a)

Definition at line 418 of file mldsa_primitives.c.

419{
422
424 UINT32 additionMask = SYMCRYPT_MASK32_LT( res, 0 );
425
426 res = res + (SYMCRYPT_MLDSA_Q & additionMask);
428
429 return (UINT32) res;
430}
GLdouble GLdouble t
Definition: gl.h:2047
const GLfloat * m
Definition: glext.h:10848
#define SYMCRYPT_MLDSA_Q_INV
#define SYMCRYPT_MLDSA_R_LOG2
Definition: sc_lib_mldsa.h:18

Referenced by SymCryptMlDsaMontMul().

◆ SymCryptMlDsaPkDecode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkDecode ( PCBYTE  pbSrc,
SIZE_T  cbSrc,
UINT32  flags,
PSYMCRYPT_MLDSAKEY  pkMlDsakey 
)

Definition at line 1264 of file mldsa_primitives.c.

1269{
1271
1272 // Size of one encoded polynomial from t1: 256 coefficients * 10 bits per coefficient / 8 bits per byte
1273 const UINT32 cbEncodedPoly = SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS * 10 / 8;
1274
1275 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1276 PCBYTE pbCurr = pbSrc;
1278 PSYMCRYPT_SHAKE256_STATE pShakeState = NULL;
1279
1280 if( cbSrc != pkMlDsakey->pParams->cbEncodedPublicKey )
1281 {
1282 scError = SYMCRYPT_WRONG_KEY_SIZE;
1283 goto cleanup;
1284 }
1285
1286 // Allocate space for an encoded polynomial so we can copy the input, decode it, and append it
1287 // to our SHAKE state. We copy it to a local buffer so we don't violate the read-once rule when
1288 // appending to the SHAKE state.
1289 pTemps = SymCryptMlDsaTemporariesAllocateAndInitialize( pkMlDsakey->pParams, 0, 0, 0, cbEncodedPoly );
1290 if( pTemps == NULL )
1291 {
1292 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1293 goto cleanup;
1294 }
1295
1296 // Reset the private key state in case this key object is being reused
1297 if( pkMlDsakey->hasRootSeed )
1298 {
1300 pkMlDsakey->hasRootSeed = FALSE;
1301 }
1302
1303 if( pkMlDsakey->hasPrivateKey )
1304 {
1305 SymCryptWipeKnownSize( pkMlDsakey->privateSigningSeed, SYMCRYPT_MLDSA_PRIVATE_SIGNING_SEED_SIZE );
1306 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvs1 );
1307 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvs2 );
1308 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvt0 );
1309 pkMlDsakey->hasPrivateKey = FALSE;
1310 }
1311
1312 memcpy( pkMlDsakey->publicSeed, pbCurr, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE );
1314
1315 pShakeState = &(pTemps->shake256State);
1316
1317 SymCryptShake256Init( pShakeState );
1318 SymCryptShake256Append( pShakeState, pkMlDsakey->publicSeed, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE );
1319
1320 for( UINT32 i = 0; i < pkMlDsakey->pvt1->nElems; ++i )
1321 {
1322 memcpy( pTemps->pbScratch, pbCurr, cbEncodedPoly );
1323
1325
1327 pTemps->pbScratch,
1328 10,
1329 0,
1330 peElement );
1331 if( scError != SYMCRYPT_NO_ERROR )
1332 {
1333 goto cleanup;
1334 }
1335
1336 SymCryptShake256Append( pShakeState, pTemps->pbScratch, cbEncodedPoly );
1337
1338 pbCurr += cbEncodedPoly;
1339 }
1340
1341 SYMCRYPT_ASSERT( pbCurr == pbSrc + cbSrc );
1342
1343 SymCryptMlDsaVectorNTT( pkMlDsakey->pvt1 );
1344
1346 pkMlDsakey->publicSeed,
1348 pkMlDsakey->pmA );
1349
1350 SymCryptShake256Result( pShakeState, pkMlDsakey->publicKeyHash );
1351
1352cleanup:
1353 if( pTemps != NULL )
1354 {
1356 }
1357
1358 return scError;
1359}
GLbitfield flags
Definition: glext.h:7161
_Use_decl_annotations_ PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES SYMCRYPT_CALL SymCryptMlDsaTemporariesAllocateAndInitialize(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT32 nRowVectors, UINT32 nColVectors, UINT32 nPolyElements, UINT32 cbScratch)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaTemporariesFree(PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES pTemporaries)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandA(PCBYTE pbPublicSeed, SIZE_T cbPublicSeed, PSYMCRYPT_MLDSA_MATRIX pmA)
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define SYMCRYPT_MLDSA_ROOT_SEED_SIZE
Definition: sc_lib_mldsa.h:23
* PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES
Definition: sc_lib_mldsa.h:206
#define SYMCRYPT_MLDSA_PRIVATE_SIGNING_SEED_SIZE
Definition: sc_lib_mldsa.h:38
VOID SYMCRYPT_CALL SymCryptShake256Result(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _Out_writes_(SYMCRYPT_SHAKE256_RESULT_SIZE) PBYTE pbResult)
VOID SYMCRYPT_CALL SymCryptShake256Init(_Out_ PSYMCRYPT_SHAKE256_STATE pState)
const BYTE * PCBYTE
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_SHAKE256_STATE

Referenced by SymCryptMlDsakeySetValue().

◆ SymCryptMlDsaPkEncode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkEncode ( PCSYMCRYPT_MLDSAKEY  pkMlDsakey,
PBYTE  pbDst,
SIZE_T  cbDst 
)

Definition at line 1211 of file mldsa_primitives.c.

1215{
1216 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1217
1218 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
1219 UINT32 cbEncodedKey = pParams->cbEncodedPublicKey;
1221
1222 if( cbDst != cbEncodedKey )
1223 {
1224 scError = SYMCRYPT_INVALID_ARGUMENT;
1225 goto cleanup;
1226 }
1227
1228 pTemps = SymCryptMlDsaTemporariesAllocateAndInitialize( pParams, 1, 0, 0, 0 );
1229 if( pTemps == NULL )
1230 {
1231 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1232 goto cleanup;
1233 }
1234
1235 {
1236 PSYMCRYPT_MLDSA_VECTOR pvT1InvNTT = pTemps->pvRowVectors[0];
1237
1238 PBYTE pbCurr = pbDst;
1239 memcpy( pbCurr, pkMlDsakey->publicSeed, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE );
1240
1242
1243 SymCryptMlDsaVectorCopy( pkMlDsakey->pvt1, pvT1InvNTT );
1244 SymCryptMlDsaVectorINTT( pvT1InvNTT );
1245
1246 // Pack each coefficient of T1 into 10 bits. Coefficients are rounded by Power2Round so they're
1247 // guaranteed to be at most 10 bits long.
1249 SymCryptMlDsaVectorEncode( pvT1InvNTT, 10, 0, pbCurr );
1250 }
1251
1252cleanup:
1253 if( pTemps != NULL)
1254 {
1256 }
1257
1258 return scError;
1259}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorEncode(PCSYMCRYPT_MLDSA_VECTOR pvSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PBYTE pbDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorCopy(PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_ENCODED_VECTOR(_pVector, _nBitsPerCoeff)
Definition: sc_lib_mldsa.h:221
* PSYMCRYPT_MLDSA_VECTOR
Definition: sc_lib_mldsa.h:80

Referenced by SymCryptMlDsaKeyGenerateEx(), SymCryptMlDsakeyGetValue(), and SymCryptMlDsaSkDecode().

◆ SymCryptMlDsaPolyElementAdd()

Definition at line 600 of file mldsa_primitives.c.

604{
606 {
607 peDst->coeffs[i] = SymCryptMlDsaModAdd(peSrc1->coeffs[i], peSrc2->coeffs[i]);
608 }
609}
UINT32 SYMCRYPT_CALL SymCryptMlDsaModAdd(UINT32 a, UINT32 b)

Referenced by SymCryptMlDsaMatrixVectorMontMul(), and SymCryptMlDsaVectorAdd().

◆ SymCryptMlDsaPolyElementCreate()

_Use_decl_annotations_ PSYMCRYPT_MLDSA_POLYELEMENT SYMCRYPT_CALL SymCryptMlDsaPolyElementCreate ( PBYTE  pbBuffer,
SIZE_T  cbBuffer 
)

Definition at line 474 of file mldsa_primitives.c.

477{
480
482 SYMCRYPT_ASSERT( peElement != NULL );
483
484 return peElement;
485}
struct _SYMCRYPT_MLDSA_POLYELEMENT * PSYMCRYPT_MLDSA_POLYELEMENT

Referenced by SymCryptMlDsaMatrixCreate(), SymCryptMlDsaTemporariesAllocateAndInitialize(), and SymCryptMlDsaVectorCreate().

◆ SymCryptMlDsaPolyElementDecode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPolyElementDecode ( PCBYTE  pbSrc,
UINT32  nBitsPerCoefficient,
UINT32  signedCoefficientBound,
PSYMCRYPT_MLDSA_POLYELEMENT  peDst 
)

Definition at line 2166 of file mldsa_primitives.c.

2171{
2172 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
2173 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 20 ); // Maximum number of bits per coefficient across all encodings
2174
2176 UINT32 nBitsInCoefficient;
2177 UINT32 bitsToDecode;
2178 UINT32 nBitsToDecode;
2179 UINT32 cbSrcRead = 0;
2180 UINT32 accumulator = 0;
2181 UINT32 nBitsInAccumulator = 0;
2182
2184 {
2185 coefficient = 0;
2186 nBitsInCoefficient = 0;
2187
2188 // first gather and decode bits from pbSrc
2189 do
2190 {
2191 if(nBitsInAccumulator == 0)
2192 {
2193 accumulator = SYMCRYPT_LOAD_LSBFIRST32( pbSrc+cbSrcRead );
2194 cbSrcRead += 4;
2195 nBitsInAccumulator = 32;
2196 }
2197
2198 nBitsToDecode = SYMCRYPT_MIN(nBitsPerCoefficient-nBitsInCoefficient, nBitsInAccumulator);
2199 SYMCRYPT_ASSERT(nBitsToDecode <= nBitsInAccumulator);
2200
2201 bitsToDecode = accumulator & ((1UL<<nBitsToDecode)-1);
2202 accumulator >>= nBitsToDecode;
2203 nBitsInAccumulator -= nBitsToDecode;
2204
2205 coefficient |= (bitsToDecode << nBitsInCoefficient);
2206 nBitsInCoefficient += nBitsToDecode;
2207 } while( nBitsPerCoefficient > nBitsInCoefficient );
2208 SYMCRYPT_ASSERT( nBitsInCoefficient == nBitsPerCoefficient );
2209
2210 // Coefficient should always be positive at this point since it's encoded in <= 20 bits
2212
2213 if( ( signedCoefficientBound != 0 ) && ( (UINT32) coefficient > 2 * signedCoefficientBound ) )
2214 {
2215 // Most of the encoded components of ML-DSA keys and signatures cannot be outside the
2216 // valid range, because the number of bits in their encodings do not permit invalid
2217 // values. However, the private key components s1 and s2 have encodings that do allow
2218 // for invalid values (because their valid ranges are [-2, 2] or [-4, 4]). If any
2219 // coefficient is outside this range, the key is invalid and we return an error.
2220 // We do not need to do this check in constant time because we treat the validity of an
2221 // imported key as public information.
2222 return SYMCRYPT_INVALID_BLOB;
2223 }
2224
2225 // If this coefficient is intended to be signed, we need to decode it into its original
2226 // signed form and then map it modulo Q.
2227 // Side-channel safety: signedCoefficientBound just indicates which component we are
2228 // decoding, so it's public information
2229 if( signedCoefficientBound != 0 )
2230 {
2233 }
2234
2235 peDst->coeffs[i] = coefficient;
2236 }
2237
2238 SYMCRYPT_ASSERT(nBitsInAccumulator == 0);
2239 SYMCRYPT_ASSERT(cbSrcRead == (nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8)));
2240
2241 return SYMCRYPT_NO_ERROR;
2242}
BYTE coefficient[512/16]
Definition: bcrypt.c:2463
#define SYMCRYPT_INTERNAL_MLDSA_SHORT_COEFFICIENT_ENCODE_DECODE(_val, _bound)
Definition: sc_lib_mldsa.h:228
#define SYMCRYPT_LOAD_LSBFIRST32(p)
Definition: symcrypt.h:299
#define SYMCRYPT_MIN(_a, _b)

Referenced by SymCryptMlDsaExpandMask(), SymCryptMlDsaPkDecode(), and SymCryptMlDsaVectorDecode().

◆ SymCryptMlDsaPolyElementEncode()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementEncode ( PCSYMCRYPT_MLDSA_POLYELEMENT  peSrc,
UINT32  nBitsPerCoefficient,
UINT32  signedCoefficientBound,
PBYTE  pbDst 
)

Definition at line 2096 of file mldsa_primitives.c.

2101{
2102 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
2103 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 20 ); // Maximum number of bits per coefficient across all encodings
2104
2106 UINT32 nBitsInCoefficient;
2107 UINT32 bitsToEncode;
2108 UINT32 nBitsToEncode;
2109 UINT32 cbDstWritten = 0;
2110 UINT32 accumulator = 0;
2111 UINT32 nBitsInAccumulator = 0;
2112
2114 {
2115 nBitsInCoefficient = nBitsPerCoefficient;
2116 coefficient = peSrc->coeffs[i];
2117
2119
2120 // If the coefficient is greater than the signedCoefficientBound, that means it is
2121 // a negative value modulo Q, so we need to subtract Q to get the original value.
2122 coefficient -= ( SYMCRYPT_MLDSA_Q & SYMCRYPT_MASK32_LT( signedCoefficientBound, coefficient ) );
2123
2124 // The coefficient is now in the range [-signedCoefficientBound, signedCoefficientBound],
2125 // we need to map it to the range [0, 2*signedCoefficientBound] for encoding.
2127
2128 // Some coefficients are always positive and so do not need any special encoding. In this
2129 // case, we revert to the original value from the source polynomial.
2130 coefficient = ( peSrc->coeffs[i] & SYMCRYPT_MASK32_ZERO( signedCoefficientBound ) ) |
2131 ( coefficient & SYMCRYPT_MASK32_NONZERO( signedCoefficientBound ) );
2132
2134 SYMCRYPT_ASSERT( signedCoefficientBound == 0 || (UINT32) coefficient <= signedCoefficientBound * 2 );
2135 SYMCRYPT_ASSERT( (UINT32) coefficient < (1ul << nBitsPerCoefficient) );
2136
2137 // encode the coefficient
2138 // simple loop to add bits to accumulator and write accumulator to output
2139 do
2140 {
2141 nBitsToEncode = SYMCRYPT_MIN( nBitsInCoefficient, 32 - nBitsInAccumulator );
2142
2143 bitsToEncode = coefficient & ( ( 1UL << nBitsToEncode ) - 1 );
2144 coefficient >>= nBitsToEncode;
2145 nBitsInCoefficient -= nBitsToEncode;
2146
2147 accumulator |= ( bitsToEncode << nBitsInAccumulator );
2148 nBitsInAccumulator += nBitsToEncode;
2149 if(nBitsInAccumulator == 32)
2150 {
2151 SYMCRYPT_STORE_LSBFIRST32( pbDst + cbDstWritten, accumulator );
2152 cbDstWritten += 4;
2153 accumulator = 0;
2154 nBitsInAccumulator = 0;
2155 }
2156 } while( nBitsInCoefficient > 0 );
2157 }
2158
2159 SYMCRYPT_ASSERT(nBitsInAccumulator == 0);
2160 SYMCRYPT_ASSERT(cbDstWritten == (nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8)));
2161}
#define SYMCRYPT_STORE_LSBFIRST32(p, v)
Definition: symcrypt.h:307
#define SYMCRYPT_MASK32_NONZERO(_v)
#define SYMCRYPT_MASK32_ZERO(_v)

Referenced by SymCryptMlDsaVectorEncode().

◆ SymCryptMlDsaPolyElementInfinityNorm()

_Use_decl_annotations_ FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaPolyElementInfinityNorm ( PCSYMCRYPT_MLDSA_POLYELEMENT  peSrc)

Definition at line 1874 of file mldsa_primitives.c.

1875{
1876 UINT32 norm = 0;
1877 UINT32 mask;
1878 INT32 curr;
1880 {
1881 // Convert the coefficient to signed form
1883
1884 // If the coefficient is less than 0, negate it
1885 mask = SYMCRYPT_MASK32_LT( curr, 0 );
1886 curr = (curr & ~mask) | ((curr * -1) & mask);
1887
1888 // If the coefficient is greater than the current norm, update the norm
1889 mask = SYMCRYPT_MASK32_LT( norm, curr );
1890 norm = (norm & ~mask) | (curr & mask);
1891 }
1892
1893 return norm;
1894}
_Tp _STLP_CALL norm(const complex< _Tp > &__z)
Definition: _complex.h:741
FORCEINLINE INT32 SYMCRYPT_CALL SymCryptMlDsaModPlusMinus(UINT32 r, UINT32 modulus)

Referenced by SymCryptMlDsaVectorInfinityNorm().

◆ SymCryptMlDsaPolyElementINTT()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementINTT ( PSYMCRYPT_MLDSA_POLYELEMENT  peSrc)

Definition at line 537 of file mldsa_primitives.c.

539{
541
543
545 {
547 {
548 k--;
550
551 for(UINT32 j = start; j < start + len; j++)
552 {
553 //
554 // As above, our twiddleFactor is pre-multiplied by R, but the coefficients are not,
555 // so after the reduction, the result does not have a factor of R.
556 //
557 UINT32 t = peSrc->coeffs[j];
558 peSrc->coeffs[j] = SymCryptMlDsaModAdd(t, peSrc->coeffs[j + len]);
559 peSrc->coeffs[j + len] = SymCryptMlDsaModSub(t, peSrc->coeffs[j + len]);
560 peSrc->coeffs[j + len] = SymCryptMlDsaMontMul(twiddleFactor, peSrc->coeffs[j + len]);
561 }
562 }
563 }
564
566 {
568 }
569}
static const uint32_t k[]
Definition: sha256.c:24
GLuint start
Definition: gl.h:1545
GLenum GLsizei len
Definition: glext.h:6722
UINT32 SYMCRYPT_CALL SymCryptMlDsaModSub(UINT32 a, UINT32 b)
const UINT32 MLDSA_NEGATIVE_ZETA_BITREV_TIMES_R[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontMul(UINT32 a, UINT32 b)
#define SYMCRYPT_MLDSA_INTT_FIXUP_TIMES_R

Referenced by SymCryptMlDsaVectorINTT().

◆ SymCryptMlDsaPolyElementMontMul()

Definition at line 586 of file mldsa_primitives.c.

590{
592 {
593 peDst->coeffs[i] = SymCryptMlDsaMontMul(peSrc1->coeffs[i], peSrc2->coeffs[i]);
594 }
595}

Referenced by SymCryptMlDsaMatrixVectorMontMul(), and SymCryptMlDsaVectorPolyElementMontMul().

◆ SymCryptMlDsaPolyElementMulR()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMulR ( PSYMCRYPT_MLDSA_POLYELEMENT  peSrc)

Definition at line 574 of file mldsa_primitives.c.

576{
578 {
580 }
581}
#define SYMCRYPT_MLDSA_RSQR

Referenced by SymCryptMlDsakeyComputeT(), SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaPolyElementNTT()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementNTT ( PSYMCRYPT_MLDSA_POLYELEMENT  peSrc)

Definition at line 502 of file mldsa_primitives.c.

504{
506
507 UINT32 k = 0;
508
510 {
512 {
513 k++;
514 UINT32 twiddleFactor = MLDSA_ZETA_BITREV_TIMES_R[k];
515
516 for(UINT32 j = start; j < start + len; j++)
517 {
518 //
519 // Typically for Montgomery multiplication, both operands have a factor of R.
520 // After multiplying, the product has a factor for R^2, and a reduction is then
521 // performed which divides out a factor of R, resulting in the product again having
522 // a factor of R^1, mod Q. In this case, the twiddleFactor is pre-multiplied by R,
523 // but the coefficients are not expected to have a factor of R; thus, after
524 // reduction, the result does not have a factor of R either.
525 //
526 UINT32 t = SymCryptMlDsaMontMul(twiddleFactor, peSrc->coeffs[j + len]);
527 peSrc->coeffs[j + len] = SymCryptMlDsaModSub(peSrc->coeffs[j], t);
528 peSrc->coeffs[j] = SymCryptMlDsaModAdd(peSrc->coeffs[j], t);
529 }
530 }
531 }
532}
const UINT32 MLDSA_ZETA_BITREV_TIMES_R[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]

Referenced by SymCryptMlDsaSignEx(), SymCryptMlDsaVectorNTT(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaPolyElementPower2Round()

Definition at line 2042 of file mldsa_primitives.c.

2046{
2047 UINT32 r1, r0;
2048
2050 {
2051 SymCryptMlDsaPower2Round( peSrc->coeffs[i], &r1, &r0 );
2052 peDst1->coeffs[i] = r1;
2053 peDst0->coeffs[i] = r0;
2054 }
2055}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPower2Round(UINT32 r, UINT32 *puR1, UINT32 *puR0)

Referenced by SymCryptMlDsaVectorPower2Round().

◆ SymCryptMlDsaPolyElementSetZero()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementSetZero ( PSYMCRYPT_MLDSA_POLYELEMENT  peDst)

Definition at line 490 of file mldsa_primitives.c.

492{
494 {
495 peDst->coeffs[i] = 0;
496 }
497}

Referenced by SymCryptMlDsaHintBitUnpack(), SymCryptMlDsaSampleInBall(), and SymCryptMlDsaVectorSetZero().

◆ SymCryptMlDsaPolyElementSub()

Definition at line 614 of file mldsa_primitives.c.

618{
620 {
621 peDst->coeffs[i] = SymCryptMlDsaModSub(peSrc1->coeffs[i], peSrc2->coeffs[i]);
622 }
623}

Referenced by SymCryptMlDsaVectorSub().

◆ SymCryptMlDsaPower2Round()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPower2Round ( UINT32  r,
UINT32 *  puR1,
UINT32 *  puR0 
)

Definition at line 2023 of file mldsa_primitives.c.

2027{
2029
2030 UINT32 rPrime = r & ( (1 << SYMCRYPT_POWER2ROUND_LOW_ORDER_BITS) - 1 ); // r mod 2^d
2032
2034
2035 *puR1 = r1;
2036 *puR0 = SymCryptMlDsaSignedCoefficientModQ( r0 ); //, 4096 );
2037}
#define SYMCRYPT_POWER2ROUND_LOW_ORDER_BITS

Referenced by SymCryptMlDsaPolyElementPower2Round().

◆ SymCryptMlDsaRejBoundedPoly()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejBoundedPoly ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PCBYTE  pbRejBoundedPolySeed,
SIZE_T  cbRejBoundedPolySeed,
PSYMCRYPT_MLDSA_POLYELEMENT  peDst 
)

Definition at line 927 of file mldsa_primitives.c.

932{
934
935 SYMCRYPT_SHAKE256_STATE shakeState;
936 SymCryptShake256Init( &shakeState );
937 SymCryptShake256Append( &shakeState, pbRejBoundedPolySeed, cbRejBoundedPolySeed );
938
939 BYTE shakeByte;
940 UINT32 i = 0;
941 INT8 z0, z1;
942
943 do
944 {
945 // Note on sidechannel safety: the rejection sampling here can leak which bytes of the SHAKE
946 // output are used and which are rejected. However, bytes themselves are not leaked. This
947 // may allow the attacker to more quickly eliminate incorrect seed values when doing an
948 // exhaustive search, but given the size of the seed this should still not make the
949 // exhaustive search computationally feasible.
950 SymCryptShake256Extract( &shakeState, &shakeByte, sizeof(shakeByte), FALSE );
951 z0 = SymCryptMlDsaCoeffFromHalfByte( pParams, shakeByte & 0x0F );
952 z1 = SymCryptMlDsaCoeffFromHalfByte( pParams, shakeByte >> 4 );
953
954 SYMCRYPT_ASSERT( z0 == INT8_MIN || (( z0 + pParams->privateKeyRange >= 0 ) && ( z0 + pParams->privateKeyRange <= 2 * pParams->privateKeyRange )) );
955 SYMCRYPT_ASSERT( z1 == INT8_MIN || (( z1 + pParams->privateKeyRange >= 0 ) && ( z1 + pParams->privateKeyRange <= 2 * pParams->privateKeyRange )) );
956
957 if(z0 != INT8_MIN)
958 {
960 i++;
961 }
962
964 {
966 i++;
967 }
968
970
971 SymCryptWipeKnownSize( &shakeState, sizeof(shakeState) );
972}
signed char INT8
Definition: basetsd.h:183
_Use_decl_annotations_ FORCEINLINE INT8 SYMCRYPT_CALL SymCryptMlDsaCoeffFromHalfByte(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT8 halfByte)
static double float double int float z1
Definition: server.c:81
static double float z0
Definition: server.c:81
SYMCRYPT_MAGIC_FIELD SYMCRYPT_SHAKE256_STATE

Referenced by SymCryptMlDsaExpandS().

◆ SymCryptMlDsaRejNttPoly()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaRejNttPoly ( PCBYTE  pbRejNttPolySeed,
SIZE_T  cbRejNttPolySeed,
PSYMCRYPT_MLDSA_POLYELEMENT  peDst 
)

Definition at line 839 of file mldsa_primitives.c.

843{
845
846 SYMCRYPT_SHAKE128_STATE shakeState;
847 SymCryptShake128Init( &shakeState );
848 SymCryptShake128Append( &shakeState, pbRejNttPolySeed, cbRejNttPolySeed );
849
850 UINT32 coeff = 0;
851 BYTE shakeBytes[4]; // We only use 3 bytes, but using 4 allows converting to UINT32 more easily
852
853 SymCryptWipeKnownSize( shakeBytes, sizeof(shakeBytes) );
854
856 {
857 // CoeffFromThreeBytes from FIPS 204
858 do
859 {
860 SymCryptShake128Extract( &shakeState, shakeBytes, 3, FALSE );
861 shakeBytes[2] &= 0x7F; // if b2 > 127, b2 -= 128
862 coeff = SYMCRYPT_LOAD_LSBFIRST32( shakeBytes );
863 } while (coeff >= SYMCRYPT_MLDSA_Q);
864
865 peDst->coeffs[i] = coeff;
866 }
867}
VOID SYMCRYPT_CALL SymCryptShake128Append(_Inout_ PSYMCRYPT_SHAKE128_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptShake128Init(_Out_ PSYMCRYPT_SHAKE128_STATE pState)
VOID SYMCRYPT_CALL SymCryptShake128Extract(_Inout_ PSYMCRYPT_SHAKE128_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
SYMCRYPT_MAGIC_FIELD SYMCRYPT_SHAKE128_STATE

Referenced by SymCryptMlDsaExpandA().

◆ SymCryptMlDsaSampleInBall()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSampleInBall ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PCBYTE  pbCommitmentHash,
SIZE_T  cbCommitmentHash,
PSYMCRYPT_MLDSA_POLYELEMENT  peChallenge 
)

Definition at line 1016 of file mldsa_primitives.c.

1021{
1022 SymCryptMlDsaPolyElementSetZero( peChallenge );
1023
1024 SYMCRYPT_SHAKE256_STATE shakeState;
1025 SymCryptShake256Init( &shakeState );
1026 SymCryptShake256Append( &shakeState, pbCommitmentHash, cbCommitmentHash );
1027
1028 // The first 8 bytes are used as as powers of negative one when sampling the challenge
1029 // polynomial: c[j] = -1^(H(rho)[i + tau - 256])
1030 BYTE temp[8];
1031 SYMCRYPT_ASSERT( pParams->nChallengeNonZeroCoeffs <= 8 * sizeof(temp) );
1032 SymCryptShake256Extract( &shakeState, temp, sizeof(temp), FALSE );
1033
1034 UINT64 powersOfNegativeOne = SYMCRYPT_LOAD_LSBFIRST64( temp );
1035
1038 ++i)
1039 {
1040 BYTE j = 0;
1041 do
1042 {
1043 SymCryptShake256Extract( &shakeState, &j, sizeof(j), FALSE );
1044 } while( j > i );
1045
1046 peChallenge->coeffs[i] = peChallenge->coeffs[j];
1047
1048 UINT32 negativeMask = SYMCRYPT_MASK32_NONZERO( powersOfNegativeOne & 1 );
1049 powersOfNegativeOne >>= 1;
1050
1051 // Set the coefficient modulo Q
1052 peChallenge->coeffs[j] = ((SYMCRYPT_MLDSA_Q - 1) & negativeMask) | (1 & ~negativeMask);
1053 }
1054
1055 SymCryptWipeKnownSize( &shakeState, sizeof(shakeState) );
1056}
static calc_node_t temp
Definition: rpn_ieee.c:38
#define SYMCRYPT_LOAD_LSBFIRST64(p)
Definition: symcrypt.h:300

Referenced by SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaSigDecode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSigDecode ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PCBYTE  pbSig,
SIZE_T  cbSig,
PBYTE  pbCommitmentHash,
SIZE_T  cbCommitmentHash,
PSYMCRYPT_MLDSA_VECTOR  pvResponse,
PSYMCRYPT_MLDSA_VECTOR  pvHint 
)

Definition at line 1661 of file mldsa_primitives.c.

1669{
1670 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1671
1672 if( cbSig != pParams->cbEncodedSignature )
1673 {
1674 scError = SYMCRYPT_WRONG_DATA_SIZE;
1675 goto cleanup;
1676 }
1677
1678 SYMCRYPT_ASSERT( cbCommitmentHash == pParams->cbCommitmentHash );
1679
1680 PCBYTE pbCurr = pbSig;
1681
1682 memcpy( pbCommitmentHash, pbSig, cbCommitmentHash );
1683 pbCurr += cbCommitmentHash;
1684
1686 pbCurr,
1687 pParams->maskCoefficientRangeLog2 + 1,
1688 1 << pParams->maskCoefficientRangeLog2,
1689 pvResponse );
1690 pbCurr += SYMCRYPT_INTERNAL_MLDSA_SIZEOF_ENCODED_VECTOR( pvResponse, pParams->maskCoefficientRangeLog2 + 1 );
1691
1692 SYMCRYPT_ASSERT( cbSig - (pbCurr - pbSig) == (SIZE_T) pParams->nHintNonZeroCoeffs + pvHint->nElems );
1693
1694 scError = SymCryptMlDsaHintBitUnpack( pParams, pbCurr, pvHint );
1695 if( scError != SYMCRYPT_NO_ERROR )
1696 {
1697 goto cleanup;
1698 }
1699
1700cleanup:
1701 return scError;
1702}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaVectorDecode(_In_reads_bytes_(pvDst->nElems *nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE pbSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, _Inout_ PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaHintBitUnpack(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)

Referenced by SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaSigEncode()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSigEncode ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
PBYTE  pbCommitmentHash,
SIZE_T  cbCommitmentHash,
PCSYMCRYPT_MLDSA_VECTOR  pvResponse,
PCSYMCRYPT_MLDSA_VECTOR  pvHint,
PBYTE  pbDst,
SIZE_T  cbDst 
)

Definition at line 1625 of file mldsa_primitives.c.

1633{
1634 SYMCRYPT_ASSERT( cbDst == pParams->cbEncodedSignature );
1635 UNREFERENCED_PARAMETER( cbDst );
1636
1637 const SIZE_T cbEncodedHint = pParams->nHintNonZeroCoeffs + pvHint->nElems;
1638
1639 PBYTE pbCurr = pbDst;
1640
1641 memcpy( pbCurr, pbCommitmentHash, cbCommitmentHash );
1642 pbCurr += cbCommitmentHash;
1643
1645 pvResponse,
1646 pParams->maskCoefficientRangeLog2 + 1,
1647 1 << pParams->maskCoefficientRangeLog2,
1648 pbCurr );
1649
1650 pbCurr += SYMCRYPT_INTERNAL_MLDSA_SIZEOF_ENCODED_VECTOR( pvResponse, pParams->maskCoefficientRangeLog2 + 1 );
1651
1652 SymCryptMlDsaHintBitPack( pParams, pvHint, pbCurr );
1653 pbCurr += cbEncodedHint;
1654
1655 SYMCRYPT_ASSERT( pbCurr == pbDst + cbDst );
1656}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaHintBitPack(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PBYTE pbDst)

Referenced by SymCryptMlDsaSignEx().

◆ SymCryptMlDsaSignedCoefficientModQ()

FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaSignedCoefficientModQ ( INT32  coefficient)

Definition at line 2080 of file mldsa_primitives.c.

2081{
2083
2084 UINT32 result;
2085 UINT32 negativeMask = SYMCRYPT_MASK32_LT( coefficient, 0 );
2086
2087 result = coefficient + (SYMCRYPT_MLDSA_Q & negativeMask);
2089
2090 return result;
2091}
GLuint64EXT * result
Definition: glext.h:11304

Referenced by SymCryptMlDsaDecompose(), SymCryptMlDsaPolyElementDecode(), SymCryptMlDsaPower2Round(), and SymCryptMlDsaRejBoundedPoly().

◆ SymCryptMlDsaSizeofKeyFormatFromParams()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSizeofKeyFormatFromParams ( SYMCRYPT_MLDSA_PARAMS  params,
SYMCRYPT_MLDSAKEY_FORMAT  mlDsakeyFormat,
SIZE_T *  pcbKeyFormat 
)

Definition at line 274 of file mldsa_primitives.c.

278{
279 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
280 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams = NULL;
281
282 scError = SymCryptMlDsaGetInternalParamsFromParams( params, &pInternalParams );
283 if( scError != SYMCRYPT_NO_ERROR )
284 {
285 goto cleanup;
286 }
287
288 switch( mlDsakeyFormat )
289 {
291 *pcbKeyFormat = SYMCRYPT_MLDSA_ROOT_SEED_SIZE;
292 break;
294 *pcbKeyFormat = pInternalParams->cbEncodedPrivateKey;
295 break;
297 *pcbKeyFormat = pInternalParams->cbEncodedPublicKey;
298 break;
299 default:
300 scError = SYMCRYPT_INVALID_ARGUMENT;
301 break;
302 }
303
304cleanup:
305 return scError;
306}
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaGetInternalParamsFromParams(SYMCRYPT_MLDSA_PARAMS params, PCSYMCRYPT_MLDSA_INTERNAL_PARAMS *pInternalParams)
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_KEY
Definition: symcrypt.h:10407
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_SEED
Definition: symcrypt.h:10403
@ SYMCRYPT_MLDSAKEY_FORMAT_PUBLIC_KEY
Definition: symcrypt.h:10410

◆ SymCryptMlDsaSizeofSignatureFromParams()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSizeofSignatureFromParams ( SYMCRYPT_MLDSA_PARAMS  params,
SIZE_T *  pcbSignature 
)

Definition at line 311 of file mldsa_primitives.c.

314{
315 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
316 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams = NULL;
317
318 scError = SymCryptMlDsaGetInternalParamsFromParams( params, &pInternalParams );
319 if( scError != SYMCRYPT_NO_ERROR )
320 {
321 goto cleanup;
322 }
323
324 *pcbSignature = pInternalParams->cbEncodedSignature;
325
326cleanup:
327 return scError;
328}

◆ SymCryptMlDsaSkDecode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkDecode ( PCBYTE  pbSrc,
SIZE_T  cbSrc,
UINT32  flags,
PSYMCRYPT_MLDSAKEY  pkMlDsakey 
)

Definition at line 1460 of file mldsa_primitives.c.

1465{
1467
1468 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1469 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
1471 PCBYTE pbCurr = pbSrc;
1473
1474 if( cbSrc != pkMlDsakey->pParams->cbEncodedPrivateKey )
1475 {
1476 scError = SYMCRYPT_WRONG_KEY_SIZE;
1477 goto cleanup;
1478 }
1479
1481 pParams,
1482 2, // row vectors - t, t0
1483 0, // column vectors
1484 1, // poly elements - temporary space
1485 pkMlDsakey->pParams->cbEncodedPublicKey ); // scratch space
1486 if( pTemps == NULL )
1487 {
1488 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1489 goto cleanup;
1490 }
1491
1492 // We use temporaries to recalculate t, t0, t1 and the public key hash from the import values
1493 // for A (derived from the public seed), s1 and s2. This is not strictly necessary for callers
1494 // who just want to import a private key and use it for signing, but it allows the private
1495 // key to also be used for verification, and more importantly, provides extra robustness by
1496 // ensuring that the derived values are consistent with the encoded values. If the perf of
1497 // importing a key becomes a concern, we can move this recalculation to the first time the key
1498 // is used for verification.
1499 PSYMCRYPT_MLDSA_VECTOR pvtTmp = pTemps->pvRowVectors[0];
1500 PSYMCRYPT_MLDSA_VECTOR pvt0Tmp = pTemps->pvRowVectors[1];
1501 PSYMCRYPT_MLDSA_POLYELEMENT peTmp = pTemps->pePolyElements[0];
1502 PBYTE pbEncodedPubKeyTmp = pTemps->pbScratch;
1503
1504 // Reset the key state in case this key is being reused
1505 pkMlDsakey->hasRootSeed = FALSE;
1506 pkMlDsakey->hasPrivateKey = FALSE;
1508
1509 memcpy( pkMlDsakey->publicSeed, pbCurr, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE );
1511
1512 memcpy( pkMlDsakey->privateSigningSeed, pbCurr, SYMCRYPT_MLDSA_PRIVATE_SIGNING_SEED_SIZE );
1514
1515 memcpy( pubKeyHashTmp, pbCurr, SYMCRYPT_MLDSA_PUBLIC_KEY_HASH_SIZE );
1517
1518 // Expand A matrix
1519 SymCryptMlDsaExpandA( pkMlDsakey->publicSeed, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE, pkMlDsakey->pmA );
1520
1521 scError = SymCryptMlDsaVectorDecode(
1522 pbCurr,
1524 pParams->privateKeyRange,
1525 pkMlDsakey->pvs1 );
1526 if( scError != SYMCRYPT_NO_ERROR )
1527 {
1528 goto cleanup;
1529 }
1530 pbCurr += SYMCRYPT_INTERNAL_MLDSA_SIZEOF_ENCODED_VECTOR( pkMlDsakey->pvs1, pParams->encodedCoefficientBitLength );
1531
1532
1533 scError = SymCryptMlDsaVectorDecode(
1534 pbCurr,
1536 pParams->privateKeyRange,
1537 pkMlDsakey->pvs2 );
1538 if( scError != SYMCRYPT_NO_ERROR )
1539 {
1540 goto cleanup;
1541 }
1542 pbCurr += SYMCRYPT_INTERNAL_MLDSA_SIZEOF_ENCODED_VECTOR( pkMlDsakey->pvs2, pParams->encodedCoefficientBitLength );
1543
1544 scError = SymCryptMlDsaVectorDecode(
1545 pbCurr,
1548 pvt0Tmp );
1549 if( scError != SYMCRYPT_NO_ERROR )
1550 {
1551 goto cleanup;
1552 }
1554
1555 SYMCRYPT_ASSERT( pbCurr == pbSrc + cbSrc );
1556
1557 // Convert s1 and s2 to NTT form
1558 SymCryptMlDsaVectorNTT( pkMlDsakey->pvs1 );
1559 SymCryptMlDsaVectorNTT( pkMlDsakey->pvs2 );
1560
1562 pkMlDsakey->pmA,
1563 pkMlDsakey->pvs1,
1564 pkMlDsakey->pvs2,
1565 pkMlDsakey->pvt0,
1566 pkMlDsakey->pvt1,
1567 pvtTmp,
1568 peTmp );
1569
1570 // If the recalculated t0 doesn't match, the imported key is invalid.
1571 // Note: SymCryptMlDsakeyComputeT sets t0 and t1 in NTT form.
1572 if( memcmp( pkMlDsakey->pvt0, pvt0Tmp, pvt0Tmp->cbTotalSize ) != 0 )
1573 {
1574 scError = SYMCRYPT_INVALID_BLOB;
1575 goto cleanup;
1576 }
1577
1578 // Convert t0 and t1 to NTT form
1579 SymCryptMlDsaVectorNTT( pkMlDsakey->pvt0 );
1580 SymCryptMlDsaVectorNTT( pkMlDsakey->pvt1 );
1581
1582 scError = SymCryptMlDsaPkEncode( pkMlDsakey, pbEncodedPubKeyTmp, pParams->cbEncodedPublicKey );
1583 if( scError != SYMCRYPT_NO_ERROR )
1584 {
1585 goto cleanup;
1586 }
1587
1588 // Recalculate the public key hash and compare it to the imported value. If they don't match,
1589 // the imported key is invalid.
1591 pbEncodedPubKeyTmp,
1592 pParams->cbEncodedPublicKey,
1593 pkMlDsakey->publicKeyHash,
1595
1596 if( memcmp( pkMlDsakey->publicKeyHash, pubKeyHashTmp, SYMCRYPT_MLDSA_PUBLIC_KEY_HASH_SIZE ) != 0 )
1597 {
1598 scError = SYMCRYPT_INVALID_BLOB;
1599 goto cleanup;
1600 }
1601
1602 pkMlDsakey->hasPrivateKey = TRUE;
1603
1604cleanup:
1605 if( pTemps != NULL )
1606 {
1608 }
1609
1610 // Wipe private state on error as defense-in-depth
1611 if( scError != SYMCRYPT_NO_ERROR )
1612 {
1613 SymCryptWipeKnownSize( pkMlDsakey->privateSigningSeed, SYMCRYPT_MLDSA_PRIVATE_SIGNING_SEED_SIZE );
1614 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvs1 );
1615 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvs2 );
1616 SymCryptMlDsaVectorSetZero( pkMlDsakey->pvt0 );
1617 }
1618
1619 return scError;
1620}
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyComputeT(PCSYMCRYPT_MLDSA_MATRIX pmA, PCSYMCRYPT_MLDSA_VECTOR pvs1, PCSYMCRYPT_MLDSA_VECTOR pvs2, PSYMCRYPT_MLDSA_VECTOR pvt0, PSYMCRYPT_MLDSA_VECTOR pvt1, PSYMCRYPT_MLDSA_VECTOR pvTmp, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkEncode(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
#define SYMCRYPT_MLDSA_PUBLIC_KEY_HASH_SIZE
Definition: sc_lib_mldsa.h:33
VOID SYMCRYPT_CALL SymCryptShake256(_In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult)

Referenced by SymCryptMlDsakeySetValue().

◆ SymCryptMlDsaSkEncode()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkEncode ( PCSYMCRYPT_MLDSAKEY  pkMlDsakey,
PBYTE  pbDst,
SIZE_T  cbDst 
)

Definition at line 1364 of file mldsa_primitives.c.

1368{
1369 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1370 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
1371 UINT32 cbEncodedKey = pParams->cbEncodedPrivateKey;
1373 PBYTE pbCurr = pbDst;
1374
1375 if( !pkMlDsakey->hasPrivateKey )
1376 {
1377 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
1378 goto cleanup;
1379 }
1380
1381 if( cbDst != cbEncodedKey )
1382 {
1383 scError = SYMCRYPT_INVALID_ARGUMENT;
1384 goto cleanup;
1385 }
1386
1387 pTemps = SymCryptMlDsaTemporariesAllocateAndInitialize( pParams, 1, 1, 0, 0 );
1388 if( pTemps == NULL )
1389 {
1390 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1391 goto cleanup;
1392 }
1393
1394 memcpy( pbCurr, pkMlDsakey->publicSeed, SYMCRYPT_MLDSA_PUBLIC_SEED_SIZE );
1396
1397 memcpy( pbCurr, pkMlDsakey->privateSigningSeed, SYMCRYPT_MLDSA_PRIVATE_SIGNING_SEED_SIZE );
1399
1400 memcpy( pbCurr, pkMlDsakey->publicKeyHash, SYMCRYPT_MLDSA_PUBLIC_KEY_HASH_SIZE );
1402
1403 {
1404 // Inverse NTT and encode s1
1405 PSYMCRYPT_MLDSA_VECTOR pvs1InvNTT = pTemps->pvColVectors[0];
1406 SymCryptMlDsaVectorCopy( pkMlDsakey->pvs1, pvs1InvNTT );
1407 SymCryptMlDsaVectorINTT( pvs1InvNTT );
1408
1410 pvs1InvNTT,
1412 pParams->privateKeyRange,
1413 pbCurr );
1415 }
1416
1417 {
1418 // Inverse NTT and encode s2
1419 PSYMCRYPT_MLDSA_VECTOR pvs2InvNTT = pTemps->pvRowVectors[0];
1420 SymCryptMlDsaVectorCopy( pkMlDsakey->pvs2, pvs2InvNTT );
1421 SymCryptMlDsaVectorINTT( pvs2InvNTT );
1422
1424 pvs2InvNTT,
1426 pParams->privateKeyRange,
1427 pbCurr );
1429 }
1430
1431 {
1432 // Inverse NTT and encode t0
1433 // Can re-use the previous temporary row vector as it's no longer needed
1434 PSYMCRYPT_MLDSA_VECTOR pvt0InvNTT = pTemps->pvRowVectors[0];
1435 SymCryptMlDsaVectorCopy( pkMlDsakey->pvt0, pvt0InvNTT );
1436 SymCryptMlDsaVectorINTT( pvt0InvNTT );
1437
1439 pvt0InvNTT,
1442 pbCurr );
1444 }
1445
1446 SYMCRYPT_ASSERT( pbCurr == pbDst + cbDst );
1447
1448cleanup:
1449 if( pTemps != NULL)
1450 {
1452 }
1453
1454 return scError;
1455}

Referenced by SymCryptMlDsakeyGetValue().

◆ SymCryptMlDsaTemporariesAllocateAndInitialize()

_Use_decl_annotations_ PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES SYMCRYPT_CALL SymCryptMlDsaTemporariesAllocateAndInitialize ( PCSYMCRYPT_MLDSA_INTERNAL_PARAMS  pParams,
UINT32  nRowVectors,
UINT32  nColVectors,
UINT32  nPolyElements,
UINT32  cbScratch 
)

Definition at line 2313 of file mldsa_primitives.c.

2319{
2320 // Round scratch space to nearest multiple of 8 for alignment
2321 cbScratch = (cbScratch + 7) & ~7;
2322
2324 ( nRowVectors * sizeof( PSYMCRYPT_MLDSA_VECTOR ) ) + // Row vector pointers
2325 ( nColVectors * sizeof( PSYMCRYPT_MLDSA_VECTOR ) ) + // Col vector pointers
2326 ( nPolyElements * sizeof( PSYMCRYPT_MLDSA_POLYELEMENT ) ) + // Poly element pointers
2327 ( nRowVectors * pParams->cbRowVector ) + // Row vector buffer
2328 ( nColVectors * pParams->cbColVector ) + // Col vector buffer
2329 ( nPolyElements * pParams->cbPolyElement ) + // Poly element buffer
2330 ( cbScratch ); // Scratch buffer
2331
2333 if( pbBuffer == NULL )
2334 {
2335 return NULL;
2336 }
2337
2338 SymCryptWipe( pbBuffer, cbTotalSize );
2339
2342
2343 pTemporaries->cbTotalSize = cbTotalSize;
2344 pTemporaries->nRowVectors = nRowVectors;
2345 pTemporaries->nColVectors = nColVectors;
2346 pTemporaries->nPolyElements = nPolyElements;
2347 pTemporaries->cbScratch = cbScratch;
2348
2349 PBYTE pbCurrent = pbBuffer + sizeof( SYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES );
2350
2351 if( nRowVectors > 0 )
2352 {
2353 pTemporaries->pvRowVectors = (PSYMCRYPT_MLDSA_VECTOR *) pbCurrent;
2354 pbCurrent += nRowVectors * sizeof( PSYMCRYPT_MLDSA_VECTOR );
2355 }
2356
2357 if( nColVectors > 0 )
2358 {
2359 pTemporaries->pvColVectors = (PSYMCRYPT_MLDSA_VECTOR *) pbCurrent;
2360 pbCurrent += nColVectors * sizeof( PSYMCRYPT_MLDSA_VECTOR );
2361 }
2362
2363 if( nPolyElements > 0 )
2364 {
2365 pTemporaries->pePolyElements = (PSYMCRYPT_MLDSA_POLYELEMENT *) pbCurrent;
2366 pbCurrent += nPolyElements * sizeof( PSYMCRYPT_MLDSA_POLYELEMENT );
2367 }
2368
2369 for(UINT32 i = 0; i < nRowVectors; i++)
2370 {
2371 pTemporaries->pvRowVectors[i] = SymCryptMlDsaVectorCreate( pbCurrent, pParams->cbRowVector, pParams->nRows );
2372 pbCurrent += pParams->cbRowVector;
2373 }
2374
2375 for(UINT32 i = 0; i < nColVectors; i++)
2376 {
2377 pTemporaries->pvColVectors[i] = SymCryptMlDsaVectorCreate( pbCurrent, pParams->cbColVector, pParams->nCols );
2378 pbCurrent += pParams->cbColVector;
2379 }
2380
2381 for(UINT32 i = 0; i < nPolyElements; i++)
2382 {
2383 pTemporaries->pePolyElements[i] = SymCryptMlDsaPolyElementCreate( pbCurrent, pParams->cbPolyElement );
2384 pbCurrent += pParams->cbPolyElement;
2385 }
2386
2387 if( cbScratch > 0 )
2388 {
2389 pTemporaries->pbScratch = pbCurrent;
2390 pbCurrent += cbScratch;
2391 }
2392
2393 SYMCRYPT_ASSERT( pbCurrent == pbBuffer + cbTotalSize );
2394
2395 SYMCRYPT_SET_MAGIC( pTemporaries );
2396
2397 return pTemporaries;
2398}
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
UINT32 nRowVectors
SYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES
Definition: sc_lib_mldsa.h:206
UINT32 UINT32 UINT32 nPolyElements
UINT32 UINT32 nColVectors
UINT32 UINT32 UINT32 UINT32 cbScratch
UINT32 cbTotalSize

Referenced by SymCryptMlDsaKeyGenerateEx(), SymCryptMlDsaPkDecode(), SymCryptMlDsaPkEncode(), SymCryptMlDsaSignEx(), SymCryptMlDsaSkDecode(), SymCryptMlDsaSkEncode(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaTemporariesFree()

Definition at line 2403 of file mldsa_primitives.c.

2405{
2406 SYMCRYPT_CHECK_MAGIC( pTemporaries );
2407
2408 SymCryptWipe( pTemporaries, pTemporaries->cbTotalSize );
2409 SymCryptCallbackFree( pTemporaries );
2410}
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
#define SYMCRYPT_CHECK_MAGIC(p)

Referenced by SymCryptMlDsaKeyGenerateEx(), SymCryptMlDsaPkDecode(), SymCryptMlDsaPkEncode(), SymCryptMlDsaSignEx(), SymCryptMlDsaSkDecode(), SymCryptMlDsaSkEncode(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaUseHint()

Definition at line 1132 of file mldsa_primitives.c.

1136{
1137 SYMCRYPT_ASSERT( pvHint->nElems == pvCommitment->nElems );
1138
1139 UINT32 r1, r0;
1140 UINT32 hintIsZeroMask;
1141 UINT32 tmpMask;
1142 UINT32 r0PrimeGtZeroMask;
1143 UINT32 positiveOffsetCoeff;
1144 UINT32 negativeOffsetCoeff;
1145
1146 for(UINT32 i = 0; i < pvHint->nElems; ++i)
1147 {
1150
1152 {
1153 SYMCRYPT_ASSERT( peHint->coeffs[j] == 0 || peHint->coeffs[j] == 1 );
1154
1155 SymCryptMlDsaDecompose( pParams, peCommitment->coeffs[j], &r1, &r0 );
1156
1157 //
1158 // FIPS-204 UseHint lines 3-5
1159 // r1 in range [0, commitmentModulus)
1160 // r0 in range [-commitmentRoundingRange, commitmentRoundingRange], encoded
1161 // as an unsigned integer modulo Q
1162 //
1163 // Let r0' := r0 mod+- 2*gamma_2
1164 // (This is just r0 in FIPS 204, which uses signed integers.)
1165 //
1166 // r0 - 1 < commitmentRoundingRange => r0' > 0
1167 // r0 - 1 >= commitmentRoundingRange => r0' <= 0
1168 //
1169 // There are three cases to consider:
1170 // 1. If the hint is zero, the coefficient is set to r1.
1171 // 2. Else if r0' > 0, the coefficient is (r1 + 1) mod commitmentModulus.
1172 // 3. Else (r0' <= 0), the coefficient is (r1 - 1) mod commitmentModulus.
1173 //
1174 // The hint is public so we don't have to implement this in a sidechannel-safe manner,
1175 // but avoiding branches will improve performance.
1176 //
1177
1178 // Set up masks to determine which case we fall into
1179 hintIsZeroMask = peHint->coeffs[j] - 1; // 0 if hint is 1, 0xFFFFFFFF if hint is 0
1180 r0PrimeGtZeroMask = SYMCRYPT_MASK32_LT( r0 - 1, pParams->commitmentRoundingRange );
1181
1182 // Case 2: r0' > 0, so the coefficient is (r1 + 1) mod commitmentModulus,
1183 // i.e. (r1 + 1) if r1 != commitmentModulus - 1, else 0
1184 tmpMask = ~SYMCRYPT_MASK32_EQ( r1, (UINT32) (pParams->commitmentModulus - 1) );
1185 positiveOffsetCoeff = tmpMask & (r1 + 1);
1186
1187 // Case 3: r0' <= 0, so the coefficient is (r1 - 1) mod commitmentModulus,
1188 // i.e. (r1 - 1) if r1 != 0, else commitmentModulus - 1
1189 tmpMask = SYMCRYPT_MASK32_EQ( r1, 0 );
1190 negativeOffsetCoeff = ( tmpMask & (pParams->commitmentModulus - 1) ) | ( ~tmpMask & ( r1 - 1 ) );
1191
1192 // Mask out each possible coefficient based on which case we fall into
1193 r1 &= hintIsZeroMask;
1194 positiveOffsetCoeff &= ~hintIsZeroMask & r0PrimeGtZeroMask;
1195 negativeOffsetCoeff &= ~hintIsZeroMask & ~r0PrimeGtZeroMask;
1196
1197 // Sanity check: no combination of masked values should be set simultaneously
1198 SYMCRYPT_ASSERT( (r1 & positiveOffsetCoeff) == 0 );
1199 SYMCRYPT_ASSERT( (r1 & negativeOffsetCoeff) == 0 );
1200 SYMCRYPT_ASSERT( (positiveOffsetCoeff & negativeOffsetCoeff) == 0 );
1201
1202 // Finally, we can pick the correct coefficient using our masks
1203 peCommitment->coeffs[j] = r1 | positiveOffsetCoeff | negativeOffsetCoeff;
1204 }
1205 }
1206}
_Use_decl_annotations_ FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlDsaDecompose(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT32 r, UINT32 *puR1, UINT32 *puR0)
#define SYMCRYPT_MASK32_EQ(_a, _b)

Referenced by SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorAdd()

Definition at line 681 of file mldsa_primitives.c.

685{
686 SYMCRYPT_ASSERT( pvSrc1->nElems == pvSrc2->nElems );
687 SYMCRYPT_ASSERT( pvSrc1->nElems == pvDst->nElems );
688
689 PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, peSrc2;
691
692 for( UINT32 i = 0; i < pvSrc1->nElems; ++i )
693 {
694 peSrc1 = SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT( i, pvSrc1 );
695 peSrc2 = SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT( i, pvSrc2 );
697
698 SymCryptMlDsaPolyElementAdd( peSrc1, peSrc2, peDst );
699 }
700}

Referenced by SymCryptMlDsakeyComputeT(), and SymCryptMlDsaSignEx().

◆ SymCryptMlDsaVectorCopy()

Definition at line 656 of file mldsa_primitives.c.

659{
660 SYMCRYPT_ASSERT( pvSrc->nElems == pvDst->nElems );
661
662 memcpy( pvDst, pvSrc, pvSrc->cbTotalSize );
663}

Referenced by SymCryptMlDsaPkEncode(), and SymCryptMlDsaSkEncode().

◆ SymCryptMlDsaVectorCreate()

_Use_decl_annotations_ PSYMCRYPT_MLDSA_VECTOR SYMCRYPT_CALL SymCryptMlDsaVectorCreate ( PBYTE  pbBuffer,
UINT32  cbBuffer,
UINT8  nElems 
)

Definition at line 628 of file mldsa_primitives.c.

632{
636
638 SYMCRYPT_ASSERT( pvVector != NULL );
639
640 pvVector->nElems = nElems;
641 pvVector->cbTotalSize = cbBuffer;
642
643 PBYTE pbCurrent = pbBuffer + sizeof(SYMCRYPT_MLDSA_VECTOR);
644 for( UINT32 i = 0; i < nElems; ++i )
645 {
648 }
649
650 return pvVector;
651}
SYMCRYPT_MLDSA_VECTOR
Definition: sc_lib_mldsa.h:80
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_VECTOR(_nElems)
Definition: sc_lib_mldsa.h:209
#define SYMCRYPT_MLDSA_VECTOR_MAX_LENGTH
Definition: sc_lib_mldsa.h:69
UINT32 UINT8 nElems
Definition: sc_lib_mldsa.h:495

Referenced by SymCryptMlDsakeyInitialize(), and SymCryptMlDsaTemporariesAllocateAndInitialize().

◆ SymCryptMlDsaVectorDecode()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaVectorDecode ( _In_reads_bytes_(pvDst->nElems *nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE  pbSrc,
UINT32  nBitsPerCoefficient,
UINT32  signedCoefficientBound,
_Inout_ PSYMCRYPT_MLDSA_VECTOR  pvDst 
)

Definition at line 2274 of file mldsa_primitives.c.

2280{
2281 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
2282 PCBYTE pbCurr = pbSrc;
2283 const SIZE_T cbEncodedPoly = nBitsPerCoefficient * ( SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8 );
2284
2285 for( UINT32 i = 0; i < pvDst->nElems; ++i )
2286 {
2288
2290 pbCurr,
2291 nBitsPerCoefficient,
2292 signedCoefficientBound,
2293 peElement );
2294 if( scError != SYMCRYPT_NO_ERROR )
2295 {
2296 // Side-channel safety: the validity of an imported key is public information.
2297 // See comment in SymCryptMlDsaPolyElementDecode.
2298 goto cleanup;
2299 }
2300
2301 pbCurr += cbEncodedPoly;
2302 }
2303
2304 SYMCRYPT_ASSERT( pbCurr == pbSrc + ( pvDst->nElems * cbEncodedPoly ) );
2305
2306cleanup:
2307 return scError;
2308}

Referenced by SymCryptMlDsaSigDecode(), and SymCryptMlDsaSkDecode().

◆ SymCryptMlDsaVectorEncode()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorEncode ( PCSYMCRYPT_MLDSA_VECTOR  pvSrc,
UINT32  nBitsPerCoefficient,
UINT32  signedCoefficientBound,
PBYTE  pbDst 
)

Definition at line 2247 of file mldsa_primitives.c.

2252{
2253 PBYTE pbCurr = pbDst;
2254 const SIZE_T cbEncodedPoly = nBitsPerCoefficient * ( SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8 );
2255
2256 for( UINT32 i = 0; i < pvSrc->nElems; ++i )
2257 {
2259
2261 peElement,
2262 nBitsPerCoefficient,
2263 signedCoefficientBound,
2264 pbCurr );
2265
2266 pbCurr += cbEncodedPoly;
2267 }
2268
2269 SYMCRYPT_ASSERT( pbCurr == pbDst + ( pvSrc->nElems * cbEncodedPoly ) );
2270}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementEncode(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PBYTE pbDst)

Referenced by SymCryptMlDsaPkEncode(), SymCryptMlDsaSigEncode(), SymCryptMlDsaSignEx(), SymCryptMlDsaSkEncode(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorHighBits()

Definition at line 1977 of file mldsa_primitives.c.

1981{
1982 SYMCRYPT_ASSERT( pvSrc->nElems == pvDst->nElems );
1983
1984 for(UINT32 i = 0; i < pvSrc->nElems; i++)
1985 {
1987 {
1989 pParams,
1992 NULL );
1993 }
1994 }
1995}
GLenum GLenum const GLfloat * coeffs
Definition: glext.h:11733

Referenced by SymCryptMlDsaMakeHint(), and SymCryptMlDsaSignEx().

◆ SymCryptMlDsaVectorInfinityNorm()

_Use_decl_annotations_ UINT32 SYMCRYPT_CALL SymCryptMlDsaVectorInfinityNorm ( PCSYMCRYPT_MLDSA_VECTOR  pvSrc)

Definition at line 1899 of file mldsa_primitives.c.

1900{
1901 UINT32 norm = 0;
1902 UINT32 curr;
1903 INT32 mask;
1904 for( UINT32 i = 0; i < pvSrc->nElems; i++ )
1905 {
1907 mask = SYMCRYPT_MASK32_LT( norm, curr );
1908 norm = (norm & ~mask) | (curr & mask);
1909 }
1910
1911 return norm;
1912}
_Use_decl_annotations_ FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlDsaPolyElementInfinityNorm(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc)

Referenced by SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorINTT()

VOID SYMCRYPT_CALL SymCryptMlDsaVectorINTT ( _Inout_ PSYMCRYPT_MLDSA_VECTOR  pvSrc)

Definition at line 759 of file mldsa_primitives.c.

761{
762 for( UINT32 i = 0; i < pvSrc->nElems; ++i )
763 {
765 }
766}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementINTT(PSYMCRYPT_MLDSA_POLYELEMENT peSrc)

Referenced by SymCryptMlDsakeyComputeT(), SymCryptMlDsaPkEncode(), SymCryptMlDsaSignEx(), SymCryptMlDsaSkEncode(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorLowBits()

Definition at line 2000 of file mldsa_primitives.c.

2004{
2005 SYMCRYPT_ASSERT( pvSrc->nElems == pvDst->nElems );
2006
2007 for(UINT32 i = 0; i < pvSrc->nElems; i++)
2008 {
2010 {
2012 pParams,
2014 NULL,
2016 }
2017 }
2018}

Referenced by SymCryptMlDsaSignEx().

◆ SymCryptMlDsaVectorNTT()

Definition at line 748 of file mldsa_primitives.c.

750{
751 for( UINT32 i = 0; i < pvSrc->nElems; ++i )
752 {
754 }
755}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementNTT(PSYMCRYPT_MLDSA_POLYELEMENT peSrc)

Referenced by SymCryptMlDsaExpandMask(), SymCryptMlDsaKeyGenerateEx(), SymCryptMlDsaPkDecode(), SymCryptMlDsaSkDecode(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorPolyElementMontMul()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPolyElementMontMul ( PCSYMCRYPT_MLDSA_VECTOR  pvSrc1,
PCSYMCRYPT_MLDSA_POLYELEMENT  peSrc2,
PSYMCRYPT_MLDSA_VECTOR  pvDst 
)

Definition at line 729 of file mldsa_primitives.c.

733{
734 SYMCRYPT_ASSERT( pvSrc1->nElems == pvDst->nElems );
735
736 for( UINT32 i = 0; i < pvSrc1->nElems; ++i )
737 {
740
741 SymCryptMlDsaPolyElementMontMul( peSrc1, peSrc2, peDst );
742 }
743}

Referenced by SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

◆ SymCryptMlDsaVectorPower2Round()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPower2Round ( PCSYMCRYPT_MLDSA_VECTOR  pvSrc,
PSYMCRYPT_MLDSA_VECTOR  pvDst1,
PSYMCRYPT_MLDSA_VECTOR  pvDst0 
)

Definition at line 2060 of file mldsa_primitives.c.

2064{
2065 SYMCRYPT_ASSERT( pvSrc->nElems == pvDst1->nElems );
2066 SYMCRYPT_ASSERT( pvSrc->nElems == pvDst0->nElems );
2067
2068 for(UINT32 i = 0; i < pvSrc->nElems; i++)
2069 {
2074 }
2075}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementPower2Round(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc, PSYMCRYPT_MLDSA_POLYELEMENT peDst1, PSYMCRYPT_MLDSA_POLYELEMENT peDst0)

Referenced by SymCryptMlDsakeyComputeT().

◆ SymCryptMlDsaVectorSetZero()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorSetZero ( PSYMCRYPT_MLDSA_VECTOR  pvDst)

Definition at line 668 of file mldsa_primitives.c.

670{
671 for( UINT32 i = 0; i < pvDst->nElems; ++i )
672 {
675 }
676}

Referenced by SymCryptMlDsaMatrixVectorMontMul(), SymCryptMlDsaPkDecode(), and SymCryptMlDsaSkDecode().

◆ SymCryptMlDsaVectorSub()

Definition at line 705 of file mldsa_primitives.c.

709{
710 SYMCRYPT_ASSERT( pvSrc1->nElems == pvSrc2->nElems );
711 SYMCRYPT_ASSERT( pvSrc1->nElems == pvDst->nElems );
712
713 PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, peSrc2;
715
716 for( UINT32 i = 0; i < pvSrc1->nElems; ++i )
717 {
718 peSrc1 = SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT( i, pvSrc1 );
719 peSrc2 = SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT( i, pvSrc2 );
721
722 SymCryptMlDsaPolyElementSub( peSrc1, peSrc2, peDst );
723 }
724}
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementSub(PCSYMCRYPT_MLDSA_POLYELEMENT peSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_POLYELEMENT peDst)

Referenced by SymCryptMlDsaSignEx(), and SymCryptMlDsaVerifyEx().

Variable Documentation

◆ g_hashOidMap

Initial value:
=
{
}
const SYMCRYPT_HASH SymCryptSha3_384Algorithm_default
Definition: sha3_384.c:14
const SYMCRYPT_HASH SymCryptSha512_256Algorithm_default
Definition: sha512.c:156
const SYMCRYPT_HASH SymCryptSha256Algorithm_default
Definition: sha256.c:32
const SYMCRYPT_HASH SymCryptSha512Algorithm_default
Definition: sha512.c:130
const SYMCRYPT_HASH SymCryptSha3_512Algorithm_default
Definition: sha3_512.c:14
const SYMCRYPT_HASH SymCryptShake128HashAlgorithm_default
Definition: shake.c:28
const SYMCRYPT_HASH SymCryptSha3_256Algorithm_default
Definition: sha3_256.c:14
const SYMCRYPT_HASH SymCryptSha384Algorithm_default
Definition: sha512.c:117
const SYMCRYPT_HASH SymCryptShake256HashAlgorithm_default
Definition: shake.c:80
@ SYMCRYPT_PQDSA_HASH_ID_SHA512
Definition: symcrypt.h:10427
@ SYMCRYPT_PQDSA_HASH_ID_SHA256
Definition: symcrypt.h:10425
@ SYMCRYPT_PQDSA_HASH_ID_SHA3_512
Definition: symcrypt.h:10431
@ SYMCRYPT_PQDSA_HASH_ID_SHAKE256
Definition: symcrypt.h:10433
@ SYMCRYPT_PQDSA_HASH_ID_SHA3_384
Definition: symcrypt.h:10430
@ SYMCRYPT_PQDSA_HASH_ID_SHA384
Definition: symcrypt.h:10426
@ SYMCRYPT_PQDSA_HASH_ID_SHA512_256
Definition: symcrypt.h:10428
@ SYMCRYPT_PQDSA_HASH_ID_SHA3_256
Definition: symcrypt.h:10429
@ SYMCRYPT_PQDSA_HASH_ID_SHAKE128
Definition: symcrypt.h:10432
const SYMCRYPT_OID SymCryptSha3_384OidList[SYMCRYPT_SHA3_384_OID_COUNT]
Definition: rsa_padding.c:79
const SYMCRYPT_OID SymCryptShake256OidList[SYMCRYPT_SHAKE256_OID_COUNT]
Definition: rsa_padding.c:97
const SYMCRYPT_OID SymCryptSha384OidList[SYMCRYPT_SHA384_OID_COUNT]
Definition: rsa_padding.c:43
const SYMCRYPT_OID SymCryptSha512OidList[SYMCRYPT_SHA512_OID_COUNT]
Definition: rsa_padding.c:49
const SYMCRYPT_OID SymCryptSha3_256OidList[SYMCRYPT_SHA3_256_OID_COUNT]
Definition: rsa_padding.c:73
const SYMCRYPT_OID SymCryptSha512_256OidList[SYMCRYPT_SHA512_256_OID_COUNT]
Definition: rsa_padding.c:61
const SYMCRYPT_OID SymCryptSha256OidList[SYMCRYPT_SHA256_OID_COUNT]
Definition: rsa_padding.c:37
const SYMCRYPT_OID SymCryptShake128OidList[SYMCRYPT_SHAKE128_OID_COUNT]
Definition: rsa_padding.c:91
const SYMCRYPT_OID SymCryptSha3_512OidList[SYMCRYPT_SHA3_512_OID_COUNT]
Definition: rsa_padding.c:85

Definition at line 213 of file mldsa_primitives.c.

Referenced by SymCryptHashMlDsaValidateHashAlgAndGetOid().

◆ MLDSA_NEGATIVE_ZETA_BITREV_TIMES_R

const UINT32 MLDSA_NEGATIVE_ZETA_BITREV_TIMES_R[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]

Definition at line 91 of file mldsa_primitives.c.

Referenced by SymCryptMlDsaPolyElementINTT().

◆ MLDSA_ZETA_BITREV_TIMES_R

Definition at line 56 of file mldsa_primitives.c.

Referenced by SymCryptMlDsaPolyElementNTT().

◆ SymCryptMlDsaInternalParams44

const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams44
Initial value:
=
{
.nRows = 4,
.nCols = 4,
.privateKeyRange = 2,
.encodedCoefficientBitLength = 3,
.nChallengeNonZeroCoeffs = 39,
.nHintNonZeroCoeffs = 80,
.maskCoefficientRangeLog2 = 17,
.commitmentModulus = 44,
.decomposeR1Factor = 11275,
.commitmentRoundingRange = 95232,
.w1EncodeCoefficientBitLength = 6,
.cbCommitmentHash = 32,
.cbEncodedPrivateKey = 2560,
.cbEncodedPublicKey = 1312,
}
#define SYMCRYPT_MLDSA_SIGNATURE_SIZE_MLDSA44
Definition: symcrypt.h:10457

Definition at line 126 of file mldsa_primitives.c.

Referenced by SymCryptMlDsaGetInternalParamsFromParams().

◆ SymCryptMlDsaInternalParams65

const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams65
Initial value:
=
{
.nRows = 6,
.nCols = 5,
.privateKeyRange = 4,
.encodedCoefficientBitLength = 4,
.nChallengeNonZeroCoeffs = 49,
.nHintNonZeroCoeffs = 55,
.maskCoefficientRangeLog2 = 19,
.commitmentModulus = 16,
.decomposeR1Factor = 4100,
.commitmentRoundingRange = 261888,
.w1EncodeCoefficientBitLength = 4,
.cbCommitmentHash = 48,
.cbEncodedPrivateKey = 4032,
.cbEncodedPublicKey = 1952,
}
#define SYMCRYPT_MLDSA_SIGNATURE_SIZE_MLDSA65
Definition: symcrypt.h:10458

Definition at line 150 of file mldsa_primitives.c.

Referenced by SymCryptMlDsaGetInternalParamsFromParams().

◆ SymCryptMlDsaInternalParams87

const SYMCRYPT_MLDSA_INTERNAL_PARAMS SymCryptMlDsaInternalParams87
Initial value:
=
{
.nRows = 8,
.nCols = 7,
.privateKeyRange = 2,
.encodedCoefficientBitLength = 3,
.nChallengeNonZeroCoeffs = 60,
.nHintNonZeroCoeffs = 75,
.maskCoefficientRangeLog2 = 19,
.commitmentModulus = 16,
.decomposeR1Factor = 4100,
.commitmentRoundingRange = 261888,
.w1EncodeCoefficientBitLength = 4,
.cbCommitmentHash = 64,
.cbEncodedPrivateKey = 4896,
.cbEncodedPublicKey = 2592,
}
#define SYMCRYPT_MLDSA_SIGNATURE_SIZE_MLDSA87
Definition: symcrypt.h:10459

Definition at line 174 of file mldsa_primitives.c.

Referenced by SymCryptMlDsaGetInternalParamsFromParams().