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

Go to the source code of this file.

Macros

#define SYMCRYPT_MLKEM_MaxCoeff   (SYMCRYPT_MLKEM_Q - 1)
 
#define SYMCRYPT_MLKEM_MaxCoeffProduct   (SYMCRYPT_MLKEM_MaxCoeff*SYMCRYPT_MLKEM_MaxCoeff)
 
#define SYMCRYPT_MLKEM_MaxFirstStepReduction   (3494)
 
#define SYMCRYPT_MLKEM_MaxZetaTwoTimesPlus1TimesR   (3254)
 
#define SYMCRYPT_MLKEM_MaxA1B1ZetaPow   (SYMCRYPT_MLKEM_MaxFirstStepReduction*SYMCRYPT_MLKEM_MaxZetaTwoTimesPlus1TimesR)
 

Functions

PSYMCRYPT_MLKEM_POLYELEMENT SYMCRYPT_CALL SymCryptMlKemPolyElementCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer)
 
PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR SYMCRYPT_CALL SymCryptMlKemPolyElementAccumulatorCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer)
 
PSYMCRYPT_MLKEM_VECTOR SYMCRYPT_CALL SymCryptMlKemVectorCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer, UINT32 nRows)
 
PSYMCRYPT_MLKEM_MATRIX SYMCRYPT_CALL SymCryptMlKemMatrixCreate (_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer, UINT32 nRows)
 
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModAdd (UINT32 a, UINT32 b)
 
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModSub (UINT32 a, UINT32 b)
 
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemMontMul (UINT32 a, UINT32 b, UINT32 bMont)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayerC (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayerC (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayer (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
 
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayer (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementMulAndAccumulate (_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemMontgomeryReduceAndAddPolyElementAccumulatorToPolyElement (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paSrc, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementMulR (_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementAdd (_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSub (_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTT (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTAndMulR (_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementCompressAndEncode (_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 nBitsPerCoefficient, _Out_writes_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PBYTE pbDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlKemPolyElementDecodeAndDecompress (_In_reads_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE pbSrc, UINT32 nBitsPerCoefficient, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSampleNTTFromShake128 (_Inout_ PSYMCRYPT_SHAKE128_STATE pState, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSampleCBDFromBytes (_In_reads_bytes_(eta *2 *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)+1) PCBYTE pbSrc, _In_range_(2, 3) UINT32 eta, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemMatrixTranspose (_Inout_ PSYMCRYPT_MLKEM_MATRIX pmSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemMatrixVectorMontMulAndAdd (_In_ PCSYMCRYPT_MLKEM_MATRIX pmSrc1, _In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc2, _Inout_ PSYMCRYPT_MLKEM_VECTOR pvDst, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paTmp)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorMontDotProduct (_In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc1, _In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc2, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peDst, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paTmp)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorSetZero (_Inout_ PSYMCRYPT_MLKEM_VECTOR pvSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorMulR (_In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc, _Out_ PSYMCRYPT_MLKEM_VECTOR pvDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorAdd (_In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc1, _In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc2, _Out_ PSYMCRYPT_MLKEM_VECTOR pvDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorSub (_In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc1, _In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc2, _Out_ PSYMCRYPT_MLKEM_VECTOR pvDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorNTT (_Inout_ PSYMCRYPT_MLKEM_VECTOR pvSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorINTTAndMulR (_Inout_ PSYMCRYPT_MLKEM_VECTOR pvSrc)
 
VOID SYMCRYPT_CALL SymCryptMlKemVectorCompressAndEncode (_In_ PCSYMCRYPT_MLKEM_VECTOR pvSrc, UINT32 nBitsPerCoefficient, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlKemVectorDecodeAndDecompress (_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, UINT32 nBitsPerCoefficient, _Out_ PSYMCRYPT_MLKEM_VECTOR pvDst)
 
VOID SYMCRYPT_CALL SymCryptMlKemkeyWipePrivateState (_Inout_ PSYMCRYPT_MLKEMKEY pkMlKemkey)
 

Variables

const UINT32 SYMCRYPT_MLKEM_Rlog2 = 16
 
const UINT32 SYMCRYPT_MLKEM_Rmask = 0xffff
 
const UINT32 SYMCRYPT_MLKEM_NegQInvModR = 3327
 
const UINT32 SYMCRYPT_MLKEM_Rsqr = 1353
 
const UINT32 SYMCRYPT_MLKEM_RsqrTimesNegQInvModR = 44983
 
const UINT16 MlKemZetaBitRevTimesR [128]
 
const UINT16 MlKemZetaBitRevTimesRTimesNegQInvModR [128]
 
const UINT16 zetaTwoTimesBitRevPlus1TimesR [128]
 
const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqr = 1441
 
const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqrTimesNegQInvModR = 10079
 
const UINT32 SYMCRYPT_MLKEM_COMPRESS_MULCONSTANT = 0x275f6f
 
const UINT32 SYMCRYPT_MLKEM_COMPRESS_SHIFTCONSTANT = 33
 

Macro Definition Documentation

◆ SYMCRYPT_MLKEM_MaxA1B1ZetaPow

Definition at line 687 of file mlkem_primitives.c.

◆ SYMCRYPT_MLKEM_MaxCoeff

#define SYMCRYPT_MLKEM_MaxCoeff   (SYMCRYPT_MLKEM_Q - 1)

Definition at line 680 of file mlkem_primitives.c.

◆ SYMCRYPT_MLKEM_MaxCoeffProduct

#define SYMCRYPT_MLKEM_MaxCoeffProduct   (SYMCRYPT_MLKEM_MaxCoeff*SYMCRYPT_MLKEM_MaxCoeff)

Definition at line 681 of file mlkem_primitives.c.

◆ SYMCRYPT_MLKEM_MaxFirstStepReduction

#define SYMCRYPT_MLKEM_MaxFirstStepReduction   (3494)

Definition at line 684 of file mlkem_primitives.c.

◆ SYMCRYPT_MLKEM_MaxZetaTwoTimesPlus1TimesR

#define SYMCRYPT_MLKEM_MaxZetaTwoTimesPlus1TimesR   (3254)

Definition at line 686 of file mlkem_primitives.c.

Function Documentation

◆ SymCryptMlKemkeyWipePrivateState()

VOID SYMCRYPT_CALL SymCryptMlKemkeyWipePrivateState ( _Inout_ PSYMCRYPT_MLKEMKEY  pkMlKemkey)

Definition at line 1426 of file mlkem_primitives.c.

1428{
1430 SymCryptWipeKnownSize( pkMlKemkey->privateRandom, sizeof(pkMlKemkey->privateRandom) );
1431 SymCryptWipeKnownSize( pkMlKemkey->privateSeed, sizeof(pkMlKemkey->privateSeed) );
1432 pkMlKemkey->hasPrivateKey = FALSE;
1433 pkMlKemkey->hasPrivateSeed = FALSE;
1434}
#define FALSE
Definition: types.h:117
VOID SYMCRYPT_CALL SymCryptMlKemVectorSetZero(_Inout_ PSYMCRYPT_MLKEM_VECTOR pvSrc)
PSYMCRYPT_MLKEMKEY pkMlKemkey
Definition: sc_lib.h:4444
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)

◆ SymCryptMlKemMatrixCreate()

PSYMCRYPT_MLKEM_MATRIX SYMCRYPT_CALL SymCryptMlKemMatrixCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
UINT32  cbBuffer,
UINT32  nRows 
)

Definition at line 196 of file mlkem_primitives.c.

200{
203 UINT32 i;
204 PBYTE pbTmp = pbBuffer + sizeof(SYMCRYPT_MLKEM_MATRIX);
205
207
208 SYMCRYPT_ASSERT( nRows > 0 );
210
211 pMatrix->nRows = nRows;
212 pMatrix->cbTotalSize = cbBuffer;
213
214 for( i=0; i<(nRows*nRows); i++ )
215 {
217 if( pMatrix->apPolyElements[i] == NULL )
218 {
219 goto cleanup;
220 }
221
223 }
224
225 SYMCRYPT_ASSERT( pbTmp == (pbBuffer + cbBuffer) );
226
227 pDst = pMatrix;
228
229cleanup:
230 return pDst;
231}
#define NULL
Definition: types.h:112
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
PSYMCRYPT_MLKEM_POLYELEMENT SYMCRYPT_CALL SymCryptMlKemPolyElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer)
BYTE * PBYTE
Definition: pedump.c:66
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
Definition: sc_lib.h:1912
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
SYMCRYPT_MLKEM_MATRIX
Definition: sc_lib_mlkem.h:53
#define SYMCRYPT_INTERNAL_MLKEM_SIZEOF_POLYRINGELEMENT
Definition: sc_lib_mlkem.h:125
UINT8 nRows
Definition: sc_lib_mlkem.h:69
* PSYMCRYPT_MLKEM_MATRIX
Definition: sc_lib_mlkem.h:53
#define SYMCRYPT_MLKEM_MATRIX_MAX_NROWS
Definition: sc_lib_mlkem.h:28
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptMlKemkeyInitialize().

◆ SymCryptMlKemMatrixTranspose()

VOID SYMCRYPT_CALL SymCryptMlKemMatrixTranspose ( _Inout_ PSYMCRYPT_MLKEM_MATRIX  pmSrc)

Definition at line 1152 of file mlkem_primitives.c.

1154{
1155 UINT32 i, j;
1157 const UINT32 nRows = pmSrc->nRows;
1158
1159 SYMCRYPT_ASSERT( nRows > 0 );
1161
1162 for( i=0; i<nRows; i++ )
1163 {
1164 for( j=i+1; j<nRows; j++ )
1165 {
1166 swap = pmSrc->apPolyElements[(i*nRows) + j];
1167 pmSrc->apPolyElements[(i*nRows) + j] = pmSrc->apPolyElements[(j*nRows) + i];
1168 pmSrc->apPolyElements[(j*nRows) + i] = swap;
1169 }
1170 }
1171}
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 swap(a, b)
Definition: qsort.c:63
SYMCRYPT_MLKEM_POLYELEMENT * PSYMCRYPT_MLKEM_POLYELEMENT
Definition: sc_lib_mlkem.h:18

Referenced by SymCryptMlKemkeyExpandFromPrivateSeed(), and SymCryptMlKemkeySetValue().

◆ SymCryptMlKemMatrixVectorMontMulAndAdd()

Definition at line 1175 of file mlkem_primitives.c.

1180{
1181 UINT32 i, j;
1182 const UINT32 nRows = pmSrc1->nRows;
1183 PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, peSrc2;
1185
1186 SYMCRYPT_ASSERT( nRows > 0 );
1188 SYMCRYPT_ASSERT( pvSrc2->nRows == nRows );
1189 SYMCRYPT_ASSERT( pvDst->nRows == nRows );
1190
1191 // Zero paTmp
1193
1194 for( i=0; i<nRows; i++ )
1195 {
1196 for( j=0; j<nRows; j++ )
1197 {
1198 peSrc1 = pmSrc1->apPolyElements[(i*nRows) + j];
1199 peSrc2 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( j, pvSrc2 );
1200 SymCryptMlKemPolyElementMulAndAccumulate( peSrc1, peSrc2, paTmp );
1201 }
1202
1203 // write accumulator to dest and zero accumulator
1204 peDst = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvDst );
1206 }
1207}
VOID SYMCRYPT_CALL SymCryptMlKemMontgomeryReduceAndAddPolyElementAccumulatorToPolyElement(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paSrc, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementMulAndAccumulate(_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR paDst)
#define SYMCRYPT_INTERNAL_MLKEM_SIZEOF_POLYRINGELEMENT_ACCUMULATOR
Definition: sc_lib_mlkem.h:126
#define SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT(_row, _pVector)
Definition: sc_lib_mlkem.h:129
const SYMCRYPT_MLKEM_POLYELEMENT * PCSYMCRYPT_MLKEM_POLYELEMENT
Definition: sc_lib_mlkem.h:19

Referenced by SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemkeyExpandFromPrivateSeed().

◆ SymCryptMlKemModAdd()

FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModAdd ( UINT32  a,
UINT32  b 
)

Definition at line 483 of file mlkem_primitives.c.

486{
487 UINT32 res;
488
491
492 res = a + b - SYMCRYPT_MLKEM_Q;
493 SYMCRYPT_ASSERT( ((res >> 16) == 0) || ((res >> 16) == 0xffff) );
494 res = res + (SYMCRYPT_MLKEM_Q & (res >> 16));
496
497 return res;
498}
GLuint res
Definition: glext.h:9613
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define SYMCRYPT_MLKEM_Q
Definition: sc_lib_mlkem.h:123

Referenced by SymCryptMlKemPolyElementAdd(), SymCryptMlKemPolyElementINTTLayerC(), and SymCryptMlKemPolyElementNTTLayerC().

◆ SymCryptMlKemModSub()

FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModSub ( UINT32  a,
UINT32  b 
)

Definition at line 503 of file mlkem_primitives.c.

506{
507 UINT32 res;
508
511
512 res = a - b;
513 SYMCRYPT_ASSERT( ((res >> 16) == 0) || ((res >> 16) == 0xffff) );
514 res = res + (SYMCRYPT_MLKEM_Q & (res >> 16));
516
517 return res;
518}
#define b
Definition: ke_i.h:79

Referenced by SymCryptMlKemMontMul(), SymCryptMlKemPolyElementDecodeAndDecompress(), SymCryptMlKemPolyElementINTTLayerC(), SymCryptMlKemPolyElementNTTLayerC(), and SymCryptMlKemPolyElementSub().

◆ SymCryptMlKemMontgomeryReduceAndAddPolyElementAccumulatorToPolyElement()

VOID SYMCRYPT_CALL SymCryptMlKemMontgomeryReduceAndAddPolyElementAccumulatorToPolyElement ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR  paSrc,
_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peDst 
)

Definition at line 758 of file mlkem_primitives.c.

761{
762 UINT32 i;
763 UINT32 a, c, inv;
764
766 {
767 a = paSrc->coeffs[i];
769 paSrc->coeffs[i] = 0;
770
771 c = peDst->coeffs[i];
773
774 // montgomery reduce sum of products
776 a = (a + (inv * SYMCRYPT_MLKEM_Q)) >> SYMCRYPT_MLKEM_Rlog2; // in range [0, 4711]
777 SYMCRYPT_ASSERT( a <= 4711 );
778
779 // add destination
780 c += a;
781 SYMCRYPT_ASSERT( c <= 8039 );
782
783 // subtraction and conditional additions for constant time range reduction
784 c -= 2*SYMCRYPT_MLKEM_Q; // in range [-2Q, 1381]
785 SYMCRYPT_ASSERT( (c >= ((UINT32)(-2*SYMCRYPT_MLKEM_Q))) || (c < 1381) );
786 c += SYMCRYPT_MLKEM_Q & (c >> 16); // in range [-Q, Q-1]
788 c += SYMCRYPT_MLKEM_Q & (c >> 16); // in range [0, Q-1]
790
791 peDst->coeffs[i] = (UINT16) c;
792 }
793}
unsigned short UINT16
Definition: actypes.h:129
const GLubyte * c
Definition: glext.h:8905
#define a
Definition: ke_i.h:78
#define c
Definition: ke_i.h:80
#define SYMCRYPT_MLKEM_MaxA1B1ZetaPow
const UINT32 SYMCRYPT_MLKEM_Rlog2
const UINT32 SYMCRYPT_MLKEM_Rmask
#define SYMCRYPT_MLKEM_MaxCoeffProduct
const UINT32 SYMCRYPT_MLKEM_NegQInvModR
#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS
Definition: sc_lib.h:4347

Referenced by SymCryptMlKemMatrixVectorMontMulAndAdd(), and SymCryptMlKemVectorMontDotProduct().

◆ SymCryptMlKemMontMul()

FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemMontMul ( UINT32  a,
UINT32  b,
UINT32  bMont 
)

Definition at line 523 of file mlkem_primitives.c.

527{
528 UINT32 res, inv;
529
534
535 res = a * b;
536 inv = (a * bMont) & SYMCRYPT_MLKEM_Rmask;
537 res += inv * SYMCRYPT_MLKEM_Q;
540
542}
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModSub(UINT32 a, UINT32 b)

Referenced by SymCryptMlKemPolyElementINTTAndMulR(), SymCryptMlKemPolyElementINTTLayerC(), SymCryptMlKemPolyElementMulR(), and SymCryptMlKemPolyElementNTTLayerC().

◆ SymCryptMlKemPolyElementAccumulatorCreate()

PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR SYMCRYPT_CALL SymCryptMlKemPolyElementAccumulatorCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
UINT32  cbBuffer 
)

Definition at line 140 of file mlkem_primitives.c.

143{
145
147
150
151 return pDst;
152}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
SYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR * PSYMCRYPT_MLKEM_POLYELEMENT_ACCUMULATOR
Definition: sc_lib_mlkem.h:25

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemkeyExpandFromPrivateSeed().

◆ SymCryptMlKemPolyElementAdd()

Definition at line 811 of file mlkem_primitives.c.

815{
816 UINT32 i;
818 {
819 peDst->coeffs[i] = (UINT16) SymCryptMlKemModAdd( peSrc1->coeffs[i], peSrc2->coeffs[i] );
820 }
821}
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemModAdd(UINT32 a, UINT32 b)

Referenced by SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemVectorAdd().

◆ SymCryptMlKemPolyElementCompressAndEncode()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementCompressAndEncode ( _In_ PCSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
UINT32  nBitsPerCoefficient,
_Out_writes_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PBYTE  pbDst 
)

Definition at line 890 of file mlkem_primitives.c.

895{
896 UINT32 i;
897 UINT64 multiplication;
899 UINT32 nBitsInCoefficient;
900 UINT32 bitsToEncode;
901 UINT32 nBitsToEncode;
902 UINT32 cbDstWritten = 0;
903 UINT32 accumulator = 0;
904 UINT32 nBitsInAccumulator = 0;
905
906 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
907 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 12 );
908
910 {
911 nBitsInCoefficient = nBitsPerCoefficient;
912 coefficient = peSrc->coeffs[i]; // in range [0, Q-1]
914
915 // first compress the coefficient
916 // when nBitsPerCoefficient < 12 we compress per Compress_d in FIPS 203;
917 if(nBitsPerCoefficient < 12)
918 {
919 // Multiply by 2^(nBitsPerCoefficient+1) / Q by multiplying by constant and shifting right
920 multiplication = SYMCRYPT_MUL32x32TO64(coefficient, SYMCRYPT_MLKEM_COMPRESS_MULCONSTANT);
921 coefficient = (UINT32) (multiplication >> (SYMCRYPT_MLKEM_COMPRESS_SHIFTCONSTANT-(nBitsPerCoefficient+1)));
922
923 // add "half" to round to nearest integer
924 coefficient++;
925
926 // final divide by two to get multiplication by 2^nBitsPerCoefficient / Q
927 coefficient >>= 1; // in range [0, 2^nBitsPerCoefficient]
928 SYMCRYPT_ASSERT(coefficient <= (1UL<<nBitsPerCoefficient));
929
930 // modular reduction by masking
931 coefficient &= (1UL<<nBitsPerCoefficient)-1; // in range [0, 2^nBitsPerCoefficient - 1]
932 SYMCRYPT_ASSERT(coefficient < (1UL<<nBitsPerCoefficient));
933 }
934
935 // encode the coefficient
936 // simple loop to add bits to accumulator and write accumulator to output
937 do
938 {
939 nBitsToEncode = SYMCRYPT_MIN(nBitsInCoefficient, 32-nBitsInAccumulator);
940
941 bitsToEncode = coefficient & ((1UL<<nBitsToEncode)-1);
942 coefficient >>= nBitsToEncode;
943 nBitsInCoefficient -= nBitsToEncode;
944
945 accumulator |= (bitsToEncode << nBitsInAccumulator);
946 nBitsInAccumulator += nBitsToEncode;
947 if(nBitsInAccumulator == 32)
948 {
949 SYMCRYPT_STORE_LSBFIRST32( pbDst+cbDstWritten, accumulator );
950 cbDstWritten += 4;
951 accumulator = 0;
952 nBitsInAccumulator = 0;
953 }
954 } while( nBitsInCoefficient > 0 );
955 }
956
957 SYMCRYPT_ASSERT(nBitsInAccumulator == 0);
958 SYMCRYPT_ASSERT(cbDstWritten == (nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8)));
959}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
BYTE coefficient[512/16]
Definition: bcrypt.c:2463
const UINT32 SYMCRYPT_MLKEM_COMPRESS_MULCONSTANT
const UINT32 SYMCRYPT_MLKEM_COMPRESS_SHIFTCONSTANT
#define SYMCRYPT_STORE_LSBFIRST32(p, v)
Definition: symcrypt.h:307
#define SYMCRYPT_MIN(_a, _b)
PCBYTE PBYTE pbDst

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemVectorCompressAndEncode().

◆ SymCryptMlKemPolyElementCreate()

◆ SymCryptMlKemPolyElementDecodeAndDecompress()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlKemPolyElementDecodeAndDecompress ( _In_reads_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE  pbSrc,
UINT32  nBitsPerCoefficient,
_Out_ PSYMCRYPT_MLKEM_POLYELEMENT  peDst 
)

Definition at line 963 of file mlkem_primitives.c.

968{
969 UINT32 i;
971 UINT32 nBitsInCoefficient;
972 UINT32 bitsToDecode;
973 UINT32 nBitsToDecode;
974 UINT32 cbSrcRead = 0;
975 UINT32 accumulator = 0;
976 UINT32 nBitsInAccumulator = 0;
977
978 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
979 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 12 );
980
982 {
983 coefficient = 0;
984 nBitsInCoefficient = 0;
985
986 // first gather and decode bits from pbSrc
987 do
988 {
989 if(nBitsInAccumulator == 0)
990 {
991 accumulator = SYMCRYPT_LOAD_LSBFIRST32( pbSrc+cbSrcRead );
992 cbSrcRead += 4;
993 nBitsInAccumulator = 32;
994 }
995
996 nBitsToDecode = SYMCRYPT_MIN(nBitsPerCoefficient-nBitsInCoefficient, nBitsInAccumulator);
997 SYMCRYPT_ASSERT(nBitsToDecode <= nBitsInAccumulator);
998
999 bitsToDecode = accumulator & ((1UL<<nBitsToDecode)-1);
1000 accumulator >>= nBitsToDecode;
1001 nBitsInAccumulator -= nBitsToDecode;
1002
1003 coefficient |= (bitsToDecode << nBitsInCoefficient);
1004 nBitsInCoefficient += nBitsToDecode;
1005 } while( nBitsPerCoefficient > nBitsInCoefficient );
1006 SYMCRYPT_ASSERT(nBitsInCoefficient == nBitsPerCoefficient);
1007
1008 // decompress the coefficient
1009 // when nBitsPerCoefficient < 12 we decompress per Decompress_d in FIPS 203
1010 // otherwise we perform input validation per 203 6.2 Input validation 2 (Modulus check)
1011 if(nBitsPerCoefficient < 12)
1012 {
1013 // Multiply by Q / 2^(nBitsPerCoefficient-1) by multiplying by constant and shifting right
1015 coefficient >>= (nBitsPerCoefficient-1);
1016
1017 // add "half" to round to nearest integer
1018 coefficient++;
1019
1020 // final divide by two to get multiplication by Q / 2^nBitsPerCoefficient
1021 coefficient >>= 1; // in range [0, Q]
1022
1023 // modular reduction by conditional subtraction
1026 }
1027 else if( coefficient >= SYMCRYPT_MLKEM_Q )
1028 {
1029 // input validation failure - this can happen with a malformed or corrupt encapsulation
1030 // or decapsulation key; we do not need to be constant time because we treat the
1031 // validity of an imported key as public information.
1032 return SYMCRYPT_INVALID_BLOB;
1033 }
1034
1035 peDst->coeffs[i] = (UINT16) coefficient;
1036 }
1037
1038 SYMCRYPT_ASSERT(nBitsInAccumulator == 0);
1039 SYMCRYPT_ASSERT(cbSrcRead == (nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8)));
1040
1041 return SYMCRYPT_NO_ERROR;
1042}
#define SYMCRYPT_LOAD_LSBFIRST32(p)
Definition: symcrypt.h:299
PCBYTE pbSrc

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemVectorDecodeAndDecompress().

◆ SymCryptMlKemPolyElementINTTAndMulR()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTAndMulR ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc)

Definition at line 859 of file mlkem_primitives.c.

861{
862 UINT32 i;
863
864 SymCryptMlKemPolyElementINTTLayer( peSrc, 127, 2 );
865 SymCryptMlKemPolyElementINTTLayer( peSrc, 63, 4 );
866 SymCryptMlKemPolyElementINTTLayer( peSrc, 31, 8 );
867 SymCryptMlKemPolyElementINTTLayer( peSrc, 15, 16 );
868 SymCryptMlKemPolyElementINTTLayer( peSrc, 7, 32 );
869 SymCryptMlKemPolyElementINTTLayer( peSrc, 3, 64 );
870 SymCryptMlKemPolyElementINTTLayer( peSrc, 1, 128 );
871
873 {
874 peSrc->coeffs[i] = (UINT16) SymCryptMlKemMontMul(
876 }
877}
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayer(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqrTimesNegQInvModR
FORCEINLINE UINT32 SYMCRYPT_CALL SymCryptMlKemMontMul(UINT32 a, UINT32 b, UINT32 bMont)
const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqr

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemVectorINTTAndMulR().

◆ SymCryptMlKemPolyElementINTTLayer()

FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayer ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
UINT32  k,
UINT32  len 
)

Definition at line 647 of file mlkem_primitives.c.

651{
652#if SYMCRYPT_CPU_X86
653 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
654 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
655 {
656 SymCryptMlKemPolyElementINTTLayerVec128( peSrc, k, len );
657 SymCryptRestoreXmm( &SaveData );
658 } else {
660 }
661#elif SYMCRYPT_CPU_AMD64
662 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
663 {
664 SymCryptMlKemPolyElementINTTLayerVec128( peSrc, k, len );
665 } else {
667 }
668#elif SYMCRYPT_CPU_ARM64
669 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
670 {
671 SymCryptMlKemPolyElementINTTLayerVec128( peSrc, k, len );
672 } else {
674 }
675#else
677#endif
678}
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
static const uint32_t k[]
Definition: sha256.c:24
GLenum GLsizei len
Definition: glext.h:6722
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayerC(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)

Referenced by SymCryptMlKemPolyElementINTTAndMulR().

◆ SymCryptMlKemPolyElementINTTLayerC()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTLayerC ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
UINT32  k,
UINT32  len 
)

Definition at line 578 of file mlkem_primitives.c.

582{
583 UINT32 start, j;
584 UINT32 twiddleFactor, twiddleFactorMont, c0, c1, tmp;
585
586 for( start=0; start<256; start+=(2*len) )
587 {
588 twiddleFactor = MlKemZetaBitRevTimesR[k];
589 twiddleFactorMont = MlKemZetaBitRevTimesRTimesNegQInvModR[k];
590 k--;
591 for( j=0; j<len; j++ )
592 {
593 c0 = peSrc->coeffs[start+j];
595 c1 = peSrc->coeffs[start+j+len];
597
598 tmp = SymCryptMlKemModAdd( c0, c1 );
599 c1 = SymCryptMlKemModSub( c1, c0 );
600 c1 = SymCryptMlKemMontMul( c1, twiddleFactor, twiddleFactorMont );
601
602 peSrc->coeffs[start+j] = (UINT16) tmp;
603 peSrc->coeffs[start+j+len] = (UINT16) c1;
604 }
605 }
606}
GLuint start
Definition: gl.h:1545
const UINT16 MlKemZetaBitRevTimesR[128]
const UINT16 MlKemZetaBitRevTimesRTimesNegQInvModR[128]

Referenced by SymCryptMlKemPolyElementINTTLayer().

◆ SymCryptMlKemPolyElementMulAndAccumulate()

Definition at line 691 of file mlkem_primitives.c.

695{
696 UINT32 i;
697 UINT32 a0, a1, b0, b1, c0, c1;
698 UINT32 a0b0, a1b1, a0b1, a1b0, a1b1zetapow, inv;
699
700 for( i=0; i<(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 2); i++ )
701 {
702 a0 = peSrc1->coeffs[(2*i) ];
704 a1 = peSrc1->coeffs[(2*i)+1];
706
707 b0 = peSrc2->coeffs[(2*i) ];
709 b1 = peSrc2->coeffs[(2*i)+1];
711
712 c0 = paDst->coeffs[(2*i) ];
714 c1 = paDst->coeffs[(2*i)+1];
716
717 // multiplication results in range [0, MaxCoeffProduct = 3328*3328]
718 a0b0 = a0 * b0;
719 a1b1 = a1 * b1;
720 a0b1 = a0 * b1;
721 a1b0 = a1 * b0;
722
723 // we need a1*b1*zetaTwoTimesBitRevPlus1TimesR[i]
724 // eagerly reduce a1*b1 with montgomery reduction
725 // a1b1 = red(a1*b1) -> range [0, MaxFirstStepReduction = 3494]
726 // (3494 is maximum result of first step of montgomery reduction of x*y for x,y in [0, 3328])
727 // we do not need to do final reduction yet
729 a1b1 = (a1b1 + (inv * SYMCRYPT_MLKEM_Q)) >> SYMCRYPT_MLKEM_Rlog2; // in range [0, MaxFirstStepReduction]
731
732 // now multiply a1b1 by power of zeta
733 a1b1zetapow = a1b1 * zetaTwoTimesBitRevPlus1TimesR[i];
734 // MaxZetaTwoTimesPlus1TimesR = 3254
735 // MaxA1B1ZetaPow = MaxFirstStepReduction*MaxZetaTwoTimesPlus1TimesR = 3494*3254
737
738 // sum pairs of products
739 a0b0 += a1b1zetapow; // a0*b0 + red(a1*b1)*zetapower in range [0, MaxCoeffProduct + MaxA1B1ZetaPow]
741 a0b1 += a1b0; // a0*b1 + a1*b0 in range [0, 2*MaxCoeffProduct]
743
744 // We sum at most 4 pairs of products into an accumulator in ML-KEM
746 c0 += a0b0; // in range [0,4*MaxCoeffProduct + 4*MaxA1B1ZetaPow]
748 c1 += a0b1; // in range [0,5*MaxCoeffProduct + 3*MaxA1B1ZetaPow]
750
751 paDst->coeffs[(2*i) ] = c0;
752 paDst->coeffs[(2*i)+1] = c1;
753 }
754}
#define C_ASSERT(e)
Definition: intsafe.h:73
#define SYMCRYPT_MLKEM_MaxFirstStepReduction
const UINT16 zetaTwoTimesBitRevPlus1TimesR[128]
static const struct update_accum a1
Definition: msg.c:534
static CRYPT_DATA_BLOB b1[]
Definition: msg.c:529

Referenced by SymCryptMlKemMatrixVectorMontMulAndAdd(), and SymCryptMlKemVectorMontDotProduct().

◆ SymCryptMlKemPolyElementMulR()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementMulR ( _In_ PCSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
_Out_ PSYMCRYPT_MLKEM_POLYELEMENT  peDst 
)

Definition at line 797 of file mlkem_primitives.c.

800{
801 UINT32 i;
803 {
804 peDst->coeffs[i] = (UINT16) SymCryptMlKemMontMul(
806 }
807}
const UINT32 SYMCRYPT_MLKEM_Rsqr
const UINT32 SYMCRYPT_MLKEM_RsqrTimesNegQInvModR

Referenced by SymCryptMlKemVectorMulR().

◆ SymCryptMlKemPolyElementNTT()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTT ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc)

Definition at line 839 of file mlkem_primitives.c.

841{
842 SymCryptMlKemPolyElementNTTLayer( peSrc, 1, 128 );
843 SymCryptMlKemPolyElementNTTLayer( peSrc, 2, 64 );
844 SymCryptMlKemPolyElementNTTLayer( peSrc, 4, 32 );
845 SymCryptMlKemPolyElementNTTLayer( peSrc, 8, 16 );
846 SymCryptMlKemPolyElementNTTLayer( peSrc, 16, 8 );
847 SymCryptMlKemPolyElementNTTLayer( peSrc, 32, 4 );
848 SymCryptMlKemPolyElementNTTLayer( peSrc, 64, 2 );
849}
FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayer(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)

Referenced by SymCryptMlKemVectorNTT().

◆ SymCryptMlKemPolyElementNTTLayer()

FORCEINLINE VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayer ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
UINT32  k,
UINT32  len 
)

Definition at line 611 of file mlkem_primitives.c.

615{
616#if SYMCRYPT_CPU_X86
617 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
618 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
619 {
620 SymCryptMlKemPolyElementNTTLayerVec128( peSrc, k, len );
621 SymCryptRestoreXmm( &SaveData );
622 } else {
624 }
625#elif SYMCRYPT_CPU_AMD64
626 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
627 {
628 SymCryptMlKemPolyElementNTTLayerVec128( peSrc, k, len );
629 } else {
631 }
632#elif SYMCRYPT_CPU_ARM64
633 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
634 {
635 SymCryptMlKemPolyElementNTTLayerVec128( peSrc, k, len );
636 } else {
638 }
639#else
641#endif
642}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayerC(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 k, UINT32 len)

Referenced by SymCryptMlKemPolyElementNTT().

◆ SymCryptMlKemPolyElementNTTLayerC()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTTLayerC ( _Inout_ PSYMCRYPT_MLKEM_POLYELEMENT  peSrc,
UINT32  k,
UINT32  len 
)

Definition at line 546 of file mlkem_primitives.c.

550{
551 UINT32 start, j;
552 UINT32 twiddleFactor, twiddleFactorMont, c0, c1, c1TimesTwiddle;
553
554 for( start=0; start<256; start+=(2*len) )
555 {
556 twiddleFactor = MlKemZetaBitRevTimesR[k];
557 twiddleFactorMont = MlKemZetaBitRevTimesRTimesNegQInvModR[k];
558 k++;
559 for( j=0; j<len; j++ )
560 {
561 c0 = peSrc->coeffs[start+j];
563 c1 = peSrc->coeffs[start+j+len];
565
566 c1TimesTwiddle = SymCryptMlKemMontMul( c1, twiddleFactor, twiddleFactorMont );
567 c1 = SymCryptMlKemModSub( c0, c1TimesTwiddle );
568 c0 = SymCryptMlKemModAdd( c0, c1TimesTwiddle );
569
570 peSrc->coeffs[start+j] = (UINT16) c0;
571 peSrc->coeffs[start+j+len] = (UINT16) c1;
572 }
573 }
574}

Referenced by SymCryptMlKemPolyElementNTTLayer().

◆ SymCryptMlKemPolyElementSampleCBDFromBytes()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSampleCBDFromBytes ( _In_reads_bytes_(eta *2 *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)+1) PCBYTE  pbSrc,
_In_range_(2, 3) UINT32  eta,
_Out_ PSYMCRYPT_MLKEM_POLYELEMENT  peDst 
)

Definition at line 1081 of file mlkem_primitives.c.

1086{
1087 UINT32 i, j;
1088 UINT32 sampleBits;
1090
1091 SYMCRYPT_ASSERT((eta == 2) || (eta == 3));
1092 if( eta == 3 )
1093 {
1095 {
1096 // unconditionally load 4 bytes into sampleBits, but only treat the load
1097 // as being 3 bytes (24-bits -> 4 coefficients) for eta==3 to align to
1098 // byte boundaries. Source buffer must be 1 byte larger than shake output
1099 sampleBits = SYMCRYPT_LOAD_LSBFIRST32( pbSrc );
1100 pbSrc += 3;
1101
1102 // sum bit samples - each consecutive slice of eta bits is summed together
1103 sampleBits = (sampleBits&0x249249) + ((sampleBits>>1)&0x249249) + ((sampleBits>>2)&0x249249);
1104
1105 for( j=0; j<4; j++ )
1106 {
1107 // each coefficient is formed by taking the difference of two consecutive slices of eta bits
1108 // the first eta bits are positive, the second eta bits are negative
1109 coefficient = sampleBits & 0x3f;
1110 sampleBits >>= 6;
1111 coefficient = (coefficient&3) - (coefficient>>3);
1112 SYMCRYPT_ASSERT((coefficient >= ((UINT32)-3)) || (coefficient <= 3));
1113
1114 coefficient = coefficient + (SYMCRYPT_MLKEM_Q & (coefficient >> 16)); // in range [0, Q-1]
1116
1117 peDst->coeffs[i+j] = (UINT16) coefficient;
1118 }
1119 }
1120 }
1121 else
1122 {
1124 {
1125 // unconditionally load 4 bytes (32-bits -> 8 coefficients) into sampleBits
1126 sampleBits = SYMCRYPT_LOAD_LSBFIRST32( pbSrc );
1127 pbSrc += 4;
1128
1129 // sum bit samples - each consecutive slice of eta bits is summed together
1130 sampleBits = (sampleBits&0x55555555) + ((sampleBits>>1)&0x55555555);
1131
1132 for( j=0; j<8; j++ )
1133 {
1134 // each coefficient is formed by taking the difference of two consecutive slices of eta bits
1135 // the first eta bits are positive, the second eta bits are negative
1136 coefficient = sampleBits & 0xf;
1137 sampleBits >>= 4;
1138 coefficient = (coefficient&3) - (coefficient>>2);
1139 SYMCRYPT_ASSERT((coefficient >= ((UINT32)-2)) || (coefficient <= 2));
1140
1141 coefficient = coefficient + (SYMCRYPT_MLKEM_Q & (coefficient >> 16)); // in range [0, Q-1]
1143
1144 peDst->coeffs[i+j] = (UINT16) coefficient;
1145 }
1146 }
1147 }
1148}

Referenced by SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemkeyExpandFromPrivateSeed().

◆ SymCryptMlKemPolyElementSampleNTTFromShake128()

VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSampleNTTFromShake128 ( _Inout_ PSYMCRYPT_SHAKE128_STATE  pState,
_Out_ PSYMCRYPT_MLKEM_POLYELEMENT  peDst 
)

Definition at line 1046 of file mlkem_primitives.c.

1049{
1050 UINT32 i=0;
1051 BYTE shakeOutputBuf[3*8]; // Keccak likes extracting multiples of 8-bytes
1052 UINT32 currBufIndex = sizeof(shakeOutputBuf);
1053 UINT16 sample0, sample1;
1054
1056 {
1057 SYMCRYPT_ASSERT(currBufIndex <= sizeof(shakeOutputBuf));
1058 if( currBufIndex == sizeof(shakeOutputBuf) )
1059 {
1060 SymCryptShake128Extract(pState, shakeOutputBuf, sizeof(shakeOutputBuf), FALSE);
1061 currBufIndex = 0;
1062 }
1063
1064 sample0 = SYMCRYPT_LOAD_LSBFIRST16( shakeOutputBuf+currBufIndex ) & 0xfff;
1065 sample1 = SYMCRYPT_LOAD_LSBFIRST16( shakeOutputBuf+currBufIndex+1 ) >> 4;
1066 currBufIndex += 3;
1067
1068 peDst->coeffs[i] = sample0;
1069 i += sample0 < SYMCRYPT_MLKEM_Q;
1070
1072 {
1073 peDst->coeffs[i] = sample1;
1074 i += sample1 < SYMCRYPT_MLKEM_Q;
1075 }
1076 }
1077}
#define SYMCRYPT_LOAD_LSBFIRST16(p)
Definition: symcrypt.h:298
VOID SYMCRYPT_CALL SymCryptShake128Extract(_Inout_ PSYMCRYPT_SHAKE128_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
PSYMCRYPT_COMMON_HASH_STATE pState
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptMlKemkeyExpandPublicMatrixFromPublicSeed().

◆ SymCryptMlKemPolyElementSub()

Definition at line 825 of file mlkem_primitives.c.

829{
830 UINT32 i;
832 {
833 peDst->coeffs[i] = (UINT16) SymCryptMlKemModSub( peSrc1->coeffs[i], peSrc2->coeffs[i] );
834 }
835}

Referenced by SymCryptMlKemDecapsulate(), and SymCryptMlKemVectorSub().

◆ SymCryptMlKemVectorAdd()

VOID SYMCRYPT_CALL SymCryptMlKemVectorAdd ( _In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc1,
_In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc2,
_Out_ PSYMCRYPT_MLKEM_VECTOR  pvDst 
)

Definition at line 1276 of file mlkem_primitives.c.

1280{
1281 UINT32 i;
1282 const UINT32 nRows = pvSrc1->nRows;
1283 PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, peSrc2;
1285
1286 SYMCRYPT_ASSERT( nRows > 0 );
1288 SYMCRYPT_ASSERT( pvSrc2->nRows == nRows );
1289 SYMCRYPT_ASSERT( pvDst->nRows == nRows );
1290
1291 for( i=0; i<nRows; i++ )
1292 {
1293 peSrc1 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc1 );
1294 peSrc2 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc2 );
1295 peDst = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvDst );
1296 SymCryptMlKemPolyElementAdd( peSrc1, peSrc2, peDst );
1297 }
1298}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementAdd(_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)

◆ SymCryptMlKemVectorCompressAndEncode()

VOID SYMCRYPT_CALL SymCryptMlKemVectorCompressAndEncode ( _In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc,
UINT32  nBitsPerCoefficient,
_Out_writes_bytes_(cbDst) PBYTE  pbDst,
SIZE_T  cbDst 
)

Definition at line 1362 of file mlkem_primitives.c.

1367{
1368 UINT32 i;
1369 const UINT32 nRows = pvSrc->nRows;
1371
1372 SYMCRYPT_ASSERT( nRows > 0 );
1374 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
1375 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 12 );
1376 SYMCRYPT_ASSERT( cbDst == nRows*nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8) );
1377
1378 UNREFERENCED_PARAMETER( cbDst );
1379
1380 for( i=0; i<nRows; i++ )
1381 {
1382 peSrc = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc );
1383 SymCryptMlKemPolyElementCompressAndEncode( peSrc, nBitsPerCoefficient, pbDst );
1384 pbDst += nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8);
1385 }
1386}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementCompressAndEncode(_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc, UINT32 nBitsPerCoefficient, _Out_writes_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PBYTE pbDst)

Referenced by SymCryptMlKemEncapsulateInternal(), SymCryptMlKemkeyExpandFromPrivateSeed(), and SymCryptMlKemkeyGetValue().

◆ SymCryptMlKemVectorCreate()

PSYMCRYPT_MLKEM_VECTOR SYMCRYPT_CALL SymCryptMlKemVectorCreate ( _Out_writes_bytes_(cbBuffer) PBYTE  pbBuffer,
UINT32  cbBuffer,
UINT32  nRows 
)

Definition at line 156 of file mlkem_primitives.c.

160{
164 UINT32 i;
165 PBYTE pbTmp = pbBuffer + sizeof(SYMCRYPT_MLKEM_VECTOR);
166
168
169 SYMCRYPT_ASSERT( nRows > 0 );
171
172 pVector->nRows = nRows;
173 pVector->cbTotalSize = cbBuffer;
174
175 for( i=0; i<nRows; i++ )
176 {
178 if( peTmp == NULL )
179 {
180 goto cleanup;
181 }
182
184 }
185
186 SYMCRYPT_ASSERT( pbTmp == (pbBuffer + cbBuffer) );
187
188 pDst = pVector;
189
190cleanup:
191 return pDst;
192}
* PSYMCRYPT_MLKEM_VECTOR
Definition: sc_lib_mlkem.h:37
SYMCRYPT_MLKEM_VECTOR
Definition: sc_lib_mlkem.h:37

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), SymCryptMlKemkeyExpandFromPrivateSeed(), and SymCryptMlKemkeyInitialize().

◆ SymCryptMlKemVectorDecodeAndDecompress()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlKemVectorDecodeAndDecompress ( _In_reads_bytes_(cbSrc) PCBYTE  pbSrc,
SIZE_T  cbSrc,
UINT32  nBitsPerCoefficient,
_Out_ PSYMCRYPT_MLKEM_VECTOR  pvDst 
)

Definition at line 1390 of file mlkem_primitives.c.

1395{
1396 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1397 UINT32 i;
1398 const UINT32 nRows = pvDst->nRows;
1400
1401 SYMCRYPT_ASSERT( nRows > 0 );
1403 SYMCRYPT_ASSERT( nBitsPerCoefficient > 0 );
1404 SYMCRYPT_ASSERT( nBitsPerCoefficient <= 12 );
1405 SYMCRYPT_ASSERT( cbSrc == nRows*nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8) );
1406
1407 UNREFERENCED_PARAMETER( cbSrc );
1408
1409 for( i=0; i<nRows; i++ )
1410 {
1411 peDst = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvDst );
1412 scError = SymCryptMlKemPolyElementDecodeAndDecompress( pbSrc, nBitsPerCoefficient, peDst );
1413 if( scError != SYMCRYPT_NO_ERROR )
1414 {
1415 goto cleanup;
1416 }
1417 pbSrc += nBitsPerCoefficient*(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS / 8);
1418 }
1419
1420cleanup:
1421 return scError;
1422}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlKemPolyElementDecodeAndDecompress(_In_reads_bytes_(nBitsPerCoefficient *(SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS/8)) PCBYTE pbSrc, UINT32 nBitsPerCoefficient, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)
SYMCRYPT_ERROR
Definition: symcrypt.h:227

Referenced by SymCryptMlKemDecapsulate(), and SymCryptMlKemkeySetValue().

◆ SymCryptMlKemVectorINTTAndMulR()

VOID SYMCRYPT_CALL SymCryptMlKemVectorINTTAndMulR ( _Inout_ PSYMCRYPT_MLKEM_VECTOR  pvSrc)

Definition at line 1345 of file mlkem_primitives.c.

1347{
1348 UINT32 i;
1349 const UINT32 nRows = pvSrc->nRows;
1350
1351 SYMCRYPT_ASSERT( nRows > 0 );
1353
1354 for( i=0; i<nRows; i++ )
1355 {
1357 }
1358}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementINTTAndMulR(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc)

Referenced by SymCryptMlKemEncapsulateInternal().

◆ SymCryptMlKemVectorMontDotProduct()

Definition at line 1211 of file mlkem_primitives.c.

1216{
1217 UINT32 i;
1218 const UINT32 nRows = pvSrc1->nRows;
1219 PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, peSrc2;
1220
1221 SYMCRYPT_ASSERT( nRows > 0 );
1223 SYMCRYPT_ASSERT( pvSrc2->nRows == nRows );
1224
1225 // Zero paTmp and peDst
1228
1229 for( i=0; i<nRows; i++ )
1230 {
1231 peSrc1 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc1 );
1232 peSrc2 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc2 );
1233 SymCryptMlKemPolyElementMulAndAccumulate( peSrc1, peSrc2, paTmp );
1234 }
1235
1236 // write accumulator to dest and zero accumulator
1238}

Referenced by SymCryptMlKemDecapsulate(), and SymCryptMlKemEncapsulateInternal().

◆ SymCryptMlKemVectorMulR()

VOID SYMCRYPT_CALL SymCryptMlKemVectorMulR ( _In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc,
_Out_ PSYMCRYPT_MLKEM_VECTOR  pvDst 
)

Definition at line 1255 of file mlkem_primitives.c.

1258{
1259 UINT32 i;
1260 const UINT32 nRows = pvSrc->nRows;
1261
1262 SYMCRYPT_ASSERT( nRows > 0 );
1264 SYMCRYPT_ASSERT( pvDst->nRows == nRows );
1265
1266 for( i=0; i<nRows; i++ )
1267 {
1271 }
1272}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementMulR(_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)

Referenced by SymCryptMlKemkeyExpandFromPrivateSeed().

◆ SymCryptMlKemVectorNTT()

VOID SYMCRYPT_CALL SymCryptMlKemVectorNTT ( _Inout_ PSYMCRYPT_MLKEM_VECTOR  pvSrc)

Definition at line 1328 of file mlkem_primitives.c.

1330{
1331 UINT32 i;
1332 const UINT32 nRows = pvSrc->nRows;
1333
1334 SYMCRYPT_ASSERT( nRows > 0 );
1336
1337 for( i=0; i<nRows; i++ )
1338 {
1340 }
1341}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementNTT(_Inout_ PSYMCRYPT_MLKEM_POLYELEMENT peSrc)

Referenced by SymCryptMlKemDecapsulate(), SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemkeyExpandFromPrivateSeed().

◆ SymCryptMlKemVectorSetZero()

VOID SYMCRYPT_CALL SymCryptMlKemVectorSetZero ( _Inout_ PSYMCRYPT_MLKEM_VECTOR  pvSrc)

Definition at line 1242 of file mlkem_primitives.c.

1244{
1245 const UINT32 nRows = pvSrc->nRows;
1246
1247 SYMCRYPT_ASSERT( nRows > 0 );
1249
1251}
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137

Referenced by SymCryptMlKemEncapsulateInternal(), and SymCryptMlKemkeyWipePrivateState().

◆ SymCryptMlKemVectorSub()

VOID SYMCRYPT_CALL SymCryptMlKemVectorSub ( _In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc1,
_In_ PCSYMCRYPT_MLKEM_VECTOR  pvSrc2,
_Out_ PSYMCRYPT_MLKEM_VECTOR  pvDst 
)

Definition at line 1302 of file mlkem_primitives.c.

1306{
1307 UINT32 i;
1308 const UINT32 nRows = pvSrc1->nRows;
1309 PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, peSrc2;
1311
1312 SYMCRYPT_ASSERT( nRows > 0 );
1314 SYMCRYPT_ASSERT( pvSrc2->nRows == nRows );
1315 SYMCRYPT_ASSERT( pvDst->nRows == nRows );
1316
1317 for( i=0; i<nRows; i++ )
1318 {
1319 peSrc1 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc1 );
1320 peSrc2 = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvSrc2 );
1321 peDst = SYMCRYPT_INTERNAL_MLKEM_VECTOR_ELEMENT( i, pvDst );
1322 SymCryptMlKemPolyElementSub( peSrc1, peSrc2, peDst );
1323 }
1324}
VOID SYMCRYPT_CALL SymCryptMlKemPolyElementSub(_In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc1, _In_ PCSYMCRYPT_MLKEM_POLYELEMENT peSrc2, _Out_ PSYMCRYPT_MLKEM_POLYELEMENT peDst)

Variable Documentation

◆ MlKemZetaBitRevTimesR

const UINT16 MlKemZetaBitRevTimesR[128]
Initial value:
=
{
2285, 2571, 2970, 1812, 1493, 1422, 287, 202,
3158, 622, 1577, 182, 962, 2127, 1855, 1468,
573, 2004, 264, 383, 2500, 1458, 1727, 3199,
2648, 1017, 732, 608, 1787, 411, 3124, 1758,
1223, 652, 2777, 1015, 2036, 1491, 3047, 1785,
516, 3321, 3009, 2663, 1711, 2167, 126, 1469,
2476, 3239, 3058, 830, 107, 1908, 3082, 2378,
2931, 961, 1821, 2604, 448, 2264, 677, 2054,
2226, 430, 555, 843, 2078, 871, 1550, 105,
422, 587, 177, 3094, 3038, 2869, 1574, 1653,
3083, 778, 1159, 3182, 2552, 1483, 2727, 1119,
1739, 644, 2457, 349, 418, 329, 3173, 3254,
817, 1097, 603, 610, 1322, 2044, 1864, 384,
2114, 3193, 1218, 1994, 2455, 220, 2142, 1670,
2144, 1799, 2051, 794, 1819, 2475, 2459, 478,
3221, 3021, 996, 991, 958, 1869, 1522, 1628,
}

Definition at line 54 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementINTTLayerC(), and SymCryptMlKemPolyElementNTTLayerC().

◆ MlKemZetaBitRevTimesRTimesNegQInvModR

const UINT16 MlKemZetaBitRevTimesRTimesNegQInvModR[128]
Initial value:
=
{
19, 34037, 50790, 64748, 52011, 12402, 37345, 16694,
20906, 37778, 3799, 15690, 54846, 64177, 11201, 34372,
5827, 48172, 26360, 29057, 59964, 1102, 44097, 26241,
28072, 41223, 10532, 56736, 47109, 56677, 38860, 16162,
5689, 6516, 64039, 34569, 23564, 45357, 44825, 40455,
12796, 38919, 49471, 12441, 56401, 649, 25986, 37699,
45652, 28249, 15886, 8898, 28309, 56460, 30198, 47286,
52109, 51519, 29155, 12756, 48704, 61224, 24155, 17914,
334, 54354, 11477, 52149, 32226, 14233, 45042, 21655,
27738, 52405, 64591, 4586, 14882, 42443, 59354, 60043,
33525, 32502, 54905, 35218, 36360, 18741, 28761, 52897,
18485, 45436, 47975, 47011, 14430, 46007, 5275, 12618,
31183, 45239, 40101, 63390, 7382, 50180, 41144, 32384,
20926, 6279, 54590, 14902, 41321, 11044, 48546, 51066,
55200, 21497, 7933, 20198, 22501, 42325, 54629, 17442,
33899, 23859, 36892, 20257, 41538, 57779, 17422, 42404,
}

Definition at line 78 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementINTTLayerC(), and SymCryptMlKemPolyElementNTTLayerC().

◆ SYMCRYPT_MLKEM_COMPRESS_MULCONSTANT

const UINT32 SYMCRYPT_MLKEM_COMPRESS_MULCONSTANT = 0x275f6f

Definition at line 885 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementCompressAndEncode().

◆ SYMCRYPT_MLKEM_COMPRESS_SHIFTCONSTANT

const UINT32 SYMCRYPT_MLKEM_COMPRESS_SHIFTCONSTANT = 33

Definition at line 886 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementCompressAndEncode().

◆ SYMCRYPT_MLKEM_INTTFixupTimesRsqr

const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqr = 1441

Definition at line 854 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementINTTAndMulR().

◆ SYMCRYPT_MLKEM_INTTFixupTimesRsqrTimesNegQInvModR

const UINT32 SYMCRYPT_MLKEM_INTTFixupTimesRsqrTimesNegQInvModR = 10079

Definition at line 855 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementINTTAndMulR().

◆ SYMCRYPT_MLKEM_NegQInvModR

◆ SYMCRYPT_MLKEM_Rlog2

◆ SYMCRYPT_MLKEM_Rmask

◆ SYMCRYPT_MLKEM_Rsqr

const UINT32 SYMCRYPT_MLKEM_Rsqr = 1353

Definition at line 37 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementMulR().

◆ SYMCRYPT_MLKEM_RsqrTimesNegQInvModR

const UINT32 SYMCRYPT_MLKEM_RsqrTimesNegQInvModR = 44983

Definition at line 39 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementMulR().

◆ zetaTwoTimesBitRevPlus1TimesR

const UINT16 zetaTwoTimesBitRevPlus1TimesR[128]
Initial value:
=
{
2226, 1103, 430, 2899, 555, 2774, 843, 2486,
2078, 1251, 871, 2458, 1550, 1779, 105, 3224,
422, 2907, 587, 2742, 177, 3152, 3094, 235,
3038, 291, 2869, 460, 1574, 1755, 1653, 1676,
3083, 246, 778, 2551, 1159, 2170, 3182, 147,
2552, 777, 1483, 1846, 2727, 602, 1119, 2210,
1739, 1590, 644, 2685, 2457, 872, 349, 2980,
418, 2911, 329, 3000, 3173, 156, 3254, 75,
817, 2512, 1097, 2232, 603, 2726, 610, 2719,
1322, 2007, 2044, 1285, 1864, 1465, 384, 2945,
2114, 1215, 3193, 136, 1218, 2111, 1994, 1335,
2455, 874, 220, 3109, 2142, 1187, 1670, 1659,
2144, 1185, 1799, 1530, 2051, 1278, 794, 2535,
1819, 1510, 2475, 854, 2459, 870, 478, 2851,
3221, 108, 3021, 308, 996, 2333, 991, 2338,
958, 2371, 1869, 1460, 1522, 1807, 1628, 1701,
}

Definition at line 102 of file mlkem_primitives.c.

Referenced by SymCryptMlKemPolyElementMulAndAccumulate().