xml-kit 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -2
- data/.travis.yml +1 -2
- data/README.md +14 -22
- data/bin/cibuild +1 -1
- data/lib/xml/kit.rb +3 -0
- data/lib/xml/kit/certificate.rb +8 -4
- data/lib/xml/kit/crypto/oaep_cipher.rb +4 -1
- data/lib/xml/kit/crypto/rsa_cipher.rb +3 -1
- data/lib/xml/kit/crypto/symmetric_cipher.rb +15 -6
- data/lib/xml/kit/crypto/unknown_cipher.rb +6 -1
- data/lib/xml/kit/decryption.rb +19 -9
- data/lib/xml/kit/document.rb +5 -4
- data/lib/xml/kit/encrypted_data.rb +50 -0
- data/lib/xml/kit/encrypted_key.rb +34 -0
- data/lib/xml/kit/encryption.rb +14 -11
- data/lib/xml/kit/fingerprint.rb +1 -1
- data/lib/xml/kit/key_info.rb +40 -0
- data/lib/xml/kit/key_info/key_value.rb +17 -0
- data/lib/xml/kit/key_info/retrieval_method.rb +17 -0
- data/lib/xml/kit/key_info/rsa_key_value.rb +13 -0
- data/lib/xml/kit/key_pair.rb +9 -2
- data/lib/xml/kit/self_signed_certificate.rb +17 -2
- data/lib/xml/kit/signature.rb +10 -1
- data/lib/xml/kit/signatures.rb +6 -1
- data/lib/xml/kit/templatable.rb +59 -13
- data/lib/xml/kit/templates/certificate.builder +1 -5
- data/lib/xml/kit/templates/encrypted_data.builder +9 -0
- data/lib/xml/kit/templates/encrypted_key.builder +9 -0
- data/lib/xml/kit/templates/key_info.builder +14 -0
- data/lib/xml/kit/templates/key_value.builder +5 -0
- data/lib/xml/kit/templates/retrieval_method.builder +3 -0
- data/lib/xml/kit/templates/rsa_key_value.builder +6 -0
- data/lib/xml/kit/version.rb +1 -1
- data/xml-kit.gemspec +0 -1
- metadata +15 -20
- data/.rubocop_todo.yml +0 -22
- data/lib/xml/kit/templates/encryption.builder +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 672d735085855f16805b7406db39b904cca1e04be940d8a9bb0512ddb441c94d
|
4
|
+
data.tar.gz: 6dd14f85bde17fae00b6b2fb3c0a70d32db6bdf8d9534053eddebcea2afa3b09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91479a0d7f9dd674d0b509e332c5d4de11ec9d6dc5e4a53ba5abf1b0724ffd30effd04ea4986e68d0a8d5db7de5169f72cc24dccea472dc7cf4df8cf1b57e366
|
7
|
+
data.tar.gz: 2a516669b6c6fcaa56a8a216f701da707547876aaee04df7efbfdb06da0a32b80dc3d1055b5d933aff022b423b9992cf3f4bc4fc95c5060f9a4200983d00cbf6
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
inherit_from: .rubocop_todo.yml
|
2
|
-
|
3
1
|
require:
|
4
2
|
- rubocop/cop/internal_affairs
|
5
3
|
- rubocop-rspec
|
@@ -59,8 +57,10 @@ Metrics/ModuleLength:
|
|
59
57
|
- 'spec/**/*.rb'
|
60
58
|
|
61
59
|
Metrics/LineLength:
|
60
|
+
IgnoredPatterns: ['(\A|\s)#']
|
62
61
|
Exclude:
|
63
62
|
- 'spec/**/*.rb'
|
63
|
+
- 'lib/xml/kit/templates/*.builder'
|
64
64
|
|
65
65
|
Naming/FileName:
|
66
66
|
Exclude:
|
@@ -95,3 +95,7 @@ RSpec/NestedGroups:
|
|
95
95
|
|
96
96
|
RSpec/SubjectStub:
|
97
97
|
Enabled: false
|
98
|
+
|
99
|
+
Style/DoubleNegation:
|
100
|
+
Exclude:
|
101
|
+
- 'lib/xml/kit/certificate.rb'
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,8 +5,7 @@
|
|
5
5
|
[![Build Status](https://travis-ci.org/saml-kit/xml-kit.svg?branch=master)](https://travis-ci.org/saml-kit/xml-kit)
|
6
6
|
[![Security](https://hakiri.io/github/saml-kit/xml-kit/master.svg)](https://hakiri.io/github/saml-kit/xml-kit/master)
|
7
7
|
|
8
|
-
Xml::Kit is a toolkit for working with XML. It supports adding [XML
|
9
|
-
Digital Signatures](https://www.w3.org/TR/xmldsig-core/)
|
8
|
+
Xml::Kit is a toolkit for working with XML. It supports adding [XML Digital Signatures](https://www.w3.org/TR/xmldsig-core/)
|
10
9
|
and [XML Encryption](https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html).
|
11
10
|
|
12
11
|
## Installation
|
@@ -29,11 +28,12 @@ Or install it yourself as:
|
|
29
28
|
|
30
29
|
```builder
|
31
30
|
# ./templates/item.builder
|
31
|
+
|
32
32
|
xml.instruct!
|
33
33
|
xml.Item ID: id do
|
34
34
|
signature_for reference_id: id, xml: xml
|
35
35
|
xml.Encrypted do
|
36
|
-
|
36
|
+
encrypt_data_for xml: xml do |encrypted_xml|
|
37
37
|
encrypted_xml.EncryptMe do
|
38
38
|
encrypted_xml.Secret "secret"
|
39
39
|
end
|
@@ -48,12 +48,12 @@ require 'xml/kit'
|
|
48
48
|
class Item
|
49
49
|
include ::Xml::Kit::Templatable
|
50
50
|
|
51
|
-
|
51
|
+
attr_reader :id
|
52
|
+
|
53
|
+
def initialize(signing_key_pair, encryption_certificate)
|
52
54
|
@id = ::Xml::Kit::Id.generate
|
53
|
-
|
54
|
-
|
55
|
-
@encrypt = true
|
56
|
-
@encryption_certificate = ::Xml::Kit::KeyPair.generate(use: :encryption).certificate
|
55
|
+
sign_with(signing_key_pair)
|
56
|
+
encrypt_with(encryption_certificate)
|
57
57
|
end
|
58
58
|
|
59
59
|
def template_path
|
@@ -62,7 +62,9 @@ class Item
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
|
65
|
+
signing_key_pair = ::Xml::Kit::KeyPair.generate(use: :signing)
|
66
|
+
encryption_certificate = ::Xml::Kit::KeyPair.generate(use: :encryption).certificate
|
67
|
+
puts Item.new(signing_key_pair, encryption_certificate).to_xml
|
66
68
|
```
|
67
69
|
|
68
70
|
This will produce something like the following:
|
@@ -86,8 +88,7 @@ This will produce something like the following:
|
|
86
88
|
<SignatureValue>ZCSx4dad704jz0Z6rCMsnOs/oyVH3YBeEF9wtk2UFmWBW+VfhoBKw7N50GnzmAGCHyI6zajRPdff5i6UMDz3fOzh7rlROnqW0TXoG77xPiIfqJswCKE/4LzzBLrEHVbdUz90U8n0M1Ahbesrt+pbf/NkJghpvDhJW+w6oho7dyU6k57C5D//kTaSb7DvKte3a7/o8xWvPRztQhYekK+RyWjK9k/lU4WEXk5rGbx+QrD9rgIXBQOdcSjOtUosZJADz7uFod6AWRak246U62Xahz8JxE/1N22LhZY9whvB7s+c76f1Uv44NtF87D0P8UXs0TVx2jsnhEwLsT7DPQ6jDg==</SignatureValue>
|
87
89
|
<KeyInfo>
|
88
90
|
<X509Data>
|
89
|
-
<X509Certificate>MIIDQTCCAimgAwIBAgIBADANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQGEwJDQTEQMA4GA1UECAwHQWxiZXJ0YTEQMA4GA1UEBwwHQ2FsZ2FyeTEPMA0GA1UECgwGWG1sS2l0MQ8wDQYDVQQLDAZYbWxLaXQxDzANBgNVBAMMBlhtbEtpdDAeFw0xNzEyMzAxOTM1MjZaFw0xODAxMjkwNzAwMDBaMGQxCzAJBgNVBAYTAkNBMRAwDgYDVQQIDAdBbGJlcnRhMRAwDgYDVQQHDAdDYWxnYXJ5MQ8wDQYDVQQKDAZYbWxLaXQxDzANBgNVBAsMBlhtbEtpdDEPMA0GA1UEAwwGWG1sS2l0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8yvaY1zvqiSTpDc0vFgS00N0R05ytanViNy0YrcAvLH2njvLOYi8e5lWAjCUzoWTe6FMJQySIHuzr9NvZztlQBp5tydmxDsOFQ3DrBhiqtyafdCd5s8OQz1CekavgToTOm5VdZEWLD7HSCFvHXeuiS/zwEh4yYpJBAERtsSaYxT7L1wNggxc6F6UEfF1vwrGxMNH/OUi4okeS773esXeRlP5fHyMUvVC70KHauSYt/kjNR8/WuZBOY8/kFv3XiErf0PNSAYhyGHozabv8hJ2Bho0+HR12P6Xv+qKXFlDnMeAOHy23eShuUpCEBaEPAG4o8w4g/lrn0nJ+e9XrYaNQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWybi6buMD75KBCcyd5aRtSKavYoDaZlzuohKh4z1HEzHS/fbpbxVQOrfXtuawZjNxcn62LFIe/w68EImzYkAss8LKojRcaKnIeF1/3Pzo6qfnmFpaecfYvX3ZTtw9JPOd4chy2X2WFAUMRscjSvjNvTBzFOXg60F0UMDnWOWMbc5Di/aZD8r2s/
|
90
|
-
8OG/fOgtBKkZnNF8gx7wuodbYSmKAfFGx8+CGtnkwNr4/hXgd1qg5KmsAx+9VYozCjGKSkVUIqC5khy6N+1Pb5jMKrMQ+QU9zGhylWoJ2jiK65hzUUVUESIB</X509Certificate>
|
91
|
+
<X509Certificate>MIIDQTCCAimgAwIBAgIBADANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQGEwJDQTEQMA4GA1UECAwHQWxiZXJ0YTEQMA4GA1UEBwwHQ2FsZ2FyeTEPMA0GA1UECgwGWG1sS2l0MQ8wDQYDVQQLDAZYbWxLaXQxDzANBgNVBAMMBlhtbEtpdDAeFw0xNzEyMzAxOTM1MjZaFw0xODAxMjkwNzAwMDBaMGQxCzAJBgNVBAYTAkNBMRAwDgYDVQQIDAdBbGJlcnRhMRAwDgYDVQQHDAdDYWxnYXJ5MQ8wDQYDVQQKDAZYbWxLaXQxDzANBgNVBAsMBlhtbEtpdDEPMA0GA1UEAwwGWG1sS2l0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8yvaY1zvqiSTpDc0vFgS00N0R05ytanViNy0YrcAvLH2njvLOYi8e5lWAjCUzoWTe6FMJQySIHuzr9NvZztlQBp5tydmxDsOFQ3DrBhiqtyafdCd5s8OQz1CekavgToTOm5VdZEWLD7HSCFvHXeuiS/zwEh4yYpJBAERtsSaYxT7L1wNggxc6F6UEfF1vwrGxMNH/OUi4okeS773esXeRlP5fHyMUvVC70KHauSYt/kjNR8/WuZBOY8/kFv3XiErf0PNSAYhyGHozabv8hJ2Bho0+HR12P6Xv+qKXFlDnMeAOHy23eShuUpCEBaEPAG4o8w4g/lrn0nJ+e9XrYaNQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWybi6buMD75KBCcyd5aRtSKavYoDaZlzuohKh4z1HEzHS/fbpbxVQOrfXtuawZjNxcn62LFIe/w68EImzYkAss8LKojRcaKnIeF1/3Pzo6qfnmFpaecfYvX3ZTtw9JPOd4chy2X2WFAUMRscjSvjNvTBzFOXg60F0UMDnWOWMbc5Di/aZD8r2s/RDE3QxcUou8QhBMc2nYw77mQsXBnWmBeUA2aGP8OG/fOgtBKkZnNF8gx7wuodbYSmKAfFGx8+CGtnkwNr4/hXgd1qg5KmsAx+9VYozCjGKSkVUIqC5khy6N+1Pb5jMKrMQ+QU9zGhylWoJ2jiK65hzUUVUESIB</X509Certificate>
|
91
92
|
</X509Data>
|
92
93
|
</KeyInfo>
|
93
94
|
</Signature>
|
@@ -98,21 +99,12 @@ This will produce something like the following:
|
|
98
99
|
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
|
99
100
|
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
|
100
101
|
<CipherData>
|
101
|
-
<CipherValue>rBJwm+gmL6eUHBZDXs2swIL3DiZ+MfmBPpM52eF0RWFtZv/
|
102
|
-
jc+DO7X5p9l1Br67FjGJrTdfSSqHf35cS1cioyaKLtgniSrD7Hf9d8qIuWt5
|
103
|
-
6dLWjmCi21cePMJHhNiFe5yRjFHNp5LZ9dX5hvNXjbn0+p90fj8zlO2TWZv9
|
104
|
-
atooON3BaYGCezZlmG0bWyEmloqKHiGjqaKtkdeSKJDzoo/AvubDEgz56rin
|
105
|
-
Cpw26rEOg8BBd/KNfSXyDUifOOzXmn6myq+8+W/FFQ+6y+5SgtsbONRCqe2c
|
106
|
-
KkNi3fYhilwLxWCaXFjONimEOkeG03yR5QnWhzEOpw==
|
107
|
-
</CipherValue>
|
102
|
+
<CipherValue>rBJwm+gmL6eUHBZDXs2swIL3DiZ+MfmBPpM52eF0RWFtZv/gutY02KlsFLlmjc+DO7X5p9l1Br67FjGJrTdfSSqHf35cS1cioyaKLtgniSrD7Hf9d8qIuWt56dLWjmCi21cePMJHhNiFe5yRjFHNp5LZ9dX5hvNXjbn0+p90fj8zlO2TWZv9atooON3BaYGCezZlmG0bWyEmloqKHiGjqaKtkdeSKJDzoo/AvubDEgz56rinCpw26rEOg8BBd/KNfSXyDUifOOzXmn6myq+8+W/FFQ+6y+5SgtsbONRCqe2cKkNi3fYhilwLxWCaXFjONimEOkeG03yR5QnWhzEOpw==</CipherValue>
|
108
103
|
</CipherData>
|
109
104
|
</EncryptedKey>
|
110
105
|
</KeyInfo>
|
111
106
|
<CipherData>
|
112
|
-
<CipherValue>45rM0phzM/S/vpiq8Ev+uQZ6WL5qZ8av0UDVzWAlHn6Qr7zWYjHea+
|
113
|
-
pvmTPWQDEnfv2UW8l0VdCLc+51zHjluRE/xJh31Gk3rVuRJtLioSge/N9UM4
|
114
|
-
5g901rE9
|
115
|
-
</CipherValue>
|
107
|
+
<CipherValue>45rM0phzM/S/vpiq8Ev+uQZ6WL5qZ8av0UDVzWAlHn6Qr7zWYjHea+NF94lKpvmTPWQDEnfv2UW8l0VdCLc+51zHjluRE/xJh31Gk3rVuRJtLioSge/N9UM45g901rE9</CipherValue>
|
116
108
|
</CipherData>
|
117
109
|
</EncryptedData>
|
118
110
|
</Encrypted>
|
data/bin/cibuild
CHANGED
data/lib/xml/kit.rb
CHANGED
@@ -19,9 +19,12 @@ require 'xml/kit/crypto'
|
|
19
19
|
require 'xml/kit/decryption'
|
20
20
|
require 'xml/kit/decryption_error'
|
21
21
|
require 'xml/kit/document'
|
22
|
+
require 'xml/kit/encrypted_data'
|
23
|
+
require 'xml/kit/encrypted_key'
|
22
24
|
require 'xml/kit/encryption'
|
23
25
|
require 'xml/kit/fingerprint'
|
24
26
|
require 'xml/kit/id'
|
27
|
+
require 'xml/kit/key_info'
|
25
28
|
require 'xml/kit/key_pair'
|
26
29
|
require 'xml/kit/self_signed_certificate'
|
27
30
|
require 'xml/kit/signature'
|
data/lib/xml/kit/certificate.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'xml/kit/templatable'
|
4
|
+
|
3
5
|
module Xml
|
4
6
|
module Kit
|
5
|
-
# {include:file:spec/xml/certificate_spec.rb}
|
7
|
+
# {include:file:spec/xml/kit/certificate_spec.rb}
|
6
8
|
class Certificate
|
9
|
+
include Templatable
|
10
|
+
# rubocop:disable Metrics/LineLength
|
7
11
|
BASE64_FORMAT = %r(\A([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\Z).freeze
|
12
|
+
# rubocop:enable Metrics/LineLength
|
8
13
|
BEGIN_CERT = /-----BEGIN CERTIFICATE-----/.freeze
|
9
14
|
END_CERT = /-----END CERTIFICATE-----/.freeze
|
10
15
|
# The use can be `:signing` or `:encryption`. Use `nil` for both.
|
@@ -109,9 +114,8 @@ module Xml
|
|
109
114
|
x509.not_before
|
110
115
|
end
|
111
116
|
|
112
|
-
def
|
113
|
-
|
114
|
-
pretty ? Nokogiri::XML(xml).to_xml(indent: 2) : xml
|
117
|
+
def key_info
|
118
|
+
@key_info ||= KeyInfo.new(x509: x509)
|
115
119
|
end
|
116
120
|
|
117
121
|
class << self
|
@@ -5,8 +5,10 @@ module Xml
|
|
5
5
|
module Crypto
|
6
6
|
class RsaCipher
|
7
7
|
ALGORITHM = "#{::Xml::Kit::Namespaces::XMLENC}rsa-1_5".freeze
|
8
|
+
attr_reader :algorithm, :key
|
8
9
|
|
9
|
-
def initialize(
|
10
|
+
def initialize(algorithm, key)
|
11
|
+
@algorithm = algorithm
|
10
12
|
@key = key
|
11
13
|
end
|
12
14
|
|
@@ -14,7 +14,7 @@ module Xml
|
|
14
14
|
|
15
15
|
attr_reader :algorithm, :key, :padding
|
16
16
|
|
17
|
-
def initialize(algorithm, key = nil, padding = nil)
|
17
|
+
def initialize(algorithm = DEFAULT_ALGORITHM, key = nil, padding = nil)
|
18
18
|
@algorithm = algorithm
|
19
19
|
@key = key || cipher.random_key
|
20
20
|
@padding = padding
|
@@ -31,9 +31,10 @@ module Xml
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def decrypt(cipher_text)
|
34
|
+
bytes = cipher_text.bytes
|
34
35
|
result = default_decrypt(
|
35
|
-
|
36
|
-
|
36
|
+
bytes[0...cipher.iv_len],
|
37
|
+
bytes[cipher.iv_len..-1]
|
37
38
|
)
|
38
39
|
return result if padding.nil?
|
39
40
|
|
@@ -41,14 +42,18 @@ module Xml
|
|
41
42
|
result[0...-padding_size]
|
42
43
|
end
|
43
44
|
|
45
|
+
def to_s
|
46
|
+
algorithm
|
47
|
+
end
|
48
|
+
|
44
49
|
protected
|
45
50
|
|
46
51
|
def default_decrypt(initialization_vector, data)
|
47
52
|
cipher.decrypt
|
48
|
-
cipher
|
53
|
+
apply_padding_to(cipher)
|
49
54
|
cipher.key = @key
|
50
|
-
cipher.iv = initialization_vector
|
51
|
-
cipher.update(data) << cipher.final
|
55
|
+
cipher.iv = initialization_vector.pack('c*')
|
56
|
+
cipher.update(data.pack('c*')) << cipher.final
|
52
57
|
end
|
53
58
|
|
54
59
|
private
|
@@ -56,6 +61,10 @@ module Xml
|
|
56
61
|
def cipher
|
57
62
|
@cipher ||= OpenSSL::Cipher.new(ALGORITHMS[algorithm])
|
58
63
|
end
|
64
|
+
|
65
|
+
def apply_padding_to(cipher)
|
66
|
+
cipher.padding = padding unless padding.nil?
|
67
|
+
end
|
59
68
|
end
|
60
69
|
end
|
61
70
|
end
|
@@ -4,7 +4,12 @@ module Xml
|
|
4
4
|
module Kit
|
5
5
|
module Crypto
|
6
6
|
class UnknownCipher
|
7
|
-
|
7
|
+
attr_reader :algorithm, :key
|
8
|
+
|
9
|
+
def initialize(algorithm, key)
|
10
|
+
@algorithm = algorithm
|
11
|
+
@key = key
|
12
|
+
end
|
8
13
|
|
9
14
|
def self.matches?(_algorithm)
|
10
15
|
true
|
data/lib/xml/kit/decryption.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Xml
|
4
4
|
module Kit
|
5
|
-
# {include:file:spec/
|
5
|
+
# {include:file:spec/xml/kit/decryption_spec.rb}
|
6
6
|
class Decryption
|
7
7
|
# The list of private keys to use to attempt to decrypt the document.
|
8
8
|
attr_reader :cipher_registry, :private_keys
|
@@ -15,8 +15,11 @@ module Xml
|
|
15
15
|
# Decrypts an EncryptedData section of an XML document.
|
16
16
|
#
|
17
17
|
# @param data [Hash] the XML document converted to a [Hash] using Hash.from_xml.
|
18
|
+
# @deprecated Use {#decrypt_hash} instead of this
|
18
19
|
def decrypt(data)
|
19
|
-
::Xml::Kit.deprecate(
|
20
|
+
::Xml::Kit.deprecate(
|
21
|
+
'decrypt is deprecated. Use decrypt_xml or decrypt_hash instead.'
|
22
|
+
)
|
20
23
|
decrypt_hash(data)
|
21
24
|
end
|
22
25
|
|
@@ -31,11 +34,11 @@ module Xml
|
|
31
34
|
#
|
32
35
|
# @param hash [Hash] the XML document converted to a [Hash] using Hash.from_xml.
|
33
36
|
def decrypt_hash(hash)
|
34
|
-
|
37
|
+
data = hash['EncryptedData']
|
35
38
|
to_plaintext(
|
36
|
-
Base64.decode64(
|
37
|
-
symmetric_key_from(
|
38
|
-
|
39
|
+
Base64.decode64(data['CipherData']['CipherValue']),
|
40
|
+
symmetric_key_from(data['KeyInfo']['EncryptedKey']),
|
41
|
+
data['EncryptionMethod']['Algorithm']
|
39
42
|
)
|
40
43
|
end
|
41
44
|
|
@@ -50,12 +53,12 @@ module Xml
|
|
50
53
|
|
51
54
|
private
|
52
55
|
|
53
|
-
def symmetric_key_from(
|
54
|
-
|
56
|
+
def symmetric_key_from(encrypted_key, attempts = private_keys.count)
|
57
|
+
cipher, algorithm = cipher_and_algorithm_from(encrypted_key)
|
55
58
|
private_keys.each do |private_key|
|
56
59
|
begin
|
57
60
|
attempts -= 1
|
58
|
-
return to_plaintext(
|
61
|
+
return to_plaintext(cipher, private_key, algorithm)
|
59
62
|
rescue OpenSSL::PKey::RSAError
|
60
63
|
raise if attempts.zero?
|
61
64
|
end
|
@@ -66,6 +69,13 @@ module Xml
|
|
66
69
|
def to_plaintext(cipher_text, private_key, algorithm)
|
67
70
|
cipher_registry.cipher_for(algorithm, private_key).decrypt(cipher_text)
|
68
71
|
end
|
72
|
+
|
73
|
+
def cipher_and_algorithm_from(encrypted_key)
|
74
|
+
[
|
75
|
+
Base64.decode64(encrypted_key['CipherData']['CipherValue']),
|
76
|
+
encrypted_key['EncryptionMethod']['Algorithm']
|
77
|
+
]
|
78
|
+
end
|
69
79
|
end
|
70
80
|
end
|
71
81
|
end
|
data/lib/xml/kit/document.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Xml
|
4
4
|
module Kit
|
5
|
-
# {include:file:spec/
|
5
|
+
# {include:file:spec/xml/kit/document_spec.rb}
|
6
6
|
class Document
|
7
7
|
include ActiveModel::Validations
|
8
8
|
NAMESPACES = { "ds": ::Xml::Kit::Namespaces::XMLDSIG }.freeze
|
@@ -47,9 +47,10 @@ module Xml
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def invalid_signatures
|
51
|
-
|
52
|
-
|
50
|
+
def invalid_signatures(id_attr: 'ID=$uri or @Id')
|
51
|
+
Xmldsig::SignedDocument
|
52
|
+
.new(document, id_attr: id_attr)
|
53
|
+
.signatures.find_all do |signature|
|
53
54
|
x509_certificates.all? do |certificate|
|
54
55
|
!signature.valid?(certificate)
|
55
56
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Xml
|
4
|
+
module Kit
|
5
|
+
# An implementation of the EncryptedKey element.
|
6
|
+
# https://www.w3.org/TR/xmlenc-core1/#sec-EncryptedData
|
7
|
+
#
|
8
|
+
# @since 0.3.0
|
9
|
+
class EncryptedData
|
10
|
+
attr_reader :key_info
|
11
|
+
attr_reader :symmetric_cipher
|
12
|
+
attr_reader :symmetric_cipher_value
|
13
|
+
|
14
|
+
def initialize(
|
15
|
+
raw_xml,
|
16
|
+
symmetric_cipher:,
|
17
|
+
asymmetric_cipher:,
|
18
|
+
key_info: nil
|
19
|
+
)
|
20
|
+
@symmetric_cipher = symmetric_cipher
|
21
|
+
@symmetric_cipher_value = Base64.strict_encode64(
|
22
|
+
symmetric_cipher.encrypt(raw_xml)
|
23
|
+
)
|
24
|
+
@key_info = key_info || create_key_info_for(
|
25
|
+
symmetric_cipher,
|
26
|
+
asymmetric_cipher
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_xml(xml: ::Builder::XmlMarkup.new)
|
31
|
+
::Xml::Kit::Template.new(self).to_xml(xml: xml)
|
32
|
+
end
|
33
|
+
|
34
|
+
def render(model, options)
|
35
|
+
::Xml::Kit::Template.new(model).to_xml(options)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def create_key_info_for(symmetric_cipher, asymmetric_cipher)
|
41
|
+
KeyInfo.new do |x|
|
42
|
+
x.encrypted_key = EncryptedKey.new(
|
43
|
+
asymmetric_cipher: asymmetric_cipher,
|
44
|
+
symmetric_cipher: symmetric_cipher
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xml/kit/templatable'
|
4
|
+
|
5
|
+
module Xml
|
6
|
+
module Kit
|
7
|
+
# An implementation of the EncryptedKey element.
|
8
|
+
# https://www.w3.org/TR/xmlenc-core1/#sec-EncryptedKey
|
9
|
+
#
|
10
|
+
# @since 0.3.0
|
11
|
+
class EncryptedKey
|
12
|
+
include ::Xml::Kit::Templatable
|
13
|
+
attr_reader :id
|
14
|
+
attr_reader :asymmetric_cipher, :symmetric_cipher
|
15
|
+
attr_accessor :key_info
|
16
|
+
|
17
|
+
def initialize(
|
18
|
+
id: Id.generate,
|
19
|
+
asymmetric_cipher:,
|
20
|
+
symmetric_cipher:,
|
21
|
+
key_info: nil
|
22
|
+
)
|
23
|
+
@id = id
|
24
|
+
@asymmetric_cipher = asymmetric_cipher
|
25
|
+
@symmetric_cipher = symmetric_cipher
|
26
|
+
@key_info = key_info
|
27
|
+
end
|
28
|
+
|
29
|
+
def cipher_value
|
30
|
+
Base64.strict_encode64(asymmetric_cipher.encrypt(symmetric_cipher.key))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/xml/kit/encryption.rb
CHANGED
@@ -2,29 +2,32 @@
|
|
2
2
|
|
3
3
|
module Xml
|
4
4
|
module Kit
|
5
|
-
class
|
5
|
+
# @deprecated Use {#Xml::Kit::EncryptedData} class instead of this
|
6
|
+
class Encryption < EncryptedData
|
6
7
|
attr_reader :asymmetric_algorithm
|
7
|
-
attr_reader :asymmetric_cipher_value
|
8
8
|
attr_reader :symmetric_algorithm
|
9
9
|
attr_reader :symmetric_cipher_value
|
10
|
+
attr_reader :key_info
|
10
11
|
|
11
12
|
def initialize(
|
12
13
|
raw_xml,
|
13
14
|
public_key,
|
14
|
-
symmetric_algorithm:
|
15
|
-
asymmetric_algorithm:
|
15
|
+
symmetric_algorithm: Crypto::SymmetricCipher::DEFAULT_ALGORITHM,
|
16
|
+
asymmetric_algorithm: Crypto::RsaCipher::ALGORITHM,
|
17
|
+
key_info: nil
|
16
18
|
)
|
17
19
|
@symmetric_algorithm = symmetric_algorithm
|
18
|
-
symmetric_cipher = symmetric(symmetric_algorithm)
|
19
|
-
@symmetric_cipher_value = Base64.strict_encode64(symmetric_cipher.encrypt(raw_xml))
|
20
|
-
|
21
20
|
@asymmetric_algorithm = asymmetric_algorithm
|
22
|
-
|
23
|
-
|
21
|
+
Xml::Kit.deprecate('Encryption is deprecated. Use EncryptedData.')
|
22
|
+
super(raw_xml,
|
23
|
+
symmetric_cipher: symmetric(symmetric_algorithm),
|
24
|
+
asymmetric_cipher: asymmetric(asymmetric_algorithm, public_key),
|
25
|
+
key_info: key_info
|
26
|
+
)
|
24
27
|
end
|
25
28
|
|
26
|
-
def
|
27
|
-
::
|
29
|
+
def template_path
|
30
|
+
Template::TEMPLATES_DIR.join('encrypted_data.builder')
|
28
31
|
end
|
29
32
|
|
30
33
|
private
|
data/lib/xml/kit/fingerprint.rb
CHANGED
@@ -9,7 +9,7 @@ module Xml
|
|
9
9
|
# puts Xml::Kit::Fingerprint.new(certificate).to_s
|
10
10
|
# # B7:AB:DC:BD:4D:23:58:65:FD:1A:99:0C:5F:89:EA:87:AD:F1:D7:83:34:7A:E9:E4:88:12:DD:46:1F:38:05:93
|
11
11
|
#
|
12
|
-
# {include:file:spec/
|
12
|
+
# {include:file:spec/xml/kit/fingerprint_spec.rb}
|
13
13
|
class Fingerprint
|
14
14
|
# The OpenSSL::X509::Certificate
|
15
15
|
attr_reader :x509
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xml/kit/key_info/key_value'
|
4
|
+
require 'xml/kit/key_info/retrieval_method'
|
5
|
+
require 'xml/kit/key_info/rsa_key_value'
|
6
|
+
|
7
|
+
module Xml
|
8
|
+
module Kit
|
9
|
+
# An implementation of the KeyInfo element.
|
10
|
+
# https://www.w3.org/TR/xmldsig-core1/#sec-KeyInfo
|
11
|
+
#
|
12
|
+
# @since 0.3.0
|
13
|
+
class KeyInfo
|
14
|
+
include Templatable
|
15
|
+
attr_accessor :key_name
|
16
|
+
attr_accessor :x509_data
|
17
|
+
attr_accessor :encrypted_key
|
18
|
+
|
19
|
+
def initialize(x509: nil)
|
20
|
+
@x509_data = x509
|
21
|
+
yield self if block_given?
|
22
|
+
end
|
23
|
+
|
24
|
+
def key_value
|
25
|
+
@key_value ||= KeyValue.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def retrieval_method
|
29
|
+
@retrieval_method ||= RetrievalMethod.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def subject_key_identifier
|
33
|
+
ski = x509_data.extensions.find { |x| x.oid == 'subjectKeyIdentifier' }
|
34
|
+
return if ski.nil?
|
35
|
+
|
36
|
+
Base64.strict_encode64(ski.value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Xml
|
2
|
+
module Kit
|
3
|
+
class KeyInfo
|
4
|
+
# An implementation of the RSAKeyValue element.
|
5
|
+
# https://www.w3.org/TR/xmldsig-core1/#sec-KeyValue
|
6
|
+
#
|
7
|
+
# @since 0.3.0
|
8
|
+
class KeyValue
|
9
|
+
include Templatable
|
10
|
+
|
11
|
+
def rsa
|
12
|
+
@rsa ||= RSAKeyValue.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Xml
|
2
|
+
module Kit
|
3
|
+
class KeyInfo
|
4
|
+
# An implementation of the RSAKeyValue element.
|
5
|
+
# https://www.w3.org/TR/xmldsig-core1/#sec-RetrievalMethod
|
6
|
+
#
|
7
|
+
# @since 0.3.0
|
8
|
+
class RetrievalMethod
|
9
|
+
attr_accessor :uri, :type
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@type = "#{Namespaces::XMLENC}EncryptedKey"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/xml/kit/key_pair.rb
CHANGED
@@ -30,9 +30,16 @@ module Xml
|
|
30
30
|
# @param use [Symbol] Can be either `:signing` or `:encryption`.
|
31
31
|
# @param passphrase [String] the passphrase to use to encrypt the private key.
|
32
32
|
# @param algorithm [String] the symmetric algorithm to use for encrypting the private key.
|
33
|
-
def self.generate(
|
33
|
+
def self.generate(
|
34
|
+
use:,
|
35
|
+
passphrase: SecureRandom.uuid,
|
36
|
+
algorithm: ::Xml::Kit::Crypto::SymmetricCipher::DEFAULT_ALGORITHM
|
37
|
+
)
|
34
38
|
algorithm = ::Xml::Kit::Crypto::SymmetricCipher::ALGORITHMS[algorithm]
|
35
|
-
certificate, private_key =
|
39
|
+
certificate, private_key = SelfSignedCertificate.new.create(
|
40
|
+
algorithm: algorithm,
|
41
|
+
passphrase: passphrase
|
42
|
+
)
|
36
43
|
new(certificate, private_key, passphrase, use)
|
37
44
|
end
|
38
45
|
end
|
@@ -5,7 +5,11 @@ module Xml
|
|
5
5
|
class SelfSignedCertificate
|
6
6
|
SUBJECT = '/C=CA/ST=AB/L=Calgary/O=XmlKit/OU=XmlKit/CN=XmlKit'.freeze
|
7
7
|
|
8
|
-
def create(
|
8
|
+
def create(
|
9
|
+
algorithm: 'AES-256-CBC',
|
10
|
+
passphrase: nil,
|
11
|
+
key_pair: OpenSSL::PKey::RSA.new(2048)
|
12
|
+
)
|
9
13
|
certificate = certificate_for(key_pair.public_key)
|
10
14
|
certificate.sign(key_pair, OpenSSL::Digest::SHA256.new)
|
11
15
|
[certificate.to_pem, export(key_pair, algorithm, passphrase)]
|
@@ -24,14 +28,25 @@ module Xml
|
|
24
28
|
|
25
29
|
def certificate_for(public_key)
|
26
30
|
certificate = OpenSSL::X509::Certificate.new
|
27
|
-
certificate.subject =
|
31
|
+
certificate.subject =
|
32
|
+
certificate.issuer = OpenSSL::X509::Name.parse(SUBJECT)
|
28
33
|
certificate.not_before = Time.now
|
29
34
|
certificate.not_after = certificate.not_before + 30 * 24 * 60 * 60 # 30 days
|
30
35
|
certificate.public_key = public_key
|
31
36
|
certificate.serial = 0x0
|
32
37
|
certificate.version = 2
|
38
|
+
apply_ski_extension_to(certificate)
|
33
39
|
certificate
|
34
40
|
end
|
41
|
+
|
42
|
+
def apply_ski_extension_to(certificate)
|
43
|
+
extensions = OpenSSL::X509::ExtensionFactory.new
|
44
|
+
extensions.subject_certificate = certificate
|
45
|
+
extensions.issuer_certificate = certificate
|
46
|
+
certificate.add_extension(
|
47
|
+
extensions.create_extension('subjectKeyIdentifier', 'hash', false)
|
48
|
+
)
|
49
|
+
end
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end
|
data/lib/xml/kit/signature.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
module Xml
|
4
4
|
module Kit
|
5
|
+
# An implementation of the Signature element.
|
6
|
+
# https://www.w3.org/TR/xmldsig-core1/#sec-Signature
|
7
|
+
#
|
8
|
+
# @since 0.1.0
|
5
9
|
class Signature
|
6
10
|
SIGNATURE_METHODS = {
|
7
11
|
SHA1: 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
|
@@ -23,7 +27,12 @@ module Xml
|
|
23
27
|
attr_reader :reference_id
|
24
28
|
attr_reader :signature_method
|
25
29
|
|
26
|
-
def initialize(
|
30
|
+
def initialize(
|
31
|
+
reference_id,
|
32
|
+
signature_method: :SH256,
|
33
|
+
digest_method: :SHA256,
|
34
|
+
certificate:
|
35
|
+
)
|
27
36
|
@certificate = certificate
|
28
37
|
@digest_method = DIGEST_METHODS[digest_method]
|
29
38
|
@reference_id = reference_id
|
data/lib/xml/kit/signatures.rb
CHANGED
@@ -39,7 +39,12 @@ module Xml
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# @!visibility private
|
42
|
-
def self.sign(
|
42
|
+
def self.sign(
|
43
|
+
xml: ::Builder::XmlMarkup.new,
|
44
|
+
key_pair:,
|
45
|
+
signature_method: :SHA256,
|
46
|
+
digest_method: :SHA256
|
47
|
+
)
|
43
48
|
signatures = new(
|
44
49
|
key_pair: key_pair,
|
45
50
|
signature_method: signature_method,
|
data/lib/xml/kit/templatable.rb
CHANGED
@@ -18,21 +18,67 @@ module Xml
|
|
18
18
|
attr_accessor :encryption_certificate
|
19
19
|
|
20
20
|
# Returns the generated XML document with an XML Digital Signature and XML Encryption.
|
21
|
-
def to_xml(xml: ::Builder::XmlMarkup.new)
|
22
|
-
signatures.complete(render(self, xml: xml))
|
21
|
+
def to_xml(xml: ::Builder::XmlMarkup.new, pretty: false)
|
22
|
+
result = signatures.complete(render(self, xml: xml))
|
23
|
+
pretty ? Nokogiri::XML(result).to_xml(indent: 2) : result
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
# Generates an {#Xml::Kit::EncryptedKey} section. https://www.w3.org/TR/xmlenc-core1/#sec-EncryptedKey
|
27
|
+
#
|
28
|
+
# @since 0.3.0
|
29
|
+
# @param xml [Builder::XmlMarkup] the xml builder instance
|
30
|
+
# @param id [String] the id of EncryptedKey element
|
31
|
+
def encrypt_key_for(xml:, id:)
|
32
|
+
::Xml::Kit::EncryptedKey.new(
|
33
|
+
id: id,
|
34
|
+
asymmetric_cipher: asymmetric_cipher,
|
35
|
+
symmetric_cipher: symmetric_cipher
|
36
|
+
).to_xml(xml: xml)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @deprecated Use {#encrypt_data_for} instead of this
|
40
|
+
def encryption_for(*args, &block)
|
41
|
+
::Xml::Kit.deprecate(
|
42
|
+
'encryption_for is deprecated. Use encrypt_data_for instead.'
|
43
|
+
)
|
44
|
+
encrypt_data_for(*args, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Generates an {#Xml::Kit::EncryptedData} section. https://www.w3.org/TR/xmlenc-core1/#sec-EncryptedData
|
48
|
+
#
|
49
|
+
# @since 0.3.0
|
50
|
+
# @param xml [Builder::XmlMarkup] the xml builder instance
|
51
|
+
# @param key_info [Xml::Kit::KeyInfo] the key info to render in the EncryptedData
|
52
|
+
def encrypt_data_for(xml:, key_info: nil)
|
53
|
+
return yield xml unless encrypt?
|
54
|
+
|
55
|
+
temp = ::Builder::XmlMarkup.new
|
56
|
+
yield temp
|
57
|
+
::Xml::Kit::EncryptedData.new(
|
58
|
+
signatures.complete(temp.target!),
|
59
|
+
symmetric_cipher: symmetric_cipher,
|
60
|
+
asymmetric_cipher: asymmetric_cipher,
|
61
|
+
key_info: key_info
|
62
|
+
).to_xml(xml: xml)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Provides a default RSA asymmetric cipher. Can be overridden to provide custom ciphers.
|
66
|
+
#
|
67
|
+
# @abstract
|
68
|
+
# @since 0.3.0
|
69
|
+
def asymmetric_cipher(algorithm: Crypto::RsaCipher::ALGORITHM)
|
70
|
+
@asymmetric_cipher ||= Crypto.cipher_for(
|
71
|
+
algorithm,
|
72
|
+
encryption_certificate.public_key
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Provides a default aes256-cbc symmetric cipher. Can be overridden to provide custom ciphers.
|
77
|
+
#
|
78
|
+
# @abstract
|
79
|
+
# @since 0.3.0
|
80
|
+
def symmetric_cipher
|
81
|
+
@symmetric_cipher ||= Crypto::SymmetricCipher.new
|
36
82
|
end
|
37
83
|
|
38
84
|
def render(model, options)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.EncryptedKey Id: id, xmlns: ::Xml::Kit::Namespaces::XMLENC do
|
4
|
+
xml.EncryptionMethod Algorithm: asymmetric_cipher.algorithm
|
5
|
+
render(key_info, xml: xml) if key_info
|
6
|
+
xml.CipherData do
|
7
|
+
xml.CipherValue cipher_value
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.KeyInfo xmlns: ::Xml::Kit::Namespaces::XMLDSIG do
|
4
|
+
xml.KeyName key_name if key_name
|
5
|
+
render(key_value, xml: xml) if @key_value
|
6
|
+
render(retrieval_method, xml: xml) if @retrieval_method
|
7
|
+
if x509_data
|
8
|
+
xml.X509Data do
|
9
|
+
xml.X509SKI subject_key_identifier
|
10
|
+
xml.X509Certificate ::Xml::Kit::Certificate.strip(x509_data.to_pem)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
render(encrypted_key, xml: xml) if encrypted_key
|
14
|
+
end
|
data/lib/xml/kit/version.rb
CHANGED
data/xml-kit.gemspec
CHANGED
@@ -29,7 +29,6 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_dependency 'nokogiri', '>= 1.8.5'
|
30
30
|
spec.add_dependency 'tilt', '>= 1.4.1'
|
31
31
|
spec.add_dependency 'xmldsig', '~> 0.6'
|
32
|
-
spec.add_development_dependency 'bundler', '~> 1.16'
|
33
32
|
spec.add_development_dependency 'bundler-audit', '~> 0.6'
|
34
33
|
spec.add_development_dependency 'ffaker', '~> 2.7'
|
35
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mo khan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.6'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: bundler
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.16'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.16'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: bundler-audit
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,7 +189,6 @@ files:
|
|
203
189
|
- ".gitlab-ci.yml"
|
204
190
|
- ".rspec"
|
205
191
|
- ".rubocop.yml"
|
206
|
-
- ".rubocop_todo.yml"
|
207
192
|
- ".travis.yml"
|
208
193
|
- Gemfile
|
209
194
|
- LICENSE.txt
|
@@ -225,9 +210,15 @@ files:
|
|
225
210
|
- lib/xml/kit/decryption.rb
|
226
211
|
- lib/xml/kit/decryption_error.rb
|
227
212
|
- lib/xml/kit/document.rb
|
213
|
+
- lib/xml/kit/encrypted_data.rb
|
214
|
+
- lib/xml/kit/encrypted_key.rb
|
228
215
|
- lib/xml/kit/encryption.rb
|
229
216
|
- lib/xml/kit/fingerprint.rb
|
230
217
|
- lib/xml/kit/id.rb
|
218
|
+
- lib/xml/kit/key_info.rb
|
219
|
+
- lib/xml/kit/key_info/key_value.rb
|
220
|
+
- lib/xml/kit/key_info/retrieval_method.rb
|
221
|
+
- lib/xml/kit/key_info/rsa_key_value.rb
|
231
222
|
- lib/xml/kit/key_pair.rb
|
232
223
|
- lib/xml/kit/namespaces.rb
|
233
224
|
- lib/xml/kit/self_signed_certificate.rb
|
@@ -236,8 +227,13 @@ files:
|
|
236
227
|
- lib/xml/kit/templatable.rb
|
237
228
|
- lib/xml/kit/template.rb
|
238
229
|
- lib/xml/kit/templates/certificate.builder
|
239
|
-
- lib/xml/kit/templates/
|
230
|
+
- lib/xml/kit/templates/encrypted_data.builder
|
231
|
+
- lib/xml/kit/templates/encrypted_key.builder
|
232
|
+
- lib/xml/kit/templates/key_info.builder
|
233
|
+
- lib/xml/kit/templates/key_value.builder
|
240
234
|
- lib/xml/kit/templates/nil_class.builder
|
235
|
+
- lib/xml/kit/templates/retrieval_method.builder
|
236
|
+
- lib/xml/kit/templates/rsa_key_value.builder
|
241
237
|
- lib/xml/kit/templates/signature.builder
|
242
238
|
- lib/xml/kit/version.rb
|
243
239
|
- xml-kit.gemspec
|
@@ -261,8 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
261
257
|
- !ruby/object:Gem::Version
|
262
258
|
version: '0'
|
263
259
|
requirements: []
|
264
|
-
|
265
|
-
rubygems_version: 2.7.6
|
260
|
+
rubygems_version: 3.0.2
|
266
261
|
signing_key:
|
267
262
|
specification_version: 4
|
268
263
|
summary: A simple toolkit for working with XML.
|
data/.rubocop_todo.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on 2018-03-03 11:50:08 -0700 using RuboCop version 0.52.1.
|
4
|
-
# The point is for the user to remove these configuration records
|
5
|
-
# one by one as the offenses are removed from the code base.
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
8
|
-
|
9
|
-
# Offense count: 2
|
10
|
-
Metrics/AbcSize:
|
11
|
-
Max: 18
|
12
|
-
|
13
|
-
# Offense count: 1
|
14
|
-
Style/DoubleNegation:
|
15
|
-
Exclude:
|
16
|
-
- 'lib/xml/kit/certificate.rb'
|
17
|
-
|
18
|
-
# Offense count: 29
|
19
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
20
|
-
# URISchemes: http, https
|
21
|
-
Metrics/LineLength:
|
22
|
-
Max: 141
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
xml.EncryptedData xmlns: ::Xml::Kit::Namespaces::XMLENC do
|
4
|
-
xml.EncryptionMethod Algorithm: symmetric_algorithm
|
5
|
-
xml.KeyInfo xmlns: ::Xml::Kit::Namespaces::XMLDSIG do
|
6
|
-
xml.EncryptedKey xmlns: ::Xml::Kit::Namespaces::XMLENC do
|
7
|
-
xml.EncryptionMethod Algorithm: asymmetric_algorithm
|
8
|
-
xml.CipherData do
|
9
|
-
xml.CipherValue asymmetric_cipher_value
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
xml.CipherData do
|
14
|
-
xml.CipherValue symmetric_cipher_value
|
15
|
-
end
|
16
|
-
end
|