From ffe5f37c8bf1e485c3d2cef432a5d3c7733e429a Mon Sep 17 00:00:00 2001 From: "cipherstash-release-plz[bot]" <262324448+cipherstash-release-plz[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 09:50:11 +0000 Subject: [PATCH 1/3] chore: release v0.7.0 --- Cargo.lock | 40 +++++++++++++------------- Cargo.toml | 2 +- packages/aead-derive/CHANGELOG.md | 2 ++ packages/aead-frame/CHANGELOG.md | 2 ++ packages/aead-frame/Cargo.toml | 2 +- packages/aead-napi/CHANGELOG.md | 2 ++ packages/aead-napi/Cargo.toml | 4 +-- packages/aead/CHANGELOG.md | 2 ++ packages/aead/Cargo.toml | 8 +++--- packages/async-traits/CHANGELOG.md | 2 ++ packages/async-traits/Cargo.toml | 4 +-- packages/context/CHANGELOG.md | 2 ++ packages/context/Cargo.toml | 2 +- packages/encrypt/CHANGELOG.md | 2 ++ packages/encrypt/Cargo.toml | 8 +++--- packages/hmac/CHANGELOG.md | 2 ++ packages/hmac/Cargo.toml | 4 +-- packages/kms/CHANGELOG.md | 2 ++ packages/kms/Cargo.toml | 6 ++-- packages/normalize/CHANGELOG.md | 10 +++++++ packages/normalize/Cargo.toml | 4 +-- packages/ore/CHANGELOG.md | 26 +++++++++++++++++ packages/ore/Cargo.toml | 8 +++--- packages/password/CHANGELOG.md | 2 ++ packages/password/Cargo.toml | 4 +-- packages/permutation/CHANGELOG.md | 2 ++ packages/permutation/Cargo.toml | 4 +-- packages/prf/CHANGELOG.md | 2 ++ packages/prf/Cargo.toml | 8 +++--- packages/protected-derive/CHANGELOG.md | 2 ++ packages/protected/CHANGELOG.md | 2 ++ packages/protected/Cargo.toml | 2 +- packages/random-derives/CHANGELOG.md | 2 ++ packages/random/CHANGELOG.md | 2 ++ packages/random/Cargo.toml | 4 +-- packages/traits/CHANGELOG.md | 2 ++ packages/traits/Cargo.toml | 4 +-- packages/vitaminc/CHANGELOG.md | 2 ++ packages/vitaminc/Cargo.toml | 26 ++++++++--------- 39 files changed, 144 insertions(+), 72 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 129922af..bd575647 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2639,7 +2639,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vitaminc" -version = "0.6.1" +version = "0.7.0" dependencies = [ "vitaminc", "vitaminc-aead", @@ -2659,7 +2659,7 @@ dependencies = [ [[package]] name = "vitaminc-aead" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bytes", "chrono", @@ -2683,7 +2683,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", @@ -2692,7 +2692,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-frame" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "quickcheck", @@ -2709,7 +2709,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-napi" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "mutants", @@ -2723,7 +2723,7 @@ dependencies = [ [[package]] name = "vitaminc-async-traits" -version = "0.6.1" +version = "0.7.0" dependencies = [ "vitaminc-protected", "vitaminc-traits", @@ -2731,7 +2731,7 @@ dependencies = [ [[package]] name = "vitaminc-context" -version = "0.6.1" +version = "0.7.0" dependencies = [ "mutants", "quickcheck", @@ -2741,7 +2741,7 @@ dependencies = [ [[package]] name = "vitaminc-encrypt" -version = "0.6.1" +version = "0.7.0" dependencies = [ "aes-gcm", "aws-lc-rs", @@ -2756,7 +2756,7 @@ dependencies = [ [[package]] name = "vitaminc-hmac" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "futures", @@ -2776,7 +2776,7 @@ dependencies = [ [[package]] name = "vitaminc-kms" -version = "0.6.1" +version = "0.7.0" dependencies = [ "aws-config", "aws-sdk-kms", @@ -2790,7 +2790,7 @@ dependencies = [ [[package]] name = "vitaminc-normalize" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "futures-executor", @@ -2808,7 +2808,7 @@ dependencies = [ [[package]] name = "vitaminc-ore" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "orderable-bytes", @@ -2830,7 +2830,7 @@ dependencies = [ [[package]] name = "vitaminc-password" -version = "0.6.1" +version = "0.7.0" dependencies = [ "vitaminc-protected", "vitaminc-random", @@ -2838,7 +2838,7 @@ dependencies = [ [[package]] name = "vitaminc-permutation" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bitvec", "rand 0.10.3", @@ -2852,7 +2852,7 @@ dependencies = [ [[package]] name = "vitaminc-prf" -version = "0.6.1" +version = "0.7.0" dependencies = [ "mutants", "quickcheck", @@ -2866,7 +2866,7 @@ dependencies = [ [[package]] name = "vitaminc-protected" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bitvec", "digest 0.11.2", @@ -2888,7 +2888,7 @@ dependencies = [ [[package]] name = "vitaminc-protected-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "vitaminc-random" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -2912,7 +2912,7 @@ dependencies = [ [[package]] name = "vitaminc-random-derives" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", @@ -2921,7 +2921,7 @@ dependencies = [ [[package]] name = "vitaminc-traits" -version = "0.6.1" +version = "0.7.0" dependencies = [ "anyhow", "bytes", diff --git a/Cargo.toml b/Cargo.toml index d96e0131..9d359972 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ members = [ [workspace.package] documentation = "https://docs.rs/vitaminc" -version = "0.6.1" +version = "0.7.0" repository = "https://github.com/cipherstash/vitaminc" authors = [ "Dan Draper ", diff --git a/packages/aead-derive/CHANGELOG.md b/packages/aead-derive/CHANGELOG.md index c2736a76..a237c1c3 100644 --- a/packages/aead-derive/CHANGELOG.md +++ b/packages/aead-derive/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/aead-frame/CHANGELOG.md b/packages/aead-frame/CHANGELOG.md index 74e8cdaa..9e09210b 100644 --- a/packages/aead-frame/CHANGELOG.md +++ b/packages/aead-frame/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ### Features diff --git a/packages/aead-frame/Cargo.toml b/packages/aead-frame/Cargo.toml index e4d9f8c3..0a3edb13 100644 --- a/packages/aead-frame/Cargo.toml +++ b/packages/aead-frame/Cargo.toml @@ -16,7 +16,7 @@ rust-version.workspace = true all-features = true [dependencies] -vitaminc-aead = { version = "0.6.1", path = "../aead" } +vitaminc-aead = { version = "0.7.0", path = "../aead" } serde = { workspace = true, optional = true } zeroize = { workspace = true, optional = true } diff --git a/packages/aead-napi/CHANGELOG.md b/packages/aead-napi/CHANGELOG.md index b4319de7..012fefd6 100644 --- a/packages/aead-napi/CHANGELOG.md +++ b/packages/aead-napi/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/aead-napi/Cargo.toml b/packages/aead-napi/Cargo.toml index a7d5b7c1..cedf6a7e 100644 --- a/packages/aead-napi/Cargo.toml +++ b/packages/aead-napi/Cargo.toml @@ -16,8 +16,8 @@ rust-version.workspace = true chrono = { version = "0.4.44", default-features = false, features = ["std"] } rust_decimal = { version = "1.41", default-features = false, features = ["std"] } thiserror.workspace = true -vitaminc-aead = { version = "0.6.1", path = "../aead", features = ["chrono", "rust_decimal"] } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-aead = { version = "0.7.0", path = "../aead", features = ["chrono", "rust_decimal"] } +vitaminc-protected = { version = "0.7.0", path = "../protected" } # napi5 (Node ≥ 12) is needed for Date detection; napi6 (implies napi5) for # BigInt and for `napi_get_all_property_names` — the only own-property diff --git a/packages/aead/CHANGELOG.md b/packages/aead/CHANGELOG.md index 5b28cac6..826a8aba 100644 --- a/packages/aead/CHANGELOG.md +++ b/packages/aead/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ### Features diff --git a/packages/aead/Cargo.toml b/packages/aead/Cargo.toml index 3ace973d..a6e560d9 100644 --- a/packages/aead/Cargo.toml +++ b/packages/aead/Cargo.toml @@ -13,10 +13,10 @@ categories.workspace = true rust-version.workspace = true [dependencies] -vitaminc-aead-derive = { version = "0.6.1", path = "../aead-derive" } -vitaminc-context = { version = "0.6.1", path = "../context" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } -vitaminc-random = { version = "0.6.1", path = "../random" } +vitaminc-aead-derive = { version = "0.7.0", path = "../aead-derive" } +vitaminc-context = { version = "0.7.0", path = "../context" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } +vitaminc-random = { version = "0.7.0", path = "../random" } bytes = { version = "^1", features = ["serde"] } serde = { workspace = true } diff --git a/packages/async-traits/CHANGELOG.md b/packages/async-traits/CHANGELOG.md index 296a78c4..6caba4a3 100644 --- a/packages/async-traits/CHANGELOG.md +++ b/packages/async-traits/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/async-traits/Cargo.toml b/packages/async-traits/Cargo.toml index 3722ba6a..22df03b0 100644 --- a/packages/async-traits/Cargo.toml +++ b/packages/async-traits/Cargo.toml @@ -13,5 +13,5 @@ categories.workspace = true rust-version.workspace = true [dependencies] -vitaminc-protected = { version = "0.6.1", path = "../protected" } -vitaminc-traits = { version = "0.6.1", path = "../traits" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } +vitaminc-traits = { version = "0.7.0", path = "../traits" } diff --git a/packages/context/CHANGELOG.md b/packages/context/CHANGELOG.md index bb4a2df6..f0667f88 100644 --- a/packages/context/CHANGELOG.md +++ b/packages/context/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/context/Cargo.toml b/packages/context/Cargo.toml index 90c2a2a6..45ded657 100644 --- a/packages/context/Cargo.toml +++ b/packages/context/Cargo.toml @@ -14,7 +14,7 @@ rust-version.workspace = true [dependencies] mutants = "0.0.4" -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } quickcheck = { version = "1.1.0", optional = true } diff --git a/packages/encrypt/CHANGELOG.md b/packages/encrypt/CHANGELOG.md index e06b8571..5df0adf7 100644 --- a/packages/encrypt/CHANGELOG.md +++ b/packages/encrypt/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/encrypt/Cargo.toml b/packages/encrypt/Cargo.toml index d2f541af..08830c75 100644 --- a/packages/encrypt/Cargo.toml +++ b/packages/encrypt/Cargo.toml @@ -13,9 +13,9 @@ categories.workspace = true rust-version.workspace = true [dependencies] -vitaminc-aead = { version = "0.6.1", path = "../aead" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } -vitaminc-random = { version = "0.6.1", path = "../random" } +vitaminc-aead = { version = "0.7.0", path = "../aead" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } +vitaminc-random = { version = "0.7.0", path = "../random" } zeroize = { workspace = true } @@ -47,7 +47,7 @@ _test-rust-crypto-backend = ["dep:aes-gcm"] hlist = ["vitaminc-aead/hlist"] [dev-dependencies] -vitaminc-protected = { path = "../protected", version = "0.6.1", features = ["arbitrary"] } +vitaminc-protected = { path = "../protected", version = "0.7.0", features = ["arbitrary"] } quickcheck = "1.1.0" quickcheck_macros = "1.2.0" diff --git a/packages/hmac/CHANGELOG.md b/packages/hmac/CHANGELOG.md index 2fe39cee..0a7eac48 100644 --- a/packages/hmac/CHANGELOG.md +++ b/packages/hmac/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/hmac/Cargo.toml b/packages/hmac/Cargo.toml index bfbd8711..93437811 100644 --- a/packages/hmac/Cargo.toml +++ b/packages/hmac/Cargo.toml @@ -15,8 +15,8 @@ rust-version.workspace = true [dependencies] hmac = { version = "0.13.0", features = ["zeroize"] } sha2 = { version = "0.11.0", features = ["zeroize"] } -vitaminc-prf = { version = "0.6.1", path = "../prf" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-prf = { version = "0.7.0", path = "../prf" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } zeroize = { workspace = true } [dev-dependencies] diff --git a/packages/kms/CHANGELOG.md b/packages/kms/CHANGELOG.md index da637416..983bf509 100644 --- a/packages/kms/CHANGELOG.md +++ b/packages/kms/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/kms/Cargo.toml b/packages/kms/Cargo.toml index dbef0dd4..4e500108 100644 --- a/packages/kms/Cargo.toml +++ b/packages/kms/Cargo.toml @@ -14,9 +14,9 @@ categories.workspace = true rust-version = "1.94.1" [dependencies] -vitaminc-async-traits = { version = "0.6.1", path = "../async-traits" } -vitaminc-traits = { version = "0.6.1", path = "../traits" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-async-traits = { version = "0.7.0", path = "../async-traits" } +vitaminc-traits = { version = "0.7.0", path = "../traits" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } aws-sdk-kms = "1.109.0" aws-config = "1.8.18" diff --git a/packages/normalize/CHANGELOG.md b/packages/normalize/CHANGELOG.md index 1e0e8c83..479320ee 100644 --- a/packages/normalize/CHANGELOG.md +++ b/packages/normalize/CHANGELOG.md @@ -1,4 +1,14 @@ +## [0.7.0] - 2026-10-20 + +### Documentation + +- say exactly when the normalization buffers move to the heap and what they leave behind + +### Fixes + +- have each encoder own the wiped buffer it writes, so no caller can pass one that is not + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/normalize/Cargo.toml b/packages/normalize/Cargo.toml index bb18e913..8ef8cf72 100644 --- a/packages/normalize/Cargo.toml +++ b/packages/normalize/Cargo.toml @@ -13,8 +13,8 @@ categories.workspace = true rust-version.workspace = true [dependencies] -vitaminc-aead = { version = "0.6.1", path = "../aead" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-aead = { version = "0.7.0", path = "../aead" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } thiserror = { workspace = true } # NFC is stable for assigned code points, and the Unicode 16 assignment check diff --git a/packages/ore/CHANGELOG.md b/packages/ore/CHANGELOG.md index c71e5b8f..f327a26f 100644 --- a/packages/ore/CHANGELOG.md +++ b/packages/ore/CHANGELOG.md @@ -1,4 +1,30 @@ +## [0.7.0] - 2026-10-20 + +### Breaking + +- **Breaking:** typed targets and a chained API, with OrderColumn renamed to OrderSpace +- **Breaking:** start the text and bytes order encodings with a marker byte, so no order plaintext is empty +- **Breaking:** let a scheme derive its keys once per space, not once per term +- **Breaking:** open takes the space's target as well as its salt +- **Breaking:** require an order space to wipe itself on drop +- **Breaking:** remove the one-byte order targets, I8 and U8 + +### Documentation + +- say what a query's type prevents and why not to keep one +- say a query is guarded against being kept, not wiped from memory +- say exactly when the normalization buffers move to the heap and what they leave behind + +### Features + +- OrderQuery, the query side of an order scheme + +### Fixes + +- mask a query's bytes in Debug, and test the query checks that had none +- write an integer's order encoding straight into the wiped buffer that is returned, so no plain copy is made + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/ore/Cargo.toml b/packages/ore/Cargo.toml index fefc2eb4..77db4de6 100644 --- a/packages/ore/Cargo.toml +++ b/packages/ore/Cargo.toml @@ -19,16 +19,16 @@ rust-version.workspace = true exclude = ["tools/"] [dependencies] -vitaminc-aead = { version = "0.6.1", path = "../aead" } +vitaminc-aead = { version = "0.7.0", path = "../aead" } # The typed values callers hold, for the rows of the `FitsIn` and # `OwnTarget` tables that name them. Each turns on the matching # `vitaminc-aead` feature, which has the `Encrypt` impls. chrono = { version = "0.4.44", default-features = false, features = ["std"], optional = true } rust_decimal = { version = "1.41", default-features = false, features = ["std"], optional = true } uuid = { version = "1", default-features = false, optional = true } -vitaminc-context = { version = "0.6.1", path = "../context" } -vitaminc-normalize = { version = "0.6.1", path = "../normalize" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-context = { version = "0.7.0", path = "../context" } +vitaminc-normalize = { version = "0.7.0", path = "../normalize" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } zeroize = { workspace = true } thiserror = { workspace = true } diff --git a/packages/password/CHANGELOG.md b/packages/password/CHANGELOG.md index b5ce414f..4a075a5b 100644 --- a/packages/password/CHANGELOG.md +++ b/packages/password/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/password/Cargo.toml b/packages/password/Cargo.toml index ffc2f177..05b77725 100644 --- a/packages/password/Cargo.toml +++ b/packages/password/Cargo.toml @@ -14,5 +14,5 @@ rust-version.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -vitaminc-random = { version = "0.6.1", path = "../random" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-random = { version = "0.7.0", path = "../random" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } diff --git a/packages/permutation/CHANGELOG.md b/packages/permutation/CHANGELOG.md index 9ce2f923..5fb8f7a0 100644 --- a/packages/permutation/CHANGELOG.md +++ b/packages/permutation/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/permutation/Cargo.toml b/packages/permutation/Cargo.toml index ec1a8d97..299fa42d 100644 --- a/packages/permutation/Cargo.toml +++ b/packages/permutation/Cargo.toml @@ -13,8 +13,8 @@ categories.workspace = true rust-version.workspace = true [dependencies] -vitaminc-protected = { version = "0.6.1", path = "../protected", features = ["bitvec"] } -vitaminc-random = { version = "0.6.1", path = "../random" } +vitaminc-protected = { version = "0.7.0", path = "../protected", features = ["bitvec"] } +vitaminc-random = { version = "0.7.0", path = "../random" } bitvec = { workspace = true } rand = { workspace = true } diff --git a/packages/prf/CHANGELOG.md b/packages/prf/CHANGELOG.md index 15dbe5cf..8392306e 100644 --- a/packages/prf/CHANGELOG.md +++ b/packages/prf/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/prf/Cargo.toml b/packages/prf/Cargo.toml index 64e812d6..09a8bcea 100644 --- a/packages/prf/Cargo.toml +++ b/packages/prf/Cargo.toml @@ -20,12 +20,12 @@ default = [] normalize = ["dep:vitaminc-normalize", "dep:vitaminc-aead"] [dependencies] -vitaminc-normalize = { version = "0.6.1", path = "../normalize", optional = true } -vitaminc-aead = { version = "0.6.1", path = "../aead", optional = true } +vitaminc-normalize = { version = "0.7.0", path = "../normalize", optional = true } +vitaminc-aead = { version = "0.7.0", path = "../aead", optional = true } mutants = "0.0.4" thiserror = { workspace = true } -vitaminc-context = { version = "0.6.1", path = "../context" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-context = { version = "0.7.0", path = "../context" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } [dev-dependencies] quickcheck = "1.1.0" diff --git a/packages/protected-derive/CHANGELOG.md b/packages/protected-derive/CHANGELOG.md index 80c3c5e1..44ba825f 100644 --- a/packages/protected-derive/CHANGELOG.md +++ b/packages/protected-derive/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/protected/CHANGELOG.md b/packages/protected/CHANGELOG.md index b9f613d9..b7b0c2c5 100644 --- a/packages/protected/CHANGELOG.md +++ b/packages/protected/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/protected/Cargo.toml b/packages/protected/Cargo.toml index b4c67060..9f358ff1 100644 --- a/packages/protected/Cargo.toml +++ b/packages/protected/Cargo.toml @@ -24,7 +24,7 @@ digest = { version = "0.11.2", features = ["mac"] } subtle = "2.6.1" quickcheck = { version = "1.1.0", optional = true } -vitaminc-protected-derive = { path = "../protected-derive", version = "0.6.1" } +vitaminc-protected-derive = { path = "../protected-derive", version = "0.7.0" } [target.'cfg(unix)'.dependencies] libc = { workspace = true } diff --git a/packages/random-derives/CHANGELOG.md b/packages/random-derives/CHANGELOG.md index 3e882123..3ef859aa 100644 --- a/packages/random-derives/CHANGELOG.md +++ b/packages/random-derives/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/random/CHANGELOG.md b/packages/random/CHANGELOG.md index 56e6ed10..2954cf86 100644 --- a/packages/random/CHANGELOG.md +++ b/packages/random/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/random/Cargo.toml b/packages/random/Cargo.toml index 7594bfa0..0207290b 100644 --- a/packages/random/Cargo.toml +++ b/packages/random/Cargo.toml @@ -27,8 +27,8 @@ zeroize = { workspace = true } # `safe_rand.rs` asserts the impl exists at compile time. chacha20 = { version = "0.10", default-features = false, features = ["zeroize"] } -vitaminc-random-derives = { version = "0.6.1", path = "../random-derives" } -vitaminc-protected = { version = "0.6.1", path = "../protected" } +vitaminc-random-derives = { version = "0.7.0", path = "../random-derives" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } # Wasm32: route `getrandom` to the browser/Deno crypto API. Pulled in # transitively via `rand` -> `getrandom 0.4`. Must be paired with the diff --git a/packages/traits/CHANGELOG.md b/packages/traits/CHANGELOG.md index e6126f27..0ceb6e77 100644 --- a/packages/traits/CHANGELOG.md +++ b/packages/traits/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/traits/Cargo.toml b/packages/traits/Cargo.toml index 140a31c1..95136d79 100644 --- a/packages/traits/Cargo.toml +++ b/packages/traits/Cargo.toml @@ -14,8 +14,8 @@ rust-version.workspace = true [dependencies] rmp-serde = "1.3.1" -vitaminc-protected = { version = "0.6.1", path = "../protected" } -vitaminc-random = { version = "0.6.1", path = "../random" } +vitaminc-protected = { version = "0.7.0", path = "../protected" } +vitaminc-random = { version = "0.7.0", path = "../random" } serde = { workspace = true } thiserror = { workspace = true } diff --git a/packages/vitaminc/CHANGELOG.md b/packages/vitaminc/CHANGELOG.md index 3fab0602..672dcc68 100644 --- a/packages/vitaminc/CHANGELOG.md +++ b/packages/vitaminc/CHANGELOG.md @@ -1,4 +1,6 @@ +## [0.7.0] - 2026-10-20 + ## [0.6.1] - 2026-10-18 ## [0.6.0] - 2026-10-17 diff --git a/packages/vitaminc/Cargo.toml b/packages/vitaminc/Cargo.toml index beeb3480..58fd5b3f 100644 --- a/packages/vitaminc/Cargo.toml +++ b/packages/vitaminc/Cargo.toml @@ -16,19 +16,19 @@ rust-version.workspace = true all-features = true [dependencies] -vitaminc-context = { path = "../context", version = "0.6.1", optional = true } -vitaminc-kms = { path = "../kms", version = "0.6.1", optional = true } -vitaminc-permutation = { path = "../permutation", version = "0.6.1", optional = true } -vitaminc-prf = { path = "../prf", version = "0.6.1", optional = true } -vitaminc-hmac = { path = "../hmac", version = "0.6.1", optional = true } -vitaminc-protected = { path = "../protected", version = "0.6.1", optional = true } -vitaminc-random = { path = "../random", version = "0.6.1", optional = true } -vitaminc-traits = { path = "../traits", version = "0.6.1", optional = true } -vitaminc-async-traits = { path = "../async-traits", version = "0.6.1", optional = true } -vitaminc-encrypt = { path = "../encrypt", version = "0.6.1", optional = true } -vitaminc-aead = { path = "../aead", version = "0.6.1", optional = true } -vitaminc-normalize = { path = "../normalize", version = "0.6.1", optional = true } -vitaminc-ore = { path = "../ore", version = "0.6.1", optional = true } +vitaminc-context = { path = "../context", version = "0.7.0", optional = true } +vitaminc-kms = { path = "../kms", version = "0.7.0", optional = true } +vitaminc-permutation = { path = "../permutation", version = "0.7.0", optional = true } +vitaminc-prf = { path = "../prf", version = "0.7.0", optional = true } +vitaminc-hmac = { path = "../hmac", version = "0.7.0", optional = true } +vitaminc-protected = { path = "../protected", version = "0.7.0", optional = true } +vitaminc-random = { path = "../random", version = "0.7.0", optional = true } +vitaminc-traits = { path = "../traits", version = "0.7.0", optional = true } +vitaminc-async-traits = { path = "../async-traits", version = "0.7.0", optional = true } +vitaminc-encrypt = { path = "../encrypt", version = "0.7.0", optional = true } +vitaminc-aead = { path = "../aead", version = "0.7.0", optional = true } +vitaminc-normalize = { path = "../normalize", version = "0.7.0", optional = true } +vitaminc-ore = { path = "../ore", version = "0.7.0", optional = true } [features] protected = ["dep:vitaminc-protected"] From b68b71c99f0d9d5ab5c72b3c7e7439050bfab145 Mon Sep 17 00:00:00 2001 From: "cipherstash-release-plz[bot]" <262324448+cipherstash-release-plz[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 09:50:16 +0000 Subject: [PATCH 2/3] chore: re-sync the nested lockfiles to the release version --- bindings/go/vcencrypt/guest/Cargo.lock | 18 +++++++++--------- packages/aead-napi/tests/addon/Cargo.lock | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/bindings/go/vcencrypt/guest/Cargo.lock b/bindings/go/vcencrypt/guest/Cargo.lock index fd259eaf..d9d24c1f 100644 --- a/bindings/go/vcencrypt/guest/Cargo.lock +++ b/bindings/go/vcencrypt/guest/Cargo.lock @@ -649,7 +649,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vitaminc-aead" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bytes", "futures-util", @@ -664,7 +664,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", @@ -673,14 +673,14 @@ dependencies = [ [[package]] name = "vitaminc-aead-frame" -version = "0.6.1" +version = "0.7.0" dependencies = [ "vitaminc-aead", ] [[package]] name = "vitaminc-context" -version = "0.6.1" +version = "0.7.0" dependencies = [ "mutants", "vitaminc-protected", @@ -688,7 +688,7 @@ dependencies = [ [[package]] name = "vitaminc-encrypt" -version = "0.6.1" +version = "0.7.0" dependencies = [ "aes-gcm", "aws-lc-rs", @@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "vitaminc-protected" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bitvec", "digest", @@ -715,7 +715,7 @@ dependencies = [ [[package]] name = "vitaminc-protected-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -725,7 +725,7 @@ dependencies = [ [[package]] name = "vitaminc-random" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chacha20", "getrandom", @@ -738,7 +738,7 @@ dependencies = [ [[package]] name = "vitaminc-random-derives" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", diff --git a/packages/aead-napi/tests/addon/Cargo.lock b/packages/aead-napi/tests/addon/Cargo.lock index d4c42d20..498cbbe5 100644 --- a/packages/aead-napi/tests/addon/Cargo.lock +++ b/packages/aead-napi/tests/addon/Cargo.lock @@ -1019,7 +1019,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vitaminc-aead" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bytes", "chrono", @@ -1036,7 +1036,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", @@ -1045,7 +1045,7 @@ dependencies = [ [[package]] name = "vitaminc-aead-napi" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chrono", "mutants", @@ -1059,7 +1059,7 @@ dependencies = [ [[package]] name = "vitaminc-context" -version = "0.6.1" +version = "0.7.0" dependencies = [ "mutants", "vitaminc-protected", @@ -1067,7 +1067,7 @@ dependencies = [ [[package]] name = "vitaminc-encrypt" -version = "0.6.1" +version = "0.7.0" dependencies = [ "aes-gcm", "aws-lc-rs", @@ -1092,7 +1092,7 @@ dependencies = [ [[package]] name = "vitaminc-protected" -version = "0.6.1" +version = "0.7.0" dependencies = [ "bitvec", "digest", @@ -1107,7 +1107,7 @@ dependencies = [ [[package]] name = "vitaminc-protected-derive" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "vitaminc-random" -version = "0.6.1" +version = "0.7.0" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -1130,7 +1130,7 @@ dependencies = [ [[package]] name = "vitaminc-random-derives" -version = "0.6.1" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", From 172b84b048dce92a5bd5da0f5ed47740c62c6607 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 20 Oct 2026 20:57:57 +1100 Subject: [PATCH 3/3] docs: rewrite the 0.7.0 changelogs for ore and normalize from the caller's side State that 0.6 order terms stay valid, what a scheme crate must change, and what a query and the text normalization buffers do not guarantee. --- packages/normalize/CHANGELOG.md | 8 ++++---- packages/ore/CHANGELOG.md | 33 +++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/normalize/CHANGELOG.md b/packages/normalize/CHANGELOG.md index 479320ee..35c601cd 100644 --- a/packages/normalize/CHANGELOG.md +++ b/packages/normalize/CHANGELOG.md @@ -1,13 +1,13 @@ ## [0.7.0] - 2026-10-20 -### Documentation +### Fixes -- say exactly when the normalization buffers move to the heap and what they leave behind +- Each fixed-width and decimal encoder writes straight into the wiped buffer it returns, so no unwiped intermediate copy of an encoded value is made. The encoded bytes, and so stored terms, do not change. -### Fixes +### Not guaranteed -- have each encoder own the wiped buffer it writes, so no caller can pass one that is not +- `vitaminc_normalize::text` runs text through the `unicode-normalization` iterators, whose small internal buffers move to the heap as soon as a character's combining marks pass four code points (four marks followed by any character is enough), and are then freed without being wiped. This is outside this crate's control (#488). ## [0.6.1] - 2026-10-18 diff --git a/packages/ore/CHANGELOG.md b/packages/ore/CHANGELOG.md index f327a26f..b2b8352d 100644 --- a/packages/ore/CHANGELOG.md +++ b/packages/ore/CHANGELOG.md @@ -1,29 +1,34 @@ ## [0.7.0] - 2026-10-20 +Order terms stored by 0.6 stay valid and compare with terms made by 0.7: the encodings, the domain labels and the salt do not change. The exceptions are the removed one-byte targets, and a scheme crate that added its own text and bytes marker byte, which it must now drop (see below). + ### Breaking -- **Breaking:** typed targets and a chained API, with OrderColumn renamed to OrderSpace -- **Breaking:** start the text and bytes order encodings with a marker byte, so no order plaintext is empty -- **Breaking:** let a scheme derive its keys once per space, not once per term -- **Breaking:** open takes the space's target as well as its salt -- **Breaking:** require an order space to wipe itself on drop -- **Breaking:** remove the one-byte order targets, I8 and U8 +- **Breaking:** A space's target is a type when it is known at compile time: `scheme.target(I32).context(ctx).encrypt(v)`, with one marker per target in `vitaminc_ore::target`. `encrypt` takes only a value that always fits (`FitsIn`), so `encrypt(42i64)` into an `I32` space no longer compiles, and it returns the scheme's own error. `scheme.encrypt(v)` uses the value's own target and the empty context. For a target chosen at runtime, pass an `OrderTarget` to `target(..)` and call `encrypt_checked`, which is 0.6's `encrypt`. +- **Breaking:** `OrderColumn` is renamed `OrderSpace`. `column(target, context)` and the `OrderColumn` alias stay, deprecated, for one release; on them, call `encrypt_checked` where you called `encrypt`. +- **Breaking:** Encryption returns an `OrderTerm` that carries its target, and `compare` takes two of them. Terms of two different marker targets cannot be compared, which is a compile error; under an `OrderTarget`, `compare` returns `None` for terms of different targets. Store `term.into_raw()`, and turn a term read back into the space's own with `space.term(raw)`. +- **Breaking:** The one-byte targets are gone: `OrderTarget::I8` and `U8`, their markers, and the `INT8` and `UINT8` domain labels. An order over 256 possible values gives the values away. An `i8` or `u8` still goes into `I16` or wider, but `scheme.encrypt(42i8)` does not compile: name a wider target, or use an equality index. Terms made under `I8` or `U8` do not compare with terms of a wider target, so an index built with them has to be re-encrypted. +- **Breaking:** For scheme authors, `OrderScheme` gains `type Space` and `open(&self, target, salt)`, which derives a space's keys once rather than once per term (about 20% of the cost of an `i64` term under block ORE). `encrypt_plaintext` takes the opened space instead of the salt, and returns `Self::Error` instead of `OrderError`. `open` may run more than once for one space, so it must be a pure derivation from the key, target and salt. +- **Breaking:** For scheme authors, `OrderScheme::Space` must be `ZeroizeOnDrop`, so a `Vec` of derived keys does not compile. Use `Protected`, a cipher that wipes itself on drop, or `()`. +- **Breaking:** For scheme authors, a scheme declares the targets it takes by implementing `Supports`, with `supports_targets!(Scheme; I16, ...)` or `supports_every_target!(Scheme)`. Naming an unsupported marker target does not compile, and an unsupported `OrderTarget` is refused with `OrderError::Unsupported` before the scheme is called. `OrderError::unsupported` is removed. +- **Breaking:** For scheme authors, text and bytes plaintexts now start with `VARIABLE_WIDTH_MARKER` (`0x01`), so an `OrderPlaintext` is never empty. An empty plaintext made a term that depended on neither the key nor the salt, so anyone could write a valid-looking term into any index. A scheme crate that already added this byte itself must stop doing so, or its text and bytes terms change. -### Documentation +### Features -- say what a query's type prevents and why not to keep one -- say a query is guarded against being kept, not wiped from memory -- say exactly when the normalization buffers move to the heap and what they leave behind +- `OrderQuery`, the query side of an order scheme. Under block ORE a query is the left half of a term only, smaller and cheaper than a stored term. Make one with `space.encrypt_query(v)` or `encrypt_query_checked`, and order it against stored terms with `space.compare_query(&query, &term)`. A `QueryTerm` is labelled with its target and is a type of its own, so it cannot be compared where a term is expected, and its `Debug` masks its bytes. A scheme whose terms are their own queries, as the CLWW schemes' are, implements it with `Query = Term`. +- `OrderSpace::open` opens a space's scheme up front, so a scheme that cannot open reports it before any value is encrypted. Otherwise a space opens at its first value. Reuse a space across terms to get the per-space key derivation. A space is `Send` and `Sync` when the scheme and its `Space` are. +- A `test-support` feature with `test_support::conformance`, `query_conformance` and `static_target`, which a scheme crate runs against its real scheme. They fail a term that is the same under another key or context, an order the scheme does not keep, and a `Supports` impl that the runtime answer contradicts. -### Features +### Not guaranteed -- OrderQuery, the query side of an order scheme +- Do not persist or log a query. Beside the stored terms it orders every one of them against the searched value, and block ORE queries are deterministic, so two equal queries mean two searches for the same value. The type only keeps a query out of `compare`: its bytes are bytes, and written in a term's place they make every later `compare` under block ORE return `None`. +- A query is not wiped from memory. It is sent to the database, which sees it by design, and the process that made it already holds the value and the key. +- Text order terms are normalized through the `unicode-normalization` iterators, whose small internal buffers move to the heap as soon as a character's combining marks pass four code points, and are then freed without being wiped. This is outside this crate's control (#488). ### Fixes -- mask a query's bytes in Debug, and test the query checks that had none -- write an integer's order encoding straight into the wiped buffer that is returned, so no plain copy is made +- An integer's order encoding is written straight into the wiped buffer that is returned, so no unwiped copy is made. The encoded bytes do not change. ## [0.6.1] - 2026-10-18