@protontech/drive-sdk 0.0.10

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 (594) hide show
  1. package/README.md +17 -0
  2. package/dist/cache/index.d.ts +2 -0
  3. package/dist/cache/index.js +6 -0
  4. package/dist/cache/index.js.map +1 -0
  5. package/dist/cache/interface.d.ts +105 -0
  6. package/dist/cache/interface.js +3 -0
  7. package/dist/cache/interface.js.map +1 -0
  8. package/dist/cache/memoryCache.d.ts +18 -0
  9. package/dist/cache/memoryCache.js +78 -0
  10. package/dist/cache/memoryCache.js.map +1 -0
  11. package/dist/cache/memoryCache.test.d.ts +1 -0
  12. package/dist/cache/memoryCache.test.js +121 -0
  13. package/dist/cache/memoryCache.test.js.map +1 -0
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.js +11 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/crypto/driveCrypto.d.ts +209 -0
  18. package/dist/crypto/driveCrypto.js +364 -0
  19. package/dist/crypto/driveCrypto.js.map +1 -0
  20. package/dist/crypto/driveCrypto.test.d.ts +1 -0
  21. package/dist/crypto/driveCrypto.test.js +42 -0
  22. package/dist/crypto/driveCrypto.test.js.map +1 -0
  23. package/dist/crypto/hmac.d.ts +22 -0
  24. package/dist/crypto/hmac.js +44 -0
  25. package/dist/crypto/hmac.js.map +1 -0
  26. package/dist/crypto/index.d.ts +6 -0
  27. package/dist/crypto/index.js +13 -0
  28. package/dist/crypto/index.js.map +1 -0
  29. package/dist/crypto/interface.d.ts +125 -0
  30. package/dist/crypto/interface.js +10 -0
  31. package/dist/crypto/interface.js.map +1 -0
  32. package/dist/crypto/openPGPCrypto.d.ts +145 -0
  33. package/dist/crypto/openPGPCrypto.js +250 -0
  34. package/dist/crypto/openPGPCrypto.js.map +1 -0
  35. package/dist/crypto/utils.d.ts +2 -0
  36. package/dist/crypto/utils.js +35 -0
  37. package/dist/crypto/utils.js.map +1 -0
  38. package/dist/errors.d.ts +138 -0
  39. package/dist/errors.js +163 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +24 -0
  42. package/dist/index.js +48 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/interface/account.d.ts +36 -0
  45. package/dist/interface/account.js +3 -0
  46. package/dist/interface/account.js.map +1 -0
  47. package/dist/interface/author.d.ts +26 -0
  48. package/dist/interface/author.js +3 -0
  49. package/dist/interface/author.js.map +1 -0
  50. package/dist/interface/devices.d.ts +18 -0
  51. package/dist/interface/devices.js +10 -0
  52. package/dist/interface/devices.js.map +1 -0
  53. package/dist/interface/download.d.ts +29 -0
  54. package/dist/interface/download.js +3 -0
  55. package/dist/interface/download.js.map +1 -0
  56. package/dist/interface/events.d.ts +26 -0
  57. package/dist/interface/events.js +11 -0
  58. package/dist/interface/events.js.map +1 -0
  59. package/dist/interface/httpClient.d.ts +38 -0
  60. package/dist/interface/httpClient.js +3 -0
  61. package/dist/interface/httpClient.js.map +1 -0
  62. package/dist/interface/index.d.ts +43 -0
  63. package/dist/interface/index.js +22 -0
  64. package/dist/interface/index.js.map +1 -0
  65. package/dist/interface/nodes.d.ts +161 -0
  66. package/dist/interface/nodes.js +21 -0
  67. package/dist/interface/nodes.js.map +1 -0
  68. package/dist/interface/result.d.ts +9 -0
  69. package/dist/interface/result.js +11 -0
  70. package/dist/interface/result.js.map +1 -0
  71. package/dist/interface/sharing.d.ts +73 -0
  72. package/dist/interface/sharing.js +9 -0
  73. package/dist/interface/sharing.js.map +1 -0
  74. package/dist/interface/telemetry.d.ts +61 -0
  75. package/dist/interface/telemetry.js +18 -0
  76. package/dist/interface/telemetry.js.map +1 -0
  77. package/dist/interface/thumbnail.d.ts +17 -0
  78. package/dist/interface/thumbnail.js +9 -0
  79. package/dist/interface/thumbnail.js.map +1 -0
  80. package/dist/interface/upload.d.ts +16 -0
  81. package/dist/interface/upload.js +3 -0
  82. package/dist/interface/upload.js.map +1 -0
  83. package/dist/internal/apiService/apiService.d.ts +51 -0
  84. package/dist/internal/apiService/apiService.js +305 -0
  85. package/dist/internal/apiService/apiService.js.map +1 -0
  86. package/dist/internal/apiService/apiService.test.d.ts +1 -0
  87. package/dist/internal/apiService/apiService.test.js +237 -0
  88. package/dist/internal/apiService/apiService.test.js.map +1 -0
  89. package/dist/internal/apiService/coreTypes.d.ts +24438 -0
  90. package/dist/internal/apiService/coreTypes.js +7 -0
  91. package/dist/internal/apiService/coreTypes.js.map +1 -0
  92. package/dist/internal/apiService/driveTypes.d.ts +11840 -0
  93. package/dist/internal/apiService/driveTypes.js +7 -0
  94. package/dist/internal/apiService/driveTypes.js.map +1 -0
  95. package/dist/internal/apiService/errorCodes.d.ts +30 -0
  96. package/dist/internal/apiService/errorCodes.js +11 -0
  97. package/dist/internal/apiService/errorCodes.js.map +1 -0
  98. package/dist/internal/apiService/errors.d.ts +19 -0
  99. package/dist/internal/apiService/errors.js +76 -0
  100. package/dist/internal/apiService/errors.js.map +1 -0
  101. package/dist/internal/apiService/errors.test.d.ts +1 -0
  102. package/dist/internal/apiService/errors.test.js +69 -0
  103. package/dist/internal/apiService/errors.test.js.map +1 -0
  104. package/dist/internal/apiService/index.d.ts +7 -0
  105. package/dist/internal/apiService/index.js +30 -0
  106. package/dist/internal/apiService/index.js.map +1 -0
  107. package/dist/internal/apiService/observerStream.d.ts +3 -0
  108. package/dist/internal/apiService/observerStream.js +15 -0
  109. package/dist/internal/apiService/observerStream.js.map +1 -0
  110. package/dist/internal/apiService/transformers.d.ts +4 -0
  111. package/dist/internal/apiService/transformers.js +48 -0
  112. package/dist/internal/apiService/transformers.js.map +1 -0
  113. package/dist/internal/batchLoading.d.ts +34 -0
  114. package/dist/internal/batchLoading.js +68 -0
  115. package/dist/internal/batchLoading.js.map +1 -0
  116. package/dist/internal/batchLoading.test.d.ts +1 -0
  117. package/dist/internal/batchLoading.test.js +50 -0
  118. package/dist/internal/batchLoading.test.js.map +1 -0
  119. package/dist/internal/devices/apiService.d.ts +38 -0
  120. package/dist/internal/devices/apiService.js +105 -0
  121. package/dist/internal/devices/apiService.js.map +1 -0
  122. package/dist/internal/devices/cryptoService.d.ts +30 -0
  123. package/dist/internal/devices/cryptoService.js +47 -0
  124. package/dist/internal/devices/cryptoService.js.map +1 -0
  125. package/dist/internal/devices/index.d.ts +15 -0
  126. package/dist/internal/devices/index.js +22 -0
  127. package/dist/internal/devices/index.js.map +1 -0
  128. package/dist/internal/devices/interface.d.ts +31 -0
  129. package/dist/internal/devices/interface.js +3 -0
  130. package/dist/internal/devices/interface.js.map +1 -0
  131. package/dist/internal/devices/manager.d.ts +18 -0
  132. package/dist/internal/devices/manager.js +103 -0
  133. package/dist/internal/devices/manager.js.map +1 -0
  134. package/dist/internal/devices/manager.test.d.ts +1 -0
  135. package/dist/internal/devices/manager.test.js +100 -0
  136. package/dist/internal/devices/manager.test.js.map +1 -0
  137. package/dist/internal/download/apiService.d.ts +27 -0
  138. package/dist/internal/download/apiService.js +110 -0
  139. package/dist/internal/download/apiService.js.map +1 -0
  140. package/dist/internal/download/controller.d.ts +8 -0
  141. package/dist/internal/download/controller.js +22 -0
  142. package/dist/internal/download/controller.js.map +1 -0
  143. package/dist/internal/download/cryptoService.d.ts +17 -0
  144. package/dist/internal/download/cryptoService.js +82 -0
  145. package/dist/internal/download/cryptoService.js.map +1 -0
  146. package/dist/internal/download/fileDownloader.d.ts +33 -0
  147. package/dist/internal/download/fileDownloader.js +226 -0
  148. package/dist/internal/download/fileDownloader.js.map +1 -0
  149. package/dist/internal/download/fileDownloader.test.d.ts +1 -0
  150. package/dist/internal/download/fileDownloader.test.js +324 -0
  151. package/dist/internal/download/fileDownloader.test.js.map +1 -0
  152. package/dist/internal/download/index.d.ts +10 -0
  153. package/dist/internal/download/index.js +82 -0
  154. package/dist/internal/download/index.js.map +1 -0
  155. package/dist/internal/download/interface.d.ts +35 -0
  156. package/dist/internal/download/interface.js +3 -0
  157. package/dist/internal/download/interface.js.map +1 -0
  158. package/dist/internal/download/queue.d.ts +5 -0
  159. package/dist/internal/download/queue.js +31 -0
  160. package/dist/internal/download/queue.js.map +1 -0
  161. package/dist/internal/download/telemetry.d.ts +14 -0
  162. package/dist/internal/download/telemetry.js +106 -0
  163. package/dist/internal/download/telemetry.js.map +1 -0
  164. package/dist/internal/download/telemetry.test.d.ts +1 -0
  165. package/dist/internal/download/telemetry.test.js +111 -0
  166. package/dist/internal/download/telemetry.test.js.map +1 -0
  167. package/dist/internal/download/thumbnailDownloader.d.ts +19 -0
  168. package/dist/internal/download/thumbnailDownloader.js +198 -0
  169. package/dist/internal/download/thumbnailDownloader.js.map +1 -0
  170. package/dist/internal/download/thumbnailDownloader.test.d.ts +1 -0
  171. package/dist/internal/download/thumbnailDownloader.test.js +179 -0
  172. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -0
  173. package/dist/internal/errors.d.ts +6 -0
  174. package/dist/internal/errors.js +28 -0
  175. package/dist/internal/errors.js.map +1 -0
  176. package/dist/internal/errors.test.d.ts +1 -0
  177. package/dist/internal/errors.test.js +22 -0
  178. package/dist/internal/errors.test.js.map +1 -0
  179. package/dist/internal/events/apiService.d.ts +18 -0
  180. package/dist/internal/events/apiService.js +81 -0
  181. package/dist/internal/events/apiService.js.map +1 -0
  182. package/dist/internal/events/cache.d.ts +28 -0
  183. package/dist/internal/events/cache.js +67 -0
  184. package/dist/internal/events/cache.js.map +1 -0
  185. package/dist/internal/events/cache.test.d.ts +1 -0
  186. package/dist/internal/events/cache.test.js +43 -0
  187. package/dist/internal/events/cache.test.js.map +1 -0
  188. package/dist/internal/events/coreEventManager.d.ts +25 -0
  189. package/dist/internal/events/coreEventManager.js +63 -0
  190. package/dist/internal/events/coreEventManager.js.map +1 -0
  191. package/dist/internal/events/eventManager.d.ts +62 -0
  192. package/dist/internal/events/eventManager.js +159 -0
  193. package/dist/internal/events/eventManager.js.map +1 -0
  194. package/dist/internal/events/eventManager.test.d.ts +1 -0
  195. package/dist/internal/events/eventManager.test.js +120 -0
  196. package/dist/internal/events/eventManager.test.js.map +1 -0
  197. package/dist/internal/events/index.d.ts +50 -0
  198. package/dist/internal/events/index.js +117 -0
  199. package/dist/internal/events/index.js.map +1 -0
  200. package/dist/internal/events/interface.d.ts +47 -0
  201. package/dist/internal/events/interface.js +12 -0
  202. package/dist/internal/events/interface.js.map +1 -0
  203. package/dist/internal/events/volumeEventManager.d.ts +27 -0
  204. package/dist/internal/events/volumeEventManager.js +69 -0
  205. package/dist/internal/events/volumeEventManager.js.map +1 -0
  206. package/dist/internal/nodes/apiService.d.ts +54 -0
  207. package/dist/internal/nodes/apiService.js +308 -0
  208. package/dist/internal/nodes/apiService.js.map +1 -0
  209. package/dist/internal/nodes/apiService.test.d.ts +1 -0
  210. package/dist/internal/nodes/apiService.test.js +344 -0
  211. package/dist/internal/nodes/apiService.test.js.map +1 -0
  212. package/dist/internal/nodes/cache.d.ts +57 -0
  213. package/dist/internal/nodes/cache.js +226 -0
  214. package/dist/internal/nodes/cache.js.map +1 -0
  215. package/dist/internal/nodes/cache.test.d.ts +1 -0
  216. package/dist/internal/nodes/cache.test.js +160 -0
  217. package/dist/internal/nodes/cache.test.js.map +1 -0
  218. package/dist/internal/nodes/cryptoCache.d.ts +16 -0
  219. package/dist/internal/nodes/cryptoCache.js +50 -0
  220. package/dist/internal/nodes/cryptoCache.js.map +1 -0
  221. package/dist/internal/nodes/cryptoCache.test.d.ts +1 -0
  222. package/dist/internal/nodes/cryptoCache.test.js +79 -0
  223. package/dist/internal/nodes/cryptoCache.test.js.map +1 -0
  224. package/dist/internal/nodes/cryptoService.d.ts +75 -0
  225. package/dist/internal/nodes/cryptoService.js +409 -0
  226. package/dist/internal/nodes/cryptoService.js.map +1 -0
  227. package/dist/internal/nodes/cryptoService.test.d.ts +1 -0
  228. package/dist/internal/nodes/cryptoService.test.js +698 -0
  229. package/dist/internal/nodes/cryptoService.test.js.map +1 -0
  230. package/dist/internal/nodes/events.d.ts +91 -0
  231. package/dist/internal/nodes/events.js +243 -0
  232. package/dist/internal/nodes/events.js.map +1 -0
  233. package/dist/internal/nodes/events.test.d.ts +1 -0
  234. package/dist/internal/nodes/events.test.js +318 -0
  235. package/dist/internal/nodes/events.test.js.map +1 -0
  236. package/dist/internal/nodes/extendedAttributes.d.ts +23 -0
  237. package/dist/internal/nodes/extendedAttributes.js +117 -0
  238. package/dist/internal/nodes/extendedAttributes.js.map +1 -0
  239. package/dist/internal/nodes/extendedAttributes.test.d.ts +1 -0
  240. package/dist/internal/nodes/extendedAttributes.test.js +176 -0
  241. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -0
  242. package/dist/internal/nodes/index.d.ts +26 -0
  243. package/dist/internal/nodes/index.js +40 -0
  244. package/dist/internal/nodes/index.js.map +1 -0
  245. package/dist/internal/nodes/index.test.d.ts +1 -0
  246. package/dist/internal/nodes/index.test.js +112 -0
  247. package/dist/internal/nodes/index.test.js.map +1 -0
  248. package/dist/internal/nodes/interface.d.ts +135 -0
  249. package/dist/internal/nodes/interface.js +3 -0
  250. package/dist/internal/nodes/interface.js.map +1 -0
  251. package/dist/internal/nodes/mediaTypes.d.ts +2 -0
  252. package/dist/internal/nodes/mediaTypes.js +13 -0
  253. package/dist/internal/nodes/mediaTypes.js.map +1 -0
  254. package/dist/internal/nodes/nodesAccess.d.ts +49 -0
  255. package/dist/internal/nodes/nodesAccess.js +332 -0
  256. package/dist/internal/nodes/nodesAccess.js.map +1 -0
  257. package/dist/internal/nodes/nodesAccess.test.d.ts +1 -0
  258. package/dist/internal/nodes/nodesAccess.test.js +487 -0
  259. package/dist/internal/nodes/nodesAccess.test.js.map +1 -0
  260. package/dist/internal/nodes/nodesManagement.d.ts +33 -0
  261. package/dist/internal/nodes/nodesManagement.js +222 -0
  262. package/dist/internal/nodes/nodesManagement.js.map +1 -0
  263. package/dist/internal/nodes/nodesManagement.test.d.ts +1 -0
  264. package/dist/internal/nodes/nodesManagement.test.js +178 -0
  265. package/dist/internal/nodes/nodesManagement.test.js.map +1 -0
  266. package/dist/internal/nodes/nodesRevisions.d.ts +18 -0
  267. package/dist/internal/nodes/nodesRevisions.js +55 -0
  268. package/dist/internal/nodes/nodesRevisions.js.map +1 -0
  269. package/dist/internal/nodes/validations.d.ts +4 -0
  270. package/dist/internal/nodes/validations.js +21 -0
  271. package/dist/internal/nodes/validations.js.map +1 -0
  272. package/dist/internal/photos/albums.d.ts +13 -0
  273. package/dist/internal/photos/albums.js +30 -0
  274. package/dist/internal/photos/albums.js.map +1 -0
  275. package/dist/internal/photos/apiService.d.ts +8 -0
  276. package/dist/internal/photos/apiService.js +18 -0
  277. package/dist/internal/photos/apiService.js.map +1 -0
  278. package/dist/internal/photos/cache.d.ts +6 -0
  279. package/dist/internal/photos/cache.js +15 -0
  280. package/dist/internal/photos/cache.js.map +1 -0
  281. package/dist/internal/photos/index.d.ts +9 -0
  282. package/dist/internal/photos/index.js +18 -0
  283. package/dist/internal/photos/index.js.map +1 -0
  284. package/dist/internal/photos/interface.d.ts +6 -0
  285. package/dist/internal/photos/interface.js +3 -0
  286. package/dist/internal/photos/interface.js.map +1 -0
  287. package/dist/internal/photos/photosTimeline.d.ts +10 -0
  288. package/dist/internal/photos/photosTimeline.js +20 -0
  289. package/dist/internal/photos/photosTimeline.js.map +1 -0
  290. package/dist/internal/sdkEvents.d.ts +12 -0
  291. package/dist/internal/sdkEvents.js +44 -0
  292. package/dist/internal/sdkEvents.js.map +1 -0
  293. package/dist/internal/sdkEvents.test.d.ts +1 -0
  294. package/dist/internal/sdkEvents.test.js +45 -0
  295. package/dist/internal/sdkEvents.test.js.map +1 -0
  296. package/dist/internal/shares/apiService.d.ts +51 -0
  297. package/dist/internal/shares/apiService.js +128 -0
  298. package/dist/internal/shares/apiService.js.map +1 -0
  299. package/dist/internal/shares/cache.d.ts +15 -0
  300. package/dist/internal/shares/cache.js +63 -0
  301. package/dist/internal/shares/cache.js.map +1 -0
  302. package/dist/internal/shares/cache.test.d.ts +1 -0
  303. package/dist/internal/shares/cache.test.js +54 -0
  304. package/dist/internal/shares/cache.test.js.map +1 -0
  305. package/dist/internal/shares/cryptoCache.d.ts +20 -0
  306. package/dist/internal/shares/cryptoCache.js +35 -0
  307. package/dist/internal/shares/cryptoCache.js.map +1 -0
  308. package/dist/internal/shares/cryptoCache.test.d.ts +1 -0
  309. package/dist/internal/shares/cryptoCache.test.js +58 -0
  310. package/dist/internal/shares/cryptoCache.test.js.map +1 -0
  311. package/dist/internal/shares/cryptoService.d.ts +42 -0
  312. package/dist/internal/shares/cryptoService.js +126 -0
  313. package/dist/internal/shares/cryptoService.js.map +1 -0
  314. package/dist/internal/shares/cryptoService.test.d.ts +1 -0
  315. package/dist/internal/shares/cryptoService.test.js +120 -0
  316. package/dist/internal/shares/cryptoService.test.js.map +1 -0
  317. package/dist/internal/shares/index.d.ts +15 -0
  318. package/dist/internal/shares/index.js +26 -0
  319. package/dist/internal/shares/index.js.map +1 -0
  320. package/dist/internal/shares/interface.d.ts +94 -0
  321. package/dist/internal/shares/interface.js +11 -0
  322. package/dist/internal/shares/interface.js.map +1 -0
  323. package/dist/internal/shares/manager.d.ts +68 -0
  324. package/dist/internal/shares/manager.js +186 -0
  325. package/dist/internal/shares/manager.js.map +1 -0
  326. package/dist/internal/shares/manager.test.d.ts +1 -0
  327. package/dist/internal/shares/manager.test.js +176 -0
  328. package/dist/internal/shares/manager.test.js.map +1 -0
  329. package/dist/internal/sharing/apiService.d.ts +80 -0
  330. package/dist/internal/sharing/apiService.js +325 -0
  331. package/dist/internal/sharing/apiService.js.map +1 -0
  332. package/dist/internal/sharing/cache.d.ts +37 -0
  333. package/dist/internal/sharing/cache.js +105 -0
  334. package/dist/internal/sharing/cache.js.map +1 -0
  335. package/dist/internal/sharing/cache.test.d.ts +1 -0
  336. package/dist/internal/sharing/cache.test.js +82 -0
  337. package/dist/internal/sharing/cache.test.js.map +1 -0
  338. package/dist/internal/sharing/cryptoService.d.ts +112 -0
  339. package/dist/internal/sharing/cryptoService.js +269 -0
  340. package/dist/internal/sharing/cryptoService.js.map +1 -0
  341. package/dist/internal/sharing/events.d.ts +57 -0
  342. package/dist/internal/sharing/events.js +153 -0
  343. package/dist/internal/sharing/events.js.map +1 -0
  344. package/dist/internal/sharing/events.test.d.ts +1 -0
  345. package/dist/internal/sharing/events.test.js +246 -0
  346. package/dist/internal/sharing/events.test.js.map +1 -0
  347. package/dist/internal/sharing/index.d.ts +20 -0
  348. package/dist/internal/sharing/index.js +30 -0
  349. package/dist/internal/sharing/index.js.map +1 -0
  350. package/dist/internal/sharing/interface.d.ts +169 -0
  351. package/dist/internal/sharing/interface.js +9 -0
  352. package/dist/internal/sharing/interface.js.map +1 -0
  353. package/dist/internal/sharing/sharingAccess.d.ts +32 -0
  354. package/dist/internal/sharing/sharingAccess.js +119 -0
  355. package/dist/internal/sharing/sharingAccess.js.map +1 -0
  356. package/dist/internal/sharing/sharingAccess.test.d.ts +1 -0
  357. package/dist/internal/sharing/sharingAccess.test.js +84 -0
  358. package/dist/internal/sharing/sharingAccess.test.js.map +1 -0
  359. package/dist/internal/sharing/sharingManagement.d.ts +43 -0
  360. package/dist/internal/sharing/sharingManagement.js +439 -0
  361. package/dist/internal/sharing/sharingManagement.js.map +1 -0
  362. package/dist/internal/sharing/sharingManagement.test.d.ts +1 -0
  363. package/dist/internal/sharing/sharingManagement.test.js +788 -0
  364. package/dist/internal/sharing/sharingManagement.test.js.map +1 -0
  365. package/dist/internal/uids.d.ts +38 -0
  366. package/dist/internal/uids.js +85 -0
  367. package/dist/internal/uids.js.map +1 -0
  368. package/dist/internal/upload/apiService.d.ts +65 -0
  369. package/dist/internal/upload/apiService.js +137 -0
  370. package/dist/internal/upload/apiService.js.map +1 -0
  371. package/dist/internal/upload/blockVerifier.d.ts +16 -0
  372. package/dist/internal/upload/blockVerifier.js +33 -0
  373. package/dist/internal/upload/blockVerifier.js.map +1 -0
  374. package/dist/internal/upload/chunkStreamReader.d.ts +13 -0
  375. package/dist/internal/upload/chunkStreamReader.js +46 -0
  376. package/dist/internal/upload/chunkStreamReader.js.map +1 -0
  377. package/dist/internal/upload/chunkStreamReader.test.d.ts +1 -0
  378. package/dist/internal/upload/chunkStreamReader.test.js +75 -0
  379. package/dist/internal/upload/chunkStreamReader.test.js.map +1 -0
  380. package/dist/internal/upload/controller.d.ts +8 -0
  381. package/dist/internal/upload/controller.js +25 -0
  382. package/dist/internal/upload/controller.js.map +1 -0
  383. package/dist/internal/upload/cryptoService.d.ts +29 -0
  384. package/dist/internal/upload/cryptoService.js +104 -0
  385. package/dist/internal/upload/cryptoService.js.map +1 -0
  386. package/dist/internal/upload/digests.d.ts +8 -0
  387. package/dist/internal/upload/digests.js +22 -0
  388. package/dist/internal/upload/digests.js.map +1 -0
  389. package/dist/internal/upload/fileUploader.d.ts +65 -0
  390. package/dist/internal/upload/fileUploader.js +463 -0
  391. package/dist/internal/upload/fileUploader.js.map +1 -0
  392. package/dist/internal/upload/fileUploader.test.d.ts +1 -0
  393. package/dist/internal/upload/fileUploader.test.js +393 -0
  394. package/dist/internal/upload/fileUploader.test.js.map +1 -0
  395. package/dist/internal/upload/index.d.ts +16 -0
  396. package/dist/internal/upload/index.js +77 -0
  397. package/dist/internal/upload/index.js.map +1 -0
  398. package/dist/internal/upload/interface.d.ts +117 -0
  399. package/dist/internal/upload/interface.js +3 -0
  400. package/dist/internal/upload/interface.js.map +1 -0
  401. package/dist/internal/upload/manager.d.ts +31 -0
  402. package/dist/internal/upload/manager.js +250 -0
  403. package/dist/internal/upload/manager.js.map +1 -0
  404. package/dist/internal/upload/manager.test.d.ts +1 -0
  405. package/dist/internal/upload/manager.test.js +349 -0
  406. package/dist/internal/upload/manager.test.js.map +1 -0
  407. package/dist/internal/upload/queue.d.ts +5 -0
  408. package/dist/internal/upload/queue.js +32 -0
  409. package/dist/internal/upload/queue.js.map +1 -0
  410. package/dist/internal/upload/telemetry.d.ts +15 -0
  411. package/dist/internal/upload/telemetry.js +111 -0
  412. package/dist/internal/upload/telemetry.js.map +1 -0
  413. package/dist/internal/upload/telemetry.test.d.ts +1 -0
  414. package/dist/internal/upload/telemetry.test.js +107 -0
  415. package/dist/internal/upload/telemetry.test.js.map +1 -0
  416. package/dist/internal/utils.d.ts +1 -0
  417. package/dist/internal/utils.js +13 -0
  418. package/dist/internal/utils.js.map +1 -0
  419. package/dist/internal/wait.d.ts +3 -0
  420. package/dist/internal/wait.js +28 -0
  421. package/dist/internal/wait.js.map +1 -0
  422. package/dist/internal/wait.test.d.ts +1 -0
  423. package/dist/internal/wait.test.js +21 -0
  424. package/dist/internal/wait.test.js.map +1 -0
  425. package/dist/protonDriveClient.d.ts +593 -0
  426. package/dist/protonDriveClient.js +768 -0
  427. package/dist/protonDriveClient.js.map +1 -0
  428. package/dist/protonDrivePhotosClient.d.ts +16 -0
  429. package/dist/protonDrivePhotosClient.js +46 -0
  430. package/dist/protonDrivePhotosClient.js.map +1 -0
  431. package/dist/telemetry.d.ts +187 -0
  432. package/dist/telemetry.js +297 -0
  433. package/dist/telemetry.js.map +1 -0
  434. package/dist/tests/logger.d.ts +2 -0
  435. package/dist/tests/logger.js +12 -0
  436. package/dist/tests/logger.js.map +1 -0
  437. package/dist/tests/telemetry.d.ts +2 -0
  438. package/dist/tests/telemetry.js +11 -0
  439. package/dist/tests/telemetry.js.map +1 -0
  440. package/dist/transformers.d.ts +17 -0
  441. package/dist/transformers.js +77 -0
  442. package/dist/transformers.js.map +1 -0
  443. package/dist/version.d.ts +1 -0
  444. package/dist/version.js +6 -0
  445. package/dist/version.js.map +1 -0
  446. package/package.json +49 -0
  447. package/src/cache/index.ts +2 -0
  448. package/src/cache/interface.ts +104 -0
  449. package/src/cache/memoryCache.test.ts +150 -0
  450. package/src/cache/memoryCache.ts +85 -0
  451. package/src/config.ts +9 -0
  452. package/src/crypto/driveCrypto.test.ts +45 -0
  453. package/src/crypto/driveCrypto.ts +696 -0
  454. package/src/crypto/hmac.ts +46 -0
  455. package/src/crypto/index.ts +6 -0
  456. package/src/crypto/interface.ts +230 -0
  457. package/src/crypto/openPGPCrypto.ts +398 -0
  458. package/src/crypto/utils.ts +40 -0
  459. package/src/errors.ts +168 -0
  460. package/src/index.ts +30 -0
  461. package/src/interface/account.ts +38 -0
  462. package/src/interface/author.ts +29 -0
  463. package/src/interface/devices.ts +21 -0
  464. package/src/interface/download.ts +32 -0
  465. package/src/interface/events.ts +30 -0
  466. package/src/interface/httpClient.ts +42 -0
  467. package/src/interface/index.ts +46 -0
  468. package/src/interface/nodes.ts +168 -0
  469. package/src/interface/result.ts +11 -0
  470. package/src/interface/sharing.ts +87 -0
  471. package/src/interface/telemetry.ts +107 -0
  472. package/src/interface/thumbnail.ts +14 -0
  473. package/src/interface/upload.ts +19 -0
  474. package/src/internal/apiService/apiService.test.ts +285 -0
  475. package/src/internal/apiService/apiService.ts +353 -0
  476. package/src/internal/apiService/coreTypes.ts +24439 -0
  477. package/src/internal/apiService/driveTypes.ts +11841 -0
  478. package/src/internal/apiService/errorCodes.ts +38 -0
  479. package/src/internal/apiService/errors.test.ts +63 -0
  480. package/src/internal/apiService/errors.ts +91 -0
  481. package/src/internal/apiService/index.ts +7 -0
  482. package/src/internal/apiService/observerStream.ts +10 -0
  483. package/src/internal/apiService/transformers.ts +45 -0
  484. package/src/internal/batchLoading.test.ts +58 -0
  485. package/src/internal/batchLoading.ts +74 -0
  486. package/src/internal/devices/apiService.ts +142 -0
  487. package/src/internal/devices/cryptoService.ts +65 -0
  488. package/src/internal/devices/index.ts +31 -0
  489. package/src/internal/devices/interface.ts +28 -0
  490. package/src/internal/devices/manager.test.ts +129 -0
  491. package/src/internal/devices/manager.ts +113 -0
  492. package/src/internal/download/apiService.ts +145 -0
  493. package/src/internal/download/controller.ts +22 -0
  494. package/src/internal/download/cryptoService.ts +96 -0
  495. package/src/internal/download/fileDownloader.test.ts +381 -0
  496. package/src/internal/download/fileDownloader.ts +266 -0
  497. package/src/internal/download/index.ts +122 -0
  498. package/src/internal/download/interface.ts +38 -0
  499. package/src/internal/download/queue.ts +30 -0
  500. package/src/internal/download/telemetry.test.ts +134 -0
  501. package/src/internal/download/telemetry.ts +115 -0
  502. package/src/internal/download/thumbnailDownloader.test.ts +226 -0
  503. package/src/internal/download/thumbnailDownloader.ts +250 -0
  504. package/src/internal/errors.test.ts +21 -0
  505. package/src/internal/errors.ts +28 -0
  506. package/src/internal/events/apiService.ts +87 -0
  507. package/src/internal/events/cache.test.ts +47 -0
  508. package/src/internal/events/cache.ts +80 -0
  509. package/src/internal/events/coreEventManager.ts +69 -0
  510. package/src/internal/events/eventManager.test.ts +139 -0
  511. package/src/internal/events/eventManager.ts +168 -0
  512. package/src/internal/events/index.ts +131 -0
  513. package/src/internal/events/interface.ts +51 -0
  514. package/src/internal/events/volumeEventManager.ts +74 -0
  515. package/src/internal/nodes/apiService.test.ts +394 -0
  516. package/src/internal/nodes/apiService.ts +455 -0
  517. package/src/internal/nodes/cache.test.ts +197 -0
  518. package/src/internal/nodes/cache.ts +240 -0
  519. package/src/internal/nodes/cryptoCache.test.ts +92 -0
  520. package/src/internal/nodes/cryptoCache.ts +47 -0
  521. package/src/internal/nodes/cryptoService.test.ts +814 -0
  522. package/src/internal/nodes/cryptoService.ts +550 -0
  523. package/src/internal/nodes/events.test.ts +383 -0
  524. package/src/internal/nodes/events.ts +271 -0
  525. package/src/internal/nodes/extendedAttributes.test.ts +177 -0
  526. package/src/internal/nodes/extendedAttributes.ts +180 -0
  527. package/src/internal/nodes/index.test.ts +135 -0
  528. package/src/internal/nodes/index.ts +52 -0
  529. package/src/internal/nodes/interface.ts +152 -0
  530. package/src/internal/nodes/mediaTypes.ts +10 -0
  531. package/src/internal/nodes/nodesAccess.test.ts +555 -0
  532. package/src/internal/nodes/nodesAccess.ts +360 -0
  533. package/src/internal/nodes/nodesManagement.test.ts +221 -0
  534. package/src/internal/nodes/nodesManagement.ts +272 -0
  535. package/src/internal/nodes/nodesRevisions.ts +58 -0
  536. package/src/internal/nodes/validations.ts +26 -0
  537. package/src/internal/photos/albums.ts +29 -0
  538. package/src/internal/photos/apiService.ts +16 -0
  539. package/src/internal/photos/cache.ts +11 -0
  540. package/src/internal/photos/index.ts +23 -0
  541. package/src/internal/photos/interface.ts +7 -0
  542. package/src/internal/photos/photosTimeline.ts +18 -0
  543. package/src/internal/sdkEvents.test.ts +55 -0
  544. package/src/internal/sdkEvents.ts +52 -0
  545. package/src/internal/shares/apiService.ts +176 -0
  546. package/src/internal/shares/cache.test.ts +58 -0
  547. package/src/internal/shares/cache.ts +64 -0
  548. package/src/internal/shares/cryptoCache.test.ts +70 -0
  549. package/src/internal/shares/cryptoCache.ts +35 -0
  550. package/src/internal/shares/cryptoService.test.ts +137 -0
  551. package/src/internal/shares/cryptoService.ts +143 -0
  552. package/src/internal/shares/index.ts +35 -0
  553. package/src/internal/shares/interface.ts +104 -0
  554. package/src/internal/shares/manager.test.ts +210 -0
  555. package/src/internal/shares/manager.ts +213 -0
  556. package/src/internal/sharing/apiService.ts +483 -0
  557. package/src/internal/sharing/cache.test.ts +99 -0
  558. package/src/internal/sharing/cache.ts +109 -0
  559. package/src/internal/sharing/cryptoService.ts +378 -0
  560. package/src/internal/sharing/events.test.ts +268 -0
  561. package/src/internal/sharing/events.ts +166 -0
  562. package/src/internal/sharing/index.ts +43 -0
  563. package/src/internal/sharing/interface.ts +177 -0
  564. package/src/internal/sharing/sharingAccess.test.ts +102 -0
  565. package/src/internal/sharing/sharingAccess.ts +133 -0
  566. package/src/internal/sharing/sharingManagement.test.ts +895 -0
  567. package/src/internal/sharing/sharingManagement.ts +521 -0
  568. package/src/internal/uids.ts +83 -0
  569. package/src/internal/upload/apiService.ts +243 -0
  570. package/src/internal/upload/blockVerifier.ts +40 -0
  571. package/src/internal/upload/chunkStreamReader.test.ts +89 -0
  572. package/src/internal/upload/chunkStreamReader.ts +49 -0
  573. package/src/internal/upload/controller.ts +25 -0
  574. package/src/internal/upload/cryptoService.ts +162 -0
  575. package/src/internal/upload/digests.ts +18 -0
  576. package/src/internal/upload/fileUploader.test.ts +513 -0
  577. package/src/internal/upload/fileUploader.ts +576 -0
  578. package/src/internal/upload/index.ts +126 -0
  579. package/src/internal/upload/interface.ts +128 -0
  580. package/src/internal/upload/manager.test.ts +390 -0
  581. package/src/internal/upload/manager.ts +320 -0
  582. package/src/internal/upload/queue.ts +31 -0
  583. package/src/internal/upload/telemetry.test.ts +129 -0
  584. package/src/internal/upload/telemetry.ts +121 -0
  585. package/src/internal/utils.ts +9 -0
  586. package/src/internal/wait.test.ts +21 -0
  587. package/src/internal/wait.ts +26 -0
  588. package/src/protonDriveClient.ts +861 -0
  589. package/src/protonDrivePhotosClient.ts +56 -0
  590. package/src/telemetry.ts +346 -0
  591. package/src/tests/logger.ts +10 -0
  592. package/src/tests/telemetry.ts +9 -0
  593. package/src/transformers.ts +98 -0
  594. package/src/version.ts +4 -0
@@ -0,0 +1,696 @@
1
+ import { OpenPGPCrypto, PrivateKey, PublicKey, SessionKey, SRPModule, SRPVerifier, VERIFICATION_STATUS } from './interface';
2
+ import { uint8ArrayToBase64String, base64StringToUint8Array } from './utils';
3
+ // TODO: Switch to CryptoProxy module once available.
4
+ import { importHmacKey, computeHmacSignature } from "./hmac";
5
+
6
+ enum SIGNING_CONTEXTS {
7
+ SHARING_INVITER = 'drive.share-member.inviter',
8
+ SHARING_INVITER_EXTERNAL_INVITATION = 'drive.share-member.external-invitation',
9
+ SHARING_MEMBER = 'drive.share-member.member',
10
+ }
11
+
12
+ /**
13
+ * Drive crypto layer to provide general operations for Drive crypto.
14
+ *
15
+ * This layer focuses on providing general Drive crypto functions. Only
16
+ * high-level functions that are required on multiple places should be
17
+ * peresent. E.g., no specific implementation how keys are encrypted,
18
+ * but we do share same key generation across shares and nodes modules,
19
+ * for example, which we can generelise here and in each module just
20
+ * call with specific arguments.
21
+ */
22
+ export class DriveCrypto {
23
+ constructor(private openPGPCrypto: OpenPGPCrypto, private srpModule: SRPModule) {
24
+ this.openPGPCrypto = openPGPCrypto;
25
+ this.srpModule = srpModule;
26
+ }
27
+
28
+ /**
29
+ * It generates passphrase and key that is encrypted with the
30
+ * generated passphrase.
31
+ *
32
+ * `encrpytionKeys` are used to generate session key, which is
33
+ * also used to encrypt the passphrase. The encrypted passphrase
34
+ * is signed with `signingKey`.
35
+ *
36
+ * @returns Object with:
37
+ * - encrypted (armored) data (key, passphrase and passphrase
38
+ * signature) for sending to the server
39
+ * - decrypted data (key, sessionKey) for crypto usage
40
+ */
41
+ async generateKey(
42
+ encryptionKeys: PrivateKey[],
43
+ signingKey: PrivateKey,
44
+ ): Promise<{
45
+ encrypted: {
46
+ armoredKey: string,
47
+ armoredPassphrase: string,
48
+ armoredPassphraseSignature: string,
49
+ },
50
+ decrypted: {
51
+ passphrase: string,
52
+ key: PrivateKey,
53
+ passphraseSessionKey: SessionKey,
54
+ },
55
+ }> {
56
+ const passphrase = this.openPGPCrypto.generatePassphrase();
57
+ const [{ privateKey, armoredKey }, passphraseSessionKey] = await Promise.all([
58
+ this.openPGPCrypto.generateKey(passphrase),
59
+ this.openPGPCrypto.generateSessionKey(encryptionKeys),
60
+ ]);
61
+
62
+ const { armoredPassphrase, armoredPassphraseSignature } = await this.encryptPassphrase(
63
+ passphrase,
64
+ passphraseSessionKey,
65
+ encryptionKeys,
66
+ signingKey,
67
+ );
68
+
69
+ return {
70
+ encrypted: {
71
+ armoredKey,
72
+ armoredPassphrase,
73
+ armoredPassphraseSignature,
74
+ },
75
+ decrypted: {
76
+ passphrase,
77
+ key: privateKey,
78
+ passphraseSessionKey,
79
+ },
80
+ };
81
+ };
82
+
83
+ /**
84
+ * It generates content key from node key for encrypting file blocks.
85
+ *
86
+ * @param encryptionKey - Its own node key.
87
+ * @returns Object with serialised key packet and decrypted session key.
88
+ */
89
+ async generateContentKey(
90
+ encryptionKey: PrivateKey,
91
+ ): Promise<{
92
+ encrypted: {
93
+ base64ContentKeyPacket: string,
94
+ armoredContentKeyPacketSignature: string,
95
+ },
96
+ decrypted: {
97
+ contentKeyPacketSessionKey: SessionKey,
98
+ },
99
+ }> {
100
+ const contentKeyPacketSessionKey = await this.openPGPCrypto.generateSessionKey([encryptionKey]);
101
+ const { signature: armoredContentKeyPacketSignature } = await this.openPGPCrypto.signArmored(contentKeyPacketSessionKey.data, [encryptionKey]);
102
+ const { keyPacket } = await this.openPGPCrypto.encryptSessionKey(contentKeyPacketSessionKey, [encryptionKey]);
103
+
104
+ return {
105
+ encrypted: {
106
+ base64ContentKeyPacket: uint8ArrayToBase64String(keyPacket),
107
+ armoredContentKeyPacketSignature,
108
+ },
109
+ decrypted: {
110
+ contentKeyPacketSessionKey,
111
+ }
112
+ };
113
+ }
114
+
115
+ /**
116
+ * It encrypts passphrase with provided session and encryption keys.
117
+ * This should be used only for re-encrypting the passphrase with
118
+ * different key (e.g., moving the node to different parent).
119
+ *
120
+ * @returns Object with armored passphrase and passphrase signature.
121
+ */
122
+ async encryptPassphrase(
123
+ passphrase: string,
124
+ sessionKey: SessionKey,
125
+ encryptionKeys: PrivateKey[],
126
+ signingKey: PrivateKey,
127
+ ): Promise<{
128
+ armoredPassphrase: string,
129
+ armoredPassphraseSignature: string,
130
+ }> {
131
+ const { armoredData: armoredPassphrase, armoredSignature: armoredPassphraseSignature } = await this.openPGPCrypto.encryptAndSignDetachedArmored(
132
+ new TextEncoder().encode(passphrase),
133
+ sessionKey,
134
+ encryptionKeys,
135
+ signingKey,
136
+ );
137
+
138
+ return {
139
+ armoredPassphrase,
140
+ armoredPassphraseSignature,
141
+ };
142
+ }
143
+
144
+ /**
145
+ * It decrypts key generated via `generateKey`.
146
+ *
147
+ * Armored data are passed from the server. `decryptionKeys` are used
148
+ * to decrypt the session key from the `armoredPassphrase`. Then the
149
+ * session key is used with `verificationKeys` to decrypt and verify
150
+ * the passphrase. Finally, the armored key is decrypted.
151
+ *
152
+ * Note: The function doesn't throw in case of verification issue.
153
+ * You have to read `verified` result and act based on that.
154
+ *
155
+ * @returns key and sessionKey for crypto usage, and verification status
156
+ */
157
+ async decryptKey(
158
+ armoredKey: string,
159
+ armoredPassphrase: string,
160
+ armoredPassphraseSignature: string,
161
+ decryptionKeys: PrivateKey[],
162
+ verificationKeys: PublicKey[],
163
+ ): Promise<{
164
+ passphrase: string,
165
+ key: PrivateKey,
166
+ passphraseSessionKey: SessionKey,
167
+ verified: VERIFICATION_STATUS,
168
+ }> {
169
+ const passphraseSessionKey = await this.decryptSessionKey(armoredPassphrase, decryptionKeys);
170
+
171
+ const { data: decryptedPassphrase, verified } = await this.openPGPCrypto.decryptArmoredAndVerifyDetached(
172
+ armoredPassphrase,
173
+ armoredPassphraseSignature,
174
+ passphraseSessionKey,
175
+ verificationKeys,
176
+ );
177
+
178
+ const passphrase = uint8ArrayToUtf8(decryptedPassphrase);
179
+
180
+ const key = await this.openPGPCrypto.decryptKey(
181
+ armoredKey,
182
+ passphrase,
183
+ );
184
+ return {
185
+ passphrase,
186
+ key,
187
+ passphraseSessionKey,
188
+ verified,
189
+ };
190
+ }
191
+
192
+ /**
193
+ * It encrypts session key with provided encryption key.
194
+ */
195
+ async encryptSessionKey(
196
+ sessionKey: SessionKey,
197
+ encryptionKey: PublicKey,
198
+ ): Promise<{
199
+ base64KeyPacket: string,
200
+ }> {
201
+ const { keyPacket } = await this.openPGPCrypto.encryptSessionKey(sessionKey, [encryptionKey]);
202
+ return {
203
+ base64KeyPacket: uint8ArrayToBase64String(keyPacket),
204
+ }
205
+ }
206
+
207
+ /**
208
+ * It encrypts password with provided address key that can be used to
209
+ * manage the public link, encrypts share passphrase session key using
210
+ * provided bcrypt passphrase and generates SRP verifier.
211
+ */
212
+ async encryptPublicLinkPasswordAndSessionKey(
213
+ password: string,
214
+ addressKey: PrivateKey,
215
+ bcryptPassphrase: string,
216
+ sharePassphraseSessionKey: SessionKey,
217
+ ): Promise<{
218
+ armoredPassword: string,
219
+ base64SharePassphraseKeyPacket: string,
220
+ srp: SRPVerifier,
221
+ }> {
222
+ const [{ armoredData: armoredPassword }, { keyPacket }, srp] = await Promise.all([
223
+ this.openPGPCrypto.encryptArmored(new TextEncoder().encode(password), [addressKey]),
224
+ this.openPGPCrypto.encryptSessionKeyWithPassword(sharePassphraseSessionKey, bcryptPassphrase),
225
+ this.srpModule.getSrpVerifier(password),
226
+ ]);
227
+
228
+ return {
229
+ armoredPassword,
230
+ base64SharePassphraseKeyPacket: uint8ArrayToBase64String(keyPacket),
231
+ srp,
232
+ };
233
+ }
234
+
235
+ /**
236
+ * It decrypts session key from armored data.
237
+ *
238
+ * `decryptionKeys` are used to decrypt the session key from the `armoredData`.
239
+ */
240
+ async decryptSessionKey(
241
+ armoredData: string,
242
+ decryptionKeys: PrivateKey | PrivateKey[],
243
+ ): Promise<SessionKey> {
244
+ const sessionKey = await this.openPGPCrypto.decryptArmoredSessionKey(
245
+ armoredData,
246
+ decryptionKeys,
247
+ );
248
+ return sessionKey;
249
+ }
250
+
251
+ async decryptAndVerifySessionKey(
252
+ base64data: string,
253
+ armoredSignature: string | undefined,
254
+ decryptionKeys: PrivateKey | PrivateKey[],
255
+ verificationKeys: PublicKey[],
256
+ ): Promise<{
257
+ sessionKey: SessionKey,
258
+ verified?: VERIFICATION_STATUS,
259
+ }> {
260
+
261
+ const data = base64StringToUint8Array(base64data);
262
+
263
+ const sessionKey = await this.openPGPCrypto.decryptSessionKey(
264
+ data,
265
+ decryptionKeys,
266
+ );
267
+
268
+ let verified;
269
+ if (armoredSignature) {
270
+ const result = await this.openPGPCrypto.verify(sessionKey.data, armoredSignature, verificationKeys);
271
+ verified = result.verified;
272
+ }
273
+
274
+ return {
275
+ sessionKey,
276
+ verified,
277
+ }
278
+ }
279
+
280
+ /**
281
+ * It decrypts key similarly like `decryptKey`, but without signature
282
+ * verification. This is used for invitations.
283
+ */
284
+ async decryptUnsignedKey(
285
+ armoredKey: string,
286
+ armoredPassphrase: string,
287
+ decryptionKeys: PrivateKey | PrivateKey[],
288
+ ): Promise<PrivateKey> {
289
+ const { data: decryptedPassphrase } = await this.openPGPCrypto.decryptArmoredAndVerify(
290
+ armoredPassphrase,
291
+ decryptionKeys,
292
+ [],
293
+ );
294
+
295
+ const passphrase = uint8ArrayToUtf8(decryptedPassphrase);
296
+
297
+ const key = await this.openPGPCrypto.decryptKey(
298
+ armoredKey,
299
+ passphrase,
300
+ );
301
+
302
+ return key;
303
+ }
304
+
305
+ /**
306
+ * It encrypts and armors signature with provided session and encryption keys.
307
+ */
308
+ async encryptSignature(
309
+ signature: Uint8Array,
310
+ encryptionKey: PrivateKey,
311
+ sessionKey: SessionKey,
312
+ ): Promise<{
313
+ armoredSignature: string,
314
+ }> {
315
+ const { armoredData: armoredSignature } = await this.openPGPCrypto.encryptArmored(
316
+ signature,
317
+ [encryptionKey],
318
+ sessionKey,
319
+ );
320
+ return {
321
+ armoredSignature,
322
+ }
323
+ }
324
+
325
+ /**
326
+ * It generates random 32 bytes that are encrypted and signed with
327
+ * the provided key.
328
+ */
329
+ async generateHashKey(
330
+ encryptionAndSigningKey: PrivateKey,
331
+ ): Promise<{
332
+ armoredHashKey: string,
333
+ hashKey: Uint8Array,
334
+ }> {
335
+ // Once all clients can use non-ascii bytes, switch to simple
336
+ // generating of random bytes without encoding it into base64:
337
+ //const passphrase crypto.getRandomValues(new Uint8Array(32));
338
+ const passphrase = this.openPGPCrypto.generatePassphrase();
339
+ const hashKey = new TextEncoder().encode(passphrase);
340
+
341
+ const { armoredData: armoredHashKey } = await this.openPGPCrypto.encryptAndSignArmored(
342
+ hashKey,
343
+ undefined,
344
+ [encryptionAndSigningKey],
345
+ encryptionAndSigningKey,
346
+ );
347
+ return {
348
+ armoredHashKey,
349
+ hashKey,
350
+ }
351
+ }
352
+
353
+ async generateLookupHash(newName: string, parentHashKey: Uint8Array): Promise<string> {
354
+ const key = await importHmacKey(parentHashKey);
355
+
356
+ const signature = await computeHmacSignature(key, new TextEncoder().encode(newName));
357
+ return arrayToHexString(signature);
358
+ }
359
+
360
+ /**
361
+ * It converts node name into bytes array and encrypts and signs
362
+ * with provided keys.
363
+ *
364
+ * The function accepts either encryption or session key. Use encryption
365
+ * key if you want to encrypt the name for the new node. Use session key
366
+ * if you want to encrypt the new name for the existing node.
367
+ */
368
+ async encryptNodeName(
369
+ nodeName: string,
370
+ sessionKey: SessionKey | undefined,
371
+ encryptionKey: PrivateKey | undefined,
372
+ signingKey: PrivateKey,
373
+ ): Promise<{
374
+ armoredNodeName: string,
375
+ }> {
376
+ if (!sessionKey && !encryptionKey) {
377
+ throw new Error('Neither session nor encryption key provided for encrypting node name');
378
+ }
379
+
380
+ const { armoredData: armoredNodeName } = await this.openPGPCrypto.encryptAndSignArmored(
381
+ new TextEncoder().encode(nodeName),
382
+ sessionKey,
383
+ encryptionKey ? [encryptionKey] : [],
384
+ signingKey,
385
+ );
386
+ return {
387
+ armoredNodeName,
388
+ }
389
+ }
390
+
391
+ /**
392
+ * It decrypts armored node name and verifies embeded signature.
393
+ *
394
+ * Note: The function doesn't throw in case of verification issue.
395
+ * You have to read `verified` result and act based on that.
396
+ */
397
+ async decryptNodeName(
398
+ armoredNodeName: string,
399
+ decryptionKey: PrivateKey,
400
+ verificationKeys: PublicKey[],
401
+ ): Promise<{
402
+ name: string,
403
+ verified: VERIFICATION_STATUS,
404
+ }> {
405
+ const { data: name, verified } = await this.openPGPCrypto.decryptArmoredAndVerify(
406
+ armoredNodeName,
407
+ [decryptionKey],
408
+ verificationKeys,
409
+ );
410
+ return {
411
+ name: uint8ArrayToUtf8(name),
412
+ verified,
413
+ }
414
+ }
415
+
416
+ /**
417
+ * It decrypts armored node hash key and verifies embeded signature.
418
+ *
419
+ * Note: The function doesn't throw in case of verification issue.
420
+ * You have to read `verified` result and act based on that.
421
+ */
422
+ async decryptNodeHashKey(
423
+ armoredHashKey: string,
424
+ decryptionAndVerificationKey: PrivateKey,
425
+ extraVerificationKeys: PublicKey[],
426
+ ): Promise<{
427
+ hashKey: Uint8Array,
428
+ verified: VERIFICATION_STATUS,
429
+ }> {
430
+ // In the past, we had misunderstanding what key is used to sign hash
431
+ // key. Originally, it meant to be the node key, which web used for all
432
+ // nodes besides the root one, where address key was used instead.
433
+ // Similarly, iOS or Android used address key for all nodes. Latest
434
+ // versions should use node key in all cases, but we accept also
435
+ // address key. Its still signed with a valid key.
436
+ const { data: hashKey, verified } = await this.openPGPCrypto.decryptArmoredAndVerify(
437
+ armoredHashKey,
438
+ [decryptionAndVerificationKey],
439
+ [decryptionAndVerificationKey, ...extraVerificationKeys],
440
+ );
441
+ return {
442
+ hashKey,
443
+ verified,
444
+ };
445
+ }
446
+
447
+ async encryptExtendedAttributes(
448
+ extendedAttributes: string,
449
+ encryptionKey: PrivateKey,
450
+ signingKey: PrivateKey,
451
+ ): Promise<{
452
+ armoredExtendedAttributes: string,
453
+ }> {
454
+ const { armoredData: armoredExtendedAttributes } = await this.openPGPCrypto.encryptAndSignArmored(
455
+ new TextEncoder().encode(extendedAttributes),
456
+ undefined,
457
+ [encryptionKey],
458
+ signingKey,
459
+ );
460
+ return {
461
+ armoredExtendedAttributes,
462
+ };
463
+ }
464
+
465
+ async decryptExtendedAttributes(
466
+ armoreExtendedAttributes: string,
467
+ decryptionKey: PrivateKey,
468
+ verificationKeys: PublicKey[],
469
+ ): Promise<{
470
+ extendedAttributes: string,
471
+ verified: VERIFICATION_STATUS,
472
+ }> {
473
+ const { data: decryptedExtendedAttributes, verified } = await this.openPGPCrypto.decryptArmoredAndVerify(
474
+ armoreExtendedAttributes,
475
+ [decryptionKey],
476
+ verificationKeys,
477
+ );
478
+
479
+ return {
480
+ extendedAttributes: uint8ArrayToUtf8(decryptedExtendedAttributes),
481
+ verified,
482
+ };
483
+ }
484
+
485
+ async encryptInvitation(
486
+ shareSessionKey: SessionKey,
487
+ encryptionKey: PublicKey,
488
+ signingKey: PrivateKey,
489
+ ): Promise<{
490
+ base64KeyPacket: string,
491
+ base64KeyPacketSignature: string,
492
+ }> {
493
+ const { keyPacket } = await this.openPGPCrypto.encryptSessionKey(shareSessionKey, encryptionKey);
494
+ const { signature: keyPacketSignature } = await this.openPGPCrypto.sign(
495
+ keyPacket,
496
+ signingKey,
497
+ SIGNING_CONTEXTS.SHARING_INVITER,
498
+ )
499
+ return {
500
+ base64KeyPacket: uint8ArrayToBase64String(keyPacket),
501
+ base64KeyPacketSignature: uint8ArrayToBase64String(keyPacketSignature),
502
+ }
503
+ }
504
+
505
+ async acceptInvitation(
506
+ base64KeyPacket: string,
507
+ signingKey: PrivateKey,
508
+ ): Promise<{
509
+ base64SessionKeySignature: string,
510
+ }> {
511
+ const sessionKey = await this.decryptSessionKey(
512
+ base64KeyPacket,
513
+ signingKey,
514
+ );
515
+
516
+ const { signature } = await this.openPGPCrypto.sign(
517
+ sessionKey.data,
518
+ signingKey,
519
+ SIGNING_CONTEXTS.SHARING_MEMBER,
520
+ );
521
+
522
+ return {
523
+ base64SessionKeySignature: uint8ArrayToBase64String(signature),
524
+ }
525
+ }
526
+
527
+ async encryptExternalInvitation(
528
+ shareSessionKey: SessionKey,
529
+ signingKey: PrivateKey,
530
+ inviteeEmail: string,
531
+ ): Promise<{
532
+ base64ExternalInvitationSignature: string,
533
+ }> {
534
+ const data = inviteeEmail.concat('|').concat(uint8ArrayToBase64String(shareSessionKey.data));
535
+
536
+ const { signature: externalInviationSignature } = await this.openPGPCrypto.sign(
537
+ new TextEncoder().encode(data),
538
+ signingKey,
539
+ SIGNING_CONTEXTS.SHARING_INVITER_EXTERNAL_INVITATION,
540
+ )
541
+ return {
542
+ base64ExternalInvitationSignature: uint8ArrayToBase64String(externalInviationSignature),
543
+ }
544
+ }
545
+
546
+ async encryptThumbnailBlock(
547
+ thumbnailData: Uint8Array,
548
+ sessionKey: SessionKey,
549
+ signingKey: PrivateKey,
550
+ ): Promise<{
551
+ encryptedData: Uint8Array,
552
+ }> {
553
+ const { encryptedData } = await this.openPGPCrypto.encryptAndSign(
554
+ thumbnailData,
555
+ sessionKey,
556
+ [], // Thumbnails use the session key so we do not send encryption key.
557
+ signingKey,
558
+ );
559
+
560
+ return {
561
+ encryptedData,
562
+ };
563
+ }
564
+
565
+ async decryptThumbnailBlock(
566
+ encryptedThumbnail: Uint8Array,
567
+ sessionKey: SessionKey,
568
+ verificationKeys: PublicKey[],
569
+ ): Promise<{
570
+ decryptedThumbnail: Uint8Array,
571
+ verified: VERIFICATION_STATUS,
572
+ }> {
573
+ const { data: decryptedThumbnail, verified } = await this.openPGPCrypto.decryptAndVerify(
574
+ encryptedThumbnail,
575
+ sessionKey,
576
+ verificationKeys,
577
+ );
578
+ return {
579
+ decryptedThumbnail,
580
+ verified,
581
+ };
582
+ }
583
+
584
+ async encryptBlock(
585
+ blockData: Uint8Array,
586
+ encryptionKey: PrivateKey,
587
+ sessionKey: SessionKey,
588
+ signingKey: PrivateKey,
589
+ ): Promise<{
590
+ encryptedData: Uint8Array,
591
+ armoredSignature: string,
592
+ }> {
593
+ const { encryptedData, signature } = await this.openPGPCrypto.encryptAndSignDetached(
594
+ blockData,
595
+ sessionKey,
596
+ [], // Blocks use the session key so we do not send encryption key.
597
+ signingKey,
598
+ );
599
+
600
+ const { armoredSignature } = await this.encryptSignature(signature, encryptionKey, sessionKey);
601
+
602
+ return {
603
+ encryptedData,
604
+ armoredSignature,
605
+ };
606
+ }
607
+
608
+ async decryptBlock(
609
+ encryptedBlock: Uint8Array,
610
+ armoredSignature: string | undefined,
611
+ decryptionKey: PrivateKey,
612
+ sessionKey: SessionKey,
613
+ verificationKeys?: PublicKey[],
614
+ ): Promise<{
615
+ decryptedBlock: Uint8Array,
616
+ verified: VERIFICATION_STATUS,
617
+ }> {
618
+ const signature = armoredSignature ? await this.openPGPCrypto.decryptArmored(
619
+ armoredSignature,
620
+ [decryptionKey],
621
+ ) : undefined;
622
+
623
+ const { data: decryptedBlock, verified } = await this.openPGPCrypto.decryptAndVerifyDetached(
624
+ encryptedBlock,
625
+ signature,
626
+ sessionKey,
627
+ verificationKeys,
628
+ );
629
+
630
+ return {
631
+ decryptedBlock,
632
+ verified,
633
+ };
634
+ }
635
+
636
+ async signManifest(
637
+ manifest: Uint8Array,
638
+ signingKey: PrivateKey,
639
+ ): Promise<{
640
+ armoredManifestSignature: string,
641
+ }> {
642
+ const { signature: armoredManifestSignature } = await this.openPGPCrypto.signArmored(
643
+ manifest,
644
+ signingKey,
645
+ );
646
+ return {
647
+ armoredManifestSignature,
648
+ }
649
+ }
650
+
651
+ async verifyManifest(
652
+ manifest: Uint8Array,
653
+ armoredSignature: string,
654
+ verificationKeys: PublicKey | PublicKey[],
655
+ ): Promise<{
656
+ verified: VERIFICATION_STATUS,
657
+ }> {
658
+ const { verified } = await this.openPGPCrypto.verify(
659
+ manifest,
660
+ armoredSignature,
661
+ verificationKeys,
662
+ );
663
+ return {
664
+ verified,
665
+ }
666
+ }
667
+
668
+ async decryptShareUrlPassword(
669
+ armoredPassword: string,
670
+ decryptionKeys: PrivateKey[],
671
+ ): Promise<string> {
672
+ const password = await this.openPGPCrypto.decryptArmored(
673
+ armoredPassword,
674
+ decryptionKeys,
675
+ );
676
+ return uint8ArrayToUtf8(password);
677
+ }
678
+ }
679
+
680
+ export function uint8ArrayToUtf8(input: Uint8Array): string {
681
+ return new TextDecoder('utf-8', { fatal: true }).decode(input);
682
+ }
683
+
684
+ /**
685
+ * Convert an array of 8-bit integers to a hex string
686
+ * @param bytes - Array of 8-bit integers to convert
687
+ * @returns Hexadecimal representation of the array
688
+ */
689
+ export const arrayToHexString = (bytes: Uint8Array) => {
690
+ const hexAlphabet = '0123456789abcdef';
691
+ let s = '';
692
+ bytes.forEach((v) => {
693
+ s += hexAlphabet[v >> 4] + hexAlphabet[v & 15];
694
+ });
695
+ return s;
696
+ };