lyrebird 0.0.0 → 1.0.0.alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +25 -0
- data/.github/workflows/publish.yml +20 -0
- data/README.md +116 -17
- data/Rakefile +8 -1
- data/lib/lyrebird/assertion.rb +104 -0
- data/lib/lyrebird/certificate.rb +68 -0
- data/lib/lyrebird/defaults.rb +41 -0
- data/lib/lyrebird/id.rb +9 -0
- data/lib/lyrebird/namespaces.rb +14 -0
- data/lib/lyrebird/response.rb +66 -0
- data/lib/lyrebird/signature.rb +75 -0
- data/lib/lyrebird/version.rb +1 -1
- data/lib/lyrebird.rb +13 -1
- data/lyrebird.gemspec +25 -0
- data/test/lyrebird/assertion_test.rb +314 -0
- data/test/lyrebird/certificate_test.rb +87 -0
- data/test/lyrebird/defaults_test.rb +11 -0
- data/test/lyrebird/id_test.rb +11 -0
- data/test/lyrebird/response_test.rb +168 -0
- data/test/lyrebird/signature_test.rb +137 -0
- data/test/test_helper.rb +4 -0
- metadata +87 -8
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Lyrebird
|
|
6
|
+
class SignatureTest < Minitest::Test
|
|
7
|
+
def setup
|
|
8
|
+
@certificate = Certificate.generate
|
|
9
|
+
@assertion = Assertion.new.document
|
|
10
|
+
@element = @assertion.root
|
|
11
|
+
Signature.new(@element, certificate: @certificate).sign!
|
|
12
|
+
@signature = @element.elements["ds:Signature"]
|
|
13
|
+
@signed_info = @signature.elements["ds:SignedInfo"]
|
|
14
|
+
@reference = @signed_info.elements["ds:Reference"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_sign_inserts_after_issuer
|
|
18
|
+
children = @element.elements.to_a
|
|
19
|
+
issuer_index = children.index { |e| e.name == "Issuer" }
|
|
20
|
+
signature_index = children.index { |e| e.name == "Signature" }
|
|
21
|
+
assert_equal issuer_index + 1, signature_index
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_signature_element
|
|
25
|
+
assert_equal "Signature", @signature.name
|
|
26
|
+
assert_equal "ds", @signature.prefix
|
|
27
|
+
assert_equal XMLDSIG_NS, @signature.namespace
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_signature_element_children
|
|
31
|
+
children = @signature.elements.to_a
|
|
32
|
+
assert_equal 3, children.size
|
|
33
|
+
assert_equal "SignedInfo", children[0].name
|
|
34
|
+
assert_equal "SignatureValue", children[1].name
|
|
35
|
+
assert_equal "KeyInfo", children[2].name
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_signed_info_element
|
|
39
|
+
assert_equal "SignedInfo", @signed_info.name
|
|
40
|
+
assert_equal "ds", @signed_info.prefix
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_canonicalization_method
|
|
44
|
+
cm = @signed_info.elements["ds:CanonicalizationMethod"]
|
|
45
|
+
assert_equal "CanonicalizationMethod", cm.name
|
|
46
|
+
assert_equal EXC_C14N, cm.attributes["Algorithm"]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_signature_method
|
|
50
|
+
sm = @signed_info.elements["ds:SignatureMethod"]
|
|
51
|
+
assert_equal "SignatureMethod", sm.name
|
|
52
|
+
assert_equal RSA_SHA256, sm.attributes["Algorithm"]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_reference_element
|
|
56
|
+
assert_equal "Reference", @reference.name
|
|
57
|
+
assert_equal "ds", @reference.prefix
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_reference_uri
|
|
61
|
+
element_id = @element.attributes["ID"]
|
|
62
|
+
assert_equal "##{element_id}", @reference.attributes["URI"]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_transforms_element
|
|
66
|
+
transforms = @reference.elements["ds:Transforms"]
|
|
67
|
+
assert_equal "Transforms", transforms.name
|
|
68
|
+
assert_equal "ds", transforms.prefix
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_enveloped_signature_transform
|
|
72
|
+
transforms = @reference.elements["ds:Transforms"]
|
|
73
|
+
transform = transforms.elements.to_a("ds:Transform")[0]
|
|
74
|
+
assert_equal ENVELOPED_SIG, transform.attributes["Algorithm"]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_c14n_transform
|
|
78
|
+
transforms = @reference.elements["ds:Transforms"]
|
|
79
|
+
transform = transforms.elements.to_a("ds:Transform")[1]
|
|
80
|
+
assert_equal EXC_C14N, transform.attributes["Algorithm"]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_digest_method_element
|
|
84
|
+
digest_method = @reference.elements["ds:DigestMethod"]
|
|
85
|
+
assert_equal "DigestMethod", digest_method.name
|
|
86
|
+
assert_equal "ds", digest_method.prefix
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_digest_method_algorithm
|
|
90
|
+
digest_method = @reference.elements["ds:DigestMethod"]
|
|
91
|
+
assert_equal SHA256_DIGEST, digest_method.attributes["Algorithm"]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_digest_value_element
|
|
95
|
+
digest_value = @reference.elements["ds:DigestValue"]
|
|
96
|
+
assert_equal "DigestValue", digest_value.name
|
|
97
|
+
assert_equal "ds", digest_value.prefix
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_digest_value_is_base64
|
|
101
|
+
digest_value = @reference.elements["ds:DigestValue"]
|
|
102
|
+
decoded = Base64.strict_decode64(digest_value.text)
|
|
103
|
+
assert_equal 32, decoded.bytesize
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_signature_value_element
|
|
107
|
+
sv = @signature.elements["ds:SignatureValue"]
|
|
108
|
+
assert_equal "SignatureValue", sv.name
|
|
109
|
+
assert_equal "ds", sv.prefix
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_signature_value_is_base64
|
|
113
|
+
sv = @signature.elements["ds:SignatureValue"]
|
|
114
|
+
decoded = Base64.strict_decode64(sv.text)
|
|
115
|
+
assert_equal 256, decoded.bytesize
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_key_info_element
|
|
119
|
+
ki = @signature.elements["ds:KeyInfo"]
|
|
120
|
+
assert_equal "KeyInfo", ki.name
|
|
121
|
+
assert_equal "ds", ki.prefix
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_x509_data_element
|
|
125
|
+
x509_data = @signature.elements["ds:KeyInfo/ds:X509Data"]
|
|
126
|
+
assert_equal "X509Data", x509_data.name
|
|
127
|
+
assert_equal "ds", x509_data.prefix
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_x509_certificate_element
|
|
131
|
+
cert = @signature.elements["ds:KeyInfo/ds:X509Data/ds:X509Certificate"]
|
|
132
|
+
assert_equal "X509Certificate", cert.name
|
|
133
|
+
assert_equal "ds", cert.prefix
|
|
134
|
+
assert_equal @certificate.base64, cert.text
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
|
@@ -1,25 +1,103 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lyrebird
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 1.0.0.alpha1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Josh
|
|
8
|
-
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
-
dependencies:
|
|
11
|
+
date: 2026-01-25 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: base64
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rexml
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: minitest
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rake
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
description:
|
|
70
|
+
email:
|
|
12
71
|
executables: []
|
|
13
72
|
extensions: []
|
|
14
73
|
extra_rdoc_files: []
|
|
15
74
|
files:
|
|
75
|
+
- ".github/workflows/ci.yml"
|
|
76
|
+
- ".github/workflows/publish.yml"
|
|
16
77
|
- README.md
|
|
17
78
|
- Rakefile
|
|
18
79
|
- lib/lyrebird.rb
|
|
80
|
+
- lib/lyrebird/assertion.rb
|
|
81
|
+
- lib/lyrebird/certificate.rb
|
|
82
|
+
- lib/lyrebird/defaults.rb
|
|
83
|
+
- lib/lyrebird/id.rb
|
|
84
|
+
- lib/lyrebird/namespaces.rb
|
|
85
|
+
- lib/lyrebird/response.rb
|
|
86
|
+
- lib/lyrebird/signature.rb
|
|
19
87
|
- lib/lyrebird/version.rb
|
|
88
|
+
- lyrebird.gemspec
|
|
20
89
|
- sig/lyrebird.rbs
|
|
90
|
+
- test/lyrebird/assertion_test.rb
|
|
91
|
+
- test/lyrebird/certificate_test.rb
|
|
92
|
+
- test/lyrebird/defaults_test.rb
|
|
93
|
+
- test/lyrebird/id_test.rb
|
|
94
|
+
- test/lyrebird/response_test.rb
|
|
95
|
+
- test/lyrebird/signature_test.rb
|
|
96
|
+
- test/test_helper.rb
|
|
97
|
+
homepage:
|
|
21
98
|
licenses: []
|
|
22
99
|
metadata: {}
|
|
100
|
+
post_install_message:
|
|
23
101
|
rdoc_options: []
|
|
24
102
|
require_paths:
|
|
25
103
|
- lib
|
|
@@ -30,11 +108,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
30
108
|
version: 3.2.0
|
|
31
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
32
110
|
requirements:
|
|
33
|
-
- - "
|
|
111
|
+
- - ">"
|
|
34
112
|
- !ruby/object:Gem::Version
|
|
35
|
-
version:
|
|
113
|
+
version: 1.3.1
|
|
36
114
|
requirements: []
|
|
37
|
-
rubygems_version: 4.
|
|
115
|
+
rubygems_version: 3.4.19
|
|
116
|
+
signing_key:
|
|
38
117
|
specification_version: 4
|
|
39
|
-
summary: Mimics
|
|
118
|
+
summary: Mimics SAML Identity Provider (IdP) responses for testing
|
|
40
119
|
test_files: []
|