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