confium 0.3.2-x86_64-linux

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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +183 -0
  3. data/Cargo.lock +2635 -0
  4. data/Cargo.toml +9 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.adoc +139 -0
  7. data/Rakefile +30 -0
  8. data/confium.gemspec +56 -0
  9. data/lib/confium/audit.rb +125 -0
  10. data/lib/confium/cfm.rb +23 -0
  11. data/lib/confium/crypto.rb +50 -0
  12. data/lib/confium/digest.rb +62 -0
  13. data/lib/confium/errors/coerce.rb +47 -0
  14. data/lib/confium/errors/crypto_error.rb +15 -0
  15. data/lib/confium/errors/index_error.rb +15 -0
  16. data/lib/confium/errors/not_found_error.rb +15 -0
  17. data/lib/confium/errors/parse_error.rb +15 -0
  18. data/lib/confium/errors/policy_violation_error.rb +15 -0
  19. data/lib/confium/errors/threshold_error.rb +16 -0
  20. data/lib/confium/errors/unresolved_signer_error.rb +14 -0
  21. data/lib/confium/errors/validation_error.rb +17 -0
  22. data/lib/confium/errors/verification_error.rb +15 -0
  23. data/lib/confium/errors.rb +26 -0
  24. data/lib/confium/ffi.rb +23 -0
  25. data/lib/confium/lib.rb +33 -0
  26. data/lib/confium/openpgp.rb +34 -0
  27. data/lib/confium/pki/certificate_builder.rb +60 -0
  28. data/lib/confium/pki/cms/signed_data_builder.rb +92 -0
  29. data/lib/confium/pki/cms.rb +15 -0
  30. data/lib/confium/pki/cnml.rb +80 -0
  31. data/lib/confium/pki.rb +13 -0
  32. data/lib/confium/policy.rb +138 -0
  33. data/lib/confium/secure_bytes.rb +126 -0
  34. data/lib/confium/tc/coordinator.rb +68 -0
  35. data/lib/confium/tc/session.rb +51 -0
  36. data/lib/confium/tc/session_stub.rb +43 -0
  37. data/lib/confium/tc/share_file.rb +87 -0
  38. data/lib/confium/tc.rb +17 -0
  39. data/lib/confium/transparency/ots.rb +63 -0
  40. data/lib/confium/version.rb +5 -0
  41. data/lib/confium.rb +71 -0
  42. data/lib/confium_native/3.1/confium_native.so +0 -0
  43. data/lib/confium_native/3.2/confium_native.so +0 -0
  44. data/lib/confium_native/3.3/confium_native.so +0 -0
  45. metadata +178 -0
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Confium::TC::Coordinator wraps the async session coordinator service.
4
+ #
5
+ # The coordinator enables globally distributed threshold signers to
6
+ # participate when convenient — no simultaneity required.
7
+ #
8
+ # Usage:
9
+ # coordinator = Confium::TC::Coordinator.new(quorum_id: "biml-root")
10
+ # session_id = coordinator.create_session(message: data,
11
+ # threshold: 5,
12
+ # unlock_window: 14400)
13
+ # coordinator.submit_commitment(session_id, signer_id, commitment_bytes)
14
+ # # ... wait for T commitments ...
15
+ # coordinator.submit_share(session_id, signer_id, share_bytes)
16
+ # # ... wait for T shares ...
17
+ # signature = coordinator.aggregate(session_id)
18
+ module Confium
19
+ module TC
20
+ class Coordinator
21
+ attr_reader :quorum_id, :sessions
22
+
23
+ def initialize(quorum_id:)
24
+ @quorum_id = quorum_id
25
+ @sessions = {}
26
+ end
27
+
28
+ def create_session(message:, threshold:, unlock_window: 14_400)
29
+ session_id = "session-#{@sessions.length + 1}"
30
+ @sessions[session_id] = {
31
+ message: message,
32
+ threshold: threshold,
33
+ unlock_window: unlock_window,
34
+ state: :pending,
35
+ commitments: [],
36
+ shares: []
37
+ }
38
+ session_id
39
+ end
40
+
41
+ def session_state(session_id)
42
+ @sessions.dig(session_id, :state)
43
+ end
44
+
45
+ def submit_commitment(session_id, signer_id, commitment_bytes)
46
+ session = @sessions[session_id] or raise "Unknown session: #{session_id}"
47
+ session[:commitments] << { signer_id: signer_id, bytes: commitment_bytes }
48
+ return unless session[:commitments].length >= session[:threshold]
49
+
50
+ session[:state] = :commitments_collected
51
+ end
52
+
53
+ def submit_share(session_id, signer_id, share_bytes)
54
+ session = @sessions[session_id] or raise "Unknown session: #{session_id}"
55
+ session[:shares] << { signer_id: signer_id, bytes: share_bytes }
56
+ end
57
+
58
+ def aggregate(session_id)
59
+ session = @sessions[session_id] or raise "Unknown session: #{session_id}"
60
+ raise 'Threshold not met' if session[:shares].length < session[:threshold]
61
+
62
+ session[:state] = :completed
63
+ # In real implementation, calls FFI to aggregate shares
64
+ session[:shares].map { |s| s[:bytes] }.join
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'confium/lib'
4
+
5
+ # Confium::TC::Session wraps a threshold cryptography session.
6
+ #
7
+ # A session represents one signing or decryption operation involving
8
+ # T-of-N parties. The session goes through states: pending →
9
+ # commitments_collected → shares_collected → completed.
10
+ #
11
+ # Usage:
12
+ # session = Confium::TC::Session.new(scheme: "FROST-ed25519",
13
+ # threshold: 3,
14
+ # num_parties: 5,
15
+ # party_index: 0)
16
+ # session.set_local_share(share_bytes)
17
+ # session.round(incoming_messages) # returns outgoing messages
18
+ # result = session.result if session.complete?
19
+ module Confium
20
+ module TC
21
+ class Session
22
+ attr_reader :scheme, :threshold, :num_parties, :party_index, :state
23
+
24
+ def initialize(scheme:, threshold:, num_parties:, party_index:)
25
+ @scheme = scheme
26
+ @threshold = threshold
27
+ @num_parties = num_parties
28
+ @party_index = party_index
29
+ @state = :pending
30
+ @local_share = nil
31
+ @result = nil
32
+ end
33
+
34
+ def set_local_share(share_bytes)
35
+ raise ArgumentError, 'share must be a String' unless share_bytes.is_a?(String)
36
+
37
+ @local_share = share_bytes
38
+ end
39
+
40
+ def complete?
41
+ @state == :completed
42
+ end
43
+
44
+ def result
45
+ raise 'Session not complete' unless complete?
46
+
47
+ @result
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Confium::TC::SessionStub — placeholder for the multi-party TC session
4
+ # interface. The full Session implementation wraps
5
+ # confium_tc::session::Session which drives 3-round FROST/CMP20/GG18
6
+ # signing ceremonies.
7
+ #
8
+ # This stub provides the interface shape so consumers can write code
9
+ # against it. The actual session orchestration will be wired through
10
+ # magnus in a future PR (TODO.completion/009-multi-party-tc-sessions.md).
11
+
12
+ module Confium
13
+ module TC
14
+ class SessionStub
15
+ attr_reader :scheme, :threshold, :party_count, :this_party_idx, :round
16
+
17
+ def initialize(scheme:, threshold:, party_count:, this_party_idx:)
18
+ @scheme = scheme
19
+ @threshold = threshold
20
+ @party_count = party_count
21
+ @this_party_idx = this_party_idx
22
+ @round = 0
23
+ @complete = false
24
+ end
25
+
26
+ def complete?
27
+ @complete
28
+ end
29
+
30
+ # Stub: returns an empty RoundResult. Real implementation will
31
+ # call confium_tc::session::Session::round_step.
32
+ def round_step(_incoming_messages)
33
+ @round += 1
34
+ @complete = @round >= 3 # FROST is 3 rounds
35
+ { outgoing: [], complete: @complete }
36
+ end
37
+
38
+ def result
39
+ nil # Real implementation returns the signature/secret bytes.
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'fileutils'
5
+
6
+ module Confium
7
+ module TC
8
+ # Filesystem-backed share persistence.
9
+ #
10
+ # Share blobs produced by `Confium::TC::Cmp20.keygen` /
11
+ # `Confium::TC::Gg18.keygen` are 71-byte binary strings. This
12
+ # class wraps them in a JSON envelope so they can be saved to
13
+ # disk, transferred between hosts, and loaded back without
14
+ # encoding ambiguity.
15
+ #
16
+ # The envelope format:
17
+ #
18
+ # {
19
+ # "scheme": "CMP20-ECDSA-P256",
20
+ # "threshold": 3,
21
+ # "party_count": 5,
22
+ # "public_key": "<33-byte hex>",
23
+ # "shares": ["<71-byte hex>", ...]
24
+ # }
25
+ #
26
+ # The format is identical to what the Python binding's
27
+ # `confium.tc.ShareFile` produces, so shares saved from one
28
+ # binding can be loaded by the other.
29
+ class ShareFile
30
+ attr_reader :scheme, :threshold, :party_count, :public_key, :shares
31
+
32
+ def initialize(scheme:, threshold:, party_count:, public_key:, shares:)
33
+ @scheme = scheme
34
+ @threshold = threshold
35
+ @party_count = party_count
36
+ @public_key = public_key
37
+ @shares = shares
38
+ end
39
+
40
+ # Load a ShareFile from a JSON file at `path`.
41
+ def self.load(path)
42
+ from_json(File.read(path))
43
+ end
44
+
45
+ # Parse a ShareFile from a JSON string.
46
+ def self.from_json(json)
47
+ d = JSON.parse(json)
48
+ new(
49
+ scheme: d.fetch('scheme'),
50
+ threshold: d.fetch('threshold'),
51
+ party_count: d.fetch('party_count'),
52
+ public_key: [d.fetch('public_key')].pack('H*'),
53
+ shares: d.fetch('shares').map { |h| [h].pack('H*') }
54
+ )
55
+ end
56
+
57
+ # Save to `path` as JSON. Creates parent directories if missing.
58
+ def save(path)
59
+ FileUtils.mkdir_p(File.dirname(path))
60
+ File.write(path, to_json)
61
+ self
62
+ end
63
+
64
+ # Serialize to a JSON string.
65
+ def to_json(*_args)
66
+ JSON.generate(
67
+ scheme: scheme,
68
+ threshold: threshold,
69
+ party_count: party_count,
70
+ public_key: public_key.unpack1('H*'),
71
+ shares: shares.map { |s| s.unpack1('H*') }
72
+ )
73
+ end
74
+
75
+ # Build a ShareFile from a CMP20 / GG18 keygen result Hash.
76
+ def self.from_keygen(scheme_name, keygen_result)
77
+ new(
78
+ scheme: scheme_name,
79
+ threshold: nil, # not carried by the keygen Hash; caller knows
80
+ party_count: keygen_result['shares'].length,
81
+ public_key: keygen_result['public_key'],
82
+ shares: keygen_result['shares']
83
+ )
84
+ end
85
+ end
86
+ end
87
+ end
data/lib/confium/tc.rb ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Confium::TC provides Ruby access to the threshold cryptography
4
+ # interface exposed by the Confium Rust workspace.
5
+ #
6
+ # This module is loaded lazily via autoload from lib/confium.rb.
7
+ # It wraps the C FFI surface for threshold sessions, coordinator,
8
+ # re-sharing, and KEM operations.
9
+ #
10
+ # See: TODO.roadmap/04-threshold-cryptography.md in the main confium repo
11
+ # for the full interface specification.
12
+ module Confium
13
+ module TC
14
+ autoload :Session, 'confium/tc/session'
15
+ autoload :Coordinator, 'confium/tc/coordinator'
16
+ end
17
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Confium::Transparency::OTS — OpenTimestamps client interface.
4
+ #
5
+ # Wraps confium-transparency::ots::Client for anchoring Merkle tree
6
+ # roots in the Bitcoin blockchain via OTS calendar servers.
7
+ #
8
+ # This is a pure-Ruby stub that defines the interface. The actual
9
+ # OTS stamping requires network access to calendar servers and
10
+ # will be wired through the Rust extension in a future PR
11
+ # (TODO.completion/011-ots-ers-exposure.md).
12
+
13
+ module Confium
14
+ module Transparency
15
+ module OTS
16
+ # Default OTS calendar servers (from opentimestamps.org).
17
+ DEFAULT_CALENDARS = %w[
18
+ https://a.pool.opentimestamps.org
19
+ https://b.pool.opentimestamps.org
20
+ https://a.pool.eternitywall.com
21
+ ].freeze
22
+
23
+ # An OTS receipt proving that a hash was anchored in Bitcoin
24
+ # at a specific block height.
25
+ class Receipt
26
+ attr_reader :bytes, :block_height
27
+
28
+ def initialize(bytes:, block_height: nil)
29
+ @bytes = bytes
30
+ @block_height = block_height
31
+ end
32
+
33
+ def to_bytes
34
+ @bytes
35
+ end
36
+ end
37
+
38
+ # Stamp a 32-byte hash via OTS calendar servers.
39
+ # Returns a Receipt (stub: returns nil — requires network).
40
+ #
41
+ # @param hash [String] 32-byte SHA-256 hash to anchor
42
+ # @return [Receipt, nil]
43
+ def self.stamp(_hash)
44
+ # Real implementation: calls the Rust OTS client which
45
+ # submits the hash to calendar servers and returns a
46
+ # merged proof. Requires network access.
47
+ nil
48
+ end
49
+
50
+ # Verify an OTS receipt against a hash.
51
+ # Returns true if the receipt proves the hash was anchored.
52
+ #
53
+ # @param receipt [Receipt, String] the OTS proof
54
+ # @param hash [String] the 32-byte hash
55
+ # @return [Boolean]
56
+ def self.verify(_receipt, _hash)
57
+ # Real implementation: calls the Rust OTS verifier which
58
+ # walks the Bitcoin blockchain proof.
59
+ false
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Confium
4
+ VERSION = '0.3.2'
5
+ end
data/lib/confium.rb ADDED
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Confium is the Ruby entry point for the Confium cryptographic framework.
4
+ #
5
+ # The native Rust extension is loaded first; everything else (Cert, CMS,
6
+ # Composite, Transparency, TC::*, etc.) is registered by the extension
7
+ # via magnus when this file is required.
8
+ #
9
+ # Pure-Ruby companions (the error hierarchy, Enumerable mixins, etc.)
10
+ # are loaded lazily via autoload — see lib/confium/<name>.rb.
11
+
12
+ require_relative 'confium/version'
13
+
14
+ begin
15
+ # Pre-built platform gems ship one extension per C-ABI window
16
+ # (Ruby 3.2 broke the 3.1 ABI — object shapes — and rb-sys
17
+ # references the VM pointer libruby stopped exporting in 3.3, so
18
+ # 3.1 and 3.2 get exact-minor builds while 3.3 covers 3.3+).
19
+ # Source builds install the extension flat, without a version
20
+ # directory.
21
+ major, minor = RUBY_VERSION.split('.').first(2).map(&:to_i)
22
+ window = major > 3 || minor >= 3 ? '3.3' : "#{major}.#{minor}"
23
+ begin
24
+ require_relative "confium_native/#{window}/confium_native"
25
+ rescue LoadError
26
+ require_relative 'confium_native/confium_native'
27
+ end
28
+ rescue LoadError => e
29
+ warn 'confium: native extension not built — run `bundle exec rake compile`'
30
+ raise e
31
+ end
32
+
33
+ # Register autoloads on the native-defined PKI::CMS module so Ruby
34
+ # companions like SignedDataBuilder load on first reference. Eager-
35
+ # required because the module already exists at this point.
36
+ require_relative 'confium/pki/cms'
37
+
38
+ # The native extension defines Confium::OpenPGP with _native_armor /
39
+ # _native_dearmor. This file adds the idiomatic Ruby wrappers with
40
+ # default args. Eager-required for the same reason as PKI::CMS.
41
+ require_relative 'confium/openpgp'
42
+
43
+ module Confium
44
+ # Error hierarchy autoloads. Each subclass lives in its own file so
45
+ # callers can `autoload :FooError, "confium/errors/foo"` and avoid
46
+ # loading the whole hierarchy if they only rescue one type.
47
+ autoload :Error, 'confium/errors'
48
+ autoload :ParseError, 'confium/errors/parse_error'
49
+ autoload :ValidationError, 'confium/errors/validation_error'
50
+ autoload :VerificationError, 'confium/errors/verification_error'
51
+ autoload :ThresholdError, 'confium/errors/threshold_error'
52
+ autoload :CryptoError, 'confium/errors/crypto_error'
53
+ autoload :NotFoundError, 'confium/errors/not_found_error'
54
+ autoload :IndexError, 'confium/errors/index_error'
55
+ autoload :UnresolvedSignerError, 'confium/errors/unresolved_signer_error'
56
+ autoload :PolicyViolationError, 'confium/errors/policy_violation_error'
57
+ autoload :SecureBytes, 'confium/secure_bytes'
58
+ autoload :Policy, 'confium/policy'
59
+ autoload :PKI, 'confium/pki'
60
+ end
61
+
62
+ # Eager-load the Audit Ruby companion. The native extension registers
63
+ # `Confium::Audit` as a Ruby module with the `record`/`sink=`/`sink`
64
+ # methods; the companion file defines the Sink class hierarchy on top
65
+ # of that module.
66
+ require_relative 'confium/audit'
67
+
68
+ # Eager-load the TC ShareFile Ruby companion. The native extension
69
+ # defines `Confium::TC` as a Ruby module; this file adds the
70
+ # `ShareFile` class for filesystem-backed share persistence.
71
+ require_relative 'confium/tc/share_file'
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: confium
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2
5
+ platform: x86_64-linux
6
+ authors:
7
+ - Ribose Open
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '13.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake-compiler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler-dock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: steep
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ description: 'Confium provides threshold cryptography for Ruby: FROST / CMP20 / GG18
98
+ signing sessions, X.509 certificate issuance (CNML-ready), composite PQ-migration
99
+ signatures, and transparency-log anchoring. Powered by a Rust native extension (magnus
100
+ + rb_sys) — no separate C ABI to install.'
101
+ email:
102
+ - open.source@ribose.com
103
+ executables: []
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - CHANGELOG.md
108
+ - Cargo.lock
109
+ - Cargo.toml
110
+ - LICENSE.txt
111
+ - README.adoc
112
+ - Rakefile
113
+ - confium.gemspec
114
+ - lib/confium.rb
115
+ - lib/confium/audit.rb
116
+ - lib/confium/cfm.rb
117
+ - lib/confium/crypto.rb
118
+ - lib/confium/digest.rb
119
+ - lib/confium/errors.rb
120
+ - lib/confium/errors/coerce.rb
121
+ - lib/confium/errors/crypto_error.rb
122
+ - lib/confium/errors/index_error.rb
123
+ - lib/confium/errors/not_found_error.rb
124
+ - lib/confium/errors/parse_error.rb
125
+ - lib/confium/errors/policy_violation_error.rb
126
+ - lib/confium/errors/threshold_error.rb
127
+ - lib/confium/errors/unresolved_signer_error.rb
128
+ - lib/confium/errors/validation_error.rb
129
+ - lib/confium/errors/verification_error.rb
130
+ - lib/confium/ffi.rb
131
+ - lib/confium/lib.rb
132
+ - lib/confium/openpgp.rb
133
+ - lib/confium/pki.rb
134
+ - lib/confium/pki/certificate_builder.rb
135
+ - lib/confium/pki/cms.rb
136
+ - lib/confium/pki/cms/signed_data_builder.rb
137
+ - lib/confium/pki/cnml.rb
138
+ - lib/confium/policy.rb
139
+ - lib/confium/secure_bytes.rb
140
+ - lib/confium/tc.rb
141
+ - lib/confium/tc/coordinator.rb
142
+ - lib/confium/tc/session.rb
143
+ - lib/confium/tc/session_stub.rb
144
+ - lib/confium/tc/share_file.rb
145
+ - lib/confium/transparency/ots.rb
146
+ - lib/confium/version.rb
147
+ - lib/confium_native/3.1/confium_native.so
148
+ - lib/confium_native/3.2/confium_native.so
149
+ - lib/confium_native/3.3/confium_native.so
150
+ homepage: https://www.confium.org
151
+ licenses:
152
+ - BSD-2-Clause
153
+ metadata:
154
+ bug_tracker_uri: https://github.com/confium/confium-ruby/issues
155
+ changelog_uri: https://github.com/confium/confium-ruby/blob/main/CHANGELOG.md
156
+ homepage_uri: https://www.confium.org
157
+ source_code_uri: https://github.com/confium/confium-ruby
158
+ rubygems_mfa_required: 'true'
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 3.1.0
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubygems_version: 3.5.22
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Ruby bindings for the Confium multi-stakeholder threshold cryptography framework.
178
+ test_files: []