hexapdf 0.19.2 → 0.20.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +67 -0
- data/data/hexapdf/cert/demo_cert.rb +22 -0
- data/data/hexapdf/cert/root-ca.crt +119 -0
- data/data/hexapdf/cert/signing.crt +125 -0
- data/data/hexapdf/cert/signing.key +52 -0
- data/data/hexapdf/cert/sub-ca.crt +125 -0
- data/data/hexapdf/encoding/glyphlist.txt +4283 -4282
- data/data/hexapdf/encoding/zapfdingbats.txt +203 -202
- data/lib/hexapdf/cli/info.rb +21 -1
- data/lib/hexapdf/configuration.rb +26 -0
- data/lib/hexapdf/content/processor.rb +1 -1
- data/lib/hexapdf/document/signatures.rb +327 -0
- data/lib/hexapdf/document.rb +26 -0
- data/lib/hexapdf/font/encoding/glyph_list.rb +5 -6
- data/lib/hexapdf/importer.rb +1 -1
- data/lib/hexapdf/object.rb +5 -3
- data/lib/hexapdf/parser.rb +14 -9
- data/lib/hexapdf/rectangle.rb +0 -6
- data/lib/hexapdf/revision.rb +13 -6
- data/lib/hexapdf/task/dereference.rb +12 -4
- data/lib/hexapdf/task/optimize.rb +3 -3
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +2 -4
- data/lib/hexapdf/type/acro_form/field.rb +2 -0
- data/lib/hexapdf/type/acro_form/form.rb +9 -1
- data/lib/hexapdf/type/annotation.rb +36 -3
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/object_stream.rb +3 -1
- data/lib/hexapdf/type/signature/adbe_pkcs7_detached.rb +121 -0
- data/lib/hexapdf/type/signature/adbe_x509_rsa_sha1.rb +95 -0
- data/lib/hexapdf/type/signature/handler.rb +140 -0
- data/lib/hexapdf/type/signature/verification_result.rb +92 -0
- data/lib/hexapdf/type/signature.rb +236 -0
- data/lib/hexapdf/type.rb +1 -0
- data/lib/hexapdf/version.rb +1 -1
- data/lib/hexapdf/writer.rb +16 -8
- data/test/hexapdf/content/test_processor.rb +1 -1
- data/test/hexapdf/document/test_signatures.rb +225 -0
- data/test/hexapdf/task/test_optimize.rb +4 -1
- data/test/hexapdf/test_document.rb +28 -0
- data/test/hexapdf/test_object.rb +7 -2
- data/test/hexapdf/test_parser.rb +12 -0
- data/test/hexapdf/test_rectangle.rb +0 -7
- data/test/hexapdf/test_revision.rb +44 -14
- data/test/hexapdf/test_writer.rb +4 -3
- data/test/hexapdf/type/acro_form/test_field.rb +11 -1
- data/test/hexapdf/type/acro_form/test_form.rb +5 -0
- data/test/hexapdf/type/signature/common.rb +71 -0
- data/test/hexapdf/type/signature/test_adbe_pkcs7_detached.rb +99 -0
- data/test/hexapdf/type/signature/test_adbe_x509_rsa_sha1.rb +66 -0
- data/test/hexapdf/type/signature/test_handler.rb +102 -0
- data/test/hexapdf/type/signature/test_verification_result.rb +47 -0
- data/test/hexapdf/type/test_annotation.rb +40 -2
- data/test/hexapdf/type/test_font_simple.rb +5 -5
- data/test/hexapdf/type/test_object_stream.rb +9 -0
- data/test/hexapdf/type/test_signature.rb +131 -0
- metadata +21 -3
@@ -0,0 +1,131 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'hexapdf/document'
|
5
|
+
require 'hexapdf/type/signature'
|
6
|
+
require_relative 'signature/common'
|
7
|
+
require 'stringio'
|
8
|
+
|
9
|
+
describe HexaPDF::Type::Signature::TransformParams do
|
10
|
+
before do
|
11
|
+
@doc = HexaPDF::Document.new
|
12
|
+
@params = @doc.add({Type: :TransformParams})
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "validation" do
|
16
|
+
it "checks the /Annots field for valid values" do
|
17
|
+
@params[:Annots] = [:Create, :Other, :Delete, :Other, :New]
|
18
|
+
refute(@params.validate(auto_correct: false))
|
19
|
+
@params.validate
|
20
|
+
assert_equal([:Create, :Delete], @params[:Annots].value)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "checks the /Form field for valid values" do
|
24
|
+
@params[:Form] = [:Add, :Other, :Delete, :Other, :New]
|
25
|
+
refute(@params.validate(auto_correct: false))
|
26
|
+
@params.validate
|
27
|
+
assert_equal([:Add, :Delete], @params[:Form].value)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "checks the /EF field for valid values" do
|
31
|
+
@params[:EF] = [:Create, :Other, :Delete, :Other, :New]
|
32
|
+
refute(@params.validate(auto_correct: false))
|
33
|
+
@params.validate
|
34
|
+
assert_equal([:Create, :Delete], @params[:EF].value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe HexaPDF::Type::Signature::SignatureReference do
|
40
|
+
before do
|
41
|
+
@doc = HexaPDF::Document.new
|
42
|
+
@sigref = @doc.add({Type: :SigRef})
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "validation" do
|
46
|
+
it "checks the existence of the /Data field for FieldMDP transforms" do
|
47
|
+
@sigref[:TransformMethod] = :FieldMDP
|
48
|
+
refute(@sigref.validate)
|
49
|
+
@sigref[:Data] = HexaPDF::Object.new('data', oid: 1)
|
50
|
+
assert(@sigref.validate)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe HexaPDF::Type::Signature do
|
56
|
+
before do
|
57
|
+
@doc = HexaPDF::Document.new
|
58
|
+
@sig = @doc.add({Type: :Sig, Filter: :'Adobe.PPKLite', SubFilter: :'ETSI.CAdES.detached'})
|
59
|
+
|
60
|
+
@pdf_data = 'Some data'
|
61
|
+
@pkcs7 = OpenSSL::PKCS7.sign(CERTIFICATES.signer_certificate, CERTIFICATES.signer_key,
|
62
|
+
@pdf_data, [CERTIFICATES.ca_certificate],
|
63
|
+
OpenSSL::PKCS7::DETACHED)
|
64
|
+
@sig[:Contents] = @pkcs7.to_der
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns the signer name" do
|
68
|
+
assert_equal('signer', @sig.signer_name)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns the signing time" do
|
72
|
+
assert_equal(@sig.signature_handler.signing_time, @sig.signing_time)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns the signing reason" do
|
76
|
+
@sig[:Reason] = 'reason'
|
77
|
+
assert_equal('reason', @sig.signing_reason)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "returns the signing location" do
|
81
|
+
@sig[:Location] = 'location'
|
82
|
+
assert_equal('location', @sig.signing_location)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "returns the signature type" do
|
86
|
+
assert_equal('ETSI.CAdES.detached', @sig.signature_type)
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "signature_handler" do
|
90
|
+
it "returns the signature handler" do
|
91
|
+
assert_kind_of(HexaPDF::Type::Signature::Handler, @sig.signature_handler)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "fails if the required handler is not available" do
|
95
|
+
@sig[:SubFilter] = :Unknown
|
96
|
+
assert_raises(HexaPDF::Error) { @sig.signature_handler }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "returns the signature contents" do
|
101
|
+
@sig[:Contents] = 'hallo'
|
102
|
+
assert_equal('hallo', @sig.contents)
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "signed_data" do
|
106
|
+
it "reads the specified portions of the document" do
|
107
|
+
io = StringIO.new(MINIMAL_PDF)
|
108
|
+
doc = HexaPDF::Document.new(io: io)
|
109
|
+
@sig.document = doc
|
110
|
+
@sig[:ByteRange] = [0, 400, 500, 333]
|
111
|
+
assert_equal((MINIMAL_PDF[0, 400] << MINIMAL_PDF[500, 333]).b, @sig.signed_data)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "fails if the document isn't associated with an existing PDF file" do
|
115
|
+
assert_raises(HexaPDF::Error) { @sig.signed_data }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it "invokes the signature handler for verification" do
|
120
|
+
handler = Object.new
|
121
|
+
store, kwargs = nil
|
122
|
+
handler.define_singleton_method(:verify) do |in_store, in_kwargs|
|
123
|
+
store, kwargs = in_store, in_kwargs
|
124
|
+
:result
|
125
|
+
end
|
126
|
+
@sig.define_singleton_method(:signature_handler) { handler }
|
127
|
+
assert_equal(:result, @sig.verify(allow_self_signed: true))
|
128
|
+
assert_kind_of(OpenSSL::X509::Store, store)
|
129
|
+
assert(kwargs[:allow_self_signed])
|
130
|
+
end
|
131
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hexapdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -124,6 +124,11 @@ files:
|
|
124
124
|
- data/hexapdf/afm/Times-Italic.afm
|
125
125
|
- data/hexapdf/afm/Times-Roman.afm
|
126
126
|
- data/hexapdf/afm/ZapfDingbats.afm
|
127
|
+
- data/hexapdf/cert/demo_cert.rb
|
128
|
+
- data/hexapdf/cert/root-ca.crt
|
129
|
+
- data/hexapdf/cert/signing.crt
|
130
|
+
- data/hexapdf/cert/signing.key
|
131
|
+
- data/hexapdf/cert/sub-ca.crt
|
127
132
|
- data/hexapdf/cmap/83pv-RKSJ-H
|
128
133
|
- data/hexapdf/cmap/90ms-RKSJ-H
|
129
134
|
- data/hexapdf/cmap/90ms-RKSJ-V
|
@@ -254,6 +259,7 @@ files:
|
|
254
259
|
- lib/hexapdf/document/fonts.rb
|
255
260
|
- lib/hexapdf/document/images.rb
|
256
261
|
- lib/hexapdf/document/pages.rb
|
262
|
+
- lib/hexapdf/document/signatures.rb
|
257
263
|
- lib/hexapdf/encryption.rb
|
258
264
|
- lib/hexapdf/encryption/aes.rb
|
259
265
|
- lib/hexapdf/encryption/arc4.rb
|
@@ -396,6 +402,11 @@ files:
|
|
396
402
|
- lib/hexapdf/type/page.rb
|
397
403
|
- lib/hexapdf/type/page_tree_node.rb
|
398
404
|
- lib/hexapdf/type/resources.rb
|
405
|
+
- lib/hexapdf/type/signature.rb
|
406
|
+
- lib/hexapdf/type/signature/adbe_pkcs7_detached.rb
|
407
|
+
- lib/hexapdf/type/signature/adbe_x509_rsa_sha1.rb
|
408
|
+
- lib/hexapdf/type/signature/handler.rb
|
409
|
+
- lib/hexapdf/type/signature/verification_result.rb
|
399
410
|
- lib/hexapdf/type/trailer.rb
|
400
411
|
- lib/hexapdf/type/viewer_preferences.rb
|
401
412
|
- lib/hexapdf/type/xref_stream.rb
|
@@ -497,6 +508,7 @@ files:
|
|
497
508
|
- test/hexapdf/document/test_fonts.rb
|
498
509
|
- test/hexapdf/document/test_images.rb
|
499
510
|
- test/hexapdf/document/test_pages.rb
|
511
|
+
- test/hexapdf/document/test_signatures.rb
|
500
512
|
- test/hexapdf/encryption/common.rb
|
501
513
|
- test/hexapdf/encryption/test_aes.rb
|
502
514
|
- test/hexapdf/encryption/test_arc4.rb
|
@@ -605,6 +617,11 @@ files:
|
|
605
617
|
- test/hexapdf/type/annotations/test_markup_annotation.rb
|
606
618
|
- test/hexapdf/type/annotations/test_text.rb
|
607
619
|
- test/hexapdf/type/annotations/test_widget.rb
|
620
|
+
- test/hexapdf/type/signature/common.rb
|
621
|
+
- test/hexapdf/type/signature/test_adbe_pkcs7_detached.rb
|
622
|
+
- test/hexapdf/type/signature/test_adbe_x509_rsa_sha1.rb
|
623
|
+
- test/hexapdf/type/signature/test_handler.rb
|
624
|
+
- test/hexapdf/type/signature/test_verification_result.rb
|
608
625
|
- test/hexapdf/type/test_annotation.rb
|
609
626
|
- test/hexapdf/type/test_catalog.rb
|
610
627
|
- test/hexapdf/type/test_cid_font.rb
|
@@ -623,6 +640,7 @@ files:
|
|
623
640
|
- test/hexapdf/type/test_page.rb
|
624
641
|
- test/hexapdf/type/test_page_tree_node.rb
|
625
642
|
- test/hexapdf/type/test_resources.rb
|
643
|
+
- test/hexapdf/type/test_signature.rb
|
626
644
|
- test/hexapdf/type/test_trailer.rb
|
627
645
|
- test/hexapdf/type/test_xref_stream.rb
|
628
646
|
- test/hexapdf/utils/test_bit_field.rb
|
@@ -653,7 +671,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
653
671
|
- !ruby/object:Gem::Version
|
654
672
|
version: '0'
|
655
673
|
requirements: []
|
656
|
-
rubygems_version: 3.
|
674
|
+
rubygems_version: 3.3.3
|
657
675
|
signing_key:
|
658
676
|
specification_version: 4
|
659
677
|
summary: HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|