fix pdf validation

pull/721/head
Pete Matsyburka 2 weeks ago
parent 887d80f6d7
commit ec04a95e36

@ -2306,14 +2306,14 @@ class Pdfium
[PageObject, *to_a].hash [PageObject, *to_a].hash
end end
private
def object_ptr def object_ptr
page.ensure_not_closed! page.ensure_not_closed!
Pdfium.FPDFPage_GetObject(page.page_ptr, index) Pdfium.FPDFPage_GetObject(page.page_ptr, index)
end end
private
def read_bounds def read_bounds
buffer = Array.new(4) { FFI::MemoryPointer.new(:float) } buffer = Array.new(4) { FFI::MemoryPointer.new(:float) }

@ -173,7 +173,7 @@ module VerifyPdfSignature
io.seek(0) io.seek(0)
Pdfium::Document.open_bytes(io.read(signed_end)) do |signed_document| Pdfium::Document.open_bytes(io.read(signed_end)) do |signed_document|
next false unless signed_document.valid_cross_reference_table? next true unless signed_document.valid_cross_reference_table?
serialized_document(signed_document) != serialized_document(document) serialized_document(signed_document) != serialized_document(document)
end end
@ -182,13 +182,20 @@ module VerifyPdfSignature
def serialized_document(document) def serialized_document(document)
pages = (0...document.page_count).map do |index| pages = (0...document.page_count).map do |index|
page = document.get_page(index) page = document.get_page(index)
objects = page.objects.map { |object| [*object.to_a, image_digest(page, object)] }
[page.rotation, page.objects, page.annotations, page.text] [page.rotation, objects, page.annotations, page.text]
end end
[pages, document.bookmarks] [pages, document.bookmarks]
end end
def image_digest(page, object)
return unless object.image?
Digest::SHA256.hexdigest(page.extract_image_bitmap(object.object_ptr)[:data])
end
def signed_data(io, byte_range) def signed_data(io, byte_range)
byte_range.each_slice(2).map do |offset, length| byte_range.each_slice(2).map do |offset, length|
io.seek(offset) io.seek(offset)

Loading…
Cancel
Save