···5252 Ok(bytes) => bytes,
5353 Err(_) => {
5454 // No key yet — generate a new P-256 keypair via the crypto crate.
5555- let keypair = crypto::generate_p256_keypair()
5656- .map_err(|_| DeviceKeyError::KeyGenerationFailed)?;
5555+ let keypair =
5656+ crypto::generate_p256_keypair().map_err(|_| DeviceKeyError::KeyGenerationFailed)?;
5757 // Deref Zeroizing<[u8; 32]> to [u8; 32], then collect as Vec<u8>.
5858 let bytes = keypair.private_key_bytes.to_vec();
5959- crate::keychain::store_item(ACCOUNT, &bytes)
6060- .map_err(|e| DeviceKeyError::KeychainError { message: e.to_string() })?;
5959+ crate::keychain::store_item(ACCOUNT, &bytes).map_err(|e| {
6060+ DeviceKeyError::KeychainError {
6161+ message: e.to_string(),
6262+ }
6363+ })?;
6164 bytes
6265 }
6366 };
64676568 // Reconstruct the public key from stored private bytes.
6666- let signing_key = SigningKey::from_slice(&private_bytes)
6767- .map_err(|_| DeviceKeyError::KeychainError { message: "invalid stored key bytes".into() })?;
6969+ let signing_key =
7070+ SigningKey::from_slice(&private_bytes).map_err(|_| DeviceKeyError::KeychainError {
7171+ message: "invalid stored key bytes".into(),
7272+ })?;
6873 let encoded = signing_key.verifying_key().to_encoded_point(true); // compressed (33 bytes)
6974 let compressed = encoded.as_bytes();
7075 let multibase = multibase::encode(multibase::Base::Base58Btc, compressed);
···7681 let mut multikey = Vec::with_capacity(2 + compressed.len());
7782 multikey.extend_from_slice(P256_MULTICODEC);
7883 multikey.extend_from_slice(compressed);
7979- let key_id = format!("did:key:{}", multibase::encode(multibase::Base::Base58Btc, &multikey));
8484+ let key_id = format!(
8585+ "did:key:{}",
8686+ multibase::encode(multibase::Base::Base58Btc, &multikey)
8787+ );
80888189 Ok(DevicePublicKey { multibase, key_id })
8290}
83918492#[cfg(any(target_os = "macos", all(target_os = "ios", target_env = "sim")))]
8593pub fn sign(data: &[u8]) -> Result<Vec<u8>, DeviceKeyError> {
8686- use p256::ecdsa::{Signature, SigningKey};
8794 use p256::ecdsa::signature::Signer;
9595+ use p256::ecdsa::{Signature, SigningKey};
88968997 const ACCOUNT: &str = "device-rotation-key-priv";
90989199 // If the key doesn't exist, signal that get_or_create must be called first.
9292- let private_bytes = crate::keychain::get_item(ACCOUNT)
9393- .map_err(|_| DeviceKeyError::KeyNotFound)?;
100100+ let private_bytes =
101101+ crate::keychain::get_item(ACCOUNT).map_err(|_| DeviceKeyError::KeyNotFound)?;
941029595- let signing_key = SigningKey::from_slice(&private_bytes)
9696- .map_err(|_| DeviceKeyError::SigningFailed)?;
103103+ let signing_key =
104104+ SigningKey::from_slice(&private_bytes).map_err(|_| DeviceKeyError::SigningFailed)?;
9710598106 // sign() uses the deterministic Signer impl (RFC 6979 nonce).
99107 // It internally hashes `data` with SHA-256 before signing.
···129137 #[test]
130138 fn get_or_create_returns_valid_multibase() {
131139 let result = get_or_create().expect("get_or_create should succeed");
132132- assert!(result.multibase.starts_with('z'), "multibase must start with 'z'");
140140+ assert!(
141141+ result.multibase.starts_with('z'),
142142+ "multibase must start with 'z'"
143143+ );
133144 let (_, decoded) = multibase::decode(&result.multibase).expect("multibase must decode");
134145 assert_eq!(decoded.len(), 33, "compressed P-256 point must be 33 bytes");
135146 }
···139150 fn get_or_create_is_idempotent() {
140151 let first = get_or_create().expect("first call should succeed");
141152 let second = get_or_create().expect("second call should succeed");
142142- assert_eq!(first.multibase, second.multibase, "multibase must be stable");
153153+ assert_eq!(
154154+ first.multibase, second.multibase,
155155+ "multibase must be stable"
156156+ );
143157 assert_eq!(first.key_id, second.key_id, "key_id must be stable");
144158 }
145159···168182 get_or_create().expect("must have key before signing");
169183 let sig1 = sign(b"determinism test").expect("first sign should succeed");
170184 let sig2 = sign(b"determinism test").expect("second sign should succeed");
171171- assert_eq!(sig1, sig2, "same data with same key must produce same signature");
185185+ assert_eq!(
186186+ sig1, sig2,
187187+ "same data with same key must produce same signature"
188188+ );
172189 }
173190174191 // AC3.3 — sign before get_or_create returns KeyNotFound
···195212 let json2 = serde_json::to_value(&err2).unwrap();
196213 assert_eq!(json2["code"], "KEY_NOT_FOUND");
197214198198- let err3 = DeviceKeyError::KeychainError { message: "os error".into() };
215215+ let err3 = DeviceKeyError::KeychainError {
216216+ message: "os error".into(),
217217+ };
199218 let json3 = serde_json::to_value(&err3).unwrap();
200219 assert_eq!(json3["code"], "KEYCHAIN_ERROR");
201220 assert_eq!(json3["message"], "os error");
+1-1
apps/identity-wallet/src-tauri/src/lib.rs
···11+pub mod device_key;
12pub mod http;
23pub mod keychain;
33-pub mod device_key;
4455use crypto::generate_p256_keypair;
66use serde::{Deserialize, Serialize};