pub mod ecdh;
pub mod ecdsa;
pub mod ed25519;
pub mod rsa;
pub mod x25519;
pub use rsa::{RsaOaepSha256Cipher, RsaOaepSha256Service};
#[derive(Clone, PartialEq, Eq)]
pub struct KeyPairHex {
pub private_key_hex: String,
pub public_key_hex: String,
}
impl std::fmt::Debug for KeyPairHex {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("KeyPairHex")
.field("private_key_hex", &"***")
.field("public_key_hex", &self.public_key_hex)
.finish()
}
}
impl KeyPairHex {
pub fn public_only(&self) -> &str {
&self.public_key_hex
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn debug_redacts_the_private_key() {
let pair = KeyPairHex {
private_key_hex: "deadbeef".repeat(8),
public_key_hex: "cafebabe".repeat(8),
};
let text = format!("{pair:?}");
assert!(!text.contains("deadbeef"), "私钥泄漏进 Debug: {text}");
assert!(text.contains("cafebabe"), "公钥应照常打印: {text}");
assert!(text.contains("***"));
}
#[test]
fn debug_redaction_keeps_value_semantics() {
let pair = KeyPairHex {
private_key_hex: "aa".repeat(32),
public_key_hex: "bb".repeat(33),
};
assert_eq!(pair.clone(), pair);
assert_eq!(pair.public_only(), pair.public_key_hex);
}
}