ReactOS 0.4.17-dev-1005-g171e1de
rsa_enc.c
Go to the documentation of this file.
1//
2// rsa_enc.c RSA related algorithms
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#include "precomp.h"
8
9//
10// Helper functions for RSA raw encrypt/decrypt (they do NOT allocate scratch space)
11//
12
16{
17 // Bounded by 2^19 + 2^24 ~ 2^24 (see symcrypt_internal.h)
18 return SymCryptSizeofModElementFromModulus( pkRsakey->pmModulus ) +
20 SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ) );
21}
22
25 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
27 SIZE_T cbSrc,
28 SYMCRYPT_NUMBER_FORMAT numFormat,
29 SIZE_T cbDst,
31 PBYTE pbScratch,
33{
34 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
35 PSYMCRYPT_INT piTmpInteger = NULL;
36 UINT32 cbTmpInteger = 0;
37
39
40 if ( cbSrc > SymCryptRsakeySizeofModulus(pkRsakey) ||
41 cbDst < SymCryptRsakeySizeofModulus(pkRsakey) )
42 {
43 scError = SYMCRYPT_INVALID_ARGUMENT;
44 goto cleanup;
45 }
46
47 // It is an error of value(pbSrc) >= modulus
48 // We already know that cbSrc <= sizeof( modulus ) so we only have to run this check
49 // if cbSrc == sizeof( modulus )
50 // No side channel issues here: we are only comparing the input to the public part of the key.
51 if (cbSrc == SymCryptRsakeySizeofModulus(pkRsakey))
52 {
53 cbTmpInteger = SymCryptSizeofIntFromDigits( pkRsakey->nDigitsOfModulus );
54 SYMCRYPT_ASSERT( cbScratch >= cbTmpInteger );
55 piTmpInteger = SymCryptIntCreate( pbScratch, cbTmpInteger, pkRsakey->nDigitsOfModulus );
56
57 scError = SymCryptIntSetValue( pbSrc, cbSrc, numFormat, piTmpInteger );
58 if (scError != SYMCRYPT_NO_ERROR)
59 {
60 goto cleanup;
61 }
62
63 if (!SymCryptIntIsLessThan(piTmpInteger, SymCryptIntFromModulus(pkRsakey->pmModulus)))
64 {
65 scError = SYMCRYPT_INVALID_ARGUMENT;
66 goto cleanup;
67 }
68 }
69
71 return scError;
72}
73
74
78 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
80 SIZE_T cbSrc,
81 SYMCRYPT_NUMBER_FORMAT numFormat,
83 _Out_writes_( cbDst ) PBYTE pbDst,
84 SIZE_T cbDst,
86 PBYTE pbScratch,
88{
89 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
90
93
94 PBYTE pbFnScratch = NULL;
95 SIZE_T cbFnScratch = 0;
96
98 PSYMCRYPT_INT piExp = NULL;
99
101
102 scError = SymCryptRsaCoreVerifyInput(pkRsakey, pbSrc, cbSrc, numFormat, cbDst, pbScratch, cbScratch);
103 if (scError != SYMCRYPT_NO_ERROR)
104 {
105 goto cleanup;
106 }
107
108 cbModElement = SymCryptSizeofModElementFromModulus( pkRsakey->pmModulus );
109
113 SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ) ));
114
115 pbFnScratch = pbScratch;
116 cbFnScratch = cbScratch;
117
118 peRes = SymCryptModElementCreate( pbScratch, cbModElement, pkRsakey->pmModulus );
119 SYMCRYPT_ASSERT( peRes != NULL );
120 pbFnScratch += cbModElement;
121 cbFnScratch -= cbModElement;
122
123 // Set the original value
124 scError = SymCryptModElementSetValue( pbSrc, cbSrc, numFormat, pkRsakey->pmModulus, peRes, pbFnScratch, cbFnScratch );
125 if (scError!=SYMCRYPT_NO_ERROR)
126 {
127 goto cleanup;
128 }
129
130 // Convert the public exponent to an Int
131 // Future: we can optimize the ModExp to take an UINT64
132 piExp = SymCryptIntCreate( SYMCRYPT_ASYM_ALIGN_UP(abExpIntBuffer), sizeof( abExpIntBuffer) - SYMCRYPT_ASYM_ALIGN_VALUE, 1 );
133 if( piExp == NULL )
134 {
135 scError = SYMCRYPT_HARDWARE_FAILURE;
136 goto cleanup;
137 }
138 SymCryptIntSetValueUint64( pkRsakey->au64PubExp[0], piExp );
139
140 // Modular Exponentiation
142 pkRsakey->pmModulus,
143 peRes,
144 piExp,
145 SymCryptIntBitsizeOfValue( piExp ), // This is a public value
147 peRes,
148 pbFnScratch,
149 cbFnScratch );
150
151 // Output the value
152 scError = SymCryptModElementGetValue( pkRsakey->pmModulus, peRes, pbDst, cbDst, numFormat, pbFnScratch, cbFnScratch );
153 if (scError!=SYMCRYPT_NO_ERROR)
154 {
155 goto cleanup;
156 }
157
158cleanup:
159
160 if( piExp != NULL )
161 {
162 SymCryptIntWipe( piExp );
163 }
164
165 return scError;
166}
167
168UINT32
171{
172 UINT32 cbModElementTotal = 0;
173 UINT32 nPrimes = pkRsakey->nPrimes;
174
176 // clamp nPrimes to SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES for scratch memory allocation purposes
177 // SymCryptRsaCoreDecCrt will fail with invalid argument if there are too many primes later
179
180 for (UINT32 i=0; i<pkRsakey->nPrimes; i++)
181 {
182 cbModElementTotal += SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS( pkRsakey->nBitsOfPrimes[i]);
183 }
184
185 // Bounded by 5*2^19 + 2^24 ~ 2^24 (see symcrypt_internal.h)
186 return 3*SymCryptSizeofIntFromDigits( pkRsakey->nDigitsOfModulus ) +
187 SymCryptSizeofIntFromDigits( pkRsakey->nMaxDigitsOfPrimes ) +
188 cbModElementTotal +
189 SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS( pkRsakey->nBitsOfModulus) +
191 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ),
192 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD( pkRsakey->nDigitsOfModulus, pkRsakey->nMaxDigitsOfPrimes ),
193 SYMCRYPT_SCRATCH_BYTES_FOR_CRT_SOLUTION( pkRsakey->nMaxDigitsOfPrimes ) )));
194}
195
196UINT32
199{
200 // Bounded by 2^19 + 2^24 ~ 2^24 (see symcrypt_internal.h)
201 return SymCryptSizeofModElementFromModulus( pkRsakey->pmModulus ) +
203 SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ) );
204}
205
209 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
211 SIZE_T cbSrc,
212 SYMCRYPT_NUMBER_FORMAT numFormat,
214 _Out_writes_( cbDst ) PBYTE pbDst,
215 SIZE_T cbDst,
217 PBYTE pbScratch,
219{
220 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
221
222 PSYMCRYPT_INT piCiphertext = NULL;
223 PSYMCRYPT_INT piPlaintext = NULL;
224 UINT32 cbInt = 0;
225
226 PSYMCRYPT_INT piTmp = NULL;
227 UINT32 cbTmp = 0;
228
230 UINT32 cbModElements[SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES] = { 0 };
231 UINT32 cbModElementTotal = 0;
232
233 // Used to verify decryption
234 PSYMCRYPT_INT piVerify = NULL; // Size equal to cbInt
235 PSYMCRYPT_MODELEMENT peVerify = NULL;
236 UINT32 cbModElementVerify = 0;
237
238 PBYTE pbFnScratch = NULL;
239 SIZE_T cbFnScratch = 0;
240
242
243 // Make sure that the key has a private key
244 if (!pkRsakey->hasPrivateKey)
245 {
246 scError = SYMCRYPT_INVALID_ARGUMENT;
247 goto cleanup;
248 }
249
250 scError = SymCryptRsaCoreVerifyInput(pkRsakey, pbSrc, cbSrc, numFormat, cbDst, pbScratch, cbScratch);
251 if (scError != SYMCRYPT_NO_ERROR)
252 {
253 goto cleanup;
254 }
255
256 // Verify that the number of primes does not cause a stack overflow
257 if (pkRsakey->nPrimes > SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES)
258 {
259 scError = SYMCRYPT_INVALID_ARGUMENT;
260 goto cleanup;
261 }
262
263 cbInt = SymCryptSizeofIntFromDigits( pkRsakey->nDigitsOfModulus );
264 cbTmp = SymCryptSizeofIntFromDigits( pkRsakey->nMaxDigitsOfPrimes );
265 for (UINT32 i=0; i<pkRsakey->nPrimes; i++)
266 {
267 cbModElements[i] = SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS( pkRsakey->nBitsOfPrimes[i]);
268 cbModElementTotal += cbModElements[i];
269 }
270
271 cbModElementVerify = SymCryptSizeofModElementFromModulus( pkRsakey->pmModulus );
272
274 //
275 // From symcrypt_internal.h we have:
276 // - sizeof results are upper bounded by 2^19
277 // - SYMCRYPT_SCRATCH_BYTES results are upper bounded by 2^27 (including RSA and ECURVE)
278 // - nPrimes is at most SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES = 2
279 // Thus the following calculation does not overflow cbScratch.
280 //
282 3*cbInt + cbTmp + cbModElementTotal + cbModElementVerify +
284 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ),
285 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD( pkRsakey->nDigitsOfModulus, pkRsakey->nMaxDigitsOfPrimes ),
286 SYMCRYPT_SCRATCH_BYTES_FOR_CRT_SOLUTION( pkRsakey->nMaxDigitsOfPrimes ) ))) );
287
288 pbFnScratch = pbScratch;
289 cbFnScratch = cbScratch;
290
291 piPlaintext = SymCryptIntCreate( pbFnScratch, cbFnScratch, pkRsakey->nDigitsOfModulus );
292 SYMCRYPT_ASSERT( piPlaintext != NULL );
293 pbFnScratch += cbInt;
294 cbFnScratch -= cbInt;
295
296 piCiphertext = SymCryptIntCreate( pbFnScratch, cbFnScratch, pkRsakey->nDigitsOfModulus );
297 SYMCRYPT_ASSERT( piCiphertext != NULL );
298 pbFnScratch += cbInt;
299 cbFnScratch -= cbInt;
300
301 piTmp = SymCryptIntCreate( pbFnScratch, cbFnScratch, pkRsakey->nMaxDigitsOfPrimes );
302 SYMCRYPT_ASSERT( piTmp != NULL );
303 pbFnScratch += cbTmp;
304 cbFnScratch -= cbTmp;
305
307 for (UINT32 i=0; i<pkRsakey->nPrimes; i++)
308 {
309 peCrtElements[i] = SymCryptModElementCreate( pbFnScratch, cbFnScratch, pkRsakey->pmPrimes[i] );
310 SYMCRYPT_ASSERT( peCrtElements[i] != NULL );
311 pbFnScratch += cbModElements[i];
312 cbFnScratch -= cbModElements[i];
313 }
314
315 piVerify = SymCryptIntCreate( pbFnScratch, cbFnScratch, pkRsakey->nDigitsOfModulus );
316 SYMCRYPT_ASSERT( piVerify != NULL );
317 pbFnScratch += cbInt;
318 cbFnScratch -= cbInt;
319
320 peVerify = SymCryptModElementCreate( pbFnScratch, cbFnScratch, pkRsakey->pmModulus );
321 SYMCRYPT_ASSERT( peVerify != NULL );
322 pbFnScratch += cbModElementVerify;
323 cbFnScratch -= cbModElementVerify;
324
325 // Set the ciphertext
326 scError = SymCryptIntSetValue( pbSrc, cbSrc, numFormat, piCiphertext );
327 if (scError!=SYMCRYPT_NO_ERROR)
328 {
329 goto cleanup;
330 }
331
332 // Modular exponentiations
333 for (UINT32 i=0; i<pkRsakey->nPrimes; i++)
334 {
335 // c mod the prime
336 // Note: For two equally sized primes we can use straight the faster SymCryptIntToModElement function
337 // but for now this is the general case.
339 piCiphertext,
340 SymCryptDivisorFromModulus(pkRsakey->pmPrimes[i]),
341 NULL,
342 piTmp,
343 pbFnScratch,
344 cbFnScratch );
345
346 SymCryptIntToModElement( piTmp, pkRsakey->pmPrimes[i], peCrtElements[i], pbFnScratch, cbFnScratch );
347
348 // Modular Exponentiation
350 pkRsakey->pmPrimes[i],
351 peCrtElements[i],
352 pkRsakey->piCrtPrivExps[i], // For now only the first exponent is allowed
353 pkRsakey->nBitsOfPrimes[i], // This is a public value
354 0, // Side-channel safe modexp
355 peCrtElements[i],
356 pbFnScratch,
357 cbFnScratch );
358 }
359
360 // Solve the crt equations
361 scError = SymCryptCrtSolve(
362 pkRsakey->nPrimes,
363 (PCSYMCRYPT_MODULUS *) pkRsakey->pmPrimes,
364 (PSYMCRYPT_MODELEMENT *) pkRsakey->peCrtInverses,
365 peCrtElements,
366 0,
367 piPlaintext,
368 pbFnScratch,
369 cbFnScratch );
370 if (scError!=SYMCRYPT_NO_ERROR)
371 {
372 goto cleanup;
373 }
374
375 /*
376 A hardware error during RSA decryption can leak the
377 prime factors. For example, suppose the message
378 is M and you try to sign it with
379 M^d for some decryption exponent d.
380 Using the CRT, you compute M^d mod p correctly but
381 M^d mod q incorrectly. Your supposed M^d (mod p*q) is
382 then raised to an encryption exponent e
383 by the verifier, detects an invalid signature.
384 The verifier can also find p via a GCD and factor the modulus.
385
386 To avoid this problem, re-encrypt the supposed M^d
387 and verify our own signature.
388 */
389
390 // Don't call the full encryption function just the modular exponentiation
391
392 SymCryptIntToModElement( piPlaintext, pkRsakey->pmModulus, peVerify, pbFnScratch, cbFnScratch );
393
394 SymCryptIntSetValueUint64( pkRsakey->au64PubExp[0], piTmp );
395
396 // Modular Exponentiation (Not side-channel safe)
398 pkRsakey->pmModulus,
399 peVerify,
400 piTmp,
402 SYMCRYPT_FLAG_DATA_PUBLIC, // Exponent is public
403 peVerify,
404 pbFnScratch,
405 cbFnScratch );
406
407 SymCryptModElementToInt( pkRsakey->pmModulus, peVerify, piVerify, pbFnScratch, cbFnScratch );
408
409 if (!SymCryptIntIsEqual( piCiphertext, piVerify ))
410 {
411 scError = SYMCRYPT_HARDWARE_FAILURE;
412 goto cleanup;
413 }
414
415 // Output the result
416 scError = SymCryptIntGetValue( piPlaintext, pbDst, cbDst, numFormat );
417 if (scError!=SYMCRYPT_NO_ERROR)
418 {
419 goto cleanup;
420 }
421
422cleanup:
423
424 return scError;
425}
426
430 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
432 SIZE_T cbSrc,
433 SYMCRYPT_NUMBER_FORMAT numFormat,
435 _Out_writes_( cbDst ) PBYTE pbDst,
436 SIZE_T cbDst,
438 PBYTE pbScratch,
440{
441 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
442
445
446 PBYTE pbFnScratch = NULL;
447 SIZE_T cbFnScratch = 0;
448
450
451 // Make sure that the key has a private key
452 if ((cbSrc>SymCryptRsakeySizeofModulus(pkRsakey)) ||
453 (!pkRsakey->hasPrivateKey) )
454 {
455 scError = SYMCRYPT_INVALID_ARGUMENT;
456 goto cleanup;
457 }
458
459 cbModElement = SymCryptSizeofModElementFromModulus( pkRsakey->pmModulus );
460
464 SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( pkRsakey->nDigitsOfModulus ) ) );
465
466 pbFnScratch = pbScratch;
467 cbFnScratch = cbScratch;
468
469 peRes = SymCryptModElementCreate( pbScratch, cbModElement, pkRsakey->pmModulus );
470 SYMCRYPT_ASSERT( peRes != NULL );
471 pbFnScratch += cbModElement;
472 cbFnScratch -= cbModElement;
473
474 // Set the ciphertext
475 scError = SymCryptModElementSetValue( pbSrc, cbSrc, numFormat, pkRsakey->pmModulus, peRes, pbFnScratch, cbFnScratch );
476 if (scError!=SYMCRYPT_NO_ERROR)
477 {
478 goto cleanup;
479 }
480
481 // Modular Exponentiation
483 pkRsakey->pmModulus,
484 peRes,
485 pkRsakey->piPrivExps[0], // For now only the first exponent is allowed
486 pkRsakey->nBitsOfModulus, // This is a public value
487 0, // Side-channel safe modexp
488 peRes,
489 pbFnScratch,
490 cbFnScratch );
491
492 // Output the value
493 scError = SymCryptModElementGetValue( pkRsakey->pmModulus, peRes, pbDst, cbDst, numFormat, pbFnScratch, cbFnScratch );
494 if (scError!=SYMCRYPT_NO_ERROR)
495 {
496 goto cleanup;
497 }
498
499cleanup:
500
501 return scError;
502}
503
504
505//
506// Encryption / decryption functions
507//
511 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
513 SIZE_T cbSrc,
514 SYMCRYPT_NUMBER_FORMAT numFormat,
516 _Out_writes_( cbDst ) PBYTE pbDst,
517 SIZE_T cbDst )
518{
519 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
520
521 PBYTE pbScratch = NULL;
522 UINT32 cbScratch = 0;
523
524 // Make sure that the key may be used in Encrypt/Decrypt
525 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
526 {
527 scError = SYMCRYPT_INVALID_ARGUMENT;
528 goto cleanup;
529 }
530
532
533 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
534 if (pbScratch == NULL)
535 {
536 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
537 goto cleanup;
538 }
539
540 scError = SymCryptRsaCoreEnc( pkRsakey, pbSrc, cbSrc, numFormat, flags, pbDst, cbDst, pbScratch, cbScratch );
541 if (scError != SYMCRYPT_NO_ERROR)
542 {
543 goto cleanup;
544 }
545
546 scError = SYMCRYPT_NO_ERROR;
547
548cleanup:
549 if (pbScratch!=NULL)
550 {
551 SymCryptWipe(pbScratch,cbScratch);
552 SymCryptCallbackFree(pbScratch);
553 }
554
555 return scError;
556}
557
561 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
563 SIZE_T cbSrc,
564 SYMCRYPT_NUMBER_FORMAT numFormat,
566 _Out_writes_( cbDst ) PBYTE pbDst,
567 SIZE_T cbDst )
568{
569 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
570
571 PBYTE pbScratch = NULL;
572 UINT32 cbScratch = 0;
573
574 // Make sure that the key may be used in Encrypt/Decrypt
575 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
576 {
577 scError = SYMCRYPT_INVALID_ARGUMENT;
578 goto cleanup;
579 }
580
581 // Make sure that the key has a private key
582 if (!pkRsakey->hasPrivateKey)
583 {
584 scError = SYMCRYPT_INVALID_ARGUMENT;
585 goto cleanup;
586 }
587
588#define SYMCRYPT_CRT_DECRYPTION (1) // Set this to 0 to test the non-crt decryption
589
590 // Scratch space
591#if (SYMCRYPT_CRT_DECRYPTION)
593#else
595#endif
596
597 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
598 if (pbScratch == NULL)
599 {
600 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
601 goto cleanup;
602 }
603
604#if (SYMCRYPT_CRT_DECRYPTION)
605 scError = SymCryptRsaCoreDecCrt( pkRsakey, pbSrc, cbSrc, numFormat, flags, pbDst, cbDst, pbScratch, cbScratch );
606#else
607 scError = SymCryptRsaCoreDec( pkRsakey, pbSrc, cbSrc, numFormat, flags, pbDst, cbDst, pbScratch, cbScratch );
608#endif
609
610 if (scError != SYMCRYPT_NO_ERROR)
611 {
612 goto cleanup;
613 }
614
615 scError = SYMCRYPT_NO_ERROR;
616
617cleanup:
618 if (pbScratch!=NULL)
619 {
620 SymCryptWipe(pbScratch,cbScratch);
621 SymCryptCallbackFree(pbScratch);
622 }
623
624 return scError;
625}
626
630 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
632 SIZE_T cbSrc,
636 SIZE_T cbDst,
637 _Out_ SIZE_T *pcbDst )
638{
639 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
640
641 PBYTE pbScratch = NULL;
642 SIZE_T cbScratch = 0;
643
644 PBYTE pbTmp = NULL;
645 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
646
647 cbScratch = cbTmp + SymCryptRsaCoreEncScratchSpace( pkRsakey );
648
650
651 // Make sure that the key may be used in Encrypt/Decrypt
652 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
653 {
654 scError = SYMCRYPT_INVALID_ARGUMENT;
655 goto cleanup;
656 }
657
658 *pcbDst = cbTmp;
659
660 // Check if only *pcbDst is needed
661 if (pbDst == NULL)
662 {
663 scError = SYMCRYPT_NO_ERROR;
664 goto cleanup;
665 }
666
667 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
668 if (pbScratch == NULL)
669 {
670 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
671 goto cleanup;
672 }
673
674 pbTmp = pbScratch + cbScratch - cbTmp;
675
677 pbSrc,
678 cbSrc,
679 pbTmp,
680 cbTmp );
681 if (scError != SYMCRYPT_NO_ERROR)
682 {
683 goto cleanup;
684 }
685
686 scError = SymCryptRsaCoreEnc(
687 pkRsakey,
688 pbTmp,
689 cbTmp,
690 SYMCRYPT_NUMBER_FORMAT_MSB_FIRST, // Always MSB first for RSA OAEP
691 flags,
692 pbDst,
693 cbDst,
694 pbScratch,
695 cbScratch - cbTmp );
696 if (scError != SYMCRYPT_NO_ERROR)
697 {
698 goto cleanup;
699 }
700
702 {
703 // To implement this revert the buffer properly
704 scError = SYMCRYPT_NOT_IMPLEMENTED;
705 goto cleanup;
706 }
707
708 scError = SYMCRYPT_NO_ERROR;
709
710cleanup:
711 if (pbScratch!=NULL)
712 {
713 SymCryptWipe(pbScratch,cbScratch);
714 SymCryptCallbackFree(pbScratch);
715 }
716
717 return scError;
718}
719
720// Ensure SymCryptRoundUpPow2Sizet below will not fail
722
726 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
728 SIZE_T cbSrc,
732 SIZE_T cbDst,
733 _Out_ SIZE_T *pcbDst )
734{
735 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
736
737 PBYTE pbScratch = NULL;
738 SIZE_T cbScratch = 0;
739
740 PBYTE pbTmp = NULL;
741 SIZE_T cbModulus = SymCryptRsakeySizeofModulus(pkRsakey);
742 SIZE_T cbTmp = SymCryptRoundUpPow2Sizet( cbModulus ); // tmp buffer needs to be a power of 2
743
744 // Make sure that the key may be used in Encrypt/Decrypt
745 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
746 {
747 scError = SYMCRYPT_INVALID_ARGUMENT;
748 goto cleanup;
749 }
750
751 // Make sure that the key has a private key
752 if (!pkRsakey->hasPrivateKey)
753 {
754 scError = SYMCRYPT_INVALID_ARGUMENT;
755 goto cleanup;
756 }
757
758#if (SYMCRYPT_CRT_DECRYPTION)
759 cbScratch = cbTmp + SymCryptRsaCoreDecCrtScratchSpace( pkRsakey );
760#else
761 cbScratch = cbTmp + SymCryptRsaCoreDecScratchSpace( pkRsakey );
762#endif
763
765
766 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
767 if (pbScratch == NULL)
768 {
769 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
770 goto cleanup;
771 }
772
773 pbTmp = pbScratch + cbScratch - cbTmp;
774
776 {
777 // To implement this revert the buffer properly
778 scError = SYMCRYPT_NOT_IMPLEMENTED;
779 goto cleanup;
780 }
781
782#if (SYMCRYPT_CRT_DECRYPTION)
783 scError = SymCryptRsaCoreDecCrt(
784 pkRsakey,
785 pbSrc,
786 cbSrc,
788 flags,
789 pbTmp,
790 cbModulus,
791 pbScratch,
792 cbScratch - cbTmp );
793#else
794 scError = SymCryptRsaCoreDec(
795 pkRsakey,
796 pbSrc,
797 cbSrc,
799 flags,
800 pbTmp,
801 cbModulus,
802 pbScratch,
803 cbScratch - cbTmp );
804#endif
805 if (scError != SYMCRYPT_NO_ERROR)
806 {
807 goto cleanup;
808 }
809
811 pbTmp,
812 cbModulus,
813 cbTmp,
814 pbDst,
815 cbDst,
816 pcbDst );
817 // The error that is returned from the encryption padding is confidential data
818 // due to Bleichenbacher-style attacks.
819 // Make sure we don't create a side-channel leak for it.
820
821cleanup:
822 if (pbScratch!=NULL)
823 {
824 SymCryptWipe(pbScratch,cbScratch);
825 SymCryptCallbackFree(pbScratch);
826 }
827
828 return scError;
829}
830
834 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
836 SIZE_T cbSrc,
837 _In_ PCSYMCRYPT_HASH hashAlgorithm,
838 _In_reads_bytes_( cbLabel ) PCBYTE pbLabel,
839 SIZE_T cbLabel,
843 SIZE_T cbDst,
844 _Out_ SIZE_T *pcbDst )
845{
846 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
847
848 PBYTE pbScratch = NULL;
849 SIZE_T cbScratch = 0;
850
851 PBYTE pbTmp = NULL;
852 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
853
855
856 // Make sure that the key may be used in Encrypt/Decrypt
857 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
858 {
859 scError = SYMCRYPT_INVALID_ARGUMENT;
860 goto cleanup;
861 }
862
863 *pcbDst = cbTmp;
864
865 // Check if only *pcbDst is needed
866 if (pbDst == NULL)
867 {
868 scError = SYMCRYPT_NO_ERROR;
869 goto cleanup;
870 }
871
872 // The SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP macro does not
873 // overflow cbScratch since cbTmp < 2^17.
874 cbScratch = cbTmp + SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP( hashAlgorithm, cbTmp ), SymCryptRsaCoreEncScratchSpace( pkRsakey ) );
875 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
876 if (pbScratch == NULL)
877 {
878 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
879 goto cleanup;
880 }
881
882 pbTmp = pbScratch + cbScratch - cbTmp;
883
885 pbSrc,
886 cbSrc,
887 hashAlgorithm,
888 pbLabel,
889 cbLabel,
890 NULL, // Seed
891 0, // cbSeed
892 pbTmp,
893 cbTmp,
894 pbScratch,
895 cbScratch - cbTmp );
896 if (scError != SYMCRYPT_NO_ERROR)
897 {
898 goto cleanup;
899 }
900
901 scError = SymCryptRsaCoreEnc(
902 pkRsakey,
903 pbTmp,
904 cbTmp,
905 SYMCRYPT_NUMBER_FORMAT_MSB_FIRST, // Always MSB first for RSA OAEP
906 flags,
907 pbDst,
908 cbDst,
909 pbScratch,
910 cbScratch - cbTmp );
911 if (scError != SYMCRYPT_NO_ERROR)
912 {
913 goto cleanup;
914 }
915
917 {
918 // To implement this revert the buffer properly
919 scError = SYMCRYPT_NOT_IMPLEMENTED;
920 goto cleanup;
921 }
922
923 scError = SYMCRYPT_NO_ERROR;
924
925cleanup:
926 if (pbScratch!=NULL)
927 {
928 SymCryptWipe(pbScratch,cbScratch);
929 SymCryptCallbackFree(pbScratch);
930 }
931
932 return scError;
933}
934
938 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
940 SIZE_T cbSrc,
942 _In_ PCSYMCRYPT_HASH hashAlgorithm,
943 _In_reads_bytes_( cbLabel ) PCBYTE pbLabel,
944 SIZE_T cbLabel,
947 SIZE_T cbDst,
948 _Out_ SIZE_T *pcbDst )
949{
950 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
951 SIZE_T cbDstResult = 0; // We always return a value into *pcbDst
952
953 PBYTE pbScratch = NULL;
954 SIZE_T cbScratch = 0;
955
956 PBYTE pbTmp = NULL;
957 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
958
960
961 // Make sure that the key may be used in Encrypt/Decrypt
962 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_ENCRYPT) == 0 )
963 {
964 scError = SYMCRYPT_INVALID_ARGUMENT;
965 goto cleanup;
966 }
967
968 if (cbSrc > cbTmp)
969 {
970 scError = SYMCRYPT_INVALID_ARGUMENT;
971 goto cleanup;
972 }
973
974 // Make sure that the key has a private key
975 if (!pkRsakey->hasPrivateKey)
976 {
977 scError = SYMCRYPT_INVALID_ARGUMENT;
978 goto cleanup;
979 }
980
981 // The SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP macro does not
982 // overflow cbScratch since cbTmp < 2^17.
983#if (SYMCRYPT_CRT_DECRYPTION)
985#else
986 cbScratch = cbTmp + SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP( hashAlgorithm, cbSrc ), SymCryptRsaCoreDecScratchSpace( pkRsakey ) );
987#endif
988
989 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
990 if (pbScratch == NULL)
991 {
992 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
993 goto cleanup;
994 }
995
996 pbTmp = pbScratch + cbScratch - cbTmp;
997
999 {
1000 // To implement this revert the buffer properly
1001 scError = SYMCRYPT_NOT_IMPLEMENTED;
1002 goto cleanup;
1003 }
1004
1005#if (SYMCRYPT_CRT_DECRYPTION)
1006 scError = SymCryptRsaCoreDecCrt(
1007 pkRsakey,
1008 pbSrc,
1009 cbSrc,
1011 flags,
1012 pbTmp,
1013 cbTmp,
1014 pbScratch,
1015 cbScratch - cbTmp );
1016#else
1017 scError = SymCryptRsaCoreDec(
1018 pkRsakey,
1019 pbSrc,
1020 cbSrc,
1022 flags,
1023 pbTmp,
1024 cbTmp,
1025 pbScratch,
1026 cbScratch - cbTmp );
1027#endif
1028
1029 if (scError != SYMCRYPT_NO_ERROR)
1030 {
1031 goto cleanup;
1032 }
1033
1035 pbTmp,
1036 cbTmp,
1037 hashAlgorithm,
1038 pbLabel,
1039 cbLabel,
1040 flags,
1041 pbDst,
1042 cbDst,
1043 &cbDstResult,
1044 pbScratch,
1045 cbScratch - cbTmp );
1046 if (scError != SYMCRYPT_NO_ERROR)
1047 {
1048 goto cleanup;
1049 }
1050
1051 scError = SYMCRYPT_NO_ERROR;
1052
1053cleanup:
1054 if (pbScratch!=NULL)
1055 {
1056 SymCryptWipe(pbScratch,cbScratch);
1057 SymCryptCallbackFree(pbScratch);
1058 }
1059
1060 *pcbDst = cbDstResult;
1061
1062 return scError;
1063}
1064
1065//
1066// Signing / Verification functions
1067//
1068
1072 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
1073 _In_reads_bytes_( cbHashValue ) PCBYTE pbHashValue,
1074 SIZE_T cbHashValue,
1075 _In_ PCSYMCRYPT_OID pHashOIDs,
1076 _In_ SIZE_T nOIDCount,
1077 UINT32 flags,
1078 SYMCRYPT_NUMBER_FORMAT nfSignature,
1079 _Out_writes_opt_( cbSignature ) PBYTE pbSignature,
1080 SIZE_T cbSignature,
1081 _Out_ SIZE_T *pcbSignature )
1082{
1083 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1084
1085 PBYTE pbScratch = NULL;
1086 SIZE_T cbScratch = 0;
1087
1088 PBYTE pbTmp = NULL;
1089 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
1090
1091 PCBYTE pbOID = NULL;
1092 SIZE_T cbOID = 0;
1093
1094 UNREFERENCED_PARAMETER(nOIDCount);
1095
1096 pbOID = pHashOIDs ? pHashOIDs->pbOID : NULL;
1097 cbOID = pHashOIDs ? pHashOIDs->cbOID : 0;
1098
1099 // Make sure that the key may be used in Sign/Verify
1100 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_SIGN) == 0 )
1101 {
1102 scError = SYMCRYPT_INVALID_ARGUMENT;
1103 goto cleanup;
1104 }
1105
1106 // Make sure that the key has a private key
1107 if (!pkRsakey->hasPrivateKey)
1108 {
1109 scError = SYMCRYPT_INVALID_ARGUMENT;
1110 goto cleanup;
1111 }
1112
1113 *pcbSignature = cbTmp;
1114
1115 // Check if only *pcbSignature is needed
1116 if (pbSignature == NULL)
1117 {
1118 scError = SYMCRYPT_NO_ERROR;
1119 goto cleanup;
1120 }
1121
1122#if (SYMCRYPT_CRT_DECRYPTION)
1123 cbScratch = cbTmp + SymCryptRsaCoreDecCrtScratchSpace( pkRsakey );
1124#else
1125 cbScratch = cbTmp + SymCryptRsaCoreDecScratchSpace( pkRsakey );
1126#endif
1127
1128 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
1129 if (pbScratch == NULL)
1130 {
1131 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1132 goto cleanup;
1133 }
1134
1135 pbTmp = pbScratch + cbScratch - cbTmp;
1136
1138 pbHashValue,
1139 cbHashValue,
1140 pbOID,
1141 cbOID,
1142 flags,
1143 pbTmp,
1144 cbTmp );
1145 if (scError != SYMCRYPT_NO_ERROR)
1146 {
1147 goto cleanup;
1148 }
1149
1150#if (SYMCRYPT_CRT_DECRYPTION)
1151 scError = SymCryptRsaCoreDecCrt(
1152 pkRsakey,
1153 pbTmp,
1154 cbTmp,
1156 flags,
1157 pbSignature,
1158 cbSignature,
1159 pbScratch,
1160 cbScratch - cbTmp );
1161#else
1162 scError = SymCryptRsaCoreDec(
1163 pkRsakey,
1164 pbTmp,
1165 cbTmp,
1167 flags,
1168 pbSignature,
1169 cbSignature,
1170 pbScratch,
1171 cbScratch - cbTmp );
1172#endif
1173 if (scError != SYMCRYPT_NO_ERROR)
1174 {
1175 goto cleanup;
1176 }
1177
1178 if (nfSignature == SYMCRYPT_NUMBER_FORMAT_LSB_FIRST)
1179 {
1180 // To implement this revert the buffer properly
1181 scError = SYMCRYPT_NOT_IMPLEMENTED;
1182 goto cleanup;
1183 }
1184
1185 scError = SYMCRYPT_NO_ERROR;
1186
1187cleanup:
1188 if (pbScratch!=NULL)
1189 {
1190 SymCryptWipe(pbScratch,cbScratch);
1191 SymCryptCallbackFree(pbScratch);
1192 }
1193
1194 return scError;
1195}
1196
1200 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
1201 _In_reads_bytes_( cbHashValue ) PCBYTE pbHashValue,
1202 SIZE_T cbHashValue,
1203 _In_reads_bytes_( cbSignature ) PCBYTE pbSignature,
1204 SIZE_T cbSignature,
1205 SYMCRYPT_NUMBER_FORMAT nfSignature,
1206 _In_reads_opt_( nOIDCount ) PCSYMCRYPT_OID pHashOIDs,
1207 _In_ SIZE_T nOIDCount,
1208 UINT32 flags )
1209{
1210 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1211
1212 PBYTE pbScratch = NULL;
1213 SIZE_T cbScratch = 0;
1214
1215 PBYTE pbTmp = NULL;
1216 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
1217
1218 // Make sure that the key may be used in Sign/Verify
1219 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_SIGN) == 0 )
1220 {
1221 scError = SYMCRYPT_INVALID_ARGUMENT;
1222 goto cleanup;
1223 }
1224
1225 if (cbSignature > cbTmp)
1226 {
1227 scError = SYMCRYPT_INVALID_ARGUMENT;
1228 goto cleanup;
1229 }
1230
1231 if (nfSignature == SYMCRYPT_NUMBER_FORMAT_LSB_FIRST)
1232 {
1233 // To implement this revert the buffer properly
1234 scError = SYMCRYPT_NOT_IMPLEMENTED;
1235 goto cleanup;
1236 }
1237
1238 // The SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PKCS1 macro does not
1239 // overflow cbScratch since cbTmp < 2^17.
1240 cbScratch = cbTmp +
1243
1244 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
1245 if (pbScratch == NULL)
1246 {
1247 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1248 goto cleanup;
1249 }
1250
1251 pbTmp = pbScratch + cbScratch - cbTmp;
1252
1253 scError = SymCryptRsaCoreEnc(
1254 pkRsakey,
1255 pbSignature,
1256 cbSignature,
1258 flags,
1259 pbTmp,
1260 cbTmp,
1261 pbScratch,
1262 cbScratch - cbTmp );
1263 if (scError != SYMCRYPT_NO_ERROR)
1264 {
1265 goto cleanup;
1266 }
1267
1269 pbHashValue,
1270 cbHashValue,
1271 pHashOIDs,
1272 nOIDCount,
1273 pbTmp,
1274 cbTmp,
1275 flags,
1276 pbScratch,
1277 cbScratch - cbTmp );
1278 if (scError != SYMCRYPT_NO_ERROR)
1279 {
1280 goto cleanup;
1281 }
1282
1283 scError = SYMCRYPT_NO_ERROR;
1284
1285cleanup:
1286 if (pbScratch!=NULL)
1287 {
1288 SymCryptWipe(pbScratch,cbScratch);
1289 SymCryptCallbackFree(pbScratch);
1290 }
1291
1292 return scError;
1293}
1294
1298 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
1299 _In_reads_bytes_( cbHashValue ) PCBYTE pbHashValue,
1300 SIZE_T cbHashValue,
1301 _In_ PCSYMCRYPT_HASH hashAlgorithm,
1302 SIZE_T cbSalt,
1303 UINT32 flags,
1304 SYMCRYPT_NUMBER_FORMAT nfSignature,
1305 _Out_writes_opt_( cbSignature ) PBYTE pbSignature,
1306 SIZE_T cbSignature,
1307 _Out_ SIZE_T *pcbSignature )
1308{
1309 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1310
1311 PBYTE pbScratch = NULL;
1312 SIZE_T cbScratch = 0;
1313
1314 PBYTE pbTmp = NULL;
1315 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
1316
1317 // Make sure that the key may be used in Sign/Verify
1318 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_SIGN) == 0 )
1319 {
1320 scError = SYMCRYPT_INVALID_ARGUMENT;
1321 goto cleanup;
1322 }
1323
1324 if ( (cbHashValue > cbTmp) ||
1325 (cbSalt > cbTmp) )
1326 {
1327 scError = SYMCRYPT_INVALID_ARGUMENT;
1328 goto cleanup;
1329 }
1330
1331 // Make sure that the key has a private key
1332 if (!pkRsakey->hasPrivateKey)
1333 {
1334 scError = SYMCRYPT_INVALID_ARGUMENT;
1335 goto cleanup;
1336 }
1337
1338 *pcbSignature = cbTmp;
1339
1340 // Check if only *pcbSignature is needed
1341 if (pbSignature == NULL)
1342 {
1343 scError = SYMCRYPT_NO_ERROR;
1344 goto cleanup;
1345 }
1346
1347 // The SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS macro does not
1348 // overflow cbScratch since cbTmp < 2^17.
1349#if (SYMCRYPT_CRT_DECRYPTION)
1350 cbScratch = cbTmp +
1352 SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS( hashAlgorithm, cbHashValue, cbTmp ) );
1353#else
1354 cbScratch = cbTmp +
1356 SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS( hashAlgorithm, cbHashValue, cbTmp ) );
1357#endif
1358
1359 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
1360 if (pbScratch == NULL)
1361 {
1362 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1363 goto cleanup;
1364 }
1365
1366 pbTmp = pbScratch + cbScratch - cbTmp;
1367
1369 pbHashValue,
1370 cbHashValue,
1371 hashAlgorithm,
1372 NULL, // For now only random salt supported
1373 cbSalt,
1374 pkRsakey->nBitsOfModulus,
1375 flags,
1376 pbTmp,
1377 cbTmp,
1378 pbScratch,
1379 cbScratch - cbTmp );
1380 if (scError != SYMCRYPT_NO_ERROR)
1381 {
1382 goto cleanup;
1383 }
1384
1385#if (SYMCRYPT_CRT_DECRYPTION)
1386 scError = SymCryptRsaCoreDecCrt(
1387 pkRsakey,
1388 pbTmp,
1389 cbTmp,
1391 flags,
1392 pbSignature,
1393 cbSignature,
1394 pbScratch,
1395 cbScratch - cbTmp );
1396#else
1397 scError = SymCryptRsaCoreDec(
1398 pkRsakey,
1399 pbTmp,
1400 cbTmp,
1402 flags,
1403 pbSignature,
1404 cbSignature,
1405 pbScratch,
1406 cbScratch - cbTmp );
1407#endif
1408 if (scError != SYMCRYPT_NO_ERROR)
1409 {
1410 goto cleanup;
1411 }
1412
1413 if (nfSignature == SYMCRYPT_NUMBER_FORMAT_LSB_FIRST)
1414 {
1415 // To implement this revert the buffer properly
1416 scError = SYMCRYPT_NOT_IMPLEMENTED;
1417 goto cleanup;
1418 }
1419
1420 scError = SYMCRYPT_NO_ERROR;
1421
1422cleanup:
1423 if (pbScratch!=NULL)
1424 {
1425 SymCryptWipe(pbScratch,cbScratch);
1426 SymCryptCallbackFree(pbScratch);
1427 }
1428
1429 return scError;
1430}
1431
1435 _In_ PCSYMCRYPT_RSAKEY pkRsakey,
1436 _In_reads_bytes_( cbHashValue ) PCBYTE pbHashValue,
1437 SIZE_T cbHashValue,
1438 _In_reads_bytes_( cbSignature ) PCBYTE pbSignature,
1439 SIZE_T cbSignature,
1440 SYMCRYPT_NUMBER_FORMAT nfSignature,
1441 _In_ PCSYMCRYPT_HASH hashAlgorithm,
1442 SIZE_T cbSalt,
1443 UINT32 flags )
1444{
1445 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1446
1447 PBYTE pbScratch = NULL;
1448 SIZE_T cbScratch = 0;
1449
1450 PBYTE pbTmp = NULL;
1451 SIZE_T cbTmp = SymCryptRsakeySizeofModulus(pkRsakey);
1452
1453 // Make sure that the key may be used in Sign/Verify
1454 if ( (pkRsakey->fAlgorithmInfo & SYMCRYPT_FLAG_RSAKEY_SIGN) == 0 )
1455 {
1456 scError = SYMCRYPT_INVALID_ARGUMENT;
1457 goto cleanup;
1458 }
1459
1460 if ( (cbHashValue > cbTmp) ||
1461 (cbSalt > cbTmp) ||
1462 (cbSignature > cbTmp) )
1463 {
1464 scError = SYMCRYPT_INVALID_ARGUMENT;
1465 goto cleanup;
1466 }
1467
1468 if (nfSignature == SYMCRYPT_NUMBER_FORMAT_LSB_FIRST)
1469 {
1470 // To implement this revert the buffer properly
1471 scError = SYMCRYPT_NOT_IMPLEMENTED;
1472 goto cleanup;
1473 }
1474
1475 // The SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS macro does not
1476 // overflow cbScratch since cbTmp < 2^17.
1477 cbScratch = cbTmp +
1479 SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS( hashAlgorithm, cbHashValue, cbTmp ) );
1480
1481 pbScratch = (PBYTE)SymCryptCallbackAlloc( cbScratch );
1482 if (pbScratch == NULL)
1483 {
1484 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1485 goto cleanup;
1486 }
1487
1488 pbTmp = pbScratch + cbScratch - cbTmp;
1489
1490 scError = SymCryptRsaCoreEnc(
1491 pkRsakey,
1492 pbSignature,
1493 cbSignature,
1495 flags,
1496 pbTmp,
1497 cbTmp,
1498 pbScratch,
1499 cbScratch - cbTmp );
1500 if (scError != SYMCRYPT_NO_ERROR)
1501 {
1502 goto cleanup;
1503 }
1504
1506 pbHashValue,
1507 cbHashValue,
1508 hashAlgorithm,
1509 cbSalt,
1510 pbTmp,
1511 cbTmp,
1512 pkRsakey->nBitsOfModulus,
1513 flags,
1514 pbScratch,
1515 cbScratch - cbTmp );
1516 if (scError != SYMCRYPT_NO_ERROR)
1517 {
1518 goto cleanup;
1519 }
1520
1521 scError = SYMCRYPT_NO_ERROR;
1522
1523cleanup:
1524 if (pbScratch!=NULL)
1525 {
1526 SymCryptWipe(pbScratch,cbScratch);
1527 SymCryptCallbackFree(pbScratch);
1528 }
1529
1530 return scError;
1531}
#define SIZE_T_MAX
Definition: dhcpd.h:91
#define NULL
Definition: types.h:112
static void cleanup(void)
Definition: main.c:1335
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
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
#define C_ASSERT(e)
Definition: intsafe.h:73
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Out_writes_opt_(s)
Definition: no_sal2.h:226
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_reads_opt_(s)
Definition: no_sal2.h:222
#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 SymCryptRsaPkcs1Verify(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature, SYMCRYPT_NUMBER_FORMAT nfSignature, _In_reads_opt_(nOIDCount) PCSYMCRYPT_OID pHashOIDs, _In_ SIZE_T nOIDCount, UINT32 flags)
Definition: rsa_enc.c:1199
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaCoreDecCrt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Out_writes_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_enc.c:208
UINT32 SYMCRYPT_CALL SymCryptRsaCoreEncScratchSpace(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsa_enc.c:15
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPssSign(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, _In_ PCSYMCRYPT_HASH hashAlgorithm, SIZE_T cbSalt, UINT32 flags, SYMCRYPT_NUMBER_FORMAT nfSignature, _Out_writes_opt_(cbSignature) PBYTE pbSignature, SIZE_T cbSignature, _Out_ SIZE_T *pcbSignature)
Definition: rsa_enc.c:1297
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaRawEncrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Out_writes_(cbDst) PBYTE pbDst, SIZE_T cbDst)
Definition: rsa_enc.c:510
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPssVerify(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature, SYMCRYPT_NUMBER_FORMAT nfSignature, _In_ PCSYMCRYPT_HASH hashAlgorithm, SIZE_T cbSalt, UINT32 flags)
Definition: rsa_enc.c:1434
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1Sign(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, _In_ PCSYMCRYPT_OID pHashOIDs, _In_ SIZE_T nOIDCount, UINT32 flags, SYMCRYPT_NUMBER_FORMAT nfSignature, _Out_writes_opt_(cbSignature) PBYTE pbSignature, SIZE_T cbSignature, _Out_ SIZE_T *pcbSignature)
Definition: rsa_enc.c:1071
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1Decrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT nfSrc, UINT32 flags, _Out_writes_opt_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_ SIZE_T *pcbDst)
Definition: rsa_enc.c:725
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaRawDecrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Out_writes_(cbDst) PBYTE pbDst, SIZE_T cbDst)
Definition: rsa_enc.c:560
SYMCRYPT_ERROR SymCryptRsaCoreVerifyInput(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, SIZE_T cbDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_enc.c:24
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaCoreDec(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Out_writes_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_enc.c:429
UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecCrtScratchSpace(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsa_enc.c:170
UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecScratchSpace(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsa_enc.c:198
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaCoreEnc(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Out_writes_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_enc.c:77
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaOaepEncrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_reads_bytes_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, UINT32 flags, SYMCRYPT_NUMBER_FORMAT nfDst, _Out_writes_opt_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_ SIZE_T *pcbDst)
Definition: rsa_enc.c:833
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaOaepDecrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT nfSrc, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_reads_bytes_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, UINT32 flags, _Out_writes_opt_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_ SIZE_T *pcbDst)
Definition: rsa_enc.c:937
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1Encrypt(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, SYMCRYPT_NUMBER_FORMAT nfDst, _Out_writes_opt_(cbDst) PBYTE pbDst, SIZE_T cbDst, _Out_ SIZE_T *pcbDst)
Definition: rsa_enc.c:629
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
UINT32 SYMCRYPT_CALL SymCryptRsakeySizeofModulus(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsakey.c:264
enum _SYMCRYPT_NUMBER_FORMAT SYMCRYPT_NUMBER_FORMAT
#define SYMCRYPT_FLAG_RSAKEY_SIGN
Definition: symcrypt.h:7598
#define SYMCRYPT_FLAG_RSAKEY_ENCRYPT
Definition: symcrypt.h:7599
@ SYMCRYPT_NUMBER_FORMAT_MSB_FIRST
Definition: symcrypt.h:7017
@ SYMCRYPT_NUMBER_FORMAT_LSB_FIRST
Definition: symcrypt.h:7016
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCBYTE pbSrc
#define SYMCRYPT_CALL
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES
const SYMCRYPT_HASH * PCSYMCRYPT_HASH
#define SYMCRYPT_MIN(_a, _b)
#define SYMCRYPT_MAX(_a, _b)
UINT32 nPrimes
const SYMCRYPT_RSAKEY * PCSYMCRYPT_RSAKEY
PCBYTE PBYTE pbDst
UINT32 cbModElement
#define SYMCRYPT_ASYM_ALIGN_VALUE
#define SYMCRYPT_RSAKEY_MAX_BITSIZE_MODULUS
#define SYMCRYPT_ASYM_ALIGN_UP(_p)
const BYTE * PCBYTE
const SYMCRYPT_MODULUS * PCSYMCRYPT_MODULUS
SYMCRYPT_INT * PSYMCRYPT_INT
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCrtSolve(UINT32 nCoprimes, _In_reads_(nCoprimes) PCSYMCRYPT_MODULUS *ppmCoprimes, _In_reads_(nCoprimes) PCSYMCRYPT_MODELEMENT *ppeCrtInverses, _In_reads_(nCoprimes) PCSYMCRYPT_MODELEMENT *ppeCrtRemainders, UINT32 flags, _Out_ PSYMCRYPT_INT piSolution, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: crt.c:123
VOID SYMCRYPT_CALL SymCryptIntWipe(_Out_ PSYMCRYPT_INT piObj)
Definition: a_dispatch.c:151
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
Definition: a_dispatch.c:442
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:658
VOID SYMCRYPT_CALL SymCryptIntToModElement(_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:749
#define SYMCRYPT_SIZEOF_INT_FROM_BITS(_bitsize)
VOID SYMCRYPT_CALL SymCryptIntSetValueUint64(UINT64 u64Src, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:239
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaOaepRemoveEncryptionPadding(_In_reads_bytes_(cbOAEPFormat) PCBYTE pbOAEPFormat, SIZE_T cbOAEPFormat, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_reads_bytes_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, UINT32 flags, _Out_writes_bytes_(cbPlaintext) PBYTE pbPlaintext, SIZE_T cbPlaintext, _Out_ SIZE_T *pcbPlaintext, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_padding.c:480
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptDivisorFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:703
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD(_nSrcDigits, _nDivisorDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PKCS1(_nBytesPKCS1)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPssVerifySignaturePadding(_In_reads_bytes_(cbHash) PCBYTE pbHash, SIZE_T cbHash, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_range_(0, cbPSSFormat) SIZE_T cbSalt, _In_reads_bytes_(cbPSSFormat) PCBYTE pbPSSFormat, SIZE_T cbPSSFormat, UINT32 nBitsOfModulus, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_padding.c:1051
#define SYMCRYPT_SCRATCH_BYTES_FOR_CRT_SOLUTION(_nDigits)
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
#define SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS(_bitsize)
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
#define SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP(_hashAlgorithm, _nBytesOAEP)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1ApplySignaturePadding(_In_reads_bytes_(cbHash) PCBYTE pbHash, SIZE_T cbHash, _In_reads_bytes_(cbHashOid) PCBYTE pbHashOid, SIZE_T cbHashOid, UINT32 flags, _Out_writes_bytes_(cbPKCS1Format) PBYTE pbPKCS1Format, SIZE_T cbPKCS1Format)
Definition: rsa_padding.c:651
SIZE_T SYMCRYPT_CALL SymCryptRoundUpPow2Sizet(SIZE_T v)
Definition: scsTools.c:76
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1VerifySignaturePadding(_In_reads_bytes_(cbHash) PCBYTE pbHash, SIZE_T cbHash, _In_reads_(nOIDCount) PCSYMCRYPT_OID pHashOIDs, _In_ SIZE_T nOIDCount, _In_reads_bytes_(cbPKCS1Format) PCBYTE pbPKCS1Format, SIZE_T cbPKCS1Format, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_padding.c:827
VOID SYMCRYPT_CALL SymCryptModElementToInt(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:762
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:720
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1RemoveEncryptionPadding(_Inout_updates_bytes_(cbPkcs1Buffer) PBYTE pbPkcs1Format, SIZE_T cbPkcs1Format, SIZE_T cbPkcs1Buffer, _Out_writes_bytes_opt_(cbPlaintext) PBYTE pbPlaintext, SIZE_T cbPlaintext, _Out_ SIZE_T *pcbPlaintext)
Definition: rsa_padding.c:237
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfValue(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:223
#define SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PSS(_hashAlgorithm, _nBytesMessage, _nBytesPSS)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPssApplySignaturePadding(_In_reads_bytes_(cbHash) PCBYTE pbHash, SIZE_T cbHash, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_reads_bytes_opt_(cbSalt) PCBYTE pbSalt, _In_range_(0, cbPSSFormat) SIZE_T cbSalt, UINT32 nBitsOfModulus, UINT32 flags, _Out_writes_bytes_(cbPSSFormat) PBYTE pbPSSFormat, SIZE_T cbPSSFormat, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_padding.c:918
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
Definition: a_dispatch.c:134
VOID SYMCRYPT_CALL SymCryptModExp(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peBase, _In_ PCSYMCRYPT_INT piExp, UINT32 nBitsExp, UINT32 flags, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:961
VOID SYMCRYPT_CALL SymCryptIntDivMod(_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_DIVISOR pdDivisor, _Out_opt_ PSYMCRYPT_INT piQuotient, _Out_opt_ PSYMCRYPT_INT piRemainder, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: a_dispatch.c:573
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaPkcs1ApplyEncryptionPadding(_In_reads_bytes_(cbPlaintext) PCBYTE pbPlaintext, SIZE_T cbPlaintext, _Out_writes_bytes_(cbPkcs1Format) PBYTE pbPkcs1Format, SIZE_T cbPkcs1Format)
Definition: rsa_padding.c:180
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntGetValue(_In_ PCSYMCRYPT_INT piSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format)
Definition: a_dispatch.c:259
UINT32 SYMCRYPT_CALL SymCryptIntIsEqual(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
Definition: a_dispatch.c:433
#define SYMCRYPT_FLAG_DATA_PUBLIC
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaOaepApplyEncryptionPadding(_In_reads_bytes_(cbPlaintext) PCBYTE pbPlaintext, SIZE_T cbPlaintext, _In_ PCSYMCRYPT_HASH hashAlgorithm, _In_reads_bytes_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, _In_reads_bytes_opt_(cbSeed) PCBYTE pbSeed, SIZE_T cbSeed, _Out_writes_bytes_(cbOaepFormat) PBYTE pbOaepFormat, SIZE_T cbOaepFormat, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
Definition: rsa_padding.c:364
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: a_dispatch.c:141
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59
unsigned char BYTE
Definition: xxhash.c:193