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")