Skip to main content

alvan_lic/
lib.rs

1//! # alvan-lic
2//!
3//! A Rust crate for generating and validating time-based license keys with offline validation.
4//!
5//! ## Features
6//! - Generate license keys with custom expiration times
7//! - Validate license keys offline using HMAC
8//! - Keys always start with "alvan-"
9//! - Secure against tampering using cryptographic signatures
10//!
11//! ## Example
12//! ```rust
13//! use alvan_lic::{LicenseGenerator, LicenseValidator};
14//!
15//! // Create a generator with your secret key
16//! let secret_key = "your-super-secret-key";
17//! let generator = LicenseGenerator::new(secret_key);
18//!
19//! // Generate a license valid for 24 hours
20//! let license_key = generator.generate_key(24).unwrap();
21//! println!("Generated license: {}", license_key);
22//!
23//! // Validate the license
24//! let validator = LicenseValidator::new(secret_key);
25//! match validator.validate_key(&license_key) {
26//!     Ok(info) => println!("License is valid until: {}", info.expires_at),
27//!     Err(e) => println!("License validation failed: {}", e),
28//! }
29//! ```
30
31mod error;
32mod generator;
33mod validator;
34
35pub use error::{LicenseError, Result};
36pub use generator::LicenseGenerator;
37pub use validator::{LicenseInfo, LicenseValidator};
38
39/// The prefix for all license keys
40pub const LICENSE_PREFIX: &str = "alvan-";
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_license_generation_and_validation() {
48        let secret = "test-secret-key";
49        let generator = LicenseGenerator::new(secret);
50        let validator = LicenseValidator::new(secret);
51
52        // Generate a license valid for 1 hour
53        let license = generator.generate_key(1).unwrap();
54        assert!(license.starts_with(LICENSE_PREFIX));
55
56        // Validate the license
57        let info = validator.validate_key(&license).unwrap();
58        assert!(info.is_valid);
59        assert!(info.hours_remaining > 0.0);
60    }
61
62    #[test]
63    fn test_invalid_secret_key() {
64        let generator = LicenseGenerator::new("secret1");
65        let validator = LicenseValidator::new("secret2");
66
67        let license = generator.generate_key(1).unwrap();
68        let result = validator.validate_key(&license);
69        
70        assert!(result.is_err());
71    }
72}