// SPDX-License-Identifier: Apache-2.0

///|
/// Calculate and compare the PE optional-header checksum.
pub fn PEImage::checksum_info(self : Self) -> ChecksumInfo {
  let checksum_offset = self.pe_offset + 88
  let data = self.data
  let mut sum = 0UL
  let mut offset = 0
  while offset < data.length() {
    if offset >= checksum_offset && offset < checksum_offset + 4 {
      offset = offset + 2
      continue
    }
    let low = data[offset].to_int()
    let high = if offset + 1 < data.length() {
      data[offset + 1].to_int()
    } else {
      0
    }
    sum = sum + (low | (high << 8)).to_uint64()
    sum = sum.land(0xffffUL) + (sum >> 16)
    offset = offset + 2
  }
  sum = sum.land(0xffffUL) + (sum >> 16)
  sum = sum.land(0xffffUL) + (sum >> 16)
  let computed = (sum + data.length().to_uint64()).land(0xffffffffUL).to_int()
  let stored = self.checksum.to_int()
  { stored, computed, present: stored != 0, valid: stored == computed, }
}