Skip to content

Commit 2ef16a9

Browse files
authored
Merge branch 'main' into fix/immutable-roll-forward
2 parents 6a044a8 + 68a35f1 commit 2ef16a9

File tree

9 files changed

+65
-21
lines changed

9 files changed

+65
-21
lines changed

rust/catalyst-types/src/hashes.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ impl<const BYTES: usize> TryFrom<&[u8]> for Blake2bHash<BYTES> {
102102
type Error = Blake2bHashError;
103103

104104
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
105-
if value.len() < BYTES {
105+
if value.len() != BYTES {
106106
return Err(Blake2bHashError::InvalidLength {
107107
expected: BYTES,
108108
actual: value.len(),
@@ -213,5 +213,16 @@ mod tests {
213213
} else {
214214
panic!("Expected InvalidLength error");
215215
}
216+
217+
let invalid_data = vec![0u8; 50];
218+
let result = Blake2b224Hash::try_from(&invalid_data);
219+
assert!(result.is_err());
220+
221+
if let Err(Blake2bHashError::InvalidLength { expected, actual }) = result {
222+
assert_eq!(expected, BLAKE_2B224_SIZE);
223+
assert_eq!(actual, invalid_data.len());
224+
} else {
225+
panic!("Expected InvalidLength error");
226+
}
216227
}
217228
}

rust/rbac-registration/src/cardano/cip509/rbac/certs/c509.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ impl Decode<'_, ProblemReport> for C509Cert {
2828
minicbor::data::Type::Tag => {
2929
let tag = decode_tag(d, "C509Cert")?;
3030
match tag {
31-
t if t == KeyTag::Deleted.tag() => Ok(Self::Deleted),
31+
t if t == KeyTag::Deleted.tag() => {
32+
d.undefined()?;
33+
Ok(Self::Deleted)
34+
},
3235
_ => Err(decode::Error::message("Unknown tag for C509Cert")),
3336
}
3437
},

rust/rbac-registration/src/cardano/cip509/rbac/certs/x509.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ impl Decode<'_, ProblemReport> for X509DerCert {
2626
minicbor::data::Type::Tag => {
2727
let tag = decode_tag(d, "X509DerCert")?;
2828
match tag {
29-
t if t == KeyTag::Deleted.tag() => Ok(Self::Deleted),
29+
t if t == KeyTag::Deleted.tag() => {
30+
d.undefined()?;
31+
Ok(Self::Deleted)
32+
},
3033
_ => Err(decode::Error::message("Unknown tag for X509DerCert")),
3134
}
3235
},

rust/rbac-registration/src/cardano/cip509/rbac/pub_key.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ impl Decode<'_, ProblemReport> for SimplePublicKeyType {
2525
minicbor::data::Type::Tag => {
2626
let tag = decode_tag(d, "SimplePublicKeyType")?;
2727
match tag {
28-
t if t == KeyTag::Deleted.tag() => Ok(Self::Deleted),
28+
t if t == KeyTag::Deleted.tag() => {
29+
d.undefined()?;
30+
Ok(Self::Deleted)
31+
},
2932
t if t == KeyTag::Ed25519.tag() => {
3033
let bytes = decode_bytes(d, "Ed25519 SimplePublicKeyType")?;
3134
let mut ed25519 = [0u8; 32];
@@ -42,7 +45,11 @@ impl Decode<'_, ProblemReport> for SimplePublicKeyType {
4245
)))
4346
}
4447
},
45-
_ => Err(decode::Error::message("Unknown tag for Self")),
48+
_ => {
49+
Err(decode::Error::message(
50+
"Unknown tag for SimplePublicKeyType",
51+
))
52+
},
4653
}
4754
},
4855
minicbor::data::Type::Undefined => {

rust/rbac-registration/src/cardano/cip509/rbac/role_data.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,14 @@ impl Decode<'_, ProblemReport> for CborRoleData {
137137

138138
/// Decodes a signing key.
139139
fn decode_signing_key(
140-
d: &mut Decoder, context: &str, report: &ProblemReport,
140+
d: &mut Decoder, context: &str, report: &mut ProblemReport,
141141
) -> Result<Option<KeyLocalRef>, ()> {
142142
if let Err(e) = decode_array_len(d, "RoleSigningKey") {
143143
report.other(&format!("{e:?}"), context);
144144
return Err(());
145145
}
146146

147-
match KeyLocalRef::decode(d, &mut ()) {
147+
match KeyLocalRef::decode(d, report) {
148148
Ok(v) => Ok(Some(v)),
149149
Err(e) => {
150150
report.other(
@@ -158,14 +158,14 @@ fn decode_signing_key(
158158

159159
/// Decodes an encryption key.
160160
fn decode_encryption_key(
161-
d: &mut Decoder, context: &str, report: &ProblemReport,
161+
d: &mut Decoder, context: &str, report: &mut ProblemReport,
162162
) -> Result<Option<KeyLocalRef>, ()> {
163163
if let Err(e) = decode_array_len(d, "RoleEncryptionKey") {
164164
report.other(&format!("{e:?}"), context);
165165
return Err(());
166166
}
167167

168-
match KeyLocalRef::decode(d, &mut ()) {
168+
match KeyLocalRef::decode(d, report) {
169169
Ok(v) => Ok(Some(v)),
170170
Err(e) => {
171171
report.other(

rust/rbac-registration/src/cardano/cip509/rbac/tag.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ pub(crate) enum KeyTag {
77
/// Deleted Key tag 31.
88
Deleted,
99
/// Ed25519 Key tag 32773.
10+
/// <https://cips.cardano.org/cip/CIP-0115>
1011
Ed25519,
1112
}
1213

1314
impl KeyTag {
1415
/// Get the tag value.
1516
pub(crate) fn tag(self) -> Tag {
1617
match self {
17-
KeyTag::Deleted => Tag::new(0x31),
18-
KeyTag::Ed25519 => Tag::new(0x8005),
18+
KeyTag::Deleted => Tag::new(31),
19+
KeyTag::Ed25519 => Tag::new(32773),
1920
}
2021
}
2122
}

rust/rbac-registration/src/cardano/cip509/types/key_local_ref.rs

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
//! A local key reference.
22
3+
use catalyst_types::problem_report::ProblemReport;
34
use cbork_utils::decode_helper::decode_helper;
45
use minicbor::{decode, Decode, Decoder};
56
use strum_macros::FromRepr;
67

78
use crate::cardano::cip509::rbac::Cip509RbacMetadataInt;
89

910
/// Local key reference.
10-
#[derive(Debug, PartialEq, Clone)]
11+
#[derive(Debug, PartialEq, Clone, Copy)]
1112
pub struct KeyLocalRef {
1213
/// Local reference.
1314
pub local_ref: LocalRefInt,
1415
/// Key offset.
15-
pub key_offset: u64,
16+
pub key_offset: usize,
1617
}
1718

1819
/// Enum of local reference with its associated unsigned integer value.
19-
#[derive(FromRepr, Debug, PartialEq, Clone, Eq, Hash)]
20+
#[derive(FromRepr, Debug, PartialEq, Clone, Copy, Eq, Hash)]
2021
#[repr(u8)]
2122
pub enum LocalRefInt {
2223
/// x509 certificates.
@@ -27,11 +28,23 @@ pub enum LocalRefInt {
2728
PubKeys = Cip509RbacMetadataInt::PubKeys as u8, // 30
2829
}
2930

30-
impl Decode<'_, ()> for KeyLocalRef {
31-
fn decode(d: &mut Decoder, ctx: &mut ()) -> Result<Self, decode::Error> {
32-
let local_ref = LocalRefInt::from_repr(decode_helper(d, "LocalRef in KeyLocalRef", ctx)?)
33-
.ok_or(decode::Error::message("Invalid local reference"))?;
34-
let key_offset: u64 = decode_helper(d, "KeyOffset in KeyLocalRef", ctx)?;
31+
impl Decode<'_, ProblemReport> for KeyLocalRef {
32+
fn decode(d: &mut Decoder, report: &mut ProblemReport) -> Result<Self, decode::Error> {
33+
let local_ref =
34+
LocalRefInt::from_repr(decode_helper(d, "LocalRef in KeyLocalRef", &mut ())?)
35+
.ok_or(decode::Error::message("Invalid local reference"))?;
36+
let key_offset: u64 = decode_helper(d, "KeyOffset in KeyLocalRef", &mut ())?;
37+
let key_offset = if let Ok(v) = usize::try_from(key_offset) {
38+
v
39+
} else {
40+
report.invalid_value(
41+
"key_offset",
42+
&format!("{key_offset}"),
43+
&format!("Value must be less than {}", usize::MAX),
44+
"KeyLocalRef decoding",
45+
);
46+
0
47+
};
3548
Ok(Self {
3649
local_ref,
3750
key_offset,

rust/rbac-registration/src/cardano/cip509/types/role_number.rs

+6
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,9 @@ impl From<u8> for RoleNumber {
1414
Self(value)
1515
}
1616
}
17+
18+
impl From<RoleNumber> for u8 {
19+
fn from(value: RoleNumber) -> Self {
20+
value.0
21+
}
22+
}

rust/rbac-registration/src/registration/cardano/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ fn update_role_data(
432432
.role_data
433433
.get(&number)
434434
.and_then(|pd| pd.data().signing_key())
435-
.cloned();
435+
.copied();
436436
data.set_signing_key(signing_key);
437437
}
438438

@@ -442,7 +442,7 @@ fn update_role_data(
442442
.role_data
443443
.get(&number)
444444
.and_then(|pd| pd.data().encryption_key())
445-
.cloned();
445+
.copied();
446446
data.set_encryption_key(encryption_key);
447447
}
448448

0 commit comments

Comments
 (0)