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

Go to the source code of this file.

Functions

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsFillScratchSpaces (_In_ PSYMCRYPT_ECURVE pCurve)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetDistinguished (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsOnCurve (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsDouble (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAdd (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsAddDiffNonZero (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
UINT32 SYMCRYPT_CALL SymCryptTwistedEdwardsIsEqual (_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc1, _In_ PCSYMCRYPT_ECPOINT poSrc2, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsSetZero (_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 
VOID SYMCRYPT_CALL SymCryptTwistedEdwardsNegate (_In_ PCSYMCRYPT_ECURVE pCurve, _Inout_ PSYMCRYPT_ECPOINT poSrc, UINT32 mask, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
 

Function Documentation

◆ SymCryptTwistedEdwardsAdd()

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

Definition at line 313 of file ec_twisted_edwards.c.

322{
323 PSYMCRYPT_MODELEMENT peTemp[8];
324 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
325 SIZE_T nBytes;
326
328 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc1->pCurve) && SymCryptEcurveIsSame(pCurve, poSrc2->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
330
332
333 nBytes = SymCryptSizeofModElementFromModulus( pmMod );
334
335 SYMCRYPT_ASSERT( cbScratch >= 8*nBytes );
336
337 for (UINT32 i = 0; i < 8; ++i)
338 {
339 peTemp[i] = SymCryptModElementCreate( pbScratch, nBytes, pmMod );
340 pbScratch += nBytes;
341 cbScratch -= nBytes;
342 }
343
348
353
358
359 PSYMCRYPT_MODELEMENT peA = peTemp[0];
360 PSYMCRYPT_MODELEMENT peB = peTemp[1];
361 PSYMCRYPT_MODELEMENT peC = peTemp[2];
362 PSYMCRYPT_MODELEMENT peD = peTemp[3];
363 PSYMCRYPT_MODELEMENT peE = peTemp[4];
364 PSYMCRYPT_MODELEMENT peF = peTemp[5];
365 PSYMCRYPT_MODELEMENT peG = peTemp[6];
366 PSYMCRYPT_MODELEMENT peH = peTemp[7];
367
368 // A = X1 * X2
369 SymCryptModMul( pmMod, peSrc1X, peSrc2X, peA, pbScratch, cbScratch );
370
371 // B = Y1 * Y2
372 SymCryptModMul( pmMod, peSrc1Y, peSrc2Y, peB, pbScratch, cbScratch );
373
374 // C1 = T1 * T2
375 SymCryptModMul( pmMod, peSrc1T, peSrc2T, peC, pbScratch, cbScratch );
376
377 // C = d * C1 = d * T1 * T2
378 SymCryptModMul( pmMod, pCurve->B, peC, peC, pbScratch, cbScratch );
379
380 // D = Z1 * Z2
381 SymCryptModMul( pmMod, peSrc1Z, peSrc2Z, peD, pbScratch, cbScratch );
382
383 // E1 = X1 + Y1
384 SymCryptModAdd( pmMod, peSrc1X, peSrc1Y, peE, pbScratch, cbScratch );
385
386 // E2 = X2 + Y2
387 SymCryptModAdd( pmMod, peSrc2X, peSrc2Y, peF, pbScratch, cbScratch );
388
389 // E = E * F
390 SymCryptModMul( pmMod, peE, peF, peE, pbScratch, cbScratch );
391
392 // E = E - A
393 SymCryptModSub( pmMod, peE, peA, peE, pbScratch, cbScratch );
394
395 // E = E - B
396 SymCryptModSub( pmMod, peE, peB, peE, pbScratch, cbScratch );
397
398 // F = D - C
399 SymCryptModSub( pmMod, peD, peC, peF, pbScratch, cbScratch );
400
401 // G = D + C
402 SymCryptModAdd( pmMod, peD, peC, peG, pbScratch, cbScratch );
403
404 // H = a * A
405 SymCryptModMul( pmMod, pCurve->A, peA, peH, pbScratch, cbScratch );
406
407 // H = B - a * A
408 SymCryptModSub( pmMod, peB, peH, peH, pbScratch, cbScratch );
409
410 // X3 = E * F
411 SymCryptModMul( pmMod, peE, peF, peDstX, pbScratch, cbScratch );
412
413 // Y3 = G * H
414 SymCryptModMul( pmMod, peG, peH, peDstY, pbScratch, cbScratch );
415
416 // T3 = E * H
417 SymCryptModMul( pmMod, peE, peH, peDstT, pbScratch, cbScratch );
418
419 // Y3 = F * G
420 SymCryptModMul( pmMod, peF, peG, peDstZ, pbScratch, cbScratch );
421}
GLbitfield flags
Definition: glext.h:7161
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
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
BOOLEAN SYMCRYPT_CALL SymCryptEcurveIsSame(_In_ PCSYMCRYPT_ECURVE pCurve1, _In_ PCSYMCRYPT_ECURVE pCurve2)
Definition: ecurve.c:745
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
PCSYMCRYPT_ECURVE pCurve
#define SYMCRYPT_INTERNAL_ECPOINT_COORDINATE(_ord, _pCurve, _pEcpoint)
#define SYMCRYPT_CURVE_IS_TWISTED_EDWARDS_TYPE(_pCurve)
#define SYMCRYPT_INTERNAL_SCRATCH_BYTES_FOR_COMMON_ECURVE_OPERATIONS(_pCurve)
PSYMCRYPT_MODELEMENT peG
SYMCRYPT_MODULUS * PSYMCRYPT_MODULUS
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:658
VOID SYMCRYPT_CALL SymCryptModSub(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:852
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:665
VOID SYMCRYPT_CALL SymCryptModMul(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:867
VOID SYMCRYPT_CALL SymCryptModAdd(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:838
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptTwistedEdwardsAddDiffNonZero().

◆ SymCryptTwistedEdwardsAddDiffNonZero()

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

Definition at line 425 of file ec_twisted_edwards.c.

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

◆ SymCryptTwistedEdwardsDouble()

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

Definition at line 195 of file ec_twisted_edwards.c.

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

◆ SymCryptTwistedEdwardsFillScratchSpaces()

VOID SYMCRYPT_CALL SymCryptTwistedEdwardsFillScratchSpaces ( _In_ PSYMCRYPT_ECURVE  pCurve)

Definition at line 11 of file ec_twisted_edwards.c.

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

◆ SymCryptTwistedEdwardsIsEqual()

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

Definition at line 447 of file ec_twisted_edwards.c.

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

◆ SymCryptTwistedEdwardsIsZero()

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

Definition at line 78 of file ec_twisted_edwards.c.

84{
85 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
86 UINT32 dResX = 0, dResY = 0;
87
90
91 UNREFERENCED_PARAMETER( pbScratch );
93
97
98 dResX = SymCryptModElementIsZero( pmMod, peSrcX );
99 dResY = SymCryptModElementIsEqual( pmMod, peSrcY, peSrcZ );
100
101 return ( dResX & dResY );
102}
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
Definition: a_dispatch.c:828

◆ SymCryptTwistedEdwardsNegate()

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

Definition at line 543 of file ec_twisted_edwards.c.

550{
554
556
560
562 pbScratch,
563 pCurve->cbModElement,
564 FMod );
565 SYMCRYPT_ASSERT( peTmp != NULL);
566
567 pbScratch += pCurve->cbModElement;
568 cbScratch -= pCurve->cbModElement;
569
570 SymCryptModNeg( FMod, peX, peTmp, pbScratch, cbScratch );
571 SymCryptModElementMaskedCopy( FMod, peTmp, peX, mask );
572
573 SymCryptModNeg( FMod, peT, peTmp, pbScratch, cbScratch );
574 SymCryptModElementMaskedCopy( FMod, peTmp, peT, mask );
575}
#define NULL
Definition: types.h:112
GLenum GLint GLuint mask
Definition: glext.h:6028
PSYMCRYPT_MODULUS FMod
const SYMCRYPT_MODULUS * PCSYMCRYPT_MODULUS
VOID SymCryptModElementMaskedCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 mask)
Definition: a_dispatch.c:692

◆ SymCryptTwistedEdwardsOnCurve()

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

Definition at line 113 of file ec_twisted_edwards.c.

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

◆ SymCryptTwistedEdwardsSetDistinguished()

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

Definition at line 60 of file ec_twisted_edwards.c.

66{
69
70 UNREFERENCED_PARAMETER( pbScratch );
72
73 SymCryptEcpointCopy( pCurve, pCurve->G, poDst );
74}
VOID SymCryptEcpointCopy(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst)
Definition: ecpoint.c:173

◆ SymCryptTwistedEdwardsSetZero()

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

Definition at line 517 of file ec_twisted_edwards.c.

523{
527
528 PSYMCRYPT_MODULUS pmMod = pCurve->FMod;
529
534
535 SymCryptModElementSetValueUint32( 0, pmMod, peDstX, pbScratch, cbScratch );
536 SymCryptModElementSetValueUint32( 1, pmMod, peDstY, pbScratch, cbScratch );
537 SymCryptModElementSetValueUint32( 1, pmMod, peDstZ, pbScratch, cbScratch );
538 SymCryptModElementSetValueUint32( 0, pmMod, peDstT, pbScratch, cbScratch );
539}
VOID SYMCRYPT_CALL SymCryptModElementSetValueUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:908