Skip to content

Commit 9ab4686

Browse files
committed
fix: preserve legacy signature validation on native digest mismatch
Signed-off-by: Vitor Mattos <[email protected]>
1 parent 9acc03d commit 9ab4686

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

lib/Handler/SignEngine/Pkcs12Handler.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,12 @@ private function enrichLeafWithNativeData(array $result, array $metadata, array
301301
}
302302

303303
if (isset($validation['signatureValidation']) && is_array($validation['signatureValidation'])) {
304-
$leaf['signature_validation'] = $validation['signatureValidation'];
304+
$signatureValidation = $validation['signatureValidation'];
305+
306+
// Keep legacy OpenSSL result when native validator reports this known false-positive.
307+
if (!$this->isDigestMismatchSignatureValidation($signatureValidation)) {
308+
$leaf['signature_validation'] = $signatureValidation;
309+
}
305310
}
306311

307312
if (isset($validation['certificateValidation']) && is_array($validation['certificateValidation'])) {
@@ -318,6 +323,15 @@ private function enrichLeafWithNativeData(array $result, array $metadata, array
318323
return $result;
319324
}
320325

326+
/**
327+
* signer engines can produce signatures that the native validator currently flags as digest mismatch.
328+
* In this case we preserve the legacy validation computed from the PKCS#7 signature.
329+
*/
330+
private function isDigestMismatchSignatureValidation(array $signatureValidation): bool {
331+
return ($signatureValidation['id'] ?? null) === 3
332+
&& ($signatureValidation['label'] ?? '') === 'Digest mismatch.';
333+
}
334+
321335
/**
322336
* @param resource $resource
323337
* @return array<int, array{field: ?string, range: ?array{offset1: int, offset2: int, length1: int, length2: int}, signature_type: ?string, covers_entire_document: bool}>

tests/php/Unit/Handler/SignEngine/Pkcs12HandlerTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,4 +464,28 @@ public function testGetCertificateChainUsesNativeValidationServiceForEachSignatu
464464
$this->assertSame(3, $result[0]['chain'][0]['certificate_validation']['id']);
465465
}
466466

467+
public function testGetCertificateChainDoesNotOverrideLegacySignatureValidationOnDigestMismatch(): void {
468+
$this->pdfSignatureValidationService->method('validateFromResource')
469+
->willReturn([
470+
[
471+
'signatureValidation' => [
472+
'id' => 3,
473+
'label' => 'Digest mismatch.',
474+
'reason' => 'PDF content hash does not match signed digest',
475+
],
476+
],
477+
]);
478+
479+
$handler = $this->getHandler();
480+
$resource = fopen(__DIR__ . '/../../../fixtures/pdfs/small_valid-signed.pdf', 'r');
481+
$this->assertIsResource($resource);
482+
483+
$result = $handler->getCertificateChain($resource);
484+
fclose($resource);
485+
486+
$this->assertNotEmpty($result);
487+
$this->assertSame(1, $result[0]['chain'][0]['signature_validation']['id']);
488+
$this->assertSame('Signature is valid.', $result[0]['chain'][0]['signature_validation']['label']);
489+
}
490+
467491
}

0 commit comments

Comments
 (0)