signatures: Merge SplitError into Error

This commit is contained in:
Jonas Platte 2022-02-11 23:55:04 +01:00
parent acba6fbbc4
commit 8d15c3d0f9
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
3 changed files with 20 additions and 25 deletions

View File

@ -1,5 +1,9 @@
# [unreleased]
Breaking changes:
* Merge `SplitError` into `Error`
Improvements:
* Move Room Version 9 keys out of `unstable-pre-spec` in `allowed_content_keys_for`

View File

@ -22,9 +22,17 @@ pub enum Error {
#[error("DER Parse error: {0}")]
DerParse(pkcs8::der::Error),
/// [`SplitError`] wrapper.
#[error("Split error: {0}")]
SplitError(#[from] SplitError),
/// The signature's ID does not have exactly two components separated by a colon.
#[error("malformed signature ID: expected exactly 2 segment separated by a colon, found {0}")]
InvalidLength(usize),
/// The signature's ID contains invalid characters in its version.
#[error("malformed signature ID: expected version to contain only characters in the character set `[a-zA-Z0-9_]`, found `{0}`")]
InvalidVersion(String),
/// The signature uses an unsupported algorithm.
#[error("signature uses an unsupported algorithm: {0}")]
UnsupportedAlgorithm(String),
/// PDU was too large
#[error("PDU is larger than maximum of 65535 bytes")]
@ -251,20 +259,3 @@ impl ParseError {
Self::Base64 { of_type: of_type.into(), string: string.into(), source }.into()
}
}
/// An error when trying to extract the algorithm and version from a key identifier.
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum SplitError {
/// The signature's ID does not have exactly two components separated by a colon.
#[error("malformed signature ID: expected exactly 2 segment separated by a colon, found {0}")]
InvalidLength(usize),
/// The signature's ID contains invalid characters in its version.
#[error("malformed signature ID: expected version to contain only characters in the character set `[a-zA-Z0-9_]`, found `{0}`")]
InvalidVersion(String),
/// The signature uses an unsupported algorithm.
#[error("unsupported algorithm: {0}")]
UnsupportedAlgorithm(String),
}

View File

@ -46,7 +46,7 @@
use ruma_serde::{AsRefStr, DisplayAsRefStr};
pub use error::{Error, JsonError, JsonType, ParseError, SplitError, VerificationError};
pub use error::{Error, JsonError, JsonType, ParseError, VerificationError};
pub use functions::{
canonical_json, content_hash, hash_and_sign_event, redact, redact_content_in_place,
redact_in_place, reference_hash, sign_json, verify_event, verify_json,
@ -72,7 +72,7 @@ pub enum Algorithm {
}
/// Extract the algorithm and version from a key identifier.
fn split_id(id: &str) -> Result<(Algorithm, String), SplitError> {
fn split_id(id: &str) -> Result<(Algorithm, String), Error> {
/// The length of a valid signature ID.
const SIGNATURE_ID_LENGTH: usize = 2;
@ -81,20 +81,20 @@ fn split_id(id: &str) -> Result<(Algorithm, String), SplitError> {
let signature_id_length = signature_id.len();
if signature_id_length != SIGNATURE_ID_LENGTH {
return Err(SplitError::InvalidLength(signature_id_length));
return Err(Error::InvalidLength(signature_id_length));
}
let version = signature_id[1];
if !version.bytes().all(|ch| ch.is_ascii_alphanumeric() || ch == b'_') {
return Err(SplitError::InvalidVersion(version.into()));
return Err(Error::InvalidVersion(version.into()));
}
let algorithm_input = signature_id[0];
let algorithm = match algorithm_input {
"ed25519" => Algorithm::Ed25519,
algorithm => return Err(SplitError::UnsupportedAlgorithm(algorithm.into())),
algorithm => return Err(Error::UnsupportedAlgorithm(algorithm.into())),
};
Ok((algorithm, signature_id[1].to_owned()))