Retrieving email in PDF signature with asn1crypto

106 views Asked by At

I have a PDF file with the following signature:

enter image description here

I try to explore the PDF file using the following code:

from pdfrw import PdfReader, PdfWriter
from PyPDF2 import PdfFileReader
import subprocess
from endesive import pdf
from pdfreader import PDFDocument
from asn1crypto import cms
import datetime

pdf_link = 'FDA_Form_1572_prefilled_102919-signed.pdf'

# create temporary fixed file to be accessed
pdf_link_temp = 'temp.pdf'
subprocess.run(['qpdf', '--decrypt', pdf_link, pdf_link_temp])

# access created temp file
pdf_data = PdfFileReader(open(pdf_link_temp, "rb"), strict=False)
fields = pdf_data.getFields()

field_db_signature = fields['db_signature']
field_db_signature_contents = fields['db_signature'].value['/Contents']
content_info = cms.ContentInfo.load(field_db_signature_contents)

i = 0
while i < 20:
    print(f'i = {i}')
    try:
        content_native = content_info.native
        break
    except Exception as e:
        print(f'Error: {e}')
    i += 1

fields_sig = fields['db_signature']
fields_sig_name = fields['db_signature'].value['/Name']
fields_sig_reason = fields['db_signature'].value['/Reason']
fields_sig_contents = fields['db_signature'].value['/Contents']

fields_sig_name evaluates to Joe Bloggs.

fields_sig_reason evaluates to I am the author of this document.

fields_sig_contents evaluates to:

b'0\x82\x05K\x06\t*\x86H\x86\xf7\r\x01\x07\x02\xa0\x82\x05<0\x82\x058\x02\x01\x011\x0f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000\x0b\x06\t*\x86H\x86\xf7\r\x01\x07\x01\xa0\x82\x03h0\x82\x03d0\x82\x02\xcd\xa0\x03\x02\x01\x02\x02\x10{\xe9\x88\x11!\x95\x1e\xa7Hd\xc6\x80\x84"\x9e\x070\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x000\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r\x01\t\x01\x1e\x1c\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s0\x1e\x17\r221109012105Z\x17\r271109062705Z0\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r\x01\t\x01\x1e\x1c\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xa5`\xe8&\xe2U\xa0#\xb4a\n\x0e\x02Fh\x05\xc7<O\xcc\x8a\xfbK\xbf\xf3!!2\xaf\x87\xf5+vn|^\xa9\xcd\xc8\x16\xd9\x04\x97\xc2\xe86\xbf\xc1\xf2\xee\xd3\x9d\xd50\x9fg\x9cy\xe6\xe6uk\x98\xc0Q7^\xb6+Ky\xde\xb6\xc5\x1f\xf2\x96hE\xc8\x0cE;\\\xca\x04*\x8d\xec\xb0\x038\x81\xc5~\xa7\x15\xc3T\xe4aRC.]z\xd3\x98m\xb3mC\xaa\xfb\xc9\x06\x17\xd2$\xeb\xcd"\xda\x90\x0c\xb3\xac\xdf\x02\x03\x01\x00\x01\xa3\x0f0\r0\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x04\x900\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x00\x03\x81\x81\x00\x19\x1d\x9cX\xb1XO\xf9\xad8\xc3\xa8\x8bp\x87M]d\xe1K&\x9a\xd3l\xcd\xda\xb9\xa7,\xd7"\xb5\x81\x1fO:%\x8bO\x9a\xcca;]\\}\xe5\x8d\xb9O\x14\n\x90\x80:\x92\xe7\x1a\xeal}\xae\x1bK\xd6I(\xfb\xbe\xf6)\xee\xedQ\x82h\xd5_f+\'~\'\xa3\xa7&s\x05\xa7-\xc1hC\x93\x8c\xe0{\xc8\x8a\x86]\x94\xf4\x00\xf4U\x00\x150\xd2\x8d\xe09:\x8d\xec\x8f\x11\xe9\xf3\xcb\xe7\na>\xac`Y1\x82\x01\xa70\x82\x01\xa3\x02\x01\x010\x81\xfc0\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r\x01\t\x01\x1e\x1c\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s\x02\x10{\xe9\x88\x11!\x95\x1e\xa7Hd\xc6\x80\x84"\x9e\x070\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x04\x81\x80\x94\xf4\xe5\xb6\x15f\x9d\xf2\xda\xc4\xdd\'\xc5\xadU\x0b2\xf3@\x15o\xf5,\xe2\xf2\xa2L\x89\xa0o\x83\xa9U#\x8e\xdcV\x9f\xaf\xbe\x8dyN\x14[{\xf6\xd2\xc1\xc442h\xe1W^\x04\xe3\xb8\x10I\xec9\x82l\xa3X\xef\x94t;P\'b\xfdd\xe0\xcb\x86\xbcp5\x96\xd5\xf2\x0bc\x19\x96N\x96\xe5\xc4\x84kh\xe3\xe5\xa2\x7f].~[~\x9cS\x0c\xe2\x0fX\xc0\xfa\x8e\x014\x05\x87\xb6}y\xe4\x8e\x7fY\xb3\x8fz\x0b\xea\xc3q\xceQ\x14\xf3\x8a\xc2\xedP\x1b<k#l\xf9Xv5=g\x90\xb35H\xf8\xba\xbb\x95\xac\xf7\x86\xe1\xa4\x12\xaeG\xcbf\'\xc0\xc050\xa2\xcd\xf4;\\iu\x9b\x05\xa2\x93\x84h\xa4(\xacZ\xc6\x18\xb7\x00z2\xcb\xad\xee?\x8c\x85\x97\x186{\x82\xdf\xc5\x8b\xe7\xcep\xbf\xa9Gh\x97uk5\x8a\xe3\xa1*\r\x874Cv\xd43\x02\xb2\xc6\xc0\x10O<l\xa7\xd5\x8e\xdb\x92\x99h\xcb\x85F\xab~\x92\xaaT\xaf%N\xb7\xd1\x97\x1c^\xb8v\xde\xcb0\xeab\x17 \x1e\xc8&S"\x07\x84\x02\xff\xc9`\x07,\x95 \x9c\xea\xbe:?]f\x13\xc3b\xbe-f\x16\xb3\xb2\xbb\x87.\xb6\x94\xd4\xd87GD\xc5\x8e\xe6\xf3\xae\xdd\xd9\xf6\x91\x0c\xb6H\xb7\x06h;\x97A\xe9\xd5`\xe9\xcb\x8dR\x9b\xc8\x14\xcb\x9b\xf60\xb4\x97\xf6\x86v]\xbe\xe5\xb9\xb2x\x90#\xb8;\x85\xf5e\x8f\xfe\xe2\xc2\x85\x1fl\x17"\x16\xb4\xc98\x95u\xf2\x1b\x03\xfd\xb4y\xacCE\xe3s\xcd\x9di\x1d\xe5\xec\x0b\x1e\x86( \xcf]MN3\xcc\xe6\xe2\xe6\x8c\xd5\xed\x94qJ\xf6x\xb4\xc1\xf1\xc3@\xebd\x87C\xf6\x86I\xc1\x9c\x94\xd1\xf0\x91\xc5\xe3\xfa\xec\xa1|\x8a\xe0\xb48\xe7=aC\xc2\xce6\x05\xca\'~m\xb0\x06b/\x13\xf2\x1d,FH\xd8\xf1\xd7\xe3\xb0\x93;\x12\xf0I\x88c\x7f\xbe7\xfd\xa4\xdd\xb7z\xe4\x02\xdf{\r\xcf\xd4+\xebv\xcf6\xa1{\x91\xcdb\x9c\x05l\xb9\x17\xb2Q\t\xed\xf9\x9a\xfb,\xb4\xc9 \xbd\xdb\xa2\xba\xcdQ\x99\x94\xd5J\x88^\xca\xa34C\xc2,\x9c\xf9\xd4j#u\x16/\x82\xd152V\x11\xd0z\xa6\x99!\xfd\xb1|d\x97\x06\x87$\xa1\xf6rs\x89x)X\xc4\xa2\xa8\xee\xa9_\xdd?2IN\x1d\x12\x10)f\xad\xf0\xff\xa8\xce-\x9a\xcbi\x9c\x10\xd9\xc0\xf4d\xc2\x86\xa4\x14\xd1J\x08\x05\x19\xeau\xb5\x14\xb8\x1f\xb6\x95\x06\x91B\xb7\xc9H8\xd0M.\xafRpd\xc7\x99\xb5\xfa,l\xb12\xc9N\xf0j3 \xc3[F7\x80\xaaL\x8ak\x87U\x0er=\x16\xac8\xf0m\xe9\xe5X\x97\x845\x1c\x9b\t!\x8a\xa7\xc8\xb2\nNO\x19\x8f\xf0\x15\x03\x01\xf1rE3\tV\xfb&x\xb8#\xea\x9e\xe7\xcb\xc2\x15\xed\x86\x9e\xc2L\x1f,\x15\xd9(\xefN\xfb\xaf\xb6\xf7l\x12\xbf\x8ffj\xf6\xcc\xbb\xff\x14>\xe1\x9dZ\x98\x9b\xbd\xb9-Ezt\xaa\x03\x9dD\xe1\xe4\xb0\xe6\xc6( !\xe4d\x0e&\r(z\xfb\xba [Rw\xb31\x88LJF\n\xe1\x8e\xb0\x16\xb4\xd2\x92\xf5\x08\x93e(2\x90\xc7\xe72\xea\xd7\xa0O\xf4#\xc8\xcc{\x91\xafr-\xc6\xd0\xd0\x12\xa28\xa1\x99{s\x8bf\x85\xf6{\xa3|1\x83\xbc\x0c\xaf\x08\xd9\x8c\x84\xecr\x8d\x83|\x81=\xfc\xc2pI?;[\xdc\x16p\xf4\x16\t[\x9e\xd1\x8b\xb0\xb0\xed\xfe]L\xb1<-E\x9d\xd9h\xbdg\xe2\rS\x81\xbfq\xba6\x1bSz\xf9pjZ\xb6\xa1\x84\xe2\xb3l\x16\x99H\xccx\x91\x93\xc4\xb8\xfc\x8e\xa2\xc2\x97o\xdb\x12R\x9e\xfbXj\xb8K`h\x05\xc3\xa46<\xe3Q\x9a\r\x8bz\x7f\xd3\xf1\xfcR\x90\x01?L\xa1r0\x1b\xc6\xf5\xf0PyU\xeb\x17\x14,\xe7\x12C@8\xbcR\xd9\xe4\t88Q\x83\x89h\x9a\x14\xf1\x9d\xa4\x05\x17\\\x13\xe7|\x18\x95N\x12s\x19\xa2x\xf0\xfe\xf1Y\x1c\x88Y\xd4\xe2\xc3>P\xf0D\xe0jI\x03[9R\x07\x83\x89\x08\xbd\xb9\xb3[0\x12>\x017\xe6\x9e\xb8E" !I(\xcb\xd3\x16\xc8\nhe4\x9dN_\x1e\xda|-\x84\xdd\xf2\xdfSVx$'

I believe the email is hidden inside this blob of encoded message. How can I decode it and retrieve the email?

1

There are 1 answers

7
K J On

"the email is hidden inside this blob of encoded message. How can I decode it and retrieve the email?"

Encoding pdf as python output is not efficient for reading or text parsing, TL;DR

b'0\x82\x05K\x06\t*\x86H\x86\xf7\r\x01\x07\x02\xa0\x82\x05<0\x82\x058\x02\x01\x011\x0f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000\x0b\x06\t*\x86H\x86\xf7\r\x01\x07\x01\xa0\x82\x03h0\x82\x03d0\x82\x02\xcd\xa0\x03\x02\x01\x02\x02\x10{\xe9\x88\x11!\x95\x1e\xa7Hd\xc6\x80\x84"\x9e\x070\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x000\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r
\x01\t\x01\x1e\x1c
Company Unit 1

\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m
[email protected]

1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14
AD Andorra

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

0\x1e\x17\r
22 11 09 01 21 05Z
\x17\r
27 11 09 06 27 05Z0
\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r\x01\t\x01\x1e\x1c

\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m
[email protected]

1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xa5`\xe8&\xe2U\xa0#\xb4a\n\x0e\x02Fh\x05\xc7<O\xcc\x8a\xfbK\xbf\xf3!!2\xaf\x87\xf5+vn|^\xa9\xcd\xc8\x16\xd9\x04\x97\xc2\xe86\xbf\xc1\xf2\xee\xd3\x9d\xd50\x9fg\x9cy\xe6\xe6uk\x98\xc0Q7^\xb6+Ky\xde\xb6\xc5\x1f\xf2\x96hE\xc8\x0cE;\\\xca\x04*\x8d\xec\xb0\x038\x81\xc5~\xa7\x15\xc3T\xe4aRC.]z\xd3\x98m\xb3mC\xaa\xfb\xc9\x06\x17\xd2$\xeb\xcd"\xda\x90\x0c\xb3\xac\xdf\x02\x03\x01\x00\x01\xa3\x0f0\r0\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x04\x900\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x00\x03\x81\x81\x00\x19\x1d\x9cX\xb1XO\xf9\xad8\xc3\xa8\x8bp\x87M]d\xe1K&\x9a\xd3l\xcd\xda\xb9\xa7,\xd7"\xb5\x81\x1fO:%\x8bO\x9a\xcca;]\\}\xe5\x8d\xb9O\x14\n\x90\x80:\x92\xe7\x1a\xeal}\xae\x1bK\xd6I(\xfb\xbe\xf6)\xee\xedQ\x82h\xd5_f+\'~\'\xa3\xa7&s\x05\xa7-\xc1hC\x93\x8c\xe0{\xc8\x8a\x86]\x94\xf4\x00\xf4U\x00\x150\xd2\x8d\xe09:\x8d\xec\x8f\x11\xe9\xf3\xcb\xe7\na>\xac`Y1\x82\x01\xa70\x82\x01\xa3\x02\x01\x010\x81\xfc0\x81\xe71\x1d0\x1b\x06\x03U\x04\x03\x1e\x14

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

1\x1d0\x1b\x06\x03U\x04\x07\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1%0#\x06\x03U\x04\n\x1e\x1c\x00R\x00a\x00n\x00d\x00o\x00m\x00 \x00C\x00o\x00m\x00p\x00a\x00n\x00y1\x150\x13\x06\x03U\x04\x0b\x1e\x0c\x00U\x00n\x00i\x00t\x00 \x0011+0)\x06\t*\x86H\x86\xf7\r\x01\t\x01\x1e\x1c

\x00j\x00o\x00e\x00@\x00b\x00l\x00o\x00g\x00g\x00s\x00.\x00c\x00o\x00m
[email protected]

1\x1d0\x1b\x06\x03U\x04\x06\x1e\x14\x00A\x00D\x00 \x00A\x00n\x00d\x00o\x00r\x00r\x00a1\x1d0\x1b\x06\x03U\x04*\x1e\x14

\x00J\x00o\x00e\x00 \x00B\x00l\x00o\x00g\x00g\x00s
Joe Bloggs

What you should be seeing is raw PDF syntax

BT
/TimesNewRoman 19.50 Tf
 21.59 TL
(Joe Bloggs) Tj
ET

...

BT
/TimesNewRoman 3.90 Tf
 4.32 TL
(Digitally signed by Joe Bloggs) Tj
(DN: cn=Joe Bloggs gn=Joe Bloggs c=AD Andorra l=AD Andorra o=Random Company ou=Unit 1 [email protected])'
(Reason: I am the author of this document)'
(Location: )'
(Date: 2022-11-09 08:22+07:00)'
ET

...

/Name(Joe Bloggs)/ByteRange[0 1262496 1267074 2704]/Reason(I am the author of this document)/M(D:20221109082202+07'00')>>
endobj

So offhand without looking closer its odd you have three email entries, while I see one, perhaps I did not search deep enough.

To see similar plain text output, use cross platform command

mutool clean -D -d -a FDA_Form.pdf textual.pdf

https://mupdf.com/docs/manual-mutool-clean.html