Skip to main content

encryption/manager/
asymmetric.rs

1// Copyright (c) 2026 erik <erik@erik.xyz> — https://erik.xyz
2
3//! 非对称能力门面:签名([`SignatureManager`])与密钥协商([`KeyAgreementManager`])。
4//!
5//! 与 [`super`] 里的门面同构;单独成文件是为了让 `manager.rs` 保持在 500 行以内。
6
7use super::check_default;
8use crate::contract::{KeyAgreement, Signer};
9use crate::error::Result;
10use crate::registry::Registry;
11
12/// 签名门面。
13#[derive(Debug)]
14pub struct SignatureManager {
15    registry: Registry<Box<dyn Signer>>,
16    default_identifier: String,
17}
18
19impl SignatureManager {
20    pub fn new(
21        registry: Registry<Box<dyn Signer>>,
22        default_identifier: impl Into<String>,
23    ) -> Result<Self> {
24        let default_identifier = default_identifier.into();
25        check_default(
26            registry.has(&default_identifier),
27            "signer",
28            &default_identifier,
29        )?;
30        Ok(Self {
31            registry,
32            default_identifier,
33        })
34    }
35
36    /// 返回十六进制签名。
37    pub fn sign(&self, message: &[u8], private_key_hex: &str) -> Result<String> {
38        self.sign_with(&self.default_identifier, message, private_key_hex)
39    }
40
41    pub fn sign_with(
42        &self,
43        identifier: &str,
44        message: &[u8],
45        private_key_hex: &str,
46    ) -> Result<String> {
47        self.registry
48            .get(identifier)?
49            .sign(message, private_key_hex)
50    }
51
52    pub fn verify(&self, message: &[u8], signature_hex: &str, public_key_hex: &str) -> Result<()> {
53        self.verify_with(
54            &self.default_identifier,
55            message,
56            signature_hex,
57            public_key_hex,
58        )
59    }
60
61    pub fn verify_with(
62        &self,
63        identifier: &str,
64        message: &[u8],
65        signature_hex: &str,
66        public_key_hex: &str,
67    ) -> Result<()> {
68        self.registry
69            .get(identifier)?
70            .verify(message, signature_hex, public_key_hex)
71    }
72
73    pub fn registry(&self) -> &Registry<Box<dyn Signer>> {
74        &self.registry
75    }
76
77    pub fn registry_mut(&mut self) -> &mut Registry<Box<dyn Signer>> {
78        &mut self.registry
79    }
80
81    pub fn default_identifier(&self) -> &str {
82        &self.default_identifier
83    }
84
85    pub fn set_default_identifier(&mut self, identifier: impl Into<String>) -> Result<()> {
86        let identifier = identifier.into();
87        check_default(self.registry.has(&identifier), "signer", &identifier)?;
88        self.default_identifier = identifier;
89        Ok(())
90    }
91}
92
93/// 密钥协商门面。
94#[derive(Debug)]
95pub struct KeyAgreementManager {
96    registry: Registry<Box<dyn KeyAgreement>>,
97    default_identifier: String,
98}
99
100impl KeyAgreementManager {
101    pub fn new(
102        registry: Registry<Box<dyn KeyAgreement>>,
103        default_identifier: impl Into<String>,
104    ) -> Result<Self> {
105        let default_identifier = default_identifier.into();
106        check_default(
107            registry.has(&default_identifier),
108            "key agreement",
109            &default_identifier,
110        )?;
111        Ok(Self {
112            registry,
113            default_identifier,
114        })
115    }
116
117    /// 返回定长共享秘密的十六进制。
118    pub fn agree(&self, private_key_hex: &str, peer_public_key_hex: &str) -> Result<String> {
119        self.agree_with(
120            &self.default_identifier,
121            private_key_hex,
122            peer_public_key_hex,
123        )
124    }
125
126    pub fn agree_with(
127        &self,
128        identifier: &str,
129        private_key_hex: &str,
130        peer_public_key_hex: &str,
131    ) -> Result<String> {
132        self.registry
133            .get(identifier)?
134            .agree(private_key_hex, peer_public_key_hex)
135    }
136
137    pub fn registry(&self) -> &Registry<Box<dyn KeyAgreement>> {
138        &self.registry
139    }
140
141    pub fn registry_mut(&mut self) -> &mut Registry<Box<dyn KeyAgreement>> {
142        &mut self.registry
143    }
144
145    pub fn default_identifier(&self) -> &str {
146        &self.default_identifier
147    }
148
149    pub fn set_default_identifier(&mut self, identifier: impl Into<String>) -> Result<()> {
150        let identifier = identifier.into();
151        check_default(self.registry.has(&identifier), "key agreement", &identifier)?;
152        self.default_identifier = identifier;
153        Ok(())
154    }
155}