sequoia_openpgp/crypto/
key.rs1use std::time::SystemTime;
4
5use crate::{
6 Result,
7 crypto::{
8 PublicKeyAlgorithm,
9 backend::{Backend, interface::Asymmetric},
10 mpi,
11 },
12 packet::key::{self, Key4, Key6, SecretParts},
13 types::Curve,
14};
15
16impl<R> Key6<SecretParts, R>
17 where R: key::KeyRole,
18{
19 pub fn generate_x25519() -> Result<Self> {
21 Key4::generate_x25519().map(Key6::from_common)
22 }
23
24 pub fn generate_x448() -> Result<Self> {
26 Key4::generate_x448().map(Key6::from_common)
27 }
28
29 pub fn generate_ed25519() -> Result<Self> {
31 Key4::generate_ed25519().map(Key6::from_common)
32 }
33
34 pub fn generate_ed448() -> Result<Self> {
36 Key4::generate_ed448().map(Key6::from_common)
37 }
38
39 pub fn generate_mldsa65_ed25519() -> Result<Self> {
41 let (eddsa_secret, eddsa_public) = Backend::ed25519_generate_key()?;
42 let (mldsa_secret, mldsa_public) = Backend::mldsa65_generate_key()?;
43
44 Self::with_secret(
45 crate::now(),
46 PublicKeyAlgorithm::MLDSA65_Ed25519,
47 mpi::PublicKey::MLDSA65_Ed25519 {
48 eddsa: Box::new(eddsa_public),
49 mldsa: mldsa_public,
50 },
51 mpi::SecretKeyMaterial::MLDSA65_Ed25519 {
52 eddsa: eddsa_secret,
53 mldsa: mldsa_secret,
54 }.into())
55 }
56
57 pub fn generate_mldsa87_ed448() -> Result<Self> {
59 let (eddsa_secret, eddsa_public) = Backend::ed448_generate_key()?;
60 let (mldsa_secret, mldsa_public) = Backend::mldsa87_generate_key()?;
61
62 Self::with_secret(
63 crate::now(),
64 PublicKeyAlgorithm::MLDSA87_Ed448,
65 mpi::PublicKey::MLDSA87_Ed448 {
66 eddsa: Box::new(eddsa_public),
67 mldsa: mldsa_public,
68 },
69 mpi::SecretKeyMaterial::MLDSA87_Ed448 {
70 eddsa: eddsa_secret,
71 mldsa: mldsa_secret,
72 }.into())
73 }
74
75 pub fn generate_slhdsa128s() -> Result<Self> {
81 let (secret, public) = Backend::slhdsa128s_generate_key()?;
82
83 Self::with_secret(
84 crate::now(),
85 PublicKeyAlgorithm::SLHDSA128s,
86 mpi::PublicKey::SLHDSA128s { public },
87 mpi::SecretKeyMaterial::SLHDSA128s { secret }.into())
88 }
89
90 pub fn generate_slhdsa128f() -> Result<Self> {
96 let (secret, public) = Backend::slhdsa128f_generate_key()?;
97
98 Self::with_secret(
99 crate::now(),
100 PublicKeyAlgorithm::SLHDSA128f,
101 mpi::PublicKey::SLHDSA128f { public },
102 mpi::SecretKeyMaterial::SLHDSA128f { secret }.into())
103 }
104
105 pub fn generate_slhdsa256s() -> Result<Self> {
111 let (secret, public) = Backend::slhdsa256s_generate_key()?;
112
113 Self::with_secret(
114 crate::now(),
115 PublicKeyAlgorithm::SLHDSA256s,
116 mpi::PublicKey::SLHDSA256s { public },
117 mpi::SecretKeyMaterial::SLHDSA256s { secret }.into())
118 }
119
120 pub fn generate_mlkem768_x25519() -> Result<Self> {
122 Key4::generate_mlkem768_x25519()
123 .map(Key6::from_common)
124 }
125
126 pub fn generate_mlkem1024_x448() -> Result<Self> {
128 let (ecdh_secret, ecdh_public) = Backend::x448_generate_key()?;
129 let (mlkem_secret, mlkem_public) = Backend::mlkem1024_generate_key()?;
130
131 Self::with_secret(
132 crate::now(),
133 PublicKeyAlgorithm::MLKEM1024_X448,
134 mpi::PublicKey::MLKEM1024_X448 {
135 ecdh: Box::new(ecdh_public),
136 mlkem: mlkem_public,
137 },
138 mpi::SecretKeyMaterial::MLKEM1024_X448 {
139 ecdh: ecdh_secret,
140 mlkem: mlkem_secret,
141 }.into())
142 }
143
144 pub fn generate_rsa(bits: usize) -> Result<Self> {
146 Key4::generate_rsa(bits)
147 .map(Key6::from_common)
148 }
149
150 #[allow(clippy::many_single_char_names)]
156 pub fn import_secret_rsa<T>(d: &[u8], p: &[u8], q: &[u8], ctime: T)
157 -> Result<Self> where T: Into<Option<SystemTime>>
158 {
159 Key4::import_secret_rsa(d, p, q, ctime)
160 .map(Key6::from_common)
161 }
162
163 pub fn generate_ecc(for_signing: bool, curve: Curve) -> Result<Self> {
170 match (for_signing, curve) {
171 (true, Curve::Ed25519) => Self::generate_ed25519(),
172 (false, Curve::Cv25519) => Self::generate_x25519(),
173 (s, c) => Key4::generate_ecc(s, c).map(Key6::from_common),
174 }
175 }
176}