main
1# frozen_string_literal: true
2
3module Xml
4 module Kit
5 # @!visibility private
6 class Signatures # :nodoc:
7 attr_reader :key_pair, :signature_method, :digest_method
8
9 # @!visibility private
10 def initialize(key_pair:, signature_method:, digest_method:)
11 @digest_method = digest_method
12 @key_pair = key_pair
13 @signature_method = signature_method
14 end
15
16 # @!visibility private
17 def sign_with(key_pair)
18 @key_pair = key_pair
19 end
20
21 # @!visibility private
22 def build(reference_id)
23 return nil if key_pair.nil?
24
25 ::Xml::Kit::Signature.new(
26 reference_id,
27 certificate: key_pair.certificate,
28 signature_method: signature_method,
29 digest_method: digest_method
30 )
31 end
32
33 # @!visibility private
34 def complete(raw_xml)
35 return raw_xml if key_pair.nil?
36
37 private_key = key_pair.private_key
38 Xmldsig::SignedDocument.new(raw_xml).sign(private_key, false)
39 end
40
41 # @!visibility private
42 def self.sign(xml: ::Builder::XmlMarkup.new,
43 key_pair:,
44 signature_method: :SHA256,
45 digest_method: :SHA256)
46 signatures = new(
47 key_pair: key_pair,
48 signature_method: signature_method,
49 digest_method: digest_method
50 )
51 yield xml, XmlSignatureTemplate.new(xml, signatures)
52 signatures.complete(xml.target!)
53 end
54
55 class XmlSignatureTemplate # :nodoc:
56 # @!visibility private
57 attr_reader :signatures, :xml
58
59 # @!visibility private
60 def initialize(xml, signatures)
61 @signatures = signatures
62 @xml = xml
63 end
64
65 # @!visibility private
66 def template(reference_id)
67 Template.new(signatures.build(reference_id)).to_xml(xml: xml)
68 end
69 end
70 end
71 end
72end