| ... | @@ -21,6 +21,7 @@ const Cache = @import("../Cache.zig"); | ... | @@ -21,6 +21,7 @@ const Cache = @import("../Cache.zig"); |
| 21 | const target_util = @import("../target.zig"); | 21 | const target_util = @import("../target.zig"); |
| 22 | | 22 | |
| 23 | const Trie = @import("MachO/Trie.zig"); | 23 | const Trie = @import("MachO/Trie.zig"); |
| | 24 | const CodeSignature = @import("MachO/CodeSignature.zig"); |
| 24 | | 25 | |
| 25 | pub const base_tag: File.Tag = File.Tag.macho; | 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,7 +386,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 385 | self.libsystem_cmd_dirty = false; | 386 | self.libsystem_cmd_dirty = false; |
| 386 | } | 387 | } |
| 387 | | 388 | |
| 388 | try self.codeSign(); | 389 | try self.writecodeSignature(); |
| 389 | }, | 390 | }, |
| 390 | .Obj => {}, | 391 | .Obj => {}, |
| 391 | .Lib => return error.TODOImplementWritingLibFiles, | 392 | .Lib => return error.TODOImplementWritingLibFiles, |
| ... | @@ -1751,60 +1752,20 @@ fn writeAllUndefSymbols(self: *MachO) !void { | ... | @@ -1751,60 +1752,20 @@ fn writeAllUndefSymbols(self: *MachO) !void { |
| 1751 | try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.undef_symbols.items), off); | 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 | const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; | 1756 | const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; |
| 1756 | // TODO add actual code signing mechanism | 1757 | |
| 1757 | var buffer: std.ArrayListUnmanaged(u8) = .{}; | 1758 | var code_sig = CodeSignature.init(self.base.allocator); |
| 1758 | defer buffer.deinit(self.base.allocator); | 1759 | defer code_sig.deinit(); |
| 1759 | // var super_blob = macho.SuperBlob{ | 1760 | |
| 1760 | // .magic = macho.CSMAGIC_EMBEDDED_SIGNATURE, | 1761 | try code_sig.calcAdhocSignature(); |
| 1761 | // .length = 0, | 1762 | |
| 1762 | // .count = 2, | 1763 | var buffer = try self.base.allocator.alloc(u8, code_sig.size()); |
| 1763 | // }; | 1764 | defer self.base.allocator.free(buffer); |
| 1764 | const length: u32 = @sizeOf(u32) * 12; | 1765 | |
| 1765 | try buffer.ensureCapacity(self.base.allocator, length); | 1766 | code_sig.write(buffer); |
| 1766 | var buf: [@sizeOf(u32)]u8 = undefined; | 1767 | |
| 1767 | mem.writeIntBig(u32, &buf, macho.CSMAGIC_EMBEDDED_SIGNATURE); | 1768 | try self.base.file.?.pwriteAll(buffer, code_sig_cmd.dataoff); |
| 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); | | |
| 1808 | try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1); | 1769 | try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1); |
| 1809 | } | 1770 | } |
| 1810 | | 1771 | |