use crate::error::AgentError;
use crate::storage::keychain::{IdentityDID, KeyAlias, KeyRole, KeyStorage};
pub struct AndroidKeystoreStorage {
#[allow(dead_code)] service_name: String,
}
impl AndroidKeystoreStorage {
pub fn new(service_name: &str) -> Result<Self, AgentError> {
Ok(Self {
service_name: service_name.to_string(),
})
}
fn stub_error() -> AgentError {
AgentError::BackendUnavailable {
backend: "android-keystore",
reason: "Android Keystore requires JNI bridge (not yet implemented)".to_string(),
}
}
}
impl KeyStorage for AndroidKeystoreStorage {
fn store_key(
&self,
_alias: &KeyAlias,
_identity_did: &IdentityDID,
_role: KeyRole,
_encrypted_key_data: &[u8],
) -> Result<(), AgentError> {
Err(Self::stub_error())
}
fn load_key(&self, _alias: &KeyAlias) -> Result<(IdentityDID, KeyRole, Vec<u8>), AgentError> {
Err(Self::stub_error())
}
fn delete_key(&self, _alias: &KeyAlias) -> Result<(), AgentError> {
Err(Self::stub_error())
}
fn list_aliases(&self) -> Result<Vec<KeyAlias>, AgentError> {
Err(Self::stub_error())
}
fn list_aliases_for_identity(
&self,
_identity_did: &IdentityDID,
) -> Result<Vec<KeyAlias>, AgentError> {
Err(Self::stub_error())
}
fn get_identity_for_alias(&self, _alias: &KeyAlias) -> Result<IdentityDID, AgentError> {
Err(Self::stub_error())
}
fn backend_name(&self) -> &'static str {
"android-keystore"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_succeeds() {
let storage = AndroidKeystoreStorage::new("test.service");
assert!(storage.is_ok());
}
#[test]
fn test_backend_name() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
assert_eq!(storage.backend_name(), "android-keystore");
}
#[test]
fn test_store_key_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let did = IdentityDID::new_unchecked("did:keri:test");
let alias = KeyAlias::new("alias");
let result = storage.store_key(&alias, &did, KeyRole::Primary, b"data");
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
#[test]
fn test_load_key_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let alias = KeyAlias::new("alias");
let result = storage.load_key(&alias);
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
#[test]
fn test_delete_key_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let alias = KeyAlias::new("alias");
let result = storage.delete_key(&alias);
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
#[test]
fn test_list_aliases_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let result = storage.list_aliases();
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
#[test]
fn test_list_aliases_for_identity_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let did = IdentityDID::new_unchecked("did:keri:test");
let result = storage.list_aliases_for_identity(&did);
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
#[test]
fn test_get_identity_for_alias_returns_unavailable() {
let storage = AndroidKeystoreStorage::new("test").unwrap();
let alias = KeyAlias::new("alias");
let result = storage.get_identity_for_alias(&alias);
assert!(matches!(result, Err(AgentError::BackendUnavailable { .. })));
}
}