summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2019-02-03 02:54:37 -0800
committerJay Freeman (saurik) <saurik@saurik.com>2019-02-03 02:54:37 -0800
commit1190f447adc6290d57702d7992474b10557370e5 (patch)
tree0e01d041a21b36894c03744d65be1eb47a5e069c
parentc1f7096708df36a73b1f2b4769ea46dc483b5852 (diff)
downloadldid-1190f447adc6290d57702d7992474b10557370e5.tar.gz
ldid-1190f447adc6290d57702d7992474b10557370e5.tar.zst
ldid-1190f447adc6290d57702d7992474b10557370e5.zip
Swap libplist with CoreFoundation (for Substrate).
-rw-r--r--ldid.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/ldid.cpp b/ldid.cpp
index 32fd2d9..08ac3a3 100644
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -85,6 +85,8 @@
#ifndef LDID_NOPLIST
#include <plist/plist.h>
+#elif __APPLE__
+#include <CoreFoundation/CoreFoundation.h>
#endif
#include "ldid.hpp"
@@ -1970,11 +1972,21 @@ Hash Sign(const void *idata, size_t isize, std::streambuf &output, const std::st
#ifndef LDID_NOSMIME
if (!key.empty()) {
+#ifdef LDID_NOPLIST
+ auto plist(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+ _scope({ CFRelease(plist); });
+
+ auto cdhashes(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
+ _scope({ CFRelease(cdhashes); });
+
+ CFDictionarySetValue(plist, CFSTR("cdhashes"), cdhashes);
+#else
auto plist(plist_new_dict());
_scope({ plist_free(plist); });
auto cdhashes(plist_new_array());
plist_dict_set_item(plist, "cdhashes", cdhashes);
+#endif
unsigned total(0);
for (Algorithm *pointer : GetAlgorithms()) {
@@ -1988,13 +2000,26 @@ Hash Sign(const void *idata, size_t isize, std::streambuf &output, const std::st
algorithm(hash, blob.data(), blob.size());
hash.resize(20);
+#ifdef LDID_NOPLIST
+ auto value(CFDataCreate(kCFAllocatorDefault, reinterpret_cast<const UInt8 *>(hash.data()), hash.size()));
+ _scope({ CFRelease(value); });
+ CFArrayAppendValue(cdhashes, value);
+#else
plist_array_append_item(cdhashes, plist_new_data(hash.data(), hash.size()));
+#endif
}
+#ifdef LDID_NOPLIST
+ auto created(CFPropertyListCreateXMLData(kCFAllocatorDefault, plist));
+ _scope({ CFRelease(created); });
+ auto xml(reinterpret_cast<const char *>(CFDataGetBytePtr(created)));
+ auto size(CFDataGetLength(created));
+#else
char *xml(NULL);
uint32_t size;
plist_to_xml(plist, &xml, &size);
_scope({ free(xml); });
+#endif
std::stringbuf data;
const std::string &sign(blobs[CSSLOT_CODEDIRECTORY]);