@oxyhq/services 5.16.35 → 5.16.37

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.
Files changed (232) hide show
  1. package/README.md +8 -26
  2. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  3. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  4. package/lib/commonjs/core/mixins/OxyServices.utility.js.map +1 -1
  5. package/lib/commonjs/crypto/README.md +142 -0
  6. package/lib/commonjs/crypto/core.js +147 -0
  7. package/lib/commonjs/crypto/core.js.map +1 -0
  8. package/lib/commonjs/crypto/index.js +16 -0
  9. package/lib/commonjs/crypto/index.js.map +1 -1
  10. package/lib/commonjs/crypto/keyManager.js +19 -22
  11. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  12. package/lib/commonjs/crypto/signatureService.js +116 -28
  13. package/lib/commonjs/crypto/signatureService.js.map +1 -1
  14. package/lib/commonjs/index.js +0 -12
  15. package/lib/commonjs/index.js.map +1 -1
  16. package/lib/commonjs/models/interfaces.js +10 -11
  17. package/lib/commonjs/models/interfaces.js.map +1 -1
  18. package/lib/commonjs/node/index.js +10 -1
  19. package/lib/commonjs/node/index.js.map +1 -1
  20. package/lib/commonjs/node/signatureService.js +107 -0
  21. package/lib/commonjs/node/signatureService.js.map +1 -0
  22. package/lib/commonjs/ui/context/OxyContext.js +23 -0
  23. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  24. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +29 -2
  25. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  26. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js.map +1 -1
  27. package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
  28. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  29. package/lib/commonjs/ui/index.js +0 -2
  30. package/lib/commonjs/ui/index.js.map +1 -1
  31. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  32. package/lib/commonjs/ui/screens/OxyAuthScreen.js +11 -2
  33. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  34. package/lib/module/core/OxyServices.base.js.map +1 -1
  35. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  36. package/lib/module/core/mixins/OxyServices.utility.js.map +1 -1
  37. package/lib/module/crypto/README.md +142 -0
  38. package/lib/module/crypto/core.js +133 -0
  39. package/lib/module/crypto/core.js.map +1 -0
  40. package/lib/module/crypto/index.js +3 -9
  41. package/lib/module/crypto/index.js.map +1 -1
  42. package/lib/module/crypto/keyManager.js +19 -22
  43. package/lib/module/crypto/keyManager.js.map +1 -1
  44. package/lib/module/crypto/signatureService.js +113 -23
  45. package/lib/module/crypto/signatureService.js.map +1 -1
  46. package/lib/module/index.js +0 -2
  47. package/lib/module/index.js.map +1 -1
  48. package/lib/module/models/interfaces.js +10 -11
  49. package/lib/module/models/interfaces.js.map +1 -1
  50. package/lib/module/node/index.js +3 -0
  51. package/lib/module/node/index.js.map +1 -1
  52. package/lib/module/node/signatureService.js +101 -0
  53. package/lib/module/node/signatureService.js.map +1 -0
  54. package/lib/module/ui/context/OxyContext.js +23 -0
  55. package/lib/module/ui/context/OxyContext.js.map +1 -1
  56. package/lib/module/ui/context/hooks/useAuthOperations.js +29 -2
  57. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  58. package/lib/module/ui/context/hooks/useLanguageManagement.js.map +1 -1
  59. package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
  60. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  61. package/lib/module/ui/index.js +0 -1
  62. package/lib/module/ui/index.js.map +1 -1
  63. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  64. package/lib/module/ui/screens/OxyAuthScreen.js +11 -2
  65. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  66. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  67. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  68. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  69. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +1 -1
  70. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  71. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  72. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  73. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  74. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  75. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  76. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  77. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  78. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  79. package/lib/typescript/core/mixins/OxyServices.user.d.ts +1 -2
  80. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  81. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  82. package/lib/typescript/core/mixins/index.d.ts +13 -13
  83. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  84. package/lib/typescript/core/services/SessionService.d.ts +1 -1
  85. package/lib/typescript/core/services/SessionService.d.ts.map +1 -1
  86. package/lib/typescript/crypto/core.d.ts +56 -0
  87. package/lib/typescript/crypto/core.d.ts.map +1 -0
  88. package/lib/typescript/crypto/index.d.ts +1 -9
  89. package/lib/typescript/crypto/index.d.ts.map +1 -1
  90. package/lib/typescript/crypto/keyManager.d.ts +13 -1
  91. package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
  92. package/lib/typescript/crypto/signatureService.d.ts +15 -9
  93. package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
  94. package/lib/typescript/index.d.ts +1 -2
  95. package/lib/typescript/index.d.ts.map +1 -1
  96. package/lib/typescript/models/interfaces.d.ts +68 -15
  97. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  98. package/lib/typescript/node/index.d.ts +1 -0
  99. package/lib/typescript/node/index.d.ts.map +1 -1
  100. package/lib/typescript/node/signatureService.d.ts +55 -0
  101. package/lib/typescript/node/signatureService.d.ts.map +1 -0
  102. package/lib/typescript/ui/context/OxyContext.d.ts +1 -2
  103. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  104. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +1 -2
  105. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  106. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +1 -2
  107. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
  108. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
  109. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  110. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +1 -1
  111. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  112. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +1 -2
  113. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  114. package/lib/typescript/ui/hooks/useSessionManagement.d.ts +1 -2
  115. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  116. package/lib/typescript/ui/index.d.ts +1 -1
  117. package/lib/typescript/ui/index.d.ts.map +1 -1
  118. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  119. package/lib/typescript/ui/stores/authStore.d.ts +1 -1
  120. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  121. package/lib/typescript/ui/utils/avatarUtils.d.ts +1 -1
  122. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  123. package/package.json +6 -1
  124. package/src/core/OxyServices.base.ts +1 -2
  125. package/src/core/mixins/OxyServices.auth.ts +1 -1
  126. package/src/core/mixins/OxyServices.user.ts +1 -2
  127. package/src/core/mixins/OxyServices.utility.ts +1 -2
  128. package/src/core/services/SessionService.ts +1 -1
  129. package/src/crypto/README.md +142 -0
  130. package/src/crypto/__tests__/core.test.ts +203 -0
  131. package/src/crypto/core.ts +142 -0
  132. package/src/crypto/index.ts +3 -10
  133. package/src/crypto/keyManager.ts +25 -21
  134. package/src/crypto/signatureService.ts +137 -36
  135. package/src/index.ts +2 -3
  136. package/src/models/interfaces.ts +73 -21
  137. package/src/node/index.ts +3 -0
  138. package/src/node/signatureService.ts +126 -0
  139. package/src/ui/context/OxyContext.tsx +26 -2
  140. package/src/ui/context/hooks/useAuthOperations.ts +33 -4
  141. package/src/ui/context/hooks/useLanguageManagement.ts +1 -2
  142. package/src/ui/hooks/auth/index.ts +2 -0
  143. package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
  144. package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
  145. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  146. package/src/ui/hooks/useLanguageManagement.ts +1 -2
  147. package/src/ui/hooks/useSessionManagement.ts +1 -2
  148. package/src/ui/index.ts +1 -2
  149. package/src/ui/screens/AccountSettingsScreen.tsx +6 -6
  150. package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
  151. package/src/ui/screens/OxyAuthScreen.tsx +11 -2
  152. package/src/ui/screens/ProfileScreen.tsx +1 -1
  153. package/src/ui/stores/authStore.ts +1 -1
  154. package/src/ui/types/navigation.ts +1 -1
  155. package/src/ui/utils/avatarUtils.ts +1 -1
  156. package/lib/commonjs/core/services/AuthService.js +0 -156
  157. package/lib/commonjs/core/services/AuthService.js.map +0 -1
  158. package/lib/commonjs/core/services/SessionTransportService.js +0 -64
  159. package/lib/commonjs/core/services/SessionTransportService.js.map +0 -1
  160. package/lib/commonjs/core/services/UserService.js +0 -123
  161. package/lib/commonjs/core/services/UserService.js.map +0 -1
  162. package/lib/commonjs/core/services/index.js +0 -34
  163. package/lib/commonjs/core/services/index.js.map +0 -1
  164. package/lib/commonjs/shared/crypto/messageBuilders.js +0 -79
  165. package/lib/commonjs/shared/crypto/messageBuilders.js.map +0 -1
  166. package/lib/commonjs/shared/crypto/platform.js +0 -118
  167. package/lib/commonjs/shared/crypto/platform.js.map +0 -1
  168. package/lib/commonjs/shared/crypto/signature.js +0 -191
  169. package/lib/commonjs/shared/crypto/signature.js.map +0 -1
  170. package/lib/commonjs/shared/index.js +0 -94
  171. package/lib/commonjs/shared/index.js.map +0 -1
  172. package/lib/commonjs/shared/models/index.js +0 -2
  173. package/lib/commonjs/shared/models/index.js.map +0 -1
  174. package/lib/commonjs/shared/transport/index.js +0 -260
  175. package/lib/commonjs/shared/transport/index.js.map +0 -1
  176. package/lib/commonjs/shared/utils/index.js +0 -82
  177. package/lib/commonjs/shared/utils/index.js.map +0 -1
  178. package/lib/module/core/services/AuthService.js +0 -151
  179. package/lib/module/core/services/AuthService.js.map +0 -1
  180. package/lib/module/core/services/SessionTransportService.js +0 -59
  181. package/lib/module/core/services/SessionTransportService.js.map +0 -1
  182. package/lib/module/core/services/UserService.js +0 -118
  183. package/lib/module/core/services/UserService.js.map +0 -1
  184. package/lib/module/core/services/index.js +0 -16
  185. package/lib/module/core/services/index.js.map +0 -1
  186. package/lib/module/shared/crypto/messageBuilders.js +0 -70
  187. package/lib/module/shared/crypto/messageBuilders.js.map +0 -1
  188. package/lib/module/shared/crypto/platform.js +0 -112
  189. package/lib/module/shared/crypto/platform.js.map +0 -1
  190. package/lib/module/shared/crypto/signature.js +0 -186
  191. package/lib/module/shared/crypto/signature.js.map +0 -1
  192. package/lib/module/shared/index.js +0 -30
  193. package/lib/module/shared/index.js.map +0 -1
  194. package/lib/module/shared/models/index.js +0 -2
  195. package/lib/module/shared/models/index.js.map +0 -1
  196. package/lib/module/shared/transport/index.js +0 -254
  197. package/lib/module/shared/transport/index.js.map +0 -1
  198. package/lib/module/shared/utils/index.js +0 -74
  199. package/lib/module/shared/utils/index.js.map +0 -1
  200. package/lib/typescript/core/services/AuthService.d.ts +0 -50
  201. package/lib/typescript/core/services/AuthService.d.ts.map +0 -1
  202. package/lib/typescript/core/services/SessionTransportService.d.ts +0 -31
  203. package/lib/typescript/core/services/SessionTransportService.d.ts.map +0 -1
  204. package/lib/typescript/core/services/UserService.d.ts +0 -39
  205. package/lib/typescript/core/services/UserService.d.ts.map +0 -1
  206. package/lib/typescript/core/services/index.d.ts +0 -13
  207. package/lib/typescript/core/services/index.d.ts.map +0 -1
  208. package/lib/typescript/shared/crypto/messageBuilders.d.ts +0 -38
  209. package/lib/typescript/shared/crypto/messageBuilders.d.ts.map +0 -1
  210. package/lib/typescript/shared/crypto/platform.d.ts +0 -54
  211. package/lib/typescript/shared/crypto/platform.d.ts.map +0 -1
  212. package/lib/typescript/shared/crypto/signature.d.ts +0 -72
  213. package/lib/typescript/shared/crypto/signature.d.ts.map +0 -1
  214. package/lib/typescript/shared/index.d.ts +0 -20
  215. package/lib/typescript/shared/index.d.ts.map +0 -1
  216. package/lib/typescript/shared/models/index.d.ts +0 -163
  217. package/lib/typescript/shared/models/index.d.ts.map +0 -1
  218. package/lib/typescript/shared/transport/index.d.ts +0 -73
  219. package/lib/typescript/shared/transport/index.d.ts.map +0 -1
  220. package/lib/typescript/shared/utils/index.d.ts +0 -28
  221. package/lib/typescript/shared/utils/index.d.ts.map +0 -1
  222. package/src/core/services/AuthService.ts +0 -153
  223. package/src/core/services/SessionTransportService.ts +0 -69
  224. package/src/core/services/UserService.ts +0 -125
  225. package/src/core/services/index.ts +0 -14
  226. package/src/shared/crypto/messageBuilders.ts +0 -89
  227. package/src/shared/crypto/platform.ts +0 -140
  228. package/src/shared/crypto/signature.ts +0 -235
  229. package/src/shared/index.ts +0 -28
  230. package/src/shared/models/index.ts +0 -173
  231. package/src/shared/transport/index.ts +0 -349
  232. package/src/shared/utils/index.ts +0 -73
@@ -6,35 +6,97 @@
6
6
  * Handles signing and verification of messages using ECDSA secp256k1.
7
7
  * Used for authenticating requests and proving identity ownership.
8
8
  *
9
- * Note: This service handles SIGNING (requires private key access via KeyManager).
10
- * For VERIFICATION, use the shared SignatureService from '../shared' instead.
9
+ * This service provides async methods for cross-platform compatibility (React Native + Node).
10
+ * For Node.js-only synchronous operations, use the node/signatureService module.
11
11
  */
12
12
 
13
- import { ec as EC } from 'elliptic';
14
13
  import { KeyManager } from './keyManager';
15
- import { buildAuthMessage, buildRegistrationMessage, buildRequestMessage, getCryptoAdapter, SignatureService as SharedSignatureService, isTimestampFresh } from '../shared';
16
- const ec = new EC('secp256k1');
14
+ import { verifySignatureCore, isTimestampFresh, buildAuthMessage, buildRegistrationMessage, buildRequestMessage, getEllipticCurve } from './core';
17
15
 
18
- // Re-export shared types
16
+ // Lazy import for expo-crypto
17
+ let ExpoCrypto = null;
18
+ const ec = getEllipticCurve();
19
19
 
20
+ /**
21
+ * Check if we're in a React Native environment
22
+ */
23
+ function isReactNative() {
24
+ return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
25
+ }
26
+
27
+ /**
28
+ * Check if we're in a Node.js environment
29
+ */
30
+ function isNodeJS() {
31
+ return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
32
+ }
33
+
34
+ /**
35
+ * Initialize expo-crypto module
36
+ */
37
+ async function initExpoCrypto() {
38
+ if (!ExpoCrypto) {
39
+ ExpoCrypto = await import('expo-crypto');
40
+ }
41
+ return ExpoCrypto;
42
+ }
43
+
44
+ /**
45
+ * Compute SHA-256 hash of a string
46
+ */
47
+ async function sha256(message) {
48
+ // In React Native, always use expo-crypto
49
+ if (isReactNative() || !isNodeJS()) {
50
+ const Crypto = await initExpoCrypto();
51
+ return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
52
+ }
53
+
54
+ // In Node.js, use Node's crypto module
55
+ // Use Function constructor to prevent Metro bundler from statically analyzing this require
56
+ // This ensures the require is only evaluated in Node.js runtime, not during Metro bundling
57
+ try {
58
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
59
+ const getCrypto = new Function('return require("crypto")');
60
+ const crypto = getCrypto();
61
+ return crypto.createHash('sha256').update(message).digest('hex');
62
+ } catch (error) {
63
+ // Fallback to expo-crypto if Node crypto fails
64
+ const Crypto = await initExpoCrypto();
65
+ return Crypto.digestStringAsync(Crypto.CryptoDigestAlgorithm.SHA256, message);
66
+ }
67
+ }
20
68
  export class SignatureService {
21
69
  /**
22
70
  * Generate a random challenge string (for offline use)
23
- * Uses shared crypto adapter
71
+ * Uses expo-crypto in React Native, crypto.randomBytes in Node.js
24
72
  */
25
73
  static async generateChallenge() {
26
- const adapter = await getCryptoAdapter();
27
- const randomBytes = await adapter.randomBytes(32);
28
- return Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('');
74
+ if (isReactNative() || !isNodeJS()) {
75
+ // Use expo-crypto for React Native (expo-random is deprecated)
76
+ const Crypto = await initExpoCrypto();
77
+ const randomBytes = await Crypto.getRandomBytesAsync(32);
78
+ return Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('');
79
+ }
80
+
81
+ // Node.js fallback
82
+ try {
83
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
84
+ const getCrypto = new Function('return require("crypto")');
85
+ const crypto = getCrypto();
86
+ return crypto.randomBytes(32).toString('hex');
87
+ } catch (error) {
88
+ // Fallback to expo-crypto if Node crypto fails
89
+ const Crypto = await initExpoCrypto();
90
+ const randomBytes = await Crypto.getRandomBytesAsync(32);
91
+ return Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join('');
92
+ }
29
93
  }
30
94
 
31
95
  /**
32
96
  * Hash a message using SHA-256
33
- * Uses shared crypto adapter
34
97
  */
35
98
  static async hashMessage(message) {
36
- const adapter = await getCryptoAdapter();
37
- return adapter.sha256(message);
99
+ return sha256(message);
38
100
  }
39
101
 
40
102
  /**
@@ -46,8 +108,7 @@ export class SignatureService {
46
108
  if (!keyPair) {
47
109
  throw new Error('No identity found. Please create or import an identity first.');
48
110
  }
49
- const adapter = await getCryptoAdapter();
50
- const messageHash = await adapter.sha256(message);
111
+ const messageHash = await sha256(message);
51
112
  const signature = keyPair.sign(messageHash);
52
113
  return signature.toDER('hex');
53
114
  }
@@ -58,18 +119,43 @@ export class SignatureService {
58
119
  */
59
120
  static async signWithKey(message, privateKey) {
60
121
  const keyPair = ec.keyFromPrivate(privateKey);
61
- const adapter = await getCryptoAdapter();
62
- const messageHash = await adapter.sha256(message);
122
+ const messageHash = await sha256(message);
63
123
  const signature = keyPair.sign(messageHash);
64
124
  return signature.toDER('hex');
65
125
  }
66
126
 
67
127
  /**
68
128
  * Verify a signature against a message and public key
69
- * Uses shared SignatureService for verification
70
129
  */
71
130
  static async verify(message, signature, publicKey) {
72
- return SharedSignatureService.verify(message, signature, publicKey);
131
+ try {
132
+ const messageHash = await sha256(message);
133
+ return verifySignatureCore(messageHash, signature, publicKey);
134
+ } catch {
135
+ return false;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Synchronous verification (for Node.js backend)
141
+ * Uses crypto module directly for hashing
142
+ * Note: This method should only be used in Node.js environments
143
+ */
144
+ static verifySync(message, signature, publicKey) {
145
+ try {
146
+ if (!isNodeJS()) {
147
+ // In React Native, use async verify instead
148
+ throw new Error('verifySync should only be used in Node.js. Use verify() in React Native.');
149
+ }
150
+ // Use Function constructor to prevent Metro bundler from statically analyzing this require
151
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
152
+ const getCrypto = new Function('return require("crypto")');
153
+ const crypto = getCrypto();
154
+ const messageHash = crypto.createHash('sha256').update(message).digest('hex');
155
+ return verifySignatureCore(messageHash, signature, publicKey);
156
+ } catch {
157
+ return false;
158
+ }
73
159
  }
74
160
 
75
161
  /**
@@ -94,7 +180,6 @@ export class SignatureService {
94
180
  /**
95
181
  * Verify a signed message object
96
182
  * Checks both signature validity and timestamp freshness
97
- * Uses shared SignatureService for verification
98
183
  */
99
184
  static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000 // 5 minutes default
100
185
  ) {
@@ -112,7 +197,7 @@ export class SignatureService {
112
197
 
113
198
  // Verify signature
114
199
  const messageWithTimestamp = `${message}:${timestamp}`;
115
- return SharedSignatureService.verify(messageWithTimestamp, signature, publicKey);
200
+ return SignatureService.verify(messageWithTimestamp, signature, publicKey);
116
201
  }
117
202
 
118
203
  /**
@@ -136,7 +221,6 @@ export class SignatureService {
136
221
 
137
222
  /**
138
223
  * Verify a challenge response
139
- * Uses shared SignatureService for verification
140
224
  */
141
225
  static async verifyChallengeResponse(originalChallenge, response, maxAgeMs = 5 * 60 * 1000) {
142
226
  const {
@@ -144,7 +228,13 @@ export class SignatureService {
144
228
  publicKey,
145
229
  timestamp
146
230
  } = response;
147
- return SharedSignatureService.verifyChallengeResponse(publicKey, originalChallenge, signature, timestamp, maxAgeMs);
231
+
232
+ // Check timestamp freshness
233
+ if (!isTimestampFresh(timestamp, maxAgeMs)) {
234
+ return false;
235
+ }
236
+ const message = buildAuthMessage(publicKey, originalChallenge, timestamp);
237
+ return SignatureService.verify(message, signature, publicKey);
148
238
  }
149
239
 
150
240
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["ec","EC","KeyManager","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","getCryptoAdapter","SignatureService","SharedSignatureService","isTimestampFresh","generateChallenge","adapter","randomBytes","Array","from","map","b","toString","padStart","join","hashMessage","message","sha256","sign","keyPair","getKeyPairObject","Error","messageHash","signature","toDER","signWithKey","privateKey","keyFromPrivate","verify","publicKey","createSignedMessage","getPublicKey","timestamp","Date","now","messageWithTimestamp","verifySignedMessage","signedMessage","maxAgeMs","signChallenge","challenge","verifyChallengeResponse","originalChallenge","response","createRegistrationSignature","signRequestData","data"],"sourceRoot":"../../../src","sources":["crypto/signatureService.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["KeyManager","verifySignatureCore","isTimestampFresh","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","getEllipticCurve","ExpoCrypto","ec","isReactNative","navigator","product","isNodeJS","process","versions","node","initExpoCrypto","sha256","message","Crypto","digestStringAsync","CryptoDigestAlgorithm","SHA256","getCrypto","Function","crypto","createHash","update","digest","error","SignatureService","generateChallenge","randomBytes","getRandomBytesAsync","Array","from","map","b","toString","padStart","join","hashMessage","sign","keyPair","getKeyPairObject","Error","messageHash","signature","toDER","signWithKey","privateKey","keyFromPrivate","verify","publicKey","verifySync","createSignedMessage","getPublicKey","timestamp","Date","now","messageWithTimestamp","verifySignedMessage","signedMessage","maxAgeMs","signChallenge","challenge","verifyChallengeResponse","originalChallenge","response","createRegistrationSignature","signRequestData","data"],"sourceRoot":"../../../src","sources":["crypto/signatureService.ts"],"mappings":"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","ignoreList":[]}
@@ -30,8 +30,6 @@ export { default as OxyProvider } from './ui/components/OxyProvider';
30
30
  export { DeviceManager } from './utils/deviceManager';
31
31
  // Language utilities
32
32
  export { SUPPORTED_LANGUAGES, getLanguageMetadata, getLanguageName, getNativeLanguageName, normalizeLanguageCode } from './utils/languageUtils';
33
- // Shared models and utilities (bundled for external consumers)
34
- export * from './shared';
35
33
 
36
34
  // Type exports
37
35
 
@@ -1 +1 @@
1
- {"version":3,"names":["KeyManager","SignatureService","OxyServices","OxyAuthenticationError","OxyAuthenticationTimeoutError","OXY_CLOUD_URL","oxyClient","OxyContextProvider","useOxy","default","OxyProvider","DeviceManager","SUPPORTED_LANGUAGES","getLanguageMetadata","getLanguageName","getNativeLanguageName","normalizeLanguageCode","SECURITY_EVENT_SEVERITY_MAP","useAuthStore","useAssetStore","useAssets","useAssetsStore","useAsset","useUploadProgress","useAssetLoading","useAssetErrors","useAssetsByApp","useAssetsByEntity","useAssetUsageCount","useIsAssetLinked","useSessionSocket","setOxyAssetInstance","useFileDownloadUrl","setOxyFileUrlInstance","useUsernameValidation","USERNAME_MIN_LENGTH","USERNAME_REGEX","USERNAME_FORMAT_ERROR","USERNAME_DEBOUNCE_MS","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useUsersBySessions","usePrivacySettings","useBlockedUsers","useRestrictedUsers","useSessions","useSession","useDeviceSessions","useUserDevices","useSecurityInfo","useSecurityActivity","useRecentSecurityActivity","useUpdateProfile","useUploadAvatar","useUpdateAccountSettings","useUpdatePrivacySettings","useUploadFile","useUnblockUser","useUnrestrictUser","useSwitchSession","useLogoutSession","useLogoutAll","useUpdateDeviceName","useRemoveDevice","OxySignInButton","OxyLogo","FollowButton","ErrorCodes","createApiError","handleHttpError","validateRequiredFields","retryWithBackoff","logger","LogLevel","LogContext","logAuth","logApi","logSession","logUser","logDevice","logPayment","logPerformance"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,mBAAmB;;AAE1B;AACA,SACEA,UAAU,EACVC,gBAAgB,QACX,UAAU;;AAEjB;AACA,SAASC,WAAW,EAAEC,sBAAsB,EAAEC,6BAA6B,QAAQ,QAAQ;AAC3F,SAASC,aAAa,EAAEC,SAAS,QAAQ,QAAQ;AAOjD;AACA,SACEC,kBAAkB;AAAE;AACpBC,MAAM,QACD,yBAAyB;;AAEhC;AACA,SAASC,OAAO,IAAIC,WAAW,QAAQ,6BAA6B;;AAEpE;AACA,SAASC,aAAa,QAAQ,uBAAuB;AAGrD;AACA,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,eAAe,EACfC,qBAAqB,EACrBC,qBAAqB,QAChB,uBAAuB;AAG9B;AACA,cAAc,UAAU;;AAExB;;AA2DA;AACA,SAASC,2BAA2B,QAAQ,qBAAqB;AAQjE;AACA,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SACEC,aAAa,EACbC,SAAS,IAAIC,cAAc,EAC3BC,QAAQ,EACRC,iBAAiB,EACjBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,QACX,wBAAwB;;AAE/B;AACA,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASV,SAAS,EAAEW,mBAAmB,QAAQ,sBAAsB;AACrE,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,+BAA+B;AACzF,SAASC,qBAAqB,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,qBAAqB,EAAEC,oBAAoB,QAAQ,iBAAiB;AAGzI;AACA;AACE;AACAC,cAAc,EACdC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,iBAAiB,EACjBC,kBAAkB,EAClBC,kBAAkB,EAClBC,eAAe,EACfC,kBAAkB;AAClB;AACAC,WAAW,EACXC,UAAU,EACVC,iBAAiB,EACjBC,cAAc,EACdC,eAAe;AACf;AACAC,mBAAmB,EACnBC,yBAAyB,QACpB,oBAAoB;;AAE3B;AACA;AACE;AACAC,gBAAgB,EAChBC,eAAe,EACfC,wBAAwB,EACxBC,wBAAwB,EACxBC,aAAa,EACbC,cAAc,EACdC,iBAAiB;AACjB;AACAC,gBAAgB,EAChBC,gBAAgB,EAChBC,YAAY,EACZC,mBAAmB,EACnBC,eAAe,QACV,sBAAsB;;AAE7B;AACA,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,OAAO,EAAEC,YAAY,QAAQ,MAAM;;AAE5C;AACA,cAAc,kBAAkB;AAChC,SACEC,UAAU,EACVC,cAAc,EACdC,eAAe,EACfC,sBAAsB,EACtBC,gBAAgB,QACX,oBAAoB;AAC3B,cAAc,yBAAyB;AACvC,SACEC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,UAAU,EACVC,cAAc,QACT,qBAAqB;AAC5B,cAAc,oBAAoB;AAClC,cAAc,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":["KeyManager","SignatureService","OxyServices","OxyAuthenticationError","OxyAuthenticationTimeoutError","OXY_CLOUD_URL","oxyClient","OxyContextProvider","useOxy","default","OxyProvider","DeviceManager","SUPPORTED_LANGUAGES","getLanguageMetadata","getLanguageName","getNativeLanguageName","normalizeLanguageCode","SECURITY_EVENT_SEVERITY_MAP","useAuthStore","useAssetStore","useAssets","useAssetsStore","useAsset","useUploadProgress","useAssetLoading","useAssetErrors","useAssetsByApp","useAssetsByEntity","useAssetUsageCount","useIsAssetLinked","useSessionSocket","setOxyAssetInstance","useFileDownloadUrl","setOxyFileUrlInstance","useUsernameValidation","USERNAME_MIN_LENGTH","USERNAME_REGEX","USERNAME_FORMAT_ERROR","USERNAME_DEBOUNCE_MS","useUserProfile","useUserProfiles","useCurrentUser","useUserById","useUserByUsername","useUsersBySessions","usePrivacySettings","useBlockedUsers","useRestrictedUsers","useSessions","useSession","useDeviceSessions","useUserDevices","useSecurityInfo","useSecurityActivity","useRecentSecurityActivity","useUpdateProfile","useUploadAvatar","useUpdateAccountSettings","useUpdatePrivacySettings","useUploadFile","useUnblockUser","useUnrestrictUser","useSwitchSession","useLogoutSession","useLogoutAll","useUpdateDeviceName","useRemoveDevice","OxySignInButton","OxyLogo","FollowButton","ErrorCodes","createApiError","handleHttpError","validateRequiredFields","retryWithBackoff","logger","LogLevel","LogContext","logAuth","logApi","logSession","logUser","logDevice","logPayment","logPerformance"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,mBAAmB;;AAE1B;AACA,SACEA,UAAU,EACVC,gBAAgB,QACX,UAAU;;AAEjB;AACA,SAASC,WAAW,EAAEC,sBAAsB,EAAEC,6BAA6B,QAAQ,QAAQ;AAC3F,SAASC,aAAa,EAAEC,SAAS,QAAQ,QAAQ;AAOjD;AACA,SACEC,kBAAkB;AAAE;AACpBC,MAAM,QACD,yBAAyB;;AAEhC;AACA,SAASC,OAAO,IAAIC,WAAW,QAAQ,6BAA6B;;AAEpE;AACA,SAASC,aAAa,QAAQ,uBAAuB;AAGrD;AACA,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,eAAe,EACfC,qBAAqB,EACrBC,qBAAqB,QAChB,uBAAuB;;AAG9B;;AA6DA;AACA,SAASC,2BAA2B,QAAQ,qBAAqB;AAQjE;AACA,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SACEC,aAAa,EACbC,SAAS,IAAIC,cAAc,EAC3BC,QAAQ,EACRC,iBAAiB,EACjBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,QACX,wBAAwB;;AAE/B;AACA,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASV,SAAS,EAAEW,mBAAmB,QAAQ,sBAAsB;AACrE,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,+BAA+B;AACzF,SAASC,qBAAqB,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,qBAAqB,EAAEC,oBAAoB,QAAQ,iBAAiB;AAGzI;AACA;AACE;AACAC,cAAc,EACdC,eAAe,EACfC,cAAc,EACdC,WAAW,EACXC,iBAAiB,EACjBC,kBAAkB,EAClBC,kBAAkB,EAClBC,eAAe,EACfC,kBAAkB;AAClB;AACAC,WAAW,EACXC,UAAU,EACVC,iBAAiB,EACjBC,cAAc,EACdC,eAAe;AACf;AACAC,mBAAmB,EACnBC,yBAAyB,QACpB,oBAAoB;;AAE3B;AACA;AACE;AACAC,gBAAgB,EAChBC,eAAe,EACfC,wBAAwB,EACxBC,wBAAwB,EACxBC,aAAa,EACbC,cAAc,EACdC,iBAAiB;AACjB;AACAC,gBAAgB,EAChBC,gBAAgB,EAChBC,YAAY,EACZC,mBAAmB,EACnBC,eAAe,QACV,sBAAsB;;AAE7B;AACA,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,OAAO,EAAEC,YAAY,QAAQ,MAAM;;AAE5C;AACA,cAAc,kBAAkB;AAChC,SACEC,UAAU,EACVC,cAAc,EACdC,eAAe,EACfC,sBAAsB,EACtBC,gBAAgB,QACX,oBAAoB;AAC3B,cAAc,yBAAyB;AACvC,SACEC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,UAAU,EACVC,cAAc,QACT,qBAAqB;AAC5B,cAAc,oBAAoB;AAClC,cAAc,mBAAmB","ignoreList":[]}
@@ -1,20 +1,20 @@
1
1
  "use strict";
2
2
 
3
3
  /**
4
- * Services Package Interfaces
4
+ * User Model
5
5
  *
6
- * Package-specific interfaces. For shared models (User, Session, etc.),
7
- * import directly from the shared module:
6
+ * IMPORTANT:
7
+ * - id: MongoDB ObjectId (24 hex characters) - PRIMARY IDENTIFIER for all internal operations
8
+ * - publicKey: Cryptographic public key (130 hex characters) - LOOKUP KEY for authentication and identity operations
8
9
  *
9
- * import { User, LoginResponse, Session } from '../shared';
10
+ * Never use publicKey as an ID. Always use id (ObjectId) for:
11
+ * - Database queries
12
+ * - Session userId
13
+ * - Token userId
14
+ * - Socket room names
15
+ * - API route parameters (unless explicitly doing publicKey lookup)
10
16
  */
11
17
 
12
- // Note: User and LoginResponse are in the shared module
13
- // Import them directly: import { User, LoginResponse } from '../shared';
14
-
15
- // Note: PaginationInfo and SearchProfilesResponse are in the shared module
16
- // Import them directly: import { PaginationInfo, SearchProfilesResponse } from '../shared';
17
-
18
18
  /**
19
19
  * File management interfaces
20
20
  */
@@ -69,5 +69,4 @@ export const SECURITY_EVENT_SEVERITY_MAP = {
69
69
  */
70
70
 
71
71
  // Device Session interfaces
72
- // Note: User type should be imported from the shared module
73
72
  //# sourceMappingURL=interfaces.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SECURITY_EVENT_SEVERITY_MAP"],"sourceRoot":"../../../src","sources":["models/interfaces.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAyBA;AACA;;AAyEA;AACA;;AAmEA;AACA;AACA;;AAmDA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAqGA;AACA;AACA;;AAqBA;AACA;AACA;;AAcA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMA,2BAA6E,GAAG;EAC3F,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,iBAAiB,EAAE,KAAK;EACxB,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,QAAQ;EACxB,gBAAgB,EAAE,QAAQ;EAC1B,2BAA2B,EAAE,QAAQ;EACrC,kBAAkB,EAAE,MAAM;EAC1B,sBAAsB,EAAE,MAAM;EAC9B,gBAAgB,EAAE,MAAM;EACxB,qBAAqB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;;AAeA;AACA;AACA;;AAkBA;AACA","ignoreList":[]}
1
+ {"version":3,"names":["SECURITY_EVENT_SEVERITY_MAP"],"sourceRoot":"../../../src","sources":["models/interfaces.ts"],"mappings":";;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmMA;AACA;AACA;;AAmDA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAuGA;AACA;AACA;;AAqBA;AACA;AACA;;AAcA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMA,2BAA6E,GAAG;EAC3F,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,iBAAiB,EAAE,KAAK;EACxB,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,QAAQ;EACxB,gBAAgB,EAAE,QAAQ;EAC1B,2BAA2B,EAAE,QAAQ;EACrC,kBAAkB,EAAE,MAAM;EAC1B,sBAAsB,EAAE,MAAM;EAC9B,gBAAgB,EAAE,MAAM;EACxB,qBAAqB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;;AAeA;AACA;AACA;;AAkBA","ignoreList":[]}
@@ -15,6 +15,9 @@ export { OxyServices, OXY_CLOUD_URL, oxyClient };
15
15
  export { Models }; // Export all models as a namespace
16
16
  export * from '../models/interfaces'; // Export all models directly
17
17
 
18
+ // ------------- Node-Specific Crypto Exports -------------
19
+ export { SignatureService } from './signatureService';
20
+
18
21
  // Default export for consistency or specific use cases if needed
19
22
  export default OxyServices;
20
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["OxyServices","OXY_CLOUD_URL","oxyClient","Models"],"sourceRoot":"../../../src","sources":["node/index.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SAASA,WAAW,EAAEC,aAAa,EAAEC,SAAS,QAAQ,SAAS,CAAC,CAAC;AACjE,OAAO,KAAKC,MAAM,MAAM,sBAAsB,CAAC,CAAC;;AAEhD;AACA,SAASH,WAAW,EAAEC,aAAa,EAAEC,SAAS;;AAE9C;AACA,SAASC,MAAM,GAAG,CAAE;AACpB,cAAc,sBAAsB,CAAC,CAAC;;AAEtC;AACA,eAAeH,WAAW","ignoreList":[]}
1
+ {"version":3,"names":["OxyServices","OXY_CLOUD_URL","oxyClient","Models","SignatureService"],"sourceRoot":"../../../src","sources":["node/index.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SAASA,WAAW,EAAEC,aAAa,EAAEC,SAAS,QAAQ,SAAS,CAAC,CAAC;AACjE,OAAO,KAAKC,MAAM,MAAM,sBAAsB,CAAC,CAAC;;AAEhD;AACA,SAASH,WAAW,EAAEC,aAAa,EAAEC,SAAS;;AAE9C;AACA,SAASC,MAAM,GAAG,CAAE;AACpB,cAAc,sBAAsB,CAAC,CAAC;;AAEtC;AACA,SAASC,gBAAgB,QAAQ,oBAAoB;;AAErD;AACA,eAAeJ,WAAW","ignoreList":[]}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Node.js Signature Service
5
+ *
6
+ * Provides synchronous signature operations for Node.js backend.
7
+ * Uses Node's crypto module for hashing and the shared core for verification.
8
+ */
9
+
10
+ import crypto from 'crypto';
11
+ import { verifySignatureCore, isValidPublicKey, isTimestampFresh, buildAuthMessage, buildRegistrationMessage, buildRequestMessage, shortenPublicKey, CHALLENGE_TTL_MS, MAX_SIGNATURE_AGE_MS } from '../crypto/core';
12
+ export class SignatureService {
13
+ /**
14
+ * Generate a random challenge string
15
+ */
16
+ static generateChallenge() {
17
+ return crypto.randomBytes(32).toString('hex');
18
+ }
19
+
20
+ /**
21
+ * Compute SHA-256 hash of a message (synchronous)
22
+ */
23
+ static hashMessage(message) {
24
+ return crypto.createHash('sha256').update(message).digest('hex');
25
+ }
26
+
27
+ /**
28
+ * Verify an ECDSA signature (synchronous)
29
+ *
30
+ * @param message - The original message that was signed
31
+ * @param signature - The signature in DER format (hex encoded)
32
+ * @param publicKey - The public key (hex encoded, uncompressed)
33
+ * @returns true if the signature is valid
34
+ */
35
+ static verifySignature(message, signature, publicKey) {
36
+ const messageHash = SignatureService.hashMessage(message);
37
+ return verifySignatureCore(messageHash, signature, publicKey);
38
+ }
39
+
40
+ /**
41
+ * Verify an authentication challenge response
42
+ *
43
+ * @param publicKey - The user's public key
44
+ * @param challenge - The original challenge string
45
+ * @param signature - The signature of the auth message
46
+ * @param timestamp - The timestamp when the signature was created
47
+ * @returns true if the challenge response is valid
48
+ */
49
+ static verifyChallengeResponse(publicKey, challenge, signature, timestamp) {
50
+ // Check timestamp is not too old
51
+ if (!isTimestampFresh(timestamp, CHALLENGE_TTL_MS)) {
52
+ return false;
53
+ }
54
+
55
+ // Build the message and verify signature
56
+ const message = buildAuthMessage(publicKey, challenge, timestamp);
57
+ return SignatureService.verifySignature(message, signature, publicKey);
58
+ }
59
+
60
+ /**
61
+ * Verify a registration signature
62
+ * Signature format: oxy:register:{publicKey}:{timestamp}
63
+ */
64
+ static verifyRegistrationSignature(publicKey, signature, timestamp) {
65
+ // Check timestamp freshness
66
+ if (!isTimestampFresh(timestamp, MAX_SIGNATURE_AGE_MS)) {
67
+ return false;
68
+ }
69
+ const message = buildRegistrationMessage(publicKey, timestamp);
70
+ return SignatureService.verifySignature(message, signature, publicKey);
71
+ }
72
+
73
+ /**
74
+ * Verify a signed request
75
+ * Used for authenticated API operations
76
+ */
77
+ static verifyRequestSignature(publicKey, data, signature, timestamp) {
78
+ // Check timestamp freshness
79
+ if (!isTimestampFresh(timestamp, MAX_SIGNATURE_AGE_MS)) {
80
+ return false;
81
+ }
82
+ const message = buildRequestMessage(publicKey, timestamp, data);
83
+ return SignatureService.verifySignature(message, signature, publicKey);
84
+ }
85
+
86
+ /**
87
+ * Validate that a string is a valid public key
88
+ */
89
+ static isValidPublicKey(publicKey) {
90
+ return isValidPublicKey(publicKey);
91
+ }
92
+
93
+ /**
94
+ * Get a shortened display version of a public key
95
+ */
96
+ static shortenPublicKey(publicKey) {
97
+ return shortenPublicKey(publicKey);
98
+ }
99
+ }
100
+ export default SignatureService;
101
+ //# sourceMappingURL=signatureService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["crypto","verifySignatureCore","isValidPublicKey","isTimestampFresh","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","shortenPublicKey","CHALLENGE_TTL_MS","MAX_SIGNATURE_AGE_MS","SignatureService","generateChallenge","randomBytes","toString","hashMessage","message","createHash","update","digest","verifySignature","signature","publicKey","messageHash","verifyChallengeResponse","challenge","timestamp","verifyRegistrationSignature","verifyRequestSignature","data"],"sourceRoot":"../../../src","sources":["node/signatureService.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,MAAM,MAAM,QAAQ;AAC3B,SACEC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,wBAAwB,EACxBC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,oBAAoB,QACf,gBAAgB;AAEvB,OAAO,MAAMC,gBAAgB,CAAC;EAC5B;AACF;AACA;EACE,OAAOC,iBAAiBA,CAAA,EAAW;IACjC,OAAOX,MAAM,CAACY,WAAW,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,KAAK,CAAC;EAC/C;;EAEA;AACF;AACA;EACE,OAAOC,WAAWA,CAACC,OAAe,EAAU;IAC1C,OAAOf,MAAM,CAACgB,UAAU,CAAC,QAAQ,CAAC,CAACC,MAAM,CAACF,OAAO,CAAC,CAACG,MAAM,CAAC,KAAK,CAAC;EAClE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,eAAeA,CAACJ,OAAe,EAAEK,SAAiB,EAAEC,SAAiB,EAAW;IACrF,MAAMC,WAAW,GAAGZ,gBAAgB,CAACI,WAAW,CAACC,OAAO,CAAC;IACzD,OAAOd,mBAAmB,CAACqB,WAAW,EAAEF,SAAS,EAAEC,SAAS,CAAC;EAC/D;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOE,uBAAuBA,CAC5BF,SAAiB,EACjBG,SAAiB,EACjBJ,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEjB,gBAAgB,CAAC,EAAE;MAClD,OAAO,KAAK;IACd;;IAEA;IACA,MAAMO,OAAO,GAAGX,gBAAgB,CAACiB,SAAS,EAAEG,SAAS,EAAEC,SAAS,CAAC;IACjE,OAAOf,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;AACA;EACE,OAAOK,2BAA2BA,CAChCL,SAAiB,EACjBD,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEhB,oBAAoB,CAAC,EAAE;MACtD,OAAO,KAAK;IACd;IAEA,MAAMM,OAAO,GAAGV,wBAAwB,CAACgB,SAAS,EAAEI,SAAS,CAAC;IAC9D,OAAOf,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;AACA;EACE,OAAOM,sBAAsBA,CAC3BN,SAAiB,EACjBO,IAA6B,EAC7BR,SAAiB,EACjBK,SAAiB,EACR;IACT;IACA,IAAI,CAACtB,gBAAgB,CAACsB,SAAS,EAAEhB,oBAAoB,CAAC,EAAE;MACtD,OAAO,KAAK;IACd;IAEA,MAAMM,OAAO,GAAGT,mBAAmB,CAACe,SAAS,EAAEI,SAAS,EAAEG,IAAI,CAAC;IAC/D,OAAOlB,gBAAgB,CAACS,eAAe,CAACJ,OAAO,EAAEK,SAAS,EAAEC,SAAS,CAAC;EACxE;;EAEA;AACF;AACA;EACE,OAAOnB,gBAAgBA,CAACmB,SAAiB,EAAW;IAClD,OAAOnB,gBAAgB,CAACmB,SAAS,CAAC;EACpC;;EAEA;AACF;AACA;EACE,OAAOd,gBAAgBA,CAACc,SAAiB,EAAU;IACjD,OAAOd,gBAAgB,CAACc,SAAS,CAAC;EACpC;AACF;AAEA,eAAeX,gBAAgB","ignoreList":[]}
@@ -467,9 +467,21 @@ export const OxyProvider = ({
467
467
  }
468
468
  setTokenReady(false);
469
469
  try {
470
+ // CRITICAL: Get current identity's public key first
471
+ // Only restore sessions that belong to this identity
472
+ const currentPublicKey = await KeyManager.getPublicKey().catch(() => null);
470
473
  const storedSessionIdsJson = await storage.getItem(storageKeys.sessionIds);
471
474
  const storedSessionIds = storedSessionIdsJson ? JSON.parse(storedSessionIdsJson) : [];
472
475
  const storedActiveSessionId = await storage.getItem(storageKeys.activeSessionId);
476
+
477
+ // If no identity exists, clear all sessions and return
478
+ if (!currentPublicKey) {
479
+ if (storedSessionIds.length > 0 || storedActiveSessionId) {
480
+ await clearSessionState();
481
+ }
482
+ setTokenReady(true);
483
+ return;
484
+ }
473
485
  const validSessions = [];
474
486
  if (storedSessionIds.length > 0) {
475
487
  for (const sessionId of storedSessionIds) {
@@ -478,6 +490,17 @@ export const OxyProvider = ({
478
490
  useHeaderValidation: true
479
491
  });
480
492
  if (validation?.valid && validation.user) {
493
+ // CRITICAL: Verify session belongs to current identity
494
+ // IMPORTANT: In OxyAccounts, user.id is set to the publicKey (as confirmed by line 754 comment below)
495
+ // This is different from the JWT's userId field which contains MongoDB ObjectId
496
+ // We compare user.id (publicKey) to currentPublicKey to ensure session ownership
497
+ if (validation.user.id !== currentPublicKey) {
498
+ // Session belongs to different identity - skip it
499
+ if (__DEV__) {
500
+ logger('Skipping session from different identity during restoration');
501
+ }
502
+ continue;
503
+ }
481
504
  const now = new Date();
482
505
  validSessions.push({
483
506
  sessionId,