core_crypto_ffi/
database_key.rs

1use core_crypto_keystore::Connection as Database;
2#[cfg(target_family = "wasm")]
3use wasm_bindgen::prelude::*;
4
5use crate::{CoreCryptoError, CoreCryptoResult};
6
7// TODO: We derive Constructor here only because we need to construct an instance in interop.
8// Remove it once we drop the FFI client from interop.
9#[derive(Debug, derive_more::From, derive_more::Into)]
10#[cfg_attr(target_family = "wasm", wasm_bindgen)]
11#[cfg_attr(not(target_family = "wasm"), derive(derive_more::Deref, derive_more::Constructor))]
12pub struct DatabaseKey(core_crypto_keystore::DatabaseKey);
13
14#[cfg(not(target_family = "wasm"))]
15uniffi::custom_type!(DatabaseKey, Vec<u8>, {
16    lower: |key| key.0.to_vec(),
17    try_lift: |vec| {
18        core_crypto_keystore::DatabaseKey::try_from(vec.as_slice())
19            .map(DatabaseKey)
20            .map_err(CoreCryptoError::generic())
21            .map_err(Into::into)
22    }
23});
24
25/// Updates the key of the CoreCrypto database.
26/// To be used only once, when moving from CoreCrypto <= 5.x to CoreCrypto 6.x.
27#[cfg_attr(target_family = "wasm", wasm_bindgen(js_name = "migrateDatabaseKeyTypeToBytes"))]
28#[cfg_attr(not(target_family = "wasm"), uniffi::export)]
29pub async fn migrate_db_key_type_to_bytes(name: &str, old_key: &str, new_key: &DatabaseKey) -> CoreCryptoResult<()> {
30    Database::migrate_db_key_type_to_bytes(name, old_key, &new_key.0)
31        .await
32        .map_err(CoreCryptoError::generic())
33}
34
35#[cfg(target_family = "wasm")]
36#[wasm_bindgen]
37impl DatabaseKey {
38    #[wasm_bindgen(constructor)]
39    pub fn new(buf: &[u8]) -> Result<DatabaseKey, wasm_bindgen::JsError> {
40        let key = core_crypto_keystore::DatabaseKey::try_from(buf).map_err(CoreCryptoError::generic())?;
41        Ok(DatabaseKey(key))
42    }
43}