Remove TSA from benchmark, improve speed of placeholder generation, try to fix open files
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user