pub struct RiSecurityManager;Expand description
Security utilities manager for Ri.
This struct provides static methods for encryption, decryption, HMAC signing, and key management operations. It is designed as a singleton utility class with no instance state.
§Thread Safety
All methods are stateless and can be safely called concurrently from multiple threads.
§Usage
use ri::auth::security::RiSecurityManager;
// Encrypt sensitive data
let encrypted = RiSecurityManager::encrypt("secret data");
// Decrypt data
let decrypted = RiSecurityManager::decrypt(&encrypted);
// Sign data with HMAC
let signature = RiSecurityManager::hmac_sign("data to sign");
// Verify HMAC signature
let is_valid = RiSecurityManager::hmac_verify("data to verify", &signature);Implementations§
Source§impl RiSecurityManager
impl RiSecurityManager
Sourcepub fn encrypt(plaintext: &str) -> String
pub fn encrypt(plaintext: &str) -> String
Encrypts plaintext data using AES-256-GCM.
This method encrypts the input string using AES-256-GCM (Galois/Counter Mode), which provides both confidentiality and authenticity. A random nonce is generated for each encryption operation, so the same plaintext produces different ciphertext each time it is encrypted.
§Output Format
The output is Base64-encoded and contains:
- 12-byte nonce (randomly generated)
- Encrypted data with authentication tag
§Parameters
plaintext: The text string to encrypt
§Returns
Base64-encoded encrypted data
§Examples
use ri::auth::security::RiSecurityManager;
let encrypted = RiSecurityManager::encrypt("sensitive data");
println!("Encrypted: {}", encrypted);Sourcepub fn decrypt(encrypted: &str) -> Option<String>
pub fn decrypt(encrypted: &str) -> Option<String>
Decrypts encrypted data using AES-256-GCM.
This method decrypts data that was encrypted using the encrypt method.
It verifies the authentication tag and returns the original plaintext.
§Failure Conditions
Returns None if:
- The input is not valid Base64
- The input is shorter than the nonce length
- The authentication tag verification fails (wrong key or tampered data)
§Parameters
encrypted: Base64-encoded encrypted data
§Returns
Some(String) containing the decrypted plaintext, or None if decryption fails
§Examples
use ri::auth::security::RiSecurityManager;
let encrypted = RiSecurityManager::encrypt("secret");
let decrypted = RiSecurityManager::decrypt(&encrypted);
match decrypted {
Some(text) => println!("Decrypted: {}", text),
None => println!("Decryption failed!"),
}Sourcepub fn hmac_sign(data: &str) -> String
pub fn hmac_sign(data: &str) -> String
Signs data using HMAC-SHA256.
This method creates an HMAC signature using the configured HMAC key and SHA-256 hash algorithm. The signature is returned as a hex-encoded string.
§Security
HMAC provides message integrity and authenticity verification. Only parties with access to the HMAC key can create or verify signatures.
§Parameters
data: The data string to sign
§Returns
Hex-encoded HMAC signature
§Examples
use ri::auth::security::RiSecurityManager;
let data = "important message";
let signature = RiSecurityManager::hmac_sign(data);
println!("Signature: {}", signature);Sourcepub fn hmac_verify(data: &str, signature: &str) -> bool
pub fn hmac_verify(data: &str, signature: &str) -> bool
Verifies an HMAC-SHA256 signature.
This method verifies that the provided signature matches the data using constant-time comparison to prevent timing attacks.
§Signature Format
The signature must be a valid hex-encoded string as produced by hmac_sign.
§Parameters
data: The original data that was signedsignature: The hex-encoded signature to verify
§Returns
true if the signature is valid, false otherwise
§Examples
use ri::auth::security::RiSecurityManager;
let data = "important message";
let signature = RiSecurityManager::hmac_sign(data);
if RiSecurityManager::hmac_verify(data, &signature) {
println!("Signature is valid!");
} else {
println!("Signature is invalid!");
}Sourcepub fn generate_encryption_key() -> String
pub fn generate_encryption_key() -> String
Generates a new encryption key.
This method generates a cryptographically secure random 32-byte (256-bit) key suitable for AES-256 encryption. The key is returned as a hex-encoded string.
§Usage
This method can be used to generate keys for initial configuration or key rotation.
Store the generated key securely and set it via the Ri_ENCRYPTION_KEY environment variable.
§Returns
Hex-encoded 32-byte encryption key
§Examples
use ri::auth::security::RiSecurityManager;
let key = RiSecurityManager::generate_encryption_key();
println!("New encryption key: {}", key);Sourcepub fn generate_hmac_key() -> String
pub fn generate_hmac_key() -> String
Generates a new HMAC key.
This method generates a cryptographically secure random 32-byte (256-bit) key suitable for HMAC-SHA256 signing. The key is returned as a hex-encoded string.
§Usage
This method can be used to generate keys for initial configuration or key rotation. Store the generated key securely and set it via theRi_HMAC_KEY` environment variable.
§Returns
Hex-encoded 32-byte HMAC key
§Examples
use ri::auth::security::RiSecurityManager;
let key = RiSecurityManager::generate_hmac_key();
println!("New HMAC key: {}", key);Trait Implementations§
Source§impl<'py> IntoPyObject<'py> for RiSecurityManager
impl<'py> IntoPyObject<'py> for RiSecurityManager
Source§type Target = RiSecurityManager
type Target = RiSecurityManager
Source§type Output = Bound<'py, <RiSecurityManager as IntoPyObject<'py>>::Target>
type Output = Bound<'py, <RiSecurityManager as IntoPyObject<'py>>::Target>
Source§fn into_pyobject(
self,
py: Python<'py>,
) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>
fn into_pyobject( self, py: Python<'py>, ) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>
Source§impl PyClass for RiSecurityManager
impl PyClass for RiSecurityManager
Source§impl PyClassImpl for RiSecurityManager
impl PyClassImpl for RiSecurityManager
Source§const IS_BASETYPE: bool = false
const IS_BASETYPE: bool = false
Source§const IS_SUBCLASS: bool = false
const IS_SUBCLASS: bool = false
Source§const IS_MAPPING: bool = false
const IS_MAPPING: bool = false
Source§const IS_SEQUENCE: bool = false
const IS_SEQUENCE: bool = false
Source§const IS_IMMUTABLE_TYPE: bool = false
const IS_IMMUTABLE_TYPE: bool = false
Source§const RAW_DOC: &'static CStr = /// ```
const RAW_DOC: &'static CStr = /// ```
Source§const DOC: &'static CStr
const DOC: &'static CStr
text_signature if a constructor is defined. Read moreSource§type ThreadChecker = SendablePyClass<RiSecurityManager>
type ThreadChecker = SendablePyClass<RiSecurityManager>
Source§type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
Source§type BaseNativeType = PyAny
type BaseNativeType = PyAny
PyAny by default, and when you declare
#[pyclass(extends=PyDict)], it’s PyDict.fn items_iter() -> PyClassItemsIter
fn lazy_type_object() -> &'static LazyTypeObject<Self>
fn dict_offset() -> Option<isize>
fn weaklist_offset() -> Option<isize>
Source§impl PyClassNewTextSignature for RiSecurityManager
impl PyClassNewTextSignature for RiSecurityManager
const TEXT_SIGNATURE: &'static str = "()"
Source§impl PyMethods<RiSecurityManager> for PyClassImplCollector<RiSecurityManager>
impl PyMethods<RiSecurityManager> for PyClassImplCollector<RiSecurityManager>
fn py_methods(self) -> &'static PyClassItems
Source§impl PyTypeInfo for RiSecurityManager
impl PyTypeInfo for RiSecurityManager
Source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
§fn type_object(py: Python<'_>) -> Bound<'_, PyType>
fn type_object(py: Python<'_>) -> Bound<'_, PyType>
§fn is_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_type_of(object: &Bound<'_, PyAny>) -> bool
object is an instance of this type or a subclass of this type.§fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
object is an instance of this type.impl DerefToPyAny for RiSecurityManager
impl ExtractPyClassWithClone for RiSecurityManager
Auto Trait Implementations§
impl Freeze for RiSecurityManager
impl RefUnwindSafe for RiSecurityManager
impl Send for RiSecurityManager
impl Sync for RiSecurityManager
impl Unpin for RiSecurityManager
impl UnsafeUnpin for RiSecurityManager
impl UnwindSafe for RiSecurityManager
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
§fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
self into an owned Python object, dropping type information.§fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
self into an owned Python object, dropping type information and unbinding it
from the 'py lifetime.§fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
self into a Python object. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PyErrArguments for T
impl<T> PyErrArguments for T
§impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
§const NAME: &'static str = T::NAME
const NAME: &'static str = T::NAME
§fn type_check(object: &Bound<'_, PyAny>) -> bool
fn type_check(object: &Bound<'_, PyAny>) -> bool
§fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>
fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>
isinstance and issubclass function. Read more