ap signing keys
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
use rsa::{RsaPrivateKey, RsaPublicKey};
|
||||
use rsa::pkcs1::{EncodeRsaPrivateKey, EncodeRsaPublicKey, DecodeRsaPrivateKey, DecodeRsaPublicKey, LineEnding};
|
||||
use rusqlite::Connection;
|
||||
|
||||
pub struct ApKeys {
|
||||
pub private_key: RsaPrivateKey,
|
||||
pub public_key_pem: String,
|
||||
}
|
||||
|
||||
pub fn load_or_generate(db: &Connection) -> ApKeys {
|
||||
// try loading from DB
|
||||
if let Ok((pub_pem, priv_pem)) = db.query_row(
|
||||
"SELECT public_pem, private_pem FROM ap_keys WHERE id = 1",
|
||||
[],
|
||||
|row| Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)),
|
||||
) {
|
||||
let private_key = RsaPrivateKey::from_pkcs1_pem(&priv_pem)
|
||||
.expect("failed to parse stored RSA private key");
|
||||
let _ = RsaPublicKey::from_pkcs1_pem(&pub_pem)
|
||||
.expect("failed to parse stored RSA public key");
|
||||
return ApKeys {
|
||||
private_key,
|
||||
public_key_pem: pub_pem,
|
||||
};
|
||||
}
|
||||
|
||||
// generate new 2048-bit key pair
|
||||
tracing::info!("generating RSA-2048 key pair for ActivityPub...");
|
||||
let mut rng = rsa::rand_core::OsRng;
|
||||
let private_key = RsaPrivateKey::new(&mut rng, 2048)
|
||||
.expect("failed to generate RSA key");
|
||||
let public_key = RsaPublicKey::from(&private_key);
|
||||
|
||||
let pub_pem = public_key.to_pkcs1_pem(LineEnding::LF)
|
||||
.expect("failed to encode public key");
|
||||
let priv_pem = private_key.to_pkcs1_pem(LineEnding::LF)
|
||||
.expect("failed to encode private key");
|
||||
|
||||
let now = chrono::Utc::now().to_rfc3339();
|
||||
db.execute(
|
||||
"INSERT INTO ap_keys (id, public_pem, private_pem, created_at) VALUES (1, ?1, ?2, ?3)",
|
||||
rusqlite::params![pub_pem, priv_pem.as_str(), now],
|
||||
).expect("failed to store RSA keys");
|
||||
|
||||
tracing::info!("RSA key pair generated and stored");
|
||||
|
||||
ApKeys {
|
||||
private_key,
|
||||
public_key_pem: pub_pem,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user