ReactOS 0.4.17-dev-1005-g171e1de
fdef369_mod.c
Go to the documentation of this file.
1//
2// fdef_int.c INT functions for default number format
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#include "precomp.h"
8
9#if (SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64)
10
11#if !(SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64)
12#error code in this file is specific to normal digits being 4 64-bit words, and here 3 64-bit words
13#endif
14
15//
16// Some of the functions in this file need to know how large the values are in # UINT32s
17// On ARM64, normal digits are 256 bits and 369 digits are 192 bits, so the answer is 6 * # digits
18// On AMD64, normal digits are 512 bits, and this code is only used for 384 and 576 bits.
19// So if nDigits = 1 then nUint32 = 12, and if nDigits=2 then nUint32 = 18.
20//
21#if SYMCRYPT_CPU_AMD64
22#define SYMCRYPT_FDEF369_DIGITS_TO_NUINT32( nD ) (((nD) + 1) * 6)
23#elif SYMCRYPT_CPU_ARM64
24#define SYMCRYPT_FDEF369_DIGITS_TO_NUINT32( nD ) ((nD) * 6)
25#else
26#error ??
27#endif
28
29VOID
38{
39 UINT32 c;
40 UINT32 d;
41 UINT32 nDigits = pmMod->nDigits;
42
45
46 //
47 // Doing add/cmp/sub might be faster or not.
48 // Masked add is hard because the mask operations destroy the carry flag.
49 //
50 // dcl - cleanup?
51// c = SymCryptFdefRawAdd( &pSrc1->uint32[0], &pSrc2->uint32[0], &pDst->uint32[0], nDigits);
52// d = SymCryptFdefRawSub( &pDst->uint32[0], &pMod->Divisor.Int.uint32[0], &pDst->uint32[0], nDigits );
53// e = SymCryptFdefRawMaskedAdd( &pDst->uint32[0], &pMod->Divisor.Int.uint32[0], 0 - (c^d), nDigits );
54
55 c = SymCryptFdef369RawAddAsm( &peSrc1->d.uint32[0], &peSrc2->d.uint32[0], &peDst->d.uint32[0], nDigits );
56 d = SymCryptFdef369RawSubAsm( &peDst->d.uint32[0], SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), (PUINT32) pbScratch, nDigits );
57 SymCryptFdef369MaskedCopyAsm( pbScratch, (PBYTE) &peDst->d.uint32[0], nDigits, (c^d) - 1 );
58
59 // We can't have a carry in the first addition, and no carry in the subtraction.
60 SYMCRYPT_ASSERT( !( c == 1 && d == 0 ) );
61}
62
63
64VOID
73{
74 UINT32 c;
75 UINT32 d;
76 UINT32 nDigits = pmMod->nDigits;
77
80
81 c = SymCryptFdef369RawSubAsm( &peSrc1->d.uint32[0], &peSrc2->d.uint32[0], &peDst->d.uint32[0], nDigits );
82 d = SymCryptFdef369RawAddAsm( &peDst->d.uint32[0], SYMCRYPT_FDEF_INT_PUINT32( &pmMod->Divisor.Int ), (PUINT32) pbScratch, nDigits );
83 SymCryptFdef369MaskedCopyAsm( pbScratch, (PBYTE) &peDst->d.uint32[0], nDigits, 0 - c );
84
85 SYMCRYPT_ASSERT( !(c == 1 && d == 0) );
86}
87
88VOID
94{
95 SymCryptFdefModulusInitMontgomeryInternal( pmMod, SYMCRYPT_FDEF369_DIGITS_TO_NUINT32( pmMod->nDigits ), pbScratch, cbScratch );
96}
97
98VOID
107{
108 UINT32 nDigits = pmMod->nDigits;
109 PUINT32 pTmp = (PUINT32) pbScratch;
110
113
114 SymCryptFdef369RawMul( &peSrc1->d.uint32[0], nDigits, &peSrc2->d.uint32[0], nDigits, pTmp );
115 SymCryptFdef369MontgomeryReduce( pmMod, pTmp, &peDst->d.uint32[0] );
116}
117
118VOID
126{
127 SymCryptFdef369ModMulMontgomery( pmMod, peSrc, peSrc, peDst, pbScratch, cbScratch );
128}
129
130VOID
137{
138 // Montgomery representation for X is R*X mod M where R = 2^<nDigits * bits-per-digit>
139 // Montgomery reduction performs an implicit division by R
140 // This function converts to the internal representation by multiplying by R^2 mod M and then performing a Montgomery reduction
141 UINT32 nDigits = pmMod->nDigits;
142
143 // dcl - release mode check?
146
147 SymCryptFdef369RawMul( &peObj->d.uint32[0], nDigits, pmMod->tm.montgomery.Rsqr, nDigits, (PUINT32) pbScratch );
148 SymCryptFdef369MontgomeryReduce( pmMod, (PUINT32) pbScratch, &peObj->d.uint32[0] );
149}
150
158{
159 PUINT32 pTmp = (PUINT32) pbScratch;
160 UINT32 nDigits = pmMod->nDigits;
161 UINT32 nUint32 = SYMCRYPT_FDEF369_DIGITS_TO_NUINT32( nDigits );
162
163 // dcl - release mode check?
166
167 memcpy( pTmp, &peObj->d.uint32[0], nUint32 * sizeof( UINT32 ) );
168 SymCryptWipe( pTmp + nUint32, nUint32 * sizeof( UINT32 ) );
169 SymCryptFdef369MontgomeryReduce( pmMod, pTmp, pTmp );
170
171 // This gives the right result, but it isn't the size that is expected.
172 // Wipe the extra bytes
173 SymCryptWipe( pTmp + nUint32, nDigits * SYMCRYPT_FDEF_DIGIT_SIZE - nUint32 * sizeof( UINT32 ) );
174
175 return pTmp;
176}
177
178VOID
181 _Inout_ PUINT32 pSrc,
182 _Out_ PUINT32 pDst )
183{
184 SymCryptFdef369MontgomeryReduceAsm( pmMod, pSrc, pDst );
185}
186
187VOID
191 UINT32 nDigits1,
193 UINT32 nDigits2,
194 _Out_writes_((nDigits1+nDigits2)*SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst )
195{
196 SymCryptFdef369RawMulAsm( pSrc1, nDigits1, pSrc2, nDigits2, pDst );
197}
198
208{
209 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
210 UINT32 nDigits = pmMod->nDigits;
211 UINT32 nBytes = SYMCRYPT_FDEF369_DIGITS_TO_NUINT32( nDigits ) * sizeof( UINT32 );
212 PUINT32 pTmp = (PUINT32) pbScratch;
213
215 SYMCRYPT_ASSERT( cbScratch >= 2 * nBytes );
216
217 //
218 // We have R*X; we first apply the montgomery reduction twice to get X/R, and then invert that
219 // using the generic inversion to get R/X.
220 //
221 memcpy( pTmp, &peSrc->d.uint32[0], nBytes );
222
223 SymCryptWipe( (PBYTE)pTmp + nBytes, nBytes );
224 SymCryptFdef369MontgomeryReduce( pmMod, pTmp, pTmp );
225
226 SymCryptWipe( (PBYTE)pTmp + nBytes, nBytes );
227 SymCryptFdef369MontgomeryReduce( pmMod, pTmp, &peDst->d.uint32[0] );
228
229 scError = SymCryptFdefModInvGeneric( pmMod, peDst, peDst, flags, pbScratch, cbScratch );
230
231 return scError;
232}
233
234
235#endif // CPU_AMD64
unsigned int * PUINT32
Definition: basetsd.h:119
VOID SYMCRYPT_CALL SymCryptFdefClaimScratch(PBYTE pbScratch, SIZE_T cbScratch, SIZE_T cbMin)
Definition: fdef_general.c:912
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdefModInvGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:960
VOID SYMCRYPT_CALL SymCryptFdefModulusInitMontgomeryInternal(_Inout_ PSYMCRYPT_MODULUS pmMod, UINT32 nUint32Used, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: fdef_mod.c:1152
const GLubyte * c
Definition: glext.h:8905
GLbitfield flags
Definition: glext.h:7161
#define d
Definition: ke_i.h:81
#define c
Definition: ke_i.h:80
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
BYTE * PBYTE
Definition: pedump.c:66
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptFdef369ModInvMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369MaskedCopyAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
Definition: sc_lib.h:1912
VOID SYMCRYPT_CALL SymCryptFdef369ModMulMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc1, _In_ PCSYMCRYPT_MODELEMENT pSrc2, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PCUINT32 SYMCRYPT_CALL SymCryptFdef369ModPreGetMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptFdef369RawSubAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 pSrc2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 pDst, UINT32 nDigits)
VOID SYMCRYPT_CALL SymCryptFdef369ModAddGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369RawMulAsm(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
VOID SYMCRYPT_CALL SymCryptFdef369RawMul(_In_reads_(nDigits1 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits1, _In_reads_(nDigits2 *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc2, UINT32 nDigits2, _Out_writes_((nDigits1+nDigits2) *SYMCRYPT_FDEF_DIGIT_NUINT32) PUINT32 pDst)
VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduce(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
VOID SYMCRYPT_CALL SymCryptFdef369ModulusInitMontgomery(_Inout_ PSYMCRYPT_MODULUS pmObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModSetPostMontgomery(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PSYMCRYPT_MODELEMENT peObj, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369ModSubGeneric(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptFdef369MontgomeryReduceAsm(_In_ PCSYMCRYPT_MODULUS pmMod, _Inout_ PUINT32 pSrc, _Out_ PUINT32 pDst)
#define SYMCRYPT_FDEF_DIGIT_NUINT32
Definition: sc_lib.h:1916
UINT32 SYMCRYPT_CALL SymCryptFdef369RawAddAsm(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src1, _In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCUINT32 Src2, _Out_writes_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PUINT32 Dst, UINT32 nDigits)
VOID SYMCRYPT_CALL SymCryptFdef369ModSquareMontgomery(_In_ PCSYMCRYPT_MODULUS pMod, _In_ PCSYMCRYPT_MODELEMENT pSrc, _Out_ PSYMCRYPT_MODELEMENT pDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
SYMCRYPT_ERROR
Definition: symcrypt.h:227
#define SYMCRYPT_CALL
const SYMCRYPT_MODELEMENT * PCSYMCRYPT_MODELEMENT
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_FDEF_DIGIT_SIZE
const SYMCRYPT_MODULUS * PCSYMCRYPT_MODULUS
#define SYMCRYPT_FDEF_INT_PUINT32(p)
const UINT32 * PCUINT32
SYMCRYPT_MODULUS * PSYMCRYPT_MODULUS
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59