28#ifdef OC_CRYPTO_SUPPORTS_SHA256
29STATIC CONST UINT8 mPkcsDigestEncodingPrefixSha256[] = {
30 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
31 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
35#ifdef OC_CRYPTO_SUPPORTS_SHA384
36STATIC CONST UINT8 mPkcsDigestEncodingPrefixSha384[] = {
37 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
38 0x02, 0x02, 0x05, 0x00, 0x04, 0x30
42#ifdef OC_CRYPTO_SUPPORTS_SHA512
43STATIC CONST UINT8 mPkcsDigestEncodingPrefixSha512[] = {
44 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04,
45 0x02, 0x03, 0x05, 0x00, 0x04, 0x40
64 if ((ModulusSize & (ModulusSize - 1U)) != 0) {
68 return (PcdGet16 (PcdOcCryptoAllowedRsaModuli) & ModulusSize) != 0;
83 return (PcdGet16 (PcdOcCryptoAllowedSigHashTypes) & (1U << Type)) != 0;
101 ASSERT (HashSize <=
sizeof (DataDigest));
104 #ifdef OC_CRYPTO_SUPPORTS_SHA512
108 Sha512 (DataDigest, Data, DataSize);
113 #ifdef OC_CRYPTO_SUPPORTS_SHA384
117 Sha384 (DataDigest, Data, DataSize);
122 #ifdef OC_CRYPTO_SUPPORTS_SHA256
126 Sha256 (DataDigest, Data, DataSize);
171 IN UINTN SignatureSize,
172 IN CONST UINT8 *
Hash,
187 CONST UINT8 *Padding;
198 ASSERT (SignatureSize > 0);
204 "New switch cases have to be added for every introduced algorithm."
216 #ifdef OC_CRYPTO_SUPPORTS_SHA256
221 Padding = mPkcsDigestEncodingPrefixSha256;
222 PaddingSize =
sizeof (mPkcsDigestEncodingPrefixSha256);
227 #ifdef OC_CRYPTO_SUPPORTS_SHA384
232 Padding = mPkcsDigestEncodingPrefixSha384;
233 PaddingSize =
sizeof (mPkcsDigestEncodingPrefixSha384);
238 #ifdef OC_CRYPTO_SUPPORTS_SHA512
243 Padding = mPkcsDigestEncodingPrefixSha512;
244 PaddingSize =
sizeof (mPkcsDigestEncodingPrefixSha512);
266 if (SignatureSize != ModulusSize) {
267 DEBUG ((DEBUG_INFO,
"OCCR: Signature length does not match key length\n"));
271 EncryptedSigNum = Scratch;
272 DecryptedSigNum = EncryptedSigNum + NumWords;
273 PowScratchNum = DecryptedSigNum + NumWords;
309 DecryptedSigNum[NumWords - 1 - Index]
311 EncryptedSigNum[Index] = Tmp;
332 DigestSize = PaddingSize + HashSize;
333 if (SignatureSize < DigestSize + 11) {
347 for (Index = 2; Index < SignatureSize - DigestSize - 3 + 2; ++Index) {
360 if (CmpResult != 0) {
364 Index += PaddingSize;
367 if (CmpResult != 0) {
374 ASSERT (Index + HashSize == SignatureSize);
408 IN UINTN SignatureSize,
409 IN CONST UINT8 *Data,
423 ASSERT (SignatureSize > 0);
429 "New switch cases have to be added for every introduced algorithm."
433 #ifdef OC_CRYPTO_SUPPORTS_SHA256
442 #ifdef OC_CRYPTO_SUPPORTS_SHA384
451 #ifdef OC_CRYPTO_SUPPORTS_SHA512
485#ifndef OC_CRYPTO_STATIC_MEMORY_ALLOCATION
489 IN CONST UINT8 *Modulus,
490 IN UINTN ModulusSize,
493 IN UINTN SignatureSize,
494 IN CONST UINT8 *Data,
514 ASSERT (SignatureSize > 0);
526 "The usage of BIG_NUM_MONT_PARAMS_SCRATCH_SIZE may be unsafe"
535 "An overflow verification must be added"
538 Memory = AllocatePool (
541 if (Memory == NULL) {
545 N = &Memory[0 * ModulusNumWords];
546 RSqrMod = &Memory[1 * ModulusNumWords];
547 Mont = &Memory[2 * ModulusNumWords];
562 if (Scratch == NULL) {
592 IN UINTN SignatureSize,
593 IN CONST UINT8 *
Hash,
601 ASSERT (SignatureSize > 0);
607 "The parentheses need to be changed to avoid truncation."
628#ifndef OC_CRYPTO_NDYNALLOC
634 IN UINTN SignatureSize,
635 IN CONST UINT8 *
Hash,
648 Scratch = AllocatePool (
651 if (Scratch == NULL) {
676 IN UINTN SignatureSize,
677 IN CONST UINT8 *Data,
685 ASSERT (SignatureSize > 0);
691 "The parentheses need to be changed to avoid truncation."
712#ifndef OC_CRYPTO_NDYNALLOC
718 IN UINTN SignatureSize,
719 IN CONST UINT8 *Data,
732 Scratch = AllocatePool (
735 if (Scratch == NULL) {
BOOLEAN BigNumPowMod(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWords, IN CONST OC_BN_WORD *A, IN UINT32 B, IN CONST OC_BN_WORD *N, IN OC_BN_WORD N0Inv, IN CONST OC_BN_WORD *RSqrMod, IN OC_BN_WORD *ATmp)
OC_BN_WORD BigNumCalculateMontParams(IN OUT OC_BN_WORD *RSqrMod, IN OC_BN_NUM_WORDS NumWords, IN CONST OC_BN_WORD *N, IN OC_BN_WORD *Scratch)
OC_BN_WORD BigNumSwapWord(IN OC_BN_WORD Word)
#define OC_BN_MONT_MAX_SIZE
#define OC_BN_SIZE(NumWords)
VOID BigNumParseBuffer(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWords, IN CONST UINT8 *Buffer, IN UINTN BufferSize)
#define BIG_NUM_MONT_PARAMS_SCRATCH_SIZE(NumWords)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
VOID Sha384(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
#define OC_MAX_SHA_DIGEST_SIZE
#define SHA512_DIGEST_SIZE
#define SHA256_DIGEST_SIZE
enum OC_SIG_HASH_TYPE_ OC_SIG_HASH_TYPE
#define RSA_SCRATCH_BUFFER_SIZE(ModulusSize)
VOID Sha256(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
VOID Sha512(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
#define SHA384_DIGEST_SIZE
BOOLEAN RsaVerifySigHashFromKeyDynalloc(IN CONST OC_RSA_PUBLIC_KEY *Key, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Hash, IN UINTN HashSize, IN OC_SIG_HASH_TYPE Algorithm)
BOOLEAN RsaVerifySigHashFromKey(IN CONST OC_RSA_PUBLIC_KEY *Key, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Hash, IN UINTN HashSize, IN OC_SIG_HASH_TYPE Algorithm, IN VOID *Scratch)
STATIC BOOLEAN InternalSigHashTypeIsAllowed(IN OC_SIG_HASH_TYPE Type)
INTN SigVerifyShaHashBySize(IN CONST VOID *Data, IN UINTN DataSize, IN CONST UINT8 *Hash, IN UINTN HashSize)
STATIC BOOLEAN RsaVerifySigDataFromProcessed(IN CONST OC_BN_WORD *N, IN OC_BN_NUM_WORDS NumWords, IN OC_BN_WORD N0Inv, IN CONST OC_BN_WORD *RSqrMod, IN UINT32 Exponent, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Data, IN UINTN DataSize, IN OC_SIG_HASH_TYPE Algorithm, IN OC_BN_WORD *Scratch)
BOOLEAN RsaVerifySigDataFromData(IN CONST UINT8 *Modulus, IN UINTN ModulusSize, IN UINT32 Exponent, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Data, IN UINTN DataSize, IN OC_SIG_HASH_TYPE Algorithm)
STATIC BOOLEAN RsaVerifySigHashFromProcessed(IN CONST OC_BN_WORD *N, IN OC_BN_NUM_WORDS NumWords, IN OC_BN_WORD N0Inv, IN CONST OC_BN_WORD *RSqrMod, IN UINT32 Exponent, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Hash, IN UINTN HashSize, IN OC_SIG_HASH_TYPE Algorithm, IN OC_BN_WORD *Scratch)
BOOLEAN RsaVerifySigDataFromKeyDynalloc(IN CONST OC_RSA_PUBLIC_KEY *Key, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Data, IN UINTN DataSize, IN OC_SIG_HASH_TYPE Algorithm)
BOOLEAN RsaVerifySigDataFromKey(IN CONST OC_RSA_PUBLIC_KEY *Key, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Data, IN UINTN DataSize, IN OC_SIG_HASH_TYPE Algorithm, IN VOID *Scratch)
STATIC BOOLEAN InternalRsaModulusSizeIsAllowed(IN OC_BN_SIZE ModulusSize)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)