confium 0.3.2-aarch64-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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +183 -0
- data/Cargo.lock +2635 -0
- data/Cargo.toml +9 -0
- data/LICENSE.txt +21 -0
- data/README.adoc +139 -0
- data/Rakefile +30 -0
- data/confium.gemspec +56 -0
- data/lib/confium/audit.rb +125 -0
- data/lib/confium/cfm.rb +23 -0
- data/lib/confium/crypto.rb +50 -0
- data/lib/confium/digest.rb +62 -0
- data/lib/confium/errors/coerce.rb +47 -0
- data/lib/confium/errors/crypto_error.rb +15 -0
- data/lib/confium/errors/index_error.rb +15 -0
- data/lib/confium/errors/not_found_error.rb +15 -0
- data/lib/confium/errors/parse_error.rb +15 -0
- data/lib/confium/errors/policy_violation_error.rb +15 -0
- data/lib/confium/errors/threshold_error.rb +16 -0
- data/lib/confium/errors/unresolved_signer_error.rb +14 -0
- data/lib/confium/errors/validation_error.rb +17 -0
- data/lib/confium/errors/verification_error.rb +15 -0
- data/lib/confium/errors.rb +26 -0
- data/lib/confium/ffi.rb +23 -0
- data/lib/confium/lib.rb +33 -0
- data/lib/confium/openpgp.rb +34 -0
- data/lib/confium/pki/certificate_builder.rb +60 -0
- data/lib/confium/pki/cms/signed_data_builder.rb +92 -0
- data/lib/confium/pki/cms.rb +15 -0
- data/lib/confium/pki/cnml.rb +80 -0
- data/lib/confium/pki.rb +13 -0
- data/lib/confium/policy.rb +138 -0
- data/lib/confium/secure_bytes.rb +126 -0
- data/lib/confium/tc/coordinator.rb +68 -0
- data/lib/confium/tc/session.rb +51 -0
- data/lib/confium/tc/session_stub.rb +43 -0
- data/lib/confium/tc/share_file.rb +87 -0
- data/lib/confium/tc.rb +17 -0
- data/lib/confium/transparency/ots.rb +63 -0
- data/lib/confium/version.rb +5 -0
- data/lib/confium.rb +71 -0
- data/lib/confium_native/3.1/confium_native.so +0 -0
- data/lib/confium_native/3.2/confium_native.so +0 -0
- data/lib/confium_native/3.3/confium_native.so +0 -0
- 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
|
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'
|
|
Binary file
|
|
Binary file
|
|
Binary 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: aarch64-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: []
|