Blame SOURCES/0012-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch

cc9195
From b59ee7769814e207c917615af78c7428bdf3b450 Mon Sep 17 00:00:00 2001
cc9195
From: Laszlo Ersek <lersek@redhat.com>
cc9195
Date: Tue, 4 Nov 2014 23:02:55 +0100
cc9195
Subject: OvmfPkg: EnrollDefaultKeys: application for enrolling default keys
cc9195
 (RH only)
cc9195
cc9195
Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 ->
cc9195
RHEL-8.0/20180508-ee3198e672e2 rebase:
cc9195
cc9195
- reorder the rebase changelog in the commit message so that it reads like
cc9195
  a blog: place more recent entries near the top
cc9195
- no changes to the patch body
cc9195
cc9195
Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase:
cc9195
cc9195
- no changes
cc9195
cc9195
Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase:
cc9195
cc9195
- This patch now squashes the following commits:
cc9195
  - c0b2615a9c0b OvmfPkg: EnrollDefaultKeys: application for enrolling
cc9195
                 default keys (RH only)
cc9195
  - 22f4d33d0168 OvmfPkg/EnrollDefaultKeys: update SignatureOwner GUID for
cc9195
                 Windows HCK (RH)
cc9195
  - ff7f2c1d870d OvmfPkg/EnrollDefaultKeys: expose CertType parameter of
cc9195
                 EnrollListOfCerts (RH)
cc9195
  - aee7b5ba60b4 OvmfPkg/EnrollDefaultKeys: blacklist empty file in dbx
cc9195
                 for Windows HCK (RH)
cc9195
cc9195
- Consequently, OvmfPkg/EnrollDefaultKeys/ is identical to the same
cc9195
  directory at the "RHEL-7.4" tag (49d06d386736).
cc9195
cc9195
Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase:
cc9195
cc9195
- This patch now squashes the following commits:
cc9195
  - 014f459c197b OvmfPkg: EnrollDefaultKeys: application for enrolling
cc9195
                 default keys (RH only)
cc9195
  - 18422a18d0e9 OvmfPkg/EnrollDefaultKeys: assign Status before reading
cc9195
                 it (RH only)
cc9195
  - ddb90568e874 OvmfPkg/EnrollDefaultKeys: silence VS2015x86 warning (RH
cc9195
                 only)
cc9195
cc9195
Notes about the c9e5618 -> b9ffeab rebase:
cc9195
- Guid/VariableFormat.h now lives under MdeModulePkg.
cc9195
cc9195
Notes about the 9ece15a -> c9e5618 rebase:
cc9195
- resolved conflicts in:
cc9195
    OvmfPkg/OvmfPkgIa32.dsc
cc9195
    OvmfPkg/OvmfPkgIa32X64.dsc
cc9195
    OvmfPkg/OvmfPkgX64.dsc
cc9195
  due to OvmfPkg/SecureBootConfigDxe/SecureBootConfigDxe.inf having
cc9195
  disappeared in upstream (commit 57446bb9).
cc9195
cc9195
Message-id: <1415138578-27173-16-git-send-email-lersek@redhat.com>
cc9195
Patchwork-id: 62121
cc9195
O-Subject:  [RHEL-7.1 ovmf PATCH v2 15/18] OvmfPkg: EnrollDefaultKeys:
cc9195
	application for enrolling default keys (RH only)
cc9195
Bugzilla: 1148296
cc9195
1160400
cc9195
Acked-by: Andrew Jones <drjones@redhat.com>
cc9195
Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
cc9195
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
cc9195
cc9195
This application is meant to be invoked by the management layer, after
cc9195
booting the UEFI shell and getting a shell prompt on the serial console.
cc9195
The app enrolls a number of certificates (see below), and then reports
cc9195
status to the serial console as well. The expected output is "info:
cc9195
success":
cc9195
cc9195
> Shell> EnrollDefaultKeys.efi
cc9195
> info: SetupMode=1 SecureBoot=0 SecureBootEnable=0 CustomMode=0 VendorKeys=1
cc9195
> info: SetupMode=0 SecureBoot=1 SecureBootEnable=1 CustomMode=0 VendorKeys=0
cc9195
> info: success
cc9195
> Shell>
cc9195
cc9195
In case of success, the management layer can force off or reboot the VM
cc9195
(for example with the "reset -s" or "reset -c" UEFI shell commands,
cc9195
respectively), and start the guest installation with SecureBoot enabled.
cc9195
cc9195
PK:
cc9195
- A unique, static, ad-hoc certificate whose private half has been
cc9195
  destroyed (more precisely, never saved) and is therefore unusable for
cc9195
  signing. (The command for creating this certificate is saved in the
cc9195
  source code.) Background:
cc9195
cc9195
On 09/30/14 20:00, Peter Jones wrote:
cc9195
> We should generate a special key that's not in our normal signing chains
cc9195
> for PK and KEK.  The reason for this is that [in practice] PK gets
cc9195
> treated as part of DB (*).
cc9195
>
cc9195
> [Shipping a key in our normal signing chains] as PK means you can run
cc9195
> grub directly, in which case it won't have access to the shim protocol.
cc9195
> When grub is run without the shim protocol registered, it assumes SB is
cc9195
> disabled and boots without verifying the kernel.  We don't want that to
cc9195
> be a thing you can do, but allowing that is the inevitable result of
cc9195
> shipping with any of our normal signing chain in PK or KEK.
cc9195
>
cc9195
> (* USRT has actually agreed that since you can escalate to this behavior
cc9195
> if you have the secret half of a key in KEK or PK anyway, and many
cc9195
> vendors had already shipped it this way, that it is fine and I think
cc9195
> even *expected* at this point, even though it wasn't formally in the
cc9195
> UEFI 2.3.1 Spec that introduced Secure Boot.  I'll try and make sure the
cc9195
> language reflects that in an upcoming spec revision.)
cc9195
>
cc9195
> So let me get SRT to issue a special key to use for PK and KEK.  We can
cc9195
> use it just for those operations, and make sure it's protected with the
cc9195
> same processes and controls as our other signing keys.
cc9195
cc9195
  Until SRT generates such a key for us, this ad-hoc key should be a good
cc9195
  placeholder.
cc9195
cc9195
KEK:
cc9195
- same ad-hoc certificate as used for the PK,
cc9195
- "Microsoft Corporation KEK CA 2011" -- the dbx data in Fedora's dbxtool
cc9195
  package is signed (indirectly, through a chain) with this; enrolling
cc9195
  such a KEK should allow guests to install those updates.
cc9195
cc9195
DB:
cc9195
- "Microsoft Windows Production PCA 2011" -- to load Windows 8 and Windows
cc9195
  Server 2012 R2,
cc9195
- "Microsoft Corporation UEFI CA 2011" -- to load Linux and signed PCI
cc9195
  oproms.
cc9195
cc9195
*UPDATE*
cc9195
cc9195
OvmfPkg: EnrollDefaultKeys: pick up official Red Hat PK/KEK (RHEL only)
cc9195
cc9195
Replace the placeholder ExampleCert with a certificate generated and
cc9195
managed by the Red Hat Security Response Team.
cc9195
cc9195
> Certificate:
cc9195
>     Data:
cc9195
>         Version: 3 (0x2)
cc9195
>         Serial Number: 18371740789028339953 (0xfef588e8f396c0f1)
cc9195
>     Signature Algorithm: sha256WithRSAEncryption
cc9195
>         Issuer: CN=Red Hat Secure Boot (PK/KEK key 1)/emailAddress=secalert@redhat.com
cc9195
>         Validity
cc9195
>             Not Before: Oct 31 11:15:37 2014 GMT
cc9195
>             Not After : Oct 25 11:15:37 2037 GMT
cc9195
>         Subject: CN=Red Hat Secure Boot (PK/KEK key 1)/emailAddress=secalert@redhat.com
cc9195
>         Subject Public Key Info:
cc9195
>             Public Key Algorithm: rsaEncryption
cc9195
>                 Public-Key: (2048 bit)
cc9195
>                 Modulus:
cc9195
>                     00:90:1f:84:7b:8d:bc:eb:97:26:82:6d:88:ab:8a:
cc9195
>                     c9:8c:68:70:f9:df:4b:07:b2:37:83:0b:02:c8:67:
cc9195
>                     68:30:9e:e3:f0:f0:99:4a:b8:59:57:c6:41:f6:38:
cc9195
>                     8b:fe:66:4c:49:e9:37:37:92:2e:98:01:1e:5b:14:
cc9195
>                     50:e6:a8:8d:25:0d:f5:86:e6:ab:30:cb:40:16:ea:
cc9195
>                     8d:8b:16:86:70:43:37:f2:ce:c0:91:df:71:14:8e:
cc9195
>                     99:0e:89:b6:4c:6d:24:1e:8c:e4:2f:4f:25:d0:ba:
cc9195
>                     06:f8:c6:e8:19:18:76:73:1d:81:6d:a8:d8:05:cf:
cc9195
>                     3a:c8:7b:28:c8:36:a3:16:0d:29:8c:99:9a:68:dc:
cc9195
>                     ab:c0:4d:8d:bf:5a:bb:2b:a9:39:4b:04:97:1c:f9:
cc9195
>                     36:bb:c5:3a:86:04:ae:af:d4:82:7b:e0:ab:de:49:
cc9195
>                     05:68:fc:f6:ae:68:1a:6c:90:4d:57:19:3c:64:66:
cc9195
>                     03:f6:c7:52:9b:f7:94:cf:93:6a:a1:68:c9:aa:cf:
cc9195
>                     99:6b:bc:aa:5e:08:e7:39:1c:f7:f8:0f:ba:06:7e:
cc9195
>                     f1:cb:e8:76:dd:fe:22:da:ad:3a:5e:5b:34:ea:b3:
cc9195
>                     c9:e0:4d:04:29:7e:b8:60:b9:05:ef:b5:d9:17:58:
cc9195
>                     56:16:60:b9:30:32:f0:36:4a:c3:f2:79:8d:12:40:
cc9195
>                     70:f3
cc9195
>                 Exponent: 65537 (0x10001)
cc9195
>         X509v3 extensions:
cc9195
>             X509v3 Basic Constraints:
cc9195
>                 CA:FALSE
cc9195
>             Netscape Comment:
cc9195
>                 OpenSSL Generated Certificate
cc9195
>             X509v3 Subject Key Identifier:
cc9195
>                 3C:E9:60:E3:FF:19:A1:0A:7B:A3:42:F4:8D:42:2E:B4:D5:9C:72:EC
cc9195
>             X509v3 Authority Key Identifier:
cc9195
>                 keyid:3C:E9:60:E3:FF:19:A1:0A:7B:A3:42:F4:8D:42:2E:B4:D5:9C:72:EC
cc9195
>
cc9195
>     Signature Algorithm: sha256WithRSAEncryption
cc9195
>          5c:4d:92:88:b4:82:5f:1d:ad:8b:11:ec:df:06:a6:7a:a5:2b:
cc9195
>          9f:37:55:0c:8d:6e:05:00:ad:b7:0c:41:89:69:cf:d6:65:06:
cc9195
>          9b:51:78:d2:ad:c7:bf:9c:dc:05:73:7f:e7:1e:39:13:b4:ea:
cc9195
>          b6:30:7d:40:75:ab:9c:43:0b:df:b0:c2:1b:bf:30:e0:f4:fe:
cc9195
>          c0:db:62:21:98:f6:c5:af:de:3b:4f:49:0a:e6:1e:f9:86:b0:
cc9195
>          3f:0d:d6:d4:46:37:db:54:74:5e:ff:11:c2:60:c6:70:58:c5:
cc9195
>          1c:6f:ec:b2:d8:6e:6f:c3:bc:33:87:38:a4:f3:44:64:9c:34:
cc9195
>          3b:28:94:26:78:27:9f:16:17:e8:3b:69:0a:25:a9:73:36:7e:
cc9195
>          9e:37:5c:ec:e8:3f:db:91:f9:12:b3:3d:ce:e7:dd:15:c3:ae:
cc9195
>          8c:05:20:61:9b:95:de:9b:af:fa:b1:5c:1c:e5:97:e7:c3:34:
cc9195
>          11:85:f5:8a:27:26:a4:70:36:ec:0c:f6:83:3d:90:f7:36:f3:
cc9195
>          f9:f3:15:d4:90:62:be:53:b4:af:d3:49:af:ef:f4:73:e8:7b:
cc9195
>          76:e4:44:2a:37:ba:81:a4:99:0c:3a:31:24:71:a0:e4:e4:b7:
cc9195
>          1a:cb:47:e4:aa:22:cf:ef:75:61:80:e3:43:b7:48:57:73:11:
cc9195
>          3d:78:9b:69
cc9195
> -----BEGIN CERTIFICATE-----
cc9195
> MIIDoDCCAoigAwIBAgIJAP71iOjzlsDxMA0GCSqGSIb3DQEBCwUAMFExKzApBgNV
cc9195
> BAMTIlJlZCBIYXQgU2VjdXJlIEJvb3QgKFBLL0tFSyBrZXkgMSkxIjAgBgkqhkiG
cc9195
> 9w0BCQEWE3NlY2FsZXJ0QHJlZGhhdC5jb20wHhcNMTQxMDMxMTExNTM3WhcNMzcx
cc9195
> MDI1MTExNTM3WjBRMSswKQYDVQQDEyJSZWQgSGF0IFNlY3VyZSBCb290IChQSy9L
cc9195
> RUsga2V5IDEpMSIwIAYJKoZIhvcNAQkBFhNzZWNhbGVydEByZWRoYXQuY29tMIIB
cc9195
> IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkB+Ee42865cmgm2Iq4rJjGhw
cc9195
> +d9LB7I3gwsCyGdoMJ7j8PCZSrhZV8ZB9jiL/mZMSek3N5IumAEeWxRQ5qiNJQ31
cc9195
> huarMMtAFuqNixaGcEM38s7Akd9xFI6ZDom2TG0kHozkL08l0LoG+MboGRh2cx2B
cc9195
> bajYBc86yHsoyDajFg0pjJmaaNyrwE2Nv1q7K6k5SwSXHPk2u8U6hgSur9SCe+Cr
cc9195
> 3kkFaPz2rmgabJBNVxk8ZGYD9sdSm/eUz5NqoWjJqs+Za7yqXgjnORz3+A+6Bn7x
cc9195
> y+h23f4i2q06Xls06rPJ4E0EKX64YLkF77XZF1hWFmC5MDLwNkrD8nmNEkBw8wID
cc9195
> AQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
cc9195
> YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUPOlg4/8ZoQp7o0L0jUIutNWccuww
cc9195
> HwYDVR0jBBgwFoAUPOlg4/8ZoQp7o0L0jUIutNWccuwwDQYJKoZIhvcNAQELBQAD
cc9195
> ggEBAFxNkoi0gl8drYsR7N8GpnqlK583VQyNbgUArbcMQYlpz9ZlBptReNKtx7+c
cc9195
> 3AVzf+ceORO06rYwfUB1q5xDC9+wwhu/MOD0/sDbYiGY9sWv3jtPSQrmHvmGsD8N
cc9195
> 1tRGN9tUdF7/EcJgxnBYxRxv7LLYbm/DvDOHOKTzRGScNDsolCZ4J58WF+g7aQol
cc9195
> qXM2fp43XOzoP9uR+RKzPc7n3RXDrowFIGGbld6br/qxXBzll+fDNBGF9YonJqRw
cc9195
> NuwM9oM9kPc28/nzFdSQYr5TtK/TSa/v9HPoe3bkRCo3uoGkmQw6MSRxoOTktxrL
cc9195
> R+SqIs/vdWGA40O3SFdzET14m2k=
cc9195
> -----END CERTIFICATE-----
cc9195
cc9195
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
cc9195
(cherry picked from commit c0b2615a9c0b4a4be1bffe45681a32915449279d)
cc9195
(cherry picked from commit 92424de98ffaf1fa81e6346949b1d2b5f9a637ca)
cc9195
(cherry picked from commit 98c91b36997e3afc4192449263182fbdcc771a1a)
cc9195
---
cc9195
 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c   | 1015 +++++++++++++++++++++++
cc9195
 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf |   52 ++
cc9195
 OvmfPkg/OvmfPkgIa32.dsc                         |    4 +
cc9195
 OvmfPkg/OvmfPkgIa32X64.dsc                      |    4 +
cc9195
 OvmfPkg/OvmfPkgX64.dsc                          |    4 +
cc9195
 5 files changed, 1079 insertions(+)
cc9195
 create mode 100644 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c
cc9195
 create mode 100644 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf
cc9195
cc9195
diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c
cc9195
new file mode 100644
cc9195
index 0000000..dd413df
cc9195
--- /dev/null
cc9195
+++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c
cc9195
@@ -0,0 +1,1015 @@
cc9195
+/** @file
cc9195
+  Enroll default PK, KEK, DB.
cc9195
+
cc9195
+  Copyright (C) 2014, Red Hat, Inc.
cc9195
+
cc9195
+  This program and the accompanying materials are licensed and made available
cc9195
+  under the terms and conditions of the BSD License which accompanies this
cc9195
+  distribution. The full text of the license may be found at
cc9195
+  http://opensource.org/licenses/bsd-license.
cc9195
+
cc9195
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
cc9195
+  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
cc9195
+**/
cc9195
+#include <Guid/AuthenticatedVariableFormat.h>    // gEfiCustomModeEnableGuid
cc9195
+#include <Guid/GlobalVariable.h>                 // EFI_SETUP_MODE_NAME
cc9195
+#include <Guid/ImageAuthentication.h>            // EFI_IMAGE_SECURITY_DATABASE
cc9195
+#include <Library/BaseMemoryLib.h>               // CopyGuid()
cc9195
+#include <Library/DebugLib.h>                    // ASSERT()
cc9195
+#include <Library/MemoryAllocationLib.h>         // FreePool()
cc9195
+#include <Library/ShellCEntryLib.h>              // ShellAppMain()
cc9195
+#include <Library/UefiLib.h>                     // AsciiPrint()
cc9195
+#include <Library/UefiRuntimeServicesTableLib.h> // gRT
cc9195
+
cc9195
+//
cc9195
+// We'll use the certificate below as both Platform Key and as first Key
cc9195
+// Exchange Key.
cc9195
+//
cc9195
+// "Red Hat Secure Boot (PK/KEK key 1)/emailAddress=secalert@redhat.com"
cc9195
+// SHA1: fd:fc:7f:3c:7e:f3:e0:57:76:ad:d7:98:78:21:6c:9b:e0:e1:95:97
cc9195
+//
cc9195
+STATIC CONST UINT8 RedHatPkKek1[] = {
cc9195
+  0x30, 0x82, 0x03, 0xa0, 0x30, 0x82, 0x02, 0x88, 0xa0, 0x03, 0x02, 0x01, 0x02,
cc9195
+  0x02, 0x09, 0x00, 0xfe, 0xf5, 0x88, 0xe8, 0xf3, 0x96, 0xc0, 0xf1, 0x30, 0x0d,
cc9195
+  0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,
cc9195
+  0x30, 0x51, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22,
cc9195
+  0x52, 0x65, 0x64, 0x20, 0x48, 0x61, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72,
cc9195
+  0x65, 0x20, 0x42, 0x6f, 0x6f, 0x74, 0x20, 0x28, 0x50, 0x4b, 0x2f, 0x4b, 0x45,
cc9195
+  0x4b, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x31, 0x29, 0x31, 0x22, 0x30, 0x20, 0x06,
cc9195
+  0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x13, 0x73,
cc9195
+  0x65, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x40, 0x72, 0x65, 0x64, 0x68, 0x61,
cc9195
+  0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x30,
cc9195
+  0x33, 0x31, 0x31, 0x31, 0x31, 0x35, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x37,
cc9195
+  0x31, 0x30, 0x32, 0x35, 0x31, 0x31, 0x31, 0x35, 0x33, 0x37, 0x5a, 0x30, 0x51,
cc9195
+  0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x52, 0x65,
cc9195
+  0x64, 0x20, 0x48, 0x61, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20,
cc9195
+  0x42, 0x6f, 0x6f, 0x74, 0x20, 0x28, 0x50, 0x4b, 0x2f, 0x4b, 0x45, 0x4b, 0x20,
cc9195
+  0x6b, 0x65, 0x79, 0x20, 0x31, 0x29, 0x31, 0x22, 0x30, 0x20, 0x06, 0x09, 0x2a,
cc9195
+  0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x13, 0x73, 0x65, 0x63,
cc9195
+  0x61, 0x6c, 0x65, 0x72, 0x74, 0x40, 0x72, 0x65, 0x64, 0x68, 0x61, 0x74, 0x2e,
cc9195
+  0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
cc9195
+  0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,
cc9195
+  0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x90, 0x1f, 0x84,
cc9195
+  0x7b, 0x8d, 0xbc, 0xeb, 0x97, 0x26, 0x82, 0x6d, 0x88, 0xab, 0x8a, 0xc9, 0x8c,
cc9195
+  0x68, 0x70, 0xf9, 0xdf, 0x4b, 0x07, 0xb2, 0x37, 0x83, 0x0b, 0x02, 0xc8, 0x67,
cc9195
+  0x68, 0x30, 0x9e, 0xe3, 0xf0, 0xf0, 0x99, 0x4a, 0xb8, 0x59, 0x57, 0xc6, 0x41,
cc9195
+  0xf6, 0x38, 0x8b, 0xfe, 0x66, 0x4c, 0x49, 0xe9, 0x37, 0x37, 0x92, 0x2e, 0x98,
cc9195
+  0x01, 0x1e, 0x5b, 0x14, 0x50, 0xe6, 0xa8, 0x8d, 0x25, 0x0d, 0xf5, 0x86, 0xe6,
cc9195
+  0xab, 0x30, 0xcb, 0x40, 0x16, 0xea, 0x8d, 0x8b, 0x16, 0x86, 0x70, 0x43, 0x37,
cc9195
+  0xf2, 0xce, 0xc0, 0x91, 0xdf, 0x71, 0x14, 0x8e, 0x99, 0x0e, 0x89, 0xb6, 0x4c,
cc9195
+  0x6d, 0x24, 0x1e, 0x8c, 0xe4, 0x2f, 0x4f, 0x25, 0xd0, 0xba, 0x06, 0xf8, 0xc6,
cc9195
+  0xe8, 0x19, 0x18, 0x76, 0x73, 0x1d, 0x81, 0x6d, 0xa8, 0xd8, 0x05, 0xcf, 0x3a,
cc9195
+  0xc8, 0x7b, 0x28, 0xc8, 0x36, 0xa3, 0x16, 0x0d, 0x29, 0x8c, 0x99, 0x9a, 0x68,
cc9195
+  0xdc, 0xab, 0xc0, 0x4d, 0x8d, 0xbf, 0x5a, 0xbb, 0x2b, 0xa9, 0x39, 0x4b, 0x04,
cc9195
+  0x97, 0x1c, 0xf9, 0x36, 0xbb, 0xc5, 0x3a, 0x86, 0x04, 0xae, 0xaf, 0xd4, 0x82,
cc9195
+  0x7b, 0xe0, 0xab, 0xde, 0x49, 0x05, 0x68, 0xfc, 0xf6, 0xae, 0x68, 0x1a, 0x6c,
cc9195
+  0x90, 0x4d, 0x57, 0x19, 0x3c, 0x64, 0x66, 0x03, 0xf6, 0xc7, 0x52, 0x9b, 0xf7,
cc9195
+  0x94, 0xcf, 0x93, 0x6a, 0xa1, 0x68, 0xc9, 0xaa, 0xcf, 0x99, 0x6b, 0xbc, 0xaa,
cc9195
+  0x5e, 0x08, 0xe7, 0x39, 0x1c, 0xf7, 0xf8, 0x0f, 0xba, 0x06, 0x7e, 0xf1, 0xcb,
cc9195
+  0xe8, 0x76, 0xdd, 0xfe, 0x22, 0xda, 0xad, 0x3a, 0x5e, 0x5b, 0x34, 0xea, 0xb3,
cc9195
+  0xc9, 0xe0, 0x4d, 0x04, 0x29, 0x7e, 0xb8, 0x60, 0xb9, 0x05, 0xef, 0xb5, 0xd9,
cc9195
+  0x17, 0x58, 0x56, 0x16, 0x60, 0xb9, 0x30, 0x32, 0xf0, 0x36, 0x4a, 0xc3, 0xf2,
cc9195
+  0x79, 0x8d, 0x12, 0x40, 0x70, 0xf3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x7b,
cc9195
+  0x30, 0x79, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00,
cc9195
+  0x30, 0x2c, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d,
cc9195
+  0x04, 0x1f, 0x16, 0x1d, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x53, 0x4c, 0x20, 0x47,
cc9195
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74,
cc9195
+  0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
cc9195
+  0x0e, 0x04, 0x16, 0x04, 0x14, 0x3c, 0xe9, 0x60, 0xe3, 0xff, 0x19, 0xa1, 0x0a,
cc9195
+  0x7b, 0xa3, 0x42, 0xf4, 0x8d, 0x42, 0x2e, 0xb4, 0xd5, 0x9c, 0x72, 0xec, 0x30,
cc9195
+  0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x3c,
cc9195
+  0xe9, 0x60, 0xe3, 0xff, 0x19, 0xa1, 0x0a, 0x7b, 0xa3, 0x42, 0xf4, 0x8d, 0x42,
cc9195
+  0x2e, 0xb4, 0xd5, 0x9c, 0x72, 0xec, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
cc9195
+  0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
cc9195
+  0x5c, 0x4d, 0x92, 0x88, 0xb4, 0x82, 0x5f, 0x1d, 0xad, 0x8b, 0x11, 0xec, 0xdf,
cc9195
+  0x06, 0xa6, 0x7a, 0xa5, 0x2b, 0x9f, 0x37, 0x55, 0x0c, 0x8d, 0x6e, 0x05, 0x00,
cc9195
+  0xad, 0xb7, 0x0c, 0x41, 0x89, 0x69, 0xcf, 0xd6, 0x65, 0x06, 0x9b, 0x51, 0x78,
cc9195
+  0xd2, 0xad, 0xc7, 0xbf, 0x9c, 0xdc, 0x05, 0x73, 0x7f, 0xe7, 0x1e, 0x39, 0x13,
cc9195
+  0xb4, 0xea, 0xb6, 0x30, 0x7d, 0x40, 0x75, 0xab, 0x9c, 0x43, 0x0b, 0xdf, 0xb0,
cc9195
+  0xc2, 0x1b, 0xbf, 0x30, 0xe0, 0xf4, 0xfe, 0xc0, 0xdb, 0x62, 0x21, 0x98, 0xf6,
cc9195
+  0xc5, 0xaf, 0xde, 0x3b, 0x4f, 0x49, 0x0a, 0xe6, 0x1e, 0xf9, 0x86, 0xb0, 0x3f,
cc9195
+  0x0d, 0xd6, 0xd4, 0x46, 0x37, 0xdb, 0x54, 0x74, 0x5e, 0xff, 0x11, 0xc2, 0x60,
cc9195
+  0xc6, 0x70, 0x58, 0xc5, 0x1c, 0x6f, 0xec, 0xb2, 0xd8, 0x6e, 0x6f, 0xc3, 0xbc,
cc9195
+  0x33, 0x87, 0x38, 0xa4, 0xf3, 0x44, 0x64, 0x9c, 0x34, 0x3b, 0x28, 0x94, 0x26,
cc9195
+  0x78, 0x27, 0x9f, 0x16, 0x17, 0xe8, 0x3b, 0x69, 0x0a, 0x25, 0xa9, 0x73, 0x36,
cc9195
+  0x7e, 0x9e, 0x37, 0x5c, 0xec, 0xe8, 0x3f, 0xdb, 0x91, 0xf9, 0x12, 0xb3, 0x3d,
cc9195
+  0xce, 0xe7, 0xdd, 0x15, 0xc3, 0xae, 0x8c, 0x05, 0x20, 0x61, 0x9b, 0x95, 0xde,
cc9195
+  0x9b, 0xaf, 0xfa, 0xb1, 0x5c, 0x1c, 0xe5, 0x97, 0xe7, 0xc3, 0x34, 0x11, 0x85,
cc9195
+  0xf5, 0x8a, 0x27, 0x26, 0xa4, 0x70, 0x36, 0xec, 0x0c, 0xf6, 0x83, 0x3d, 0x90,
cc9195
+  0xf7, 0x36, 0xf3, 0xf9, 0xf3, 0x15, 0xd4, 0x90, 0x62, 0xbe, 0x53, 0xb4, 0xaf,
cc9195
+  0xd3, 0x49, 0xaf, 0xef, 0xf4, 0x73, 0xe8, 0x7b, 0x76, 0xe4, 0x44, 0x2a, 0x37,
cc9195
+  0xba, 0x81, 0xa4, 0x99, 0x0c, 0x3a, 0x31, 0x24, 0x71, 0xa0, 0xe4, 0xe4, 0xb7,
cc9195
+  0x1a, 0xcb, 0x47, 0xe4, 0xaa, 0x22, 0xcf, 0xef, 0x75, 0x61, 0x80, 0xe3, 0x43,
cc9195
+  0xb7, 0x48, 0x57, 0x73, 0x11, 0x3d, 0x78, 0x9b, 0x69
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// Second KEK: "Microsoft Corporation KEK CA 2011".
cc9195
+// SHA1: 31:59:0b:fd:89:c9:d7:4e:d0:87:df:ac:66:33:4b:39:31:25:4b:30
cc9195
+//
cc9195
+// "dbx" updates in "dbxtool" are signed with a key derived from this KEK.
cc9195
+//
cc9195
+STATIC CONST UINT8 MicrosoftKEK[] = {
cc9195
+  0x30, 0x82, 0x05, 0xe8, 0x30, 0x82, 0x03, 0xd0, 0xa0, 0x03, 0x02, 0x01, 0x02,
cc9195
+  0x02, 0x0a, 0x61, 0x0a, 0xd1, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30,
cc9195
+  0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
cc9195
+  0x00, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
cc9195
+  0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
cc9195
+  0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31,
cc9195
+  0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64,
cc9195
+  0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a,
cc9195
+  0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43,
cc9195
+  0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30,
cc9195
+  0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f,
cc9195
+  0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,
cc9195
+  0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72,
cc9195
+  0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63,
cc9195
+  0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30,
cc9195
+  0x36, 0x32, 0x34, 0x32, 0x30, 0x34, 0x31, 0x32, 0x39, 0x5a, 0x17, 0x0d, 0x32,
cc9195
+  0x36, 0x30, 0x36, 0x32, 0x34, 0x32, 0x30, 0x35, 0x31, 0x32, 0x39, 0x5a, 0x30,
cc9195
+  0x81, 0x80, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
cc9195
+  0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,
cc9195
+  0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30,
cc9195
+  0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f,
cc9195
+  0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15,
cc9195
+  0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72,
cc9195
+  0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2a, 0x30, 0x28, 0x06,
cc9195
+  0x03, 0x55, 0x04, 0x03, 0x13, 0x21, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
cc9195
+  0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f,
cc9195
+  0x6e, 0x20, 0x4b, 0x45, 0x4b, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31,
cc9195
+  0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
cc9195
+  0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,
cc9195
+  0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0xe8, 0xb5, 0x8a, 0xbf, 0xad,
cc9195
+  0x57, 0x26, 0xb0, 0x26, 0xc3, 0xea, 0xe7, 0xfb, 0x57, 0x7a, 0x44, 0x02, 0x5d,
cc9195
+  0x07, 0x0d, 0xda, 0x4a, 0xe5, 0x74, 0x2a, 0xe6, 0xb0, 0x0f, 0xec, 0x6d, 0xeb,
cc9195
+  0xec, 0x7f, 0xb9, 0xe3, 0x5a, 0x63, 0x32, 0x7c, 0x11, 0x17, 0x4f, 0x0e, 0xe3,
cc9195
+  0x0b, 0xa7, 0x38, 0x15, 0x93, 0x8e, 0xc6, 0xf5, 0xe0, 0x84, 0xb1, 0x9a, 0x9b,
cc9195
+  0x2c, 0xe7, 0xf5, 0xb7, 0x91, 0xd6, 0x09, 0xe1, 0xe2, 0xc0, 0x04, 0xa8, 0xac,
cc9195
+  0x30, 0x1c, 0xdf, 0x48, 0xf3, 0x06, 0x50, 0x9a, 0x64, 0xa7, 0x51, 0x7f, 0xc8,
cc9195
+  0x85, 0x4f, 0x8f, 0x20, 0x86, 0xce, 0xfe, 0x2f, 0xe1, 0x9f, 0xff, 0x82, 0xc0,
cc9195
+  0xed, 0xe9, 0xcd, 0xce, 0xf4, 0x53, 0x6a, 0x62, 0x3a, 0x0b, 0x43, 0xb9, 0xe2,
cc9195
+  0x25, 0xfd, 0xfe, 0x05, 0xf9, 0xd4, 0xc4, 0x14, 0xab, 0x11, 0xe2, 0x23, 0x89,
cc9195
+  0x8d, 0x70, 0xb7, 0xa4, 0x1d, 0x4d, 0xec, 0xae, 0xe5, 0x9c, 0xfa, 0x16, 0xc2,
cc9195
+  0xd7, 0xc1, 0xcb, 0xd4, 0xe8, 0xc4, 0x2f, 0xe5, 0x99, 0xee, 0x24, 0x8b, 0x03,
cc9195
+  0xec, 0x8d, 0xf2, 0x8b, 0xea, 0xc3, 0x4a, 0xfb, 0x43, 0x11, 0x12, 0x0b, 0x7e,
cc9195
+  0xb5, 0x47, 0x92, 0x6c, 0xdc, 0xe6, 0x04, 0x89, 0xeb, 0xf5, 0x33, 0x04, 0xeb,
cc9195
+  0x10, 0x01, 0x2a, 0x71, 0xe5, 0xf9, 0x83, 0x13, 0x3c, 0xff, 0x25, 0x09, 0x2f,
cc9195
+  0x68, 0x76, 0x46, 0xff, 0xba, 0x4f, 0xbe, 0xdc, 0xad, 0x71, 0x2a, 0x58, 0xaa,
cc9195
+  0xfb, 0x0e, 0xd2, 0x79, 0x3d, 0xe4, 0x9b, 0x65, 0x3b, 0xcc, 0x29, 0x2a, 0x9f,
cc9195
+  0xfc, 0x72, 0x59, 0xa2, 0xeb, 0xae, 0x92, 0xef, 0xf6, 0x35, 0x13, 0x80, 0xc6,
cc9195
+  0x02, 0xec, 0xe4, 0x5f, 0xcc, 0x9d, 0x76, 0xcd, 0xef, 0x63, 0x92, 0xc1, 0xaf,
cc9195
+  0x79, 0x40, 0x84, 0x79, 0x87, 0x7f, 0xe3, 0x52, 0xa8, 0xe8, 0x9d, 0x7b, 0x07,
cc9195
+  0x69, 0x8f, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x4f, 0x30,
cc9195
+  0x82, 0x01, 0x4b, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82,
cc9195
+  0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55,
cc9195
+  0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x62, 0xfc, 0x43, 0xcd, 0xa0, 0x3e, 0xa4,
cc9195
+  0xcb, 0x67, 0x12, 0xd2, 0x5b, 0xd9, 0x55, 0xac, 0x7b, 0xcc, 0xb6, 0x8a, 0x5f,
cc9195
+  0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02,
cc9195
+  0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00,
cc9195
+  0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01,
cc9195
+  0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,
cc9195
+  0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04,
cc9195
+  0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, 0x11,
cc9195
+  0xbf, 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, 0x30,
cc9195
+  0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51, 0xa0,
cc9195
+  0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63,
cc9195
+  0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e,
cc9195
+  0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70,
cc9195
+  0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f,
cc9195
+  0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f,
cc9195
+  0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63,
cc9195
+  0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01,
cc9195
+  0x01, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,
cc9195
+  0x05, 0x07, 0x30, 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
cc9195
+  0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
cc9195
+  0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74,
cc9195
+  0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61,
cc9195
+  0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d,
cc9195
+  0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09,
cc9195
+  0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82,
cc9195
+  0x02, 0x01, 0x00, 0xd4, 0x84, 0x88, 0xf5, 0x14, 0x94, 0x18, 0x02, 0xca, 0x2a,
cc9195
+  0x3c, 0xfb, 0x2a, 0x92, 0x1c, 0x0c, 0xd7, 0xa0, 0xd1, 0xf1, 0xe8, 0x52, 0x66,
cc9195
+  0xa8, 0xee, 0xa2, 0xb5, 0x75, 0x7a, 0x90, 0x00, 0xaa, 0x2d, 0xa4, 0x76, 0x5a,
cc9195
+  0xea, 0x79, 0xb7, 0xb9, 0x37, 0x6a, 0x51, 0x7b, 0x10, 0x64, 0xf6, 0xe1, 0x64,
cc9195
+  0xf2, 0x02, 0x67, 0xbe, 0xf7, 0xa8, 0x1b, 0x78, 0xbd, 0xba, 0xce, 0x88, 0x58,
cc9195
+  0x64, 0x0c, 0xd6, 0x57, 0xc8, 0x19, 0xa3, 0x5f, 0x05, 0xd6, 0xdb, 0xc6, 0xd0,
cc9195
+  0x69, 0xce, 0x48, 0x4b, 0x32, 0xb7, 0xeb, 0x5d, 0xd2, 0x30, 0xf5, 0xc0, 0xf5,
cc9195
+  0xb8, 0xba, 0x78, 0x07, 0xa3, 0x2b, 0xfe, 0x9b, 0xdb, 0x34, 0x56, 0x84, 0xec,
cc9195
+  0x82, 0xca, 0xae, 0x41, 0x25, 0x70, 0x9c, 0x6b, 0xe9, 0xfe, 0x90, 0x0f, 0xd7,
cc9195
+  0x96, 0x1f, 0xe5, 0xe7, 0x94, 0x1f, 0xb2, 0x2a, 0x0c, 0x8d, 0x4b, 0xff, 0x28,
cc9195
+  0x29, 0x10, 0x7b, 0xf7, 0xd7, 0x7c, 0xa5, 0xd1, 0x76, 0xb9, 0x05, 0xc8, 0x79,
cc9195
+  0xed, 0x0f, 0x90, 0x92, 0x9c, 0xc2, 0xfe, 0xdf, 0x6f, 0x7e, 0x6c, 0x0f, 0x7b,
cc9195
+  0xd4, 0xc1, 0x45, 0xdd, 0x34, 0x51, 0x96, 0x39, 0x0f, 0xe5, 0x5e, 0x56, 0xd8,
cc9195
+  0x18, 0x05, 0x96, 0xf4, 0x07, 0xa6, 0x42, 0xb3, 0xa0, 0x77, 0xfd, 0x08, 0x19,
cc9195
+  0xf2, 0x71, 0x56, 0xcc, 0x9f, 0x86, 0x23, 0xa4, 0x87, 0xcb, 0xa6, 0xfd, 0x58,
cc9195
+  0x7e, 0xd4, 0x69, 0x67, 0x15, 0x91, 0x7e, 0x81, 0xf2, 0x7f, 0x13, 0xe5, 0x0d,
cc9195
+  0x8b, 0x8a, 0x3c, 0x87, 0x84, 0xeb, 0xe3, 0xce, 0xbd, 0x43, 0xe5, 0xad, 0x2d,
cc9195
+  0x84, 0x93, 0x8e, 0x6a, 0x2b, 0x5a, 0x7c, 0x44, 0xfa, 0x52, 0xaa, 0x81, 0xc8,
cc9195
+  0x2d, 0x1c, 0xbb, 0xe0, 0x52, 0xdf, 0x00, 0x11, 0xf8, 0x9a, 0x3d, 0xc1, 0x60,
cc9195
+  0xb0, 0xe1, 0x33, 0xb5, 0xa3, 0x88, 0xd1, 0x65, 0x19, 0x0a, 0x1a, 0xe7, 0xac,
cc9195
+  0x7c, 0xa4, 0xc1, 0x82, 0x87, 0x4e, 0x38, 0xb1, 0x2f, 0x0d, 0xc5, 0x14, 0x87,
cc9195
+  0x6f, 0xfd, 0x8d, 0x2e, 0xbc, 0x39, 0xb6, 0xe7, 0xe6, 0xc3, 0xe0, 0xe4, 0xcd,
cc9195
+  0x27, 0x84, 0xef, 0x94, 0x42, 0xef, 0x29, 0x8b, 0x90, 0x46, 0x41, 0x3b, 0x81,
cc9195
+  0x1b, 0x67, 0xd8, 0xf9, 0x43, 0x59, 0x65, 0xcb, 0x0d, 0xbc, 0xfd, 0x00, 0x92,
cc9195
+  0x4f, 0xf4, 0x75, 0x3b, 0xa7, 0xa9, 0x24, 0xfc, 0x50, 0x41, 0x40, 0x79, 0xe0,
cc9195
+  0x2d, 0x4f, 0x0a, 0x6a, 0x27, 0x76, 0x6e, 0x52, 0xed, 0x96, 0x69, 0x7b, 0xaf,
cc9195
+  0x0f, 0xf7, 0x87, 0x05, 0xd0, 0x45, 0xc2, 0xad, 0x53, 0x14, 0x81, 0x1f, 0xfb,
cc9195
+  0x30, 0x04, 0xaa, 0x37, 0x36, 0x61, 0xda, 0x4a, 0x69, 0x1b, 0x34, 0xd8, 0x68,
cc9195
+  0xed, 0xd6, 0x02, 0xcf, 0x6c, 0x94, 0x0c, 0xd3, 0xcf, 0x6c, 0x22, 0x79, 0xad,
cc9195
+  0xb1, 0xf0, 0xbc, 0x03, 0xa2, 0x46, 0x60, 0xa9, 0xc4, 0x07, 0xc2, 0x21, 0x82,
cc9195
+  0xf1, 0xfd, 0xf2, 0xe8, 0x79, 0x32, 0x60, 0xbf, 0xd8, 0xac, 0xa5, 0x22, 0x14,
cc9195
+  0x4b, 0xca, 0xc1, 0xd8, 0x4b, 0xeb, 0x7d, 0x3f, 0x57, 0x35, 0xb2, 0xe6, 0x4f,
cc9195
+  0x75, 0xb4, 0xb0, 0x60, 0x03, 0x22, 0x53, 0xae, 0x91, 0x79, 0x1d, 0xd6, 0x9b,
cc9195
+  0x41, 0x1f, 0x15, 0x86, 0x54, 0x70, 0xb2, 0xde, 0x0d, 0x35, 0x0f, 0x7c, 0xb0,
cc9195
+  0x34, 0x72, 0xba, 0x97, 0x60, 0x3b, 0xf0, 0x79, 0xeb, 0xa2, 0xb2, 0x1c, 0x5d,
cc9195
+  0xa2, 0x16, 0xb8, 0x87, 0xc5, 0xe9, 0x1b, 0xf6, 0xb5, 0x97, 0x25, 0x6f, 0x38,
cc9195
+  0x9f, 0xe3, 0x91, 0xfa, 0x8a, 0x79, 0x98, 0xc3, 0x69, 0x0e, 0xb7, 0xa3, 0x1c,
cc9195
+  0x20, 0x05, 0x97, 0xf8, 0xca, 0x14, 0xae, 0x00, 0xd7, 0xc4, 0xf3, 0xc0, 0x14,
cc9195
+  0x10, 0x75, 0x6b, 0x34, 0xa0, 0x1b, 0xb5, 0x99, 0x60, 0xf3, 0x5c, 0xb0, 0xc5,
cc9195
+  0x57, 0x4e, 0x36, 0xd2, 0x32, 0x84, 0xbf, 0x9e
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// First DB entry: "Microsoft Windows Production PCA 2011"
cc9195
+// SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d
cc9195
+//
cc9195
+// Windows 8 and Windows Server 2012 R2 boot loaders are signed with a chain
cc9195
+// rooted in this certificate.
cc9195
+//
cc9195
+STATIC CONST UINT8 MicrosoftPCA[] = {
cc9195
+  0x30, 0x82, 0x05, 0xd7, 0x30, 0x82, 0x03, 0xbf, 0xa0, 0x03, 0x02, 0x01, 0x02,
cc9195
+  0x02, 0x0a, 0x61, 0x07, 0x76, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30,
cc9195
+  0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
cc9195
+  0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
cc9195
+  0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
cc9195
+  0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31,
cc9195
+  0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64,
cc9195
+  0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a,
cc9195
+  0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43,
cc9195
+  0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x32, 0x30,
cc9195
+  0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x4d, 0x69, 0x63, 0x72, 0x6f,
cc9195
+  0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72,
cc9195
+  0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68,
cc9195
+  0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x30, 0x30, 0x1e, 0x17,
cc9195
+  0x0d, 0x31, 0x31, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x34, 0x31, 0x34, 0x32,
cc9195
+  0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x35, 0x31,
cc9195
+  0x34, 0x32, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
cc9195
+  0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
cc9195
+  0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f,
cc9195
+  0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52,
cc9195
+  0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55,
cc9195
+  0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
cc9195
+  0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31,
cc9195
+  0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x4d, 0x69, 0x63,
cc9195
+  0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77,
cc9195
+  0x73, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
cc9195
+  0x50, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30,
cc9195
+  0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
cc9195
+  0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01,
cc9195
+  0x01, 0x00, 0xdd, 0x0c, 0xbb, 0xa2, 0xe4, 0x2e, 0x09, 0xe3, 0xe7, 0xc5, 0xf7,
cc9195
+  0x96, 0x69, 0xbc, 0x00, 0x21, 0xbd, 0x69, 0x33, 0x33, 0xef, 0xad, 0x04, 0xcb,
cc9195
+  0x54, 0x80, 0xee, 0x06, 0x83, 0xbb, 0xc5, 0x20, 0x84, 0xd9, 0xf7, 0xd2, 0x8b,
cc9195
+  0xf3, 0x38, 0xb0, 0xab, 0xa4, 0xad, 0x2d, 0x7c, 0x62, 0x79, 0x05, 0xff, 0xe3,
cc9195
+  0x4a, 0x3f, 0x04, 0x35, 0x20, 0x70, 0xe3, 0xc4, 0xe7, 0x6b, 0xe0, 0x9c, 0xc0,
cc9195
+  0x36, 0x75, 0xe9, 0x8a, 0x31, 0xdd, 0x8d, 0x70, 0xe5, 0xdc, 0x37, 0xb5, 0x74,
cc9195
+  0x46, 0x96, 0x28, 0x5b, 0x87, 0x60, 0x23, 0x2c, 0xbf, 0xdc, 0x47, 0xa5, 0x67,
cc9195
+  0xf7, 0x51, 0x27, 0x9e, 0x72, 0xeb, 0x07, 0xa6, 0xc9, 0xb9, 0x1e, 0x3b, 0x53,
cc9195
+  0x35, 0x7c, 0xe5, 0xd3, 0xec, 0x27, 0xb9, 0x87, 0x1c, 0xfe, 0xb9, 0xc9, 0x23,
cc9195
+  0x09, 0x6f, 0xa8, 0x46, 0x91, 0xc1, 0x6e, 0x96, 0x3c, 0x41, 0xd3, 0xcb, 0xa3,
cc9195
+  0x3f, 0x5d, 0x02, 0x6a, 0x4d, 0xec, 0x69, 0x1f, 0x25, 0x28, 0x5c, 0x36, 0xff,
cc9195
+  0xfd, 0x43, 0x15, 0x0a, 0x94, 0xe0, 0x19, 0xb4, 0xcf, 0xdf, 0xc2, 0x12, 0xe2,
cc9195
+  0xc2, 0x5b, 0x27, 0xee, 0x27, 0x78, 0x30, 0x8b, 0x5b, 0x2a, 0x09, 0x6b, 0x22,
cc9195
+  0x89, 0x53, 0x60, 0x16, 0x2c, 0xc0, 0x68, 0x1d, 0x53, 0xba, 0xec, 0x49, 0xf3,
cc9195
+  0x9d, 0x61, 0x8c, 0x85, 0x68, 0x09, 0x73, 0x44, 0x5d, 0x7d, 0xa2, 0x54, 0x2b,
cc9195
+  0xdd, 0x79, 0xf7, 0x15, 0xcf, 0x35, 0x5d, 0x6c, 0x1c, 0x2b, 0x5c, 0xce, 0xbc,
cc9195
+  0x9c, 0x23, 0x8b, 0x6f, 0x6e, 0xb5, 0x26, 0xd9, 0x36, 0x13, 0xc3, 0x4f, 0xd6,
cc9195
+  0x27, 0xae, 0xb9, 0x32, 0x3b, 0x41, 0x92, 0x2c, 0xe1, 0xc7, 0xcd, 0x77, 0xe8,
cc9195
+  0xaa, 0x54, 0x4e, 0xf7, 0x5c, 0x0b, 0x04, 0x87, 0x65, 0xb4, 0x43, 0x18, 0xa8,
cc9195
+  0xb2, 0xe0, 0x6d, 0x19, 0x77, 0xec, 0x5a, 0x24, 0xfa, 0x48, 0x03, 0x02, 0x03,
cc9195
+  0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x43, 0x30, 0x82, 0x01, 0x3f, 0x30, 0x10,
cc9195
+  0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03,
cc9195
+  0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,
cc9195
+  0x14, 0xa9, 0x29, 0x02, 0x39, 0x8e, 0x16, 0xc4, 0x97, 0x78, 0xcd, 0x90, 0xf9,
cc9195
+  0x9e, 0x4f, 0x9a, 0xe1, 0x7c, 0x55, 0xaf, 0x53, 0x30, 0x19, 0x06, 0x09, 0x2b,
cc9195
+  0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00,
cc9195
+  0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03,
cc9195
+  0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03,
cc9195
+  0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,
cc9195
+  0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,
cc9195
+  0xd5, 0xf6, 0x56, 0xcb, 0x8f, 0xe8, 0xa2, 0x5c, 0x62, 0x68, 0xd1, 0x3d, 0x94,
cc9195
+  0x90, 0x5b, 0xd7, 0xce, 0x9a, 0x18, 0xc4, 0x30, 0x56, 0x06, 0x03, 0x55, 0x1d,
cc9195
+  0x1f, 0x04, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0xa0, 0x49, 0xa0, 0x47, 0x86, 0x45,
cc9195
+  0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69,
cc9195
+  0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70,
cc9195
+  0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
cc9195
+  0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72, 0x41,
cc9195
+  0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x33,
cc9195
+  0x2e, 0x63, 0x72, 0x6c, 0x30, 0x5a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
cc9195
+  0x07, 0x01, 0x01, 0x04, 0x4e, 0x30, 0x4c, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06,
cc9195
+  0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a,
cc9195
+  0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
cc9195
+  0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65,
cc9195
+  0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72,
cc9195
+  0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32,
cc9195
+  0x33, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
cc9195
+  0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x14,
cc9195
+  0xfc, 0x7c, 0x71, 0x51, 0xa5, 0x79, 0xc2, 0x6e, 0xb2, 0xef, 0x39, 0x3e, 0xbc,
cc9195
+  0x3c, 0x52, 0x0f, 0x6e, 0x2b, 0x3f, 0x10, 0x13, 0x73, 0xfe, 0xa8, 0x68, 0xd0,
cc9195
+  0x48, 0xa6, 0x34, 0x4d, 0x8a, 0x96, 0x05, 0x26, 0xee, 0x31, 0x46, 0x90, 0x61,
cc9195
+  0x79, 0xd6, 0xff, 0x38, 0x2e, 0x45, 0x6b, 0xf4, 0xc0, 0xe5, 0x28, 0xb8, 0xda,
cc9195
+  0x1d, 0x8f, 0x8a, 0xdb, 0x09, 0xd7, 0x1a, 0xc7, 0x4c, 0x0a, 0x36, 0x66, 0x6a,
cc9195
+  0x8c, 0xec, 0x1b, 0xd7, 0x04, 0x90, 0xa8, 0x18, 0x17, 0xa4, 0x9b, 0xb9, 0xe2,
cc9195
+  0x40, 0x32, 0x36, 0x76, 0xc4, 0xc1, 0x5a, 0xc6, 0xbf, 0xe4, 0x04, 0xc0, 0xea,
cc9195
+  0x16, 0xd3, 0xac, 0xc3, 0x68, 0xef, 0x62, 0xac, 0xdd, 0x54, 0x6c, 0x50, 0x30,
cc9195
+  0x58, 0xa6, 0xeb, 0x7c, 0xfe, 0x94, 0xa7, 0x4e, 0x8e, 0xf4, 0xec, 0x7c, 0x86,
cc9195
+  0x73, 0x57, 0xc2, 0x52, 0x21, 0x73, 0x34, 0x5a, 0xf3, 0xa3, 0x8a, 0x56, 0xc8,
cc9195
+  0x04, 0xda, 0x07, 0x09, 0xed, 0xf8, 0x8b, 0xe3, 0xce, 0xf4, 0x7e, 0x8e, 0xae,
cc9195
+  0xf0, 0xf6, 0x0b, 0x8a, 0x08, 0xfb, 0x3f, 0xc9, 0x1d, 0x72, 0x7f, 0x53, 0xb8,
cc9195
+  0xeb, 0xbe, 0x63, 0xe0, 0xe3, 0x3d, 0x31, 0x65, 0xb0, 0x81, 0xe5, 0xf2, 0xac,
cc9195
+  0xcd, 0x16, 0xa4, 0x9f, 0x3d, 0xa8, 0xb1, 0x9b, 0xc2, 0x42, 0xd0, 0x90, 0x84,
cc9195
+  0x5f, 0x54, 0x1d, 0xff, 0x89, 0xea, 0xba, 0x1d, 0x47, 0x90, 0x6f, 0xb0, 0x73,
cc9195
+  0x4e, 0x41, 0x9f, 0x40, 0x9f, 0x5f, 0xe5, 0xa1, 0x2a, 0xb2, 0x11, 0x91, 0x73,
cc9195
+  0x8a, 0x21, 0x28, 0xf0, 0xce, 0xde, 0x73, 0x39, 0x5f, 0x3e, 0xab, 0x5c, 0x60,
cc9195
+  0xec, 0xdf, 0x03, 0x10, 0xa8, 0xd3, 0x09, 0xe9, 0xf4, 0xf6, 0x96, 0x85, 0xb6,
cc9195
+  0x7f, 0x51, 0x88, 0x66, 0x47, 0x19, 0x8d, 0xa2, 0xb0, 0x12, 0x3d, 0x81, 0x2a,
cc9195
+  0x68, 0x05, 0x77, 0xbb, 0x91, 0x4c, 0x62, 0x7b, 0xb6, 0xc1, 0x07, 0xc7, 0xba,
cc9195
+  0x7a, 0x87, 0x34, 0x03, 0x0e, 0x4b, 0x62, 0x7a, 0x99, 0xe9, 0xca, 0xfc, 0xce,
cc9195
+  0x4a, 0x37, 0xc9, 0x2d, 0xa4, 0x57, 0x7c, 0x1c, 0xfe, 0x3d, 0xdc, 0xb8, 0x0f,
cc9195
+  0x5a, 0xfa, 0xd6, 0xc4, 0xb3, 0x02, 0x85, 0x02, 0x3a, 0xea, 0xb3, 0xd9, 0x6e,
cc9195
+  0xe4, 0x69, 0x21, 0x37, 0xde, 0x81, 0xd1, 0xf6, 0x75, 0x19, 0x05, 0x67, 0xd3,
cc9195
+  0x93, 0x57, 0x5e, 0x29, 0x1b, 0x39, 0xc8, 0xee, 0x2d, 0xe1, 0xcd, 0xe4, 0x45,
cc9195
+  0x73, 0x5b, 0xd0, 0xd2, 0xce, 0x7a, 0xab, 0x16, 0x19, 0x82, 0x46, 0x58, 0xd0,
cc9195
+  0x5e, 0x9d, 0x81, 0xb3, 0x67, 0xaf, 0x6c, 0x35, 0xf2, 0xbc, 0xe5, 0x3f, 0x24,
cc9195
+  0xe2, 0x35, 0xa2, 0x0a, 0x75, 0x06, 0xf6, 0x18, 0x56, 0x99, 0xd4, 0x78, 0x2c,
cc9195
+  0xd1, 0x05, 0x1b, 0xeb, 0xd0, 0x88, 0x01, 0x9d, 0xaa, 0x10, 0xf1, 0x05, 0xdf,
cc9195
+  0xba, 0x7e, 0x2c, 0x63, 0xb7, 0x06, 0x9b, 0x23, 0x21, 0xc4, 0xf9, 0x78, 0x6c,
cc9195
+  0xe2, 0x58, 0x17, 0x06, 0x36, 0x2b, 0x91, 0x12, 0x03, 0xcc, 0xa4, 0xd9, 0xf2,
cc9195
+  0x2d, 0xba, 0xf9, 0x94, 0x9d, 0x40, 0xed, 0x18, 0x45, 0xf1, 0xce, 0x8a, 0x5c,
cc9195
+  0x6b, 0x3e, 0xab, 0x03, 0xd3, 0x70, 0x18, 0x2a, 0x0a, 0x6a, 0xe0, 0x5f, 0x47,
cc9195
+  0xd1, 0xd5, 0x63, 0x0a, 0x32, 0xf2, 0xaf, 0xd7, 0x36, 0x1f, 0x2a, 0x70, 0x5a,
cc9195
+  0xe5, 0x42, 0x59, 0x08, 0x71, 0x4b, 0x57, 0xba, 0x7e, 0x83, 0x81, 0xf0, 0x21,
cc9195
+  0x3c, 0xf4, 0x1c, 0xc1, 0xc5, 0xb9, 0x90, 0x93, 0x0e, 0x88, 0x45, 0x93, 0x86,
cc9195
+  0xe9, 0xb1, 0x20, 0x99, 0xbe, 0x98, 0xcb, 0xc5, 0x95, 0xa4, 0x5d, 0x62, 0xd6,
cc9195
+  0xa0, 0x63, 0x08, 0x20, 0xbd, 0x75, 0x10, 0x77, 0x7d, 0x3d, 0xf3, 0x45, 0xb9,
cc9195
+  0x9f, 0x97, 0x9f, 0xcb, 0x57, 0x80, 0x6f, 0x33, 0xa9, 0x04, 0xcf, 0x77, 0xa4,
cc9195
+  0x62, 0x1c, 0x59, 0x7e
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// Second DB entry: "Microsoft Corporation UEFI CA 2011"
cc9195
+// SHA1: 46:de:f6:3b:5c:e6:1c:f8:ba:0d:e2:e6:63:9c:10:19:d0:ed:14:f3
cc9195
+//
cc9195
+// To verify the "shim" binary and PCI expansion ROMs with.
cc9195
+//
cc9195
+STATIC CONST UINT8 MicrosoftUefiCA[] = {
cc9195
+  0x30, 0x82, 0x06, 0x10, 0x30, 0x82, 0x03, 0xf8, 0xa0, 0x03, 0x02, 0x01, 0x02,
cc9195
+  0x02, 0x0a, 0x61, 0x08, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30,
cc9195
+  0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
cc9195
+  0x00, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
cc9195
+  0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
cc9195
+  0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31,
cc9195
+  0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64,
cc9195
+  0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a,
cc9195
+  0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43,
cc9195
+  0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30,
cc9195
+  0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f,
cc9195
+  0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,
cc9195
+  0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72,
cc9195
+  0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63,
cc9195
+  0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30,
cc9195
+  0x36, 0x32, 0x37, 0x32, 0x31, 0x32, 0x32, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x32,
cc9195
+  0x36, 0x30, 0x36, 0x32, 0x37, 0x32, 0x31, 0x33, 0x32, 0x34, 0x35, 0x5a, 0x30,
cc9195
+  0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
cc9195
+  0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,
cc9195
+  0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30,
cc9195
+  0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f,
cc9195
+  0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15,
cc9195
+  0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72,
cc9195
+  0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06,
cc9195
+  0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
cc9195
+  0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f,
cc9195
+  0x6e, 0x20, 0x55, 0x45, 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31,
cc9195
+  0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
cc9195
+  0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
cc9195
+  0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x08, 0x6c, 0x4c, 0xc7,
cc9195
+  0x45, 0x09, 0x6a, 0x4b, 0x0c, 0xa4, 0xc0, 0x87, 0x7f, 0x06, 0x75, 0x0c, 0x43,
cc9195
+  0x01, 0x54, 0x64, 0xe0, 0x16, 0x7f, 0x07, 0xed, 0x92, 0x7d, 0x0b, 0xb2, 0x73,
cc9195
+  0xbf, 0x0c, 0x0a, 0xc6, 0x4a, 0x45, 0x61, 0xa0, 0xc5, 0x16, 0x2d, 0x96, 0xd3,
cc9195
+  0xf5, 0x2b, 0xa0, 0xfb, 0x4d, 0x49, 0x9b, 0x41, 0x80, 0x90, 0x3c, 0xb9, 0x54,
cc9195
+  0xfd, 0xe6, 0xbc, 0xd1, 0x9d, 0xc4, 0xa4, 0x18, 0x8a, 0x7f, 0x41, 0x8a, 0x5c,
cc9195
+  0x59, 0x83, 0x68, 0x32, 0xbb, 0x8c, 0x47, 0xc9, 0xee, 0x71, 0xbc, 0x21, 0x4f,
cc9195
+  0x9a, 0x8a, 0x7c, 0xff, 0x44, 0x3f, 0x8d, 0x8f, 0x32, 0xb2, 0x26, 0x48, 0xae,
cc9195
+  0x75, 0xb5, 0xee, 0xc9, 0x4c, 0x1e, 0x4a, 0x19, 0x7e, 0xe4, 0x82, 0x9a, 0x1d,
cc9195
+  0x78, 0x77, 0x4d, 0x0c, 0xb0, 0xbd, 0xf6, 0x0f, 0xd3, 0x16, 0xd3, 0xbc, 0xfa,
cc9195
+  0x2b, 0xa5, 0x51, 0x38, 0x5d, 0xf5, 0xfb, 0xba, 0xdb, 0x78, 0x02, 0xdb, 0xff,
cc9195
+  0xec, 0x0a, 0x1b, 0x96, 0xd5, 0x83, 0xb8, 0x19, 0x13, 0xe9, 0xb6, 0xc0, 0x7b,
cc9195
+  0x40, 0x7b, 0xe1, 0x1f, 0x28, 0x27, 0xc9, 0xfa, 0xef, 0x56, 0x5e, 0x1c, 0xe6,
cc9195
+  0x7e, 0x94, 0x7e, 0xc0, 0xf0, 0x44, 0xb2, 0x79, 0x39, 0xe5, 0xda, 0xb2, 0x62,
cc9195
+  0x8b, 0x4d, 0xbf, 0x38, 0x70, 0xe2, 0x68, 0x24, 0x14, 0xc9, 0x33, 0xa4, 0x08,
cc9195
+  0x37, 0xd5, 0x58, 0x69, 0x5e, 0xd3, 0x7c, 0xed, 0xc1, 0x04, 0x53, 0x08, 0xe7,
cc9195
+  0x4e, 0xb0, 0x2a, 0x87, 0x63, 0x08, 0x61, 0x6f, 0x63, 0x15, 0x59, 0xea, 0xb2,
cc9195
+  0x2b, 0x79, 0xd7, 0x0c, 0x61, 0x67, 0x8a, 0x5b, 0xfd, 0x5e, 0xad, 0x87, 0x7f,
cc9195
+  0xba, 0x86, 0x67, 0x4f, 0x71, 0x58, 0x12, 0x22, 0x04, 0x22, 0x22, 0xce, 0x8b,
cc9195
+  0xef, 0x54, 0x71, 0x00, 0xce, 0x50, 0x35, 0x58, 0x76, 0x95, 0x08, 0xee, 0x6a,
cc9195
+  0xb1, 0xa2, 0x01, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x76,
cc9195
+  0x30, 0x82, 0x01, 0x72, 0x30, 0x12, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01,
cc9195
+  0x82, 0x37, 0x15, 0x01, 0x04, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x23,
cc9195
+  0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x02, 0x04, 0x16,
cc9195
+  0x04, 0x14, 0xf8, 0xc1, 0x6b, 0xb7, 0x7f, 0x77, 0x53, 0x4a, 0xf3, 0x25, 0x37,
cc9195
+  0x1d, 0x4e, 0xa1, 0x26, 0x7b, 0x0f, 0x20, 0x70, 0x80, 0x30, 0x1d, 0x06, 0x03,
cc9195
+  0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x13, 0xad, 0xbf, 0x43, 0x09, 0xbd,
cc9195
+  0x82, 0x70, 0x9c, 0x8c, 0xd5, 0x4f, 0x31, 0x6e, 0xd5, 0x22, 0x98, 0x8a, 0x1b,
cc9195
+  0xd4, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14,
cc9195
+  0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43,
cc9195
+  0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02,
cc9195
+  0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
cc9195
+  0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,
cc9195
+  0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58,
cc9195
+  0x11, 0xbf, 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8,
cc9195
+  0x30, 0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51,
cc9195
+  0xa0, 0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
cc9195
+  0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
cc9195
+  0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f,
cc9195
+  0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43,
cc9195
+  0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f,
cc9195
+  0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e,
cc9195
+  0x63, 0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
cc9195
+  0x01, 0x01, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01,
cc9195
+  0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
cc9195
+  0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66,
cc9195
+  0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72,
cc9195
+  0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50,
cc9195
+  0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30,
cc9195
+  0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06,
cc9195
+  0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03,
cc9195
+  0x82, 0x02, 0x01, 0x00, 0x35, 0x08, 0x42, 0xff, 0x30, 0xcc, 0xce, 0xf7, 0x76,
cc9195
+  0x0c, 0xad, 0x10, 0x68, 0x58, 0x35, 0x29, 0x46, 0x32, 0x76, 0x27, 0x7c, 0xef,
cc9195
+  0x12, 0x41, 0x27, 0x42, 0x1b, 0x4a, 0xaa, 0x6d, 0x81, 0x38, 0x48, 0x59, 0x13,
cc9195
+  0x55, 0xf3, 0xe9, 0x58, 0x34, 0xa6, 0x16, 0x0b, 0x82, 0xaa, 0x5d, 0xad, 0x82,
cc9195
+  0xda, 0x80, 0x83, 0x41, 0x06, 0x8f, 0xb4, 0x1d, 0xf2, 0x03, 0xb9, 0xf3, 0x1a,
cc9195
+  0x5d, 0x1b, 0xf1, 0x50, 0x90, 0xf9, 0xb3, 0x55, 0x84, 0x42, 0x28, 0x1c, 0x20,
cc9195
+  0xbd, 0xb2, 0xae, 0x51, 0x14, 0xc5, 0xc0, 0xac, 0x97, 0x95, 0x21, 0x1c, 0x90,
cc9195
+  0xdb, 0x0f, 0xfc, 0x77, 0x9e, 0x95, 0x73, 0x91, 0x88, 0xca, 0xbd, 0xbd, 0x52,
cc9195
+  0xb9, 0x05, 0x50, 0x0d, 0xdf, 0x57, 0x9e, 0xa0, 0x61, 0xed, 0x0d, 0xe5, 0x6d,
cc9195
+  0x25, 0xd9, 0x40, 0x0f, 0x17, 0x40, 0xc8, 0xce, 0xa3, 0x4a, 0xc2, 0x4d, 0xaf,
cc9195
+  0x9a, 0x12, 0x1d, 0x08, 0x54, 0x8f, 0xbd, 0xc7, 0xbc, 0xb9, 0x2b, 0x3d, 0x49,
cc9195
+  0x2b, 0x1f, 0x32, 0xfc, 0x6a, 0x21, 0x69, 0x4f, 0x9b, 0xc8, 0x7e, 0x42, 0x34,
cc9195
+  0xfc, 0x36, 0x06, 0x17, 0x8b, 0x8f, 0x20, 0x40, 0xc0, 0xb3, 0x9a, 0x25, 0x75,
cc9195
+  0x27, 0xcd, 0xc9, 0x03, 0xa3, 0xf6, 0x5d, 0xd1, 0xe7, 0x36, 0x54, 0x7a, 0xb9,
cc9195
+  0x50, 0xb5, 0xd3, 0x12, 0xd1, 0x07, 0xbf, 0xbb, 0x74, 0xdf, 0xdc, 0x1e, 0x8f,
cc9195
+  0x80, 0xd5, 0xed, 0x18, 0xf4, 0x2f, 0x14, 0x16, 0x6b, 0x2f, 0xde, 0x66, 0x8c,
cc9195
+  0xb0, 0x23, 0xe5, 0xc7, 0x84, 0xd8, 0xed, 0xea, 0xc1, 0x33, 0x82, 0xad, 0x56,
cc9195
+  0x4b, 0x18, 0x2d, 0xf1, 0x68, 0x95, 0x07, 0xcd, 0xcf, 0xf0, 0x72, 0xf0, 0xae,
cc9195
+  0xbb, 0xdd, 0x86, 0x85, 0x98, 0x2c, 0x21, 0x4c, 0x33, 0x2b, 0xf0, 0x0f, 0x4a,
cc9195
+  0xf0, 0x68, 0x87, 0xb5, 0x92, 0x55, 0x32, 0x75, 0xa1, 0x6a, 0x82, 0x6a, 0x3c,
cc9195
+  0xa3, 0x25, 0x11, 0xa4, 0xed, 0xad, 0xd7, 0x04, 0xae, 0xcb, 0xd8, 0x40, 0x59,
cc9195
+  0xa0, 0x84, 0xd1, 0x95, 0x4c, 0x62, 0x91, 0x22, 0x1a, 0x74, 0x1d, 0x8c, 0x3d,
cc9195
+  0x47, 0x0e, 0x44, 0xa6, 0xe4, 0xb0, 0x9b, 0x34, 0x35, 0xb1, 0xfa, 0xb6, 0x53,
cc9195
+  0xa8, 0x2c, 0x81, 0xec, 0xa4, 0x05, 0x71, 0xc8, 0x9d, 0xb8, 0xba, 0xe8, 0x1b,
cc9195
+  0x44, 0x66, 0xe4, 0x47, 0x54, 0x0e, 0x8e, 0x56, 0x7f, 0xb3, 0x9f, 0x16, 0x98,
cc9195
+  0xb2, 0x86, 0xd0, 0x68, 0x3e, 0x90, 0x23, 0xb5, 0x2f, 0x5e, 0x8f, 0x50, 0x85,
cc9195
+  0x8d, 0xc6, 0x8d, 0x82, 0x5f, 0x41, 0xa1, 0xf4, 0x2e, 0x0d, 0xe0, 0x99, 0xd2,
cc9195
+  0x6c, 0x75, 0xe4, 0xb6, 0x69, 0xb5, 0x21, 0x86, 0xfa, 0x07, 0xd1, 0xf6, 0xe2,
cc9195
+  0x4d, 0xd1, 0xda, 0xad, 0x2c, 0x77, 0x53, 0x1e, 0x25, 0x32, 0x37, 0xc7, 0x6c,
cc9195
+  0x52, 0x72, 0x95, 0x86, 0xb0, 0xf1, 0x35, 0x61, 0x6a, 0x19, 0xf5, 0xb2, 0x3b,
cc9195
+  0x81, 0x50, 0x56, 0xa6, 0x32, 0x2d, 0xfe, 0xa2, 0x89, 0xf9, 0x42, 0x86, 0x27,
cc9195
+  0x18, 0x55, 0xa1, 0x82, 0xca, 0x5a, 0x9b, 0xf8, 0x30, 0x98, 0x54, 0x14, 0xa6,
cc9195
+  0x47, 0x96, 0x25, 0x2f, 0xc8, 0x26, 0xe4, 0x41, 0x94, 0x1a, 0x5c, 0x02, 0x3f,
cc9195
+  0xe5, 0x96, 0xe3, 0x85, 0x5b, 0x3c, 0x3e, 0x3f, 0xbb, 0x47, 0x16, 0x72, 0x55,
cc9195
+  0xe2, 0x25, 0x22, 0xb1, 0xd9, 0x7b, 0xe7, 0x03, 0x06, 0x2a, 0xa3, 0xf7, 0x1e,
cc9195
+  0x90, 0x46, 0xc3, 0x00, 0x0d, 0xd6, 0x19, 0x89, 0xe3, 0x0e, 0x35, 0x27, 0x62,
cc9195
+  0x03, 0x71, 0x15, 0xa6, 0xef, 0xd0, 0x27, 0xa0, 0xa0, 0x59, 0x37, 0x60, 0xf8,
cc9195
+  0x38, 0x94, 0xb8, 0xe0, 0x78, 0x70, 0xf8, 0xba, 0x4c, 0x86, 0x87, 0x94, 0xf6,
cc9195
+  0xe0, 0xae, 0x02, 0x45, 0xee, 0x65, 0xc2, 0xb6, 0xa3, 0x7e, 0x69, 0x16, 0x75,
cc9195
+  0x07, 0x92, 0x9b, 0xf5, 0xa6, 0xbc, 0x59, 0x83, 0x58
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// The Microsoft.UefiSecureBootLogo.Tests.OutOfBoxConfirmDBXisPresent test case
cc9195
+// of the Secure Boot Logo Test in the Microsoft Hardware Certification Kit
cc9195
+// expects that the "dbx" variable exist.
cc9195
+//
cc9195
+// The article at <https://technet.microsoft.com/en-us/library/dn747883.aspx>
cc9195
+// writes (excerpt):
cc9195
+//
cc9195
+//    Windows 8.1 Secure Boot Key Creation and Management Guidance
cc9195
+//    1. Secure Boot, Windows 8.1 and Key Management
cc9195
+//    1.4 Signature Databases (Db and Dbx)
cc9195
+//    1.4.3 Forbidden Signature Database (dbx)
cc9195
+//
cc9195
+//    The contents of EFI_IMAGE_SIGNATURE_DATABASE1 dbx must be checked when
cc9195
+//    verifying images before checking db and any matches must prevent the
cc9195
+//    image from executing. The database may contain multiple certificates,
cc9195
+//    keys, and hashes in order to identify forbidden images. The Windows
cc9195
+//    Hardware Certification Requirements state that a dbx must be present, so
cc9195
+//    any dummy value, such as the SHA-256 hash of 0, may be used as a safe
cc9195
+//    placeholder until such time as Microsoft begins delivering dbx updates.
cc9195
+//
cc9195
+// The byte array below captures the SHA256 checksum of the empty file,
cc9195
+// blacklisting it for loading & execution. This qualifies as a dummy, since
cc9195
+// the empty file is not a valid UEFI binary anyway.
cc9195
+//
cc9195
+// Technically speaking, we could also capture an official (although soon to be
cc9195
+// obsolete) dbx update from <http://www.uefi.org/revocationlistfile>. However,
cc9195
+// the terms and conditions on distributing that binary aren't exactly light
cc9195
+// reading, so let's best steer clear of it, and follow the "dummy entry"
cc9195
+// practice recommended -- in natural English langauge -- in the
cc9195
+// above-referenced TechNet article.
cc9195
+//
cc9195
+STATIC CONST UINT8 mSha256OfDevNull[] = {
cc9195
+  0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99,
cc9195
+  0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95,
cc9195
+  0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// The following test cases of the Secure Boot Logo Test in the Microsoft
cc9195
+// Hardware Certification Kit:
cc9195
+//
cc9195
+// - Microsoft.UefiSecureBootLogo.Tests.OutOfBoxVerifyMicrosoftKEKpresent
cc9195
+// - Microsoft.UefiSecureBootLogo.Tests.OutOfBoxConfirmMicrosoftSignatureInDB
cc9195
+//
cc9195
+// expect the EFI_SIGNATURE_DATA.SignatureOwner GUID to be
cc9195
+// 77FA9ABD-0359-4D32-BD60-28F4E78F784B, when the
cc9195
+// EFI_SIGNATURE_DATA.SignatureData field carries any of the following X509
cc9195
+// certificates:
cc9195
+//
cc9195
+// - "Microsoft Corporation KEK CA 2011" (in KEK)
cc9195
+// - "Microsoft Windows Production PCA 2011" (in db)
cc9195
+// - "Microsoft Corporation UEFI CA 2011" (in db)
cc9195
+//
cc9195
+// This is despite the fact that the UEFI specification requires
cc9195
+// EFI_SIGNATURE_DATA.SignatureOwner to reflect the agent (i.e., OS,
cc9195
+// application or driver) that enrolled and therefore owns
cc9195
+// EFI_SIGNATURE_DATA.SignatureData, and not the organization that issued
cc9195
+// EFI_SIGNATURE_DATA.SignatureData.
cc9195
+//
cc9195
+STATIC CONST EFI_GUID mMicrosoftOwnerGuid = {
cc9195
+  0x77fa9abd, 0x0359, 0x4d32,
cc9195
+  { 0xbd, 0x60, 0x28, 0xf4, 0xe7, 0x8f, 0x78, 0x4b },
cc9195
+};
cc9195
+
cc9195
+//
cc9195
+// The most important thing about the variable payload is that it is a list of
cc9195
+// lists, where the element size of any given *inner* list is constant.
cc9195
+//
cc9195
+// Since X509 certificates vary in size, each of our *inner* lists will contain
cc9195
+// one element only (one X.509 certificate). This is explicitly mentioned in
cc9195
+// the UEFI specification, in "28.4.1 Signature Database", in a Note.
cc9195
+//
cc9195
+// The list structure looks as follows:
cc9195
+//
cc9195
+// struct EFI_VARIABLE_AUTHENTICATION_2 {                           |
cc9195
+//   struct EFI_TIME {                                              |
cc9195
+//     UINT16 Year;                                                 |
cc9195
+//     UINT8  Month;                                                |
cc9195
+//     UINT8  Day;                                                  |
cc9195
+//     UINT8  Hour;                                                 |
cc9195
+//     UINT8  Minute;                                               |
cc9195
+//     UINT8  Second;                                               |
cc9195
+//     UINT8  Pad1;                                                 |
cc9195
+//     UINT32 Nanosecond;                                           |
cc9195
+//     INT16  TimeZone;                                             |
cc9195
+//     UINT8  Daylight;                                             |
cc9195
+//     UINT8  Pad2;                                                 |
cc9195
+//   } TimeStamp;                                                   |
cc9195
+//                                                                  |
cc9195
+//   struct WIN_CERTIFICATE_UEFI_GUID {                           | |
cc9195
+//     struct WIN_CERTIFICATE {                                   | |
cc9195
+//       UINT32 dwLength; ----------------------------------------+ |
cc9195
+//       UINT16 wRevision;                                        | |
cc9195
+//       UINT16 wCertificateType;                                 | |
cc9195
+//     } Hdr;                                                     | +- DataSize
cc9195
+//                                                                | |
cc9195
+//     EFI_GUID CertType;                                         | |
cc9195
+//     UINT8    CertData[1] = { <--- "struct hack"                | |
cc9195
+//       struct EFI_SIGNATURE_LIST {                            | | |
cc9195
+//         EFI_GUID SignatureType;                              | | |
cc9195
+//         UINT32   SignatureListSize; -------------------------+ | |
cc9195
+//         UINT32   SignatureHeaderSize;                        | | |
cc9195
+//         UINT32   SignatureSize; ---------------------------+ | | |
cc9195
+//         UINT8    SignatureHeader[SignatureHeaderSize];     | | | |
cc9195
+//                                                            v | | |
cc9195
+//         struct EFI_SIGNATURE_DATA {                        | | | |
cc9195
+//           EFI_GUID SignatureOwner;                         | | | |
cc9195
+//           UINT8    SignatureData[1] = { <--- "struct hack" | | | |
cc9195
+//             X.509 payload                                  | | | |
cc9195
+//           }                                                | | | |
cc9195
+//         } Signatures[];                                      | | |
cc9195
+//       } SigLists[];                                            | |
cc9195
+//     };                                                         | |
cc9195
+//   } AuthInfo;                                                  | |
cc9195
+// };                                                               |
cc9195
+//
cc9195
+// Given that the "struct hack" invokes undefined behavior (which is why C99
cc9195
+// introduced the flexible array member), and because subtracting those pesky
cc9195
+// sizes of 1 is annoying, and because the format is fully specified in the
cc9195
+// UEFI specification, we'll introduce two matching convenience structures that
cc9195
+// are customized for our X.509 purposes.
cc9195
+//
cc9195
+#pragma pack(1)
cc9195
+typedef struct {
cc9195
+  EFI_TIME TimeStamp;
cc9195
+
cc9195
+  //
cc9195
+  // dwLength covers data below
cc9195
+  //
cc9195
+  UINT32   dwLength;
cc9195
+  UINT16   wRevision;
cc9195
+  UINT16   wCertificateType;
cc9195
+  EFI_GUID CertType;
cc9195
+} SINGLE_HEADER;
cc9195
+
cc9195
+typedef struct {
cc9195
+  //
cc9195
+  // SignatureListSize covers data below
cc9195
+  //
cc9195
+  EFI_GUID SignatureType;
cc9195
+  UINT32   SignatureListSize;
cc9195
+  UINT32   SignatureHeaderSize; // constant 0
cc9195
+  UINT32   SignatureSize;
cc9195
+
cc9195
+  //
cc9195
+  // SignatureSize covers data below
cc9195
+  //
cc9195
+  EFI_GUID SignatureOwner;
cc9195
+
cc9195
+  //
cc9195
+  // X.509 certificate follows
cc9195
+  //
cc9195
+} REPEATING_HEADER;
cc9195
+#pragma pack()
cc9195
+
cc9195
+/**
cc9195
+  Enroll a set of certificates in a global variable, overwriting it.
cc9195
+
cc9195
+  The variable will be rewritten with NV+BS+RT+AT attributes.
cc9195
+
cc9195
+  @param[in] VariableName  The name of the variable to overwrite.
cc9195
+
cc9195
+  @param[in] VendorGuid    The namespace (ie. vendor GUID) of the variable to
cc9195
+                           overwrite.
cc9195
+
cc9195
+  @param[in] CertType      The GUID determining the type of all the
cc9195
+                           certificates in the set that is passed in. For
cc9195
+                           example, gEfiCertX509Guid stands for DER-encoded
cc9195
+                           X.509 certificates, while gEfiCertSha256Guid stands
cc9195
+                           for SHA256 image hashes.
cc9195
+
cc9195
+  @param[in] ...           A list of
cc9195
+
cc9195
+                             IN CONST UINT8    *Cert,
cc9195
+                             IN UINTN          CertSize,
cc9195
+                             IN CONST EFI_GUID *OwnerGuid
cc9195
+
cc9195
+                           triplets. If the first component of a triplet is
cc9195
+                           NULL, then the other two components are not
cc9195
+                           accessed, and processing is terminated. The list of
cc9195
+                           certificates is enrolled in the variable specified,
cc9195
+                           overwriting it. The OwnerGuid component identifies
cc9195
+                           the agent installing the certificate.
cc9195
+
cc9195
+  @retval EFI_INVALID_PARAMETER  The triplet list is empty (ie. the first Cert
cc9195
+                                 value is NULL), or one of the CertSize values
cc9195
+                                 is 0, or one of the CertSize values would
cc9195
+                                 overflow the accumulated UINT32 data size.
cc9195
+
cc9195
+  @retval EFI_OUT_OF_RESOURCES   Out of memory while formatting variable
cc9195
+                                 payload.
cc9195
+
cc9195
+  @retval EFI_SUCCESS            Enrollment successful; the variable has been
cc9195
+                                 overwritten (or created).
cc9195
+
cc9195
+  @return                        Error codes from gRT->GetTime() and
cc9195
+                                 gRT->SetVariable().
cc9195
+**/
cc9195
+STATIC
cc9195
+EFI_STATUS
cc9195
+EFIAPI
cc9195
+EnrollListOfCerts (
cc9195
+  IN CHAR16   *VariableName,
cc9195
+  IN EFI_GUID *VendorGuid,
cc9195
+  IN EFI_GUID *CertType,
cc9195
+  ...
cc9195
+  )
cc9195
+{
cc9195
+  UINTN            DataSize;
cc9195
+  SINGLE_HEADER    *SingleHeader;
cc9195
+  REPEATING_HEADER *RepeatingHeader;
cc9195
+  VA_LIST          Marker;
cc9195
+  CONST UINT8      *Cert;
cc9195
+  EFI_STATUS       Status;
cc9195
+  UINT8            *Data;
cc9195
+  UINT8            *Position;
cc9195
+
cc9195
+  Status = EFI_SUCCESS;
cc9195
+
cc9195
+  //
cc9195
+  // compute total size first, for UINT32 range check, and allocation
cc9195
+  //
cc9195
+  DataSize = sizeof *SingleHeader;
cc9195
+  VA_START (Marker, CertType);
cc9195
+  for (Cert = VA_ARG (Marker, CONST UINT8 *);
cc9195
+       Cert != NULL;
cc9195
+       Cert = VA_ARG (Marker, CONST UINT8 *)) {
cc9195
+    UINTN          CertSize;
cc9195
+
cc9195
+    CertSize = VA_ARG (Marker, UINTN);
cc9195
+    (VOID)VA_ARG (Marker, CONST EFI_GUID *);
cc9195
+
cc9195
+    if (CertSize == 0 ||
cc9195
+        CertSize > MAX_UINT32 - sizeof *RepeatingHeader ||
cc9195
+        DataSize > MAX_UINT32 - sizeof *RepeatingHeader - CertSize) {
cc9195
+      Status = EFI_INVALID_PARAMETER;
cc9195
+      break;
cc9195
+    }
cc9195
+    DataSize += sizeof *RepeatingHeader + CertSize;
cc9195
+  }
cc9195
+  VA_END (Marker);
cc9195
+
cc9195
+  if (DataSize == sizeof *SingleHeader) {
cc9195
+    Status = EFI_INVALID_PARAMETER;
cc9195
+  }
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    goto Out;
cc9195
+  }
cc9195
+
cc9195
+  Data = AllocatePool (DataSize);
cc9195
+  if (Data == NULL) {
cc9195
+    Status = EFI_OUT_OF_RESOURCES;
cc9195
+    goto Out;
cc9195
+  }
cc9195
+
cc9195
+  Position = Data;
cc9195
+
cc9195
+  SingleHeader = (SINGLE_HEADER *)Position;
cc9195
+  Status = gRT->GetTime (&SingleHeader->TimeStamp, NULL);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    goto FreeData;
cc9195
+  }
cc9195
+  SingleHeader->TimeStamp.Pad1       = 0;
cc9195
+  SingleHeader->TimeStamp.Nanosecond = 0;
cc9195
+  SingleHeader->TimeStamp.TimeZone   = 0;
cc9195
+  SingleHeader->TimeStamp.Daylight   = 0;
cc9195
+  SingleHeader->TimeStamp.Pad2       = 0;
cc9195
+#if 0
cc9195
+  SingleHeader->dwLength         = DataSize - sizeof SingleHeader->TimeStamp;
cc9195
+#else
cc9195
+  //
cc9195
+  // This looks like a bug in edk2. According to the UEFI specification,
cc9195
+  // dwLength is "The length of the entire certificate, including the length of
cc9195
+  // the header, in bytes". That shouldn't stop right after CertType -- it
cc9195
+  // should include everything below it.
cc9195
+  //
cc9195
+  SingleHeader->dwLength         = sizeof *SingleHeader
cc9195
+                                     - sizeof SingleHeader->TimeStamp;
cc9195
+#endif
cc9195
+  SingleHeader->wRevision        = 0x0200;
cc9195
+  SingleHeader->wCertificateType = WIN_CERT_TYPE_EFI_GUID;
cc9195
+  CopyGuid (&SingleHeader->CertType, &gEfiCertPkcs7Guid);
cc9195
+  Position += sizeof *SingleHeader;
cc9195
+
cc9195
+  VA_START (Marker, CertType);
cc9195
+  for (Cert = VA_ARG (Marker, CONST UINT8 *);
cc9195
+       Cert != NULL;
cc9195
+       Cert = VA_ARG (Marker, CONST UINT8 *)) {
cc9195
+    UINTN            CertSize;
cc9195
+    CONST EFI_GUID   *OwnerGuid;
cc9195
+
cc9195
+    CertSize  = VA_ARG (Marker, UINTN);
cc9195
+    OwnerGuid = VA_ARG (Marker, CONST EFI_GUID *);
cc9195
+
cc9195
+    RepeatingHeader = (REPEATING_HEADER *)Position;
cc9195
+    CopyGuid (&RepeatingHeader->SignatureType, CertType);
cc9195
+    RepeatingHeader->SignatureListSize   =
cc9195
+      (UINT32)(sizeof *RepeatingHeader + CertSize);
cc9195
+    RepeatingHeader->SignatureHeaderSize = 0;
cc9195
+    RepeatingHeader->SignatureSize       =
cc9195
+      (UINT32)(sizeof RepeatingHeader->SignatureOwner + CertSize);
cc9195
+    CopyGuid (&RepeatingHeader->SignatureOwner, OwnerGuid);
cc9195
+    Position += sizeof *RepeatingHeader;
cc9195
+
cc9195
+    CopyMem (Position, Cert, CertSize);
cc9195
+    Position += CertSize;
cc9195
+  }
cc9195
+  VA_END (Marker);
cc9195
+
cc9195
+  ASSERT (Data + DataSize == Position);
cc9195
+
cc9195
+  Status = gRT->SetVariable (VariableName, VendorGuid,
cc9195
+                  (EFI_VARIABLE_NON_VOLATILE |
cc9195
+                   EFI_VARIABLE_BOOTSERVICE_ACCESS |
cc9195
+                   EFI_VARIABLE_RUNTIME_ACCESS |
cc9195
+                   EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS),
cc9195
+                  DataSize, Data);
cc9195
+
cc9195
+FreeData:
cc9195
+  FreePool (Data);
cc9195
+
cc9195
+Out:
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    AsciiPrint ("error: %a(\"%s\", %g): %r\n", __FUNCTION__, VariableName,
cc9195
+      VendorGuid, Status);
cc9195
+  }
cc9195
+  return Status;
cc9195
+}
cc9195
+
cc9195
+
cc9195
+STATIC
cc9195
+EFI_STATUS
cc9195
+EFIAPI
cc9195
+GetExact (
cc9195
+  IN CHAR16   *VariableName,
cc9195
+  IN EFI_GUID *VendorGuid,
cc9195
+  OUT VOID    *Data,
cc9195
+  IN UINTN    DataSize,
cc9195
+  IN BOOLEAN  AllowMissing
cc9195
+  )
cc9195
+{
cc9195
+  UINTN      Size;
cc9195
+  EFI_STATUS Status;
cc9195
+
cc9195
+  Size = DataSize;
cc9195
+  Status = gRT->GetVariable (VariableName, VendorGuid, NULL, &Size, Data);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    if (Status == EFI_NOT_FOUND && AllowMissing) {
cc9195
+      ZeroMem (Data, DataSize);
cc9195
+      return EFI_SUCCESS;
cc9195
+    }
cc9195
+
cc9195
+    AsciiPrint ("error: GetVariable(\"%s\", %g): %r\n", VariableName,
cc9195
+      VendorGuid, Status);
cc9195
+    return Status;
cc9195
+  }
cc9195
+
cc9195
+  if (Size != DataSize) {
cc9195
+    AsciiPrint ("error: GetVariable(\"%s\", %g): expected size 0x%Lx, "
cc9195
+      "got 0x%Lx\n", VariableName, VendorGuid, (UINT64)DataSize, (UINT64)Size);
cc9195
+    return EFI_PROTOCOL_ERROR;
cc9195
+  }
cc9195
+
cc9195
+  return EFI_SUCCESS;
cc9195
+}
cc9195
+
cc9195
+typedef struct {
cc9195
+  UINT8 SetupMode;
cc9195
+  UINT8 SecureBoot;
cc9195
+  UINT8 SecureBootEnable;
cc9195
+  UINT8 CustomMode;
cc9195
+  UINT8 VendorKeys;
cc9195
+} SETTINGS;
cc9195
+
cc9195
+STATIC
cc9195
+EFI_STATUS
cc9195
+EFIAPI
cc9195
+GetSettings (
cc9195
+  OUT SETTINGS *Settings
cc9195
+  )
cc9195
+{
cc9195
+  EFI_STATUS Status;
cc9195
+
cc9195
+  Status = GetExact (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid,
cc9195
+             &Settings->SetupMode, sizeof Settings->SetupMode, FALSE);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return Status;
cc9195
+  }
cc9195
+
cc9195
+  Status = GetExact (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid,
cc9195
+             &Settings->SecureBoot, sizeof Settings->SecureBoot, FALSE);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return Status;
cc9195
+  }
cc9195
+
cc9195
+  Status = GetExact (EFI_SECURE_BOOT_ENABLE_NAME,
cc9195
+             &gEfiSecureBootEnableDisableGuid, &Settings->SecureBootEnable,
cc9195
+             sizeof Settings->SecureBootEnable, TRUE);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return Status;
cc9195
+  }
cc9195
+
cc9195
+  Status = GetExact (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid,
cc9195
+             &Settings->CustomMode, sizeof Settings->CustomMode, FALSE);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return Status;
cc9195
+  }
cc9195
+
cc9195
+  Status = GetExact (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid,
cc9195
+             &Settings->VendorKeys, sizeof Settings->VendorKeys, FALSE);
cc9195
+  return Status;
cc9195
+}
cc9195
+
cc9195
+STATIC
cc9195
+VOID
cc9195
+EFIAPI
cc9195
+PrintSettings (
cc9195
+  IN CONST SETTINGS *Settings
cc9195
+  )
cc9195
+{
cc9195
+  AsciiPrint ("info: SetupMode=%d SecureBoot=%d SecureBootEnable=%d "
cc9195
+    "CustomMode=%d VendorKeys=%d\n", Settings->SetupMode, Settings->SecureBoot,
cc9195
+    Settings->SecureBootEnable, Settings->CustomMode, Settings->VendorKeys);
cc9195
+}
cc9195
+
cc9195
+
cc9195
+INTN
cc9195
+EFIAPI
cc9195
+ShellAppMain (
cc9195
+  IN UINTN  Argc,
cc9195
+  IN CHAR16 **Argv
cc9195
+  )
cc9195
+{
cc9195
+  EFI_STATUS Status;
cc9195
+  SETTINGS   Settings;
cc9195
+
cc9195
+  Status = GetSettings (&Settings);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+  PrintSettings (&Settings);
cc9195
+
cc9195
+  if (Settings.SetupMode != 1) {
cc9195
+    AsciiPrint ("error: already in User Mode\n");
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) {
cc9195
+    Settings.CustomMode = CUSTOM_SECURE_BOOT_MODE;
cc9195
+    Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid,
cc9195
+                    (EFI_VARIABLE_NON_VOLATILE |
cc9195
+                     EFI_VARIABLE_BOOTSERVICE_ACCESS),
cc9195
+                    sizeof Settings.CustomMode, &Settings.CustomMode);
cc9195
+    if (EFI_ERROR (Status)) {
cc9195
+      AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME,
cc9195
+        &gEfiCustomModeEnableGuid, Status);
cc9195
+      return 1;
cc9195
+    }
cc9195
+  }
cc9195
+
cc9195
+  Status = EnrollListOfCerts (
cc9195
+             EFI_IMAGE_SECURITY_DATABASE,
cc9195
+             &gEfiImageSecurityDatabaseGuid,
cc9195
+             &gEfiCertX509Guid,
cc9195
+             MicrosoftPCA,    sizeof MicrosoftPCA,    &mMicrosoftOwnerGuid,
cc9195
+             MicrosoftUefiCA, sizeof MicrosoftUefiCA, &mMicrosoftOwnerGuid,
cc9195
+             NULL);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  Status = EnrollListOfCerts (
cc9195
+             EFI_IMAGE_SECURITY_DATABASE1,
cc9195
+             &gEfiImageSecurityDatabaseGuid,
cc9195
+             &gEfiCertSha256Guid,
cc9195
+             mSha256OfDevNull, sizeof mSha256OfDevNull, &gEfiCallerIdGuid,
cc9195
+             NULL);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  Status = EnrollListOfCerts (
cc9195
+             EFI_KEY_EXCHANGE_KEY_NAME,
cc9195
+             &gEfiGlobalVariableGuid,
cc9195
+             &gEfiCertX509Guid,
cc9195
+             RedHatPkKek1, sizeof RedHatPkKek1, &gEfiCallerIdGuid,
cc9195
+             MicrosoftKEK, sizeof MicrosoftKEK, &mMicrosoftOwnerGuid,
cc9195
+             NULL);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  Status = EnrollListOfCerts (
cc9195
+             EFI_PLATFORM_KEY_NAME,
cc9195
+             &gEfiGlobalVariableGuid,
cc9195
+             &gEfiCertX509Guid,
cc9195
+             RedHatPkKek1, sizeof RedHatPkKek1, &gEfiGlobalVariableGuid,
cc9195
+             NULL);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  Settings.CustomMode = STANDARD_SECURE_BOOT_MODE;
cc9195
+  Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid,
cc9195
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
cc9195
+                  sizeof Settings.CustomMode, &Settings.CustomMode);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME,
cc9195
+      &gEfiCustomModeEnableGuid, Status);
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  Status = GetSettings (&Settings);
cc9195
+  if (EFI_ERROR (Status)) {
cc9195
+    return 1;
cc9195
+  }
cc9195
+  PrintSettings (&Settings);
cc9195
+
cc9195
+  if (Settings.SetupMode != 0 || Settings.SecureBoot != 1 ||
cc9195
+      Settings.SecureBootEnable != 1 || Settings.CustomMode != 0 ||
cc9195
+      Settings.VendorKeys != 0) {
cc9195
+    AsciiPrint ("error: unexpected\n");
cc9195
+    return 1;
cc9195
+  }
cc9195
+
cc9195
+  AsciiPrint ("info: success\n");
cc9195
+  return 0;
cc9195
+}
cc9195
diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf
cc9195
new file mode 100644
cc9195
index 0000000..0ad86a2
cc9195
--- /dev/null
cc9195
+++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf
cc9195
@@ -0,0 +1,52 @@
cc9195
+## @file
cc9195
+#  Enroll default PK, KEK, DB.
cc9195
+#
cc9195
+#  Copyright (C) 2014, Red Hat, Inc.
cc9195
+#
cc9195
+#  This program and the accompanying materials are licensed and made available
cc9195
+#  under the terms and conditions of the BSD License which accompanies this
cc9195
+#  distribution. The full text of the license may be found at
cc9195
+#  http://opensource.org/licenses/bsd-license.
cc9195
+#
cc9195
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
cc9195
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
cc9195
+#  IMPLIED.
cc9195
+##
cc9195
+
cc9195
+[Defines]
cc9195
+  INF_VERSION                    = 0x00010006
cc9195
+  BASE_NAME                      = EnrollDefaultKeys
cc9195
+  FILE_GUID                      = D5C1DF0B-1BAC-4EDF-BA48-08834009CA5A
cc9195
+  MODULE_TYPE                    = UEFI_APPLICATION
cc9195
+  VERSION_STRING                 = 0.1
cc9195
+  ENTRY_POINT                    = ShellCEntryLib
cc9195
+
cc9195
+#
cc9195
+#  VALID_ARCHITECTURES           = IA32 X64
cc9195
+#
cc9195
+
cc9195
+[Sources]
cc9195
+  EnrollDefaultKeys.c
cc9195
+
cc9195
+[Packages]
cc9195
+  MdePkg/MdePkg.dec
cc9195
+  MdeModulePkg/MdeModulePkg.dec
cc9195
+  SecurityPkg/SecurityPkg.dec
cc9195
+  ShellPkg/ShellPkg.dec
cc9195
+
cc9195
+[Guids]
cc9195
+  gEfiCertPkcs7Guid
cc9195
+  gEfiCertSha256Guid
cc9195
+  gEfiCertX509Guid
cc9195
+  gEfiCustomModeEnableGuid
cc9195
+  gEfiGlobalVariableGuid
cc9195
+  gEfiImageSecurityDatabaseGuid
cc9195
+  gEfiSecureBootEnableDisableGuid
cc9195
+
cc9195
+[LibraryClasses]
cc9195
+  BaseMemoryLib
cc9195
+  DebugLib
cc9195
+  MemoryAllocationLib
cc9195
+  ShellCEntryLib
cc9195
+  UefiLib
cc9195
+  UefiRuntimeServicesTableLib
cc9195
diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
cc9195
index b577767..4d268c9 100644
cc9195
--- a/OvmfPkg/OvmfPkgIa32.dsc
cc9195
+++ b/OvmfPkg/OvmfPkgIa32.dsc
cc9195
@@ -865,6 +865,10 @@
cc9195
 
cc9195
 !if $(SECURE_BOOT_ENABLE) == TRUE
cc9195
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
cc9195
+  OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf {
cc9195
+    <LibraryClasses>
cc9195
+      ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
cc9195
+  }
cc9195
 !endif
cc9195
 
cc9195
   OvmfPkg/PlatformDxe/Platform.inf
cc9195
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
cc9195
index a6a40be..6836622 100644
cc9195
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
cc9195
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
cc9195
@@ -874,6 +874,10 @@
cc9195
 
cc9195
 !if $(SECURE_BOOT_ENABLE) == TRUE
cc9195
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
cc9195
+  OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf {
cc9195
+    <LibraryClasses>
cc9195
+      ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
cc9195
+  }
cc9195
 !endif
cc9195
 
cc9195
   OvmfPkg/PlatformDxe/Platform.inf
cc9195
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
cc9195
index 8bd3754..0b3008f 100644
cc9195
--- a/OvmfPkg/OvmfPkgX64.dsc
cc9195
+++ b/OvmfPkg/OvmfPkgX64.dsc
cc9195
@@ -872,6 +872,10 @@
cc9195
 
cc9195
 !if $(SECURE_BOOT_ENABLE) == TRUE
cc9195
   SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
cc9195
+  OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf {
cc9195
+    <LibraryClasses>
cc9195
+      ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
cc9195
+  }
cc9195
 !endif
cc9195
 
cc9195
   OvmfPkg/PlatformDxe/Platform.inf
cc9195
-- 
cc9195
1.8.3.1
cc9195