diff --git a/Cargo.lock b/Cargo.lock index ecb34e8..c2082bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -131,7 +131,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -142,7 +142,7 @@ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -239,6 +239,12 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -385,7 +391,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.0", ] [[package]] @@ -447,7 +453,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -608,7 +614,7 @@ checksum = "a851e4efac7afda4a5e1a11fea1d65ef528dbdcff08177d7087e4bb6225e60a9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -632,7 +638,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -643,7 +649,38 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.96", + "syn 2.0.119", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.12", ] [[package]] @@ -667,7 +704,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -719,7 +756,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -901,7 +938,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -1210,7 +1247,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -1268,7 +1305,7 @@ version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "libc", ] @@ -1296,6 +1333,48 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jiff" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "961d16382652bfdd8c6f68b223b26a8c93e0d475c672f414411db31c6c5c900e" +dependencies = [ + "defmt", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-static" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0879bd39df99c4c5e2c6615ccc026391a423dde10532c573e6086eb94a802cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jobserver" version = "0.1.32" @@ -1341,7 +1420,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags", + "bitflags 2.6.0", "libc", "redox_syscall", ] @@ -1531,8 +1610,7 @@ dependencies = [ [[package]] name = "olpc-cjson" version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "696183c9b5fe81a7715d074fd632e8bd46f4ccc0231a3ed7fc580a80de5f7083" +source = "git+https://github.com/oxidecomputer/tough?branch=oxide%2Fdevelop#56967c9651efcffd7326198f04fc388c4f0f92b9" dependencies = [ "serde", "serde_json", @@ -1621,7 +1699,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -1663,6 +1741,21 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1695,7 +1788,7 @@ checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", @@ -1800,7 +1893,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -1820,7 +1913,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -1873,7 +1966,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags", + "bitflags 2.6.0", "serde", "serde_derive", ] @@ -1912,7 +2005,7 @@ version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.14", @@ -1925,7 +2018,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.9.4", @@ -2046,7 +2139,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2096,7 +2189,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2107,7 +2200,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2169,7 +2262,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2329,7 +2422,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2369,7 +2462,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2380,7 +2473,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2402,7 +2495,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2424,9 +2517,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -2441,7 +2534,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2517,7 +2610,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2546,7 +2639,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2557,7 +2650,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2644,7 +2737,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2692,7 +2785,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -2766,20 +2859,19 @@ dependencies = [ [[package]] name = "tough" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8031cff0872dd1c6312370515a6be8098f6ea5512f1bad725016046fc725f272" +version = "0.24.0" +source = "git+https://github.com/oxidecomputer/tough?branch=oxide%2Fdevelop#56967c9651efcffd7326198f04fc388c4f0f92b9" dependencies = [ "async-recursion", "async-trait", "aws-lc-rs", "bytes", - "chrono", "dyn-clone", "futures", "futures-core", "globset", "hex", + "jiff", "log", "olpc-cjson", "pem", @@ -2815,6 +2907,7 @@ dependencies = [ "futures-util", "hex", "hubtools", + "jiff", "memchr", "rats-corim", "rawzip", @@ -3029,7 +3122,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", "wasm-bindgen-shared", ] @@ -3051,7 +3144,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3086,6 +3179,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.52.0" @@ -3183,7 +3282,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -3250,7 +3349,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", "synstructure", ] @@ -3291,7 +3390,7 @@ checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -3302,7 +3401,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -3313,7 +3412,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -3333,7 +3432,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", "synstructure", ] @@ -3354,7 +3453,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] @@ -3376,7 +3475,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.119", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7c1e0bc..948d5f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ flate2 = "1.0.35" futures-util = "0.3.31" hex = "0.4.3" hubtools = { git = "https://github.com/oxidecomputer/hubtools.git", rev = "2b1ef9b38d75563ea800baa3b17327eec17b1b7a" } +jiff = "0.2.32" memchr = "2.7.4" proptest = "1.5.0" rats-corim = { git = "https://github.com/oxidecomputer/rats-corim.git", rev = "f0d5d5168d3d31487a56df32c676b0c6240bcc6b" } @@ -51,7 +52,7 @@ test-strategy = "0.4.0" thiserror = "2.0.12" tokio = "1.47.0" tokio-test = "0.4.5" -tough = "0.22.0" +tough = { git = "https://github.com/oxidecomputer/tough", branch = "oxide/develop", version = "0.24.0" } tufaceous.path = "lib" tufaceous-artifact.path = "artifact" tufaceous-brand-metadata.path = "brand-metadata" diff --git a/lib/Cargo.toml b/lib/Cargo.toml index dc78a27..c27e33f 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -20,6 +20,7 @@ flate2.workspace = true futures-util.workspace = true hex.workspace = true hubtools.workspace = true +jiff.workspace = true rats-corim.workspace = true rawzip.workspace = true semver.workspace = true diff --git a/lib/src/edit/root.rs b/lib/src/edit/root.rs index da35189..15da9f4 100644 --- a/lib/src/edit/root.rs +++ b/lib/src/edit/root.rs @@ -11,6 +11,7 @@ use chrono::DateTime; use chrono::Utc; use serde::Deserialize; use serde::Serialize; +use tough::KeyIdFormat; use tough::editor::signed::SignedRole; use tough::key_source::KeySource; use tough::schema; @@ -21,6 +22,7 @@ use tough::schema::Signed; use crate::error::Error; use crate::error::ErrorKind; +use crate::util::chrono_to_jiff; #[derive(Debug, Clone, PartialEq, Eq)] pub struct Root { @@ -43,7 +45,7 @@ impl Root { pub fn verify_self_signed(&self) -> Result<(), Error> { self.inner .signed - .verify_role(&self.inner) + .verify_role(&self.inner, KeyIdFormat::Any) .map_err(ErrorKind::RoleVerify)?; Ok(()) } @@ -89,7 +91,7 @@ pub(crate) async fn generate_root( spec_version: "1.0.0".into(), consistent_snapshot: false, version: NonZero::::MIN, - expires, + expires: chrono_to_jiff(expires), keys: HashMap::new(), roles: HashMap::new(), _extra: HashMap::new(), diff --git a/lib/src/edit/sign.rs b/lib/src/edit/sign.rs index 9188312..33be3b2 100644 --- a/lib/src/edit/sign.rs +++ b/lib/src/edit/sign.rs @@ -37,6 +37,7 @@ use crate::edit::source::TargetSource; use crate::error::Error; use crate::error::ErrorKind; use crate::error::try_path; +use crate::util::chrono_to_jiff; pub(crate) const DEFAULT_VALIDITY: Duration = Duration::from_secs(60 * 60 * 24 * 7 /* 1 week */); @@ -162,11 +163,11 @@ impl<'a> UnsignedRepository<'a> { tough::editor::RepositoryEditor::new(&root_path).await?; editor .snapshot_version(self.snapshot_version) - .snapshot_expires(self.snapshot_expires) + .snapshot_expires(chrono_to_jiff(self.snapshot_expires)) .targets_version(self.targets_version)? - .targets_expires(self.targets_expires)? + .targets_expires(chrono_to_jiff(self.targets_expires))? .timestamp_version(self.timestamp_version) - .timestamp_expires(self.timestamp_expires); + .timestamp_expires(chrono_to_jiff(self.timestamp_expires)); let mut sources = BTreeMap::new(); for (target_name, Target { length, sha256, source }) in self.targets { diff --git a/lib/src/util.rs b/lib/src/util.rs index 97a7146..62f4f94 100644 --- a/lib/src/util.rs +++ b/lib/src/util.rs @@ -11,8 +11,12 @@ use std::task::Poll; use camino::FromPathBufError; use camino::Utf8Path; use camino::Utf8PathBuf; +use chrono::DateTime; +use chrono::Timelike as _; +use chrono::Utc; use flate2::read::GzDecoder; use futures_util::Stream; +use jiff::Timestamp; use tufaceous_artifact::Artifact; use tufaceous_artifact::ArtifactHash; use tufaceous_artifact::InstallinatorArtifact; @@ -131,3 +135,20 @@ pub(crate) fn error_chain(mut error: &dyn std::error::Error) -> String { } s } + +pub(crate) fn chrono_to_jiff(chrono: DateTime) -> Timestamp { + Timestamp::new( + chrono.timestamp(), + // Timestamp::new is documented to error out if the date is out of the supported range (not + // a problem for us) or if the nanoseconds are lower than -999_999_999 or greater than + // 999_999_999. Chrono documents that in case of leap seconds nanosecond() will return a + // value from 1_000_000_000 to 1_999_999_999, so we clamp that (jiff doesn't support leap + // seconds anyway). + chrono + .nanosecond() + .max(999_999_999) + .try_into() + .expect("nanosecond should be clamped"), + ) + .expect("couldn't convert timestamp") +}