2022-09-07 13:25:51 +02:00
|
|
|
use ruma::signatures::Ed25519KeyPair;
|
2022-08-07 19:42:22 +02:00
|
|
|
|
2022-09-07 13:25:51 +02:00
|
|
|
use crate::{Result, service, database::KeyValueDatabase, Error, utils};
|
2022-08-07 19:42:22 +02:00
|
|
|
|
2022-09-07 13:25:51 +02:00
|
|
|
impl service::globals::Data for KeyValueDatabase {
|
|
|
|
fn load_keypair(&self) -> Result<Ed25519KeyPair> {
|
|
|
|
let keypair_bytes = self.globals.get(b"keypair")?.map_or_else(
|
2021-06-08 18:10:00 +02:00
|
|
|
|| {
|
|
|
|
let keypair = utils::generate_keypair();
|
2022-09-07 13:25:51 +02:00
|
|
|
self.globals.insert(b"keypair", &keypair)?;
|
2021-06-08 18:10:00 +02:00
|
|
|
Ok::<_, Error>(keypair)
|
|
|
|
},
|
|
|
|
|s| Ok(s.to_vec()),
|
|
|
|
)?;
|
2020-09-15 21:46:10 +02:00
|
|
|
|
2021-06-08 18:10:00 +02:00
|
|
|
let mut parts = keypair_bytes.splitn(2, |&b| b == 0xff);
|
2020-09-15 21:46:10 +02:00
|
|
|
|
|
|
|
let keypair = utils::string_from_bytes(
|
|
|
|
// 1. version
|
|
|
|
parts
|
|
|
|
.next()
|
|
|
|
.expect("splitn always returns at least one element"),
|
|
|
|
)
|
|
|
|
.map_err(|_| Error::bad_database("Invalid version bytes in keypair."))
|
|
|
|
.and_then(|version| {
|
|
|
|
// 2. key
|
|
|
|
parts
|
|
|
|
.next()
|
|
|
|
.ok_or_else(|| Error::bad_database("Invalid keypair format in database."))
|
|
|
|
.map(|key| (version, key))
|
|
|
|
})
|
|
|
|
.and_then(|(version, key)| {
|
2022-09-07 13:25:51 +02:00
|
|
|
Ed25519KeyPair::from_der(key, version)
|
2020-09-15 21:46:10 +02:00
|
|
|
.map_err(|_| Error::bad_database("Private or public keys are invalid."))
|
|
|
|
});
|
2022-01-24 18:42:15 -06:00
|
|
|
}
|
2022-09-07 13:25:51 +02:00
|
|
|
fn remove_keypair(&self) -> Result<()> {
|
|
|
|
self.globals.remove(b"keypair")?
|
2021-09-24 07:16:34 +00:00
|
|
|
}
|
2022-01-24 18:42:15 -06:00
|
|
|
}
|