OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcCryptoLib.h
Go to the documentation of this file.
1
19#ifndef OC_CRYPTO_LIB_H
20#define OC_CRYPTO_LIB_H
21
22//
23// Default to 128-bit key length for AES.
24//
25#ifndef CONFIG_AES_KEY_SIZE
26#define CONFIG_AES_KEY_SIZE 16
27#endif
28
29//
30// Set supported hashes to all by default.
31//
32#ifndef CONFIG_HAS_SUPPORTED_HASHES
33#define OC_CRYPTO_SUPPORTS_SHA256 1
34#define OC_CRYPTO_SUPPORTS_SHA384 1
35#define OC_CRYPTO_SUPPORTS_SHA512 1
36#define OC_CRYPTO_SUPPORTS_SHA1 1
37#define OC_CRYPTO_SUPPORTS_MD5 1
38#endif
39
40//
41// Digest sizes.
42//
43#define MD5_DIGEST_SIZE 16
44#define SHA1_DIGEST_SIZE 20
45#define SHA256_DIGEST_SIZE 32
46#define SHA384_DIGEST_SIZE 48
47#define SHA512_DIGEST_SIZE 64
48
49#define OC_MAX_SHA_DIGEST_SIZE SHA512_DIGEST_SIZE
50
51//
52// Block sizes.
53//
54#define SHA256_BLOCK_SIZE 64
55#define SHA512_BLOCK_SIZE 128
56#define SHA384_BLOCK_SIZE SHA512_BLOCK_SIZE
57
58//
59// Derived parameters.
60//
61#define AES_BLOCK_SIZE 16
62
63//
64// Support all AES key sizes.
65//
66#if CONFIG_AES_KEY_SIZE == 32
67#define AES_KEY_EXP_SIZE 240
68#elif CONFIG_AES_KEY_SIZE == 24
69#define AES_KEY_EXP_SIZE 208
70#elif CONFIG_AES_KEY_SIZE == 16
71#define AES_KEY_EXP_SIZE 176
72#else
73 #error "Only AES-128, AES-192, and AES-256 are supported!"
74#endif
75
76//
77// ChaCha key size.
78//
79#define CHACHA_KEY_SIZE 32
80
81//
82// ChaCha IV size.
83//
84#define CHACHA_IV_SIZE 12
85
86//
87// Maximum OpenCore password length.
88//
89#define OC_PASSWORD_MAX_LEN 32
90
91//
92// Maximum OpenCore password retries.
93//
94#define OC_PASSWORD_MAX_RETRIES 3
95
96//
97// Possible RSA algorithm types supported by OcCryptoLib
98// for RSA digital signature verification
99// PcdOcCryptoAllowedSigHashTypes MUST be kept in sync with changes!
100//
107
112
113typedef struct CHACHA_CONTEXT_ {
114 UINT32 Input[16];
116
117typedef struct MD5_CONTEXT_ {
118 UINT8 Data[64];
119 UINT32 DataLen;
120 UINT64 BitLen;
121 UINT32 State[4];
123
124typedef struct SHA1_CONTEXT_ {
125 UINT8 Data[64];
126 UINT32 DataLen;
127 UINT64 BitLen;
128 UINT32 State[5];
129 UINT32 K[4];
131
132typedef struct SHA256_CONTEXT_ {
133 UINT8 Data[64];
134 UINT32 DataLen;
135 UINT64 BitLen;
136 UINT32 State[8];
138
145
147
152typedef struct {
156 UINT16 NumQwords;
160 UINT8 Reserved[6];
164 UINT64 N0Inv;
166
168 sizeof (OC_RSA_PUBLIC_KEY_HDR) == 16,
169 "The PK header struct is malformed."
170 );
171
172typedef struct {
180 UINT64 Data[];
182
184 sizeof (OC_RSA_PUBLIC_KEY_HDR) == sizeof (OC_RSA_PUBLIC_KEY_HDR),
185 "The PK struct is malformed."
186 );
187
188//
189// Functions prototypes
190//
191
192VOID
194 OUT AES_CONTEXT *Context,
195 IN CONST UINT8 *Key,
196 IN CONST UINT8 *Iv
197 );
198
199VOID
201 OUT AES_CONTEXT *Context,
202 IN CONST UINT8 *Iv
203 );
204
205//
206// Data size MUST be mutiple of AES_BLOCK_SIZE;
207// Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for Padding scheme
208// NOTES: you need to set Iv in Context via AesInitCtxIv() or AesSetCtxIv()
209// no Iv should ever be reused with the same key
210//
211VOID
213 IN OUT AES_CONTEXT *Context,
214 IN OUT UINT8 *Data,
215 IN UINT32 Len
216 );
217
218VOID
220 IN OUT AES_CONTEXT *Context,
221 IN OUT UINT8 *Data,
222 IN UINT32 Len
223 );
224
225//
226// Same function for encrypting as for decrypting.
227// Iv is incremented for every block, and used after encryption as XOR-compliment for output
228// Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for Padding scheme
229// NOTES: you need to set Iv in Context via AesInitCtxIv() or AesSetCtxIv()
230// no Iv should ever be reused with the same key
231//
232VOID
234 IN OUT AES_CONTEXT *Context,
235 IN OUT UINT8 *Data,
236 IN UINT32 Len
237 );
238
247VOID
249 OUT CHACHA_CONTEXT *Context,
250 IN CONST UINT8 *Key,
251 IN CONST UINT8 *Iv,
252 IN UINT32 Counter
253 );
254
264VOID
266 IN OUT CHACHA_CONTEXT *Context,
267 IN CONST UINT8 *Source,
268 OUT UINT8 *Destination,
269 IN UINT32 Length
270 );
271
272VOID
274 MD5_CONTEXT *Context
275 );
276
277VOID
279 MD5_CONTEXT *Context,
280 CONST UINT8 *Data,
281 UINTN Len
282 );
283
284VOID
286 MD5_CONTEXT *Context,
287 UINT8 *Hash
288 );
289
290VOID
292 UINT8 *Hash,
293 UINT8 *Data,
294 UINTN Len
295 );
296
297VOID
299 SHA1_CONTEXT *Context
300 );
301
302VOID
304 SHA1_CONTEXT *Context,
305 CONST UINT8 *Data,
306 UINTN Len
307 );
308
309VOID
311 SHA1_CONTEXT *Context,
312 UINT8 *Hash
313 );
314
315VOID
317 UINT8 *Hash,
318 UINT8 *Data,
319 UINTN Len
320 );
321
322VOID
324 SHA256_CONTEXT *Context
325 );
326
327VOID
329 SHA256_CONTEXT *Context,
330 CONST UINT8 *Data,
331 UINTN Len
332 );
333
334VOID
336 SHA256_CONTEXT *Context,
337 UINT8 *HashDigest
338 );
339
340VOID
342 UINT8 *Hash,
343 CONST UINT8 *Data,
344 UINTN Len
345 );
346
347VOID
349 SHA512_CONTEXT *Context
350 );
351
352VOID
354 SHA512_CONTEXT *Context,
355 CONST UINT8 *Data,
356 UINTN Len
357 );
358
359VOID
361 SHA512_CONTEXT *Context,
362 UINT8 *HashDigest
363 );
364
365VOID
367 UINT8 *Hash,
368 CONST UINT8 *Data,
369 UINTN Len
370 );
371
372VOID
374 SHA384_CONTEXT *Context
375 );
376
377VOID
379 SHA384_CONTEXT *Context,
380 CONST UINT8 *Data,
381 UINTN Len
382 );
383
384VOID
386 SHA384_CONTEXT *Context,
387 UINT8 *HashDigest
388 );
389
390VOID
392 UINT8 *Hash,
393 CONST UINT8 *Data,
394 UINTN Len
395 );
396
397BOOLEAN
398EFIAPI
400 VOID
401 );
402
417INTN
419 IN CONST VOID *Data,
420 IN UINTN DataSize,
421 IN CONST UINT8 *Hash,
422 IN UINTN HashSize
423 );
424
425#define RSA_MOD_MAX_SIZE BASE_16KB
426
431#define RSA_SCRATCH_BUFFER_SIZE(ModulusSize) \
432 ((ModulusSize) * 3U)
433
435 RSA_MOD_MAX_SIZE <= MAX_UINTN / 3U,
436 "The definition of RSA_SCRATCH_BUFFER_SIZE may cause an overflow"
437 );
438
454BOOLEAN
456 IN CONST OC_RSA_PUBLIC_KEY *Key,
457 IN CONST UINT8 *Signature,
458 IN UINTN SignatureSize,
459 IN CONST UINT8 *Hash,
460 IN UINTN HashSize,
461 IN OC_SIG_HASH_TYPE Algorithm,
462 IN VOID *Scratch
463 );
464
465#ifndef OC_CRYPTO_NDYNALLOC
466
481BOOLEAN
483 IN CONST OC_RSA_PUBLIC_KEY *Key,
484 IN CONST UINT8 *Signature,
485 IN UINTN SignatureSize,
486 IN CONST UINT8 *Hash,
487 IN UINTN HashSize,
488 IN OC_SIG_HASH_TYPE Algorithm
489 );
490
491#endif // OC_CRYPTO_NDYNALLOC
492
510BOOLEAN
512 IN CONST OC_RSA_PUBLIC_KEY *Key,
513 IN CONST UINT8 *Signature,
514 IN UINTN SignatureSize,
515 IN CONST UINT8 *Data,
516 IN UINTN DataSize,
517 IN OC_SIG_HASH_TYPE Algorithm,
518 IN VOID *Scratch
519 );
520
521#ifndef OC_CRYPTO_NDYNALLOC
522
539BOOLEAN
541 IN CONST OC_RSA_PUBLIC_KEY *Key,
542 IN CONST UINT8 *Signature,
543 IN UINTN SignatureSize,
544 IN CONST UINT8 *Data,
545 IN UINTN DataSize,
546 IN OC_SIG_HASH_TYPE Algorithm
547 );
548
549#endif // OC_CRYPTO_NDYNALLOC
550
568BOOLEAN
570 IN CONST UINT8 *Modulus,
571 IN UINTN ModulusSize,
572 IN UINT32 Exponent,
573 IN CONST UINT8 *Signature,
574 IN UINTN SignatureSize,
575 IN CONST UINT8 *Data,
576 IN UINTN DataSize,
577 IN OC_SIG_HASH_TYPE Algorithm
578 );
579
602INTN
604 IN CONST VOID *DestinationBuffer,
605 IN CONST VOID *SourceBuffer,
606 IN UINTN Length
607 );
608
620VOID *
622 OUT VOID *Buffer,
623 IN UINTN Length
624 );
625
637VOID
639 IN CONST UINT8 *Password,
640 IN UINT32 PasswordSize,
641 IN CONST UINT8 *Salt,
642 IN UINT32 SaltSize,
643 OUT UINT8 *Hash
644 );
645
659BOOLEAN
661 IN CONST UINT8 *Password,
662 IN UINT32 PasswordSize,
663 IN CONST UINT8 *Salt,
664 IN UINT32 SaltSize,
665 IN CONST UINT8 *RefHash
666 );
667
668#endif // OC_CRYPTO_LIB_H
UINT8 Reserved[430]
Definition Apm.h:39
UINT32 Counter
UINT64 Length
UINT8 Signature[8]
Definition BiosId.h:67
BOOLEAN EFIAPI TryEnableAccel(VOID)
struct SHA256_CONTEXT_ SHA256_CONTEXT
#define AES_KEY_EXP_SIZE
Definition OcCryptoLib.h:71
VOID Sha384(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
VOID Sha256Init(SHA256_CONTEXT *Context)
VOID Sha512Update(SHA512_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
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)
VOID AesCbcEncryptBuffer(IN OUT AES_CONTEXT *Context, IN OUT UINT8 *Data, IN UINT32 Len)
Definition Aes.c:586
VOID OcHashPasswordSha512(IN CONST UINT8 *Password, IN UINT32 PasswordSize, IN CONST UINT8 *Salt, IN UINT32 SaltSize, OUT UINT8 *Hash)
VOID ChaChaCryptBuffer(IN OUT CHACHA_CONTEXT *Context, IN CONST UINT8 *Source, OUT UINT8 *Destination, IN UINT32 Length)
Definition ChaCha.c:74
STATIC_ASSERT(sizeof(OC_RSA_PUBLIC_KEY_HDR)==16, "The PK header struct is malformed.")
VOID Sha512Init(SHA512_CONTEXT *Context)
VOID Sha1Update(SHA1_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID Sha512Final(SHA512_CONTEXT *Context, UINT8 *HashDigest)
VOID AesCtrXcryptBuffer(IN OUT AES_CONTEXT *Context, IN OUT UINT8 *Data, IN UINT32 Len)
Definition Aes.c:634
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)
VOID Sha384Init(SHA384_CONTEXT *Context)
struct AES_CONTEXT_ AES_CONTEXT
BOOLEAN OcVerifyPasswordSha512(IN CONST UINT8 *Password, IN UINT32 PasswordSize, IN CONST UINT8 *Salt, IN UINT32 SaltSize, IN CONST UINT8 *RefHash)
VOID Sha1Init(SHA1_CONTEXT *Context)
VOID Sha384Final(SHA384_CONTEXT *Context, UINT8 *HashDigest)
INTN SigVerifyShaHashBySize(IN CONST VOID *Data, IN UINTN DataSize, IN CONST UINT8 *Hash, IN UINTN HashSize)
VOID Md5Init(MD5_CONTEXT *Context)
VOID Md5Final(MD5_CONTEXT *Context, UINT8 *Hash)
VOID ChaChaInitCtx(OUT CHACHA_CONTEXT *Context, IN CONST UINT8 *Key, IN CONST UINT8 *Iv, IN UINT32 Counter)
Definition ChaCha.c:48
VOID Sha256Final(SHA256_CONTEXT *Context, UINT8 *HashDigest)
#define RSA_MOD_MAX_SIZE
VOID AesSetCtxIv(OUT AES_CONTEXT *Context, IN CONST UINT8 *Iv)
Definition Aes.c:261
VOID AesCbcDecryptBuffer(IN OUT AES_CONTEXT *Context, IN OUT UINT8 *Data, IN UINT32 Len)
Definition Aes.c:611
VOID Sha1Final(SHA1_CONTEXT *Context, UINT8 *Hash)
VOID Md5(UINT8 *Hash, UINT8 *Data, UINTN Len)
struct SHA1_CONTEXT_ SHA1_CONTEXT
VOID Sha1(UINT8 *Hash, UINT8 *Data, UINTN Len)
enum OC_SIG_HASH_TYPE_ OC_SIG_HASH_TYPE
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)
#define SHA512_BLOCK_SIZE
Definition OcCryptoLib.h:55
struct MD5_CONTEXT_ MD5_CONTEXT
OC_SIG_HASH_TYPE_
@ OcSigHashTypeMax
@ OcSigHashTypeSha384
@ OcSigHashTypeSha512
@ OcSigHashTypeSha256
VOID AesInitCtxIv(OUT AES_CONTEXT *Context, IN CONST UINT8 *Key, IN CONST UINT8 *Iv)
Definition Aes.c:250
struct CHACHA_CONTEXT_ CHACHA_CONTEXT
VOID Sha256(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
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)
INTN SecureCompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
Definition SecureMem.c:17
SHA512_CONTEXT SHA384_CONTEXT
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)
VOID Sha256Update(SHA256_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID Sha384Update(SHA384_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID * SecureZeroMem(OUT VOID *Buffer, IN UINTN Length)
Definition SecureMem.c:73
VOID Md5Update(MD5_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID Sha512(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
#define AES_BLOCK_SIZE
Definition OcCryptoLib.h:61
struct SHA512_CONTEXT_ SHA512_CONTEXT
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
#define Len
Definition deflate.h:82
UINT8 RoundKey[AES_KEY_EXP_SIZE]
UINT8 Iv[AES_BLOCK_SIZE]
UINT32 Input[16]
UINT8 Data[64]
UINT32 State[4]
OC_RSA_PUBLIC_KEY_HDR Hdr
UINT32 K[4]
UINT8 Data[64]
UINT32 State[5]
UINT32 State[8]
UINT8 Block[2 *SHA512_BLOCK_SIZE]
UINT64 State[8]