@storacha/encrypt-upload-client 0.0.39 → 1.0.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/client.d.ts +8 -12
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +12 -21
- package/dist/core/metadata/encrypted-metadata.d.ts +8 -0
- package/dist/core/metadata/encrypted-metadata.d.ts.map +1 -0
- package/dist/core/metadata/encrypted-metadata.js +69 -0
- package/dist/core/metadata/kms-metadata.d.ts +36 -0
- package/dist/core/metadata/kms-metadata.d.ts.map +1 -0
- package/dist/core/metadata/kms-metadata.js +156 -0
- package/dist/core/{encrypted-metadata.d.ts → metadata/lit-metadata.d.ts} +11 -11
- package/dist/core/metadata/lit-metadata.d.ts.map +1 -0
- package/dist/core/{encrypted-metadata.js → metadata/lit-metadata.js} +32 -42
- package/dist/crypto/adapters/kms-crypto-adapter.d.ts +148 -0
- package/dist/crypto/adapters/kms-crypto-adapter.d.ts.map +1 -0
- package/dist/crypto/adapters/kms-crypto-adapter.js +321 -0
- package/dist/crypto/adapters/lit-crypto-adapter.d.ts +96 -0
- package/dist/crypto/adapters/lit-crypto-adapter.d.ts.map +1 -0
- package/dist/crypto/adapters/lit-crypto-adapter.js +210 -0
- package/dist/crypto/factories.browser.d.ts +20 -0
- package/dist/crypto/factories.browser.d.ts.map +1 -0
- package/dist/crypto/factories.browser.js +28 -0
- package/dist/crypto/factories.node.d.ts +26 -0
- package/dist/crypto/factories.node.d.ts.map +1 -0
- package/dist/crypto/factories.node.js +38 -0
- package/dist/crypto/index.d.ts +5 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +7 -0
- package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts +76 -0
- package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts.map +1 -0
- package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js +177 -0
- package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts +43 -0
- package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts.map +1 -0
- package/dist/crypto/symmetric/node-aes-cbc-crypto.js +110 -0
- package/dist/handlers/decrypt-handler.d.ts +9 -4
- package/dist/handlers/decrypt-handler.d.ts.map +1 -1
- package/dist/handlers/decrypt-handler.js +62 -93
- package/dist/handlers/encrypt-handler.d.ts +1 -1
- package/dist/handlers/encrypt-handler.d.ts.map +1 -1
- package/dist/handlers/encrypt-handler.js +31 -41
- package/dist/protocols/lit.d.ts +1 -3
- package/dist/protocols/lit.d.ts.map +1 -1
- package/dist/types.d.ts +135 -20
- package/dist/types.d.ts.map +1 -1
- package/package.json +27 -18
- package/dist/core/encrypted-metadata.d.ts.map +0 -1
- package/dist/crypto-adapters/browser-crypto-adapter.d.ts +0 -42
- package/dist/crypto-adapters/browser-crypto-adapter.d.ts.map +0 -1
- package/dist/crypto-adapters/browser-crypto-adapter.js +0 -109
- package/dist/crypto-adapters/node-crypto-adapter.d.ts +0 -17
- package/dist/crypto-adapters/node-crypto-adapter.d.ts.map +0 -1
- package/dist/crypto-adapters/node-crypto-adapter.js +0 -66
package/dist/types.d.ts
CHANGED
|
@@ -1,57 +1,153 @@
|
|
|
1
1
|
import { Wallet } from 'ethers';
|
|
2
2
|
import { UnknownLink } from 'multiformats';
|
|
3
3
|
import { Client as StorachaClient } from '@storacha/client';
|
|
4
|
-
import { Result, Failure, Block } from '@ucanto/interface';
|
|
5
|
-
import { LitNodeClient } from '@lit-protocol/lit-node-client';
|
|
4
|
+
import { Result, Failure, Block, Proof } from '@ucanto/interface';
|
|
6
5
|
import { AccessControlConditions, AuthMethod, AuthSig, SessionSigsMap } from '@lit-protocol/types';
|
|
7
|
-
import type { BlobLike, AnyLink, Signer, DID, SigAlg } from '@storacha/client/types';
|
|
6
|
+
import type { BlobLike, AnyLink, Signer, DID, SigAlg, UploadOptions } from '@storacha/client/types';
|
|
8
7
|
export type { IPLDBlock } from '@ucanto/interface';
|
|
9
|
-
export type { SpaceDID } from '@storacha/capabilities/
|
|
8
|
+
export type { SpaceDID } from '@storacha/capabilities/types';
|
|
10
9
|
export type { UnknownFormat } from '@storacha/capabilities/types';
|
|
11
10
|
export type { Result, UnknownLink };
|
|
12
11
|
export type { BlobLike, AnyLink };
|
|
12
|
+
export type { UploadOptions } from '@storacha/client/types';
|
|
13
|
+
import type { SpaceDID } from '@storacha/capabilities/types';
|
|
13
14
|
export interface EncryptedClient {
|
|
14
|
-
|
|
15
|
-
retrieveAndDecryptFile(
|
|
15
|
+
encryptAndUploadFile(file: BlobLike, config: EncryptionConfig, uploadOptions?: UploadOptions): Promise<AnyLink>;
|
|
16
|
+
retrieveAndDecryptFile(cid: AnyLink, delegationCAR: Uint8Array, decryptionOptions: DecryptionOptions): Promise<ReadableStream>;
|
|
16
17
|
}
|
|
17
18
|
export type EncryptedClientOptions = {
|
|
18
19
|
storachaClient: StorachaClient;
|
|
19
20
|
cryptoAdapter: CryptoAdapter;
|
|
20
|
-
litClient?: LitNodeClient;
|
|
21
21
|
gatewayURL?: URL;
|
|
22
22
|
};
|
|
23
|
-
export interface CryptoAdapter {
|
|
24
|
-
encryptStream(data: BlobLike): Promise<EncryptOutput>;
|
|
25
|
-
decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): Promise<ReadableStream>;
|
|
26
|
-
}
|
|
27
23
|
export interface EncryptOutput {
|
|
28
24
|
key: Uint8Array;
|
|
29
25
|
iv: Uint8Array;
|
|
30
26
|
encryptedStream: ReadableStream;
|
|
31
27
|
}
|
|
32
|
-
export
|
|
33
|
-
|
|
28
|
+
export interface SymmetricCrypto {
|
|
29
|
+
encryptStream(data: BlobLike): Promise<EncryptOutput>;
|
|
30
|
+
decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): Promise<ReadableStream>;
|
|
31
|
+
combineKeyAndIV(key: Uint8Array, iv: Uint8Array): Uint8Array;
|
|
32
|
+
splitKeyAndIV(combined: Uint8Array): {
|
|
33
|
+
key: Uint8Array;
|
|
34
|
+
iv: Uint8Array;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface CryptoAdapter {
|
|
38
|
+
encryptStream(data: BlobLike): Promise<EncryptOutput>;
|
|
39
|
+
decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): Promise<ReadableStream>;
|
|
40
|
+
encryptSymmetricKey(key: Uint8Array, iv: Uint8Array, encryptionConfig: EncryptionConfig): Promise<EncryptedKeyResult>;
|
|
41
|
+
decryptSymmetricKey(encryptedKey: string, configs: {
|
|
42
|
+
decryptionOptions: DecryptionOptions;
|
|
43
|
+
metadata: ExtractedMetadata;
|
|
44
|
+
delegationCAR: Uint8Array;
|
|
45
|
+
resourceCID: AnyLink;
|
|
46
|
+
issuer: Signer<DID, SigAlg>;
|
|
47
|
+
audience: DID;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
key: Uint8Array;
|
|
50
|
+
iv: Uint8Array;
|
|
51
|
+
}>;
|
|
52
|
+
extractEncryptedMetadata(car: Uint8Array): ExtractedMetadata;
|
|
53
|
+
getEncryptedKey(metadata: ExtractedMetadata): string;
|
|
54
|
+
encodeMetadata(encryptedDataCID: string, encryptedKey: string, metadata: LitKeyMetadata | KMSKeyMetadata): Promise<{
|
|
55
|
+
cid: AnyLink;
|
|
56
|
+
bytes: Uint8Array;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export interface EncryptionConfig {
|
|
60
|
+
/**
|
|
61
|
+
* The issuer of the encryption request
|
|
62
|
+
*/
|
|
63
|
+
issuer: Signer<DID, SigAlg>;
|
|
64
|
+
/**
|
|
65
|
+
* The DID of the space to encrypt the file for
|
|
66
|
+
*/
|
|
67
|
+
spaceDID: SpaceDID;
|
|
68
|
+
/**
|
|
69
|
+
* The location of the KMS key to use for encryption
|
|
70
|
+
*/
|
|
71
|
+
location?: string;
|
|
72
|
+
/**
|
|
73
|
+
* The keyring of the KMS key to use for encryption
|
|
74
|
+
*/
|
|
75
|
+
keyring?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface DecryptionOptions {
|
|
78
|
+
wallet?: Wallet;
|
|
79
|
+
sessionSigs?: SessionSigsMap;
|
|
80
|
+
pkpPublicKey?: string;
|
|
81
|
+
authMethod?: AuthMethod;
|
|
82
|
+
spaceDID?: SpaceDID;
|
|
83
|
+
delegationProof?: Proof;
|
|
84
|
+
}
|
|
85
|
+
export interface EncryptedKeyResult {
|
|
86
|
+
strategy: EncryptionStrategy;
|
|
87
|
+
encryptedKey: string;
|
|
88
|
+
metadata: LitKeyMetadata | KMSKeyMetadata;
|
|
89
|
+
}
|
|
90
|
+
export type EncryptionStrategy = 'lit' | 'kms';
|
|
91
|
+
export interface LitKeyMetadata {
|
|
34
92
|
plaintextKeyHash: string;
|
|
93
|
+
accessControlConditions: AccessControlConditions;
|
|
94
|
+
}
|
|
95
|
+
export interface KMSKeyMetadata {
|
|
96
|
+
space: SpaceDID;
|
|
97
|
+
kms: {
|
|
98
|
+
provider: string;
|
|
99
|
+
keyId: string;
|
|
100
|
+
algorithm: string;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export type EncryptionPayload = {
|
|
104
|
+
strategy: EncryptionStrategy;
|
|
105
|
+
encryptedKey: string;
|
|
106
|
+
metadata: LitKeyMetadata | KMSKeyMetadata;
|
|
35
107
|
encryptedBlobLike: BlobLike;
|
|
36
108
|
};
|
|
37
109
|
export type GenericAccessControlCondition = [Record<string, any>];
|
|
38
|
-
export interface
|
|
110
|
+
export interface LitMetadataInput {
|
|
39
111
|
encryptedDataCID: string;
|
|
40
112
|
identityBoundCiphertext: string;
|
|
41
113
|
plaintextKeyHash: string;
|
|
42
|
-
accessControlConditions:
|
|
114
|
+
accessControlConditions: AccessControlConditions;
|
|
43
115
|
}
|
|
44
|
-
export interface
|
|
116
|
+
export interface LitMetadata {
|
|
45
117
|
encryptedDataCID: UnknownLink;
|
|
46
118
|
identityBoundCiphertext: Uint8Array;
|
|
47
119
|
plaintextKeyHash: Uint8Array;
|
|
48
|
-
accessControlConditions:
|
|
120
|
+
accessControlConditions: AccessControlConditions;
|
|
49
121
|
}
|
|
50
|
-
export interface
|
|
122
|
+
export interface LitMetadataView extends LitMetadata {
|
|
51
123
|
/** Encode it to a CAR file. */
|
|
52
|
-
archive(): Promise<Result<Uint8Array>>;
|
|
53
124
|
archiveBlock(): Promise<Block>;
|
|
54
|
-
toJSON():
|
|
125
|
+
toJSON(): LitMetadataInput;
|
|
126
|
+
}
|
|
127
|
+
export interface KMSMetadata {
|
|
128
|
+
encryptedDataCID: UnknownLink;
|
|
129
|
+
encryptedSymmetricKey: string;
|
|
130
|
+
space: SpaceDID;
|
|
131
|
+
kms: {
|
|
132
|
+
provider: string;
|
|
133
|
+
keyId: string;
|
|
134
|
+
algorithm: string;
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export interface KMSMetadataInput {
|
|
138
|
+
encryptedDataCID: string;
|
|
139
|
+
encryptedSymmetricKey: string;
|
|
140
|
+
space: string;
|
|
141
|
+
kms: {
|
|
142
|
+
provider: string;
|
|
143
|
+
keyId: string;
|
|
144
|
+
algorithm: string;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export interface KMSMetadataView extends KMSMetadata {
|
|
148
|
+
/** Encode it to a CAR file. */
|
|
149
|
+
archiveBlock(): Promise<Block>;
|
|
150
|
+
toJSON(): KMSMetadataInput;
|
|
55
151
|
}
|
|
56
152
|
export interface DecodeFailure extends Failure {
|
|
57
153
|
name: 'DecodeFailure';
|
|
@@ -94,4 +190,23 @@ export interface ExecuteUcanValidationOptions {
|
|
|
94
190
|
accessControlConditions: AccessControlConditions;
|
|
95
191
|
wrappedInvocationJSON: string;
|
|
96
192
|
}
|
|
193
|
+
export type ExtractedMetadata = LitExtractedMetadata | KMSExtractedMetadata;
|
|
194
|
+
export interface LitExtractedMetadata {
|
|
195
|
+
strategy: 'lit';
|
|
196
|
+
encryptedDataCID: string;
|
|
197
|
+
identityBoundCiphertext: string;
|
|
198
|
+
plaintextKeyHash: string;
|
|
199
|
+
accessControlConditions: AccessControlConditions;
|
|
200
|
+
}
|
|
201
|
+
export interface KMSExtractedMetadata {
|
|
202
|
+
strategy: 'kms';
|
|
203
|
+
encryptedDataCID: string;
|
|
204
|
+
encryptedSymmetricKey: string;
|
|
205
|
+
space: SpaceDID;
|
|
206
|
+
kms: {
|
|
207
|
+
provider: string;
|
|
208
|
+
keyId: string;
|
|
209
|
+
algorithm: string;
|
|
210
|
+
};
|
|
211
|
+
}
|
|
97
212
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storacha/encrypt-upload-client",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0
|
|
4
|
+
"version": "1.0.0-0",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"description": "Client for upload and download encrypted files",
|
|
7
7
|
"author": "Storacha",
|
|
@@ -37,21 +37,21 @@
|
|
|
37
37
|
"import": "./dist/index.js",
|
|
38
38
|
"require": "./dist/index.js"
|
|
39
39
|
},
|
|
40
|
-
"./node": {
|
|
41
|
-
"import": "./dist/crypto
|
|
42
|
-
"require": "./dist/crypto
|
|
40
|
+
"./factories.node": {
|
|
41
|
+
"import": "./dist/crypto/factories.node.js",
|
|
42
|
+
"require": "./dist/crypto/factories.node.js"
|
|
43
43
|
},
|
|
44
|
-
"./browser": {
|
|
45
|
-
"import": "./dist/crypto
|
|
46
|
-
"require": "./dist/crypto
|
|
44
|
+
"./factories.browser": {
|
|
45
|
+
"import": "./dist/crypto/factories.browser.js",
|
|
46
|
+
"require": "./dist/crypto/factories.browser.js"
|
|
47
47
|
},
|
|
48
|
-
"./
|
|
49
|
-
"import": "./dist/crypto
|
|
50
|
-
"
|
|
48
|
+
"./node": {
|
|
49
|
+
"import": "./dist/crypto/symmetric/node-aes-cbc-crypto.js",
|
|
50
|
+
"require": "./dist/crypto/symmetric/node-aes-cbc-crypto.js"
|
|
51
51
|
},
|
|
52
|
-
"./
|
|
53
|
-
"import": "./dist/crypto
|
|
54
|
-
"
|
|
52
|
+
"./browser": {
|
|
53
|
+
"import": "./dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js",
|
|
54
|
+
"require": "./dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js"
|
|
55
55
|
},
|
|
56
56
|
"./types": "./dist/types.js"
|
|
57
57
|
},
|
|
@@ -80,13 +80,15 @@
|
|
|
80
80
|
"ethers": "5.7.1",
|
|
81
81
|
"ipfs-unixfs-exporter": "^10.0.0",
|
|
82
82
|
"multiformats": "^13.3.3",
|
|
83
|
-
"@storacha/capabilities": "^1.
|
|
84
|
-
"@storacha/
|
|
85
|
-
"@storacha/client": "^1.
|
|
83
|
+
"@storacha/capabilities": "^1.8.0",
|
|
84
|
+
"@storacha/client": "^1.5.0",
|
|
85
|
+
"@storacha/upload-client": "^1.2.5"
|
|
86
86
|
},
|
|
87
87
|
"devDependencies": {
|
|
88
88
|
"@lit-protocol/types": "^7.0.8",
|
|
89
|
+
"@playwright/test": "^1.29.2",
|
|
89
90
|
"esbuild": "^0.25.1",
|
|
91
|
+
"mkcert": "^3.2.0",
|
|
90
92
|
"typescript": "^5.8.3",
|
|
91
93
|
"@storacha/eslint-config": "^0.0.0"
|
|
92
94
|
},
|
|
@@ -110,7 +112,11 @@
|
|
|
110
112
|
"coverage",
|
|
111
113
|
"lit-actions",
|
|
112
114
|
"src/types.js",
|
|
113
|
-
"*.min.js"
|
|
115
|
+
"*.min.js",
|
|
116
|
+
"**/*.playwright.spec.js",
|
|
117
|
+
"test/mocks/playwright/**",
|
|
118
|
+
"playwright.config.js",
|
|
119
|
+
"playwright-report/**/*"
|
|
114
120
|
]
|
|
115
121
|
},
|
|
116
122
|
"depcheck": {
|
|
@@ -135,7 +141,10 @@
|
|
|
135
141
|
"lint:fix": "tsc --build && eslint '**/*.{js,ts}' --fix && prettier --write '**/*.{js,ts,yml,json}' --ignore-path ../../.gitignore",
|
|
136
142
|
"build-actions": "node lit-actions/esbuild.js",
|
|
137
143
|
"attw": "attw --pack .",
|
|
144
|
+
"prepare-environment": "playwright install",
|
|
138
145
|
"rc": "npm version prerelease --preid rc",
|
|
139
|
-
"test": "node --test test
|
|
146
|
+
"test": "node --test $(find test -name '*.spec.js' ! -name '*.playwright.spec.js')",
|
|
147
|
+
"test:setup-certs": "mkdir -p test/mocks/playwright && cd test/mocks/playwright && (test -f cert.key || (npx mkcert create-ca && npx mkcert create-cert --domains localhost 127.0.0.1 ::1))",
|
|
148
|
+
"test:browser": "npm run test:setup-certs && npx playwright test"
|
|
140
149
|
}
|
|
141
150
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encrypted-metadata.d.ts","sourceRoot":"","sources":["../../src/core/encrypted-metadata.js"],"names":[],"mappings":"AAUA,sBAAuB,wBAAwB,CAAA;AAE/C;;;;;;;YAUE;AAEF;;;;;YAQE;AA8EK,+CAHI,KAAK,CAAC,iBAAiB,GAAC,KAAK,CAAC,sBAAsB,GAClD,KAAK,CAAC,qBAAqB,CAGO;AAMxC,0CAHI,KAAK,CAAC,qBAAqB,GACzB,KAAK,CAAC,sBAAsB,CASvC;AAMK,8CAHI,KAAK,CAAC,sBAAsB,GAC1B,KAAK,CAAC,iBAAiB,CASlC;AAMK,qDAHI,KAAK,CAAC,iBAAiB,GACrB,OAAO,CAAC,OAAO,mBAAmB,EAAE,KAAK,CAAC,CAOtD;AAMM,gDAHI,KAAK,CAAC,iBAAiB,GACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAK7C;AAMM,iCAHI,UAAU,GACR,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,aAAa,CAAC,CAiB1E;AAOM,+BAHJ;IAAgC,IAAI,EAA5B,KAAK,CAAC,SAAS;CACvB,GAAU,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,aAAa,CAAC,CAe1E;sBApMqB,mBAAmB;uBAEF,cAAc;uBAE9B,aAAa"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BrowserCryptoAdapter implements the CryptoAdapter interface for browser environments.
|
|
3
|
-
* It uses AES-CTR mode for encryption via the Web Crypto API.
|
|
4
|
-
*
|
|
5
|
-
* Why AES-CTR?
|
|
6
|
-
* - We use AES-CTR with pseudo-streaming (buffering chunks before emitting) for simplicity and streaming support.
|
|
7
|
-
* - AES-CTR allows chunked processing without padding, making it suitable for large files and browser environments.
|
|
8
|
-
* - The Web Crypto API supports AES-CTR natively in all modern browsers and in Node.js 19+ as globalThis.crypto.
|
|
9
|
-
* - For Node.js <19, you must polyfill globalThis.crypto (e.g., with `node --experimental-global-webcrypto` or a package like @peculiar/webcrypto).
|
|
10
|
-
* - This allows for processing large files in chunks with no padding issues found in other libraries such as node-forge.
|
|
11
|
-
*
|
|
12
|
-
* Note: This implementation is currently pseudo-streaming: it buffers all encrypted/decrypted chunks before emitting them as a stream.
|
|
13
|
-
* For true streaming (lower memory usage), we need to refactor it to emit each chunk as soon as it is processed.
|
|
14
|
-
*
|
|
15
|
-
* @class
|
|
16
|
-
* @implements {Type.CryptoAdapter}
|
|
17
|
-
*/
|
|
18
|
-
export class BrowserCryptoAdapter implements Type.CryptoAdapter {
|
|
19
|
-
generateKey(): Promise<Uint8Array<ArrayBuffer>>;
|
|
20
|
-
/**
|
|
21
|
-
* Encrypt a stream of data using AES-CTR (chunked, Web Crypto API).
|
|
22
|
-
*
|
|
23
|
-
* @param {Blob} data The data to encrypt.
|
|
24
|
-
* @returns {Promise<{ key: Uint8Array, iv: Uint8Array, encryptedStream: ReadableStream }>}
|
|
25
|
-
*/
|
|
26
|
-
encryptStream(data: Blob): Promise<{
|
|
27
|
-
key: Uint8Array;
|
|
28
|
-
iv: Uint8Array;
|
|
29
|
-
encryptedStream: ReadableStream;
|
|
30
|
-
}>;
|
|
31
|
-
/**
|
|
32
|
-
* Decrypt a stream of data using AES-CTR (chunked, Web Crypto API).
|
|
33
|
-
*
|
|
34
|
-
* @param {ReadableStream} encryptedData The encrypted data stream.
|
|
35
|
-
* @param {Uint8Array} key The encryption key.
|
|
36
|
-
* @param {Uint8Array} iv The initialization vector (counter).
|
|
37
|
-
* @returns {Promise<ReadableStream>} A stream of decrypted data.
|
|
38
|
-
*/
|
|
39
|
-
decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): Promise<ReadableStream>;
|
|
40
|
-
}
|
|
41
|
-
import * as Type from '../types.js';
|
|
42
|
-
//# sourceMappingURL=browser-crypto-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-crypto-adapter.d.ts","sourceRoot":"","sources":["../../src/crypto-adapters/browser-crypto-adapter.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;GAgBG;AACH,6CAFgB,IAAI,CAAC,aAAa;IAGhC,gDAEC;IAED;;;;;OAKG;IACH,oBAHW,IAAI,GACF,OAAO,CAAC;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,EAAE,EAAE,UAAU,CAAC;QAAC,eAAe,EAAE,cAAc,CAAA;KAAE,CAAC,CAoDzF;IAED;;;;;;;OAOG;IACH,6BALW,cAAc,OACd,UAAU,MACV,UAAU,GACR,OAAO,CAAC,cAAc,CAAC,CA8CnC;CACF;sBA5IqB,aAAa"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import * as Type from '../types.js';
|
|
2
|
-
const ENCRYPTION_ALGORITHM = 'AES-CTR';
|
|
3
|
-
const KEY_LENGTH = 256; // bits
|
|
4
|
-
const IV_LENGTH = 16; // bytes (128 bits, used as counter)
|
|
5
|
-
const COUNTER_LENGTH = 64; // bits (Web Crypto API default for AES-CTR)
|
|
6
|
-
/**
|
|
7
|
-
* BrowserCryptoAdapter implements the CryptoAdapter interface for browser environments.
|
|
8
|
-
* It uses AES-CTR mode for encryption via the Web Crypto API.
|
|
9
|
-
*
|
|
10
|
-
* Why AES-CTR?
|
|
11
|
-
* - We use AES-CTR with pseudo-streaming (buffering chunks before emitting) for simplicity and streaming support.
|
|
12
|
-
* - AES-CTR allows chunked processing without padding, making it suitable for large files and browser environments.
|
|
13
|
-
* - The Web Crypto API supports AES-CTR natively in all modern browsers and in Node.js 19+ as globalThis.crypto.
|
|
14
|
-
* - For Node.js <19, you must polyfill globalThis.crypto (e.g., with `node --experimental-global-webcrypto` or a package like @peculiar/webcrypto).
|
|
15
|
-
* - This allows for processing large files in chunks with no padding issues found in other libraries such as node-forge.
|
|
16
|
-
*
|
|
17
|
-
* Note: This implementation is currently pseudo-streaming: it buffers all encrypted/decrypted chunks before emitting them as a stream.
|
|
18
|
-
* For true streaming (lower memory usage), we need to refactor it to emit each chunk as soon as it is processed.
|
|
19
|
-
*
|
|
20
|
-
* @class
|
|
21
|
-
* @implements {Type.CryptoAdapter}
|
|
22
|
-
*/
|
|
23
|
-
export class BrowserCryptoAdapter {
|
|
24
|
-
async generateKey() {
|
|
25
|
-
return globalThis.crypto.getRandomValues(new Uint8Array(KEY_LENGTH / 8));
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Encrypt a stream of data using AES-CTR (chunked, Web Crypto API).
|
|
29
|
-
*
|
|
30
|
-
* @param {Blob} data The data to encrypt.
|
|
31
|
-
* @returns {Promise<{ key: Uint8Array, iv: Uint8Array, encryptedStream: ReadableStream }>}
|
|
32
|
-
*/
|
|
33
|
-
async encryptStream(data) {
|
|
34
|
-
const key = await this.generateKey();
|
|
35
|
-
const iv = globalThis.crypto.getRandomValues(new Uint8Array(IV_LENGTH));
|
|
36
|
-
const cryptoKey = await globalThis.crypto.subtle.importKey('raw', key, { name: ENCRYPTION_ALGORITHM }, false, ['encrypt', 'decrypt']);
|
|
37
|
-
const reader = data.stream().getReader();
|
|
38
|
-
let counter = new Uint8Array(iv); // Copy the IV for counter
|
|
39
|
-
let chunkIndex = 0;
|
|
40
|
-
/** @type {Uint8Array[]} */
|
|
41
|
-
const encryptedChunks = [];
|
|
42
|
-
// eslint-disable-next-line no-constant-condition
|
|
43
|
-
while (true) {
|
|
44
|
-
const { done, value } = await reader.read();
|
|
45
|
-
if (done)
|
|
46
|
-
break;
|
|
47
|
-
// Increment counter for each chunk
|
|
48
|
-
const chunkCounter = new Uint8Array(counter);
|
|
49
|
-
// For each chunk, increment the last byte of the counter
|
|
50
|
-
chunkCounter[chunkCounter.length - 1] += chunkIndex;
|
|
51
|
-
chunkIndex++;
|
|
52
|
-
const encrypted = new Uint8Array(await globalThis.crypto.subtle.encrypt({
|
|
53
|
-
name: ENCRYPTION_ALGORITHM,
|
|
54
|
-
counter: chunkCounter,
|
|
55
|
-
length: COUNTER_LENGTH,
|
|
56
|
-
}, cryptoKey, value));
|
|
57
|
-
encryptedChunks.push(encrypted);
|
|
58
|
-
}
|
|
59
|
-
const encryptedStream = new ReadableStream({
|
|
60
|
-
start(controller) {
|
|
61
|
-
for (const chunk of encryptedChunks) {
|
|
62
|
-
controller.enqueue(chunk);
|
|
63
|
-
}
|
|
64
|
-
controller.close();
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
return { key, iv, encryptedStream };
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Decrypt a stream of data using AES-CTR (chunked, Web Crypto API).
|
|
71
|
-
*
|
|
72
|
-
* @param {ReadableStream} encryptedData The encrypted data stream.
|
|
73
|
-
* @param {Uint8Array} key The encryption key.
|
|
74
|
-
* @param {Uint8Array} iv The initialization vector (counter).
|
|
75
|
-
* @returns {Promise<ReadableStream>} A stream of decrypted data.
|
|
76
|
-
*/
|
|
77
|
-
async decryptStream(encryptedData, key, iv) {
|
|
78
|
-
const cryptoKey = await globalThis.crypto.subtle.importKey('raw', key, { name: ENCRYPTION_ALGORITHM }, false, ['encrypt', 'decrypt']);
|
|
79
|
-
const reader = encryptedData.getReader();
|
|
80
|
-
let counter = new Uint8Array(iv);
|
|
81
|
-
let chunkIndex = 0;
|
|
82
|
-
/** @type {Uint8Array[]} */
|
|
83
|
-
const decryptedChunks = [];
|
|
84
|
-
// eslint-disable-next-line no-constant-condition
|
|
85
|
-
while (true) {
|
|
86
|
-
const { done, value } = await reader.read();
|
|
87
|
-
if (done)
|
|
88
|
-
break;
|
|
89
|
-
const chunkCounter = new Uint8Array(counter);
|
|
90
|
-
chunkCounter[chunkCounter.length - 1] += chunkIndex;
|
|
91
|
-
chunkIndex++;
|
|
92
|
-
const decrypted = new Uint8Array(await globalThis.crypto.subtle.decrypt({
|
|
93
|
-
name: ENCRYPTION_ALGORITHM,
|
|
94
|
-
counter: chunkCounter,
|
|
95
|
-
length: COUNTER_LENGTH,
|
|
96
|
-
}, cryptoKey, value));
|
|
97
|
-
decryptedChunks.push(decrypted);
|
|
98
|
-
}
|
|
99
|
-
return new ReadableStream({
|
|
100
|
-
start(controller) {
|
|
101
|
-
for (const chunk of decryptedChunks) {
|
|
102
|
-
controller.enqueue(chunk);
|
|
103
|
-
}
|
|
104
|
-
controller.close();
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=browser-crypto-adapter.js.map
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/** @implements {Type.CryptoAdapter} */
|
|
2
|
-
export class NodeCryptoAdapter implements Type.CryptoAdapter {
|
|
3
|
-
/** @param {Type.BlobLike} data */
|
|
4
|
-
encryptStream(data: Type.BlobLike): Promise<{
|
|
5
|
-
key: Buffer<ArrayBufferLike>;
|
|
6
|
-
iv: Buffer<ArrayBufferLike>;
|
|
7
|
-
encryptedStream: ReadableStream<any>;
|
|
8
|
-
}>;
|
|
9
|
-
/**
|
|
10
|
-
* @param {ReadableStream} encryptedData
|
|
11
|
-
* @param {Uint8Array} key
|
|
12
|
-
* @param {Uint8Array} iv
|
|
13
|
-
*/
|
|
14
|
-
decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): Promise<ReadableStream<any>>;
|
|
15
|
-
}
|
|
16
|
-
import * as Type from '../types.js';
|
|
17
|
-
//# sourceMappingURL=node-crypto-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-crypto-adapter.d.ts","sourceRoot":"","sources":["../../src/crypto-adapters/node-crypto-adapter.js"],"names":[],"mappings":"AAMA,uCAAuC;AACvC,0CADiB,IAAI,CAAC,aAAa;IAEjC,mCAAmC;IACnC,oBADY,IAAI,CAAC,QAAQ;;;;OA+BxB;IAED;;;;OAIG;IACH,6BAJW,cAAc,OACd,UAAU,MACV,UAAU,gCA8BpB;CACF;sBAzEqB,aAAa"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { randomBytes, createCipheriv, createDecipheriv } from 'crypto';
|
|
2
|
-
import * as Type from '../types.js';
|
|
3
|
-
const ENCRYPTION_ALGORITHM = 'aes-256-cbc';
|
|
4
|
-
/** @implements {Type.CryptoAdapter} */
|
|
5
|
-
export class NodeCryptoAdapter {
|
|
6
|
-
/** @param {Type.BlobLike} data */
|
|
7
|
-
async encryptStream(data) {
|
|
8
|
-
const symmetricKey = randomBytes(32); // 256 bits for AES-256
|
|
9
|
-
const initializationVector = randomBytes(16); // 16 bytes for AES
|
|
10
|
-
const cipher = createCipheriv(ENCRYPTION_ALGORITHM, symmetricKey, initializationVector);
|
|
11
|
-
const encryptStream = new TransformStream({
|
|
12
|
-
transform: async (chunk, controller) => {
|
|
13
|
-
const encryptedChunk = cipher.update(chunk);
|
|
14
|
-
if (encryptedChunk.length) {
|
|
15
|
-
controller.enqueue(encryptedChunk);
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
flush: (controller) => {
|
|
19
|
-
const final = cipher.final();
|
|
20
|
-
if (final.length) {
|
|
21
|
-
controller.enqueue(final);
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
return Promise.resolve({
|
|
26
|
-
key: symmetricKey,
|
|
27
|
-
iv: initializationVector,
|
|
28
|
-
encryptedStream: data.stream().pipeThrough(encryptStream),
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* @param {ReadableStream} encryptedData
|
|
33
|
-
* @param {Uint8Array} key
|
|
34
|
-
* @param {Uint8Array} iv
|
|
35
|
-
*/
|
|
36
|
-
async decryptStream(encryptedData, key, iv) {
|
|
37
|
-
const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
38
|
-
const decryptor = new TransformStream({
|
|
39
|
-
async transform(chunk, controller) {
|
|
40
|
-
try {
|
|
41
|
-
const decryptedChunk = decipher.update(chunk);
|
|
42
|
-
if (decryptedChunk.length > 0) {
|
|
43
|
-
controller.enqueue(decryptedChunk);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
controller.error(err);
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
flush(controller) {
|
|
51
|
-
try {
|
|
52
|
-
const finalChunk = decipher.final();
|
|
53
|
-
if (finalChunk.length > 0) {
|
|
54
|
-
controller.enqueue(finalChunk);
|
|
55
|
-
}
|
|
56
|
-
controller.terminate();
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
controller.error(err);
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
return Promise.resolve(encryptedData.pipeThrough(decryptor));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=node-crypto-adapter.js.map
|