mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2025-09-09 15:58:48 +00:00
32 lines
1.0 KiB
Python
32 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|
|
|
|
|
class InMemorySecret:
|
|
"""Store sensitive data encrypted in RAM using AES-GCM."""
|
|
|
|
def __init__(self, data: bytes) -> None:
|
|
if not isinstance(data, (bytes, bytearray)):
|
|
raise TypeError("data must be bytes")
|
|
self._key = AESGCM.generate_key(bit_length=128)
|
|
self._nonce = os.urandom(12)
|
|
self._cipher = AESGCM(self._key)
|
|
self._encrypted = self._cipher.encrypt(self._nonce, bytes(data), None)
|
|
|
|
def get_bytes(self) -> bytes:
|
|
"""Decrypt and return the plaintext bytes."""
|
|
return self._cipher.decrypt(self._nonce, self._encrypted, None)
|
|
|
|
def wipe(self) -> None:
|
|
"""Zero out internal data."""
|
|
self._key = None
|
|
self._nonce = None
|
|
self._cipher = None
|
|
self._encrypted = None
|
|
|
|
def get_str(self) -> str:
|
|
"""Return the decrypted plaintext as a UTF-8 string."""
|
|
return self.get_bytes().decode("utf-8")
|