]> git.saurik.com Git - apple/security.git/blobdiff - libsecurity_codesigning/gke/gkunpack.cpp
Security-55179.1.tar.gz
[apple/security.git] / libsecurity_codesigning / gke / gkunpack.cpp
diff --git a/libsecurity_codesigning/gke/gkunpack.cpp b/libsecurity_codesigning/gke/gkunpack.cpp
new file mode 100644 (file)
index 0000000..11e16ca
--- /dev/null
@@ -0,0 +1,31 @@
+//
+//  gkunpack - an ad-hoc tool for unpacking certain binary data from a detached code signature
+//
+//     gkunpack <detached_signature_data >prescreen_filter_data
+//
+#include <security_utilities/macho++.h>
+#include <security_codesigning/codedirectory.h>
+#include <security_codesigning/sigblob.h>
+
+using namespace CodeSigning;
+
+
+int main(int argc, const char * argv[])
+{
+       if (const EmbeddedSignatureBlob *top = (const EmbeddedSignatureBlob *)BlobCore::readBlob(stdin)) {
+               if (top->magic() == DetachedSignatureBlob::typeMagic) { // multiple architectures - pick the native one
+                       Architecture local = Architecture::local();
+                       const EmbeddedSignatureBlob *sig = EmbeddedSignatureBlob::specific(top->find(local.cpuType()));
+                       if (!sig)
+                               sig = EmbeddedSignatureBlob::specific(top->find(local.cpuType() & ~CPU_ARCH_MASK));
+                       top = sig;
+               }
+               if (top)
+                       if (const CodeDirectory *cd = top->find<const CodeDirectory>(cdCodeDirectorySlot)) {
+                               printf("%s\n", cd->screeningCode().c_str());
+                               exit(0);
+                       }
+       }
+       fprintf(stderr, "Invalid signature structure\n");
+       exit(1);
+}