crypto.worker.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import * as libsodium from "@ente/shared/crypto/internal/libsodium";
  2. import * as Comlink from "comlink";
  3. import { StateAddress } from "libsodium-wrappers";
  4. const textDecoder = new TextDecoder();
  5. const textEncoder = new TextEncoder();
  6. export class DedicatedCryptoWorker {
  7. async decryptMetadata(
  8. encryptedMetadata: string,
  9. header: string,
  10. key: string,
  11. ) {
  12. const encodedMetadata = await libsodium.decryptChaChaOneShot(
  13. await libsodium.fromB64(encryptedMetadata),
  14. await libsodium.fromB64(header),
  15. key,
  16. );
  17. return JSON.parse(textDecoder.decode(encodedMetadata));
  18. }
  19. async decryptThumbnail(
  20. fileData: Uint8Array,
  21. header: Uint8Array,
  22. key: string,
  23. ) {
  24. return libsodium.decryptChaChaOneShot(fileData, header, key);
  25. }
  26. async decryptEmbedding(
  27. encryptedEmbedding: string,
  28. header: string,
  29. key: string,
  30. ) {
  31. const encodedEmbedding = await libsodium.decryptChaChaOneShot(
  32. await libsodium.fromB64(encryptedEmbedding),
  33. await libsodium.fromB64(header),
  34. key,
  35. );
  36. return Float32Array.from(
  37. JSON.parse(textDecoder.decode(encodedEmbedding)),
  38. );
  39. }
  40. async decryptFile(fileData: Uint8Array, header: Uint8Array, key: string) {
  41. return libsodium.decryptChaCha(fileData, header, key);
  42. }
  43. async encryptMetadata(metadata: Object, key: string) {
  44. const encodedMetadata = textEncoder.encode(JSON.stringify(metadata));
  45. const { file: encryptedMetadata } =
  46. await libsodium.encryptChaChaOneShot(encodedMetadata, key);
  47. const { encryptedData, ...other } = encryptedMetadata;
  48. return {
  49. file: {
  50. encryptedData: await libsodium.toB64(encryptedData),
  51. ...other,
  52. },
  53. key,
  54. };
  55. }
  56. async encryptThumbnail(fileData: Uint8Array, key: string) {
  57. return libsodium.encryptChaChaOneShot(fileData, key);
  58. }
  59. async encryptEmbedding(embedding: Float32Array, key: string) {
  60. const encodedEmbedding = textEncoder.encode(
  61. JSON.stringify(Array.from(embedding)),
  62. );
  63. const { file: encryptEmbedding } = await libsodium.encryptChaChaOneShot(
  64. encodedEmbedding,
  65. key,
  66. );
  67. const { encryptedData, ...other } = encryptEmbedding;
  68. return {
  69. file: {
  70. encryptedData: await libsodium.toB64(encryptedData),
  71. ...other,
  72. },
  73. key,
  74. };
  75. }
  76. async encryptFile(fileData: Uint8Array) {
  77. return libsodium.encryptChaCha(fileData);
  78. }
  79. async encryptFileChunk(
  80. data: Uint8Array,
  81. pushState: StateAddress,
  82. isFinalChunk: boolean,
  83. ) {
  84. return libsodium.encryptFileChunk(data, pushState, isFinalChunk);
  85. }
  86. async initChunkEncryption() {
  87. return libsodium.initChunkEncryption();
  88. }
  89. async initChunkDecryption(header: Uint8Array, key: Uint8Array) {
  90. return libsodium.initChunkDecryption(header, key);
  91. }
  92. async decryptFileChunk(fileData: Uint8Array, pullState: StateAddress) {
  93. return libsodium.decryptFileChunk(fileData, pullState);
  94. }
  95. async initChunkHashing() {
  96. return libsodium.initChunkHashing();
  97. }
  98. async hashFileChunk(hashState: StateAddress, chunk: Uint8Array) {
  99. return libsodium.hashFileChunk(hashState, chunk);
  100. }
  101. async completeChunkHashing(hashState: StateAddress) {
  102. return libsodium.completeChunkHashing(hashState);
  103. }
  104. async deriveKey(
  105. passphrase: string,
  106. salt: string,
  107. opsLimit: number,
  108. memLimit: number,
  109. ) {
  110. return libsodium.deriveKey(passphrase, salt, opsLimit, memLimit);
  111. }
  112. async deriveSensitiveKey(passphrase: string, salt: string) {
  113. return libsodium.deriveSensitiveKey(passphrase, salt);
  114. }
  115. async deriveInteractiveKey(passphrase: string, salt: string) {
  116. return libsodium.deriveInteractiveKey(passphrase, salt);
  117. }
  118. async decryptB64(data: string, nonce: string, key: string) {
  119. return libsodium.decryptB64(data, nonce, key);
  120. }
  121. async decryptToUTF8(data: string, nonce: string, key: string) {
  122. return libsodium.decryptToUTF8(data, nonce, key);
  123. }
  124. async encryptToB64(data: string, key: string) {
  125. return libsodium.encryptToB64(data, key);
  126. }
  127. async generateKeyAndEncryptToB64(data: string) {
  128. return libsodium.generateKeyAndEncryptToB64(data);
  129. }
  130. async encryptUTF8(data: string, key: string) {
  131. return libsodium.encryptUTF8(data, key);
  132. }
  133. async generateEncryptionKey() {
  134. return libsodium.generateEncryptionKey();
  135. }
  136. async generateSaltToDeriveKey() {
  137. return libsodium.generateSaltToDeriveKey();
  138. }
  139. async generateKeyPair() {
  140. return libsodium.generateKeyPair();
  141. }
  142. async boxSealOpen(input: string, publicKey: string, secretKey: string) {
  143. return libsodium.boxSealOpen(input, publicKey, secretKey);
  144. }
  145. async boxSeal(input: string, publicKey: string) {
  146. return libsodium.boxSeal(input, publicKey);
  147. }
  148. async generateSubKey(
  149. key: string,
  150. subKeyLength: number,
  151. subKeyID: number,
  152. context: string,
  153. ) {
  154. return libsodium.generateSubKey(key, subKeyLength, subKeyID, context);
  155. }
  156. async fromUTF8(string: string) {
  157. return libsodium.fromUTF8(string);
  158. }
  159. async toUTF8(data: string) {
  160. return libsodium.toUTF8(data);
  161. }
  162. async toB64(data: Uint8Array) {
  163. return libsodium.toB64(data);
  164. }
  165. async toURLSafeB64(data: Uint8Array) {
  166. return libsodium.toURLSafeB64(data);
  167. }
  168. async fromB64(string: string) {
  169. return libsodium.fromB64(string);
  170. }
  171. async toHex(string: string) {
  172. return libsodium.toHex(string);
  173. }
  174. async fromHex(string: string) {
  175. return libsodium.fromHex(string);
  176. }
  177. }
  178. Comlink.expose(DedicatedCryptoWorker, self);