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.
@@ -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
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lyrebird"
4
+ require "minitest/autorun"
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.0
4
+ version: 1.0.0.alpha1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh
8
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
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: '0'
113
+ version: 1.3.1
36
114
  requirements: []
37
- rubygems_version: 4.0.3
115
+ rubygems_version: 3.4.19
116
+ signing_key:
38
117
  specification_version: 4
39
- summary: Mimics a SAML IdP for testing
118
+ summary: Mimics SAML Identity Provider (IdP) responses for testing
40
119
  test_files: []