Reorganize encyption related code
Some types used for encryption related tasks need to be used across more internal crates than expected, so a few have been moved and renamed for clarity. * Rename the key_algorithms module in ruma-identifiers-validation to crypto_algorithms * Move ruma_events::Algorithm to ruma-identifiers-validation and rename it EventEncryptionAlgorithm * Move DeviceKeys from ruma-client-api to ruma-common
This commit is contained in:
parent
585485831b
commit
fdc15123b0
@ -2,8 +2,7 @@
|
||||
|
||||
use std::{collections::BTreeMap, fmt::Debug};
|
||||
|
||||
use ruma_events::Algorithm;
|
||||
use ruma_identifiers::{DeviceId, DeviceKeyId, UserId};
|
||||
use ruma_identifiers::{DeviceKeyId, UserId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
pub mod claim_keys;
|
||||
@ -16,37 +15,6 @@ pub mod upload_signatures;
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
pub mod upload_signing_keys;
|
||||
|
||||
/// Identity keys for a device.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DeviceKeys {
|
||||
/// The ID of the user the device belongs to. Must match the user ID used when logging in.
|
||||
pub user_id: UserId,
|
||||
|
||||
/// The ID of the device these keys belong to. Must match the device ID used when logging in.
|
||||
pub device_id: Box<DeviceId>,
|
||||
|
||||
/// The encryption algorithms supported by this device.
|
||||
pub algorithms: Vec<Algorithm>,
|
||||
|
||||
/// Public identity keys.
|
||||
pub keys: BTreeMap<DeviceKeyId, String>,
|
||||
|
||||
/// Signatures for the device key object.
|
||||
pub signatures: BTreeMap<UserId, BTreeMap<DeviceKeyId, String>>,
|
||||
|
||||
/// Additional data added to the device key information by intermediate servers, and
|
||||
/// not covered by the signatures.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub unsigned: Option<UnsignedDeviceInfo>,
|
||||
}
|
||||
|
||||
/// Additional data added to device key information by intermediate servers.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct UnsignedDeviceInfo {
|
||||
/// The display name which the user set on the device.
|
||||
pub device_display_name: Option<String>,
|
||||
}
|
||||
|
||||
/// A key for the SignedCurve25519 algorithm
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct SignedKey {
|
||||
|
@ -3,12 +3,12 @@
|
||||
use std::{collections::BTreeMap, time::Duration};
|
||||
|
||||
use ruma_api::ruma_api;
|
||||
use ruma_common::encryption::DeviceKeys;
|
||||
use ruma_identifiers::{DeviceId, UserId};
|
||||
use serde_json::Value as JsonValue;
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use super::CrossSigningKey;
|
||||
use super::DeviceKeys;
|
||||
|
||||
ruma_api! {
|
||||
metadata: {
|
||||
|
@ -4,9 +4,10 @@ use std::collections::BTreeMap;
|
||||
|
||||
use js_int::UInt;
|
||||
use ruma_api::ruma_api;
|
||||
use ruma_common::encryption::DeviceKeys;
|
||||
use ruma_identifiers::{DeviceKeyAlgorithm, DeviceKeyId};
|
||||
|
||||
use super::{DeviceKeys, OneTimeKey};
|
||||
use super::OneTimeKey;
|
||||
|
||||
ruma_api! {
|
||||
metadata: {
|
||||
|
39
ruma-common/src/encryption.rs
Normal file
39
ruma-common/src/encryption.rs
Normal file
@ -0,0 +1,39 @@
|
||||
//! Common types for [encryption] related tasks.
|
||||
//!
|
||||
//! [encryption](https://matrix.org/docs/spec/client_server/r0.6.1#id62)
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_identifiers::{DeviceId, DeviceKeyId, EventEncryptionAlgorithm, UserId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// Identity keys for a device.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DeviceKeys {
|
||||
/// The ID of the user the device belongs to. Must match the user ID used when logging in.
|
||||
pub user_id: UserId,
|
||||
|
||||
/// The ID of the device these keys belong to. Must match the device ID used when logging in.
|
||||
pub device_id: Box<DeviceId>,
|
||||
|
||||
/// The encryption algorithms supported by this device.
|
||||
pub algorithms: Vec<EventEncryptionAlgorithm>,
|
||||
|
||||
/// Public identity keys.
|
||||
pub keys: BTreeMap<DeviceKeyId, String>,
|
||||
|
||||
/// Signatures for the device key object.
|
||||
pub signatures: BTreeMap<UserId, BTreeMap<DeviceKeyId, String>>,
|
||||
|
||||
/// Additional data added to the device key information by intermediate servers, and
|
||||
/// not covered by the signatures.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub unsigned: Option<UnsignedDeviceInfo>,
|
||||
}
|
||||
|
||||
/// Additional data added to device key information by intermediate servers.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct UnsignedDeviceInfo {
|
||||
/// The display name which the user set on the device.
|
||||
pub device_display_name: Option<String>,
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
|
||||
#![warn(missing_docs, missing_debug_implementations)]
|
||||
|
||||
pub mod encryption;
|
||||
pub mod presence;
|
||||
pub mod push;
|
||||
mod raw;
|
||||
|
@ -1,64 +0,0 @@
|
||||
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// An encryption algorithm to be used to encrypt messages sent to a room.
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[non_exhaustive]
|
||||
#[serde(from = "String", into = "String")]
|
||||
pub enum Algorithm {
|
||||
/// Olm version 1 using Curve25519, AES-256, and SHA-256.
|
||||
OlmV1Curve25519AesSha2,
|
||||
|
||||
/// Megolm version 1 using AES-256 and SHA-256.
|
||||
MegolmV1AesSha2,
|
||||
|
||||
/// Any algorithm that is not part of the specification.
|
||||
Custom(String),
|
||||
}
|
||||
|
||||
impl Display for Algorithm {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
|
||||
let algorithm_str = match *self {
|
||||
Algorithm::OlmV1Curve25519AesSha2 => "m.olm.v1.curve25519-aes-sha2",
|
||||
Algorithm::MegolmV1AesSha2 => "m.megolm.v1.aes-sha2",
|
||||
Algorithm::Custom(ref algorithm) => algorithm,
|
||||
};
|
||||
|
||||
write!(f, "{}", algorithm_str)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> From<T> for Algorithm
|
||||
where
|
||||
T: Into<String> + AsRef<str>,
|
||||
{
|
||||
fn from(s: T) -> Algorithm {
|
||||
match s.as_ref() {
|
||||
"m.olm.v1.curve25519-aes-sha2" => Algorithm::OlmV1Curve25519AesSha2,
|
||||
"m.megolm.v1.aes-sha2" => Algorithm::MegolmV1AesSha2,
|
||||
_ => Algorithm::Custom(s.into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Algorithm> for String {
|
||||
fn from(algorithm: Algorithm) -> String {
|
||||
algorithm.to_string()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use ruma_serde::test::serde_json_eq;
|
||||
use serde_json::json;
|
||||
|
||||
use super::Algorithm;
|
||||
|
||||
#[test]
|
||||
fn serialize_and_deserialize_from_display_form() {
|
||||
serde_json_eq(Algorithm::MegolmV1AesSha2, json!("m.megolm.v1.aes-sha2"));
|
||||
serde_json_eq(Algorithm::OlmV1Curve25519AesSha2, json!("m.olm.v1.curve25519-aes-sha2"));
|
||||
serde_json_eq(Algorithm::Custom("io.ruma.test".into()), json!("io.ruma.test"));
|
||||
}
|
||||
}
|
@ -1,10 +1,9 @@
|
||||
//! Types for the *m.forwarded_room_key* event.
|
||||
|
||||
use ruma_events_macros::BasicEventContent;
|
||||
use ruma_identifiers::RoomId;
|
||||
use ruma_identifiers::{EventEncryptionAlgorithm, RoomId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::Algorithm;
|
||||
use crate::BasicEvent;
|
||||
|
||||
/// This event type is used to forward keys for end-to-end encryption.
|
||||
@ -17,7 +16,7 @@ pub type ForwardedRoomKeyEvent = BasicEvent<ForwardedRoomKeyEventContent>;
|
||||
#[ruma_event(type = "m.forwarded_room_key")]
|
||||
pub struct ForwardedRoomKeyEventContent {
|
||||
/// The encryption algorithm the key in this event is to be used with.
|
||||
pub algorithm: Algorithm,
|
||||
pub algorithm: EventEncryptionAlgorithm,
|
||||
|
||||
/// The room where the key is used.
|
||||
pub room_id: RoomId,
|
||||
|
@ -121,7 +121,7 @@ use std::fmt::Debug;
|
||||
|
||||
use js_int::Int;
|
||||
use ruma_common::Raw;
|
||||
use ruma_identifiers::RoomId;
|
||||
use ruma_identifiers::{EventEncryptionAlgorithm, RoomId};
|
||||
use serde::{
|
||||
de::{self, IgnoredAny},
|
||||
Deserialize, Serialize,
|
||||
@ -130,7 +130,6 @@ use serde_json::value::RawValue as RawJsonValue;
|
||||
|
||||
use self::room::redaction::{RedactionEvent, SyncRedactionEvent};
|
||||
|
||||
mod algorithm;
|
||||
mod enums;
|
||||
mod error;
|
||||
mod event_kinds;
|
||||
@ -160,7 +159,6 @@ pub mod tag;
|
||||
pub mod typing;
|
||||
|
||||
pub use self::{
|
||||
algorithm::Algorithm,
|
||||
enums::{
|
||||
AnyBasicEvent, AnyBasicEventContent, AnyEphemeralRoomEvent, AnyEphemeralRoomEventContent,
|
||||
AnyEvent, AnyMessageEvent, AnyMessageEventContent, AnyPossiblyRedactedMessageEvent,
|
||||
|
@ -4,7 +4,7 @@ use js_int::UInt;
|
||||
use ruma_events_macros::StateEventContent;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{Algorithm, StateEvent};
|
||||
use crate::{EventEncryptionAlgorithm, StateEvent};
|
||||
|
||||
/// Defines how messages sent in this room should be encrypted.
|
||||
pub type EncryptionEvent = StateEvent<EncryptionEventContent>;
|
||||
@ -17,7 +17,7 @@ pub struct EncryptionEventContent {
|
||||
/// The encryption algorithm to be used to encrypt messages sent in this room.
|
||||
///
|
||||
/// Must be `m.megolm.v1.aes-sha2`.
|
||||
pub algorithm: Algorithm,
|
||||
pub algorithm: EventEncryptionAlgorithm,
|
||||
|
||||
/// How long the session should be used before changing it.
|
||||
///
|
||||
@ -34,7 +34,7 @@ pub struct EncryptionEventContent {
|
||||
|
||||
impl EncryptionEventContent {
|
||||
/// Creates a new `EncryptionEventContent` with the given algorithm.
|
||||
pub fn new(algorithm: Algorithm) -> Self {
|
||||
pub fn new(algorithm: EventEncryptionAlgorithm) -> Self {
|
||||
Self { algorithm, rotation_period_ms: None, rotation_period_msgs: None }
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,9 @@
|
||||
//! Types for the *m.room_key* event.
|
||||
|
||||
use ruma_events_macros::BasicEventContent;
|
||||
use ruma_identifiers::RoomId;
|
||||
use ruma_identifiers::{EventEncryptionAlgorithm, RoomId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::Algorithm;
|
||||
use crate::BasicEvent;
|
||||
|
||||
/// This event type is used to exchange keys for end-to-end encryption.
|
||||
@ -19,7 +18,7 @@ pub struct RoomKeyEventContent {
|
||||
/// The encryption algorithm the key in this event is to be used with.
|
||||
///
|
||||
/// Must be `m.megolm.v1.aes-sha2`.
|
||||
pub algorithm: Algorithm,
|
||||
pub algorithm: EventEncryptionAlgorithm,
|
||||
|
||||
/// The room where the key is used.
|
||||
pub room_id: RoomId,
|
||||
@ -33,17 +32,17 @@ pub struct RoomKeyEventContent {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use ruma_identifiers::room_id;
|
||||
use ruma_identifiers::{room_id, EventEncryptionAlgorithm};
|
||||
use serde_json::{json, to_value as to_json_value};
|
||||
|
||||
use super::RoomKeyEventContent;
|
||||
use crate::{Algorithm, BasicEvent};
|
||||
use crate::BasicEvent;
|
||||
|
||||
#[test]
|
||||
fn serialization() {
|
||||
let ev = BasicEvent {
|
||||
content: RoomKeyEventContent {
|
||||
algorithm: Algorithm::MegolmV1AesSha2,
|
||||
algorithm: EventEncryptionAlgorithm::MegolmV1AesSha2,
|
||||
room_id: room_id!("!testroomid:example.org"),
|
||||
session_id: "SessId".into(),
|
||||
session_key: "SessKey".into(),
|
||||
|
@ -1,11 +1,10 @@
|
||||
//! Types for the *m.room_key_request* event.
|
||||
|
||||
use ruma_events_macros::BasicEventContent;
|
||||
use ruma_identifiers::{DeviceId, RoomId};
|
||||
use ruma_identifiers::{DeviceId, EventEncryptionAlgorithm, RoomId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use strum::{Display, EnumString};
|
||||
|
||||
use super::Algorithm;
|
||||
use crate::BasicEvent;
|
||||
|
||||
/// This event type is used to request keys for end-to-end encryption.
|
||||
@ -54,7 +53,7 @@ pub enum Action {
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
pub struct RequestedKeyInfo {
|
||||
/// The encryption algorithm the requested key in this event is to be used with.
|
||||
pub algorithm: Algorithm,
|
||||
pub algorithm: EventEncryptionAlgorithm,
|
||||
|
||||
/// The room where the key is used.
|
||||
pub room_id: RoomId,
|
||||
|
@ -1,7 +1,5 @@
|
||||
use ruma_events::{
|
||||
room_key::RoomKeyEventContent, Algorithm, AnyToDeviceEventContent, ToDeviceEvent,
|
||||
};
|
||||
use ruma_identifiers::{room_id, user_id};
|
||||
use ruma_events::{room_key::RoomKeyEventContent, AnyToDeviceEventContent, ToDeviceEvent};
|
||||
use ruma_identifiers::{room_id, user_id, EventEncryptionAlgorithm};
|
||||
use serde_json::{json, to_value as to_json_value};
|
||||
|
||||
#[test]
|
||||
@ -9,7 +7,7 @@ fn serialization() {
|
||||
let ev = ToDeviceEvent {
|
||||
sender: user_id!("@example:example.org"),
|
||||
content: AnyToDeviceEventContent::RoomKey(RoomKeyEventContent {
|
||||
algorithm: Algorithm::MegolmV1AesSha2,
|
||||
algorithm: EventEncryptionAlgorithm::MegolmV1AesSha2,
|
||||
room_id: room_id!("!testroomid:example.org"),
|
||||
session_id: "SessId".into(),
|
||||
session_key: "SessKey".into(),
|
||||
|
@ -16,5 +16,7 @@ edition = "2018"
|
||||
default = ["serde"]
|
||||
|
||||
[dependencies]
|
||||
ruma-serde = { version = "0.2.3", path = "../ruma-serde" }
|
||||
serde = { version = "1.0.114", optional = true, features = ["derive"] }
|
||||
serde_json = "1.0.57"
|
||||
strum = { version = "0.19.2", features = ["derive"] }
|
||||
|
@ -1,6 +1,7 @@
|
||||
//! Key algorithms used in Matrix spec.
|
||||
|
||||
use std::convert::TryFrom;
|
||||
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{Deserialize, Serialize};
|
||||
@ -65,9 +66,62 @@ impl TryFrom<String> for ServerKeyAlgorithm {
|
||||
}
|
||||
}
|
||||
|
||||
/// An encryption algorithm to be used to encrypt messages sent to a room.
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
#[cfg_attr(
|
||||
feature = "serde",
|
||||
derive(Deserialize, Serialize),
|
||||
serde(from = "String", into = "String")
|
||||
)]
|
||||
#[non_exhaustive]
|
||||
pub enum EventEncryptionAlgorithm {
|
||||
/// Olm version 1 using Curve25519, AES-256, and SHA-256.
|
||||
OlmV1Curve25519AesSha2,
|
||||
|
||||
/// Megolm version 1 using AES-256 and SHA-256.
|
||||
MegolmV1AesSha2,
|
||||
|
||||
/// Any algorithm that is not part of the specification.
|
||||
Custom(String),
|
||||
}
|
||||
|
||||
impl Display for EventEncryptionAlgorithm {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
|
||||
let algorithm_str = match *self {
|
||||
EventEncryptionAlgorithm::OlmV1Curve25519AesSha2 => "m.olm.v1.curve25519-aes-sha2",
|
||||
EventEncryptionAlgorithm::MegolmV1AesSha2 => "m.megolm.v1.aes-sha2",
|
||||
EventEncryptionAlgorithm::Custom(ref algorithm) => algorithm,
|
||||
};
|
||||
|
||||
write!(f, "{}", algorithm_str)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> From<T> for EventEncryptionAlgorithm
|
||||
where
|
||||
T: Into<String> + AsRef<str>,
|
||||
{
|
||||
fn from(s: T) -> EventEncryptionAlgorithm {
|
||||
match s.as_ref() {
|
||||
"m.olm.v1.curve25519-aes-sha2" => EventEncryptionAlgorithm::OlmV1Curve25519AesSha2,
|
||||
"m.megolm.v1.aes-sha2" => EventEncryptionAlgorithm::MegolmV1AesSha2,
|
||||
_ => EventEncryptionAlgorithm::Custom(s.into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<EventEncryptionAlgorithm> for String {
|
||||
fn from(algorithm: EventEncryptionAlgorithm) -> String {
|
||||
algorithm.to_string()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{DeviceKeyAlgorithm, ServerKeyAlgorithm};
|
||||
use ruma_serde::test::serde_json_eq;
|
||||
use serde_json::json;
|
||||
|
||||
use super::{DeviceKeyAlgorithm, EventEncryptionAlgorithm, ServerKeyAlgorithm};
|
||||
|
||||
#[test]
|
||||
fn parse_device_key_algorithm() {
|
||||
@ -80,4 +134,17 @@ mod tests {
|
||||
fn parse_server_key_algorithm() {
|
||||
assert_eq!("ed25519".parse(), Ok(ServerKeyAlgorithm::Ed25519));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn event_encryption_algorithm_serde() {
|
||||
serde_json_eq(EventEncryptionAlgorithm::MegolmV1AesSha2, json!("m.megolm.v1.aes-sha2"));
|
||||
serde_json_eq(
|
||||
EventEncryptionAlgorithm::OlmV1Curve25519AesSha2,
|
||||
json!("m.olm.v1.curve25519-aes-sha2"),
|
||||
);
|
||||
serde_json_eq(
|
||||
EventEncryptionAlgorithm::Custom("io.ruma.test".into()),
|
||||
json!("io.ruma.test"),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
use std::{num::NonZeroU8, str::FromStr};
|
||||
|
||||
use crate::{key_algorithms::DeviceKeyAlgorithm, Error};
|
||||
use crate::{crypto_algorithms::DeviceKeyAlgorithm, Error};
|
||||
|
||||
pub fn validate(s: &str) -> Result<NonZeroU8, Error> {
|
||||
let colon_idx = NonZeroU8::new(s.find(':').ok_or(Error::MissingDeviceKeyDelimiter)? as u8)
|
||||
|
@ -1,7 +1,7 @@
|
||||
pub mod crypto_algorithms;
|
||||
pub mod device_key_id;
|
||||
pub mod error;
|
||||
pub mod event_id;
|
||||
pub mod key_algorithms;
|
||||
pub mod room_alias_id;
|
||||
pub mod room_id;
|
||||
pub mod room_id_or_alias_id;
|
||||
|
@ -1,6 +1,6 @@
|
||||
use std::{num::NonZeroU8, str::FromStr};
|
||||
|
||||
use crate::{key_algorithms::ServerKeyAlgorithm, Error};
|
||||
use crate::{crypto_algorithms::ServerKeyAlgorithm, Error};
|
||||
|
||||
pub fn validate(s: &str) -> Result<NonZeroU8, Error> {
|
||||
let colon_idx = NonZeroU8::new(s.find(':').ok_or(Error::MissingServerKeyDelimiter)? as u8)
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
use std::{convert::TryInto, num::NonZeroU8, str::FromStr};
|
||||
|
||||
use ruma_identifiers_validation::{key_algorithms::DeviceKeyAlgorithm, Error};
|
||||
use ruma_identifiers_validation::{crypto_algorithms::DeviceKeyAlgorithm, Error};
|
||||
|
||||
use crate::DeviceId;
|
||||
|
||||
@ -56,7 +56,7 @@ common_impls!(DeviceKeyId, try_from, "Device key ID with algorithm and device ID
|
||||
mod test {
|
||||
use std::convert::TryFrom;
|
||||
|
||||
use ruma_identifiers_validation::{key_algorithms::DeviceKeyAlgorithm, Error};
|
||||
use ruma_identifiers_validation::{crypto_algorithms::DeviceKeyAlgorithm, Error};
|
||||
#[cfg(feature = "serde")]
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
|
@ -22,8 +22,8 @@ pub use crate::{
|
||||
};
|
||||
#[doc(inline)]
|
||||
pub use ruma_identifiers_validation::{
|
||||
crypto_algorithms::{DeviceKeyAlgorithm, EventEncryptionAlgorithm, ServerKeyAlgorithm},
|
||||
error::Error,
|
||||
key_algorithms::{DeviceKeyAlgorithm, ServerKeyAlgorithm},
|
||||
};
|
||||
|
||||
#[macro_use]
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
use std::{convert::TryInto, num::NonZeroU8, str::FromStr};
|
||||
|
||||
use ruma_identifiers_validation::{key_algorithms::ServerKeyAlgorithm, Error};
|
||||
use ruma_identifiers_validation::{crypto_algorithms::ServerKeyAlgorithm, Error};
|
||||
|
||||
/// Key identifiers used for homeserver signing keys.
|
||||
#[derive(Clone, Debug)]
|
||||
@ -59,7 +59,7 @@ mod tests {
|
||||
use crate::{Error, ServerKeyId};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use ruma_identifiers_validation::key_algorithms::ServerKeyAlgorithm;
|
||||
use ruma_identifiers_validation::crypto_algorithms::ServerKeyAlgorithm;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
#[test]
|
||||
|
Loading…
x
Reference in New Issue
Block a user