void executable(string path, size_t pagesize, size_t offset, size_t length);
void reopen(string path, size_t offset, size_t length);
+ bool opened();
void specialSlot(SpecialSlot slot, CFDataRef data);
void identifier(const std::string &code) { mIdentifier = code; }
Scatter *scatter(unsigned count); // allocate that many scatter elements (w/o sentinel)
Scatter *scatter() { return mScatter; } // return already allocated scatter vector
-
+
+ void execSeg(uint64_t base, uint64_t limit, uint64_t flags) {
+ mExecSegOffset = base; mExecSegLimit = limit; mExecSegFlags = flags; }
+ void addExecSegFlags(uint64_t flags) { mExecSegFlags |= flags; }
+
+ typedef std::map<CodeDirectory::HashAlgorithm, CFCopyRef<CFDataRef> >
+ PreEncryptHashMap;
+
+ void generatePreEncryptHashes(bool pre) { mGeneratePreEncryptHashes = pre; }
+ void preservePreEncryptHashMap(PreEncryptHashMap preEncryptHashMap) {
+ mPreservedPreEncryptHashMap = preEncryptHashMap;
+ }
+
+ void runTimeVersion(uint32_t runtime) {
+ mRuntimeVersion = runtime;
+ }
+
size_t size(const uint32_t version); // calculate size
CodeDirectory *build(); // build CodeDirectory and return it
- const size_t fixedSize(const uint32_t version); // calculate fixed size of the CodeDirectory
+ size_t fixedSize(const uint32_t version); // calculate fixed size of the CodeDirectory
uint32_t hashType() const { return mHashType; }
Scatter *mScatter; // scatter vector
size_t mScatterSize; // number of scatter elements allocated (incl. sentinel)
-
+
+ uint64_t mExecSegOffset; // starting offset of executable segment
+ uint64_t mExecSegLimit; // limit of executable segment
+ uint64_t mExecSegFlags; // executable segment flags
+
+ bool mGeneratePreEncryptHashes; // whether to also generate new pre-encrypt hashes
+ PreEncryptHashMap mPreservedPreEncryptHashMap; // existing pre-encrypt hashes to be set
+
+ uint32_t mRuntimeVersion; // Hardened Runtime Version
+
CodeDirectory *mDir; // what we're building
};