summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2013-08-22 15:08:07 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2013-08-27 09:53:40 +0100
commitcf3ba3e213ce17bee76fa2fe02b43d5d3cc60732 (patch)
tree575a0d50668ed45db02be2b7063b7186dae101d6
parentae69f90ec82a8f19557c385c1bb25a3fb4fd5ae3 (diff)
downloadmupdf-cf3ba3e213ce17bee76fa2fe02b43d5d3cc60732.tar.xz
A few updates to signing support
-rw-r--r--include/mupdf/pdf/crypt.h4
-rw-r--r--source/pdf/pdf-pkcs7.c36
-rw-r--r--source/pdf/pdf-write.c9
3 files changed, 42 insertions, 7 deletions
diff --git a/include/mupdf/pdf/crypt.h b/include/mupdf/pdf/crypt.h
index 0e692941..9e3c4c94 100644
--- a/include/mupdf/pdf/crypt.h
+++ b/include/mupdf/pdf/crypt.h
@@ -36,7 +36,7 @@ pdf_designated_name;
void pdf_free_designated_name(pdf_designated_name *dn);
-pdf_signer *pdf_read_pfx(fz_context *ctx, char *sigfile, char *password);
+pdf_signer *pdf_read_pfx(fz_context *ctx, const char *sigfile, const char *password);
pdf_signer *pdf_keep_signer(pdf_signer *signer);
void pdf_drop_signer(pdf_signer *signer);
pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer);
@@ -60,6 +60,6 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
/*
pdf_sign_signature: sign a signature form field
*/
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, char *sigfile, char *password);
+void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password);
#endif
diff --git a/source/pdf/pdf-pkcs7.c b/source/pdf/pdf-pkcs7.c
index 23e8af84..fda85693 100644
--- a/source/pdf/pdf-pkcs7.c
+++ b/source/pdf/pdf-pkcs7.c
@@ -364,9 +364,9 @@ void pdf_free_designated_name(pdf_designated_name *dn)
}
-static void add_from_bags(X509 **pX509, EVP_PKEY **pPkey, STACK_OF(PKCS12_SAFEBAG) *bags, char *pw);
+static void add_from_bags(X509 **pX509, EVP_PKEY **pPkey, STACK_OF(PKCS12_SAFEBAG) *bags, const char *pw);
-static void add_from_bag(X509 **pX509, EVP_PKEY **pPkey, PKCS12_SAFEBAG *bag, char *pw)
+static void add_from_bag(X509 **pX509, EVP_PKEY **pPkey, PKCS12_SAFEBAG *bag, const char *pw)
{
EVP_PKEY *pkey = NULL;
X509 *x509 = NULL;
@@ -414,7 +414,7 @@ static void add_from_bag(X509 **pX509, EVP_PKEY **pPkey, PKCS12_SAFEBAG *bag, ch
}
}
-static void add_from_bags(X509 **pX509, EVP_PKEY **pPkey, STACK_OF(PKCS12_SAFEBAG) *bags, char *pw)
+static void add_from_bags(X509 **pX509, EVP_PKEY **pPkey, STACK_OF(PKCS12_SAFEBAG) *bags, const char *pw)
{
int i;
@@ -422,7 +422,7 @@ static void add_from_bags(X509 **pX509, EVP_PKEY **pPkey, STACK_OF(PKCS12_SAFEBA
add_from_bag(pX509, pPkey, sk_PKCS12_SAFEBAG_value(bags, i), pw);
}
-pdf_signer *pdf_read_pfx(fz_context *ctx, char *pfile, char *pw)
+pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw)
{
BIO *pfxbio = NULL;
PKCS12 *p12 = NULL;
@@ -679,6 +679,18 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
char *contents = NULL;
int contents_len;
int res = 0;
+ pdf_unsaved_sig *usig;
+
+ for (usig = doc->unsaved_sigs; usig; usig = usig->next)
+ {
+ if (usig->field == ((pdf_annot *)widget)->obj)
+ {
+ fz_strlcpy(ebuf, "Signed but document yet to be saved", ebufsize);
+ if (ebufsize > 0)
+ ebuf[ebufsize-1] = 0;
+ return 0;
+ }
+ }
fz_var(byte_range);
fz_var(res);
@@ -719,7 +731,7 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
return res;
}
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, char *sigfile, char *password)
+void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
{
fz_context *ctx = doc->ctx;
pdf_signer *signer = pdf_read_pfx(ctx, sigfile, password);
@@ -766,6 +778,11 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, char *sigfile, ch
}
}
+int pdf_signatures_supported(void)
+{
+ return 1;
+}
+
#else /* HAVE_OPENSSL */
int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
@@ -774,6 +791,10 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
return 0;
}
+void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
+{
+}
+
pdf_signer *pdf_keep_signer(pdf_signer *signer)
{
return NULL;
@@ -787,4 +808,9 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
{
}
+int pdf_signatures_supported(void)
+{
+ return 0;
+}
+
#endif /* HAVE_OPENSSL */
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index de2dc810..cfd14715 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -2506,6 +2506,15 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
/* Write the digests into the file */
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
pdf_write_digest(doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer);
+
+ /* delete the unsaved_sigs records */
+ while ((usig = doc->unsaved_sigs) != NULL)
+ {
+ doc->unsaved_sigs = usig->next;
+ pdf_drop_obj(usig->field);
+ pdf_drop_signer(usig->signer);
+ fz_free(ctx, usig);
+ }
}
}