xypriss 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -84
- package/dist/cjs/ServerFactory.js +1 -1
- package/dist/cjs/cache/SecureCacheAdapter.js +2 -2
- package/dist/cjs/cluster/cluster-manager.js +1 -1
- package/dist/cjs/cluster/index.js +30 -30
- package/dist/cjs/cluster/modules/AutoScaler.js +2 -2
- package/dist/cjs/cluster/modules/ClusterPersistenceManager.js +3 -3
- package/dist/cjs/cluster/modules/HealthMonitor.js +2 -2
- package/dist/cjs/cluster/modules/IPCManager.js +2 -2
- package/dist/cjs/cluster/modules/MetricsCollector.js +1 -1
- package/dist/cjs/cluster/modules/WorkerManager.js +2 -2
- package/dist/cjs/encryption/EncryptionService.js +12 -12
- package/dist/cjs/encryption/EncryptionService.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/middleware/safe-json-middleware.js +1 -1
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +727 -0
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -0
- package/dist/cjs/mods/security/src/algorithms/registry.js +83 -0
- package/dist/cjs/mods/security/src/algorithms/registry.js.map +1 -0
- package/dist/cjs/mods/security/src/components/attestation.js +1065 -0
- package/dist/cjs/mods/security/src/components/attestation.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/FastLRU.js +323 -0
- package/dist/cjs/mods/security/src/components/cache/FastLRU.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/UFSIMC.js +1131 -0
- package/dist/cjs/mods/security/src/components/cache/UFSIMC.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.js +624 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +136 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/config/cache.config.js +39 -0
- package/dist/cjs/mods/security/src/components/cache/config/cache.config.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/index.js +459 -0
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/cache/useCache.js +243 -0
- package/dist/cjs/mods/security/src/components/cache/useCache.js.map +1 -0
- package/dist/cjs/mods/security/src/components/canary-tokens.js +351 -0
- package/dist/cjs/mods/security/src/components/canary-tokens.js.map +1 -0
- package/dist/cjs/mods/security/src/components/entropy-augmentation.js +478 -0
- package/dist/cjs/mods/security/src/components/entropy-augmentation.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-allocator.js +338 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-allocator.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-cache.js +536 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-cache.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-engine.js +631 -0
- package/dist/cjs/mods/security/src/components/fortified-function/UFA/ultra-fast-engine.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/const/exec.const.js +18 -0
- package/dist/cjs/mods/security/src/components/fortified-function/const/exec.const.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-config.js +356 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-config.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-function-core.js +520 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-function-core.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-logger.js +246 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/fortified-logger.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/api-manager.js +189 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/api-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/cache-manager.js +107 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/cache-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-context.js +105 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-context.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-engine.js +127 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-engine.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-router.js +93 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/execution-router.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/memory-manager.js +147 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/memory-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/security-manager.js +102 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/security-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/stats-manager.js +159 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/stats-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/timing-manager.js +125 -0
- package/dist/cjs/mods/security/src/components/fortified-function/core/mods/timing-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/engines/analytics-engine.js +370 -0
- package/dist/cjs/mods/security/src/components/fortified-function/engines/analytics-engine.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/engines/execution-engine.js +402 -0
- package/dist/cjs/mods/security/src/components/fortified-function/engines/execution-engine.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +172 -0
- package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/performance/performance-monitor.js +240 -0
- package/dist/cjs/mods/security/src/components/fortified-function/performance/performance-monitor.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/performance/performance-timer.js +188 -0
- package/dist/cjs/mods/security/src/components/fortified-function/performance/performance-timer.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +253 -0
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/serializer/safe-serializer.js +350 -0
- package/dist/cjs/mods/security/src/components/fortified-function/serializer/safe-serializer.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/smart-cache.js +693 -0
- package/dist/cjs/mods/security/src/components/fortified-function/smart-cache.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/types/types.js +16 -0
- package/dist/cjs/mods/security/src/components/fortified-function/types/types.js.map +1 -0
- package/dist/cjs/mods/security/src/components/fortified-function/utils/utils.js +68 -0
- package/dist/cjs/mods/security/src/components/fortified-function/utils/utils.js.map +1 -0
- package/dist/cjs/mods/security/src/components/memory-hard.js +922 -0
- package/dist/cjs/mods/security/src/components/memory-hard.js.map +1 -0
- package/dist/cjs/mods/security/src/components/post-quantum.js +323 -0
- package/dist/cjs/mods/security/src/components/post-quantum.js.map +1 -0
- package/dist/cjs/mods/security/src/components/runtime-verification.js +645 -0
- package/dist/cjs/mods/security/src/components/runtime-verification.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/core/secure-array-core.js +1572 -0
- package/dist/cjs/mods/security/src/components/secure-array/core/secure-array-core.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js +330 -0
- package/dist/cjs/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/events/event-manager.js +270 -0
- package/dist/cjs/mods/security/src/components/secure-array/events/event-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/index.js +66 -0
- package/dist/cjs/mods/security/src/components/secure-array/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/metadata/metadata-manager.js +331 -0
- package/dist/cjs/mods/security/src/components/secure-array/metadata/metadata-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/serialization/ArraySerializationHandler.js +390 -0
- package/dist/cjs/mods/security/src/components/secure-array/serialization/ArraySerializationHandler.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/types/index.js +87 -0
- package/dist/cjs/mods/security/src/components/secure-array/types/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/utils/id-generator.js +80 -0
- package/dist/cjs/mods/security/src/components/secure-array/utils/id-generator.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-array/utils/validation.js +275 -0
- package/dist/cjs/mods/security/src/components/secure-array/utils/validation.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-memory.js +906 -0
- package/dist/cjs/mods/security/src/components/secure-memory.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/core/secure-object-core.js +1605 -0
- package/dist/cjs/mods/security/src/components/secure-object/core/secure-object-core.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/encryption/crypto-handler.js +362 -0
- package/dist/cjs/mods/security/src/components/secure-object/encryption/crypto-handler.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/encryption/sensitive-keys.js +206 -0
- package/dist/cjs/mods/security/src/components/secure-object/encryption/sensitive-keys.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/events/event-manager.js +197 -0
- package/dist/cjs/mods/security/src/components/secure-object/events/event-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/index.js +67 -0
- package/dist/cjs/mods/security/src/components/secure-object/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/metadata/metadata-manager.js +183 -0
- package/dist/cjs/mods/security/src/components/secure-object/metadata/metadata-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/serialization/serialization-handler.js +197 -0
- package/dist/cjs/mods/security/src/components/secure-object/serialization/serialization-handler.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/utils/id-generator.js +64 -0
- package/dist/cjs/mods/security/src/components/secure-object/utils/id-generator.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-object/utils/validation.js +239 -0
- package/dist/cjs/mods/security/src/components/secure-object/utils/validation.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-serialization.js +772 -0
- package/dist/cjs/mods/security/src/components/secure-serialization.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/entropy-analyzer.js +308 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/entropy-analyzer.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/performance-monitor.js +335 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/performance-monitor.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/quantum-safe.js +245 -0
- package/dist/cjs/mods/security/src/components/secure-string/advanced/quantum-safe.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/buffer/buffer-manager.js +205 -0
- package/dist/cjs/mods/security/src/components/secure-string/buffer/buffer-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/core/secure-string-core.js +788 -0
- package/dist/cjs/mods/security/src/components/secure-string/core/secure-string-core.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/crypto/crypto-operations.js +319 -0
- package/dist/cjs/mods/security/src/components/secure-string/crypto/crypto-operations.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/operations/comparison-operations.js +221 -0
- package/dist/cjs/mods/security/src/components/secure-string/operations/comparison-operations.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/operations/string-operations.js +234 -0
- package/dist/cjs/mods/security/src/components/secure-string/operations/string-operations.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/types/index.js +41 -0
- package/dist/cjs/mods/security/src/components/secure-string/types/index.js.map +1 -0
- package/dist/cjs/mods/security/src/components/secure-string/validation/string-validator.js +334 -0
- package/dist/cjs/mods/security/src/components/secure-string/validation/string-validator.js.map +1 -0
- package/dist/cjs/mods/security/src/components/side-channel.js +146 -0
- package/dist/cjs/mods/security/src/components/side-channel.js.map +1 -0
- package/dist/cjs/mods/security/src/components/tamper-evident-logging.js +391 -0
- package/dist/cjs/mods/security/src/components/tamper-evident-logging.js.map +1 -0
- package/dist/cjs/mods/security/src/const/buffer.const.js +15 -0
- package/dist/cjs/mods/security/src/const/buffer.const.js.map +1 -0
- package/dist/cjs/mods/security/src/core/crypto.js +722 -0
- package/dist/cjs/mods/security/src/core/crypto.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-advanced.js +388 -0
- package/dist/cjs/mods/security/src/core/hash/hash-advanced.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-core.js +376 -0
- package/dist/cjs/mods/security/src/core/hash/hash-core.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-entropy.js +307 -0
- package/dist/cjs/mods/security/src/core/hash/hash-entropy.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-security.js +372 -0
- package/dist/cjs/mods/security/src/core/hash/hash-security.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-types.js +16 -0
- package/dist/cjs/mods/security/src/core/hash/hash-types.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-utils.js +328 -0
- package/dist/cjs/mods/security/src/core/hash/hash-utils.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash/hash-validator.js +312 -0
- package/dist/cjs/mods/security/src/core/hash/hash-validator.js.map +1 -0
- package/dist/cjs/mods/security/src/core/hash.js +25 -0
- package/dist/cjs/mods/security/src/core/hash.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/Argon2Algo.js +135 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/Argon2Algo.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/PBKDF2Algo.js +293 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/PBKDF2Algo.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/ScryptAlgo.js +317 -0
- package/dist/cjs/mods/security/src/core/keys/algorithms/mods/ScryptAlgo.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/keys-core.js +201 -0
- package/dist/cjs/mods/security/src/core/keys/keys-core.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/keys-logger.js +234 -0
- package/dist/cjs/mods/security/src/core/keys/keys-logger.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/keys-types.js +65 -0
- package/dist/cjs/mods/security/src/core/keys/keys-types.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys/keys-utils.js +322 -0
- package/dist/cjs/mods/security/src/core/keys/keys-utils.js.map +1 -0
- package/dist/cjs/mods/security/src/core/keys.js +136 -0
- package/dist/cjs/mods/security/src/core/keys.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/index.js +122 -0
- package/dist/cjs/mods/security/src/core/password/index.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-algorithms.js +397 -0
- package/dist/cjs/mods/security/src/core/password/password-algorithms.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-core.js +294 -0
- package/dist/cjs/mods/security/src/core/password/password-core.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-generator.js +365 -0
- package/dist/cjs/mods/security/src/core/password/password-generator.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-migration.js +237 -0
- package/dist/cjs/mods/security/src/core/password/password-migration.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-security.js +534 -0
- package/dist/cjs/mods/security/src/core/password/password-security.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-types.js +39 -0
- package/dist/cjs/mods/security/src/core/password/password-types.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/password-utils.js +651 -0
- package/dist/cjs/mods/security/src/core/password/password-utils.js.map +1 -0
- package/dist/cjs/mods/security/src/core/password/swlist.js +1122 -0
- package/dist/cjs/mods/security/src/core/password/swlist.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-core.js +328 -0
- package/dist/cjs/mods/security/src/core/random/random-core.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-crypto.js +339 -0
- package/dist/cjs/mods/security/src/core/random/random-crypto.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-entropy.js +388 -0
- package/dist/cjs/mods/security/src/core/random/random-entropy.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-generators.js +344 -0
- package/dist/cjs/mods/security/src/core/random/random-generators.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-sources.js +426 -0
- package/dist/cjs/mods/security/src/core/random/random-sources.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-tokens.js +309 -0
- package/dist/cjs/mods/security/src/core/random/random-tokens.js.map +1 -0
- package/dist/cjs/mods/security/src/core/random/random-types.js +36 -0
- package/dist/cjs/mods/security/src/core/random/random-types.js.map +1 -0
- package/dist/cjs/mods/security/src/core/validators.js +200 -0
- package/dist/cjs/mods/security/src/core/validators.js.map +1 -0
- package/dist/cjs/mods/security/src/helpers/Uint8Array.js +335 -0
- package/dist/cjs/mods/security/src/helpers/Uint8Array.js.map +1 -0
- package/dist/cjs/mods/security/src/helpers/createEnu.js +27 -0
- package/dist/cjs/mods/security/src/helpers/createEnu.js.map +1 -0
- package/dist/cjs/mods/security/src/index.js +417 -0
- package/dist/cjs/mods/security/src/index.js.map +1 -0
- package/dist/cjs/mods/security/src/types/global.js +51 -0
- package/dist/cjs/mods/security/src/types/global.js.map +1 -0
- package/dist/cjs/mods/security/src/types/secure-mem.type.js +100 -0
- package/dist/cjs/mods/security/src/types/secure-mem.type.js.map +1 -0
- package/dist/cjs/mods/security/src/types/secure-memory.js +20 -0
- package/dist/cjs/mods/security/src/types/secure-memory.js.map +1 -0
- package/dist/cjs/mods/security/src/types.js +63 -0
- package/dist/cjs/mods/security/src/types.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/CryptoAlgorithmUtils.js +71 -0
- package/dist/cjs/mods/security/src/utils/CryptoAlgorithmUtils.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/constants.js +111 -0
- package/dist/cjs/mods/security/src/utils/constants.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/dataConverter.js +74 -0
- package/dist/cjs/mods/security/src/utils/dataConverter.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/encoding.js +290 -0
- package/dist/cjs/mods/security/src/utils/encoding.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/errorHandler.js +140 -0
- package/dist/cjs/mods/security/src/utils/errorHandler.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/config-manager.js +282 -0
- package/dist/cjs/mods/security/src/utils/memory/config-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/event-manager.js +277 -0
- package/dist/cjs/mods/security/src/utils/memory/event-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/index.js +162 -0
- package/dist/cjs/mods/security/src/utils/memory/index.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/memory-manager.js +888 -0
- package/dist/cjs/mods/security/src/utils/memory/memory-manager.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/memory-pool.js +356 -0
- package/dist/cjs/mods/security/src/utils/memory/memory-pool.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/reference-tracker.js +376 -0
- package/dist/cjs/mods/security/src/utils/memory/reference-tracker.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/memory/types.js +56 -0
- package/dist/cjs/mods/security/src/utils/memory/types.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/patterns.js +127 -0
- package/dist/cjs/mods/security/src/utils/patterns.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/performanceMonitor.js +249 -0
- package/dist/cjs/mods/security/src/utils/performanceMonitor.js.map +1 -0
- package/dist/cjs/mods/security/src/utils/stats.js +182 -0
- package/dist/cjs/mods/security/src/utils/stats.js.map +1 -0
- package/dist/cjs/security-middleware.js +15 -15
- package/dist/cjs/server/components/fastapi/UltraFastRequestProcessor.js +1 -1
- package/dist/cjs/server/components/fastapi/console/ConsoleInterceptor.js +23 -23
- package/dist/cjs/server/components/fastapi/middlewares/MiddlewareAPI.js +1 -1
- package/dist/cjs/server/optimization/RequestPreCompiler.js +1 -1
- package/dist/cjs/server/plugins/PluginRegistry.js +1 -1
- package/dist/cjs/server/plugins/core/CachePlugin.js +7 -7
- package/dist/cjs/server/plugins/core/PerformancePlugin.js +2 -2
- package/dist/cjs/server/plugins/core/SecurityPlugin.js +10 -10
- package/dist/cjs/smart-routes.js +1 -1
- package/dist/esm/ServerFactory.js +1 -1
- package/dist/esm/cache/SecureCacheAdapter.js +2 -2
- package/dist/esm/cluster/cluster-manager.js +1 -1
- package/dist/esm/cluster/index.js +30 -30
- package/dist/esm/cluster/modules/AutoScaler.js +2 -2
- package/dist/esm/cluster/modules/ClusterPersistenceManager.js +3 -3
- package/dist/esm/cluster/modules/HealthMonitor.js +2 -2
- package/dist/esm/cluster/modules/IPCManager.js +2 -2
- package/dist/esm/cluster/modules/MetricsCollector.js +1 -1
- package/dist/esm/cluster/modules/WorkerManager.js +2 -2
- package/dist/esm/encryption/EncryptionService.js +12 -12
- package/dist/esm/encryption/EncryptionService.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/middleware/safe-json-middleware.js +1 -1
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +705 -0
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -0
- package/dist/esm/mods/security/src/algorithms/registry.js +81 -0
- package/dist/esm/mods/security/src/algorithms/registry.js.map +1 -0
- package/dist/esm/mods/security/src/components/attestation.js +1059 -0
- package/dist/esm/mods/security/src/components/attestation.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/FastLRU.js +320 -0
- package/dist/esm/mods/security/src/components/cache/FastLRU.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/UFSIMC.js +1109 -0
- package/dist/esm/mods/security/src/components/cache/UFSIMC.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.js +622 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +111 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/config/cache.config.js +36 -0
- package/dist/esm/mods/security/src/components/cache/config/cache.config.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/index.js +449 -0
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/cache/useCache.js +240 -0
- package/dist/esm/mods/security/src/components/cache/useCache.js.map +1 -0
- package/dist/esm/mods/security/src/components/canary-tokens.js +346 -0
- package/dist/esm/mods/security/src/components/canary-tokens.js.map +1 -0
- package/dist/esm/mods/security/src/components/entropy-augmentation.js +476 -0
- package/dist/esm/mods/security/src/components/entropy-augmentation.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-allocator.js +336 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-allocator.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-cache.js +534 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-cache.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-engine.js +629 -0
- package/dist/esm/mods/security/src/components/fortified-function/UFA/ultra-fast-engine.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/const/exec.const.js +11 -0
- package/dist/esm/mods/security/src/components/fortified-function/const/exec.const.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-config.js +351 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-config.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-function-core.js +518 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-function-core.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-logger.js +243 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/fortified-logger.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/api-manager.js +187 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/api-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/cache-manager.js +105 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/cache-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-context.js +103 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-context.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-engine.js +125 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-engine.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-router.js +91 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/execution-router.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/memory-manager.js +145 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/memory-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/security-manager.js +100 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/security-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/stats-manager.js +157 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/stats-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/timing-manager.js +123 -0
- package/dist/esm/mods/security/src/components/fortified-function/core/mods/timing-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/engines/analytics-engine.js +368 -0
- package/dist/esm/mods/security/src/components/fortified-function/engines/analytics-engine.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/engines/execution-engine.js +400 -0
- package/dist/esm/mods/security/src/components/fortified-function/engines/execution-engine.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/index.js +165 -0
- package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/performance/performance-monitor.js +238 -0
- package/dist/esm/mods/security/src/components/fortified-function/performance/performance-monitor.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/performance/performance-timer.js +186 -0
- package/dist/esm/mods/security/src/components/fortified-function/performance/performance-timer.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +251 -0
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/serializer/safe-serializer.js +344 -0
- package/dist/esm/mods/security/src/components/fortified-function/serializer/safe-serializer.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/smart-cache.js +691 -0
- package/dist/esm/mods/security/src/components/fortified-function/smart-cache.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/types/types.js +14 -0
- package/dist/esm/mods/security/src/components/fortified-function/types/types.js.map +1 -0
- package/dist/esm/mods/security/src/components/fortified-function/utils/utils.js +66 -0
- package/dist/esm/mods/security/src/components/fortified-function/utils/utils.js.map +1 -0
- package/dist/esm/mods/security/src/components/memory-hard.js +919 -0
- package/dist/esm/mods/security/src/components/memory-hard.js.map +1 -0
- package/dist/esm/mods/security/src/components/post-quantum.js +316 -0
- package/dist/esm/mods/security/src/components/post-quantum.js.map +1 -0
- package/dist/esm/mods/security/src/components/runtime-verification.js +643 -0
- package/dist/esm/mods/security/src/components/runtime-verification.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/core/secure-array-core.js +1570 -0
- package/dist/esm/mods/security/src/components/secure-array/core/secure-array-core.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js +328 -0
- package/dist/esm/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/events/event-manager.js +268 -0
- package/dist/esm/mods/security/src/components/secure-array/events/event-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/index.js +61 -0
- package/dist/esm/mods/security/src/components/secure-array/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/metadata/metadata-manager.js +329 -0
- package/dist/esm/mods/security/src/components/secure-array/metadata/metadata-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/serialization/ArraySerializationHandler.js +388 -0
- package/dist/esm/mods/security/src/components/secure-array/serialization/ArraySerializationHandler.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/types/index.js +84 -0
- package/dist/esm/mods/security/src/components/secure-array/types/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/utils/id-generator.js +78 -0
- package/dist/esm/mods/security/src/components/secure-array/utils/id-generator.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-array/utils/validation.js +273 -0
- package/dist/esm/mods/security/src/components/secure-array/utils/validation.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-memory.js +884 -0
- package/dist/esm/mods/security/src/components/secure-memory.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/core/secure-object-core.js +1603 -0
- package/dist/esm/mods/security/src/components/secure-object/core/secure-object-core.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/encryption/crypto-handler.js +360 -0
- package/dist/esm/mods/security/src/components/secure-object/encryption/crypto-handler.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/encryption/sensitive-keys.js +203 -0
- package/dist/esm/mods/security/src/components/secure-object/encryption/sensitive-keys.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/events/event-manager.js +195 -0
- package/dist/esm/mods/security/src/components/secure-object/events/event-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/index.js +63 -0
- package/dist/esm/mods/security/src/components/secure-object/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/metadata/metadata-manager.js +181 -0
- package/dist/esm/mods/security/src/components/secure-object/metadata/metadata-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/serialization/serialization-handler.js +195 -0
- package/dist/esm/mods/security/src/components/secure-object/serialization/serialization-handler.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/utils/id-generator.js +62 -0
- package/dist/esm/mods/security/src/components/secure-object/utils/id-generator.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-object/utils/validation.js +237 -0
- package/dist/esm/mods/security/src/components/secure-object/utils/validation.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-serialization.js +769 -0
- package/dist/esm/mods/security/src/components/secure-serialization.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/entropy-analyzer.js +306 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/entropy-analyzer.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/performance-monitor.js +333 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/performance-monitor.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/quantum-safe.js +243 -0
- package/dist/esm/mods/security/src/components/secure-string/advanced/quantum-safe.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/buffer/buffer-manager.js +203 -0
- package/dist/esm/mods/security/src/components/secure-string/buffer/buffer-manager.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/core/secure-string-core.js +786 -0
- package/dist/esm/mods/security/src/components/secure-string/core/secure-string-core.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/crypto/crypto-operations.js +298 -0
- package/dist/esm/mods/security/src/components/secure-string/crypto/crypto-operations.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/operations/comparison-operations.js +219 -0
- package/dist/esm/mods/security/src/components/secure-string/operations/comparison-operations.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/operations/string-operations.js +232 -0
- package/dist/esm/mods/security/src/components/secure-string/operations/string-operations.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/types/index.js +37 -0
- package/dist/esm/mods/security/src/components/secure-string/types/index.js.map +1 -0
- package/dist/esm/mods/security/src/components/secure-string/validation/string-validator.js +332 -0
- package/dist/esm/mods/security/src/components/secure-string/validation/string-validator.js.map +1 -0
- package/dist/esm/mods/security/src/components/side-channel.js +142 -0
- package/dist/esm/mods/security/src/components/side-channel.js.map +1 -0
- package/dist/esm/mods/security/src/components/tamper-evident-logging.js +389 -0
- package/dist/esm/mods/security/src/components/tamper-evident-logging.js.map +1 -0
- package/dist/esm/mods/security/src/const/buffer.const.js +13 -0
- package/dist/esm/mods/security/src/const/buffer.const.js.map +1 -0
- package/dist/esm/mods/security/src/core/crypto.js +720 -0
- package/dist/esm/mods/security/src/core/crypto.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-advanced.js +367 -0
- package/dist/esm/mods/security/src/core/hash/hash-advanced.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-core.js +355 -0
- package/dist/esm/mods/security/src/core/hash/hash-core.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-entropy.js +286 -0
- package/dist/esm/mods/security/src/core/hash/hash-entropy.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-security.js +351 -0
- package/dist/esm/mods/security/src/core/hash/hash-security.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-types.js +16 -0
- package/dist/esm/mods/security/src/core/hash/hash-types.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-utils.js +307 -0
- package/dist/esm/mods/security/src/core/hash/hash-utils.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash/hash-validator.js +310 -0
- package/dist/esm/mods/security/src/core/hash/hash-validator.js.map +1 -0
- package/dist/esm/mods/security/src/core/hash.js +9 -0
- package/dist/esm/mods/security/src/core/hash.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/Argon2Algo.js +133 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/Argon2Algo.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/PBKDF2Algo.js +272 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/PBKDF2Algo.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/ScryptAlgo.js +296 -0
- package/dist/esm/mods/security/src/core/keys/algorithms/mods/ScryptAlgo.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/keys-core.js +199 -0
- package/dist/esm/mods/security/src/core/keys/keys-core.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/keys-logger.js +231 -0
- package/dist/esm/mods/security/src/core/keys/keys-logger.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/keys-types.js +63 -0
- package/dist/esm/mods/security/src/core/keys/keys-types.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys/keys-utils.js +316 -0
- package/dist/esm/mods/security/src/core/keys/keys-utils.js.map +1 -0
- package/dist/esm/mods/security/src/core/keys.js +134 -0
- package/dist/esm/mods/security/src/core/keys.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/index.js +110 -0
- package/dist/esm/mods/security/src/core/password/index.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-algorithms.js +395 -0
- package/dist/esm/mods/security/src/core/password/password-algorithms.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-core.js +292 -0
- package/dist/esm/mods/security/src/core/password/password-core.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-generator.js +363 -0
- package/dist/esm/mods/security/src/core/password/password-generator.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-migration.js +235 -0
- package/dist/esm/mods/security/src/core/password/password-migration.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-security.js +532 -0
- package/dist/esm/mods/security/src/core/password/password-security.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-types.js +34 -0
- package/dist/esm/mods/security/src/core/password/password-types.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/password-utils.js +630 -0
- package/dist/esm/mods/security/src/core/password/password-utils.js.map +1 -0
- package/dist/esm/mods/security/src/core/password/swlist.js +1120 -0
- package/dist/esm/mods/security/src/core/password/swlist.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-core.js +326 -0
- package/dist/esm/mods/security/src/core/random/random-core.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-crypto.js +337 -0
- package/dist/esm/mods/security/src/core/random/random-crypto.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-entropy.js +367 -0
- package/dist/esm/mods/security/src/core/random/random-entropy.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-generators.js +323 -0
- package/dist/esm/mods/security/src/core/random/random-generators.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-sources.js +405 -0
- package/dist/esm/mods/security/src/core/random/random-sources.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-tokens.js +307 -0
- package/dist/esm/mods/security/src/core/random/random-tokens.js.map +1 -0
- package/dist/esm/mods/security/src/core/random/random-types.js +27 -0
- package/dist/esm/mods/security/src/core/random/random-types.js.map +1 -0
- package/dist/esm/mods/security/src/core/validators.js +198 -0
- package/dist/esm/mods/security/src/core/validators.js.map +1 -0
- package/dist/esm/mods/security/src/helpers/Uint8Array.js +333 -0
- package/dist/esm/mods/security/src/helpers/Uint8Array.js.map +1 -0
- package/dist/esm/mods/security/src/helpers/createEnu.js +25 -0
- package/dist/esm/mods/security/src/helpers/createEnu.js.map +1 -0
- package/dist/esm/mods/security/src/index.js +373 -0
- package/dist/esm/mods/security/src/index.js.map +1 -0
- package/dist/esm/mods/security/src/types/global.js +49 -0
- package/dist/esm/mods/security/src/types/global.js.map +1 -0
- package/dist/esm/mods/security/src/types/secure-mem.type.js +96 -0
- package/dist/esm/mods/security/src/types/secure-mem.type.js.map +1 -0
- package/dist/esm/mods/security/src/types/secure-memory.js +20 -0
- package/dist/esm/mods/security/src/types/secure-memory.js.map +1 -0
- package/dist/esm/mods/security/src/types.js +63 -0
- package/dist/esm/mods/security/src/types.js.map +1 -0
- package/dist/esm/mods/security/src/utils/CryptoAlgorithmUtils.js +69 -0
- package/dist/esm/mods/security/src/utils/CryptoAlgorithmUtils.js.map +1 -0
- package/dist/esm/mods/security/src/utils/constants.js +105 -0
- package/dist/esm/mods/security/src/utils/constants.js.map +1 -0
- package/dist/esm/mods/security/src/utils/dataConverter.js +72 -0
- package/dist/esm/mods/security/src/utils/dataConverter.js.map +1 -0
- package/dist/esm/mods/security/src/utils/encoding.js +279 -0
- package/dist/esm/mods/security/src/utils/encoding.js.map +1 -0
- package/dist/esm/mods/security/src/utils/errorHandler.js +137 -0
- package/dist/esm/mods/security/src/utils/errorHandler.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/config-manager.js +280 -0
- package/dist/esm/mods/security/src/utils/memory/config-manager.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/event-manager.js +275 -0
- package/dist/esm/mods/security/src/utils/memory/event-manager.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/index.js +141 -0
- package/dist/esm/mods/security/src/utils/memory/index.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/memory-manager.js +886 -0
- package/dist/esm/mods/security/src/utils/memory/memory-manager.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/memory-pool.js +354 -0
- package/dist/esm/mods/security/src/utils/memory/memory-pool.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/reference-tracker.js +374 -0
- package/dist/esm/mods/security/src/utils/memory/reference-tracker.js.map +1 -0
- package/dist/esm/mods/security/src/utils/memory/types.js +56 -0
- package/dist/esm/mods/security/src/utils/memory/types.js.map +1 -0
- package/dist/esm/mods/security/src/utils/patterns.js +124 -0
- package/dist/esm/mods/security/src/utils/patterns.js.map +1 -0
- package/dist/esm/mods/security/src/utils/performanceMonitor.js +246 -0
- package/dist/esm/mods/security/src/utils/performanceMonitor.js.map +1 -0
- package/dist/esm/mods/security/src/utils/stats.js +180 -0
- package/dist/esm/mods/security/src/utils/stats.js.map +1 -0
- package/dist/esm/security-middleware.js +15 -15
- package/dist/esm/server/components/fastapi/UltraFastRequestProcessor.js +1 -1
- package/dist/esm/server/components/fastapi/console/ConsoleInterceptor.js +23 -23
- package/dist/esm/server/components/fastapi/middlewares/MiddlewareAPI.js +1 -1
- package/dist/esm/server/optimization/RequestPreCompiler.js +1 -1
- package/dist/esm/server/plugins/PluginRegistry.js +1 -1
- package/dist/esm/server/plugins/core/CachePlugin.js +7 -7
- package/dist/esm/server/plugins/core/PerformancePlugin.js +2 -2
- package/dist/esm/server/plugins/core/SecurityPlugin.js +10 -10
- package/dist/esm/smart-routes.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,922 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var randomCore = require('../core/random/random-core.js');
|
|
4
|
+
require('../core/random/random-types.js');
|
|
5
|
+
require('crypto');
|
|
6
|
+
require('../core/random/random-sources.js');
|
|
7
|
+
require('nehonix-uri-processor');
|
|
8
|
+
var encoding = require('../utils/encoding.js');
|
|
9
|
+
var stats = require('../utils/stats.js');
|
|
10
|
+
require('../utils/memory/index.js');
|
|
11
|
+
require('../types.js');
|
|
12
|
+
var hashCore = require('../core/hash/hash-core.js');
|
|
13
|
+
require('../core/hash/hash-types.js');
|
|
14
|
+
require('../core/hash/hash-security.js');
|
|
15
|
+
require('../core/hash/hash-advanced.js');
|
|
16
|
+
require('../algorithms/hash-algorithms.js');
|
|
17
|
+
var argon2 = require('argon2');
|
|
18
|
+
var childProcess = require('child_process');
|
|
19
|
+
|
|
20
|
+
/* ---------------------------------------------------------------------------------------------
|
|
21
|
+
* Copyright (c) NEHONIX INC. All rights reserved.
|
|
22
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
23
|
+
* -------------------------------------------------------------------------------------------
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Memory-Hard Key Derivation Module
|
|
27
|
+
*
|
|
28
|
+
* This module implements memory-hard key derivation functions that require
|
|
29
|
+
* significant amounts of memory to compute, making them resistant to
|
|
30
|
+
* hardware-based attacks (ASICs, FPGAs, GPUs).
|
|
31
|
+
*
|
|
32
|
+
* These functions are particularly effective against brute-force attacks
|
|
33
|
+
* as they impose both computational and memory constraints on attackers.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Implements the Argon2 memory-hard key derivation function using the argon2 library
|
|
37
|
+
*
|
|
38
|
+
* Argon2 is designed to be resistant to GPU, ASIC, and FPGA attacks by
|
|
39
|
+
* requiring large amounts of memory to compute.
|
|
40
|
+
*
|
|
41
|
+
* This implementation uses the official argon2 library for Node.js.
|
|
42
|
+
*
|
|
43
|
+
* @param password - Password to derive key from
|
|
44
|
+
* @param options - Derivation options
|
|
45
|
+
* @returns Derived key and metadata
|
|
46
|
+
*/
|
|
47
|
+
async function argon2Derive(password, options = {}) {
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
// Check if the argon2 library is available
|
|
50
|
+
if (!argon2) {
|
|
51
|
+
// Fallback to the simplified implementation if the library is not available
|
|
52
|
+
console.warn("Argon2 library not available, using simplified implementation");
|
|
53
|
+
return argon2DeriveSimplified(password, options);
|
|
54
|
+
}
|
|
55
|
+
// Parse options with defaults
|
|
56
|
+
const memoryCost = options.memoryCost || 16384; // 16 MB
|
|
57
|
+
const timeCost = options.timeCost || 4;
|
|
58
|
+
const parallelism = options.parallelism || 1;
|
|
59
|
+
const keyLength = options.keyLength || 32;
|
|
60
|
+
// Generate or use provided salt
|
|
61
|
+
const saltLength = options.saltLength || 16;
|
|
62
|
+
const saltBytes = options.salt || randomCore.SecureRandom.getRandomBytes(saltLength);
|
|
63
|
+
const salt = Buffer.from(saltBytes);
|
|
64
|
+
// Convert password to the format expected by argon2
|
|
65
|
+
const passwordBuffer = typeof password === "string"
|
|
66
|
+
? Buffer.from(password)
|
|
67
|
+
: Buffer.from(password);
|
|
68
|
+
try {
|
|
69
|
+
// Configure Argon2 options
|
|
70
|
+
const argon2Options = {
|
|
71
|
+
type: argon2.argon2id, // Use Argon2id variant (balanced security)
|
|
72
|
+
memoryCost: Math.max(8, Math.floor(memoryCost / 1024)), // Convert to KiB, minimum 8
|
|
73
|
+
timeCost: timeCost,
|
|
74
|
+
parallelism: parallelism,
|
|
75
|
+
hashLength: keyLength,
|
|
76
|
+
salt: salt,
|
|
77
|
+
raw: true, // Return raw buffer instead of encoded hash
|
|
78
|
+
};
|
|
79
|
+
// Perform the key derivation
|
|
80
|
+
const result = await argon2.hash(passwordBuffer, argon2Options);
|
|
81
|
+
const endTime = Date.now();
|
|
82
|
+
const timeTakenMs = endTime - startTime;
|
|
83
|
+
// Track statistics
|
|
84
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
85
|
+
);
|
|
86
|
+
return {
|
|
87
|
+
derivedKey: encoding.bufferToHex(new Uint8Array(Buffer.from(result))),
|
|
88
|
+
salt: encoding.bufferToHex(saltBytes),
|
|
89
|
+
params: {
|
|
90
|
+
memoryCost,
|
|
91
|
+
timeCost,
|
|
92
|
+
parallelism,
|
|
93
|
+
keyLength,
|
|
94
|
+
},
|
|
95
|
+
metrics: {
|
|
96
|
+
timeTakenMs,
|
|
97
|
+
memoryUsedBytes: memoryCost * 1024, // Convert KiB to bytes
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error("Error using Argon2 library:", error);
|
|
103
|
+
// Fallback to simplified implementation
|
|
104
|
+
return argon2DeriveSimplified(password, options);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
*
|
|
109
|
+
* Implements a simplified version of Argon2 for environments where the argon2 library is not available
|
|
110
|
+
* This uses the argon2-browser library or a Node.js child process approach as fallbacks
|
|
111
|
+
*
|
|
112
|
+
* @param password - Password to derive key from
|
|
113
|
+
* @param options - Derivation options
|
|
114
|
+
* @returns Derived key and metadata
|
|
115
|
+
*/
|
|
116
|
+
function argon2DeriveSimplified(password, options = {}) {
|
|
117
|
+
const startTime = Date.now();
|
|
118
|
+
// Parse options with defaults
|
|
119
|
+
const memoryCost = options.memoryCost || 16384; // 16 MB
|
|
120
|
+
const timeCost = options.timeCost || 4;
|
|
121
|
+
const parallelism = options.parallelism || 1;
|
|
122
|
+
const keyLength = options.keyLength || 32;
|
|
123
|
+
// Generate or use provided salt
|
|
124
|
+
const saltLength = options.saltLength || 16;
|
|
125
|
+
const salt = options.salt || randomCore.SecureRandom.getRandomBytes(saltLength);
|
|
126
|
+
// Convert password to bytes if it's a string
|
|
127
|
+
const passwordBytes = typeof password === "string"
|
|
128
|
+
? new TextEncoder().encode(password)
|
|
129
|
+
: password;
|
|
130
|
+
try {
|
|
131
|
+
// Try to use argon2-browser in browser environments
|
|
132
|
+
if (typeof window !== "undefined") {
|
|
133
|
+
try {
|
|
134
|
+
// Try to dynamically import argon2-browser
|
|
135
|
+
const argon2Browser = require("argon2-browser");
|
|
136
|
+
if (argon2Browser) {
|
|
137
|
+
// Create a synchronous wrapper around the async argon2-browser
|
|
138
|
+
const argon2BrowserSync = (pwd, slt, mem, time, parallel, hashLen) => {
|
|
139
|
+
// Use a synchronous XMLHttpRequest to block until we have a result
|
|
140
|
+
const xhr = new XMLHttpRequest();
|
|
141
|
+
let result = null;
|
|
142
|
+
let error = null;
|
|
143
|
+
// Convert Uint8Arrays to regular arrays for argon2-browser
|
|
144
|
+
const pwdArray = Array.from(pwd);
|
|
145
|
+
const saltArray = Array.from(slt);
|
|
146
|
+
// Call argon2-browser
|
|
147
|
+
argon2Browser
|
|
148
|
+
.hash({
|
|
149
|
+
pass: pwdArray,
|
|
150
|
+
salt: saltArray,
|
|
151
|
+
time: time,
|
|
152
|
+
mem: Math.max(8, Math.floor(mem / 1024)), // Convert to KiB, minimum 8
|
|
153
|
+
parallelism: parallel,
|
|
154
|
+
hashLen: hashLen,
|
|
155
|
+
type: argon2Browser.ArgonType.Argon2id,
|
|
156
|
+
})
|
|
157
|
+
.then((result) => {
|
|
158
|
+
result = new Uint8Array(result.hash);
|
|
159
|
+
})
|
|
160
|
+
.catch((err) => {
|
|
161
|
+
error = err;
|
|
162
|
+
});
|
|
163
|
+
// Wait for the result (blocking)
|
|
164
|
+
xhr.open("GET", "data:text/plain;charset=utf-8,", false);
|
|
165
|
+
const maxWaitTime = Date.now() + 30000; // 30 second timeout
|
|
166
|
+
while (result === null && error === null) {
|
|
167
|
+
// Check for timeout
|
|
168
|
+
if (Date.now() > maxWaitTime) {
|
|
169
|
+
throw new Error("Argon2 operation timed out");
|
|
170
|
+
}
|
|
171
|
+
// Poll every 100ms
|
|
172
|
+
try {
|
|
173
|
+
xhr.send(null);
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
// Ignore errors from the XHR
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Check for errors
|
|
180
|
+
if (error) {
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
// Return the result
|
|
184
|
+
if (result) ;
|
|
185
|
+
throw new Error("Argon2 operation failed with no result");
|
|
186
|
+
};
|
|
187
|
+
// Call our synchronous wrapper
|
|
188
|
+
const derivedKey = argon2BrowserSync(passwordBytes, salt, memoryCost, timeCost, parallelism, keyLength);
|
|
189
|
+
const endTime = Date.now();
|
|
190
|
+
const timeTakenMs = endTime - startTime;
|
|
191
|
+
// Track statistics
|
|
192
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
193
|
+
);
|
|
194
|
+
return {
|
|
195
|
+
derivedKey: encoding.bufferToHex(derivedKey),
|
|
196
|
+
salt: encoding.bufferToHex(salt),
|
|
197
|
+
params: {
|
|
198
|
+
memoryCost,
|
|
199
|
+
timeCost,
|
|
200
|
+
parallelism,
|
|
201
|
+
keyLength,
|
|
202
|
+
},
|
|
203
|
+
metrics: {
|
|
204
|
+
timeTakenMs,
|
|
205
|
+
memoryUsedBytes: memoryCost,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
console.warn("argon2-browser not available:", e);
|
|
212
|
+
// Fall back to Web Crypto API with PBKDF2
|
|
213
|
+
}
|
|
214
|
+
// If argon2-browser is not available, try to use Web Crypto API with PBKDF2
|
|
215
|
+
if (window.crypto && window.crypto.subtle) {
|
|
216
|
+
try {
|
|
217
|
+
// Create a synchronous wrapper around the async Web Crypto API
|
|
218
|
+
const pbkdf2Sync = (pwd, slt, iterations, hashLen) => {
|
|
219
|
+
// Use a synchronous XMLHttpRequest to block until we have a result
|
|
220
|
+
const xhr = new XMLHttpRequest();
|
|
221
|
+
let result = null;
|
|
222
|
+
let error = null;
|
|
223
|
+
// Create proper ArrayBuffers to avoid type issues
|
|
224
|
+
const pwdBuffer = new ArrayBuffer(pwd.length);
|
|
225
|
+
const pwdView = new Uint8Array(pwdBuffer);
|
|
226
|
+
pwdView.set(pwd);
|
|
227
|
+
const saltBuffer = new ArrayBuffer(slt.length);
|
|
228
|
+
const saltView = new Uint8Array(saltBuffer);
|
|
229
|
+
saltView.set(slt);
|
|
230
|
+
// Import the password as a key
|
|
231
|
+
window.crypto.subtle
|
|
232
|
+
.importKey("raw", pwdBuffer, { name: "PBKDF2" }, false, ["deriveBits"])
|
|
233
|
+
.then((key) => {
|
|
234
|
+
// Derive bits using PBKDF2
|
|
235
|
+
return window.crypto.subtle.deriveBits({
|
|
236
|
+
name: "PBKDF2",
|
|
237
|
+
salt: saltBuffer,
|
|
238
|
+
iterations: iterations,
|
|
239
|
+
hash: "SHA-512",
|
|
240
|
+
}, key, hashLen * 8);
|
|
241
|
+
})
|
|
242
|
+
.then((derivedBits) => {
|
|
243
|
+
result = new Uint8Array(derivedBits);
|
|
244
|
+
})
|
|
245
|
+
.catch((err) => {
|
|
246
|
+
error = err;
|
|
247
|
+
});
|
|
248
|
+
// Wait for the result (blocking)
|
|
249
|
+
xhr.open("GET", "data:text/plain;charset=utf-8,", false);
|
|
250
|
+
const maxWaitTime = Date.now() + 30000; // 30 second timeout
|
|
251
|
+
while (result === null && error === null) {
|
|
252
|
+
// Check for timeout
|
|
253
|
+
if (Date.now() > maxWaitTime) {
|
|
254
|
+
throw new Error("PBKDF2 operation timed out");
|
|
255
|
+
}
|
|
256
|
+
// Poll every 100ms
|
|
257
|
+
try {
|
|
258
|
+
xhr.send(null);
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
// Ignore errors from the XHR
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Check for errors
|
|
265
|
+
if (error) {
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
// Return the result
|
|
269
|
+
if (result) {
|
|
270
|
+
return result;
|
|
271
|
+
}
|
|
272
|
+
throw new Error("PBKDF2 operation failed with no result");
|
|
273
|
+
};
|
|
274
|
+
// Calculate equivalent PBKDF2 iterations to match Argon2 security
|
|
275
|
+
// This is a rough approximation: Argon2 with memoryCost=m, timeCost=t, parallelism=p
|
|
276
|
+
// is roughly equivalent to PBKDF2 with iterations = m * t * p / 10
|
|
277
|
+
const equivalentIterations = Math.max(100000, Math.floor((memoryCost * timeCost * parallelism) / 10));
|
|
278
|
+
// Call our synchronous wrapper
|
|
279
|
+
const derivedKey = pbkdf2Sync(passwordBytes, salt, equivalentIterations, keyLength);
|
|
280
|
+
const endTime = Date.now();
|
|
281
|
+
const timeTakenMs = endTime - startTime;
|
|
282
|
+
console.warn(`Using Web Crypto PBKDF2 with ${equivalentIterations} iterations as Argon2 fallback`);
|
|
283
|
+
// Track statistics
|
|
284
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
285
|
+
);
|
|
286
|
+
return {
|
|
287
|
+
derivedKey: encoding.bufferToHex(derivedKey),
|
|
288
|
+
salt: encoding.bufferToHex(salt),
|
|
289
|
+
params: {
|
|
290
|
+
memoryCost,
|
|
291
|
+
timeCost,
|
|
292
|
+
parallelism,
|
|
293
|
+
keyLength,
|
|
294
|
+
},
|
|
295
|
+
metrics: {
|
|
296
|
+
timeTakenMs,
|
|
297
|
+
memoryUsedBytes: memoryCost,
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
console.warn("Web Crypto PBKDF2 failed:", e);
|
|
303
|
+
// Fall back to Node.js approach or pure JS implementation
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Try to use Node.js crypto module if available
|
|
308
|
+
if (typeof require === "function") {
|
|
309
|
+
try {
|
|
310
|
+
const crypto = require("crypto");
|
|
311
|
+
if (crypto && crypto.scryptSync) {
|
|
312
|
+
// Use scrypt as a fallback for Argon2
|
|
313
|
+
console.warn("Using Node.js crypto scrypt as Argon2 fallback");
|
|
314
|
+
// Convert parameters to scrypt parameters
|
|
315
|
+
// Argon2 with memoryCost=m, timeCost=t is roughly equivalent to
|
|
316
|
+
// scrypt with N=2^(log2(m/p)), r=8, p=parallelism
|
|
317
|
+
const log2MemoryCost = Math.max(14, Math.min(20, Math.log2(memoryCost / parallelism)));
|
|
318
|
+
const N = Math.pow(2, log2MemoryCost);
|
|
319
|
+
const r = 8; // Block size
|
|
320
|
+
const p = parallelism;
|
|
321
|
+
// Convert password and salt to Buffer
|
|
322
|
+
const passwordBuffer = Buffer.from(passwordBytes);
|
|
323
|
+
const saltBuffer = Buffer.from(salt);
|
|
324
|
+
// Derive key using scrypt
|
|
325
|
+
const derivedKey = crypto.scryptSync(passwordBuffer, saltBuffer, keyLength, { N, r, p });
|
|
326
|
+
const endTime = Date.now();
|
|
327
|
+
const timeTakenMs = endTime - startTime;
|
|
328
|
+
// Track statistics
|
|
329
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
330
|
+
);
|
|
331
|
+
return {
|
|
332
|
+
derivedKey: encoding.bufferToHex(new Uint8Array(derivedKey)),
|
|
333
|
+
salt: encoding.bufferToHex(salt),
|
|
334
|
+
params: {
|
|
335
|
+
memoryCost,
|
|
336
|
+
timeCost,
|
|
337
|
+
parallelism,
|
|
338
|
+
keyLength,
|
|
339
|
+
},
|
|
340
|
+
metrics: {
|
|
341
|
+
timeTakenMs,
|
|
342
|
+
memoryUsedBytes: N * r * 128 * p, // Approximate memory usage
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
else if (crypto && crypto.pbkdf2Sync) {
|
|
347
|
+
// Use PBKDF2 as a fallback for Argon2
|
|
348
|
+
console.warn("Using Node.js crypto PBKDF2 as Argon2 fallback");
|
|
349
|
+
// Calculate equivalent PBKDF2 iterations
|
|
350
|
+
const equivalentIterations = Math.max(100000, Math.floor((memoryCost * timeCost * parallelism) / 10));
|
|
351
|
+
// Convert password and salt to Buffer
|
|
352
|
+
const passwordBuffer = Buffer.from(passwordBytes);
|
|
353
|
+
const saltBuffer = Buffer.from(salt);
|
|
354
|
+
// Derive key using PBKDF2
|
|
355
|
+
const derivedKey = crypto.pbkdf2Sync(passwordBuffer, saltBuffer, equivalentIterations, keyLength, "sha512");
|
|
356
|
+
const endTime = Date.now();
|
|
357
|
+
const timeTakenMs = endTime - startTime;
|
|
358
|
+
// Track statistics
|
|
359
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
360
|
+
);
|
|
361
|
+
return {
|
|
362
|
+
derivedKey: encoding.bufferToHex(new Uint8Array(derivedKey)),
|
|
363
|
+
salt: encoding.bufferToHex(salt),
|
|
364
|
+
params: {
|
|
365
|
+
memoryCost,
|
|
366
|
+
timeCost,
|
|
367
|
+
parallelism,
|
|
368
|
+
keyLength,
|
|
369
|
+
},
|
|
370
|
+
metrics: {
|
|
371
|
+
timeTakenMs,
|
|
372
|
+
memoryUsedBytes: memoryCost, // Approximate memory usage
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (e) {
|
|
378
|
+
console.warn("Node.js crypto fallback failed:", e);
|
|
379
|
+
// Fall back to pure JS implementation
|
|
380
|
+
}
|
|
381
|
+
// Try to use a child process to run the argon2 command-line tool
|
|
382
|
+
try {
|
|
383
|
+
// const childProcess = require("child_process");
|
|
384
|
+
const fs = require("fs");
|
|
385
|
+
const path = require("path");
|
|
386
|
+
const os = require("os");
|
|
387
|
+
// Check if argon2 command-line tool is available
|
|
388
|
+
try {
|
|
389
|
+
// Try to execute argon2 -h to check if it's available
|
|
390
|
+
childProcess.execSync("argon2 -h", { stdio: "ignore" });
|
|
391
|
+
// If we get here, argon2 is available
|
|
392
|
+
console.warn("Using argon2 command-line tool as fallback");
|
|
393
|
+
// Create temporary files for password and salt
|
|
394
|
+
const tempDir = os.tmpdir();
|
|
395
|
+
const passwordFile = path.join(tempDir, `argon2-pwd-${Date.now()}.bin`);
|
|
396
|
+
const saltFile = path.join(tempDir, `argon2-salt-${Date.now()}.bin`);
|
|
397
|
+
const outputFile = path.join(tempDir, `argon2-out-${Date.now()}.bin`);
|
|
398
|
+
// Write password and salt to temporary files
|
|
399
|
+
fs.writeFileSync(passwordFile, Buffer.from(passwordBytes));
|
|
400
|
+
fs.writeFileSync(saltFile, Buffer.from(salt));
|
|
401
|
+
// Build argon2 command
|
|
402
|
+
const command = `argon2 "${passwordFile}" -r -id -t ${timeCost} -m ${Math.log2(memoryCost / 1024)} -p ${parallelism} -l ${keyLength} -s "${saltFile}" -o "${outputFile}"`;
|
|
403
|
+
// Execute argon2 command
|
|
404
|
+
childProcess.execSync(command, { stdio: "ignore" });
|
|
405
|
+
// Read the output
|
|
406
|
+
const derivedKey = new Uint8Array(fs.readFileSync(outputFile));
|
|
407
|
+
// Clean up temporary files
|
|
408
|
+
try {
|
|
409
|
+
fs.unlinkSync(passwordFile);
|
|
410
|
+
fs.unlinkSync(saltFile);
|
|
411
|
+
fs.unlinkSync(outputFile);
|
|
412
|
+
}
|
|
413
|
+
catch (e) {
|
|
414
|
+
// Ignore cleanup errors
|
|
415
|
+
}
|
|
416
|
+
const endTime = Date.now();
|
|
417
|
+
const timeTakenMs = endTime - startTime;
|
|
418
|
+
// Track statistics
|
|
419
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
420
|
+
);
|
|
421
|
+
return {
|
|
422
|
+
derivedKey: encoding.bufferToHex(derivedKey),
|
|
423
|
+
salt: encoding.bufferToHex(salt),
|
|
424
|
+
params: {
|
|
425
|
+
memoryCost,
|
|
426
|
+
timeCost,
|
|
427
|
+
parallelism,
|
|
428
|
+
keyLength,
|
|
429
|
+
},
|
|
430
|
+
metrics: {
|
|
431
|
+
timeTakenMs,
|
|
432
|
+
memoryUsedBytes: memoryCost,
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
catch (e) {
|
|
437
|
+
// argon2 command-line tool not available
|
|
438
|
+
console.warn("argon2 command-line tool not available:", e);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
console.warn("Child process approach failed:", e);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (e) {
|
|
447
|
+
console.warn("All Argon2 alternatives failed:", e);
|
|
448
|
+
}
|
|
449
|
+
// If all else fails, use a more secure fallback implementation
|
|
450
|
+
console.warn("Using Hash.create as final Argon2 fallback");
|
|
451
|
+
// Use multiple iterations of Hash.create with memory-hard properties
|
|
452
|
+
const blockSize = 64; // Size of each memory block in bytes
|
|
453
|
+
const numBlocks = Math.max(256, Math.min(memoryCost, 4096)); // Limit memory usage
|
|
454
|
+
const memory = new Array(numBlocks);
|
|
455
|
+
// Initialize memory with hash chains
|
|
456
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
457
|
+
// Create a unique seed for each block
|
|
458
|
+
const blockSeed = new Uint8Array(passwordBytes.length + salt.length + 4);
|
|
459
|
+
blockSeed.set(passwordBytes, 0);
|
|
460
|
+
blockSeed.set(salt, passwordBytes.length);
|
|
461
|
+
// Add block index to the seed
|
|
462
|
+
const view = new DataView(blockSeed.buffer);
|
|
463
|
+
view.setUint32(passwordBytes.length + salt.length, i, true);
|
|
464
|
+
// Use Hash.create to fill the block
|
|
465
|
+
try {
|
|
466
|
+
const hashResult = hashCore.Hash.create(blockSeed, {
|
|
467
|
+
algorithm: "sha512",
|
|
468
|
+
iterations: Math.max(1, Math.floor(timeCost / 2)),
|
|
469
|
+
salt: salt,
|
|
470
|
+
outputFormat: "buffer",
|
|
471
|
+
});
|
|
472
|
+
// Convert the hash result to a Uint8Array
|
|
473
|
+
memory[i] = new Uint8Array(hashResult).slice(0, blockSize);
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
// If Hash.create fails, use a simple hash
|
|
477
|
+
memory[i] = new Uint8Array(blockSize);
|
|
478
|
+
for (let j = 0; j < blockSize; j++) {
|
|
479
|
+
memory[i][j] = (blockSeed[j % blockSeed.length] + i + j) & 0xff;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// Perform mixing rounds with dependencies between blocks
|
|
484
|
+
for (let t = 0; t < timeCost; t++) {
|
|
485
|
+
for (let p = 0; p < parallelism; p++) {
|
|
486
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
487
|
+
// Select blocks to mix with based on current block's content
|
|
488
|
+
const j = memory[i][0] % numBlocks; // Dependent indexing
|
|
489
|
+
const k = memory[i][1] % numBlocks; // Dependent indexing
|
|
490
|
+
// Create a buffer for mixing
|
|
491
|
+
const mixBuffer = new Uint8Array(blockSize * 3 + salt.length);
|
|
492
|
+
mixBuffer.set(memory[i], 0);
|
|
493
|
+
mixBuffer.set(memory[j], blockSize);
|
|
494
|
+
mixBuffer.set(memory[k], blockSize * 2);
|
|
495
|
+
mixBuffer.set(salt, blockSize * 3);
|
|
496
|
+
// Use Hash.create for mixing
|
|
497
|
+
try {
|
|
498
|
+
const hashResult = hashCore.Hash.create(mixBuffer, {
|
|
499
|
+
algorithm: "sha512",
|
|
500
|
+
iterations: 1,
|
|
501
|
+
outputFormat: "buffer",
|
|
502
|
+
});
|
|
503
|
+
// Update the current block
|
|
504
|
+
memory[i] = new Uint8Array(hashResult).slice(0, blockSize);
|
|
505
|
+
}
|
|
506
|
+
catch (e) {
|
|
507
|
+
// If Hash.create fails, use a simple mixing function
|
|
508
|
+
for (let b = 0; b < blockSize; b++) {
|
|
509
|
+
memory[i][b] ^= memory[j][b] ^ memory[k][b];
|
|
510
|
+
memory[i][b] =
|
|
511
|
+
(memory[i][b] + memory[j][(b + 1) % blockSize]) &
|
|
512
|
+
0xff;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// Extract the key from multiple blocks
|
|
519
|
+
const result = new Uint8Array(keyLength);
|
|
520
|
+
const finalMixBuffer = new Uint8Array(numBlocks * 4 + salt.length);
|
|
521
|
+
// Collect data from all blocks
|
|
522
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
523
|
+
finalMixBuffer.set(memory[i].slice(0, 4), i * 4);
|
|
524
|
+
}
|
|
525
|
+
finalMixBuffer.set(salt, numBlocks * 4);
|
|
526
|
+
// Final hash to derive the key
|
|
527
|
+
try {
|
|
528
|
+
const hashResult = hashCore.Hash.create(finalMixBuffer, {
|
|
529
|
+
algorithm: "sha512",
|
|
530
|
+
iterations: timeCost * 2,
|
|
531
|
+
salt: salt,
|
|
532
|
+
outputFormat: "buffer",
|
|
533
|
+
});
|
|
534
|
+
// Copy the result, repeating if necessary
|
|
535
|
+
const hashBytes = new Uint8Array(hashResult);
|
|
536
|
+
for (let i = 0; i < keyLength; i++) {
|
|
537
|
+
result[i] = hashBytes[i % hashBytes.length];
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
catch (e) {
|
|
541
|
+
// If Hash.create fails, derive key from memory blocks
|
|
542
|
+
for (let i = 0; i < keyLength; i++) {
|
|
543
|
+
let value = 0;
|
|
544
|
+
for (let j = 0; j < Math.min(16, numBlocks); j++) {
|
|
545
|
+
const blockIndex = (i * j) % numBlocks;
|
|
546
|
+
const byteIndex = (i + j) % blockSize;
|
|
547
|
+
value ^= memory[blockIndex][byteIndex];
|
|
548
|
+
}
|
|
549
|
+
result[i] = value;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
const endTime = Date.now();
|
|
553
|
+
const timeTakenMs = endTime - startTime;
|
|
554
|
+
// Track statistics
|
|
555
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
556
|
+
);
|
|
557
|
+
return {
|
|
558
|
+
derivedKey: encoding.bufferToHex(result),
|
|
559
|
+
salt: encoding.bufferToHex(salt),
|
|
560
|
+
params: {
|
|
561
|
+
memoryCost,
|
|
562
|
+
timeCost,
|
|
563
|
+
parallelism,
|
|
564
|
+
keyLength,
|
|
565
|
+
},
|
|
566
|
+
metrics: {
|
|
567
|
+
timeTakenMs,
|
|
568
|
+
memoryUsedBytes: numBlocks * blockSize,
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Implements a real version of the Balloon memory-hard hashing algorithm
|
|
574
|
+
*
|
|
575
|
+
* Balloon is designed to be a simple memory-hard algorithm with provable
|
|
576
|
+
* memory-hardness properties. This implementation follows the paper:
|
|
577
|
+
* "Balloon: A Forward-Secure Password-Hashing Algorithm with Memory-Hard Functions"
|
|
578
|
+
* by Dan Boneh, Henry Corrigan-Gibbs, and Stuart Schechter.
|
|
579
|
+
*
|
|
580
|
+
* @param password - Password to derive key from
|
|
581
|
+
* @param options - Derivation options
|
|
582
|
+
* @returns Derived key and metadata
|
|
583
|
+
*/
|
|
584
|
+
function balloonDerive(password, options = {}) {
|
|
585
|
+
const startTime = Date.now();
|
|
586
|
+
// Parse options with defaults
|
|
587
|
+
const memoryCost = options.memoryCost || 16384; // 16 MB
|
|
588
|
+
const timeCost = options.timeCost || 4;
|
|
589
|
+
const parallelism = options.parallelism || 1; // Used for multiple lanes in enhanced Balloon
|
|
590
|
+
const keyLength = options.keyLength || 32;
|
|
591
|
+
// Generate or use provided salt
|
|
592
|
+
const saltLength = options.saltLength || 16;
|
|
593
|
+
const salt = options.salt || randomCore.SecureRandom.getRandomBytes(saltLength);
|
|
594
|
+
// Convert password to bytes if it's a string
|
|
595
|
+
const passwordBytes = typeof password === "string"
|
|
596
|
+
? new TextEncoder().encode(password)
|
|
597
|
+
: password;
|
|
598
|
+
// Try to use Node.js crypto for better performance if available
|
|
599
|
+
if (typeof require === "function") {
|
|
600
|
+
try {
|
|
601
|
+
const crypto = require("crypto");
|
|
602
|
+
if (crypto && crypto.createHash) {
|
|
603
|
+
// Use Node.js crypto implementation
|
|
604
|
+
return balloonDeriveNodeCrypto(passwordBytes, salt, memoryCost, timeCost, parallelism, keyLength, startTime);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
catch (e) {
|
|
608
|
+
console.warn("Node.js crypto not available for Balloon:", e);
|
|
609
|
+
// Fall back to the pure JS implementation
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
// Initialize memory blocks (each 64 bytes for better security)
|
|
613
|
+
const blockSize = 64; // Use 64 bytes (512 bits) for SHA-512
|
|
614
|
+
const numBlocks = Math.max(256, Math.min(memoryCost, 65536)); // Limit memory usage
|
|
615
|
+
const memory = new Array(numBlocks);
|
|
616
|
+
// Create a secure hash function using SHA-512
|
|
617
|
+
const secureHash = (data) => {
|
|
618
|
+
try {
|
|
619
|
+
// Use the Hash module's secure hash function
|
|
620
|
+
const hashResult = hashCore.Hash.create(data, {
|
|
621
|
+
algorithm: "sha512", // Use SHA-512 for better security
|
|
622
|
+
outputFormat: "buffer",
|
|
623
|
+
});
|
|
624
|
+
// Convert the hash result to a Uint8Array
|
|
625
|
+
if (typeof hashResult === "string") {
|
|
626
|
+
// Convert string to buffer
|
|
627
|
+
return new TextEncoder().encode(hashResult).slice(0, blockSize);
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
// Use it as a Uint8Array
|
|
631
|
+
return new Uint8Array(hashResult).slice(0, blockSize);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
catch (e) {
|
|
635
|
+
console.warn("Error using Hash.create:", e);
|
|
636
|
+
// Fallback to a more secure custom implementation
|
|
637
|
+
try {
|
|
638
|
+
// Create a buffer for the hash result
|
|
639
|
+
const result = new Uint8Array(blockSize);
|
|
640
|
+
// Simple custom hash function based on multiple rounds of mixing
|
|
641
|
+
let h = 0;
|
|
642
|
+
for (let i = 0; i < blockSize; i++) {
|
|
643
|
+
for (let j = 0; j < data.length; j++) {
|
|
644
|
+
// Mix data bytes with position and previous hash value
|
|
645
|
+
h = ((h << 5) - h + data[j]) | 0;
|
|
646
|
+
h =
|
|
647
|
+
((h << 7) ^
|
|
648
|
+
(h >>> 3) ^
|
|
649
|
+
data[(j + i) % data.length]) |
|
|
650
|
+
0;
|
|
651
|
+
}
|
|
652
|
+
// Store hash byte
|
|
653
|
+
result[i] = h & 0xff;
|
|
654
|
+
}
|
|
655
|
+
return result;
|
|
656
|
+
}
|
|
657
|
+
catch (innerError) {
|
|
658
|
+
// Last resort fallback
|
|
659
|
+
console.warn("Error in fallback hash:", innerError);
|
|
660
|
+
const fallbackHash = new Uint8Array(blockSize);
|
|
661
|
+
for (let i = 0; i < blockSize; i++) {
|
|
662
|
+
fallbackHash[i] = (i * 31 + data[i % data.length]) & 0xff;
|
|
663
|
+
}
|
|
664
|
+
return fallbackHash;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
};
|
|
668
|
+
// Step 1: Expand - Fill the buffer with pseudorandom bytes derived from the password and salt
|
|
669
|
+
// Initialize first block with password and salt
|
|
670
|
+
const initialSeed = new Uint8Array(passwordBytes.length + salt.length + 8);
|
|
671
|
+
initialSeed.set(passwordBytes, 0);
|
|
672
|
+
initialSeed.set(salt, passwordBytes.length);
|
|
673
|
+
// Add counter and other parameters to the seed
|
|
674
|
+
const seedView = new DataView(initialSeed.buffer);
|
|
675
|
+
seedView.setUint32(passwordBytes.length + salt.length, numBlocks, true);
|
|
676
|
+
seedView.setUint32(passwordBytes.length + salt.length + 4, timeCost, true);
|
|
677
|
+
// Fill first block
|
|
678
|
+
memory[0] = secureHash(initialSeed);
|
|
679
|
+
// Fill remaining blocks using counter mode
|
|
680
|
+
for (let i = 1; i < numBlocks; i++) {
|
|
681
|
+
const input = new Uint8Array(memory[i - 1].length + 8);
|
|
682
|
+
input.set(memory[i - 1], 0);
|
|
683
|
+
// Add counter and block index
|
|
684
|
+
const view = new DataView(input.buffer);
|
|
685
|
+
view.setUint32(memory[i - 1].length, i, true);
|
|
686
|
+
view.setUint32(memory[i - 1].length + 4, 0, true); // Round 0
|
|
687
|
+
memory[i] = secureHash(input);
|
|
688
|
+
}
|
|
689
|
+
// Step 2: Mix - Perform multiple rounds of mixing
|
|
690
|
+
for (let round = 0; round < timeCost; round++) {
|
|
691
|
+
// Process each block
|
|
692
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
693
|
+
// Step 2a: Hash the current block with round and index
|
|
694
|
+
const bufferA = new Uint8Array(memory[i].length + 8);
|
|
695
|
+
bufferA.set(memory[i], 0);
|
|
696
|
+
const viewA = new DataView(bufferA.buffer);
|
|
697
|
+
viewA.setUint32(memory[i].length, round, true);
|
|
698
|
+
viewA.setUint32(memory[i].length + 4, i, true);
|
|
699
|
+
memory[i] = secureHash(bufferA);
|
|
700
|
+
// Step 2b: Mix in data from other blocks
|
|
701
|
+
// In the Balloon algorithm, we mix with:
|
|
702
|
+
// 1. Previous block (sequential dependency)
|
|
703
|
+
// 2. A random block (random dependency)
|
|
704
|
+
// 3. A block determined by the current block's content (data-dependent indexing)
|
|
705
|
+
// Number of blocks to mix with (more for better security)
|
|
706
|
+
const mixCount = Math.min(4, numBlocks - 1);
|
|
707
|
+
for (let mix = 0; mix < mixCount; mix++) {
|
|
708
|
+
let blockToMix;
|
|
709
|
+
if (mix === 0) {
|
|
710
|
+
// Previous block (sequential dependency)
|
|
711
|
+
blockToMix = (i + numBlocks - 1) % numBlocks;
|
|
712
|
+
}
|
|
713
|
+
else if (mix === 1) {
|
|
714
|
+
// Random block based on round and index (random dependency)
|
|
715
|
+
// Use a deterministic but "random-looking" function
|
|
716
|
+
blockToMix = (i ^ round ^ (i * round)) % numBlocks;
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
// Data-dependent indexing (use current block's content to determine index)
|
|
720
|
+
// This is the key to making the algorithm memory-hard
|
|
721
|
+
const idxData = new Uint8Array(memory[i].length + 4);
|
|
722
|
+
idxData.set(memory[i], 0);
|
|
723
|
+
const idxView = new DataView(idxData.buffer);
|
|
724
|
+
idxView.setUint32(memory[i].length, mix, true);
|
|
725
|
+
// Hash to get a "random" index
|
|
726
|
+
const idxHash = secureHash(idxData);
|
|
727
|
+
// Use first 4 bytes as an index
|
|
728
|
+
const idxHashView = new DataView(idxHash.buffer);
|
|
729
|
+
blockToMix = idxHashView.getUint32(0, true) % numBlocks;
|
|
730
|
+
}
|
|
731
|
+
// Mix the selected block with the current block
|
|
732
|
+
const mixBuffer = new Uint8Array(memory[i].length + memory[blockToMix].length + 8);
|
|
733
|
+
mixBuffer.set(memory[i], 0);
|
|
734
|
+
mixBuffer.set(memory[blockToMix], memory[i].length);
|
|
735
|
+
const mixView = new DataView(mixBuffer.buffer);
|
|
736
|
+
mixView.setUint32(memory[i].length + memory[blockToMix].length, round, true);
|
|
737
|
+
mixView.setUint32(memory[i].length + memory[blockToMix].length + 4, i, true);
|
|
738
|
+
// Update current block
|
|
739
|
+
memory[i] = secureHash(mixBuffer);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
// Step 3: Extract - Derive the final key from multiple blocks
|
|
744
|
+
// Create a buffer to hold the final extraction data
|
|
745
|
+
const extractBuffer = new Uint8Array(blockSize * Math.min(16, numBlocks) + salt.length);
|
|
746
|
+
// Use multiple blocks for extraction (last blocks contain the most mixed data)
|
|
747
|
+
const blocksToUse = Math.min(16, numBlocks);
|
|
748
|
+
for (let i = 0; i < blocksToUse; i++) {
|
|
749
|
+
const blockIndex = numBlocks - i - 1;
|
|
750
|
+
extractBuffer.set(memory[blockIndex].slice(0, blockSize), i * blockSize);
|
|
751
|
+
}
|
|
752
|
+
// Add salt to the extraction
|
|
753
|
+
extractBuffer.set(salt, blocksToUse * blockSize);
|
|
754
|
+
// Final hash to get the key
|
|
755
|
+
let finalHash;
|
|
756
|
+
try {
|
|
757
|
+
// Use PBKDF2 with a single iteration for the final extraction
|
|
758
|
+
// This adds some extra security and allows flexible key length
|
|
759
|
+
finalHash = hashCore.Hash.create(extractBuffer, {
|
|
760
|
+
algorithm: "sha512",
|
|
761
|
+
iterations: 1,
|
|
762
|
+
salt: salt,
|
|
763
|
+
outputFormat: "buffer",
|
|
764
|
+
});
|
|
765
|
+
// Convert to Uint8Array
|
|
766
|
+
finalHash = new Uint8Array(finalHash);
|
|
767
|
+
}
|
|
768
|
+
catch (e) {
|
|
769
|
+
console.warn("Error in final hash extraction:", e);
|
|
770
|
+
// Fallback: combine blocks directly
|
|
771
|
+
finalHash = new Uint8Array(blocksToUse * blockSize);
|
|
772
|
+
for (let i = 0; i < blocksToUse; i++) {
|
|
773
|
+
finalHash.set(memory[numBlocks - i - 1], i * blockSize);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
// Truncate or extend to the requested key length
|
|
777
|
+
const result = new Uint8Array(keyLength);
|
|
778
|
+
for (let i = 0; i < keyLength; i++) {
|
|
779
|
+
result[i] = finalHash[i % finalHash.length];
|
|
780
|
+
}
|
|
781
|
+
const endTime = Date.now();
|
|
782
|
+
const timeTakenMs = endTime - startTime;
|
|
783
|
+
// Track statistics
|
|
784
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
785
|
+
);
|
|
786
|
+
return {
|
|
787
|
+
derivedKey: encoding.bufferToHex(result),
|
|
788
|
+
salt: encoding.bufferToHex(salt),
|
|
789
|
+
params: {
|
|
790
|
+
memoryCost,
|
|
791
|
+
timeCost,
|
|
792
|
+
parallelism,
|
|
793
|
+
keyLength,
|
|
794
|
+
},
|
|
795
|
+
metrics: {
|
|
796
|
+
timeTakenMs,
|
|
797
|
+
memoryUsedBytes: numBlocks * blockSize,
|
|
798
|
+
},
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Node.js crypto implementation of Balloon
|
|
803
|
+
* This is more efficient than the pure JS implementation
|
|
804
|
+
*/
|
|
805
|
+
function balloonDeriveNodeCrypto(passwordBytes, salt, memoryCost, timeCost, parallelism, keyLength, startTime) {
|
|
806
|
+
const crypto = require("crypto");
|
|
807
|
+
// Initialize memory blocks (each 64 bytes for better security)
|
|
808
|
+
const blockSize = 64; // Use 64 bytes (512 bits) for SHA-512
|
|
809
|
+
const numBlocks = Math.max(256, Math.min(memoryCost, 65536)); // Limit memory usage
|
|
810
|
+
const memory = new Array(numBlocks);
|
|
811
|
+
// Create a secure hash function using Node.js crypto
|
|
812
|
+
const secureHash = (data) => {
|
|
813
|
+
const hash = crypto.createHash("sha512");
|
|
814
|
+
hash.update(Buffer.from(data));
|
|
815
|
+
return new Uint8Array(hash.digest().slice(0, blockSize));
|
|
816
|
+
};
|
|
817
|
+
// Step 1: Expand - Fill the buffer with pseudorandom bytes derived from the password and salt
|
|
818
|
+
// Initialize first block with password and salt
|
|
819
|
+
const initialSeed = new Uint8Array(passwordBytes.length + salt.length + 8);
|
|
820
|
+
initialSeed.set(passwordBytes, 0);
|
|
821
|
+
initialSeed.set(salt, passwordBytes.length);
|
|
822
|
+
// Add counter and other parameters to the seed
|
|
823
|
+
const seedView = new DataView(initialSeed.buffer);
|
|
824
|
+
seedView.setUint32(passwordBytes.length + salt.length, numBlocks, true);
|
|
825
|
+
seedView.setUint32(passwordBytes.length + salt.length + 4, timeCost, true);
|
|
826
|
+
// Fill first block
|
|
827
|
+
memory[0] = secureHash(initialSeed);
|
|
828
|
+
// Fill remaining blocks using counter mode
|
|
829
|
+
for (let i = 1; i < numBlocks; i++) {
|
|
830
|
+
const input = new Uint8Array(memory[i - 1].length + 8);
|
|
831
|
+
input.set(memory[i - 1], 0);
|
|
832
|
+
// Add counter and block index
|
|
833
|
+
const view = new DataView(input.buffer);
|
|
834
|
+
view.setUint32(memory[i - 1].length, i, true);
|
|
835
|
+
view.setUint32(memory[i - 1].length + 4, 0, true); // Round 0
|
|
836
|
+
memory[i] = secureHash(input);
|
|
837
|
+
}
|
|
838
|
+
// Step 2: Mix - Perform multiple rounds of mixing
|
|
839
|
+
for (let round = 0; round < timeCost; round++) {
|
|
840
|
+
// Process each block
|
|
841
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
842
|
+
// Step 2a: Hash the current block with round and index
|
|
843
|
+
const bufferA = new Uint8Array(memory[i].length + 8);
|
|
844
|
+
bufferA.set(memory[i], 0);
|
|
845
|
+
const viewA = new DataView(bufferA.buffer);
|
|
846
|
+
viewA.setUint32(memory[i].length, round, true);
|
|
847
|
+
viewA.setUint32(memory[i].length + 4, i, true);
|
|
848
|
+
memory[i] = secureHash(bufferA);
|
|
849
|
+
// Step 2b: Mix in data from other blocks
|
|
850
|
+
// Number of blocks to mix with (more for better security)
|
|
851
|
+
const mixCount = Math.min(4, numBlocks - 1);
|
|
852
|
+
for (let mix = 0; mix < mixCount; mix++) {
|
|
853
|
+
let blockToMix;
|
|
854
|
+
if (mix === 0) {
|
|
855
|
+
// Previous block (sequential dependency)
|
|
856
|
+
blockToMix = (i + numBlocks - 1) % numBlocks;
|
|
857
|
+
}
|
|
858
|
+
else if (mix === 1) {
|
|
859
|
+
// Random block based on round and index (random dependency)
|
|
860
|
+
blockToMix = (i ^ round ^ (i * round)) % numBlocks;
|
|
861
|
+
}
|
|
862
|
+
else {
|
|
863
|
+
// Data-dependent indexing
|
|
864
|
+
const idxData = new Uint8Array(memory[i].length + 4);
|
|
865
|
+
idxData.set(memory[i], 0);
|
|
866
|
+
const idxView = new DataView(idxData.buffer);
|
|
867
|
+
idxView.setUint32(memory[i].length, mix, true);
|
|
868
|
+
// Hash to get a "random" index
|
|
869
|
+
const idxHash = secureHash(idxData);
|
|
870
|
+
// Use first 4 bytes as an index
|
|
871
|
+
const idxHashView = new DataView(idxHash.buffer);
|
|
872
|
+
blockToMix = idxHashView.getUint32(0, true) % numBlocks;
|
|
873
|
+
}
|
|
874
|
+
// Mix the selected block with the current block
|
|
875
|
+
const mixBuffer = new Uint8Array(memory[i].length + memory[blockToMix].length + 8);
|
|
876
|
+
mixBuffer.set(memory[i], 0);
|
|
877
|
+
mixBuffer.set(memory[blockToMix], memory[i].length);
|
|
878
|
+
const mixView = new DataView(mixBuffer.buffer);
|
|
879
|
+
mixView.setUint32(memory[i].length + memory[blockToMix].length, round, true);
|
|
880
|
+
mixView.setUint32(memory[i].length + memory[blockToMix].length + 4, i, true);
|
|
881
|
+
// Update current block
|
|
882
|
+
memory[i] = secureHash(mixBuffer);
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
// Step 3: Extract - Derive the final key from multiple blocks
|
|
887
|
+
// Create a buffer to hold the final extraction data
|
|
888
|
+
const extractBuffer = Buffer.alloc(blockSize * Math.min(16, numBlocks) + salt.length);
|
|
889
|
+
// Use multiple blocks for extraction (last blocks contain the most mixed data)
|
|
890
|
+
const blocksToUse = Math.min(16, numBlocks);
|
|
891
|
+
for (let i = 0; i < blocksToUse; i++) {
|
|
892
|
+
const blockIndex = numBlocks - i - 1;
|
|
893
|
+
Buffer.from(memory[blockIndex].slice(0, blockSize)).copy(extractBuffer, i * blockSize);
|
|
894
|
+
}
|
|
895
|
+
// Add salt to the extraction
|
|
896
|
+
Buffer.from(salt).copy(extractBuffer, blocksToUse * blockSize);
|
|
897
|
+
// Final derivation using PBKDF2 with a single iteration
|
|
898
|
+
const result = crypto.pbkdf2Sync(extractBuffer, Buffer.from(salt), 1, keyLength, "sha512");
|
|
899
|
+
const endTime = Date.now();
|
|
900
|
+
const timeTakenMs = endTime - startTime;
|
|
901
|
+
// Track statistics
|
|
902
|
+
stats.StatsTracker.getInstance().trackKeyDerivation(timeTakenMs, keyLength * 8 // Entropy bits
|
|
903
|
+
);
|
|
904
|
+
return {
|
|
905
|
+
derivedKey: encoding.bufferToHex(new Uint8Array(result)),
|
|
906
|
+
salt: encoding.bufferToHex(salt),
|
|
907
|
+
params: {
|
|
908
|
+
memoryCost,
|
|
909
|
+
timeCost,
|
|
910
|
+
parallelism,
|
|
911
|
+
keyLength,
|
|
912
|
+
},
|
|
913
|
+
metrics: {
|
|
914
|
+
timeTakenMs,
|
|
915
|
+
memoryUsedBytes: numBlocks * blockSize,
|
|
916
|
+
},
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
exports.argon2Derive = argon2Derive;
|
|
921
|
+
exports.balloonDerive = balloonDerive;
|
|
922
|
+
//# sourceMappingURL=memory-hard.js.map
|