@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.1
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/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/components/Logger.js +3 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +16 -9
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +4 -1
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +243 -66
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +4 -5
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +50 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +1 -0
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +21 -3
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/ResourceInterfaceV2.ts +53 -0
- package/resources/ResourceV2.ts +67 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4527 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +716 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +594 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-BTgXJX9d.js +235 -0
- package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
- package/studio/web/assets/index-C-GXfcup.js +37 -0
- package/studio/web/assets/index-C-GXfcup.js.map +1 -0
- package/studio/web/assets/index-PFlNdimM.js +2 -0
- package/studio/web/assets/index-PFlNdimM.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
- package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
- package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +119 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/v1.d.ts +39 -0
- package/v1.js +41 -0
- package/v2.d.ts +39 -0
- package/v2.js +41 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Certificate verification for mTLS authentication
|
|
3
|
+
*
|
|
4
|
+
* This module provides certificate revocation checking for client certificates
|
|
5
|
+
* in mutual TLS (mTLS) connections. Supports both OCSP (Online Certificate
|
|
6
|
+
* Status Protocol) and CRL (Certificate Revocation List) verification methods
|
|
7
|
+
* with automatic method selection.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - OCSP verification with caching
|
|
11
|
+
* - CRL verification with caching
|
|
12
|
+
* - CRL-first with OCSP fallback for optimal performance
|
|
13
|
+
* - Background CRL refresh with exponential backoff
|
|
14
|
+
* - Graceful degradation during network outages
|
|
15
|
+
* - Ed25519/Ed448 certificate support
|
|
16
|
+
*
|
|
17
|
+
* Default behavior:
|
|
18
|
+
* - Certificate verification: disabled (must be explicitly enabled)
|
|
19
|
+
* - Verification approach: CRL-first (with OCSP fallback)
|
|
20
|
+
* - CRL timeout: 10 seconds, cache TTL: 24 hours
|
|
21
|
+
* - OCSP timeout: 5 seconds, cache TTL: 1 hour
|
|
22
|
+
* - Failure mode: fail-closed (rejects connections if verification fails)
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { loggerWithTag } from '../../utility/logging/logger.ts';
|
|
26
|
+
import { extractCertificateChain, extractRevocationUrls, bufferToPem } from './verificationUtils.ts';
|
|
27
|
+
import { getCachedCertificateVerificationConfig } from './verificationConfig.ts';
|
|
28
|
+
import { verifyOCSP } from './ocspVerification.ts';
|
|
29
|
+
import { verifyCRL } from './crlVerification.ts';
|
|
30
|
+
import type { PeerCertificate, CertificateVerificationResult } from './types.ts';
|
|
31
|
+
|
|
32
|
+
const logger = loggerWithTag('cert-verification');
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Verify certificate revocation status using OCSP and/or CRL
|
|
36
|
+
* @param peerCertificate - Peer certificate object from TLS connection
|
|
37
|
+
* @param mtlsConfig - The mTLS configuration from the request
|
|
38
|
+
* @returns Promise resolving to verification result
|
|
39
|
+
*/
|
|
40
|
+
export async function verifyCertificate(
|
|
41
|
+
peerCertificate: PeerCertificate,
|
|
42
|
+
mtlsConfig?: boolean | Record<string, any> | null
|
|
43
|
+
): Promise<CertificateVerificationResult> {
|
|
44
|
+
logger.debug?.(`verifyCertificate called for: ${peerCertificate.subject?.CN || 'unknown'}`);
|
|
45
|
+
|
|
46
|
+
// Get the verification configuration from mtlsConfig (cached for performance)
|
|
47
|
+
const config = getCachedCertificateVerificationConfig(mtlsConfig);
|
|
48
|
+
|
|
49
|
+
// If config is false, verification is disabled
|
|
50
|
+
if (config === false) {
|
|
51
|
+
logger.debug?.('Certificate verification disabled');
|
|
52
|
+
return { valid: true, status: 'disabled', method: 'disabled' };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Extract certificate chain
|
|
56
|
+
const certChain = extractCertificateChain(peerCertificate);
|
|
57
|
+
logger.trace?.(`Certificate chain length: ${certChain.length}`);
|
|
58
|
+
|
|
59
|
+
// Check if we have sufficient chain for verification (need certificate and issuer)
|
|
60
|
+
if (certChain.length < 2 || !certChain[0].issuer) {
|
|
61
|
+
logger.debug?.('Certificate chain insufficient for revocation checking - need certificate and issuer');
|
|
62
|
+
return { valid: true, status: 'no-issuer-cert', method: 'disabled' };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Extract certificate revocation URLs in single parse operation
|
|
66
|
+
const certPem = bufferToPem(certChain[0].cert, 'CERTIFICATE');
|
|
67
|
+
const { crlUrls, ocspUrls } = extractRevocationUrls(certPem);
|
|
68
|
+
|
|
69
|
+
logger.debug?.(`Certificate extensions: CRL distribution points=${crlUrls.length}, OCSP URLs=${ocspUrls.length}`);
|
|
70
|
+
|
|
71
|
+
// Try CRL first (can provide definitive results)
|
|
72
|
+
if (crlUrls.length > 0) {
|
|
73
|
+
if (config.crl.enabled) {
|
|
74
|
+
try {
|
|
75
|
+
logger.debug?.('Attempting CRL verification');
|
|
76
|
+
const result = await verifyCRL(certChain[0].cert, certChain[0].issuer, config.crl, crlUrls);
|
|
77
|
+
|
|
78
|
+
// Return on definitive result (good or revoked)
|
|
79
|
+
if (result.status === 'good' || result.status === 'revoked') {
|
|
80
|
+
logger.debug?.(`CRL verification result: ${result.status}`);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
logger.debug?.(`CRL verification inconclusive: ${result.status}, trying OCSP fallback`);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.warn?.(`CRL verification failed: ${error}`);
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
logger.debug?.('Skipping CRL - disabled in configuration');
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
logger.debug?.('Skipping CRL - no distribution points in certificate');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Fall back to OCSP if available (real-time status)
|
|
96
|
+
if (ocspUrls.length > 0) {
|
|
97
|
+
if (config.ocsp.enabled) {
|
|
98
|
+
try {
|
|
99
|
+
logger.debug?.('Attempting OCSP verification');
|
|
100
|
+
const result = await verifyOCSP(certChain[0].cert, certChain[0].issuer, config.ocsp, ocspUrls);
|
|
101
|
+
|
|
102
|
+
// Return result (definitive or not)
|
|
103
|
+
logger.debug?.(`OCSP verification result: ${result.status}`);
|
|
104
|
+
return result;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
logger.warn?.(`OCSP verification failed: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
logger.debug?.('Skipping OCSP - disabled in configuration');
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
logger.debug?.('Skipping OCSP - no responder URLs in certificate');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// All methods tried or skipped - determine failure handling
|
|
116
|
+
if (config.failureMode === 'fail-closed') {
|
|
117
|
+
return { valid: false, status: 'no-verification-available', method: 'disabled' };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return { valid: true, status: 'verification-unavailable-allowed', method: 'disabled' };
|
|
121
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCSP (Online Certificate Status Protocol) verification
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Apply PKI.js Ed25519 patch before importing easy-ocsp
|
|
6
|
+
import './pkijs-ed25519-patch.ts';
|
|
7
|
+
import { getCertStatus } from 'easy-ocsp';
|
|
8
|
+
import { loggerWithTag } from '../../utility/logging/logger.ts';
|
|
9
|
+
import {
|
|
10
|
+
bufferToPem,
|
|
11
|
+
createCacheKey,
|
|
12
|
+
getCertificateCacheTable as getSharedCertificateCacheTable,
|
|
13
|
+
} from './verificationUtils.ts';
|
|
14
|
+
import type {
|
|
15
|
+
CertificateVerificationResult,
|
|
16
|
+
CertificateVerificationContext,
|
|
17
|
+
CertificateCacheEntry,
|
|
18
|
+
OCSPCheckResult,
|
|
19
|
+
OCSPConfig,
|
|
20
|
+
} from './types.ts';
|
|
21
|
+
|
|
22
|
+
const logger = loggerWithTag('ocsp-verification');
|
|
23
|
+
|
|
24
|
+
// Import the shared source
|
|
25
|
+
import { CertificateVerificationSource } from './certificateVerificationSource.ts';
|
|
26
|
+
|
|
27
|
+
// Lazy-load the certificate verification cache table
|
|
28
|
+
let certCacheTable: ReturnType<typeof getSharedCertificateCacheTable>;
|
|
29
|
+
function getCertificateCacheTable() {
|
|
30
|
+
if (!certCacheTable) {
|
|
31
|
+
certCacheTable = getSharedCertificateCacheTable();
|
|
32
|
+
// Configure the caching source using the shared CertificateVerificationSource class
|
|
33
|
+
(certCacheTable as any).sourcedFrom(CertificateVerificationSource);
|
|
34
|
+
}
|
|
35
|
+
return certCacheTable;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Verify OCSP status of a client certificate
|
|
40
|
+
* @param certPem - Client certificate as Buffer (DER format)
|
|
41
|
+
* @param issuerPem - Issuer (CA) certificate as Buffer (DER format)
|
|
42
|
+
* @param config - OCSP configuration
|
|
43
|
+
* @param ocspUrls - Optional pre-extracted OCSP responder URLs (avoids re-parsing)
|
|
44
|
+
* @returns Promise resolving to verification result
|
|
45
|
+
*/
|
|
46
|
+
export async function verifyOCSP(
|
|
47
|
+
certPem: Buffer,
|
|
48
|
+
issuerPem: Buffer,
|
|
49
|
+
config?: OCSPConfig,
|
|
50
|
+
ocspUrls?: string[]
|
|
51
|
+
): Promise<CertificateVerificationResult> {
|
|
52
|
+
// Check if OCSP verification is disabled
|
|
53
|
+
if (config?.enabled === false) {
|
|
54
|
+
return { valid: true, status: 'disabled', method: 'disabled' };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
// Convert DER buffers to PEM strings for certificate parsing libraries
|
|
59
|
+
// PKI.js and easy-ocsp expect PEM format for extension extraction and OCSP requests
|
|
60
|
+
const certPemStr = bufferToPem(certPem, 'CERTIFICATE');
|
|
61
|
+
const issuerPemStr = bufferToPem(issuerPem, 'CERTIFICATE');
|
|
62
|
+
|
|
63
|
+
// Create a cache key that includes all verification parameters
|
|
64
|
+
const cacheKey = createCacheKey(certPemStr, issuerPemStr, 'ocsp');
|
|
65
|
+
|
|
66
|
+
// Get the cache table - Harper will automatically handle
|
|
67
|
+
// concurrent requests and cache stampede prevention
|
|
68
|
+
// Pass certificate data as context - Harper will make it available as requestContext in the source
|
|
69
|
+
const cacheEntry = await (getCertificateCacheTable() as any).get(cacheKey, {
|
|
70
|
+
certPem: certPemStr,
|
|
71
|
+
issuerPem: issuerPemStr,
|
|
72
|
+
ocspUrls,
|
|
73
|
+
config: { ocsp: config ?? {} },
|
|
74
|
+
} as CertificateVerificationContext);
|
|
75
|
+
|
|
76
|
+
if (!cacheEntry) {
|
|
77
|
+
// This should not happen if the source is configured correctly
|
|
78
|
+
// but handle it gracefully
|
|
79
|
+
if (config.failureMode === 'fail-closed') {
|
|
80
|
+
return { valid: false, status: 'error', error: 'Cache fetch failed', method: 'ocsp' };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
logger.warn?.('OCSP cache fetch failed, allowing connection (fail-open mode)');
|
|
84
|
+
return { valid: true, status: 'error-allowed', method: 'ocsp' };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const cached = cacheEntry as unknown as CertificateCacheEntry;
|
|
88
|
+
const wasLoadedFromSource = (cacheEntry as any).wasLoadedFromSource?.();
|
|
89
|
+
logger.trace?.(`OCSP ${wasLoadedFromSource ? 'source fetch' : 'cache hit'} for certificate`);
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
valid: cached.status === 'good',
|
|
93
|
+
status: cached.status,
|
|
94
|
+
cached: !wasLoadedFromSource,
|
|
95
|
+
method: cached.method || 'ocsp',
|
|
96
|
+
};
|
|
97
|
+
} catch (error) {
|
|
98
|
+
logger.error?.(`OCSP verification error: ${error}`);
|
|
99
|
+
|
|
100
|
+
// Check failure mode
|
|
101
|
+
if (config.failureMode === 'fail-closed') {
|
|
102
|
+
return { valid: false, status: 'error', error: (error as Error).message, method: 'ocsp' };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Fail open - allow connection on OCSP errors
|
|
106
|
+
logger.warn?.('OCSP check failed, allowing connection (fail-open mode)');
|
|
107
|
+
return { valid: true, status: 'error-allowed', method: 'ocsp' };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Perform the actual OCSP check using easy-ocsp
|
|
113
|
+
* @param certPem - Certificate in PEM format
|
|
114
|
+
* @param issuerPem - Issuer certificate in PEM format
|
|
115
|
+
* @param config - OCSP configuration
|
|
116
|
+
* @param ocspUrls - Optional pre-extracted OCSP responder URLs (avoids re-parsing)
|
|
117
|
+
* @returns OCSP check result
|
|
118
|
+
*/
|
|
119
|
+
export async function performOCSPCheck(
|
|
120
|
+
certPem: string,
|
|
121
|
+
issuerPem: string,
|
|
122
|
+
config: any,
|
|
123
|
+
ocspUrls?: string[]
|
|
124
|
+
): Promise<OCSPCheckResult> {
|
|
125
|
+
try {
|
|
126
|
+
const response = await getCertStatus(certPem, {
|
|
127
|
+
ca: issuerPem,
|
|
128
|
+
timeout: config.timeout,
|
|
129
|
+
...(ocspUrls?.length && { ocspUrl: ocspUrls[0] }),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Map response status to internal format
|
|
133
|
+
switch (response.status) {
|
|
134
|
+
case 'good':
|
|
135
|
+
return { status: 'good' };
|
|
136
|
+
case 'revoked':
|
|
137
|
+
return { status: 'revoked', reason: response.revocationReason?.toString() || 'unspecified' };
|
|
138
|
+
default:
|
|
139
|
+
return { status: 'unknown', reason: 'unknown-status' };
|
|
140
|
+
}
|
|
141
|
+
} catch (error) {
|
|
142
|
+
const err = error as Error;
|
|
143
|
+
|
|
144
|
+
// Return appropriate error based on type
|
|
145
|
+
const reason = err.name === 'AbortError' ? 'timeout' : 'ocsp-error';
|
|
146
|
+
return { status: 'unknown', reason };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PKI.js Ed25519/Ed448 Support Patch
|
|
3
|
+
*
|
|
4
|
+
* This module patches PKI.js to add complete Ed25519/Ed448 support for certificate
|
|
5
|
+
* and OCSP response verification. While PKI.js has some Ed25519/Ed448 support,
|
|
6
|
+
* it currently lacks:
|
|
7
|
+
* - getHashAlgorithm() support for Ed25519/Ed448 OIDs
|
|
8
|
+
* - getAlgorithmByOID() recognition of Ed25519/Ed448
|
|
9
|
+
* - Certificate verification using Ed25519/Ed448 signatures
|
|
10
|
+
* - OCSP response signature verification with Ed25519/Ed448
|
|
11
|
+
*
|
|
12
|
+
* This patch must be loaded before any module that uses PKI.js (including easy-ocsp).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as pkijs from 'pkijs';
|
|
16
|
+
import { webcrypto, X509Certificate } from 'node:crypto';
|
|
17
|
+
|
|
18
|
+
// Ed25519/Ed448 OIDs (these are standardized object identifiers, not IP addresses)
|
|
19
|
+
const ED25519_OID = '1.3.101.112' as const;
|
|
20
|
+
const ED448_OID = '1.3.101.113' as const;
|
|
21
|
+
type EdDSAOID = typeof ED25519_OID | typeof ED448_OID;
|
|
22
|
+
|
|
23
|
+
// Algorithm names as constants
|
|
24
|
+
const ED25519_NAME = 'Ed25519' as const;
|
|
25
|
+
const ED448_NAME = 'Ed448' as const;
|
|
26
|
+
type EdDSAAlgorithmName = typeof ED25519_NAME | typeof ED448_NAME;
|
|
27
|
+
|
|
28
|
+
// Apply patches only once
|
|
29
|
+
let patchesApplied = false;
|
|
30
|
+
|
|
31
|
+
function isEd25519OrEd448(oid: string): oid is EdDSAOID {
|
|
32
|
+
return oid === ED25519_OID || oid === ED448_OID;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isEdDSAAlgorithmName(name: string): name is EdDSAAlgorithmName {
|
|
36
|
+
return name === ED25519_NAME || name === ED448_NAME;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getEdDSAAlgorithmName(oid: string): EdDSAAlgorithmName {
|
|
40
|
+
return oid === ED25519_OID ? ED25519_NAME : ED448_NAME;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function applyEd25519Patch(): void {
|
|
44
|
+
if (patchesApplied) return;
|
|
45
|
+
patchesApplied = true;
|
|
46
|
+
|
|
47
|
+
const CryptoEngine = pkijs.CryptoEngine.prototype;
|
|
48
|
+
const Certificate = pkijs.Certificate.prototype;
|
|
49
|
+
|
|
50
|
+
// Store original methods
|
|
51
|
+
const originals = {
|
|
52
|
+
getHashAlgorithm: CryptoEngine.getHashAlgorithm,
|
|
53
|
+
getAlgorithmByOID: CryptoEngine.getAlgorithmByOID,
|
|
54
|
+
getAlgorithmParameters: CryptoEngine.getAlgorithmParameters,
|
|
55
|
+
verifyWithPublicKey: CryptoEngine.verifyWithPublicKey,
|
|
56
|
+
certificateVerify: Certificate.verify,
|
|
57
|
+
getPublicKey: Certificate.getPublicKey,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// Patch getHashAlgorithm - Ed25519/Ed448 don't use separate hashes
|
|
61
|
+
CryptoEngine.getHashAlgorithm = function (
|
|
62
|
+
...params: Parameters<typeof originals.getHashAlgorithm>
|
|
63
|
+
): ReturnType<typeof originals.getHashAlgorithm> {
|
|
64
|
+
const [signatureAlgorithm] = params;
|
|
65
|
+
if (isEd25519OrEd448(signatureAlgorithm.algorithmId)) {
|
|
66
|
+
// EdDSA signatures have built-in hash functions per RFC 8032:
|
|
67
|
+
// - Ed25519 uses SHA-512 internally (Section 5.1.6)
|
|
68
|
+
// - Ed448 uses SHAKE256 internally (Section 5.2.6)
|
|
69
|
+
// The hash is not a parameter - it's part of the algorithm definition.
|
|
70
|
+
// Returning a placeholder since PKI.js expects a string, but our patched
|
|
71
|
+
// verification methods bypass any code that would use this value.
|
|
72
|
+
return 'UNUSED-EDDSA-BUILTIN-HASH';
|
|
73
|
+
}
|
|
74
|
+
return originals.getHashAlgorithm.call(this, signatureAlgorithm);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Patch getAlgorithmByOID to recognize Ed25519/Ed448
|
|
78
|
+
CryptoEngine.getAlgorithmByOID = function (
|
|
79
|
+
...params: Parameters<typeof originals.getAlgorithmByOID>
|
|
80
|
+
): ReturnType<typeof originals.getAlgorithmByOID> {
|
|
81
|
+
const [oid] = params;
|
|
82
|
+
if (isEd25519OrEd448(oid)) {
|
|
83
|
+
return { name: getEdDSAAlgorithmName(oid) };
|
|
84
|
+
}
|
|
85
|
+
return originals.getAlgorithmByOID.call(this, ...params);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Patch getAlgorithmParameters
|
|
89
|
+
CryptoEngine.getAlgorithmParameters = function (
|
|
90
|
+
...params: Parameters<typeof originals.getAlgorithmParameters>
|
|
91
|
+
): ReturnType<typeof originals.getAlgorithmParameters> {
|
|
92
|
+
const [algorithmName, operation] = params;
|
|
93
|
+
if (isEdDSAAlgorithmName(algorithmName)) {
|
|
94
|
+
return {
|
|
95
|
+
algorithm: { name: algorithmName },
|
|
96
|
+
usages: operation === 'sign' ? ['sign'] : ['verify'],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return originals.getAlgorithmParameters.call(this, ...params);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Patch getPublicKey for Ed25519/Ed448
|
|
103
|
+
Certificate.getPublicKey = async function (
|
|
104
|
+
...params: Parameters<typeof originals.getPublicKey>
|
|
105
|
+
): ReturnType<typeof originals.getPublicKey> {
|
|
106
|
+
const [, cryptoEngine = pkijs.getCrypto(true)] = params;
|
|
107
|
+
const algId = this.subjectPublicKeyInfo.algorithm.algorithmId;
|
|
108
|
+
if (isEd25519OrEd448(algId)) {
|
|
109
|
+
const algorithmName = getEdDSAAlgorithmName(algId);
|
|
110
|
+
return cryptoEngine.importKey('spki', this.subjectPublicKeyInfo.toSchema().toBER(false), algorithmName, true, [
|
|
111
|
+
'verify',
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
return originals.getPublicKey.call(this, ...params);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Patch Certificate.verify for Ed25519/Ed448
|
|
118
|
+
Certificate.verify = async function (
|
|
119
|
+
...params: Parameters<typeof originals.certificateVerify>
|
|
120
|
+
): ReturnType<typeof originals.certificateVerify> {
|
|
121
|
+
const [issuerCertificate] = params;
|
|
122
|
+
if (isEd25519OrEd448(this.signatureAlgorithm.algorithmId)) {
|
|
123
|
+
try {
|
|
124
|
+
// Use Node.js X509Certificate for Ed25519/Ed448 verification
|
|
125
|
+
const certDer = this.toSchema().toBER(false);
|
|
126
|
+
const issuerDer = issuerCertificate.toSchema().toBER(false);
|
|
127
|
+
|
|
128
|
+
const nodeCert = new X509Certificate(Buffer.from(certDer));
|
|
129
|
+
const nodeIssuer = new X509Certificate(Buffer.from(issuerDer));
|
|
130
|
+
|
|
131
|
+
return nodeCert.verify(nodeIssuer.publicKey);
|
|
132
|
+
} catch {
|
|
133
|
+
// Any failure in verification should return false
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return originals.certificateVerify.call(this, ...params);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// Patch verifyWithPublicKey for OCSP response verification
|
|
141
|
+
if (originals.verifyWithPublicKey) {
|
|
142
|
+
CryptoEngine.verifyWithPublicKey = async function (
|
|
143
|
+
...params: Parameters<typeof originals.verifyWithPublicKey>
|
|
144
|
+
): ReturnType<typeof originals.verifyWithPublicKey> {
|
|
145
|
+
const [data, signature, publicKeyInfo] = params;
|
|
146
|
+
const algId = publicKeyInfo.algorithm.algorithmId;
|
|
147
|
+
if (isEd25519OrEd448(algId)) {
|
|
148
|
+
const algorithmName = getEdDSAAlgorithmName(algId);
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
// Get crypto.subtle from available sources
|
|
152
|
+
const cryptoSubtle =
|
|
153
|
+
(this as any).crypto?.subtle || (this as any).subtle || pkijs.getCrypto(true)?.subtle || webcrypto?.subtle;
|
|
154
|
+
|
|
155
|
+
if (!cryptoSubtle) {
|
|
156
|
+
throw new Error('No crypto.subtle available');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Import the public key
|
|
160
|
+
const publicKey = await cryptoSubtle.importKey(
|
|
161
|
+
'spki',
|
|
162
|
+
publicKeyInfo.toSchema().toBER(false),
|
|
163
|
+
algorithmName,
|
|
164
|
+
false,
|
|
165
|
+
['verify']
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
// Handle BIT STRING signature value
|
|
169
|
+
let signatureValue = signature.valueBlock.valueHexView;
|
|
170
|
+
// Check if this is a BIT STRING with unused bits
|
|
171
|
+
if ('unusedBits' in signature.valueBlock && signature.valueBlock.unusedBits > 0) {
|
|
172
|
+
signatureValue = signatureValue.slice(0, signatureValue.length - 1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Verify the signature
|
|
176
|
+
return await cryptoSubtle.verify(algorithmName, publicKey, signatureValue, data);
|
|
177
|
+
} catch {
|
|
178
|
+
// Any failure in verification should return false
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return originals.verifyWithPublicKey.call(this, ...params);
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Apply patch on module load
|
|
188
|
+
applyEd25519Patch();
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared TypeScript interfaces and types for certificate verification
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Context } from '../../resources/ResourceInterface.ts';
|
|
6
|
+
|
|
7
|
+
export type CertificateStatus = 'good' | 'revoked' | 'unknown';
|
|
8
|
+
|
|
9
|
+
export type VerificationMethod = 'ocsp' | 'crl';
|
|
10
|
+
export type VerificationResultMethod = VerificationMethod | 'disabled';
|
|
11
|
+
|
|
12
|
+
export type FailureMode = 'fail-open' | 'fail-closed';
|
|
13
|
+
|
|
14
|
+
export interface PeerCertificate {
|
|
15
|
+
subject?: {
|
|
16
|
+
CN?: string;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
};
|
|
19
|
+
raw?: Buffer;
|
|
20
|
+
issuerCertificate?: PeerCertificate;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface CertificateVerificationResult {
|
|
24
|
+
valid: boolean;
|
|
25
|
+
status: string;
|
|
26
|
+
cached?: boolean;
|
|
27
|
+
error?: string;
|
|
28
|
+
method?: VerificationResultMethod;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CertificateCacheEntry {
|
|
32
|
+
certificate_id: string;
|
|
33
|
+
status: CertificateStatus;
|
|
34
|
+
reason?: string;
|
|
35
|
+
checked_at: number;
|
|
36
|
+
expiresAt: number;
|
|
37
|
+
method: VerificationMethod;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface CRLCacheEntry {
|
|
41
|
+
distribution_point: string;
|
|
42
|
+
issuer_dn: string;
|
|
43
|
+
crl_blob: Buffer;
|
|
44
|
+
this_update: number;
|
|
45
|
+
next_update: number;
|
|
46
|
+
signature_valid: boolean;
|
|
47
|
+
expiresAt: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface RevokedCertificateEntry {
|
|
51
|
+
composite_id: string; // {issuer_hash}:{serial_number}
|
|
52
|
+
serial_number: string;
|
|
53
|
+
issuer_key_id: string;
|
|
54
|
+
revocation_date: number;
|
|
55
|
+
revocation_reason?: string;
|
|
56
|
+
crl_source: string; // Links to CRLCacheEntry.crl_id
|
|
57
|
+
crl_next_update: number;
|
|
58
|
+
expiresAt: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface CertificateChainEntry {
|
|
62
|
+
cert: Buffer;
|
|
63
|
+
issuer?: Buffer;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface OCSPCheckResult {
|
|
67
|
+
status: CertificateStatus;
|
|
68
|
+
reason?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface CRLCheckResult {
|
|
72
|
+
status: CertificateStatus;
|
|
73
|
+
reason?: string;
|
|
74
|
+
source?: string; // CRL distribution point URL
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Configuration interfaces
|
|
78
|
+
export interface OCSPConfig {
|
|
79
|
+
enabled?: boolean;
|
|
80
|
+
timeout?: number;
|
|
81
|
+
cacheTtl?: number;
|
|
82
|
+
errorCacheTtl?: number;
|
|
83
|
+
failureMode?: FailureMode;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface CRLConfig {
|
|
87
|
+
enabled?: boolean;
|
|
88
|
+
timeout?: number;
|
|
89
|
+
cacheTtl?: number;
|
|
90
|
+
failureMode?: FailureMode;
|
|
91
|
+
gracePeriod?: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface CertificateVerificationConfig {
|
|
95
|
+
failureMode?: FailureMode;
|
|
96
|
+
ocsp?: OCSPConfig;
|
|
97
|
+
crl?: CRLConfig;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Context types for certificate verification cache requests
|
|
101
|
+
export interface CertificateVerificationContext extends Context {
|
|
102
|
+
certPem: string;
|
|
103
|
+
issuerPem: string;
|
|
104
|
+
ocspUrls?: string[];
|
|
105
|
+
distributionPoint?: string;
|
|
106
|
+
config?: CertificateVerificationConfig;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface CRLVerificationContext extends Context {
|
|
110
|
+
distributionPoint: string;
|
|
111
|
+
issuerPem: string;
|
|
112
|
+
config?: CRLConfig;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Default configuration values
|
|
116
|
+
export interface VerificationDefaults {
|
|
117
|
+
timeout: number;
|
|
118
|
+
cacheTtl: number;
|
|
119
|
+
failureMode: FailureMode;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface OCSPDefaults extends VerificationDefaults {
|
|
123
|
+
errorCacheTtl: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface CRLDefaults extends VerificationDefaults {
|
|
127
|
+
gracePeriod: number;
|
|
128
|
+
}
|