diff options
author | Paul Gardiner <paulg.artifex@glidos.net> | 2013-08-22 15:08:07 +0100 |
---|---|---|
committer | Paul Gardiner <paulg.artifex@glidos.net> | 2013-08-27 09:53:40 +0100 |
commit | cf3ba3e213ce17bee76fa2fe02b43d5d3cc60732 (patch) | |
tree | 575a0d50668ed45db02be2b7063b7186dae101d6 | |
parent | ae69f90ec82a8f19557c385c1bb25a3fb4fd5ae3 (diff) | |
download | mupdf-cf3ba3e213ce17bee76fa2fe02b43d5d3cc60732.tar.xz |
A few updates to signing support
-rw-r--r-- | include/mupdf/pdf/crypt.h | 4 | ||||
-rw-r--r-- | source/pdf/pdf-pkcs7.c | 36 | ||||
-rw-r--r-- | source/pdf/pdf-write.c | 9 |
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); + } } } |