ReactOS 0.4.17-dev-1005-g171e1de
ecpoint.c
Go to the documentation of this file.
1//
2// ecpoint.c Ecpoint functions
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6//
7
8#include "precomp.h"
9
10// Table with the number of field elements for each point format
12 0,
13 1, // SYMCRYPT_ECPOINT_FORMAT_X
14 2, // SYMCRYPT_ECPOINT_FORMAT_XY
15};
16
21 UINT32 numOfCoordinates )
22{
23 SYMCRYPT_ASSERT(numOfCoordinates > 0);
25
26 // Callers should never specify numOfCoordinates equal to 0 or greater than
27 // SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH
28 // Return 0 to indicate failure if a caller does specify invalid numOfCoordinates
29 if( (numOfCoordinates == 0) || (numOfCoordinates > SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH) )
30 {
31 return 0;
32 }
33
34 // Since the maximum number of coordinates is 4 this result is bounded
35 // by 4*2^17 + overhead ~ 2^20
36 return sizeof(SYMCRYPT_ECPOINT) + numOfCoordinates * cbModElement;
37}
38
42{
43 // Same bound as SymCryptSizeofEcpointEx
44 return SymCryptSizeofEcpointEx( pCurve->cbModElement, SYMCRYPT_INTERNAL_NUMOF_COORDINATES(pCurve->eCoordinates) );
45}
46
50{
51 PVOID p = NULL;
52 SIZE_T cb;
54
56
57 if ( cb != 0 )
58 {
60 }
61
62 if ( p==NULL )
63 {
64 goto cleanup;
65 }
66
68
70 return res;
71}
72
73VOID
78{
79 SYMCRYPT_CHECK_MAGIC( poDst );
81 SymCryptCallbackFree( poDst );
82}
83
90 UINT32 numOfCoordinates )
91{
92 PSYMCRYPT_ECPOINT poPoint = NULL;
93
95 UINT32 cbModElement = pCurve->cbModElement;
96
97 PBYTE pbBufferEnd = pbBuffer + cbBuffer;
98 UNREFERENCED_PARAMETER( pbBufferEnd ); // only referenced in an ASSERT...
99
100 SYMCRYPT_ASSERT( pCurve->FMod != 0 );
101 SYMCRYPT_ASSERT( pCurve->cbModElement != 0 );
102 SYMCRYPT_ASSERT( cbBuffer >= SymCryptSizeofEcpointEx( pCurve->cbModElement, numOfCoordinates ) );
103 if ( cbBuffer == 0 || numOfCoordinates == 0 )
104 {
105 goto cleanup;
106 }
107
109
110 poPoint = (PSYMCRYPT_ECPOINT) pbBuffer;
111
112 pbBuffer += sizeof(SYMCRYPT_ECPOINT);
113
114 // Setting the point coordinates
115 for (UINT32 i=0; i<numOfCoordinates; i++)
116 {
117 SYMCRYPT_ASSERT( pbBuffer + cbModElement <= pbBufferEnd );
118 pmTmp = SymCryptModElementCreate( pbBuffer, cbModElement, pCurve->FMod );
119 if ( pmTmp == NULL )
120 {
121 poPoint = NULL;
122 goto cleanup;
123 }
124 pbBuffer += cbModElement;
125 }
126
127 // Setting the normalized flag
128 poPoint->normalized = FALSE;
129
130 // Setting the curve
131 poPoint->pCurve = pCurve;
132
133 // Setting the magic
134 SYMCRYPT_SET_MAGIC( poPoint );
135
136cleanup:
137 return poPoint;
138}
139
146{
147
148 SYMCRYPT_ASSERT( pCurve->eCoordinates != 0 );
149
151}
152
156{
158
159 return (PSYMCRYPT_ECPOINT) pbBuffer;
160}
161
162VOID
165{
167
168 // Wipe the whole structure in one go.
170}
171
172VOID
177{
178 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
179
180 if( poSrc != poDst )
181 {
182 // Unconditionally set the normalization state of destination to source
183 poDst->normalized = poSrc->normalized;
184
185 memcpy(poDst + 1, poSrc + 1, SYMCRYPT_INTERNAL_NUMOF_COORDINATES(pCurve->eCoordinates) * pCurve->FModDigits * SYMCRYPT_FDEF_DIGIT_SIZE);
186 }
187}
188
189VOID
194 UINT32 mask )
195{
196 SYMCRYPT_ASSERT( (mask == 0) || (mask == 0xffffffff) );
197 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
198
199 // Unconditionally combine the normalization state of source and destination to avoid potential for
200 // leak of mask. Normalized is a non-secret value and is permitted to be leaked by side-channels
201 poDst->normalized &= poSrc->normalized;
202
203 // dcl - this looks like the equivalent of memcpy
204 // should be proven that arguments cannot be the result of an integer overflow
205 SymCryptFdefMaskedCopy((PCBYTE)poSrc + sizeof(SYMCRYPT_ECPOINT), (PBYTE)poDst + sizeof(SYMCRYPT_ECPOINT), SYMCRYPT_INTERNAL_NUMOF_COORDINATES(pCurve->eCoordinates) * pCurve->FModDigits, mask );
206}
207
208//
209// SymCryptEcpointTransform: Internal function to transform an ECPOINT
210// from one coordinate representation to another. One point has the default
211// format of the curve. The other point has a format large enough for the external
212// SYMCRYPT_ECPOINT_FORMAT.
213//
214// When the boolean setValue is set to TRUE, the source point is the one with
215// the external format eformat, and the destination point has the default
216// format of the curve. If setValue = FALSE the roles are reversed.
217// This function is only called by the Get / Set Value functions.
218//
229 PBYTE pbScratch,
231{
232 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
233
238
241
242 PSYMCRYPT_MODELEMENT peT[2] = { 0 }; // Temporaries
243
245 SYMCRYPT_ASSERT( SymCryptEcurveIsSame(pCurve, poSrc->pCurve) && SymCryptEcurveIsSame(pCurve, poDst->pCurve) );
248 2 * pCurve->cbModElement );
249
250 // Get the assumed representation from the external format
251 switch (eformat)
252 {
255 break;
258 break;
259 default:
260 scError = SYMCRYPT_INVALID_ARGUMENT;
261 goto cleanup;
262 }
263
264 // Find out whether we are setting or getting the value of the ECPOINT
265 if (setValue)
266 {
267 coTo = pCurve->eCoordinates;
268 }
269 else
270 {
271 coTo = coFrom;
272 coFrom = pCurve->eCoordinates;
273 }
274
275 // Take all the possible supported transformations:
276 // - From SYMCRYPT_ECPOINT_COORDINATES_SINGLE to
277 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE (identity transformation)
278 // * SYMCRYPT_ECPOINT_COORDINATES_AFFINE (** Set all zeros to the Y coordinate **)
279 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE_PROJECTIVE
280 // - From SYMCRYPT_ECPOINT_COORDINATES_AFFINE to
281 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE (** Ignore Y coordinate **)
282 // * SYMCRYPT_ECPOINT_COORDINATES_AFFINE (identity transformation)
283 // * SYMCRYPT_ECPOINT_COORDINATES_JACOBIAN
284 // * SYMCRYPT_ECPOINT_COORDINATES_EXTENDED_PROJECTIVE
285 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE_PROJECTIVE (** Ignore Y coordinate **)
286 // - From SYMCRYPT_ECPOINT_COORDINATES_JACOBIAN to
287 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE
288 // * SYMCRYPT_ECPOINT_COORDINATES_AFFINE
289 // * SYMCRYPT_ECPOINT_COORDINATES_JACOBIAN (identity transformation)
290 // - From SYMCRYPT_ECPOINT_COORDINATES_EXTENDED_PROJECTIVE to
291 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE
292 // * SYMCRYPT_ECPOINT_COORDINATES_AFFINE
293 // * SYMCRYPT_ECPOINT_COORDINATES_EXTENDED_PROJECTIVE (identity transformation)
294 // - From SYMCRYPT_ECPOINT_COORDINATES_SINGLE_PROJECTIVE
295 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE
296 // * SYMCRYPT_ECPOINT_COORDINATES_AFFINE (** Set all zeros to the Y coordinate **)
297 // * SYMCRYPT_ECPOINT_COORDINATES_SINGLE_PROJECTIVE (identity transformation)
298
299 // dcl - this appears that it might be a candidate for refactoring. Lots of code that looks
300 // duplicated across sections. Maybe some number of small functions would make it less fragile?
301 if ( coFrom == coTo )
302 {
303 SymCryptEcpointCopy( pCurve, poSrc, poDst ); // All the identity transformations.
304 }
305 else if (coFrom == SYMCRYPT_ECPOINT_COORDINATES_SINGLE)
306 {
308 {
309 // Copy X
311 SYMCRYPT_ASSERT( peX != NULL );
312
313 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
314 SYMCRYPT_ASSERT( peDst != NULL );
315
316 SymCryptModElementCopy( pCurve->FMod, peX, peDst );
317
318 // Set Y to 0
319 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
320 SYMCRYPT_ASSERT( peDst != NULL );
321
322 SymCryptModElementSetValueUint32( 0, pCurve->FMod, peDst, pbScratch, cbScratch );
323 }
325 {
326 // Copy X
328 SYMCRYPT_ASSERT( peX != NULL );
329
330 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
331 SYMCRYPT_ASSERT( peDst != NULL );
332
333 SymCryptModElementCopy( pCurve->FMod, peX, peDst );
334
335 // Set Y to 1
336 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
337 SYMCRYPT_ASSERT( peDst != NULL );
338
339 SymCryptModElementSetValueUint32( 1, pCurve->FMod, peDst, pbScratch, cbScratch );
340
341 // Setting the normalized flag
342 poDst->normalized = TRUE;
343 }
344 else
345 {
346 scError = SYMCRYPT_NOT_IMPLEMENTED;
347 goto cleanup;
348 }
349 }
350 else if (coFrom == SYMCRYPT_ECPOINT_COORDINATES_AFFINE)
351 {
356 )
357 {
358 // Copy X
360 SYMCRYPT_ASSERT( peX != NULL );
361
362 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
363 SYMCRYPT_ASSERT( peDst != NULL );
364
365 SymCryptModElementCopy( pCurve->FMod, peX, peDst );
366
369 {
370 // Copy Y
372 SYMCRYPT_ASSERT( peY != NULL );
373
374 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
375 SYMCRYPT_ASSERT( peDst != NULL );
376
377 SymCryptModElementCopy( pCurve->FMod, peY, peDst );
378
379 // Set Z to 1
380 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poDst );
381 SYMCRYPT_ASSERT( peDst != NULL );
382
383 SymCryptModElementSetValueUint32( 1, pCurve->FMod, peDst, pbScratch, cbScratch );
384
386 {
387 // T = x * y * z
388 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 3, pCurve, poDst );
389 SYMCRYPT_ASSERT( peDst != NULL );
390
391 SymCryptModMul( pCurve->FMod, peX, peY, peDst, pbScratch, cbScratch );
392 }
393
394 // Setting the normalized flag
395 poDst->normalized = TRUE;
396 }
398 {
399 // Set Y to 1 (Ignore the second coordinate of the source point)
400 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
401 SYMCRYPT_ASSERT( peDst != NULL );
402
403 SymCryptModElementSetValueUint32( 1, pCurve->FMod, peDst, pbScratch, cbScratch );
404
405 // Setting the normalized flag
406 poDst->normalized = TRUE;
407 }
408 }
409 else
410 {
411 scError = SYMCRYPT_NOT_IMPLEMENTED;
412 goto cleanup;
413 }
414 }
415 else if (coFrom == SYMCRYPT_ECPOINT_COORDINATES_JACOBIAN)
416 {
419 {
420 // Creating temporaries
421 for (UINT32 i=0; i<2; i++)
422 {
423 peT[i] = SymCryptModElementCreate( pbScratch, pCurve->cbModElement, pCurve->FMod );
424 SYMCRYPT_ASSERT( peT[i] != NULL);
425
426 pbScratch += pCurve->cbModElement;
427 }
428
429 cbScratch -= 2*pCurve->cbModElement;
430
431 // Get the Z coordinate of the source point
432 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc );
433 SYMCRYPT_ASSERT( peSrc != NULL );
434
435 // Check if Z is equal to 0 (i.e. the point is the point at infinity)
436 if (SymCryptModElementIsZero(pCurve->FMod, peSrc))
437 {
438 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
439 goto cleanup;
440 }
441
442 // Calculation
443 // T0 := 1 / Z
444 scError = SymCryptModInv( pCurve->FMod, peSrc, peT[0], flags, pbScratch, cbScratch );
445 if( scError != SYMCRYPT_NO_ERROR )
446 {
447 goto cleanup;
448 }
449
450 SymCryptModMul( pCurve->FMod, peT[0], peT[0], peT[1], pbScratch, cbScratch ); // T1 := T0 * T0 = 1/Z^2
451
452 // Get the X coordinates
453 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc );
454 SYMCRYPT_ASSERT( peSrc != NULL );
455
456 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
457 SYMCRYPT_ASSERT( peDst != NULL );
458
459 // Set the new X
460 SymCryptModMul( pCurve->FMod, peSrc, peT[1], peDst, pbScratch, cbScratch ); // X2 := X * T1 = X/Z^2
461
463 {
464 SymCryptModMul( pCurve->FMod, peT[0], peT[1], peT[1], pbScratch, cbScratch ); // T1 := T0 * T1 = 1/Z^3
465
466 // Get the Y coordinates
467 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc );
468 SYMCRYPT_ASSERT( peSrc != NULL );
469
470 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
471 SYMCRYPT_ASSERT( peDst != NULL );
472
473 // Set the new Y
474 SymCryptModMul( pCurve->FMod, peSrc, peT[1], peDst, pbScratch, cbScratch ); // Y2 := Y * T1 = Y/Z^3
475 }
476 }
477 else
478 {
479 scError = SYMCRYPT_NOT_IMPLEMENTED;
480 goto cleanup;
481 }
482 }
484 {
485
488 {
489 // Creating temporary
490 peT[0] = SymCryptModElementCreate( pbScratch, pCurve->cbModElement, pCurve->FMod );
491 SYMCRYPT_ASSERT( peT[0] != NULL);
492 pbScratch += pCurve->cbModElement;
493 cbScratch -= 2*pCurve->cbModElement;
494
495 // Get the Z coordinate of the source point
496 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 2, pCurve, poSrc );
497 SYMCRYPT_ASSERT( peSrc != NULL );
498
499 // Check if Z is equal to 0 (i.e. the point is the point at infinity)
500 if (SymCryptModElementIsZero(pCurve->FMod, peSrc))
501 {
502 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
503 goto cleanup;
504 }
505
506 // peT[0] = 1 / Z
507 scError = SymCryptModInv( pCurve->FMod, peSrc, peT[0], flags, pbScratch, cbScratch );
508 if( scError != SYMCRYPT_NO_ERROR )
509 {
510 goto cleanup;
511 }
512
513 // Get the X coordinates
514 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc );
515 SYMCRYPT_ASSERT( peSrc != NULL );
516
517 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
518 SYMCRYPT_ASSERT( peDst != NULL );
519
520 // x = X * (1 / Z)
521 SymCryptModMul( pCurve->FMod, peSrc, peT[0], peDst, pbScratch, cbScratch );
522
524 {
525 // Get the Y coordinates
526 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc );
527 SYMCRYPT_ASSERT( peSrc != NULL );
528
529 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
530 SYMCRYPT_ASSERT( peDst != NULL );
531
532 // y = Y * (1 / Z)
533 SymCryptModMul( pCurve->FMod, peSrc, peT[0], peDst, pbScratch, cbScratch );
534 }
535 }
536 else
537 {
538 scError = SYMCRYPT_NOT_IMPLEMENTED;
539 goto cleanup;
540 }
541 }
543 {
546 {
547 // Creating temporary
548 peT[0] = SymCryptModElementCreate( pbScratch, pCurve->cbModElement, pCurve->FMod );
549 SYMCRYPT_ASSERT( peT[0] != NULL);
550
551 pbScratch += pCurve->cbModElement;
552 cbScratch -= pCurve->cbModElement;
553
554 // Get the Y coordinate of the source point
555 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poSrc );
556 SYMCRYPT_ASSERT( peSrc != NULL );
557
558 // Check if Y is equal to 0 (i.e. the point is the point at infinity)
559 if (SymCryptModElementIsZero(pCurve->FMod, peSrc))
560 {
561 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
562 goto cleanup;
563 }
564
565 // Calculation
566 scError = SymCryptModInv( pCurve->FMod, peSrc, peT[0], flags, pbScratch, cbScratch ); // T0 := 1 / Y
567 if( scError != SYMCRYPT_NO_ERROR )
568 {
569 goto cleanup;
570 }
571
572 // Get the X coordinates
573 peSrc = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poSrc );
574 SYMCRYPT_ASSERT( peSrc != NULL );
575
576 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 0, pCurve, poDst );
577 SYMCRYPT_ASSERT( peDst != NULL );
578
579 // Set the new X
580 SymCryptModMul( pCurve->FMod, peSrc, peT[0], peDst, pbScratch, cbScratch ); // X2 := X * T0 = X/Y
581
583 {
584 // Set Y to 0
585 peDst = SYMCRYPT_INTERNAL_ECPOINT_COORDINATE( 1, pCurve, poDst );
586 SYMCRYPT_ASSERT( peDst != NULL );
587
588 SymCryptModElementSetValueUint32( 0, pCurve->FMod, peDst, pbScratch, cbScratch );
589 }
590 }
591 }
592 else
593 {
594 scError = SYMCRYPT_NOT_IMPLEMENTED;
595 goto cleanup;
596 }
597
598cleanup:
599
600 return scError;
601}
602
608 SIZE_T cbSrc,
615{
616 SYMCRYPT_ERROR scError = SYMCRYPT_NOT_IMPLEMENTED;
617 PSYMCRYPT_MODELEMENT peTmp = NULL; // Temporary MODELEMENT handle
618 PSYMCRYPT_ECPOINT poLarge = NULL; // ECPOINT with the largest format available
619 UINT32 cbLarge = 0;
620 PSYMCRYPT_INT piTemp = NULL;
621 UINT32 cbTemp = 0;
623
625
626 SYMCRYPT_ASSERT( pCurve->FMod != 0 );
627 SYMCRYPT_ASSERT( pCurve->eCoordinates != 0 );
628 SYMCRYPT_ASSERT( pCurve->cbModElement != 0 );
629
631
632 // Check that the buffer is of correct size
634 {
635 scError = SYMCRYPT_BUFFER_TOO_SMALL;
636 goto cleanup;
637 }
638 cbSrc = cbSrc / SymCryptEcpointFormatNumberofElements[ eformat ];
639
640 cbTemp = SymCryptSizeofIntFromDigits( publicKeyDigits );
641 SYMCRYPT_ASSERT( cbScratch > cbTemp );
642
643 piTemp = SymCryptIntCreate( pbScratch, cbTemp, publicKeyDigits );
644
645 // Validate the coordinate of the input public key is less than the field modulus
646 for ( UINT32 i = 0; i < SymCryptEcpointFormatNumberofElements[eformat]; i++ )
647 {
648 scError = SymCryptIntSetValue( pbSrc + i * cbSrc, cbSrc, nformat, piTemp );
649 if (scError != SYMCRYPT_NO_ERROR)
650 {
651 goto cleanup;
652 }
653
654 if ( !SymCryptIntIsLessThan( piTemp, SymCryptIntFromModulus( pCurve->FMod ) ) )
655 {
656 scError = SYMCRYPT_INVALID_ARGUMENT;
657 goto cleanup;
658 }
659 }
660
661 // Create the large point
663 SYMCRYPT_ASSERT( cbScratch > cbLarge );
664 poLarge = SymCryptEcpointCreateEx( pbScratch, cbLarge, pCurve, SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH );
665 if ( poLarge == NULL )
666 {
667 scError = SYMCRYPT_INVALID_BLOB;
668 goto cleanup;
669 }
670
671 // Setting the point coordinates into the big point
673 {
675 if ( peTmp == NULL )
676 {
677 scError = SYMCRYPT_INVALID_BLOB;
678 goto cleanup;
679 }
680
682 pbSrc,
683 cbSrc,
684 nformat,
685 pCurve->FMod,
686 peTmp,
687 pbScratch + cbLarge,
688 cbScratch - cbLarge );
689 if ( scError != SYMCRYPT_NO_ERROR )
690 {
691 goto cleanup;
692 }
693 pbSrc += cbSrc;
694 }
695
696 // Transform the big point into the destination point
697 scError = SymCryptEcpointTransform( pCurve, poLarge, poDst, eformat, TRUE, flags, pbScratch + cbLarge, cbScratch - cbLarge);
698
699cleanup:
700 return scError;
701}
702
711 SIZE_T cbDst,
715{
716 SYMCRYPT_ERROR scError = SYMCRYPT_NOT_IMPLEMENTED;
717 PSYMCRYPT_MODELEMENT peTmp = NULL; // Temporary MODELEMENT handle
718 PSYMCRYPT_ECPOINT poLarge = NULL; // ECPOINT with the largest format available
719 UINT32 cbLarge = 0;
720 SIZE_T cbDstElem;
721
723 SYMCRYPT_ASSERT( pCurve->FMod != 0 );
724 SYMCRYPT_ASSERT( pCurve->eCoordinates != 0 );
725 SYMCRYPT_ASSERT( pCurve->cbModElement != 0 );
726
728
729 // Check that the buffer is of correct size
731 {
732 scError = SYMCRYPT_BUFFER_TOO_SMALL;
733 goto cleanup;
734 }
736 cbDstElem = cbDst / SymCryptEcpointFormatNumberofElements[ eformat ];
737
738 // Create the big point
740 SYMCRYPT_ASSERT( cbScratch > cbLarge );
741 poLarge = SymCryptEcpointCreateEx( pbScratch, cbLarge, pCurve, SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH );
742 if ( poLarge == NULL )
743 {
744 scError = SYMCRYPT_INVALID_BLOB;
745 goto cleanup;
746 }
747
748 // Transform the source point into the big point if needed
749 scError = SymCryptEcpointTransform( pCurve, poSrc, poLarge, eformat, FALSE, flags, pbScratch + cbLarge, cbScratch - cbLarge);
750 if (scError != SYMCRYPT_NO_ERROR)
751 {
752 goto cleanup;
753 }
754
755 // Getting the point coordinates into the destination buffer
757 {
758 SYMCRYPT_ASSERT( cbDst >= cbDstElem );
760 if ( peTmp == NULL )
761 {
762 scError = SYMCRYPT_INVALID_BLOB;
763 goto cleanup;
764 }
765
767 pCurve->FMod,
768 peTmp,
769 pbDst,
770 cbDstElem,
771 nformat,
772 pbScratch + cbLarge,
773 cbScratch - cbLarge );
774 if ( scError != SYMCRYPT_NO_ERROR )
775 {
776 goto cleanup;
777 }
778 pbDst += cbDstElem;
779 cbDst -= cbDstElem;
780 }
781
782cleanup:
783
784 return scError;
785}
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
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointSetValue(_In_ PCSYMCRYPT_ECURVE pCurve, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT nformat, SYMCRYPT_ECPOINT_FORMAT eformat, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ecpoint.c:605
VOID SymCryptEcpointMaskedCopy(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, UINT32 mask)
Definition: ecpoint.c:190
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointEx(UINT32 cbModElement, UINT32 numOfCoordinates)
Definition: ecpoint.c:19
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecpoint.c:142
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointAllocate(_In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecpoint.c:49
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointRetrieveHandle(_In_ PBYTE pbBuffer)
Definition: ecpoint.c:155
VOID SymCryptEcpointCopy(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst)
Definition: ecpoint.c:173
VOID SYMCRYPT_CALL SymCryptEcpointFree(_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst)
Definition: ecpoint.c:75
UINT32 SYMCRYPT_CALL SymCryptSizeofEcpointFromCurve(PCSYMCRYPT_ECURVE pCurve)
Definition: ecpoint.c:41
const UINT32 SymCryptEcpointFormatNumberofElements[]
Definition: ecpoint.c:11
VOID SYMCRYPT_CALL SymCryptEcpointWipe(_In_ PCSYMCRYPT_ECURVE pCurve, _Out_ PSYMCRYPT_ECPOINT poDst)
Definition: ecpoint.c:164
PSYMCRYPT_ECPOINT SYMCRYPT_CALL SymCryptEcpointCreateEx(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, PCSYMCRYPT_ECURVE pCurve, UINT32 numOfCoordinates)
Definition: ecpoint.c:86
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointTransform(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, _Out_ PSYMCRYPT_ECPOINT poDst, SYMCRYPT_ECPOINT_FORMAT eformat, BOOLEAN setValue, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ecpoint.c:221
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptEcpointGetValue(_In_ PCSYMCRYPT_ECURVE pCurve, _In_ PCSYMCRYPT_ECPOINT poSrc, SYMCRYPT_NUMBER_FORMAT nformat, SYMCRYPT_ECPOINT_FORMAT eformat, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: ecpoint.c:705
VOID SYMCRYPT_CALL SymCryptFdefMaskedCopy(_In_reads_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PCBYTE pbSrc, _Inout_updates_bytes_(nDigits *SYMCRYPT_FDEF_DIGIT_SIZE) PBYTE pbDst, UINT32 nDigits, UINT32 mask)
Definition: fdef_general.c:74
GLuint res
Definition: glext.h:9613
GLenum GLint GLuint mask
Definition: glext.h:6028
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HRESULT setValue(LPTSTR val_name, LPTSTR val_data)
Definition: regproc.c:432
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#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
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
Definition: sc_lib.h:1912
UINT32 UINT32 UINT32 UINT32 cbScratch
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
#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
enum _SYMCRYPT_NUMBER_FORMAT SYMCRYPT_NUMBER_FORMAT
@ SYMCRYPT_ECPOINT_FORMAT_X
Definition: symcrypt.h:7194
@ SYMCRYPT_ECPOINT_FORMAT_XY
Definition: symcrypt.h:7195
enum _SYMCRYPT_ECPOINT_FORMAT SYMCRYPT_ECPOINT_FORMAT
BOOLEAN SYMCRYPT_CALL SymCryptEcurveIsSame(_In_ PCSYMCRYPT_ECURVE pCurve1, _In_ PCSYMCRYPT_ECURVE pCurve2)
Definition: ecurve.c:745
UINT32 SYMCRYPT_CALL SymCryptEcurveSizeofFieldElement(_In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecurve.c:689
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCBYTE pbSrc
#define SYMCRYPT_CALL
const SYMCRYPT_ECPOINT * PCSYMCRYPT_ECPOINT
struct _SYMCRYPT_ECPOINT SYMCRYPT_ECPOINT
#define SYMCRYPT_INTERNAL_NUMOF_COORDINATES(_eCoordinates)
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_FDEF_DIGIT_SIZE
PCSYMCRYPT_ECURVE pCurve
#define SYMCRYPT_INTERNAL_ECPOINT_COORDINATE(_ord, _pCurve, _pEcpoint)
#define SYMCRYPT_MAX(_a, _b)
#define SYMCRYPT_SET_MAGIC(p)
enum _SYMCRYPT_ECPOINT_COORDINATES SYMCRYPT_ECPOINT_COORDINATES
PCBYTE PBYTE pbDst
UINT32 cbModElement
SYMCRYPT_ECPOINT * PSYMCRYPT_ECPOINT
const BYTE * PCBYTE
#define SYMCRYPT_ECPOINT_FORMAT_MAX_LENGTH
#define SYMCRYPT_INTERNAL_ECPOINT_COORDINATE_OFFSET(_pCurve, _ord)
SYMCRYPT_INT * PSYMCRYPT_INT
const SYMCRYPT_ECURVE * PCSYMCRYPT_ECURVE
#define SYMCRYPT_CHECK_MAGIC(p)
@ SYMCRYPT_ECPOINT_COORDINATES_AFFINE
@ SYMCRYPT_ECPOINT_COORDINATES_SINGLE_PROJECTIVE
@ SYMCRYPT_ECPOINT_COORDINATES_INVALID
@ SYMCRYPT_ECPOINT_COORDINATES_SINGLE
@ SYMCRYPT_ECPOINT_COORDINATES_JACOBIAN
@ SYMCRYPT_ECPOINT_COORDINATES_EXTENDED_PROJECTIVE
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
Definition: a_dispatch.c:442
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
Definition: a_dispatch.c:828
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModElementSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:781
VOID SymCryptModElementCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
Definition: a_dispatch.c:683
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModElementGetValue(PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:804
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:248
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
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModInv(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:948
VOID SYMCRYPT_CALL SymCryptModElementSetValueUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:908
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
UINT32 SYMCRYPT_CALL SymCryptEcurveDigitsofFieldElement(_In_ PCSYMCRYPT_ECURVE pCurve)
Definition: ecurve.c:682
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:720
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
Definition: a_dispatch.c:134
#define SYMCRYPT_SCRATCH_BYTES_FOR_GETSET_VALUE_ECURVE_OPERATIONS(_pCurve)
#define SYMCRYPT_FLAG_DATA_PUBLIC
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODINV(_nDigits)
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: a_dispatch.c:141
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59