confium 0.6.3-x86_64-linux → 0.7.0-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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6374fdd38da6467d6cf9e3b364f507144b79bed515fc14bf2abe0e9cc980715f
4
- data.tar.gz: 4f851ce4c48fc94ee59a2ea0e3deadf79e806a0b0e2eb0c7d8d1a063d242c541
3
+ metadata.gz: fb9023ca3c9c99f8f85682ea118c7604844a9369c23640491b731ec1d9990d9d
4
+ data.tar.gz: ffc0c63634bdaa2a6c43c295b53532a35ab7dcea7e4d864486af8df2d5abab98
5
5
  SHA512:
6
- metadata.gz: 33cb9182abce977a4ba06e337bf57548ba83d7e55deb2627679728013f20e0d28cc232de9c0422b7abdeebed0a685e6a52a471441db24d50586159cc57fb4318
7
- data.tar.gz: e34e0e83fa42f2a6db5af6c97de8c509f36e7592010780f1fac6c2e7054534681322acece914d3f1e671d524f0830e8dc4b995e7689654a00f05956321b4d046
6
+ metadata.gz: d062e24ba4dc4fb6faf6219fbdc53d529c71a99324b419227dafbb1076fc2a800caf88c754b218b699b60607243207f1cdd6aaddabef3e755e1be8b6b72d0b51
7
+ data.tar.gz: 0f97546fed40c7a4539b3223d79e3f135abb8266f5852738fb57c139f351629bd08bb903849a5b42e1716dd3a06c869f051cedb81a1020634b8dd3a9d4510428
data/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.0] — 2026-09-07
4
+
5
+ ### Added
6
+
7
+ - `Confium::Transport::SignerClient` / `CoordinatorServer` —
8
+ coordinator sessions over any registry transport the extension
9
+ links, addressed by URL: `tcp://host:port` for local/trusted
10
+ networks, `noise://host:port` for Noise_XX
11
+ (`Noise_XX_25519_ChaChaPoly_BLAKE2s`) encrypted sessions.
12
+ `noise://` URLs take `key=<hex>` (local static private key;
13
+ ephemeral and trust-on-first-use when omitted) and `pinned=<hex>`
14
+ (SHA-256 fingerprint of the expected peer static key — the
15
+ handshake aborts on mismatch). The handshake carries a 10-second
16
+ deadline so a non-Noise peer fails fast instead of hanging.
17
+ `SignerClient` exposes `#register`, `#create_session`,
18
+ `#submit_commitment`, `#submit_share` (returns the aggregated
19
+ signature once the threshold is met, else nil);
20
+ `CoordinatorServer.new(url)` serves any linked scheme for tests
21
+ and single-process deployments.
22
+
23
+ ### Changed
24
+
25
+ - **BREAKING**: `Confium::Net` is `Confium::Transport`. Defining
26
+ `Confium::Net` shadowed Ruby stdlib `Net` for every constant
27
+ lookup under the `Confium` namespace — `Confium::Audit::OtlpSink`'s
28
+ `Net::HTTP` resolved to `Confium::Net::HTTP` and raised
29
+ `NameError`. No prior release shipped the `Net` names.
30
+
31
+ ## [0.6.3] — 2026-08-26
32
+
33
+ ### Added
34
+
35
+ - `Confium::TC::Session` — per-party threshold protocol sessions
36
+ over confium-tc-core 0.4: each signer process runs its own
37
+ session (`"FROST-ed25519-dkg"` for distributed key generation,
38
+ `"FROST-ed25519"` for signing with the DKG share and message) and
39
+ exchanges only `round_step` messages — the share never leaves the
40
+ process. `#round_step(incoming)` returns
41
+ `{ "outgoing" => [...], "complete" => bool }`; the completed DKG
42
+ session's `#result` is the party's share blob, the signing
43
+ session's `#result` an RFC 8032 Ed25519 signature verifiable under
44
+ the group public key.
45
+
3
46
  ## [0.6.2] — 2026-08-26
4
47
 
5
48
  ### Added
data/Cargo.lock CHANGED
@@ -135,6 +135,15 @@ dependencies = [
135
135
  "wyz",
136
136
  ]
137
137
 
138
+ [[package]]
139
+ name = "blake2"
140
+ version = "0.10.6"
141
+ source = "registry+https://github.com/rust-lang/crates.io-index"
142
+ checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
143
+ dependencies = [
144
+ "digest 0.10.7",
145
+ ]
146
+
138
147
  [[package]]
139
148
  name = "block-buffer"
140
149
  version = "0.10.4"
@@ -207,6 +216,30 @@ version = "1.0.4"
207
216
  source = "registry+https://github.com/rust-lang/crates.io-index"
208
217
  checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
209
218
 
219
+ [[package]]
220
+ name = "chacha20"
221
+ version = "0.9.1"
222
+ source = "registry+https://github.com/rust-lang/crates.io-index"
223
+ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818"
224
+ dependencies = [
225
+ "cfg-if",
226
+ "cipher",
227
+ "cpufeatures 0.2.17",
228
+ ]
229
+
230
+ [[package]]
231
+ name = "chacha20poly1305"
232
+ version = "0.10.1"
233
+ source = "registry+https://github.com/rust-lang/crates.io-index"
234
+ checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"
235
+ dependencies = [
236
+ "aead",
237
+ "chacha20",
238
+ "cipher",
239
+ "poly1305",
240
+ "zeroize",
241
+ ]
242
+
210
243
  [[package]]
211
244
  name = "chrono"
212
245
  version = "0.4.45"
@@ -229,6 +262,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
229
262
  dependencies = [
230
263
  "crypto-common 0.1.7",
231
264
  "inout",
265
+ "zeroize",
232
266
  ]
233
267
 
234
268
  [[package]]
@@ -301,7 +335,7 @@ checksum = "e8c96d4d5997726cf0eb794410e3e8bbce839cfba9c4a32e26ede0c076b02e64"
301
335
  dependencies = [
302
336
  "chrono",
303
337
  "confium-api",
304
- "confium-net",
338
+ "confium-net 0.3.0",
305
339
  "confium-store 0.3.0",
306
340
  "confium-tc-core 0.3.0",
307
341
  "data-encoding",
@@ -321,6 +355,26 @@ dependencies = [
321
355
  "zeroize",
322
356
  ]
323
357
 
358
+ [[package]]
359
+ name = "confium-coordinator"
360
+ version = "0.8.5"
361
+ source = "registry+https://github.com/rust-lang/crates.io-index"
362
+ checksum = "52f49eae3301b6f1f2f36b2eb66d0fdd863bcecb1dc18b51ec51e5f8d1bb9dc3"
363
+ dependencies = [
364
+ "chrono",
365
+ "confium-net 0.8.5",
366
+ "getrandom 0.4.3",
367
+ "hex",
368
+ "hmac 0.13.0",
369
+ "p256 0.14.0",
370
+ "rand_core 0.6.4",
371
+ "serde",
372
+ "serde_json",
373
+ "sha2 0.11.0",
374
+ "thiserror 2.0.20",
375
+ "tracing",
376
+ ]
377
+
324
378
  [[package]]
325
379
  name = "confium-core"
326
380
  version = "0.2.0"
@@ -413,6 +467,44 @@ dependencies = [
413
467
  "url",
414
468
  ]
415
469
 
470
+ [[package]]
471
+ name = "confium-net"
472
+ version = "0.8.5"
473
+ source = "registry+https://github.com/rust-lang/crates.io-index"
474
+ checksum = "2bd7098e54033a09b1f6a4ebd0c0f54d6c44da8f46cfdff7ae156895f1083fc6"
475
+ dependencies = [
476
+ "inventory",
477
+ "snafu 0.9.2",
478
+ "url",
479
+ ]
480
+
481
+ [[package]]
482
+ name = "confium-net-noise"
483
+ version = "0.8.5"
484
+ source = "registry+https://github.com/rust-lang/crates.io-index"
485
+ checksum = "213e90ce6daa40d1ec92d8e524276744a07f027c453bd32815f80c29ba947237"
486
+ dependencies = [
487
+ "confium-net 0.8.5",
488
+ "inventory",
489
+ "sha2 0.11.0",
490
+ "snafu 0.9.2",
491
+ "snow",
492
+ "url",
493
+ "x25519-dalek",
494
+ ]
495
+
496
+ [[package]]
497
+ name = "confium-net-tcp"
498
+ version = "0.8.3"
499
+ source = "registry+https://github.com/rust-lang/crates.io-index"
500
+ checksum = "1b80e3d692ed5328a72e754a0f73d81f6c8fde3714d05fc0be1953f657e05f76"
501
+ dependencies = [
502
+ "confium-net 0.8.5",
503
+ "inventory",
504
+ "snafu 0.9.2",
505
+ "url",
506
+ ]
507
+
416
508
  [[package]]
417
509
  name = "confium-observability"
418
510
  version = "0.3.0"
@@ -493,8 +585,8 @@ checksum = "3dd7d4965aef12324cb76d397294c317b83b774de029f1d37b387cf54ba9593c"
493
585
  dependencies = [
494
586
  "chrono",
495
587
  "confium-api",
496
- "confium-coordinator",
497
- "confium-net",
588
+ "confium-coordinator 0.3.0",
589
+ "confium-net 0.3.0",
498
590
  "confium-store 0.3.0",
499
591
  "confium-tc-keys",
500
592
  "data-encoding",
@@ -566,7 +658,7 @@ checksum = "add3e15337ce81944f78c9ce844d870a081cbe91506a85b9a5c4e4c0da983771"
566
658
  dependencies = [
567
659
  "chrono",
568
660
  "confium-api",
569
- "confium-net",
661
+ "confium-net 0.3.0",
570
662
  "confium-store 0.3.0",
571
663
  "data-encoding",
572
664
  "hex",
@@ -703,10 +795,13 @@ dependencies = [
703
795
  "chrono",
704
796
  "confium-attributes",
705
797
  "confium-composite",
798
+ "confium-coordinator 0.8.5",
706
799
  "confium-core",
707
800
  "confium-crypto-vss",
708
801
  "confium-crypto-zk",
709
802
  "confium-deployment",
803
+ "confium-net-noise",
804
+ "confium-net-tcp",
710
805
  "confium-observability",
711
806
  "confium-pki",
712
807
  "confium-privacy",
@@ -1215,6 +1310,18 @@ dependencies = [
1215
1310
  "wasi",
1216
1311
  ]
1217
1312
 
1313
+ [[package]]
1314
+ name = "getrandom"
1315
+ version = "0.3.4"
1316
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1317
+ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
1318
+ dependencies = [
1319
+ "cfg-if",
1320
+ "libc",
1321
+ "r-efi 5.3.0",
1322
+ "wasip2",
1323
+ ]
1324
+
1218
1325
  [[package]]
1219
1326
  name = "getrandom"
1220
1327
  version = "0.4.3"
@@ -1223,7 +1330,7 @@ checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
1223
1330
  dependencies = [
1224
1331
  "cfg-if",
1225
1332
  "libc",
1226
- "r-efi",
1333
+ "r-efi 6.0.0",
1227
1334
  "rand_core 0.10.1",
1228
1335
  ]
1229
1336
 
@@ -1785,6 +1892,17 @@ version = "0.3.34"
1785
1892
  source = "registry+https://github.com/rust-lang/crates.io-index"
1786
1893
  checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
1787
1894
 
1895
+ [[package]]
1896
+ name = "poly1305"
1897
+ version = "0.8.0"
1898
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1899
+ checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf"
1900
+ dependencies = [
1901
+ "cpufeatures 0.2.17",
1902
+ "opaque-debug",
1903
+ "universal-hash",
1904
+ ]
1905
+
1788
1906
  [[package]]
1789
1907
  name = "polyval"
1790
1908
  version = "0.6.2"
@@ -1879,6 +1997,12 @@ dependencies = [
1879
1997
  "proc-macro2",
1880
1998
  ]
1881
1999
 
2000
+ [[package]]
2001
+ name = "r-efi"
2002
+ version = "5.3.0"
2003
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2004
+ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
2005
+
1882
2006
  [[package]]
1883
2007
  name = "r-efi"
1884
2008
  version = "6.0.0"
@@ -2348,6 +2472,23 @@ dependencies = [
2348
2472
  "syn 2.0.119",
2349
2473
  ]
2350
2474
 
2475
+ [[package]]
2476
+ name = "snow"
2477
+ version = "0.10.0"
2478
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2479
+ checksum = "599b506ccc4aff8cf7844bc42cf783009a434c1e26c964432560fb6d6ad02d82"
2480
+ dependencies = [
2481
+ "aes-gcm",
2482
+ "blake2",
2483
+ "chacha20poly1305",
2484
+ "curve25519-dalek",
2485
+ "getrandom 0.3.4",
2486
+ "ring",
2487
+ "rustc_version",
2488
+ "sha2 0.10.9",
2489
+ "subtle",
2490
+ ]
2491
+
2351
2492
  [[package]]
2352
2493
  name = "spki"
2353
2494
  version = "0.7.3"
@@ -2666,6 +2807,15 @@ version = "0.11.1+wasi-snapshot-preview1"
2666
2807
  source = "registry+https://github.com/rust-lang/crates.io-index"
2667
2808
  checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2668
2809
 
2810
+ [[package]]
2811
+ name = "wasip2"
2812
+ version = "1.0.4+wasi-0.2.12"
2813
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2814
+ checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2815
+ dependencies = [
2816
+ "wit-bindgen",
2817
+ ]
2818
+
2669
2819
  [[package]]
2670
2820
  name = "wasm-bindgen"
2671
2821
  version = "0.2.126"
@@ -2870,6 +3020,12 @@ dependencies = [
2870
3020
  "memchr",
2871
3021
  ]
2872
3022
 
3023
+ [[package]]
3024
+ name = "wit-bindgen"
3025
+ version = "0.57.1"
3026
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3027
+ checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
3028
+
2873
3029
  [[package]]
2874
3030
  name = "wnaf"
2875
3031
  version = "0.14.0"
@@ -2896,6 +3052,18 @@ dependencies = [
2896
3052
  "tap",
2897
3053
  ]
2898
3054
 
3055
+ [[package]]
3056
+ name = "x25519-dalek"
3057
+ version = "2.0.1"
3058
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3059
+ checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"
3060
+ dependencies = [
3061
+ "curve25519-dalek",
3062
+ "rand_core 0.6.4",
3063
+ "serde",
3064
+ "zeroize",
3065
+ ]
3066
+
2899
3067
  [[package]]
2900
3068
  name = "x509-cert"
2901
3069
  version = "0.3.0"
data/README.adoc CHANGED
@@ -18,7 +18,7 @@ Add to your Gemfile:
18
18
 
19
19
  [source,ruby]
20
20
  ----
21
- gem "confium", "~> 0.3"
21
+ gem "confium", "~> 0.7"
22
22
  ----
23
23
 
24
24
  Or install directly:
@@ -78,18 +78,38 @@ kp = Confium::TC::FrostP256.generate_keypair
78
78
  shares = Confium::TC::FrostP256.split_secret(kp["private_key"], 3, 5)
79
79
  recovered = Confium::TC::FrostP256.recover_secret(shares.first(3).map { |s| { "x" => s.x, "y" => s.y_bytes } })
80
80
  recovered == kp["private_key"] # => true
81
+
82
+ # Distributed key generation + 2-of-3 FROST-ed25519 signing (each party
83
+ # holds its own Confium::TC::Session and only exchanges round messages)
84
+ parties = %w[alice bob carol]
85
+ sessions = parties.each_with_index.map do |id, i|
86
+ Confium::TC::Session.new("FROST-ed25519-dkg", parties: parties, threshold: 2, this_party_idx: i)
87
+ end
88
+ # run rounds: session.round_step(messages_in) -> {"outgoing" => [...], "complete" => bool}
89
+ # broadcast "outgoing" payloads between sessions until every session is complete
90
+ dkg_share = sessions.first.result # this party's share (embeds the group public key)
91
+
92
+ signers = sessions.first(2).map.with_index do |s, i|
93
+ Confium::TC::Session.new("FROST-ed25519",
94
+ parties: parties.first(2), threshold: 2, this_party_idx: i,
95
+ local_share: dkg_share, message: "authentic message")
96
+ end
97
+ # run rounds as above; the completed session's #result is an RFC 8032
98
+ # Ed25519 signature verifiable under the group public key
81
99
  ----
82
100
 
83
- == API surface (v0.3)
101
+ == API surface (v0.7)
84
102
 
85
103
  === `Confium::Transparency`
86
104
  - `MerkleTree.new` / `#append(artifact_hash)` / `#root` / `#length` / `#empty?` / `#inclusion_proof(seq)`
87
105
  - `InclusionProof#sequence` / `#steps` / `#verify(root)`
106
+ - `Ots.stamp(hash)` / `Ots.verify(receipt, hash)` — OpenTimestamps anchoring interface (pure-Ruby stub; calendar-server wiring lands with the Rust client)
88
107
 
89
108
  === `Confium::Composite` — PQ migration
90
109
  - `.generate_ed25519_keypair` → `{ private_key:, public_key: }`
91
110
  - `.sign_ed25519(private_key, message)` → component Hash
92
- - `Signature.new(components)` / `#verify(message)` / `#component_count` / `#algorithms`
111
+ - `Signature.new(components)` / `#verify(message)` / `#component_count` / `#algorithms` / `#to_json`
112
+ - `.from_json(json)` / `.components_to_json(components)` / `.canonical_json(json, data)`
93
113
  - `VerificationResult#all_verified?` / `#per_component`
94
114
 
95
115
  === `Confium::Attributes` — threshold policy DSL
@@ -99,11 +119,14 @@ recovered == kp["private_key"] # => true
99
119
  - DSL: `min_count("attr", n)`, `min_distinct("attr", n)`, `any("attr")`, `all("attr")`, `none("attr")`, `and(...)`, `or(...)`, `not(p)`
100
120
 
101
121
  === `Confium::PKI`
102
- - `Certificate.from_der(bytes)` / `.from_pem(str)` / `#to_der` / `#to_pem` / `#fingerprint_sha256` / `#serial_hex` / `#not_before` / `#not_after` / `#valid_at?(iso8601)` / `#public_key_bytes`
122
+ - `Certificate.from_der(bytes)` / `.from_pem(str)` / `#to_der` / `#to_pem` / `#fingerprint_sha256` / `#serial_hex` / `#not_before` / `#not_after` / `#valid_at?(iso8601)` / `#public_key_bytes`; DER parse failures carry a byte `offset` in the error details
123
+ - `CertificateBuilder` / `CMS::SignedDataBuilder` — build certificates and signed data in Ruby
124
+ - `PathValidator.validate(leaf, intermediates, root, now_iso8601 = nil)` → `PathValidationResult` (chain validation leaf → root at a point in time)
103
125
  - `CSR.from_der` / `.from_pem` / `#to_der` / `#to_pem`
104
126
  - `CMS::SignedData.from_json` / `#to_json` / `#signer_count` / `#content_type` / `#content` / `#certificate_count` / `#certificate_at(i)`
105
127
  - `CMS::Content#bytes` / `#length`
106
128
  - `XMLDSig.canonicalize(xml)` / `.canonicalize_exclusive(xml)` (Canonical XML RFC 3076 + Exclusive C14N)
129
+ - `Cnml` — institutional certificate workflow helpers
107
130
 
108
131
  === `Confium::Identity` — actor roles
109
132
  - `.actor_types` → `["manufacturer", "testing_lab", "issuing_authority_officer", "biml_director", "quorum_coordinator", "verifier"]`
@@ -123,6 +146,51 @@ recovered == kp["private_key"] # => true
123
146
  - `.partial_decrypt(party_index, share_bytes, ciphertext)` → `{ party_index:, bytes: }`
124
147
  - `.aggregate_partials(partials, threshold, ciphertext)` → shared_secret bytes
125
148
 
149
+ === `Confium::TC::Cmp20` / `Confium::TC::Gg18` — threshold ECDSA protocols
150
+ - `.keygen(threshold, parties)` → `{ public_key, shares }`
151
+ - `.sign(shares, public_key, message)` → DER ECDSA signature
152
+
153
+ === `Confium::TC::Session` — per-party threshold sessions (real FROST)
154
+ - `Session.new(scheme, parties:, threshold:, this_party_idx:, local_share: nil, message: nil)` — `"FROST-ed25519-dkg"` for distributed key generation, `"FROST-ed25519"` for signing (pass the DKG share and the message)
155
+ - `#scheme_name` / `#threshold` / `#party_count` / `#this_party_idx` / `#round` / `#complete?`
156
+ - `#round_step(messages)` → `{ "outgoing" => [{from, to, round, payload}...], "complete" => bool }` — feed each round's incoming messages, broadcast the outgoing ones
157
+ - `#result` — after DKG: share blob (group public key + party share); after signing: RFC 8032 Ed25519 signature
158
+
159
+ === `Confium::TC::Coordinator` — quorum signing orchestration
160
+ - `Coordinator.new(quorum_id:)` / `#create_session(message:, threshold:, scheme: "CMP20-ECDSA-P256")` / `#submit_commitment` / `#submit_share` / `#aggregate` / `#session_state`
161
+ - `SigningSession#add_commitment` / `#add_share` / `#threshold_met?` / `#aggregate` — the seam every transport adapts to
162
+ - `NetworkCoordinator` — TCP/NDJSON server (`#start` / `#stop` / `#running?`); `SignerClient` — remote submit + aggregate with typed `RemoteError`
163
+ - `ShareFile` — encrypted share-file persistence
164
+
165
+ === `Confium::Store::Keystore` — key handles and remote signing
166
+ - `Keystore.new(backend, **options)` / `.backends`
167
+ - `#sign(key_id, algorithm, message)` → signature bytes (sign-with-handle contract; cloud KMS backends `aws-kms` / `gcp-kms` / `azure-keyvault` via cargo features)
168
+
169
+ === `Confium::Audit` — structured audit trail
170
+ - `Audit.sink =` / `Audit.sink` / `Audit.enabled?` / `Audit.record(...)`
171
+ - `Sink` (base) / `MemorySink` / `StderrSink` / `FileSink`
172
+ - `OtlpSink.new(endpoint:, headers:, service_name:, ...)` — OTLP/HTTP export with retry and `#dropped` counter
173
+
174
+ === `Confium::OpenPGP`
175
+ - `.armor(data, type)` / `.dearmor(data)` — RFC 9580 §6 ASCII armor with CRC-24 (pure Ruby)
176
+ - `.verify_detached(message, signature, keys)` / `.verify(...)` — real signature verification when the extension is built with the `pgp` feature; `PGP_AVAILABLE` reports it
177
+
178
+ === `Confium::Transport` — coordinator clients over any transport
179
+ - `SignerClient.new(url)` — connect over any registry transport: `tcp://host:port` (local/trusted) or `noise://host:port?key=<hex>&pinned=<hex>` (Noise_XX encrypted, stable identity + peer pinning)
180
+ - `#register(signer_id, quorum_id)` / `#create_session(quorum_id, scheme, message, threshold, num_parties)` → session id
181
+ - `#submit_commitment(session_id, signer_id, bytes)` / `#submit_share(session_id, signer_id, bytes)`
182
+ - `CoordinatorServer.new(url)` — serve coordinator sessions over any linked scheme (test/in-process use)
183
+
184
+ === `Confium::ERS` — evidence records
185
+ - `EvidenceRecord.build_initial(...)` / `#renew(...)` / `#renewal_count` (RFC 4998 / RFC 6283 archival)
186
+
187
+ === `Confium::Policy` / `Confium::SecureBytes`
188
+ - `Policy.jurisdiction = :eu` — jurisdictional algorithm policy (EU/US profiles; SM2/SM3/SM4 for CN planned)
189
+ - `SecureBytes.wrap(raw)` — zeroize-on-clear wrapper for private keys, shares, and secrets (`#bytes` non-destructive read, `#clear`)
190
+
191
+ === Errors
192
+ - Typed error hierarchy (`ParseError`, `ThresholdError`, `VerificationError`, `PolicyViolationError`, ...) — native failures surface positional `details` hashes (including DER byte offsets for parse errors)
193
+
126
194
  == Development
127
195
 
128
196
  After checking out the repo:
data/confium.gemspec CHANGED
@@ -40,6 +40,8 @@ Gem::Specification.new do |spec|
40
40
  ]
41
41
  spec.files.reject! { |f| File.directory?(f) }
42
42
  spec.files.reject! { |f| f =~ /\.(dll|so|dylib|lib|bundle)\Z/ }
43
+ # Windows socket diagnostic crate — development-only, never shipped.
44
+ spec.files.reject! { |f| f.start_with?('ext/socket-smoke/') }
43
45
  spec.require_paths = ['lib']
44
46
 
45
47
  spec.required_ruby_version = '>= 3.1.0'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Confium
4
- VERSION = '0.6.3'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: confium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Ribose Open
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-08-26 00:00:00.000000000 Z
11
+ date: 2026-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake