From 50019bbc3b898215f39c4b327bc2203f8c62df6a Mon Sep 17 00:00:00 2001 From: Mike Beaumont Date: Sat, 12 Sep 2026 20:30:40 +0200 Subject: [PATCH] chore(deps): update cosey to 0.4.0 and ctap-types to 0.5.0 --- Cargo.lock | 134 +++++++++++++----- libwebauthn/Cargo.toml | 5 +- libwebauthn/src/ops/u2f.rs | 27 ++-- .../src/ops/webauthn/make_credential.rs | 8 +- libwebauthn/src/pin/mod.rs | 13 +- libwebauthn/src/proto/ctap2/cose.rs | 4 +- .../src/proto/ctap2/model/make_credential.rs | 12 +- libwebauthn/src/webauthn/pin_uv_auth_token.rs | 4 +- 8 files changed, 134 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c6e91e53..45023739 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,7 +16,7 @@ checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", "generic-array", - "heapless", + "heapless 0.7.17", ] [[package]] @@ -126,7 +126,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce391931a2cc4597eaf0d464db9d4d5e1939ccc8dd6eda0f86cda117e914c02d" dependencies = [ - "iso7816", + "iso7816 0.1.4", ] [[package]] @@ -464,8 +464,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6dd31f7069836e87169bc5910212571b873cebe389c7c7f2d8b1fb3e55c80d" dependencies = [ "delog", - "heapless", - "heapless-bytes", + "heapless 0.7.17", + "heapless 0.9.3", + "heapless-bytes 0.3.0", + "heapless-bytes 0.5.0", "serde_core", ] @@ -596,7 +598,18 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75494895fa1a9713ca725ddf2db084ee84fb0c20938fdd7c89293febe732d30a" dependencies = [ - "heapless-bytes", + "heapless-bytes 0.3.0", + "serde", + "serde_repr", +] + +[[package]] +name = "cosey" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "540d9a2a9f2d35a876fedb35f4c0b51c7a69f71f042252cf34fc159708f962d4" +dependencies = [ + "heapless-bytes 0.5.0", "serde", "serde_repr", ] @@ -690,11 +703,30 @@ checksum = "bb8b105c5e728afd373e99874f0c1911c170b3a56848456cc16feb4506321606" dependencies = [ "bitflags 1.3.2", "cbor-smol", - "cosey", + "cosey 0.3.2", "delog", - "heapless", - "heapless-bytes", - "iso7816", + "heapless 0.7.17", + "heapless-bytes 0.3.0", + "iso7816 0.1.4", + "serde", + "serde-indexed 0.1.1", + "serde_bytes", + "serde_repr", +] + +[[package]] +name = "ctap-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab74c7ac39f3bde2a13960ab8257975a35cfcc3d45420ca59b21b55dcbadc6f9" +dependencies = [ + "bitflags 1.3.2", + "cbor-smol", + "cosey 0.4.0", + "delog", + "heapless 0.9.3", + "heapless-bytes 0.5.0", + "iso7816 0.2.0", "serde", "serde-indexed 0.1.1", "serde_bytes", @@ -720,7 +752,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fe93489fe96c998488d0843dffea35c02ed9add2585e55228e1d45988727ecc" dependencies = [ - "heapless-bytes", + "heapless-bytes 0.3.0", "trussed-core", ] @@ -732,7 +764,7 @@ checksum = "38fd4316573df369820c5a9f8285fe522d8871c0b20bcf7d390f73b8e6caee28" dependencies = [ "ctaphid-app", "delog", - "heapless-bytes", + "heapless-bytes 0.3.0", "interchange", "ref-swap", "trussed-core", @@ -1133,13 +1165,13 @@ source = "git+https://github.com/Nitrokey/fido-authenticator.git?tag=v0.1.1-nitr dependencies = [ "apdu-app", "cbor-smol", - "cosey", - "ctap-types", + "cosey 0.3.2", + "ctap-types 0.4.0", "ctaphid-app", "delog", - "heapless", - "heapless-bytes", - "iso7816", + "heapless 0.7.17", + "heapless-bytes 0.3.0", + "iso7816 0.1.4", "littlefs2-core", "serde", "serde-indexed 0.1.1", @@ -1186,7 +1218,7 @@ checksum = "a2510a9088d9557aab93401404fc6786fad82f55705dedf4ee5884a3ace9be9b" dependencies = [ "delog", "flexiber_derive", - "heapless", + "heapless 0.7.17", ] [[package]] @@ -1460,6 +1492,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -1488,24 +1529,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ "atomic-polyfill", - "hash32", + "hash32 0.2.1", "rustc_version", "serde", "spin", "stable_deref_trait", ] +[[package]] +name = "heapless" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ba4bd83f9415b58b4ed8dc5714c76e626a105be4646c02630ad730ad3b5aa4" +dependencies = [ + "hash32 0.3.1", + "serde_core", + "stable_deref_trait", +] + [[package]] name = "heapless-bytes" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7285eba272c6af3e9f15fb9e1c1b6e7d35aa70580ffe0d47af017e97dfb6f48b" dependencies = [ - "heapless", + "heapless 0.7.17", "serde", "typenum", ] +[[package]] +name = "heapless-bytes" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774f9dbf3f3a66edc65579e68b9f564ad5ec52e770a755af46b87d40909b8024" +dependencies = [ + "heapless 0.9.3", + "serde_core", +] + [[package]] name = "heck" version = "0.5.0" @@ -1834,7 +1896,16 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3c7e91da489667bb054f9cd2f1c60cc2ac4478a899f403d11dbc62189215b0" dependencies = [ - "heapless", + "heapless 0.7.17", +] + +[[package]] +name = "iso7816" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b574e1a9ae668e3167a82fe2c62fe629ca60383da01c6f70acb0fb642d9c55f" +dependencies = [ + "heapless 0.9.3", ] [[package]] @@ -1982,14 +2053,13 @@ dependencies = [ "btleplug", "byteorder", "cbc", - "cosey", - "ctap-types", + "cosey 0.4.0", + "ctap-types 0.5.0", "curve25519-dalek", "dbus", "der 0.7.10", "flate2", "futures", - "heapless", "hex", "hidapi", "hkdf", @@ -2043,7 +2113,7 @@ version = "0.0.0" dependencies = [ "aes-gcm", "base64-url", - "cosey", + "cosey 0.3.2", "ctaphid", "ctaphid-dispatch", "delog", @@ -2088,7 +2158,7 @@ checksum = "32a43f3c0c6a7d127e3e1241665dd896d8bf1ca31cf9d826a1dc65239bd59868" dependencies = [ "delog", "generic-array", - "heapless", + "heapless 0.7.17", "littlefs2-core", "littlefs2-sys", ] @@ -2100,7 +2170,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd2d1cad5532f5e11b0fd871b8a981885efd3fdaec0427c0d637322ae09efbf" dependencies = [ "bitflags 2.11.1", - "heapless-bytes", + "heapless-bytes 0.3.0", "serde", ] @@ -2606,7 +2676,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a25c0b0ae06fcffe600ad392aabfa535696c8973f2253d9ac83171924c58a858" dependencies = [ - "heapless", + "heapless 0.7.17", "postcard-cobs", "serde", ] @@ -3091,7 +3161,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b947325a585e90733e0e9ec097228f40b637cc346f9bd68f84d5c6297d0fcfef" dependencies = [ - "cosey", + "cosey 0.3.2", "ed25519", "subtle", "zeroize", @@ -3955,13 +4025,13 @@ dependencies = [ "cfg-if", "chacha20", "chacha20poly1305", - "cosey", + "cosey 0.3.2", "delog", "des", "flexiber", "generic-array", - "heapless", - "heapless-bytes", + "heapless 0.7.17", + "heapless-bytes 0.3.0", "hex-literal", "hmac 0.12.1", "interchange", @@ -3997,7 +4067,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afddad280ae8a5235e1b06408cca909ce9454cdd89f941b94b024c580732b3ce" dependencies = [ - "heapless-bytes", + "heapless-bytes 0.3.0", "littlefs2-core", "postcard", "rand_core 0.6.4", diff --git a/libwebauthn/Cargo.toml b/libwebauthn/Cargo.toml index a59328b2..8bb2c32a 100644 --- a/libwebauthn/Cargo.toml +++ b/libwebauthn/Cargo.toml @@ -81,8 +81,7 @@ hidapi = { version = "2.4.1", default-features = false, features = [ bitflags = "2.4.1" rand = "0.8.5" p256 = { version = "0.13.2", features = ["ecdh", "arithmetic", "serde"] } -heapless = "0.7" -cosey = "0.3.2" +cosey = "0.4.0" spki = { version = "0.7", default-features = false, features = ["alloc"] } der = { version = "0.7", default-features = false, features = ["alloc", "derive", "oid"] } aes = "0.8.2" @@ -100,7 +99,7 @@ tokio-tungstenite = { version = "0.26", features = [ rustls = { version = "0.23.27", default-features = false, features = ["ring"] } tokio-stream = "0.1" snow = { version = "0.10", features = ["use-p256"] } -ctap-types = { version = "0.4.0" } +ctap-types = { version = "0.5.0" } btleplug = "0.11.7" bluer = { version = "0.17", default-features = false, features = ["l2cap"] } thiserror = "2.0.12" diff --git a/libwebauthn/src/ops/u2f.rs b/libwebauthn/src/ops/u2f.rs index e51cc472..529beb21 100644 --- a/libwebauthn/src/ops/u2f.rs +++ b/libwebauthn/src/ops/u2f.rs @@ -72,22 +72,17 @@ impl UpgradableResponse for Regis "public key is identity or compressed".into(), )) })?; - let x: heapless::Vec = - heapless::Vec::from_slice(x_bytes.as_bytes()).map_err(|_| { - WebAuthnError::Platform(PlatformError::CryptoError( - "x coordinate exceeds 32 bytes".into(), - )) - })?; - let y: heapless::Vec = - heapless::Vec::from_slice(y_bytes.as_bytes()).map_err(|_| { - WebAuthnError::Platform(PlatformError::CryptoError( - "y coordinate exceeds 32 bytes".into(), - )) - })?; - let cose_public_key = cose::PublicKey::P256Key(cose::P256PublicKey { - x: x.into(), - y: y.into(), - }); + let x = cose::Bytes::<32>::try_from(x_bytes.as_bytes()).map_err(|_| { + WebAuthnError::Platform(PlatformError::CryptoError( + "x coordinate exceeds 32 bytes".into(), + )) + })?; + let y = cose::Bytes::<32>::try_from(y_bytes.as_bytes()).map_err(|_| { + WebAuthnError::Platform(PlatformError::CryptoError( + "y coordinate exceeds 32 bytes".into(), + )) + })?; + let cose_public_key = cose::PublicKey::P256Key(cose::P256PublicKey { x, y }); let cose_encoded_public_key = cbor::to_vec(&cose_public_key)?; // Canonical CBOR encoding of the COSE P-256 key is 77 bytes for the // fields we set; return a typed error if a future encoder change diff --git a/libwebauthn/src/ops/webauthn/make_credential.rs b/libwebauthn/src/ops/webauthn/make_credential.rs index 7ea3596e..54d60430 100644 --- a/libwebauthn/src/ops/webauthn/make_credential.rs +++ b/libwebauthn/src/ops/webauthn/make_credential.rs @@ -1787,8 +1787,8 @@ mod tests { // Minimal COSE_Key for a P-256 ES256 credential, used as opaque // bytes by the test harness. let cose_public_key = cosey::PublicKey::P256Key(cosey::P256PublicKey { - x: Bytes::from_slice(&[0u8; 32]).unwrap(), - y: Bytes::from_slice(&[0u8; 32]).unwrap(), + x: Bytes::from(&[0u8; 32]), + y: Bytes::from(&[0u8; 32]), }); let credential_public_key = cbor::to_vec(&cose_public_key).unwrap(); @@ -2095,8 +2095,8 @@ mod tests { use serde_bytes::ByteBuf; let cose_public_key = cosey::PublicKey::P256Key(cosey::P256PublicKey { - x: Bytes::from_slice(&[0u8; 32]).unwrap(), - y: Bytes::from_slice(&[0u8; 32]).unwrap(), + x: Bytes::from(&[0u8; 32]), + y: Bytes::from(&[0u8; 32]), }); let credential_public_key = cbor::to_vec(&cose_public_key).unwrap(); diff --git a/libwebauthn/src/pin/mod.rs b/libwebauthn/src/pin/mod.rs index e3c93d42..7c2586dd 100644 --- a/libwebauthn/src/pin/mod.rs +++ b/libwebauthn/src/pin/mod.rs @@ -241,15 +241,12 @@ where error!("Public key is identity or compressed"); PlatformError::CryptoError("public key is identity or compressed".into()) })?; - let x: heapless::Vec = heapless::Vec::from_slice(x_bytes.as_bytes()) + let x = cose::Bytes::<32>::try_from(x_bytes.as_bytes()) .map_err(|_| PlatformError::CryptoError("x coordinate exceeds 32 bytes".into()))?; - let y: heapless::Vec = heapless::Vec::from_slice(y_bytes.as_bytes()) + let y = cose::Bytes::<32>::try_from(y_bytes.as_bytes()) .map_err(|_| PlatformError::CryptoError("y coordinate exceeds 32 bytes".into()))?; Ok(cose::PublicKey::EcdhEsHkdf256Key( - cose::EcdhEsHkdf256PublicKey { - x: x.into(), - y: y.into(), - }, + cose::EcdhEsHkdf256PublicKey { x, y }, )) } } @@ -681,8 +678,8 @@ mod tests { fn make_peer_key(x: &[u8], y: &[u8]) -> cose::PublicKey { cose::PublicKey::EcdhEsHkdf256Key(EcdhEsHkdf256PublicKey { - x: Bytes::from_slice(x).unwrap(), - y: Bytes::from_slice(y).unwrap(), + x: Bytes::try_from(x).unwrap(), + y: Bytes::try_from(y).unwrap(), }) } diff --git a/libwebauthn/src/proto/ctap2/cose.rs b/libwebauthn/src/proto/ctap2/cose.rs index f86c5605..7faacdc4 100644 --- a/libwebauthn/src/proto/ctap2/cose.rs +++ b/libwebauthn/src/proto/ctap2/cose.rs @@ -556,8 +556,8 @@ mod tests { fn p256_public_key_golden_cose() { use cosey::{Bytes, P256PublicKey, PublicKey}; let key = PublicKey::P256Key(P256PublicKey { - x: Bytes::from_slice(&[0x06u8; 32]).unwrap(), - y: Bytes::from_slice(&[0x07u8; 32]).unwrap(), + x: Bytes::from(&[0x06u8; 32]), + y: Bytes::from(&[0x07u8; 32]), }); let bytes = cbor::to_vec(&key).unwrap(); // {1: 2(EC2), 3: -7(ES256), -1: 1(P256), -2: x[32], -3: y[32]}. diff --git a/libwebauthn/src/proto/ctap2/model/make_credential.rs b/libwebauthn/src/proto/ctap2/model/make_credential.rs index ce07de30..cba8fee8 100644 --- a/libwebauthn/src/proto/ctap2/model/make_credential.rs +++ b/libwebauthn/src/proto/ctap2/model/make_credential.rs @@ -971,8 +971,8 @@ mod tests { vec![0u8; 32], pin_proto, PublicKey::EcdhEsHkdf256Key(cosey::EcdhEsHkdf256PublicKey { - x: Bytes::from_slice(&[1u8; 32]).unwrap(), - y: Bytes::from_slice(&[2u8; 32]).unwrap(), + x: Bytes::from(&[1u8; 32]), + y: Bytes::from(&[2u8; 32]), }), Ctap2UserVerificationOperation::OnlyForSharedSecret, ); @@ -1015,8 +1015,8 @@ mod tests { vec![0u8; 64], Ctap2PinUvAuthProtocol::Two, PublicKey::EcdhEsHkdf256Key(cosey::EcdhEsHkdf256PublicKey { - x: Bytes::from_slice(&[1u8; 32]).unwrap(), - y: Bytes::from_slice(&[2u8; 32]).unwrap(), + x: Bytes::from(&[1u8; 32]), + y: Bytes::from(&[2u8; 32]), }), Ctap2UserVerificationOperation::OnlyForSharedSecret, ); @@ -1077,8 +1077,8 @@ mod tests { shared_secret.clone(), pin_proto, PublicKey::EcdhEsHkdf256Key(cosey::EcdhEsHkdf256PublicKey { - x: Bytes::from_slice(&[1u8; 32]).unwrap(), - y: Bytes::from_slice(&[2u8; 32]).unwrap(), + x: Bytes::from(&[1u8; 32]), + y: Bytes::from(&[2u8; 32]), }), Ctap2UserVerificationOperation::OnlyForSharedSecret, ); diff --git a/libwebauthn/src/webauthn/pin_uv_auth_token.rs b/libwebauthn/src/webauthn/pin_uv_auth_token.rs index b6fd76a4..99fc2b0b 100644 --- a/libwebauthn/src/webauthn/pin_uv_auth_token.rs +++ b/libwebauthn/src/webauthn/pin_uv_auth_token.rs @@ -1182,8 +1182,8 @@ mod test { .unwrap(); cosey::PublicKey::EcdhEsHkdf256Key(cosey::EcdhEsHkdf256PublicKey { - x: cosey::Bytes::from_slice(&pub_key_x).unwrap(), - y: cosey::Bytes::from_slice(&pub_key_y).unwrap(), + x: cosey::Bytes::try_from(pub_key_x.as_slice()).unwrap(), + y: cosey::Bytes::try_from(pub_key_y.as_slice()).unwrap(), }) }