Skip to content

Commit effa378

Browse files
Fix key serialization length to accomodate RSA
1 parent 7fa9d07 commit effa378

File tree

10 files changed

+26
-16
lines changed

10 files changed

+26
-16
lines changed

src/api.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ pub mod request {
174174

175175
DeserializeKey:
176176
- mechanism: Mechanism
177-
- serialized_key: Message
177+
- serialized_key: SerializedKey
178178
- format: KeySerialization
179179
- attributes: StorageAttributes
180180

@@ -282,7 +282,7 @@ pub mod request {
282282

283283
UnsafeInjectKey:
284284
- mechanism: Mechanism // -> implies key type
285-
- raw_key: ShortData
285+
- raw_key: SerializedKey
286286
- attributes: StorageAttributes
287287
- format: KeySerialization
288288

@@ -443,7 +443,7 @@ pub mod reply {
443443
- bytes: Message
444444

445445
SerializeKey:
446-
- serialized_key: Message
446+
- serialized_key: SerializedKey
447447

448448
Sign:
449449
- signature: Signature

src/client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ pub trait CryptoClient: PollClient {
353353
attributes: StorageAttributes,
354354
) -> ClientResult<'c, reply::DeserializeKey, Self> {
355355
let serialized_key =
356-
Message::from_slice(serialized_key).map_err(|_| ClientError::DataTooLarge)?;
356+
SerializedKey::from_slice(serialized_key).map_err(|_| ClientError::DataTooLarge)?;
357357
self.request(request::DeserializeKey {
358358
mechanism,
359359
serialized_key,
@@ -478,7 +478,7 @@ pub trait CryptoClient: PollClient {
478478
) -> ClientResult<'_, reply::UnsafeInjectKey, Self> {
479479
self.request(request::UnsafeInjectKey {
480480
mechanism,
481-
raw_key: ShortData::from_slice(raw_key).unwrap(),
481+
raw_key: SerializedKey::from_slice(raw_key).unwrap(),
482482
attributes: StorageAttributes::new().set_persistence(persistence),
483483
format,
484484
})

src/config.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@ use littlefs2::consts;
88

99
pub type MAX_APPLICATION_NAME_LENGTH = consts::U256;
1010
pub const MAX_LONG_DATA_LENGTH: usize = 1024;
11-
pub const MAX_MESSAGE_LENGTH: usize = 1024;
1211
pub type MAX_OBJECT_HANDLES = consts::U16;
1312
pub type MAX_LABEL_LENGTH = consts::U256;
1413
pub const MAX_MEDIUM_DATA_LENGTH: usize = 256;
1514
pub type MAX_PATH_LENGTH = consts::U256;
16-
pub const MAX_KEY_MATERIAL_LENGTH: usize = 128;
17-
// must be above + 4
18-
pub const MAX_SERIALIZED_KEY_LENGTH: usize = 132;
1915
cfg_if::cfg_if! {
2016
if #[cfg(feature = "clients-12")] {
2117
pub type MAX_SERVICE_CLIENTS = consts::U12;
@@ -44,7 +40,16 @@ cfg_if::cfg_if! {
4440
}
4541
}
4642
pub const MAX_SHORT_DATA_LENGTH: usize = 128;
47-
pub const MAX_SIGNATURE_LENGTH: usize = 72;
43+
44+
pub const MAX_SIGNATURE_LENGTH: usize = 512 * 2;
45+
// FIXME: Value from https://stackoverflow.com/questions/5403808/private-key-length-bytes for Rsa2048 Private key
46+
pub const MAX_KEY_MATERIAL_LENGTH: usize = 1160 * 2 + 72;
47+
// This is due to the fact that KEY_MATERIAL_LENGTH is bigger than MESSAGE_LENGTH for RSA.
48+
pub const MAX_MESSAGE_LENGTH: usize = 1024;
49+
50+
// must be MAX_KEY_MATERIAL_LENGTH + 4
51+
pub const MAX_SERIALIZED_KEY_LENGTH: usize = MAX_KEY_MATERIAL_LENGTH + 4;
52+
4853
pub const MAX_USER_ATTRIBUTE_LENGTH: usize = 256;
4954

5055
pub const USER_ATTRIBUTE_NUMBER: u8 = 37;

src/key.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ impl Kind {
167167
4 => Self::Ed255,
168168
5 => Self::P256,
169169
6 => Self::X255,
170+
7 => Kind::Rsa2048,
171+
8 => Kind::Rsa3072,
172+
9 => Kind::Rsa4096,
170173
_ => return Err(Error::InvalidSerializedKey),
171174
})
172175
}

src/mechanisms/ed255.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl SerializeKey for super::Ed255 {
142142
}
143143

144144
KeySerialization::Raw => {
145-
let mut serialized_key = Message::new();
145+
let mut serialized_key = SerializedKey::new();
146146
serialized_key
147147
.extend_from_slice(public_key.as_bytes())
148148
.map_err(|_| Error::InternalError)?;

src/mechanisms/p256.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ impl SerializeKey for super::P256 {
224224
crate::cbor_serialize_bytes(&cose_pk).map_err(|_| Error::CborError)?
225225
}
226226
KeySerialization::Raw => {
227-
let mut serialized_key = Message::new();
227+
let mut serialized_key = SerializedKey::new();
228228
serialized_key
229229
.extend_from_slice(&public_key.x())
230230
.map_err(|_| Error::InternalError)?;
@@ -234,7 +234,7 @@ impl SerializeKey for super::P256 {
234234
serialized_key
235235
}
236236
KeySerialization::Sec1 => {
237-
let mut serialized_key = Message::new();
237+
let mut serialized_key = SerializedKey::new();
238238
serialized_key
239239
.extend_from_slice(&public_key.to_compressed_sec1_bytes())
240240
.map_err(|_| Error::InternalError)?;

src/mechanisms/shared_secret.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl SerializeKey for super::SharedSecret {
2222
if !key.flags.contains(key::Flags::SERIALIZABLE) {
2323
return Err(Error::InvalidSerializedKey);
2424
};
25-
let mut serialized_key = Message::new();
25+
let mut serialized_key = SerializedKey::new();
2626
serialized_key.extend_from_slice(&key.material).unwrap();
2727

2828
Ok(reply::SerializeKey { serialized_key })

src/mechanisms/x255.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl SerializeKey for super::X255 {
149149
let key_id = request.key;
150150
let public_key = load_public_key(keystore, &key_id)?;
151151

152-
let mut serialized_key = Message::new();
152+
let mut serialized_key = SerializedKey::new();
153153
match request.format {
154154
KeySerialization::Raw => {
155155
serialized_key

src/store/keystore.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use chacha20::ChaCha8Rng;
22
use littlefs2::path::PathBuf;
33

44
use crate::{
5+
config::MAX_KEY_MATERIAL_LENGTH,
56
error::{Error, Result},
67
key,
78
store::{self, Store},
@@ -172,7 +173,7 @@ impl<S: Store> Keystore for ClientKeystore<S> {
172173

173174
let location = self.location(secrecy, id).ok_or(Error::NoSuchKey)?;
174175

175-
let bytes: Bytes<128> = store::read(self.store, location, &path)?;
176+
let bytes: Bytes<{ MAX_KEY_MATERIAL_LENGTH }> = store::read(self.store, location, &path)?;
176177

177178
let key = key::Key::try_deserialize(&bytes)?;
178179

src/types.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ pub type MediumData = Bytes<MAX_MEDIUM_DATA_LENGTH>;
578578
pub type ShortData = Bytes<MAX_SHORT_DATA_LENGTH>;
579579

580580
pub type Message = Bytes<MAX_MESSAGE_LENGTH>;
581+
pub type SerializedKey = Bytes<MAX_KEY_MATERIAL_LENGTH>;
581582

582583
#[derive(Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
583584
pub enum KeySerialization {

0 commit comments

Comments
 (0)