diff --git a/poppler/Form.cc b/poppler/Form.cc index d94757a..fa4fd32 100644 --- a/poppler/Form.cc +++ b/poppler/Form.cc @@ -1477,23 +1477,26 @@ return signature_info; } - Object r2, r3, r4; + Object offset0, length0, offset1, length1; NSSCMSVerificationStatus sig_val_state; SECErrorCodes cert_val_state; - byte_range.arrayGet(1, &r2); - byte_range.arrayGet(2, &r3); - byte_range.arrayGet(3, &r4); + byte_range.arrayGet(0, &offset0); + byte_range.arrayGet(1, &length0); + byte_range.arrayGet(2, &offset1); + byte_range.arrayGet(3, &length1); Goffset fileLength = doc->getBaseStream()->getLength(); - Goffset r_values[3]; + Goffset r_offsets[2]; + Goffset r_lengths[2]; - r_values[0] = r2.isInt64() ? r2.getInt64() : r2.getInt(); - r_values[1] = r3.isInt64() ? r3.getInt64() : r3.getInt(); - r_values[2] = r4.isInt64() ? r4.getInt64() : r4.getInt(); + r_offsets[0] = offset0.isInt64() ? offset0.getInt64() : offset0.getInt(); + r_lengths[0] = length0.isInt64() ? length0.getInt64() : length0.getInt(); + r_offsets[1] = offset1.isInt64() ? offset1.getInt64() : offset1.getInt(); + r_lengths[1] = length1.isInt64() ? length1.getInt64() : length1.getInt(); - if (r_values[0] <= 0 || r_values[1] <= 0 || r_values[2] <= 0 || r_values[1] <= r_values[0] || - r_values[1] + r_values[2] > fileLength) + if (r_offsets[1] <= 0 || r_lengths[0] <= 0 || r_lengths[1] <= 0 || r_offsets[1] <= r_offsets[0]+r_lengths[0] || + r_offsets[1] + r_lengths[1] > fileLength) { error(errSyntaxError, 0, "Illegal values in ByteRange array"); return signature_info; @@ -1506,18 +1509,21 @@ SignatureHandler signature_handler(signatureuchar, signature_len); //Read the 2 slices of data that are signed - doc->getBaseStream()->setPos(0); - Goffset block_len = r_values[0]; + doc->getBaseStream()->setPos(r_offsets[0]); + Goffset block_len = r_lengths[0]; hashSignedDataBlock(&signature_handler, block_len); - doc->getBaseStream()->setPos(r_values[1]); - block_len = r_values[2]; + doc->getBaseStream()->setPos(r_offsets[1]); + block_len = r_lengths[1]; hashSignedDataBlock(&signature_handler, block_len); sig_val_state = signature_handler.validateSignature(); - signature_info->setSignatureValStatus(SignatureHandler::NSS_SigTranslate(sig_val_state)); + SignatureValidationStatus sig_status = SignatureHandler::NSS_SigTranslate(sig_val_state); + if (sig_status == SIGNATURE_VALID && r_offsets[0] != 0) + sig_status = SIGNATURE_PARTLY_VALID; + signature_info->setSignatureValStatus(sig_status); signature_info->setSignerName(signature_handler.getSignerName()); // verify if signature contains a 'signing time' attribute diff --git a/poppler/SignatureInfo.h b/poppler/SignatureInfo.h index 82b4ec4..66bfa88 100644 --- a/poppler/SignatureInfo.h +++ b/poppler/SignatureInfo.h @@ -18,6 +18,7 @@ enum SignatureValidationStatus { SIGNATURE_VALID, + SIGNATURE_PARTLY_VALID, SIGNATURE_INVALID, SIGNATURE_DIGEST_MISMATCH, SIGNATURE_DECODING_ERROR, diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc index 895876f..d77752e 100644 --- a/utils/pdfsig.cc +++ b/utils/pdfsig.cc @@ -33,6 +33,9 @@ switch(sig_vs) { case SIGNATURE_VALID: return "Signature is Valid."; + + case SIGNATURE_PARTLY_VALID: + return "Signature is Valid but only covering a part of the document."; case SIGNATURE_INVALID: return "Signature is Invalid.";