Skip to main content

rings_core/session/
account.rs

1use serde::Deserialize;
2use serde::Serialize;
3
4use crate::dht::Did;
5use crate::ecc::keys::AccountVerifier;
6use crate::ecc::keys::SignatureAlgorithm;
7use crate::ecc::keys::VerificationPublicKey;
8use crate::ecc::PublicKey;
9use crate::error::Error;
10use crate::error::Result;
11
12/// An external account authorized to create a Rings session.
13///
14/// Rings supports recoverable signatures identified by DID and non-recoverable signatures
15/// identified by their verification public key.
16#[derive(Deserialize, Serialize, PartialEq, Eq, Debug, Clone)]
17pub enum Account {
18    /// secp256k1 recoverable account.
19    Secp256k1(Did),
20    /// secp256r1 account used by Web Crypto implementations.
21    Secp256r1(PublicKey<33>),
22    /// EIP-191 account.
23    EIP191(Did),
24    /// Bitcoin BIP-137 account.
25    BIP137(Did),
26    /// Ed25519 account.
27    Ed25519(PublicKey<33>),
28    /// BLS12-381 account.
29    Bls12381(PublicKey<48>),
30}
31
32impl TryFrom<(String, String)> for Account {
33    type Error = Error;
34
35    fn try_from((account_entity, account_type): (String, String)) -> Result<Self> {
36        match AccountVerifier::from_account_parts(&account_entity, &account_type)? {
37            AccountVerifier::Recoverable {
38                algorithm: SignatureAlgorithm::Secp256k1,
39                did,
40            } => Ok(Account::Secp256k1(did)),
41            AccountVerifier::Recoverable {
42                algorithm: SignatureAlgorithm::Eip191,
43                did,
44            } => Ok(Account::EIP191(did)),
45            AccountVerifier::Recoverable {
46                algorithm: SignatureAlgorithm::Bip137,
47                did,
48            } => Ok(Account::BIP137(did)),
49            AccountVerifier::PublicKey(VerificationPublicKey::Secp256r1(pk)) => {
50                Ok(Account::Secp256r1(pk))
51            }
52            AccountVerifier::PublicKey(VerificationPublicKey::Ed25519(pk)) => {
53                Ok(Account::Ed25519(pk))
54            }
55            AccountVerifier::PublicKey(VerificationPublicKey::Bls12381(pk)) => {
56                Ok(Account::Bls12381(pk))
57            }
58            _ => Err(Error::UnknownAccount),
59        }
60    }
61}
62
63impl Account {
64    pub(super) fn account_verifier(&self) -> AccountVerifier {
65        match self {
66            Self::Secp256k1(did) => AccountVerifier::Recoverable {
67                algorithm: SignatureAlgorithm::Secp256k1,
68                did: *did,
69            },
70            Self::EIP191(did) => AccountVerifier::Recoverable {
71                algorithm: SignatureAlgorithm::Eip191,
72                did: *did,
73            },
74            Self::BIP137(did) => AccountVerifier::Recoverable {
75                algorithm: SignatureAlgorithm::Bip137,
76                did: *did,
77            },
78            Self::Secp256r1(pk) => {
79                AccountVerifier::PublicKey(VerificationPublicKey::Secp256r1(*pk))
80            }
81            Self::Ed25519(pk) => AccountVerifier::PublicKey(VerificationPublicKey::Ed25519(*pk)),
82            Self::Bls12381(pk) => AccountVerifier::PublicKey(VerificationPublicKey::Bls12381(*pk)),
83        }
84    }
85}