44 IN CHAR16 *VariableName,
45 IN EFI_GUID *VendorGuid,
47 IN VOID *Context OPTIONAL
56 EFI_SIGNATURE_LIST *CertList;
57 EFI_SIGNATURE_DATA *Cert;
60 ASSERT (ProcessCert != NULL);
70 Status =
gRT->GetVariable (VariableName, VendorGuid, NULL, &DataSize, Data);
71 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
72 if (Status == EFI_NOT_FOUND) {
79 Data = (UINT8 *)AllocateZeroPool (DataSize);
81 return EFI_OUT_OF_RESOURCES;
84 Status =
gRT->GetVariable (VariableName, VendorGuid, NULL, &DataSize, Data);
85 if (EFI_ERROR (Status)) {
93 ItemDataSize = (UINT32)DataSize;
94 CertList = (EFI_SIGNATURE_LIST *)Data;
97 while ((ItemDataSize > 0) && (ItemDataSize >= CertList->SignatureListSize)) {
98 if (!
CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {
102 ItemDataSize -= CertList->SignatureListSize;
103 CertList = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);
107 Status = EFI_SUCCESS;
108 CertCount = (CertList->SignatureListSize -
sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
109 for (Index = 0; Index < CertCount; Index++) {
110 Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList
111 +
sizeof (EFI_SIGNATURE_LIST)
112 + CertList->SignatureHeaderSize
113 + Index * CertList->SignatureSize);
115 Status = ProcessCert (Context, GuidIndex, CertList->SignatureSize, Cert);
116 if (EFI_ERROR (Status)) {
123 if (EFI_ERROR (Status)) {
127 ItemDataSize -= CertList->SignatureListSize;
128 CertList = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);
260 IN CHAR16 *VariableName,
261 IN EFI_GUID *VendorGuid,
262 IN EFI_GUID *OwnerGuid,
263 IN UINTN X509DataSize,
265 OUT UINTN *DeletedCount
274 EFI_SIGNATURE_LIST *CertList;
275 EFI_SIGNATURE_LIST *NewCertList;
276 EFI_SIGNATURE_DATA *Cert;
279 UINTN LocalDeleteCount;
282 ASSERT ((X509Data == NULL) || (X509DataSize != 0));
284 if (DeletedCount == NULL) {
285 DeletedCount = &LocalDeleteCount;
300 Status =
gRT->GetVariable (VariableName, VendorGuid, NULL, &DataSize, NULL);
301 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
302 if (Status == EFI_NOT_FOUND) {
303 Status = EFI_SUCCESS;
309 OldData = AllocateZeroPool (DataSize);
310 if (OldData == NULL) {
311 return EFI_OUT_OF_RESOURCES;
314 Status =
gRT->GetVariable (VariableName, VendorGuid, &Attr, &DataSize, OldData);
315 if (EFI_ERROR (Status)) {
323 Data = AllocateZeroPool (DataSize);
326 return EFI_OUT_OF_RESOURCES;
332 ItemDataSize = (UINT32)DataSize;
333 CertList = (EFI_SIGNATURE_LIST *)OldData;
335 while ((ItemDataSize > 0) && (ItemDataSize >= CertList->SignatureListSize)) {
336 if (
CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {
340 CopyMem (Data + Offset, CertList, (
sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize));
341 NewCertList = (EFI_SIGNATURE_LIST *)(Data + Offset);
342 Offset += (
sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
343 Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList +
sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
344 CertCount = (CertList->SignatureListSize -
sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
345 for (Index = 0; Index < CertCount; Index++) {
346 if (
CompareGuid (&Cert->SignatureOwner, OwnerGuid)
347 && ( (X509Data == NULL)
348 || ( (CertList->SignatureSize == (UINT32)(sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize))
349 && (
CompareMem ((UINT8 *)(Cert->SignatureData), X509Data, X509DataSize) == 0)
357 NewCertList->SignatureListSize -= CertList->SignatureSize;
363 CopyMem (Data + Offset, (UINT8 *)(Cert), CertList->SignatureSize);
364 Offset += CertList->SignatureSize;
367 Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)Cert + CertList->SignatureSize);
373 CopyMem (Data + Offset, (UINT8 *)(CertList), CertList->SignatureListSize);
374 Offset += CertList->SignatureListSize;
377 ItemDataSize -= CertList->SignatureListSize;
378 CertList = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);
381 if (*DeletedCount != 0) {
385 ItemDataSize = Offset;
386 CertList = (EFI_SIGNATURE_LIST *)Data;
388 ZeroMem (OldData, ItemDataSize);
389 while ((ItemDataSize > 0) && (ItemDataSize >= CertList->SignatureListSize)) {
390 CertCount = (CertList->SignatureListSize -
sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;
391 if (CertCount != 0) {
392 CopyMem (OldData + Offset, (UINT8 *)(CertList), CertList->SignatureListSize);
393 Offset += CertList->SignatureListSize;
396 ItemDataSize -= CertList->SignatureListSize;
397 CertList = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);
405 Status =
gRT->SetVariable (
434 IN CHAR16 *VariableName,
435 IN EFI_GUID *VendorGuid,
436 IN EFI_GUID *OwnerGuid,
437 IN UINTN X509DataSize,
442 EFI_SIGNATURE_LIST *CACert;
443 EFI_SIGNATURE_DATA *CACertData;
456 ASSERT (X509Data != NULL);
467 SigDataSize =
sizeof (EFI_SIGNATURE_LIST) +
sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize;
469 Data = AllocateZeroPool (SigDataSize);
471 return EFI_OUT_OF_RESOURCES;
477 CACert = (EFI_SIGNATURE_LIST *)Data;
478 CACert->SignatureListSize = (UINT32)SigDataSize;
479 CACert->SignatureHeaderSize = 0;
480 CACert->SignatureSize = (UINT32)(
sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize);
481 CopyGuid (&CACert->SignatureType, &gEfiCertX509Guid);
483 CACertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CACert +
sizeof (EFI_SIGNATURE_LIST));
484 CopyGuid (&CACertData->SignatureOwner, OwnerGuid);
485 CopyMem ((UINT8 *)(CACertData->SignatureData), X509Data, X509DataSize);
492 Status =
gRT->GetVariable (
499 if (Status == EFI_BUFFER_TOO_SMALL) {
500 Attr |= EFI_VARIABLE_APPEND_WRITE;
501 }
else if (Status == EFI_NOT_FOUND) {
508 Status =
gRT->SetVariable (