| ... | ... | @@ -21,6 +21,7 @@ const Cache = @import("../Cache.zig"); |
| 21 | 21 | const target_util = @import("../target.zig"); |
| 22 | 22 | |
| 23 | 23 | const Trie = @import("MachO/Trie.zig"); |
| 24 | const CodeSignature = @import("MachO/CodeSignature.zig"); |
| 24 | 25 | |
| 25 | 26 | pub const base_tag: File.Tag = File.Tag.macho; |
| 26 | 27 | |
| ... | ... | @@ -385,7 +386,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 385 | 386 | self.libsystem_cmd_dirty = false; |
| 386 | 387 | } |
| 387 | 388 | |
| 388 | | try self.codeSign(); |
| 389 | try self.writecodeSignature(); |
| 389 | 390 | }, |
| 390 | 391 | .Obj => {}, |
| 391 | 392 | .Lib => return error.TODOImplementWritingLibFiles, |
| ... | ... | @@ -1751,60 +1752,20 @@ fn writeAllUndefSymbols(self: *MachO) !void { |
| 1751 | 1752 | try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.undef_symbols.items), off); |
| 1752 | 1753 | } |
| 1753 | 1754 | |
| 1754 | | fn codeSign(self: *MachO) !void { |
| 1755 | fn writecodeSignature(self: *MachO) !void { |
| 1755 | 1756 | const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; |
| 1756 | | // TODO add actual code signing mechanism |
| 1757 | | var buffer: std.ArrayListUnmanaged(u8) = .{}; |
| 1758 | | defer buffer.deinit(self.base.allocator); |
| 1759 | | // var super_blob = macho.SuperBlob{ |
| 1760 | | // .magic = macho.CSMAGIC_EMBEDDED_SIGNATURE, |
| 1761 | | // .length = 0, |
| 1762 | | // .count = 2, |
| 1763 | | // }; |
| 1764 | | const length: u32 = @sizeOf(u32) * 12; |
| 1765 | | try buffer.ensureCapacity(self.base.allocator, length); |
| 1766 | | var buf: [@sizeOf(u32)]u8 = undefined; |
| 1767 | | mem.writeIntBig(u32, &buf, macho.CSMAGIC_EMBEDDED_SIGNATURE); |
| 1768 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1769 | | mem.writeIntBig(u32, &buf, length); |
| 1770 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1771 | | mem.writeIntBig(u32, &buf, 2); |
| 1772 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1773 | | // macho.BlobIndex{ |
| 1774 | | // .type = macho.CSSLOT_REQUIREMENTS, |
| 1775 | | // .offset = offset, |
| 1776 | | // }; |
| 1777 | | mem.writeIntBig(u32, &buf, macho.CSSLOT_REQUIREMENTS); |
| 1778 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1779 | | mem.writeIntBig(u32, &buf, 28); |
| 1780 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1781 | | // macho.BlobIndex{ |
| 1782 | | // .type = macho.CSSLOT_SIGNATURESLOT, |
| 1783 | | // .offset = offset, |
| 1784 | | // }; |
| 1785 | | mem.writeIntBig(u32, &buf, macho.CSSLOT_SIGNATURESLOT); |
| 1786 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1787 | | mem.writeIntBig(u32, &buf, 40); |
| 1788 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1789 | | // const requirements_blob = macho.GenericBlob{ |
| 1790 | | // .magic = macho.CSMAGIC_REQUIREMENTS, |
| 1791 | | // .length = 0, |
| 1792 | | // }; |
| 1793 | | mem.writeIntBig(u32, &buf, macho.CSMAGIC_REQUIREMENTS); |
| 1794 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1795 | | mem.writeIntBig(u32, &buf, @sizeOf(u32) * 3); |
| 1796 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1797 | | mem.writeIntBig(u32, &buf, 0); |
| 1798 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1799 | | // const signature_blob = macho.GenericBlob{ |
| 1800 | | // .magic = macho.CSSLOT_SIGNATURESLOT, |
| 1801 | | // .length = 0, |
| 1802 | | // }; |
| 1803 | | mem.writeIntBig(u32, &buf, macho.CSMAGIC_BLOBWRAPPER); |
| 1804 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1805 | | mem.writeIntBig(u32, &buf, @sizeOf(u32) * 2); |
| 1806 | | buffer.appendSliceAssumeCapacity(buf[0..]); |
| 1807 | | try self.base.file.?.pwriteAll(buffer.items[0..], code_sig_cmd.dataoff); |
| 1757 | |
| 1758 | var code_sig = CodeSignature.init(self.base.allocator); |
| 1759 | defer code_sig.deinit(); |
| 1760 | |
| 1761 | try code_sig.calcAdhocSignature(); |
| 1762 | |
| 1763 | var buffer = try self.base.allocator.alloc(u8, code_sig.size()); |
| 1764 | defer self.base.allocator.free(buffer); |
| 1765 | |
| 1766 | code_sig.write(buffer); |
| 1767 | |
| 1768 | try self.base.file.?.pwriteAll(buffer, code_sig_cmd.dataoff); |
| 1808 | 1769 | try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1); |
| 1809 | 1770 | } |
| 1810 | 1771 | |