| ... | ... | @@ -1754,6 +1754,57 @@ fn writeAllUndefSymbols(self: *MachO) !void { |
| 1754 | 1754 | fn codeSign(self: *MachO) !void { |
| 1755 | 1755 | const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; |
| 1756 | 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 | 1808 | try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1); |
| 1758 | 1809 | } |
| 1759 | 1810 | |