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

Go to the source code of this file.

Macros

#define SYMCRYPT_CRT_DECRYPTION   (1)
 

Functions

UINT32 SYMCRYPT_CALL SymCryptRsaCoreEncScratchSpace (_In_ PCSYMCRYPT_RSAKEY pkRsakey)
 
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)
 
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)
 
UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecCrtScratchSpace (_In_ PCSYMCRYPT_RSAKEY pkRsakey)
 
UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecScratchSpace (_In_ PCSYMCRYPT_RSAKEY pkRsakey)
 
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)
 
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)
 
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)
 
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)
 
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)
 
 C_ASSERT ((UINT32)((SYMCRYPT_RSAKEY_MAX_BITSIZE_MODULUS+7)/8)<=((SIZE_T_MAX/2)+1))
 
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)
 
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)
 
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)
 
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)
 
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)
 
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)
 
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)
 

Macro Definition Documentation

◆ SYMCRYPT_CRT_DECRYPTION

#define SYMCRYPT_CRT_DECRYPTION   (1)

Function Documentation

◆ C_ASSERT()

C_ASSERT ( (UINT32)((SYMCRYPT_RSAKEY_MAX_BITSIZE_MODULUS+7)/8)<=((SIZE_T_MAX/2)+1)  )

◆ SymCryptRsaCoreDec()

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 at line 429 of file rsa_enc.c.

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}
#define NULL
Definition: types.h:112
static void cleanup(void)
Definition: main.c:1335
GLbitfield flags
Definition: glext.h:7161
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
BYTE * PBYTE
Definition: pedump.c:66
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
UINT32 SYMCRYPT_CALL SymCryptRsakeySizeofModulus(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsakey.c:264
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCBYTE pbSrc
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_MAX(_a, _b)
PCBYTE PBYTE pbDst
UINT32 cbModElement
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
Definition: a_dispatch.c:658
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
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
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_COMMON_MOD_OPERATIONS(_nDigits)
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
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptRsaOaepDecrypt(), SymCryptRsaPkcs1Decrypt(), SymCryptRsaPkcs1Sign(), SymCryptRsaPssSign(), and SymCryptRsaRawDecrypt().

◆ SymCryptRsaCoreDecCrt()

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 at line 208 of file rsa_enc.c.

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}
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
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
#define SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES
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 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
VOID SYMCRYPT_CALL SymCryptIntSetValueUint64(UINT64 u64Src, _Out_ PSYMCRYPT_INT piDst)
Definition: a_dispatch.c:239
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_CRT_SOLUTION(_nDigits)
#define SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS(_bitsize)
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
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
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfValue(_In_ PCSYMCRYPT_INT piSrc)
Definition: a_dispatch.c:223
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
Definition: a_dispatch.c:134
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 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
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
Definition: a_dispatch.c:141

Referenced by SymCryptRsaOaepDecrypt(), SymCryptRsaPkcs1Decrypt(), SymCryptRsaPkcs1Sign(), SymCryptRsaPssSign(), and SymCryptRsaRawDecrypt().

◆ SymCryptRsaCoreDecCrtScratchSpace()

UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecCrtScratchSpace ( _In_ PCSYMCRYPT_RSAKEY  pkRsakey)

Definition at line 170 of file rsa_enc.c.

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}
#define SYMCRYPT_MIN(_a, _b)
UINT32 nPrimes

Referenced by SymCryptRsaOaepDecrypt(), SymCryptRsaPkcs1Decrypt(), SymCryptRsaPkcs1Sign(), SymCryptRsaPssSign(), and SymCryptRsaRawDecrypt().

◆ SymCryptRsaCoreDecScratchSpace()

UINT32 SYMCRYPT_CALL SymCryptRsaCoreDecScratchSpace ( _In_ PCSYMCRYPT_RSAKEY  pkRsakey)

Definition at line 198 of file rsa_enc.c.

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}

Referenced by SymCryptRsaOaepDecrypt(), SymCryptRsaPkcs1Decrypt(), SymCryptRsaPkcs1Sign(), SymCryptRsaPssSign(), and SymCryptRsaRawDecrypt().

◆ SymCryptRsaCoreEnc()

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 at line 77 of file rsa_enc.c.

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}
#define SYMCRYPT_ASYM_ALIGN_VALUE
#define SYMCRYPT_ASYM_ALIGN_UP(_p)
VOID SYMCRYPT_CALL SymCryptIntWipe(_Out_ PSYMCRYPT_INT piObj)
Definition: a_dispatch.c:151
#define SYMCRYPT_SIZEOF_INT_FROM_BITS(_bitsize)
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptRsaOaepEncrypt(), SymCryptRsaPkcs1Encrypt(), SymCryptRsaPkcs1Verify(), SymCryptRsaPssVerify(), and SymCryptRsaRawEncrypt().

◆ SymCryptRsaCoreEncScratchSpace()

UINT32 SYMCRYPT_CALL SymCryptRsaCoreEncScratchSpace ( _In_ PCSYMCRYPT_RSAKEY  pkRsakey)

Definition at line 15 of file rsa_enc.c.

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}

Referenced by SymCryptRsaOaepEncrypt(), SymCryptRsaPkcs1Encrypt(), SymCryptRsaPkcs1Verify(), SymCryptRsaPssVerify(), and SymCryptRsaRawEncrypt().

◆ SymCryptRsaCoreVerifyInput()

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 at line 24 of file rsa_enc.c.

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}
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
Definition: a_dispatch.c:442
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
Definition: a_dispatch.c:720

Referenced by SymCryptRsaCoreDecCrt(), and SymCryptRsaCoreEnc().

◆ SymCryptRsaOaepDecrypt()

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 at line 937 of file rsa_enc.c.

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}
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
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
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
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
#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 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
#define SYMCRYPT_SCRATCH_BYTES_FOR_RSA_OAEP(_hashAlgorithm, _nBytesOAEP)

◆ SymCryptRsaOaepEncrypt()

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 at line 833 of file rsa_enc.c.

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}
UINT32 SYMCRYPT_CALL SymCryptRsaCoreEncScratchSpace(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
Definition: rsa_enc.c:15
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 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

◆ SymCryptRsaPkcs1Decrypt()

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 at line 725 of file rsa_enc.c.

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}
SIZE_T SYMCRYPT_CALL SymCryptRoundUpPow2Sizet(SIZE_T v)
Definition: scsTools.c:76
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

◆ SymCryptRsaPkcs1Encrypt()

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 at line 629 of file rsa_enc.c.

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}
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

◆ SymCryptRsaPkcs1Sign()

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 at line 1071 of file rsa_enc.c.

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}
#define SYMCRYPT_FLAG_RSAKEY_SIGN
Definition: symcrypt.h:7598
const BYTE * PCBYTE
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

◆ SymCryptRsaPkcs1Verify()

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 at line 1199 of file rsa_enc.c.

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}
#define SYMCRYPT_SCRATCH_BYTES_FOR_RSA_PKCS1(_nBytesPKCS1)
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

◆ SymCryptRsaPssSign()

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 at line 1297 of file rsa_enc.c.

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}
#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

◆ SymCryptRsaPssVerify()

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 at line 1434 of file rsa_enc.c.

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}
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

◆ SymCryptRsaRawDecrypt()

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 at line 560 of file rsa_enc.c.

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}

◆ SymCryptRsaRawEncrypt()

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 at line 510 of file rsa_enc.c.

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}