Encryption Architecture
The package uses a simple factory-plus-adapter design.
Resolution flow
A typical helper call follows this path:
crypto_encode()/crypto_decode()
-> CryptorFactory::get($type)
-> Di-managed CryptorFactory instance
-> CryptorFactory::resolve($type)
-> Cryptor(new <adapter>())
-> adapter->encrypt() / adapter->decrypt()
CryptorFactory lifecycle
CryptorFactory::get() uses Quantum\Di\Di as its singleton boundary:
- if
CryptorFactoryis not registered yet, it registers the class - it resolves the factory from the container with
Di::get(self::class) - it calls
resolve($type)on that shared factory instance
Inside the factory, $instances memoizes one Cryptor per type string.
Practical effect:
- repeated symmetric requests reuse the same symmetric
Cryptor - repeated asymmetric requests reuse the same asymmetric
Cryptor - both lifetimes are tied to the current DI container
Cryptor wrapper behavior
Quantum\Encryption\Cryptor stores exactly one EncryptionInterface adapter.
It exposes:
getAdapter()to inspect the concrete adapterisAsymmetric()as a concrete-type check againstAsymmetricEncryptionAdapter__call()to forward runtime method calls to the adapter
__call() is guarded with method_exists(...). Calling an unsupported method throws CryptorException::methodNotSupported($method, <adapter class>).
In practice, the intended public methods are still just:
encrypt(string $plain): stringdecrypt(string $encrypted): string
Factory adapter map
CryptorFactory::ADAPTERS is a fixed constant map:
symmetric->SymmetricEncryptionAdapterasymmetric->AsymmetricEncryptionAdapter
There is no extension point in the current package for replacing this map at runtime.
State model differences
Symmetric adapter state
The symmetric adapter stores only one piece of state: the resolved application key.
Asymmetric adapter state
The asymmetric adapter stores a generated public/private key pair in object properties.
Because the keys are generated inside __construct(), the object's lifetime is the key lifetime. This is the main architectural constraint of the package.