systemprompt_cli/shared/
identity.rs1use anyhow::{Context, Result};
7use base64::Engine;
8use serde::Serialize;
9use systemprompt_config::generate_seed;
10use systemprompt_security::keys::RsaSigningKey;
11
12use super::profile::generate_oauth_at_rest_pepper;
13
14#[derive(Debug, Clone, Serialize)]
15pub struct IdentityBundle {
16 pub oauth_at_rest_pepper: String,
17 pub manifest_signing_secret_seed: String,
18 pub signing_key_pem: String,
19 pub signing_kid: String,
20}
21
22pub fn generate_identity() -> Result<IdentityBundle> {
23 let key = RsaSigningKey::generate().context("RSA keypair generation failed")?;
24 let pem = key.to_pkcs8_pem().context("PKCS#8 PEM encoding failed")?;
25 let standard = base64::engine::general_purpose::STANDARD;
26 Ok(IdentityBundle {
27 oauth_at_rest_pepper: generate_oauth_at_rest_pepper(),
28 manifest_signing_secret_seed: standard.encode(generate_seed()),
29 signing_key_pem: standard.encode(pem.as_bytes()),
30 signing_kid: key.kid().to_owned(),
31 })
32}