--- /dev/null
+//
+// 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);
+}