aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2016-02-23 16:49:45 -0800
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2016-02-23 16:55:08 -0800
commit58e7a21b04e53faf0499fb826b1f14b22894e722 (patch)
tree120ae010fd7795bc6fbc73cd93e8d3efeb7c08ce
parent2fa4b3c0efebbb9ed6e8f54087addca91b82cabe (diff)
downloadefitools-58e7a21b04e53faf0499fb826b1f14b22894e722.tar.gz
pkcs7verify: add protocol locate function
Add a function which tries to locate the protocol but then tries to load the Pkcs7VerifyDxe.efi file to provide it if it's not found. This allows us to rely on pkcs7verify always being present in the platform, because we can supply it simply by placing a signed copy from tianocore in the root directory. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r--include/pkcs7verify.h3
-rw-r--r--lib/Makefile2
-rw-r--r--lib/pkcs7verify.c59
3 files changed, 63 insertions, 1 deletions
diff --git a/include/pkcs7verify.h b/include/pkcs7verify.h
index 32ed118..5ed85f2 100644
--- a/include/pkcs7verify.h
+++ b/include/pkcs7verify.h
@@ -206,4 +206,7 @@ struct _EFI_PKCS7_VERIFY_PROTOCOL {
EFI_PKCS7_VERIFY_SIGNATURE VerifySignature;
};
+EFI_STATUS
+pkcs7verify_get_protocol(EFI_HANDLE image, EFI_PKCS7_VERIFY_PROTOCOL **p7vp, CHAR16 **error);
+
#endif
diff --git a/lib/Makefile b/lib/Makefile
index e527cd7..ded03f7 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,6 +1,6 @@
FILES = simple_file.o pecoff.o guid.o sha256.o console.o \
execute.o configtable.o shell.o security_policy.o \
- shim_protocol.o
+ shim_protocol.o pkcs7verify.o
LIBFILES = $(FILES) kernel_efivars.o
EFILIBFILES = $(patsubst %.o,%.efi.o,$(FILES)) variables.o
diff --git a/lib/pkcs7verify.c b/lib/pkcs7verify.c
new file mode 100644
index 0000000..9aaf540
--- /dev/null
+++ b/lib/pkcs7verify.c
@@ -0,0 +1,59 @@
+#include <efi.h>
+#include <efilib.h>
+
+#include <efiauthenticated.h>
+#include <guid.h>
+#include <pkcs7verify.h>
+#include <execute.h>
+
+CHAR16 *p7bin = L"\\Pkcs7VerifyDxe.efi";
+
+EFI_STATUS
+pkcs7verify_get_protocol(EFI_HANDLE image, EFI_PKCS7_VERIFY_PROTOCOL **p7vp, CHAR16 **error)
+{
+ EFI_LOADED_IMAGE *li;
+ EFI_DEVICE_PATH *loadpath = NULL;
+ CHAR16 *PathName = NULL;
+ EFI_HANDLE loader_handle;
+ EFI_STATUS status;
+
+ status = BS->LocateProtocol(&PKCS7_VERIFY_PROTOCOL_GUID,
+ NULL, (VOID **)p7vp);
+
+ if (status == EFI_SUCCESS)
+ return status;
+
+ Print(L"Platform doesn't provide PKCS7_VERIFY protocol, trying to load\n");
+
+ status = BS->HandleProtocol(image, &IMAGE_PROTOCOL, (VOID **)&li);
+ if (status != EFI_SUCCESS) {
+ *error = L"Can't find loaded image protocol";
+ return status;
+ }
+
+ status = generate_path(p7bin, li, &loadpath, &PathName);
+ if (status != EFI_SUCCESS) {
+ *error = L"generate_path failed";
+ return status;
+ }
+
+ status = BS->LoadImage(FALSE, image, loadpath, NULL, 0, &loader_handle);
+ if (status != EFI_SUCCESS) {
+ *error = L"LoadImage failed for external module";
+ return status;
+ }
+
+ status = BS->StartImage(loader_handle, NULL, NULL);
+ if (status != EFI_SUCCESS) {
+ *error = L"StartImage failed for external module (loaded OK)";
+ return status;
+ }
+
+ status = BS->LocateProtocol(&PKCS7_VERIFY_PROTOCOL_GUID,
+ NULL, (VOID **)p7vp);
+
+ if (status != EFI_SUCCESS)
+ *error = L"Loaded module but it didn't provide the pkcs7Verify protocol";
+
+ return status;
+}