Remove TSA from benchmark, improve speed of placeholder generation, try to fix open files

This commit is contained in:
Jeroen Bobbeldijk
2017-09-30 14:32:38 +02:00
parent 679656fb8d
commit d333ee9650
2 changed files with 51 additions and 41 deletions

View File

@@ -2,6 +2,7 @@ package sign
import ( import (
"bytes" "bytes"
"crypto/x509"
"encoding/asn1" "encoding/asn1"
"encoding/hex" "encoding/hex"
"errors" "errors"
@@ -9,9 +10,7 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"crypto/x509"
"github.com/digitorus/pkcs7" "github.com/digitorus/pkcs7"
"github.com/digitorus/timestamp" "github.com/digitorus/timestamp"
) )
@@ -30,60 +29,69 @@ type TSAResponse struct {
var signatureByteRangePlaceholder = "/ByteRange[0 ********** ********** **********]" var signatureByteRangePlaceholder = "/ByteRange[0 ********** ********** **********]"
func (context *SignContext) createSignaturePlaceholder() (signature string, byte_range_start_byte int64, signature_contents_start_byte int64) { func (context *SignContext) createSignaturePlaceholder() (dssd string, byte_range_start_byte int64, signature_contents_start_byte int64) {
signature = strconv.Itoa(int(context.SignData.ObjectId)) + " 0 obj\n" // Using a buffer because it's way faster than concatenating.
signature += "<< /Type /Sig" var signature_buffer bytes.Buffer
signature += " /Filter /Adobe.PPKLite" signature_buffer.WriteString(strconv.Itoa(int(context.SignData.ObjectId)) + " 0 obj\n")
signature += " /SubFilter /adbe.pkcs7.detached" signature_buffer.WriteString("<< /Type /Sig")
signature_buffer.WriteString(" /Filter /Adobe.PPKLite")
signature_buffer.WriteString(" /SubFilter /adbe.pkcs7.detached")
byte_range_start_byte = int64(len(signature)) + 1 byte_range_start_byte = int64(signature_buffer.Len()) + 1
// Create a placeholder for the byte range string, we will replace it later. // Create a placeholder for the byte range string, we will replace it later.
signature += " " + signatureByteRangePlaceholder signature_buffer.WriteString(" " + signatureByteRangePlaceholder)
signature_contents_start_byte = int64(len(signature)) + 11 signature_contents_start_byte = int64(signature_buffer.Len()) + 11
// Create a placeholder for the actual signature content, we wil replace it later. // Create a placeholder for the actual signature content, we wil replace it later.
signature += " /Contents<" + strings.Repeat("0", int(context.SignatureMaxLength)) + ">" signature_buffer.WriteString(" /Contents<")
signature_buffer.Write(bytes.Repeat([]byte("0"), int(context.SignatureMaxLength)))
signature_buffer.WriteString(">")
if !context.SignData.Signature.Approval { if !context.SignData.Signature.Approval {
signature += " /Reference [" // array of signature reference dictionaries signature_buffer.WriteString(" /Reference [") // array of signature reference dictionaries
signature += " << /Type /SigRef" signature_buffer.WriteString(" << /Type /SigRef")
if context.SignData.Signature.CertType > 0 { if context.SignData.Signature.CertType > 0 {
signature += " /TransformMethod /DocMDP" signature_buffer.WriteString(" /TransformMethod /DocMDP")
signature += " /TransformParams <<" signature_buffer.WriteString(" /TransformParams <<")
signature += " /Type /TransformParams" signature_buffer.WriteString(" /Type /TransformParams")
signature += " /P " + strconv.Itoa(int(context.SignData.Signature.CertType)) signature_buffer.WriteString(" /P " + strconv.Itoa(int(context.SignData.Signature.CertType)))
signature += " /V /1.2" signature_buffer.WriteString(" /V /1.2")
} else { } else {
signature += " /TransformMethod /UR3" signature_buffer.WriteString(" /TransformMethod /UR3")
signature += " /TransformParams <<" signature_buffer.WriteString(" /TransformParams <<")
signature += " /Type /TransformParams" signature_buffer.WriteString(" /Type /TransformParams")
signature += " /V /2.2" signature_buffer.WriteString(" /V /2.2")
} }
signature += " >>" // close TransformParams signature_buffer.WriteString(" >>") // close TransformParams
signature += " >>" signature_buffer.WriteString(" >>")
signature += " ]" // end of reference signature_buffer.WriteString(" ]") // end of reference
} }
if context.SignData.Signature.Info.Name != "" { if context.SignData.Signature.Info.Name != "" {
signature += " /Name " + pdfString(context.SignData.Signature.Info.Name) signature_buffer.WriteString(" /Name ")
signature_buffer.WriteString(pdfString(context.SignData.Signature.Info.Name))
} }
if context.SignData.Signature.Info.Location != "" { if context.SignData.Signature.Info.Location != "" {
signature += " /Location " + pdfString(context.SignData.Signature.Info.Location) signature_buffer.WriteString(" /Location ")
signature_buffer.WriteString(pdfString(context.SignData.Signature.Info.Location))
} }
if context.SignData.Signature.Info.Reason != "" { if context.SignData.Signature.Info.Reason != "" {
signature += " /Reason " + pdfString(context.SignData.Signature.Info.Reason) signature_buffer.WriteString(" /Reason ")
signature_buffer.WriteString(pdfString(context.SignData.Signature.Info.Reason))
} }
if context.SignData.Signature.Info.ContactInfo != "" { if context.SignData.Signature.Info.ContactInfo != "" {
signature += " /ContactInfo " + pdfString(context.SignData.Signature.Info.ContactInfo) signature_buffer.WriteString(" /ContactInfo ")
signature_buffer.WriteString(pdfString(context.SignData.Signature.Info.ContactInfo))
} }
signature += " /M " + pdfDateTime(context.SignData.Signature.Info.Date) signature_buffer.WriteString(" /M ")
signature += " >>" signature_buffer.WriteString(pdfDateTime(context.SignData.Signature.Info.Date))
signature += "\nendobj\n" signature_buffer.WriteString(" >>")
signature_buffer.WriteString("\nendobj\n")
return signature, byte_range_start_byte, signature_contents_start_byte return signature_buffer.String(), byte_range_start_byte, signature_contents_start_byte
} }
func (context *SignContext) fetchRevocationData() error { func (context *SignContext) fetchRevocationData() error {

View File

@@ -62,7 +62,7 @@ func TestReaderCanReadPDF(t *testing.T) {
for _, f := range files { for _, f := range files {
ext := filepath.Ext(f.Name()) ext := filepath.Ext(f.Name())
if ext != ".pdf" { if ext != ".pdf" {
fmt.Printf("Skipping file %s", f.Name()) fmt.Printf("Skipping file %s\n", f.Name())
continue continue
} }
@@ -138,13 +138,13 @@ func TestSignPDF(t *testing.T) {
t.Errorf("%s: %s", f.Name(), err.Error()) t.Errorf("%s: %s", f.Name(), err.Error())
return return
} }
defer input_file.Close()
var buffer bytes.Buffer var buffer bytes.Buffer
output_file := bufio.NewWriter(&buffer) output_file := bufio.NewWriter(&buffer)
finfo, err := input_file.Stat() finfo, err := input_file.Stat()
if err != nil { if err != nil {
input_file.Close()
t.Errorf("%s: %s", f.Name(), err.Error()) t.Errorf("%s: %s", f.Name(), err.Error())
return return
} }
@@ -152,6 +152,7 @@ func TestSignPDF(t *testing.T) {
rdr, err := pdf.NewReader(input_file, size) rdr, err := pdf.NewReader(input_file, size)
if err != nil { if err != nil {
input_file.Close()
t.Errorf("%s: %s", f.Name(), err.Error()) t.Errorf("%s: %s", f.Name(), err.Error())
return return
} }
@@ -178,6 +179,8 @@ func TestSignPDF(t *testing.T) {
RevocationFunction: DefaultEmbedRevocationStatusFunction, RevocationFunction: DefaultEmbedRevocationStatusFunction,
}) })
input_file.Close()
if err != nil { if err != nil {
t.Errorf("%s: %s", f.Name(), err.Error()) t.Errorf("%s: %s", f.Name(), err.Error())
return return
@@ -218,13 +221,13 @@ func BenchmarkSignPDF(b *testing.B) {
b.Errorf("%s: %s", "testfile20.pdf", err.Error()) b.Errorf("%s: %s", "testfile20.pdf", err.Error())
return return
} }
defer input_file.Close()
var buffer bytes.Buffer var buffer bytes.Buffer
output_file := bufio.NewWriter(&buffer) output_file := bufio.NewWriter(&buffer)
finfo, err := input_file.Stat() finfo, err := input_file.Stat()
if err != nil { if err != nil {
input_file.Close()
b.Errorf("%s: %s", "testfile20.pdf", err.Error()) b.Errorf("%s: %s", "testfile20.pdf", err.Error())
return return
} }
@@ -232,6 +235,7 @@ func BenchmarkSignPDF(b *testing.B) {
rdr, err := pdf.NewReader(input_file, size) rdr, err := pdf.NewReader(input_file, size)
if err != nil { if err != nil {
input_file.Close()
b.Errorf("%s: %s", "testfile20.pdf", err.Error()) b.Errorf("%s: %s", "testfile20.pdf", err.Error())
return return
} }
@@ -251,13 +255,11 @@ func BenchmarkSignPDF(b *testing.B) {
Signer: pkey, Signer: pkey,
Certificate: cert, Certificate: cert,
CertificateChains: certificate_chains, CertificateChains: certificate_chains,
TSA: TSA{ RevocationData: revocation.InfoArchival{},
URL: "http://aatl-timestamp.globalsign.com/tsa/aohfewat2389535fnasgnlg5m23",
},
RevocationData: revocation.InfoArchival{},
RevocationFunction: DefaultEmbedRevocationStatusFunction,
}) })
input_file.Close()
if err != nil { if err != nil {
b.Errorf("%s: %s", "testfile20.pdf", err.Error()) b.Errorf("%s: %s", "testfile20.pdf", err.Error())
return return