diff --git a/.gitignore b/.gitignore index 44eba8a..6061d94 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .idea *.pdf *.pdf.* -!benchmark.pdf \ No newline at end of file +!testfile*.pdf \ No newline at end of file diff --git a/sign/helpers_test.go b/sign/helpers_test.go index 1ede392..a8fc4b9 100644 --- a/sign/helpers_test.go +++ b/sign/helpers_test.go @@ -118,7 +118,7 @@ func TestWritePartFromSourceFileToTargetFile(t *testing.T) { var b bytes.Buffer writer := bufio.NewWriter(&b) - input_file, err := os.Open("../testfiles/benchmark.pdf") + input_file, err := os.Open("../testfiles/testfile20.pdf") if err != nil { t.Errorf("Failed to load test PDF") return @@ -162,7 +162,7 @@ func TestWritePartFromSourceFileToTargetFile(t *testing.T) { } func loadHelpersTestPDF() (*os.File, *pdf.Reader) { - input_file, err := os.Open("../testfiles/benchmark.pdf") + input_file, err := os.Open("../testfiles/testfile20.pdf") if err != nil { return nil, nil } diff --git a/sign/pdfcatalog_test.go b/sign/pdfcatalog_test.go new file mode 100644 index 0000000..2886ffe --- /dev/null +++ b/sign/pdfcatalog_test.go @@ -0,0 +1,56 @@ +package sign + +import ( + "os" + "testing" + + "bitbucket.org/digitorus/pdf" +) + +func TestCreateCatalog(t *testing.T) { + input_file, err := os.Open("../testfiles/testfile20.pdf") + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + finfo, err := input_file.Stat() + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + size := finfo.Size() + + rdr, err := pdf.NewReader(input_file, size) + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + context := SignContext{ + Filesize: size + 1, + PDFReader: rdr, + InputFile: input_file, + VisualSignData: VisualSignData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount), + }, + CatalogData: CatalogData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 1, + }, + InfoData: InfoData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 2, + }, + } + + catalog, err := context.createCatalog() + if err != nil { + t.Errorf("%s", err.Error()) + return + } + + expected_catalog := "11 0 obj\n<< /Type /Catalog /Version /2.0 /Pages 3 0 R /AcroForm << /Fields [10 0 R] /NeedAppearances false /SigFlags 1 >> /Perms << /UR3 0 0 R >> >>\nendobj\n" + + if catalog != expected_catalog { + t.Errorf("Catalog mismatch, expected %s, but got %s", expected_catalog, catalog) + } +} diff --git a/sign/pdfinfo_test.go b/sign/pdfinfo_test.go new file mode 100644 index 0000000..f7b71c0 --- /dev/null +++ b/sign/pdfinfo_test.go @@ -0,0 +1,138 @@ +package sign + +import ( + "os" + "testing" + + "bitbucket.org/digitorus/pdf" + "time" +) + +func TestCreateInfoEmpty(t *testing.T) { + input_file, err := os.Open("../testfiles/testfile20.pdf") + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + finfo, err := input_file.Stat() + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + size := finfo.Size() + + rdr, err := pdf.NewReader(input_file, size) + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + sign_data := SignData{ + Signature: SignDataSignature{ + Info: SignDataSignatureInfo{ + Name: "Jeroen Bobbeldijk", + Location: "Rotterdam", + Reason: "Test", + ContactInfo: "Geen", + Date: time.Now().Local(), + }, + CertType: 2, + Approval: false, + }, + } + + sign_data.ObjectId = uint32(rdr.XrefInformation.ItemCount) + 3 + + context := SignContext{ + Filesize: size + 1, + PDFReader: rdr, + InputFile: input_file, + VisualSignData: VisualSignData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount), + }, + CatalogData: CatalogData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 1, + }, + InfoData: InfoData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 2, + }, + SignData: sign_data, + } + + info, err := context.createInfo() + if err != nil { + t.Errorf("%s", err.Error()) + return + } + + expected_info := "12 0 obj\n<<>>\nendobj\n" + if info != expected_info { + t.Errorf("Info mismatch, expected %s, but got %s", expected_info, info) + } +} + +func TestCreateInfo(t *testing.T) { + input_file, err := os.Open("../testfiles/testfile12.pdf") + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + finfo, err := input_file.Stat() + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + size := finfo.Size() + + rdr, err := pdf.NewReader(input_file, size) + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + sign_data := SignData{ + Signature: SignDataSignature{ + Info: SignDataSignatureInfo{ + Name: "Jeroen Bobbeldijk", + Location: "Rotterdam", + Reason: "Test", + ContactInfo: "Geen", + Date: time.Now().Local(), + }, + CertType: 2, + Approval: false, + }, + } + + sign_data.ObjectId = uint32(rdr.XrefInformation.ItemCount) + 3 + + context := SignContext{ + Filesize: size + 1, + PDFReader: rdr, + InputFile: input_file, + VisualSignData: VisualSignData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount), + }, + CatalogData: CatalogData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 1, + }, + InfoData: InfoData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 2, + }, + SignData: sign_data, + } + + info, err := context.createInfo() + if err != nil { + t.Errorf("%s", err.Error()) + return + } + + expected_info := "18 0 obj\n<>\nendobj\n" + + if info != expected_info { + t.Errorf("Info mismatch, expected %s, but got %s", expected_info, info) + } +} diff --git a/sign/pdfsignature_test.go b/sign/pdfsignature_test.go new file mode 100644 index 0000000..ba639e2 --- /dev/null +++ b/sign/pdfsignature_test.go @@ -0,0 +1,81 @@ +package sign + +import ( + "os" + "testing" + "time" + + "bitbucket.org/digitorus/pdf" +) + +func TestCreateSignature(t *testing.T) { + input_file, err := os.Open("../testfiles/testfile20.pdf") + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + finfo, err := input_file.Stat() + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + size := finfo.Size() + + rdr, err := pdf.NewReader(input_file, size) + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + timezone, _ := time.LoadLocation("Europe/Tallinn") + now := time.Date(2017, 9, 23, 14, 39, 0, 0, timezone) + + sign_data := SignData{ + Signature: SignDataSignature{ + Info: SignDataSignatureInfo{ + Name: "Jeroen Bobbeldijk", + Location: "Rotterdam", + Reason: "Test", + ContactInfo: "Geen", + Date: now, + }, + CertType: 2, + Approval: false, + }, + } + + sign_data.ObjectId = uint32(rdr.XrefInformation.ItemCount) + 3 + + context := SignContext{ + Filesize: size + 1, + PDFReader: rdr, + InputFile: input_file, + VisualSignData: VisualSignData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount), + }, + CatalogData: CatalogData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 1, + }, + InfoData: InfoData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 2, + }, + SignData: sign_data, + } + + expected_signature := "13 0 obj\n<< /Type /Sig /Filter /Adobe.PPKLite /SubFilter /adbe.pkcs7.detached /ByteRange[0 ********** ********** **********] /Contents<> /Reference [ << /Type /SigRef /TransformMethod /DocMDP /TransformParams << /Type /TransformParams /P 2 /V /1.2 >> >> ] /Name (Jeroen Bobbeldijk) /Location (Rotterdam) /Reason (Test) /ContactInfo (Geen) /M (D:20170923143900+03'00') >>\nendobj\n" + + signature, byte_range_start_byte, signature_contents_start_byte := context.createSignaturePlaceholder() + + if signature != expected_signature { + t.Errorf("Signature mismatch, expected %s, but got %s", expected_signature, signature) + } + + if byte_range_start_byte != 78 { + t.Errorf("Byte range start mismatch, expected %d, but got %d", 78, byte_range_start_byte) + } + + if signature_contents_start_byte != 135 { + t.Errorf("Signature contents start byte mismatch, expected %d, but got %d", 135, signature_contents_start_byte) + } +} diff --git a/sign/pdfvisualsignature_test.go b/sign/pdfvisualsignature_test.go new file mode 100644 index 0000000..bca6507 --- /dev/null +++ b/sign/pdfvisualsignature_test.go @@ -0,0 +1,77 @@ +package sign + +import ( + "os" + "testing" + "time" + + "bitbucket.org/digitorus/pdf" +) + +func TestVisualSignature(t *testing.T) { + input_file, err := os.Open("../testfiles/testfile20.pdf") + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + finfo, err := input_file.Stat() + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + size := finfo.Size() + + rdr, err := pdf.NewReader(input_file, size) + if err != nil { + t.Errorf("Failed to load test PDF") + return + } + + timezone, _ := time.LoadLocation("Europe/Tallinn") + now := time.Date(2017, 9, 23, 14, 39, 0, 0, timezone) + + sign_data := SignData{ + Signature: SignDataSignature{ + Info: SignDataSignatureInfo{ + Name: "Jeroen Bobbeldijk", + Location: "Rotterdam", + Reason: "Test", + ContactInfo: "Geen", + Date: now, + }, + CertType: 2, + Approval: false, + }, + } + + sign_data.ObjectId = uint32(rdr.XrefInformation.ItemCount) + 3 + + context := SignContext{ + Filesize: size + 1, + PDFReader: rdr, + InputFile: input_file, + VisualSignData: VisualSignData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount), + }, + CatalogData: CatalogData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 1, + }, + InfoData: InfoData{ + ObjectId: uint32(rdr.XrefInformation.ItemCount) + 2, + }, + SignData: sign_data, + } + + expected_visual_signature := "10 0 obj\n<< /Type /Annot /Subtype /Widget /Rect [0 0 0 0] /P 4 0 R /F 132 /FT /Sig /T (Signature) /Ff 0 /V 13 0 R >>\nendobj\n" + + visual_signature, err := context.createVisualSignature() + if err != nil { + t.Errorf("%s", err.Error()) + return + } + + if visual_signature != expected_visual_signature { + t.Errorf("Visual signature mismatch, expected %s, but got %s", expected_visual_signature, visual_signature) + } +} diff --git a/sign/sign_test.go b/sign/sign_test.go index 12c8265..a6c0f2f 100644 --- a/sign/sign_test.go +++ b/sign/sign_test.go @@ -191,7 +191,7 @@ func BenchmarkSignPDF(b *testing.B) { certificate_chains := make([][]*x509.Certificate, 0) for n := 0; n < b.N; n++ { - err := SignFile("../testfiles/benchmark.pdf", "../testfiles/benchmark.pdf.tmp", SignData{ + err := SignFile("../testfiles/testfile20.pdf", "../testfiles/testfile20.pdf.tmp", SignData{ Signature: SignDataSignature{ Info: SignDataSignatureInfo{ Name: "Jeroen Bobbeldijk", @@ -213,10 +213,10 @@ func BenchmarkSignPDF(b *testing.B) { RevocationFunction: DefaultEmbedRevocationStatusFunction, }) - os.Remove("../testfiles/benchmark.pdf.tmp") + os.Remove("../testfiles/testfile20.pdf.tmp") if err != nil { - b.Errorf("%s: %s", "benchmark.pdf", err.Error()) + b.Errorf("%s: %s", "testfile20.pdf", err.Error()) return } } diff --git a/testfiles/testfile12.pdf b/testfiles/testfile12.pdf new file mode 100644 index 0000000..77a7d3c Binary files /dev/null and b/testfiles/testfile12.pdf differ diff --git a/testfiles/benchmark.pdf b/testfiles/testfile20.pdf similarity index 100% rename from testfiles/benchmark.pdf rename to testfiles/testfile20.pdf