|null */ public ?array $byte_range = null; /** * Fraction of the file covered by the signature (0.0 to 1.0) * * Computed as `(byte_range[1] + byte_range[3]) / file_size`. * Null if /ByteRange is missing, malformed, or file_size is unknown. * * Values < 1.0 indicate partial signatures (a common red flag for tampered docs). */ public ?float $coverage_fraction = null; /** * Validation status — always "not_checked" in v1 * * Future versions may add "valid", "invalid", "indeterminate" as cryptographic * validation is implemented. This is a string enum for schema stability. */ public string $validation_status; /** * Create Signature from JSON array * * @param array $data JSON data * @return self */ public static function fromArray(array $data): self { $signature = new self(); $signature->field_name = $data['field_name']; $signature->signer_name = $data['signer_name']; $signature->signing_date = $data['signing_date'] ?? null; $signature->reason = $data['reason'] ?? null; $signature->location = $data['location'] ?? null; $signature->sub_filter = $data['sub_filter'] ?? null; $signature->byte_range = $data['byte_range'] ?? null; $signature->coverage_fraction = $data['coverage_fraction'] ?? null; $signature->validation_status = $data['validation_status'] ?? 'not_checked'; return $signature; } /** * Convert to JSON array * * @return array */ public function toArray(): array { $data = [ 'field_name' => $this->field_name, 'signer_name' => $this->signer_name, 'validation_status' => $this->validation_status, ]; if ($this->signing_date !== null) { $data['signing_date'] = $this->signing_date; } if ($this->reason !== null) { $data['reason'] = $this->reason; } if ($this->location !== null) { $data['location'] = $this->location; } if ($this->sub_filter !== null) { $data['sub_filter'] = $this->sub_filter; } if ($this->byte_range !== null) { $data['byte_range'] = $this->byte_range; } if ($this->coverage_fraction !== null) { $data['coverage_fraction'] = $this->coverage_fraction; } return $data; } }