diff --git a/backend/src/ee.rs b/backend/src/ee.rs index 47f4596fc0..865819a701 100644 --- a/backend/src/ee.rs +++ b/backend/src/ee.rs @@ -8,16 +8,31 @@ use sha2::Sha256; #[cfg(feature = "enterprise")] pub fn verify_license_key(license_key: Option) -> anyhow::Result<()> { if let Some(license_key) = license_key { - let splitted_lk = license_key - .split_once(".") - .expect("license_key can be splitted with a ."); + let mut splitted_lk = license_key.split("."); + if splitted_lk.clone().count() != 3 { + panic!("license_key can be splitted with 2 . (..)"); + } + let id = splitted_lk.next().unwrap(); + let expiry = splitted_lk.next().unwrap(); + let signature_b64 = splitted_lk.next().unwrap(); + let expiry_nb = expiry.parse::()?; + if expiry_nb < chrono::Utc::now().timestamp() as u64 { + panic!( + "License key is expired (timestamp expiry: {expiry_nb}. Now: {}", + chrono::Utc::now().timestamp() + ); + } + const PUBLIC_KEY: &str = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgVShzcLSPiOi+8ET8fggob1kmi47/cE12JaidPkwfGnScZItghkqtiLsct0U4kJhlp5gO89DYTBmIKadvxwY7kMsLlZzmi2emVH7c27cByGASY8QmWDNdG4Ggy/NDflGGBdAtN6gHawZAg4zHv3qpbPQGHH1/6sXIohcXhOnouwIDAQAB"; let pub_key = rsa::RsaPublicKey::from_public_key_der( - &base64::engine::general_purpose::STANDARD.decode("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgVShzcLSPiOi+8ET8fggob1kmi47/cE12JaidPkwfGnScZItghkqtiLsct0U4kJhlp5gO89DYTBmIKadvxwY7kMsLlZzmi2emVH7c27cByGASY8QmWDNdG4Ggy/NDflGGBdAtN6gHawZAg4zHv3qpbPQGHH1/6sXIohcXhOnouwIDAQAB")?)?; - let msg = base64::engine::general_purpose::STANDARD.decode(splitted_lk.0)?; - let signature = base64::engine::general_purpose::STANDARD.decode(splitted_lk.1)?; + &base64::engine::general_purpose::STANDARD.decode(PUBLIC_KEY)?, + )?; + let signature = base64::engine::general_purpose::STANDARD.decode(signature_b64)?; rsa::pss::VerifyingKey::::new(pub_key) - .verify(&msg, &rsa::pss::Signature::from(signature)) + .verify( + &format!("{id}{expiry}").as_bytes(), + &rsa::pss::Signature::from(signature), + ) .map_err(|_| anyhow::anyhow!("Invalid license key".to_string()))?; } else { panic!("License key is required for the enterprise edition");