@oxy.so/core 1.0.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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +221 -0
- package/dist/cjs/.tsbuildinfo +1 -0
- package/dist/cjs/HttpService.js +1270 -0
- package/dist/cjs/OxyServices.base.js +390 -0
- package/dist/cjs/OxyServices.errors.js +95 -0
- package/dist/cjs/OxyServices.js +72 -0
- package/dist/cjs/boot/sessionColdBoot.js +395 -0
- package/dist/cjs/constants/version.js +16 -0
- package/dist/cjs/crypto/aead.js +79 -0
- package/dist/cjs/crypto/ecdh.js +35 -0
- package/dist/cjs/crypto/identityMarker.js +255 -0
- package/dist/cjs/crypto/kdf.js +39 -0
- package/dist/cjs/crypto/keyManager.js +2234 -0
- package/dist/cjs/crypto/polyfill.js +131 -0
- package/dist/cjs/crypto/recoveryPhrase.js +242 -0
- package/dist/cjs/crypto/signatureService.js +273 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
- package/dist/cjs/i18n/accountRoleLabels.js +27 -0
- package/dist/cjs/i18n/index.js +90 -0
- package/dist/cjs/i18n/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
- package/dist/cjs/i18n/trustTierLabels.js +19 -0
- package/dist/cjs/index.js +498 -0
- package/dist/cjs/inference/OxyInferenceClient.js +544 -0
- package/dist/cjs/logger/index.js +149 -0
- package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
- package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
- package/dist/cjs/mixins/OxyServices.appData.js +108 -0
- package/dist/cjs/mixins/OxyServices.assets.js +764 -0
- package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
- package/dist/cjs/mixins/OxyServices.chains.js +73 -0
- package/dist/cjs/mixins/OxyServices.civic.js +611 -0
- package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
- package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
- package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
- package/dist/cjs/mixins/OxyServices.devices.js +116 -0
- package/dist/cjs/mixins/OxyServices.features.js +335 -0
- package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
- package/dist/cjs/mixins/OxyServices.identity.js +461 -0
- package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
- package/dist/cjs/mixins/OxyServices.inference.js +59 -0
- package/dist/cjs/mixins/OxyServices.language.js +125 -0
- package/dist/cjs/mixins/OxyServices.links.js +72 -0
- package/dist/cjs/mixins/OxyServices.location.js +43 -0
- package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
- package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
- package/dist/cjs/mixins/OxyServices.payment.js +158 -0
- package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
- package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
- package/dist/cjs/mixins/OxyServices.security.js +89 -0
- package/dist/cjs/mixins/OxyServices.store.js +266 -0
- package/dist/cjs/mixins/OxyServices.topics.js +137 -0
- package/dist/cjs/mixins/OxyServices.user.js +902 -0
- package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
- package/dist/cjs/mixins/index.js +135 -0
- package/dist/cjs/mixins/mixinHelpers.js +53 -0
- package/dist/cjs/models/Topic.js +16 -0
- package/dist/cjs/models/interfaces.js +20 -0
- package/dist/cjs/models/session.js +2 -0
- package/dist/cjs/server/auth.js +167 -0
- package/dist/cjs/server/capabilityTicket.js +192 -0
- package/dist/cjs/server/cors.js +225 -0
- package/dist/cjs/server/index.js +97 -0
- package/dist/cjs/server/rateLimit.js +207 -0
- package/dist/cjs/server/safeFetch.js +458 -0
- package/dist/cjs/server/securityHeaders.js +377 -0
- package/dist/cjs/server/userInvalidation.js +156 -0
- package/dist/cjs/server/verifySecret.js +50 -0
- package/dist/cjs/session/SessionClient.js +865 -0
- package/dist/cjs/session/accountDelegationAccess.js +48 -0
- package/dist/cjs/session/accountDialogController.js +1131 -0
- package/dist/cjs/session/accountSwitchTargets.js +81 -0
- package/dist/cjs/session/authStateStore.js +404 -0
- package/dist/cjs/session/createSessionClient.js +32 -0
- package/dist/cjs/session/deviceDirectory.js +143 -0
- package/dist/cjs/session/deviceSwitcherRows.js +76 -0
- package/dist/cjs/session/identityPin.js +256 -0
- package/dist/cjs/session/identitySession.js +135 -0
- package/dist/cjs/session/projectSessionState.js +121 -0
- package/dist/cjs/session/refresh.js +398 -0
- package/dist/cjs/session/sessionClientHost.js +34 -0
- package/dist/cjs/session/sharedDeviceCredential.js +247 -0
- package/dist/cjs/session/socketLoader.js +55 -0
- package/dist/cjs/shared/utils/colorUtils.js +153 -0
- package/dist/cjs/shared/utils/errorUtils.js +183 -0
- package/dist/cjs/shared/utils/index.js +49 -0
- package/dist/cjs/shared/utils/networkUtils.js +183 -0
- package/dist/cjs/shared/utils/themeUtils.js +106 -0
- package/dist/cjs/utils/accountCacheSweep.js +80 -0
- package/dist/cjs/utils/accountUtils.js +140 -0
- package/dist/cjs/utils/activityId.js +6 -0
- package/dist/cjs/utils/apiUtils.js +91 -0
- package/dist/cjs/utils/asyncUtils.js +222 -0
- package/dist/cjs/utils/authHelpers.js +120 -0
- package/dist/cjs/utils/authWebUrl.js +19 -0
- package/dist/cjs/utils/avatarUtils.js +29 -0
- package/dist/cjs/utils/cache.js +235 -0
- package/dist/cjs/utils/cacheKey.js +85 -0
- package/dist/cjs/utils/coldBoot.js +122 -0
- package/dist/cjs/utils/commonsApproval.js +31 -0
- package/dist/cjs/utils/commonsDelivery.js +59 -0
- package/dist/cjs/utils/deviceManager.js +174 -0
- package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
- package/dist/cjs/utils/edgeRegion.js +6 -0
- package/dist/cjs/utils/errorUtils.js +243 -0
- package/dist/cjs/utils/identityCacheSweep.js +97 -0
- package/dist/cjs/utils/languageUtils.js +224 -0
- package/dist/cjs/utils/oauthPkce.js +311 -0
- package/dist/cjs/utils/officialOrigins.js +64 -0
- package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
- package/dist/cjs/utils/platform.js +119 -0
- package/dist/cjs/utils/profileLinks.js +63 -0
- package/dist/cjs/utils/redactUrl.js +29 -0
- package/dist/cjs/utils/registrableApex.js +45 -0
- package/dist/cjs/utils/requestUtils.js +209 -0
- package/dist/cjs/utils/sessionUtils.js +181 -0
- package/dist/cjs/utils/textNormalization.js +158 -0
- package/dist/cjs/utils/userHandle.js +37 -0
- package/dist/cjs/utils/userIdentity.js +50 -0
- package/dist/cjs/utils/validationUtils.js +370 -0
- package/dist/cjs/utils/webauthnOrigin.js +51 -0
- package/dist/esm/.tsbuildinfo +1 -0
- package/dist/esm/HttpService.js +1266 -0
- package/dist/esm/OxyServices.base.js +386 -0
- package/dist/esm/OxyServices.errors.js +88 -0
- package/dist/esm/OxyServices.js +66 -0
- package/dist/esm/boot/sessionColdBoot.js +392 -0
- package/dist/esm/constants/version.js +13 -0
- package/dist/esm/crypto/aead.js +74 -0
- package/dist/esm/crypto/ecdh.js +32 -0
- package/dist/esm/crypto/identityMarker.js +248 -0
- package/dist/esm/crypto/kdf.js +36 -0
- package/dist/esm/crypto/keyManager.js +2227 -0
- package/dist/esm/crypto/polyfill.js +129 -0
- package/dist/esm/crypto/recoveryPhrase.js +238 -0
- package/dist/esm/crypto/signatureService.js +269 -0
- package/dist/esm/i18n/accountCategoryLabels.js +37 -0
- package/dist/esm/i18n/accountRoleLabels.js +20 -0
- package/dist/esm/i18n/index.js +83 -0
- package/dist/esm/i18n/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
- package/dist/esm/i18n/trustTierLabels.js +12 -0
- package/dist/esm/index.js +254 -0
- package/dist/esm/inference/OxyInferenceClient.js +538 -0
- package/dist/esm/logger/index.js +140 -0
- package/dist/esm/mixins/OxyServices.accounts.js +543 -0
- package/dist/esm/mixins/OxyServices.analytics.js +46 -0
- package/dist/esm/mixins/OxyServices.appData.js +103 -0
- package/dist/esm/mixins/OxyServices.assets.js +761 -0
- package/dist/esm/mixins/OxyServices.auth.js +1247 -0
- package/dist/esm/mixins/OxyServices.chains.js +70 -0
- package/dist/esm/mixins/OxyServices.civic.js +605 -0
- package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
- package/dist/esm/mixins/OxyServices.contacts.js +47 -0
- package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
- package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
- package/dist/esm/mixins/OxyServices.devices.js +113 -0
- package/dist/esm/mixins/OxyServices.features.js +332 -0
- package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
- package/dist/esm/mixins/OxyServices.identity.js +457 -0
- package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
- package/dist/esm/mixins/OxyServices.inference.js +56 -0
- package/dist/esm/mixins/OxyServices.language.js +122 -0
- package/dist/esm/mixins/OxyServices.links.js +69 -0
- package/dist/esm/mixins/OxyServices.location.js +40 -0
- package/dist/esm/mixins/OxyServices.nodes.js +172 -0
- package/dist/esm/mixins/OxyServices.notifications.js +60 -0
- package/dist/esm/mixins/OxyServices.payment.js +155 -0
- package/dist/esm/mixins/OxyServices.privacy.js +196 -0
- package/dist/esm/mixins/OxyServices.reputation.js +286 -0
- package/dist/esm/mixins/OxyServices.security.js +86 -0
- package/dist/esm/mixins/OxyServices.store.js +263 -0
- package/dist/esm/mixins/OxyServices.topics.js +134 -0
- package/dist/esm/mixins/OxyServices.user.js +899 -0
- package/dist/esm/mixins/OxyServices.utility.js +1095 -0
- package/dist/esm/mixins/index.js +132 -0
- package/dist/esm/mixins/mixinHelpers.js +48 -0
- package/dist/esm/models/Topic.js +13 -0
- package/dist/esm/models/interfaces.js +17 -0
- package/dist/esm/models/session.js +1 -0
- package/dist/esm/server/auth.js +154 -0
- package/dist/esm/server/capabilityTicket.js +183 -0
- package/dist/esm/server/cors.js +220 -0
- package/dist/esm/server/index.js +47 -0
- package/dist/esm/server/rateLimit.js +201 -0
- package/dist/esm/server/safeFetch.js +447 -0
- package/dist/esm/server/securityHeaders.js +364 -0
- package/dist/esm/server/userInvalidation.js +152 -0
- package/dist/esm/server/verifySecret.js +47 -0
- package/dist/esm/session/SessionClient.js +861 -0
- package/dist/esm/session/accountDelegationAccess.js +45 -0
- package/dist/esm/session/accountDialogController.js +1126 -0
- package/dist/esm/session/accountSwitchTargets.js +77 -0
- package/dist/esm/session/authStateStore.js +398 -0
- package/dist/esm/session/createSessionClient.js +29 -0
- package/dist/esm/session/deviceDirectory.js +135 -0
- package/dist/esm/session/deviceSwitcherRows.js +72 -0
- package/dist/esm/session/identityPin.js +249 -0
- package/dist/esm/session/identitySession.js +131 -0
- package/dist/esm/session/projectSessionState.js +114 -0
- package/dist/esm/session/refresh.js +390 -0
- package/dist/esm/session/sessionClientHost.js +31 -0
- package/dist/esm/session/sharedDeviceCredential.js +239 -0
- package/dist/esm/session/socketLoader.js +19 -0
- package/dist/esm/shared/utils/colorUtils.js +143 -0
- package/dist/esm/shared/utils/errorUtils.js +170 -0
- package/dist/esm/shared/utils/index.js +15 -0
- package/dist/esm/shared/utils/networkUtils.js +173 -0
- package/dist/esm/shared/utils/themeUtils.js +98 -0
- package/dist/esm/utils/accountCacheSweep.js +75 -0
- package/dist/esm/utils/accountUtils.js +131 -0
- package/dist/esm/utils/activityId.js +2 -0
- package/dist/esm/utils/apiUtils.js +84 -0
- package/dist/esm/utils/asyncUtils.js +207 -0
- package/dist/esm/utils/authHelpers.js +111 -0
- package/dist/esm/utils/authWebUrl.js +16 -0
- package/dist/esm/utils/avatarUtils.js +26 -0
- package/dist/esm/utils/cache.js +227 -0
- package/dist/esm/utils/cacheKey.js +80 -0
- package/dist/esm/utils/coldBoot.js +119 -0
- package/dist/esm/utils/commonsApproval.js +27 -0
- package/dist/esm/utils/commonsDelivery.js +54 -0
- package/dist/esm/utils/deviceManager.js +170 -0
- package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
- package/dist/esm/utils/edgeRegion.js +2 -0
- package/dist/esm/utils/errorUtils.js +232 -0
- package/dist/esm/utils/identityCacheSweep.js +92 -0
- package/dist/esm/utils/languageUtils.js +212 -0
- package/dist/esm/utils/oauthPkce.js +297 -0
- package/dist/esm/utils/officialOrigins.js +59 -0
- package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
- package/dist/esm/utils/platform.js +110 -0
- package/dist/esm/utils/profileLinks.js +60 -0
- package/dist/esm/utils/redactUrl.js +26 -0
- package/dist/esm/utils/registrableApex.js +42 -0
- package/dist/esm/utils/requestUtils.js +203 -0
- package/dist/esm/utils/sessionUtils.js +171 -0
- package/dist/esm/utils/textNormalization.js +154 -0
- package/dist/esm/utils/userHandle.js +33 -0
- package/dist/esm/utils/userIdentity.js +45 -0
- package/dist/esm/utils/validationUtils.js +350 -0
- package/dist/esm/utils/webauthnOrigin.js +48 -0
- package/dist/types/.tsbuildinfo +1 -0
- package/dist/types/HttpService.d.ts +413 -0
- package/dist/types/OxyServices.base.d.ts +187 -0
- package/dist/types/OxyServices.d.ts +139 -0
- package/dist/types/OxyServices.errors.d.ts +84 -0
- package/dist/types/boot/sessionColdBoot.d.ts +140 -0
- package/dist/types/constants/version.d.ts +13 -0
- package/dist/types/crypto/aead.d.ts +56 -0
- package/dist/types/crypto/ecdh.d.ts +29 -0
- package/dist/types/crypto/identityMarker.d.ts +94 -0
- package/dist/types/crypto/kdf.d.ts +25 -0
- package/dist/types/crypto/keyManager.d.ts +582 -0
- package/dist/types/crypto/polyfill.d.ts +25 -0
- package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
- package/dist/types/crypto/signatureService.d.ts +136 -0
- package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
- package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
- package/dist/types/i18n/index.d.ts +3 -0
- package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
- package/dist/types/i18n/trustTierLabels.d.ts +9 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
- package/dist/types/logger/index.d.ts +104 -0
- package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
- package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
- package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
- package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
- package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
- package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
- package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
- package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
- package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
- package/dist/types/mixins/OxyServices.features.d.ts +250 -0
- package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
- package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
- package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
- package/dist/types/mixins/OxyServices.language.d.ts +87 -0
- package/dist/types/mixins/OxyServices.links.d.ts +104 -0
- package/dist/types/mixins/OxyServices.location.d.ts +70 -0
- package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
- package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
- package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
- package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
- package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
- package/dist/types/mixins/OxyServices.security.d.ts +84 -0
- package/dist/types/mixins/OxyServices.store.d.ts +334 -0
- package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
- package/dist/types/mixins/OxyServices.user.d.ts +558 -0
- package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
- package/dist/types/mixins/index.d.ts +87 -0
- package/dist/types/mixins/mixinHelpers.d.ts +31 -0
- package/dist/types/models/Topic.d.ts +42 -0
- package/dist/types/models/interfaces.d.ts +675 -0
- package/dist/types/models/session.d.ts +51 -0
- package/dist/types/server/auth.d.ts +130 -0
- package/dist/types/server/capabilityTicket.d.ts +41 -0
- package/dist/types/server/cors.d.ts +98 -0
- package/dist/types/server/index.d.ts +35 -0
- package/dist/types/server/rateLimit.d.ts +40 -0
- package/dist/types/server/safeFetch.d.ts +137 -0
- package/dist/types/server/securityHeaders.d.ts +221 -0
- package/dist/types/server/userInvalidation.d.ts +114 -0
- package/dist/types/server/verifySecret.d.ts +29 -0
- package/dist/types/session/SessionClient.d.ts +418 -0
- package/dist/types/session/accountDelegationAccess.d.ts +40 -0
- package/dist/types/session/accountDialogController.d.ts +648 -0
- package/dist/types/session/accountSwitchTargets.d.ts +70 -0
- package/dist/types/session/authStateStore.d.ts +153 -0
- package/dist/types/session/createSessionClient.d.ts +30 -0
- package/dist/types/session/deviceDirectory.d.ts +182 -0
- package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
- package/dist/types/session/identityPin.d.ts +87 -0
- package/dist/types/session/identitySession.d.ts +105 -0
- package/dist/types/session/projectSessionState.d.ts +74 -0
- package/dist/types/session/refresh.d.ts +179 -0
- package/dist/types/session/sessionClientHost.d.ts +18 -0
- package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
- package/dist/types/session/socketLoader.d.ts +11 -0
- package/dist/types/shared/utils/colorUtils.d.ts +104 -0
- package/dist/types/shared/utils/errorUtils.d.ts +97 -0
- package/dist/types/shared/utils/index.d.ts +13 -0
- package/dist/types/shared/utils/networkUtils.d.ts +139 -0
- package/dist/types/shared/utils/themeUtils.d.ts +90 -0
- package/dist/types/utils/accountCacheSweep.d.ts +75 -0
- package/dist/types/utils/accountUtils.d.ts +100 -0
- package/dist/types/utils/activityId.d.ts +2 -0
- package/dist/types/utils/apiUtils.d.ts +95 -0
- package/dist/types/utils/asyncUtils.d.ts +62 -0
- package/dist/types/utils/authHelpers.d.ts +58 -0
- package/dist/types/utils/authWebUrl.d.ts +16 -0
- package/dist/types/utils/avatarUtils.d.ts +16 -0
- package/dist/types/utils/cache.d.ts +130 -0
- package/dist/types/utils/cacheKey.d.ts +66 -0
- package/dist/types/utils/coldBoot.d.ts +131 -0
- package/dist/types/utils/commonsApproval.d.ts +13 -0
- package/dist/types/utils/commonsDelivery.d.ts +105 -0
- package/dist/types/utils/deviceManager.d.ts +65 -0
- package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
- package/dist/types/utils/edgeRegion.d.ts +2 -0
- package/dist/types/utils/errorUtils.d.ts +125 -0
- package/dist/types/utils/identityCacheSweep.d.ts +80 -0
- package/dist/types/utils/languageUtils.d.ts +100 -0
- package/dist/types/utils/oauthPkce.d.ts +157 -0
- package/dist/types/utils/officialOrigins.d.ts +13 -0
- package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
- package/dist/types/utils/platform.d.ts +49 -0
- package/dist/types/utils/profileLinks.d.ts +44 -0
- package/dist/types/utils/redactUrl.d.ts +17 -0
- package/dist/types/utils/registrableApex.d.ts +27 -0
- package/dist/types/utils/requestUtils.d.ts +123 -0
- package/dist/types/utils/sessionUtils.d.ts +54 -0
- package/dist/types/utils/textNormalization.d.ts +103 -0
- package/dist/types/utils/userHandle.d.ts +26 -0
- package/dist/types/utils/userIdentity.d.ts +21 -0
- package/dist/types/utils/validationUtils.d.ts +268 -0
- package/dist/types/utils/webauthnOrigin.d.ts +32 -0
- package/package.json +168 -0
- package/src/HttpService.ts +1553 -0
- package/src/OxyServices.base.ts +478 -0
- package/src/OxyServices.errors.ts +122 -0
- package/src/OxyServices.ts +172 -0
- package/src/__tests__/authSocket.test.ts +96 -0
- package/src/__tests__/httpServiceActivityId.test.ts +49 -0
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
- package/src/__tests__/httpServiceCache.test.ts +318 -0
- package/src/__tests__/httpServiceCsrf.test.ts +235 -0
- package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
- package/src/__tests__/inSessionRefresh.test.ts +260 -0
- package/src/__tests__/linkedClient.test.ts +370 -0
- package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
- package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
- package/src/__tests__/userIdentity.test.ts +143 -0
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
- package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
- package/src/boot/sessionColdBoot.ts +529 -0
- package/src/constants/version.ts +15 -0
- package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
- package/src/crypto/__tests__/identityMocks.ts +125 -0
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
- package/src/crypto/__tests__/keyManager.test.ts +329 -0
- package/src/crypto/__tests__/polyfill.test.ts +109 -0
- package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
- package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
- package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
- package/src/crypto/__tests__/signedRecord.test.ts +230 -0
- package/src/crypto/aead.ts +97 -0
- package/src/crypto/ecdh.ts +37 -0
- package/src/crypto/identityMarker.ts +291 -0
- package/src/crypto/kdf.ts +43 -0
- package/src/crypto/keyManager.ts +2607 -0
- package/src/crypto/polyfill.ts +143 -0
- package/src/crypto/recoveryPhrase.ts +337 -0
- package/src/crypto/signatureService.ts +350 -0
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
- package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
- package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
- package/src/i18n/accountCategoryLabels.ts +44 -0
- package/src/i18n/accountRoleLabels.ts +26 -0
- package/src/i18n/index.ts +88 -0
- package/src/i18n/locales/ar-SA.json +282 -0
- package/src/i18n/locales/ca-ES.json +282 -0
- package/src/i18n/locales/de-DE.json +282 -0
- package/src/i18n/locales/en-US.json +2161 -0
- package/src/i18n/locales/es-ES.json +2161 -0
- package/src/i18n/locales/fr-FR.json +282 -0
- package/src/i18n/locales/it-IT.json +282 -0
- package/src/i18n/locales/ja-JP.json +282 -0
- package/src/i18n/locales/ko-KR.json +282 -0
- package/src/i18n/locales/pt-PT.json +282 -0
- package/src/i18n/locales/zh-CN.json +282 -0
- package/src/i18n/reputationCategoryLabels.ts +20 -0
- package/src/i18n/trustTierLabels.ts +18 -0
- package/src/index.ts +881 -0
- package/src/inference/OxyInferenceClient.ts +888 -0
- package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
- package/src/logger/__tests__/logger.test.ts +207 -0
- package/src/logger/index.ts +217 -0
- package/src/mixins/OxyServices.accounts.ts +1330 -0
- package/src/mixins/OxyServices.analytics.ts +53 -0
- package/src/mixins/OxyServices.appData.ts +158 -0
- package/src/mixins/OxyServices.assets.ts +861 -0
- package/src/mixins/OxyServices.auth.ts +1858 -0
- package/src/mixins/OxyServices.chains.ts +134 -0
- package/src/mixins/OxyServices.civic.ts +945 -0
- package/src/mixins/OxyServices.connectedApps.ts +174 -0
- package/src/mixins/OxyServices.contacts.ts +73 -0
- package/src/mixins/OxyServices.deviceBoot.ts +210 -0
- package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
- package/src/mixins/OxyServices.devices.ts +120 -0
- package/src/mixins/OxyServices.features.ts +454 -0
- package/src/mixins/OxyServices.followGraph.ts +293 -0
- package/src/mixins/OxyServices.identity.ts +705 -0
- package/src/mixins/OxyServices.identityBackup.ts +250 -0
- package/src/mixins/OxyServices.inference.ts +57 -0
- package/src/mixins/OxyServices.language.ts +144 -0
- package/src/mixins/OxyServices.links.ts +107 -0
- package/src/mixins/OxyServices.location.ts +46 -0
- package/src/mixins/OxyServices.nodes.ts +337 -0
- package/src/mixins/OxyServices.notifications.ts +142 -0
- package/src/mixins/OxyServices.payment.ts +163 -0
- package/src/mixins/OxyServices.privacy.ts +219 -0
- package/src/mixins/OxyServices.reputation.ts +436 -0
- package/src/mixins/OxyServices.security.ts +110 -0
- package/src/mixins/OxyServices.store.ts +585 -0
- package/src/mixins/OxyServices.topics.ts +169 -0
- package/src/mixins/OxyServices.user.ts +1137 -0
- package/src/mixins/OxyServices.utility.ts +1370 -0
- package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
- package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
- package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
- package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
- package/src/mixins/__tests__/accounts.test.ts +727 -0
- package/src/mixins/__tests__/appData.test.ts +203 -0
- package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
- package/src/mixins/__tests__/assetUpload.test.ts +191 -0
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
- package/src/mixins/__tests__/chains.test.ts +113 -0
- package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
- package/src/mixins/__tests__/connectedApps.test.ts +123 -0
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
- package/src/mixins/__tests__/followGraph.test.ts +147 -0
- package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
- package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
- package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
- package/src/mixins/__tests__/identityBackup.test.ts +315 -0
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
- package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
- package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
- package/src/mixins/__tests__/reputation.test.ts +522 -0
- package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
- package/src/mixins/__tests__/store.test.ts +304 -0
- package/src/mixins/__tests__/topics.test.ts +156 -0
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
- package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
- package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
- package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
- package/src/mixins/index.ts +201 -0
- package/src/mixins/mixinHelpers.ts +69 -0
- package/src/models/Topic.ts +46 -0
- package/src/models/interfaces.ts +786 -0
- package/src/models/session.ts +55 -0
- package/src/server/__tests__/auth.test.ts +78 -0
- package/src/server/__tests__/capabilityTicket.test.ts +111 -0
- package/src/server/__tests__/cors.socket.test.ts +225 -0
- package/src/server/__tests__/cors.test.ts +158 -0
- package/src/server/__tests__/rateLimit.test.ts +257 -0
- package/src/server/__tests__/safeFetch.test.ts +232 -0
- package/src/server/__tests__/securityHeaders.test.ts +348 -0
- package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
- package/src/server/__tests__/userInvalidation.test.ts +203 -0
- package/src/server/__tests__/verifySecret.test.ts +40 -0
- package/src/server/auth.ts +271 -0
- package/src/server/capabilityTicket.ts +258 -0
- package/src/server/cors.ts +277 -0
- package/src/server/index.ts +136 -0
- package/src/server/rateLimit.ts +313 -0
- package/src/server/safeFetch.ts +586 -0
- package/src/server/securityHeaders.ts +467 -0
- package/src/server/userInvalidation.ts +199 -0
- package/src/server/verifySecret.ts +52 -0
- package/src/session/SessionClient.ts +1001 -0
- package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
- package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
- package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
- package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
- package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
- package/src/session/__tests__/SessionClient.state.test.ts +78 -0
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
- package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
- package/src/session/__tests__/accountDialogController.test.ts +1969 -0
- package/src/session/__tests__/accountDialogShape.test.ts +118 -0
- package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
- package/src/session/__tests__/authStateStore.test.ts +451 -0
- package/src/session/__tests__/deviceDirectory.test.ts +422 -0
- package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
- package/src/session/__tests__/identityPin.test.ts +131 -0
- package/src/session/__tests__/identitySession.test.ts +194 -0
- package/src/session/__tests__/projectSessionState.test.ts +105 -0
- package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
- package/src/session/__tests__/refresh.test.ts +443 -0
- package/src/session/__tests__/sessionIntegration.test.ts +209 -0
- package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
- package/src/session/accountDelegationAccess.ts +72 -0
- package/src/session/accountDialogController.ts +1494 -0
- package/src/session/accountSwitchTargets.ts +93 -0
- package/src/session/authStateStore.ts +502 -0
- package/src/session/createSessionClient.ts +39 -0
- package/src/session/deviceDirectory.ts +269 -0
- package/src/session/deviceSwitcherRows.ts +145 -0
- package/src/session/identityPin.ts +310 -0
- package/src/session/identitySession.ts +206 -0
- package/src/session/projectSessionState.ts +137 -0
- package/src/session/refresh.ts +517 -0
- package/src/session/sessionClientHost.ts +39 -0
- package/src/session/sharedDeviceCredential.ts +349 -0
- package/src/session/socketLoader.ts +30 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/types/buffer.d.ts +97 -0
- package/src/types/expo-crypto.d.ts +16 -0
- package/src/types/expo-secure-store.d.ts +17 -0
- package/src/utils/__tests__/accountUtils.test.ts +151 -0
- package/src/utils/__tests__/activityId.test.ts +45 -0
- package/src/utils/__tests__/asyncUtils.test.ts +187 -0
- package/src/utils/__tests__/authWebUrl.test.ts +15 -0
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/coldBoot.test.ts +496 -0
- package/src/utils/__tests__/commonsApproval.test.ts +60 -0
- package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
- package/src/utils/__tests__/languageUtils.test.ts +219 -0
- package/src/utils/__tests__/oauthPkce.test.ts +272 -0
- package/src/utils/__tests__/officialOrigins.test.ts +31 -0
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
- package/src/utils/__tests__/profileLinks.test.ts +180 -0
- package/src/utils/__tests__/redactUrl.test.ts +33 -0
- package/src/utils/__tests__/registrableApex.test.ts +62 -0
- package/src/utils/__tests__/textNormalization.test.ts +205 -0
- package/src/utils/__tests__/validationUtils.test.ts +703 -0
- package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
- package/src/utils/accountCacheSweep.ts +93 -0
- package/src/utils/accountUtils.ts +194 -0
- package/src/utils/activityId.ts +2 -0
- package/src/utils/apiUtils.ts +137 -0
- package/src/utils/asyncUtils.ts +280 -0
- package/src/utils/authHelpers.ts +148 -0
- package/src/utils/authWebUrl.ts +17 -0
- package/src/utils/avatarUtils.ts +39 -0
- package/src/utils/cache.ts +273 -0
- package/src/utils/cacheKey.ts +93 -0
- package/src/utils/coldBoot.ts +218 -0
- package/src/utils/commonsApproval.ts +39 -0
- package/src/utils/commonsDelivery.ts +132 -0
- package/src/utils/deviceManager.ts +203 -0
- package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
- package/src/utils/edgeRegion.ts +2 -0
- package/src/utils/errorUtils.ts +352 -0
- package/src/utils/identityCacheSweep.ts +104 -0
- package/src/utils/languageUtils.ts +256 -0
- package/src/utils/oauthPkce.ts +392 -0
- package/src/utils/officialOrigins.ts +62 -0
- package/src/utils/oxyServiceEnvironment.ts +17 -0
- package/src/utils/platform.ts +139 -0
- package/src/utils/profileLinks.ts +91 -0
- package/src/utils/redactUrl.ts +28 -0
- package/src/utils/registrableApex.ts +41 -0
- package/src/utils/requestUtils.ts +237 -0
- package/src/utils/sessionUtils.ts +206 -0
- package/src/utils/textNormalization.ts +162 -0
- package/src/utils/userHandle.ts +49 -0
- package/src/utils/userIdentity.ts +60 -0
- package/src/utils/validationUtils.ts +390 -0
- package/src/utils/webauthnOrigin.ts +52 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `signChallengeWithSharedKey` tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies the shared-key challenge signer mirrors `signChallenge` exactly —
|
|
5
|
+
* same `auth:${publicKey}:${challenge}:${timestamp}` message format so the
|
|
6
|
+
* server verification path is unchanged — but sources the SHARED key from
|
|
7
|
+
* `KeyManager` (not the primary device key). We mock the shared key access with
|
|
8
|
+
* a real secp256k1 keypair so signing/verification is genuine.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { generateSecp256k1KeyPair } from '@oxy.so/protocol/secp256k1';
|
|
12
|
+
import { verifySignature } from '@oxy.so/protocol';
|
|
13
|
+
import { KeyManager } from '../keyManager';
|
|
14
|
+
import { SignatureService } from '../signatureService';
|
|
15
|
+
|
|
16
|
+
describe('SignatureService.signChallengeWithSharedKey', () => {
|
|
17
|
+
const sharedKeyPair = generateSecp256k1KeyPair();
|
|
18
|
+
const sharedPublicKey = sharedKeyPair.publicKey;
|
|
19
|
+
const sharedPrivateKey = sharedKeyPair.privateKey;
|
|
20
|
+
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
jest.restoreAllMocks();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('signs with the shared key and uses the unchanged message format', async () => {
|
|
26
|
+
jest.spyOn(KeyManager, 'getSharedPublicKey').mockResolvedValue(sharedPublicKey);
|
|
27
|
+
jest.spyOn(KeyManager, 'getSharedPrivateKey').mockResolvedValue(sharedPrivateKey);
|
|
28
|
+
// Guard: it must NOT fall back to the primary device key.
|
|
29
|
+
const primarySpy = jest.spyOn(KeyManager, 'getPublicKey');
|
|
30
|
+
|
|
31
|
+
const result = await SignatureService.signChallengeWithSharedKey('chal-123');
|
|
32
|
+
|
|
33
|
+
expect(result.publicKey).toBe(sharedPublicKey);
|
|
34
|
+
expect(typeof result.challenge).toBe('string'); // the signature
|
|
35
|
+
expect(typeof result.timestamp).toBe('number');
|
|
36
|
+
expect(primarySpy).not.toHaveBeenCalled();
|
|
37
|
+
|
|
38
|
+
// The signature verifies against the SAME message format `signChallenge`
|
|
39
|
+
// uses, proving the format is unchanged and the shared key signed it.
|
|
40
|
+
const message = `auth:${sharedPublicKey}:chal-123:${result.timestamp}`;
|
|
41
|
+
await expect(
|
|
42
|
+
verifySignature(message, result.challenge, sharedPublicKey),
|
|
43
|
+
).resolves.toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('throws when no shared identity exists', async () => {
|
|
47
|
+
jest.spyOn(KeyManager, 'getSharedPublicKey').mockResolvedValue(null);
|
|
48
|
+
jest.spyOn(KeyManager, 'getSharedPrivateKey').mockResolvedValue(null);
|
|
49
|
+
|
|
50
|
+
await expect(
|
|
51
|
+
SignatureService.signChallengeWithSharedKey('chal-123'),
|
|
52
|
+
).rejects.toThrow(/No shared identity/);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('throws when the shared private key is missing even if the public key is present', async () => {
|
|
56
|
+
jest.spyOn(KeyManager, 'getSharedPublicKey').mockResolvedValue(sharedPublicKey);
|
|
57
|
+
jest.spyOn(KeyManager, 'getSharedPrivateKey').mockResolvedValue(null);
|
|
58
|
+
|
|
59
|
+
await expect(
|
|
60
|
+
SignatureService.signChallengeWithSharedKey('chal-123'),
|
|
61
|
+
).rejects.toThrow(/No shared identity/);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signed-record envelope tests — the DEVICE-key-bound path in `@oxy.so/core`.
|
|
3
|
+
*
|
|
4
|
+
* `SignatureService.signRecord` / `signRecordV2` read the device key from
|
|
5
|
+
* `KeyManager` and delegate the cryptography to `@oxy.so/protocol`'s
|
|
6
|
+
* `signEnvelope`. These tests prove the orchestration: an envelope built from a
|
|
7
|
+
* stored key round-trips through the protocol's `verifyEnvelopeSignature`, and
|
|
8
|
+
* tampering breaks it. The pure canonical-bytes / `computeRecordId` guards live
|
|
9
|
+
* in `@oxy.so/protocol`'s own suite.
|
|
10
|
+
*
|
|
11
|
+
* We mock `KeyManager.getPrivateKey` with a real secp256k1 private key,
|
|
12
|
+
* so the signing/verification is genuine cryptography (not a stub).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { generateSecp256k1KeyPair } from '@oxy.so/protocol/secp256k1';
|
|
16
|
+
import type { SignedRecordEnvelope } from '@oxy.so/contracts';
|
|
17
|
+
import {
|
|
18
|
+
canonicalize,
|
|
19
|
+
signedRecordSigningInput,
|
|
20
|
+
verifySignature,
|
|
21
|
+
verifyEnvelopeSignature,
|
|
22
|
+
} from '@oxy.so/protocol';
|
|
23
|
+
import { KeyManager } from '../keyManager';
|
|
24
|
+
import { SignatureService } from '../signatureService';
|
|
25
|
+
|
|
26
|
+
describe('SignatureService.signRecord / verifyEnvelopeSignature', () => {
|
|
27
|
+
const keyPair = generateSecp256k1KeyPair();
|
|
28
|
+
const publicKey = keyPair.publicKey;
|
|
29
|
+
const privateKey = keyPair.privateKey.padStart(64, '0');
|
|
30
|
+
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
jest.spyOn(KeyManager, 'getPrivateKey').mockResolvedValue(privateKey);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
jest.restoreAllMocks();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('builds a well-formed self-issued envelope', async () => {
|
|
40
|
+
const subject = 'did:web:oxy.so:u:abc123';
|
|
41
|
+
const record = { displayName: 'Nate', bio: 'builder' };
|
|
42
|
+
|
|
43
|
+
const envelope = await SignatureService.signRecord('profile', subject, record);
|
|
44
|
+
|
|
45
|
+
expect(envelope.version).toBe(1);
|
|
46
|
+
expect(envelope.type).toBe('profile');
|
|
47
|
+
expect(envelope.subject).toBe(subject);
|
|
48
|
+
expect(envelope.issuer).toBe(subject); // self-issued
|
|
49
|
+
expect(envelope.record).toEqual(record);
|
|
50
|
+
expect(envelope.publicKey).toBe(publicKey); // derived from the stored private key
|
|
51
|
+
expect(envelope.alg).toBe('ES256K-DER-SHA256');
|
|
52
|
+
expect(typeof envelope.signature).toBe('string');
|
|
53
|
+
expect(envelope.signature.length).toBeGreaterThan(0);
|
|
54
|
+
expect(typeof envelope.issuedAt).toBe('number');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('round-trips: a freshly signed record verifies', async () => {
|
|
58
|
+
const envelope = await SignatureService.signRecord('identity', 'did:web:oxy.so:u:u1', {
|
|
59
|
+
handle: '@nate',
|
|
60
|
+
nested: { a: 1, b: [2, 3] },
|
|
61
|
+
});
|
|
62
|
+
await expect(verifyEnvelopeSignature(envelope)).resolves.toBe(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('signs the canonical JSON of every field except publicKey + signature', async () => {
|
|
66
|
+
const subject = 'did:web:oxy.so:u:u2';
|
|
67
|
+
const record = { z: 1, a: 2 };
|
|
68
|
+
const envelope = await SignatureService.signRecord('profile', subject, record);
|
|
69
|
+
|
|
70
|
+
const expectedInput = canonicalize({
|
|
71
|
+
version: envelope.version,
|
|
72
|
+
type: envelope.type,
|
|
73
|
+
subject: envelope.subject,
|
|
74
|
+
issuer: envelope.issuer,
|
|
75
|
+
record: envelope.record,
|
|
76
|
+
issuedAt: envelope.issuedAt,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// The helper reproduces exactly that input from the envelope.
|
|
80
|
+
expect(signedRecordSigningInput(envelope)).toBe(expectedInput);
|
|
81
|
+
// And it omits publicKey/signature.
|
|
82
|
+
expect(expectedInput).not.toContain(envelope.publicKey);
|
|
83
|
+
expect(expectedInput).not.toContain(envelope.signature);
|
|
84
|
+
|
|
85
|
+
// The signature verifies against that exact input + the embedded key.
|
|
86
|
+
await expect(
|
|
87
|
+
verifySignature(expectedInput, envelope.signature, envelope.publicKey),
|
|
88
|
+
).resolves.toBe(true);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe('tamper detection', () => {
|
|
92
|
+
let envelope: SignedRecordEnvelope;
|
|
93
|
+
|
|
94
|
+
beforeEach(async () => {
|
|
95
|
+
envelope = await SignatureService.signRecord('profile', 'did:web:oxy.so:u:u3', {
|
|
96
|
+
displayName: 'Original',
|
|
97
|
+
score: 10,
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('rejects a mutated record', async () => {
|
|
102
|
+
const tampered: SignedRecordEnvelope = {
|
|
103
|
+
...envelope,
|
|
104
|
+
record: { ...envelope.record, displayName: 'Tampered' },
|
|
105
|
+
};
|
|
106
|
+
await expect(verifyEnvelopeSignature(tampered)).resolves.toBe(false);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('rejects a changed subject', async () => {
|
|
110
|
+
const tampered: SignedRecordEnvelope = { ...envelope, subject: 'did:web:oxy.so:u:evil' };
|
|
111
|
+
await expect(verifyEnvelopeSignature(tampered)).resolves.toBe(false);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('rejects a changed issuedAt', async () => {
|
|
115
|
+
const tampered: SignedRecordEnvelope = { ...envelope, issuedAt: envelope.issuedAt + 1 };
|
|
116
|
+
await expect(verifyEnvelopeSignature(tampered)).resolves.toBe(false);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('rejects verification against an unrelated public key', async () => {
|
|
120
|
+
const otherKey = generateSecp256k1KeyPair().publicKey;
|
|
121
|
+
const tampered: SignedRecordEnvelope = { ...envelope, publicKey: otherKey };
|
|
122
|
+
await expect(verifyEnvelopeSignature(tampered)).resolves.toBe(false);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('throws when no identity is stored', async () => {
|
|
127
|
+
jest.spyOn(KeyManager, 'getPrivateKey').mockResolvedValue(null);
|
|
128
|
+
await expect(
|
|
129
|
+
SignatureService.signRecord('identity', 'did:web:oxy.so:u:u4', {}),
|
|
130
|
+
).rejects.toThrow(/No identity found/);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('SignatureService.signRecordV2 / verifyEnvelopeSignature (v2 hash chain)', () => {
|
|
135
|
+
const keyPair = generateSecp256k1KeyPair();
|
|
136
|
+
const publicKey = keyPair.publicKey;
|
|
137
|
+
const privateKey = keyPair.privateKey.padStart(64, '0');
|
|
138
|
+
|
|
139
|
+
beforeEach(() => {
|
|
140
|
+
jest.spyOn(KeyManager, 'getPrivateKey').mockResolvedValue(privateKey);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
afterEach(() => {
|
|
144
|
+
jest.restoreAllMocks();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const chain = {
|
|
148
|
+
seq: 0,
|
|
149
|
+
prev: null as string | null,
|
|
150
|
+
collection: 'app.oxy.reputation',
|
|
151
|
+
rkey: 'rt_1',
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
it('builds a well-formed v2 envelope carrying the chain fields', async () => {
|
|
155
|
+
const subject = 'did:web:oxy.so:u:abc123';
|
|
156
|
+
const envelope = await SignatureService.signRecordV2(
|
|
157
|
+
'reputation_attestation',
|
|
158
|
+
subject,
|
|
159
|
+
{ points: 25 },
|
|
160
|
+
chain,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
expect(envelope.version).toBe(2);
|
|
164
|
+
expect(envelope.type).toBe('reputation_attestation');
|
|
165
|
+
expect(envelope.subject).toBe(subject);
|
|
166
|
+
expect(envelope.issuer).toBe(subject); // self-issued
|
|
167
|
+
expect(envelope.seq).toBe(0);
|
|
168
|
+
expect(envelope.prev).toBeNull();
|
|
169
|
+
expect(envelope.collection).toBe('app.oxy.reputation');
|
|
170
|
+
expect(envelope.rkey).toBe('rt_1');
|
|
171
|
+
expect(envelope.publicKey).toBe(publicKey);
|
|
172
|
+
expect(envelope.alg).toBe('ES256K-DER-SHA256');
|
|
173
|
+
expect(typeof envelope.signature).toBe('string');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('round-trips: a freshly signed v2 record verifies', async () => {
|
|
177
|
+
const envelope = await SignatureService.signRecordV2(
|
|
178
|
+
'validation_verdict',
|
|
179
|
+
'did:web:oxy.so:u:v1',
|
|
180
|
+
{ verdict: 'approve' },
|
|
181
|
+
{ seq: 3, prev: 'a'.repeat(64), collection: 'app.oxy.validation', rkey: 'req_9' },
|
|
182
|
+
);
|
|
183
|
+
await expect(verifyEnvelopeSignature(envelope)).resolves.toBe(true);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('covers the chain fields in the signed bytes (tampering breaks verify)', async () => {
|
|
187
|
+
const envelope = await SignatureService.signRecordV2(
|
|
188
|
+
'reputation_attestation',
|
|
189
|
+
'did:web:oxy.so:u:t1',
|
|
190
|
+
{ points: 8 },
|
|
191
|
+
chain,
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
await expect(verifyEnvelopeSignature({ ...envelope, seq: 1 })).resolves.toBe(false);
|
|
195
|
+
await expect(
|
|
196
|
+
verifyEnvelopeSignature({ ...envelope, prev: 'b'.repeat(64) }),
|
|
197
|
+
).resolves.toBe(false);
|
|
198
|
+
await expect(
|
|
199
|
+
verifyEnvelopeSignature({ ...envelope, collection: 'app.evil' }),
|
|
200
|
+
).resolves.toBe(false);
|
|
201
|
+
await expect(verifyEnvelopeSignature({ ...envelope, rkey: 'other' })).resolves.toBe(false);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('a v2 envelope signs over DIFFERENT bytes than the same base fields as v1', async () => {
|
|
205
|
+
const subject = 'did:web:oxy.so:u:diff';
|
|
206
|
+
const record = { x: 1 };
|
|
207
|
+
const v2 = await SignatureService.signRecordV2('profile', subject, record, chain);
|
|
208
|
+
|
|
209
|
+
const v1Input = signedRecordSigningInput({
|
|
210
|
+
version: 1,
|
|
211
|
+
type: 'profile',
|
|
212
|
+
subject,
|
|
213
|
+
issuer: subject,
|
|
214
|
+
record,
|
|
215
|
+
issuedAt: v2.issuedAt,
|
|
216
|
+
});
|
|
217
|
+
const v2Input = signedRecordSigningInput(v2);
|
|
218
|
+
expect(v2Input).not.toBe(v1Input);
|
|
219
|
+
expect(v2Input).toContain('"seq":0');
|
|
220
|
+
expect(v2Input).toContain('"prev":null');
|
|
221
|
+
expect(v2Input).toContain('"collection":"app.oxy.reputation"');
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('throws when no identity is stored', async () => {
|
|
225
|
+
jest.spyOn(KeyManager, 'getPrivateKey').mockResolvedValue(null);
|
|
226
|
+
await expect(
|
|
227
|
+
SignatureService.signRecordV2('identity', 'did:web:oxy.so:u:u4', {}, chain),
|
|
228
|
+
).rejects.toThrow(/No identity found/);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated Encryption with Associated Data (XChaCha20-Poly1305)
|
|
3
|
+
*
|
|
4
|
+
* Pure-JS/TS AEAD via `@noble/ciphers` — identical behaviour on web, Node, and
|
|
5
|
+
* React Native with zero WebCrypto / native-module dependency. This replaces
|
|
6
|
+
* the `crypto.subtle`-based path (unreliable on React Native) for the Commons
|
|
7
|
+
* encrypted backup and device-to-device transfer flows.
|
|
8
|
+
*
|
|
9
|
+
* XChaCha20-Poly1305 is chosen over AES-GCM specifically for its 24-byte
|
|
10
|
+
* (192-bit) random nonce: the nonce space is large enough that random nonces
|
|
11
|
+
* never collide in practice, so callers do not need to maintain a per-key
|
|
12
|
+
* counter. The 16-byte Poly1305 tag is appended to the ciphertext by the
|
|
13
|
+
* underlying library and validated on decrypt.
|
|
14
|
+
*
|
|
15
|
+
* The optional Associated Data (AAD) is authenticated but NOT encrypted: it
|
|
16
|
+
* binds the ciphertext to its context (e.g. a backup version, a device id, a
|
|
17
|
+
* DID). Decryption fails if the key, nonce, ciphertext, OR aad differ from
|
|
18
|
+
* those used at encryption time.
|
|
19
|
+
*
|
|
20
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
// Loading the polyfill guarantees `globalThis.crypto.getRandomValues` exists on
|
|
24
|
+
// every platform (native crypto on web/Node; expo-crypto-backed shim on RN).
|
|
25
|
+
import './polyfill';
|
|
26
|
+
import { xchacha20poly1305 } from '@noble/ciphers/chacha';
|
|
27
|
+
|
|
28
|
+
/** Key length for XChaCha20-Poly1305, in bytes (256-bit). */
|
|
29
|
+
export const AEAD_KEY_LENGTH = 32;
|
|
30
|
+
/** Nonce length for XChaCha20-Poly1305, in bytes (192-bit). */
|
|
31
|
+
export const AEAD_NONCE_LENGTH = 24;
|
|
32
|
+
|
|
33
|
+
/** Ciphertext (Poly1305 tag appended) plus the random nonce used to produce it. */
|
|
34
|
+
export interface AeadResult {
|
|
35
|
+
/** The 24-byte random nonce. Store/transmit alongside the ciphertext. */
|
|
36
|
+
nonce: Uint8Array;
|
|
37
|
+
/** Ciphertext with the 16-byte Poly1305 authentication tag appended. */
|
|
38
|
+
ciphertext: Uint8Array;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function assertKey(key: Uint8Array): void {
|
|
42
|
+
if (key.length !== AEAD_KEY_LENGTH) {
|
|
43
|
+
throw new Error(`AEAD key must be ${AEAD_KEY_LENGTH} bytes, got ${key.length}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Generate a fresh 24-byte random nonce via the platform CSPRNG. */
|
|
48
|
+
function randomNonce(): Uint8Array {
|
|
49
|
+
const nonce = new Uint8Array(AEAD_NONCE_LENGTH);
|
|
50
|
+
globalThis.crypto.getRandomValues(nonce);
|
|
51
|
+
return nonce;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Encrypt `plaintext` under `key` with a fresh random nonce, authenticating the
|
|
56
|
+
* optional `aad`.
|
|
57
|
+
*
|
|
58
|
+
* @param key 32-byte symmetric key (e.g. from `hkdfSha256`).
|
|
59
|
+
* @param plaintext Bytes to encrypt.
|
|
60
|
+
* @param aad Optional associated data authenticated but not encrypted.
|
|
61
|
+
* @returns `{ nonce, ciphertext }` — both are required to decrypt.
|
|
62
|
+
*/
|
|
63
|
+
export function encryptAead(
|
|
64
|
+
key: Uint8Array,
|
|
65
|
+
plaintext: Uint8Array,
|
|
66
|
+
aad?: Uint8Array,
|
|
67
|
+
): AeadResult {
|
|
68
|
+
assertKey(key);
|
|
69
|
+
const nonce = randomNonce();
|
|
70
|
+
const ciphertext = xchacha20poly1305(key, nonce, aad).encrypt(plaintext);
|
|
71
|
+
return { nonce, ciphertext };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Decrypt and authenticate `ciphertext` produced by {@link encryptAead}.
|
|
76
|
+
*
|
|
77
|
+
* Throws if the key, nonce, ciphertext, or aad differ from those used at
|
|
78
|
+
* encryption time (tamper detection), or if the tag is invalid.
|
|
79
|
+
*
|
|
80
|
+
* @param key 32-byte symmetric key.
|
|
81
|
+
* @param nonce The 24-byte nonce returned by `encryptAead`.
|
|
82
|
+
* @param ciphertext Ciphertext with the appended Poly1305 tag.
|
|
83
|
+
* @param aad The same associated data supplied at encryption time.
|
|
84
|
+
* @returns The recovered plaintext bytes.
|
|
85
|
+
*/
|
|
86
|
+
export function decryptAead(
|
|
87
|
+
key: Uint8Array,
|
|
88
|
+
nonce: Uint8Array,
|
|
89
|
+
ciphertext: Uint8Array,
|
|
90
|
+
aad?: Uint8Array,
|
|
91
|
+
): Uint8Array {
|
|
92
|
+
assertKey(key);
|
|
93
|
+
if (nonce.length !== AEAD_NONCE_LENGTH) {
|
|
94
|
+
throw new Error(`AEAD nonce must be ${AEAD_NONCE_LENGTH} bytes, got ${nonce.length}`);
|
|
95
|
+
}
|
|
96
|
+
return xchacha20poly1305(key, nonce, aad).decrypt(ciphertext);
|
|
97
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ECDH shared-secret derivation (secp256k1)
|
|
3
|
+
*
|
|
4
|
+
* Derives a raw 32-byte ECDH shared secret from a local private key and a
|
|
5
|
+
* remote public key, using the shared `@oxy.so/protocol` secp256k1 primitive.
|
|
6
|
+
* This is the key-exchange
|
|
7
|
+
* step for the Commons device-to-device transfer flow: each side computes the
|
|
8
|
+
* same shared secret, which is then run through `hkdfSha256` to derive the
|
|
9
|
+
* symmetric key handed to `encryptAead` / `decryptAead`.
|
|
10
|
+
*
|
|
11
|
+
* The returned value is the raw x-coordinate of the ECDH point, big-endian,
|
|
12
|
+
* zero-padded to 32 bytes. It is NOT itself a symmetric key — always pass it
|
|
13
|
+
* through a KDF (HKDF) with a context-binding `info` before use.
|
|
14
|
+
*
|
|
15
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { deriveSecp256k1SharedSecret } from '@oxy.so/protocol/secp256k1';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Compute the ECDH shared secret between a local private key and a remote
|
|
22
|
+
* public key on secp256k1.
|
|
23
|
+
*
|
|
24
|
+
* Symmetric by construction:
|
|
25
|
+
* `deriveSharedSecret(privA, pubB) === deriveSharedSecret(privB, pubA)`.
|
|
26
|
+
*
|
|
27
|
+
* @param privateKeyHex Local private key, hex (up to 64 chars; canonicalized).
|
|
28
|
+
* @param otherPublicKeyHex Remote public key, hex — compressed (`02`/`03` + 32
|
|
29
|
+
* bytes) or uncompressed (`04` + 64 bytes).
|
|
30
|
+
* @returns The 32-byte big-endian shared secret.
|
|
31
|
+
*/
|
|
32
|
+
export function deriveSharedSecret(
|
|
33
|
+
privateKeyHex: string,
|
|
34
|
+
otherPublicKeyHex: string,
|
|
35
|
+
): Uint8Array {
|
|
36
|
+
return deriveSecp256k1SharedSecret(privateKeyHex, otherPublicKeyHex);
|
|
37
|
+
}
|