From 048a81cc558e07d9899e2b61974c7334b3aa89b2 Mon Sep 17 00:00:00 2001 From: Stefan Sterz Date: Wed, 6 Mar 2024 13:36:08 +0100 Subject: [PATCH] auth: move to auth-api's private and public keys when loading keys this commit moves away from using openssl's `PKey` and uses the wrappers from proxmox-auth-api. this allows us to handle keys in a more flexible way and enables as to move to ec based crypto for the authkey in the future. Signed-off-by: Stefan Sterz --- src/auth.rs | 4 ++-- src/auth_helpers.rs | 42 +++++++++++++----------------------------- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/auth.rs b/src/auth.rs index bada973a..21468d4b 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -349,9 +349,9 @@ pub(crate) fn authenticate_user<'a>( } static PRIVATE_KEYRING: Lazy = - Lazy::new(|| Keyring::with_private_key(crate::auth_helpers::private_auth_key().clone().into())); + Lazy::new(|| Keyring::with_private_key(crate::auth_helpers::private_auth_key().clone())); static PUBLIC_KEYRING: Lazy = - Lazy::new(|| Keyring::with_public_key(crate::auth_helpers::public_auth_key().clone().into())); + Lazy::new(|| Keyring::with_public_key(crate::auth_helpers::public_auth_key().clone())); static AUTH_CONTEXT: OnceCell = OnceCell::new(); pub fn setup_auth_context(use_private_key: bool) { diff --git a/src/auth_helpers.rs b/src/auth_helpers.rs index 1a483d84..bbe3001d 100644 --- a/src/auth_helpers.rs +++ b/src/auth_helpers.rs @@ -2,12 +2,10 @@ use std::path::PathBuf; use std::sync::OnceLock; use anyhow::Error; -use lazy_static::lazy_static; -use openssl::pkey::{PKey, Private, Public}; use openssl::rsa::Rsa; use pbs_config::BackupLockGuard; -use proxmox_auth_api::HMACKey; +use proxmox_auth_api::{HMACKey, PrivateKey, PublicKey}; use proxmox_sys::fs::{file_get_contents, replace_file, CreateOptions}; use pbs_buildcfg::configdir; @@ -98,36 +96,22 @@ pub fn csrf_secret() -> &'static HMACKey { }) } -fn load_public_auth_key() -> Result, Error> { - let pem = file_get_contents(configdir!("/authkey.pub"))?; - let rsa = Rsa::public_key_from_pem(&pem)?; - let key = PKey::from_rsa(rsa)?; +pub fn public_auth_key() -> &'static PublicKey { + static KEY: OnceLock = OnceLock::new(); - Ok(key) -} - -pub fn public_auth_key() -> &'static PKey { - lazy_static! { - static ref KEY: PKey = load_public_auth_key().unwrap(); - } - - &KEY -} - -fn load_private_auth_key() -> Result, Error> { - let pem = file_get_contents(configdir!("/authkey.key"))?; - let rsa = Rsa::private_key_from_pem(&pem)?; - let key = PKey::from_rsa(rsa)?; - - Ok(key) + KEY.get_or_init(|| { + let pem = file_get_contents(configdir!("/authkey.pub")).unwrap(); + PublicKey::from_pem(&pem).unwrap() + }) } -pub fn private_auth_key() -> &'static PKey { - lazy_static! { - static ref KEY: PKey = load_private_auth_key().unwrap(); - } +pub fn private_auth_key() -> &'static PrivateKey { + static KEY: OnceLock = OnceLock::new(); - &KEY + KEY.get_or_init(|| { + let pem = file_get_contents(configdir!("/authkey.key")).unwrap(); + PrivateKey::from_pem(&pem).unwrap() + }) } const LDAP_PASSWORDS_FILENAME: &str = configdir!("/ldap_passwords.json"); -- 2.39.5