'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.signMachOExecutable = exports.patchMachOExecutable = void 0;
const child_process_1 = require('child_process');
function parseCStr(buf) {
  for (let i = 0; i < buf.length; i += 1) {
    if (buf[i] === 0) {
      return buf.slice(0, i).toString();
    }
  }
}
function patchCommand(type, buf, file) {
  // segment_64
  if (type === 0x19) {
    const name = parseCStr(buf.slice(0, 16));
    if (name === '__LINKEDIT') {
      const fileoff = buf.readBigUInt64LE(32);
      const vmsizePatched = BigInt(file.length) - fileoff;
      const filesizePatched = vmsizePatched;
      buf.writeBigUInt64LE(vmsizePatched, 24);
      buf.writeBigUInt64LE(filesizePatched, 40);
    }
  }
  // symtab
  if (type === 0x2) {
    const stroff = buf.readUInt32LE(8);
    const strsizePatched = file.length - stroff;
    buf.writeUInt32LE(strsizePatched, 12);
  }
}
function patchMachOExecutable(file) {
  const align = 8;
  const hsize = 32;
  const ncmds = file.readUInt32LE(16);
  const buf = file.slice(hsize);
  for (let offset = 0, i = 0; i < ncmds; i += 1) {
    const type = buf.readUInt32LE(offset);
    offset += 4;
    const size = buf.readUInt32LE(offset) - 8;
    offset += 4;
    patchCommand(type, buf.slice(offset, offset + size), file);
    offset += size;
    if (offset & align) {
      offset += align - (offset & align);
    }
  }
  return file;
}
exports.patchMachOExecutable = patchMachOExecutable;
function signMachOExecutable(executable) {
  try {
    (0, child_process_1.execFileSync)(
      'codesign',
      ['-f', '--sign', '-', executable],
      {
        stdio: 'inherit',
      }
    );
  } catch (_a) {
    (0, child_process_1.execFileSync)('ldid', ['-Cadhoc', '-S', executable], {
      stdio: 'inherit',
    });
  }
}
exports.signMachOExecutable = signMachOExecutable;
//# sourceMappingURL=mach-o.js.map
