#include <string>
#include <vector>
+#include <plist/plist.h>
+
struct fat_header {
uint32_t magic;
uint32_t nfat_arch;
uint32_t offset_;
uint32_t size_;
uint32_t alloc_;
+ uint32_t align_;
- CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc) :
+ CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc, size_t align) :
mach_header_(mach_header),
offset_(offset),
size_(size),
- alloc_(alloc)
+ alloc_(alloc),
+ align_(align)
{
}
};
size_t normal((size + 0x1000 - 1) / 0x1000);
alloc = Align(alloc + (special + normal) * 0x14, 16);
- offset = Align(offset, 4096);
- allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc));
+ auto *fat_arch(mach_header.GetFatArch());
+ uint32_t align(fat_arch == NULL ? 0 : source.Swap(fat_arch->align));
+ offset = Align(offset, 1 << align);
+
+ allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc, align));
offset += size + alloc;
offset = Align(offset, 16);
}
fat_arch->cpusubtype = Swap(source->cpusubtype);
fat_arch->offset = Swap(allocation.offset_);
fat_arch->size = Swap(align + allocation.alloc_);
- fat_arch->align = Swap(0xc);
+ fat_arch->align = Swap(allocation.align_);
++fat_arch;
}
printf("path%zu='%s'\n", filei, file.c_str());
FatHeader fat_header(Map(temp == NULL ? path : temp, !(flag_R || flag_T || flag_s || flag_S || flag_O || flag_D)));
- struct linkedit_data_command *signature(NULL);
_foreach (mach_header, fat_header.GetMachHeaders()) {
+ struct linkedit_data_command *signature(NULL);
+ struct encryption_info_command *encryption(NULL);
+
if (flag_A) {
if (mach_header.GetCPUType() != flag_CPUType)
continue;
load_command->cmd = mach_header.Swap(LC_LOAD_DYLIB);
else if (cmd == LC_CODE_SIGNATURE)
signature = reinterpret_cast<struct linkedit_data_command *>(load_command);
+ else if (cmd == LC_ENCRYPTION_INFO)
+ encryption = reinterpret_cast<struct encryption_info_command *>(load_command);
else if (cmd == LC_UUID) {
volatile struct uuid_command *uuid_command(reinterpret_cast<struct uuid_command *>(load_command));
dylib_command->dylib.timestamp = mach_header.Swap(timed);
}
- } else if (cmd == LC_ENCRYPTION_INFO) {
- volatile struct encryption_info_command *encryption_info_command(reinterpret_cast<struct encryption_info_command *>(load_command));
+ }
+ }
- if (flag_D)
- encryption_info_command->cryptid = mach_header.Swap(0);
+ if (flag_d) {
+ _assert(encryption != NULL);
- if (flag_d) {
- printf("cryptoff=0x%x\n", mach_header.Swap(encryption_info_command->cryptoff));
- printf("cryptsize=0x%x\n", mach_header.Swap(encryption_info_command->cryptsize));
- printf("cryptid=0x%x\n", mach_header.Swap(encryption_info_command->cryptid));
- }
- }
+ printf("cryptoff=0x%x\n", mach_header.Swap(encryption->cryptoff));
+ printf("cryptsize=0x%x\n", mach_header.Swap(encryption->cryptsize));
+ printf("cryptid=0x%x\n", mach_header.Swap(encryption->cryptid));
+ }
+
+ if (flag_D) {
+ _assert(encryption != NULL);
+ encryption->cryptid = mach_header.Swap(0);
}
if (flag_e) {