@storacha/encrypt-upload-client 0.0.39 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +19 -6
- 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 +11 -0
- package/dist/crypto/factories.browser.d.ts.map +1 -0
- package/dist/crypto/factories.browser.js +16 -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/index.d.ts +0 -1
- package/dist/index.js +0 -1
- 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
|
@@ -1,42 +1,39 @@
|
|
|
1
1
|
import { CARWriterStream } from 'carstream';
|
|
2
|
-
import { base64 } from 'multiformats/bases/base64';
|
|
3
2
|
import { createFileEncoderStream } from '@storacha/upload-client/unixfs';
|
|
4
3
|
import * as Type from '../types.js';
|
|
5
|
-
import * as Lit from '../protocols/lit.js';
|
|
6
|
-
import * as EncryptedMetadata from '../core/encrypted-metadata.js';
|
|
7
4
|
/**
|
|
8
5
|
* Encrypt and upload a file to the Storacha network
|
|
9
6
|
*
|
|
10
7
|
* @param {import('@storacha/client').Client} storachaClient - The Storacha client
|
|
11
|
-
* @param {import('@lit-protocol/lit-node-client').LitNodeClient} litClient - The Lit client
|
|
12
8
|
* @param {Type.CryptoAdapter} cryptoAdapter - The crypto adapter responsible for performing
|
|
13
9
|
* encryption and decryption operations.
|
|
14
10
|
* @param {Type.BlobLike} file - The file to upload
|
|
11
|
+
* @param {Type.EncryptionConfig} encryptionConfig - User-provided encryption configuration
|
|
12
|
+
* @param {Type.UploadOptions} [uploadOptions] - User-provided upload options
|
|
15
13
|
* @returns {Promise<Type.AnyLink>} - The link to the uploaded file
|
|
16
14
|
*/
|
|
17
|
-
export const encryptAndUpload = async (storachaClient,
|
|
18
|
-
|
|
19
|
-
if (!spaceDID)
|
|
15
|
+
export const encryptAndUpload = async (storachaClient, cryptoAdapter, file, encryptionConfig, uploadOptions = {}) => {
|
|
16
|
+
// Step 1: Validate required configuration
|
|
17
|
+
if (!encryptionConfig.spaceDID)
|
|
20
18
|
throw new Error('No space selected!');
|
|
21
|
-
|
|
22
|
-
const encryptedPayload = await encryptFile(
|
|
23
|
-
|
|
19
|
+
// Step 2: Encrypt the file using the crypto adapter
|
|
20
|
+
const encryptedPayload = await encryptFile(cryptoAdapter, file, encryptionConfig);
|
|
21
|
+
// Step 3: Build and upload the encrypted metadata to the Storacha network
|
|
22
|
+
const rootCid = await buildAndUploadEncryptedMetadata(storachaClient, encryptedPayload, cryptoAdapter, uploadOptions);
|
|
23
|
+
// Step 4: Return the root CID of the encrypted metadata
|
|
24
24
|
return rootCid;
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
27
|
* Upload encrypted metadata to the Storacha network
|
|
28
28
|
*
|
|
29
29
|
* @param {import('@storacha/client').Client} storachaClient - The Storacha client
|
|
30
|
-
* @param {Type.
|
|
31
|
-
* @param {
|
|
32
|
-
* @param {
|
|
33
|
-
* @param {boolean} [options.publishToFilecoin] - Whether to publish the data to Filecoin
|
|
30
|
+
* @param {Type.EncryptionPayload} encryptedPayload - The encrypted payload
|
|
31
|
+
* @param {Type.CryptoAdapter} cryptoAdapter - The crypto adapter for formatting metadata
|
|
32
|
+
* @param {Type.UploadOptions} [uploadOptions] - The upload options
|
|
34
33
|
* @returns {Promise<Type.AnyLink>} - The link to the uploaded metadata
|
|
35
34
|
*/
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
}) => {
|
|
39
|
-
const { identityBoundCiphertext, plaintextKeyHash, encryptedBlobLike } = encryptedPayload;
|
|
35
|
+
const buildAndUploadEncryptedMetadata = async (storachaClient, encryptedPayload, cryptoAdapter, uploadOptions) => {
|
|
36
|
+
const { encryptedKey, metadata, encryptedBlobLike } = encryptedPayload;
|
|
40
37
|
return storachaClient.uploadCAR({
|
|
41
38
|
stream() {
|
|
42
39
|
/** @type {any} */
|
|
@@ -50,45 +47,38 @@ const uploadEncryptedMetadata = async (storachaClient, encryptedPayload, accessC
|
|
|
50
47
|
async flush(controller) {
|
|
51
48
|
if (!root)
|
|
52
49
|
throw new Error('missing root block');
|
|
53
|
-
|
|
54
|
-
const uploadData = {
|
|
55
|
-
encryptedDataCID: root.cid.toString(),
|
|
56
|
-
identityBoundCiphertext,
|
|
57
|
-
plaintextKeyHash,
|
|
58
|
-
accessControlConditions:
|
|
59
|
-
/** @type {[Record<string, any>]} */ (
|
|
60
|
-
/** @type {unknown} */ (accessControlConditions)),
|
|
61
|
-
};
|
|
62
|
-
const encryptedMetadata = EncryptedMetadata.create(uploadData);
|
|
63
|
-
const { cid, bytes } = await encryptedMetadata.archiveBlock();
|
|
50
|
+
const { cid, bytes } = await cryptoAdapter.encodeMetadata(root.cid.toString(), encryptedKey, metadata);
|
|
64
51
|
controller.enqueue({ cid, bytes });
|
|
65
52
|
},
|
|
66
53
|
}))
|
|
67
54
|
.pipeThrough(new CARWriterStream());
|
|
68
55
|
},
|
|
69
56
|
}, {
|
|
70
|
-
|
|
71
|
-
|
|
57
|
+
...uploadOptions,
|
|
58
|
+
// the encrypted data won't be published to Filecoin, so we need to set pieceHasher to undefined
|
|
59
|
+
pieceHasher: undefined,
|
|
72
60
|
});
|
|
73
61
|
};
|
|
74
62
|
/**
|
|
75
|
-
* Encrypt a file
|
|
63
|
+
* Encrypt a file using the crypto adapter and return the encrypted payload.
|
|
64
|
+
* The encrypted payload contains the encrypted file, the encrypted symmetric key, and the metadata.
|
|
76
65
|
*
|
|
77
|
-
* @param {import('@lit-protocol/lit-node-client').LitNodeClient} litClient - The Lit client
|
|
78
66
|
* @param {Type.CryptoAdapter} cryptoAdapter - The crypto adapter responsible for performing
|
|
79
67
|
* encryption and decryption operations.
|
|
80
68
|
* @param {Type.BlobLike} file - The file to encrypt
|
|
81
|
-
* @param {
|
|
82
|
-
* @returns {Promise<Type.
|
|
69
|
+
* @param {Type.EncryptionConfig} encryptionConfig - The encryption configuration
|
|
70
|
+
* @returns {Promise<Type.EncryptionPayload>} - The encrypted file
|
|
83
71
|
*/
|
|
84
|
-
const encryptFile = async (
|
|
72
|
+
const encryptFile = async (cryptoAdapter, file, encryptionConfig) => {
|
|
73
|
+
// Step 1: Encrypt the file using the crypto adapter
|
|
85
74
|
const { key, iv, encryptedStream } = await cryptoAdapter.encryptStream(file);
|
|
86
|
-
//
|
|
87
|
-
const
|
|
88
|
-
|
|
75
|
+
// Step 2: Use crypto adapter to encrypt the symmetric key
|
|
76
|
+
const keyResult = await cryptoAdapter.encryptSymmetricKey(key, iv, encryptionConfig);
|
|
77
|
+
// Step 3: Return the encrypted payload
|
|
89
78
|
return {
|
|
90
|
-
|
|
91
|
-
|
|
79
|
+
strategy: keyResult.strategy,
|
|
80
|
+
encryptedKey: keyResult.encryptedKey,
|
|
81
|
+
metadata: keyResult.metadata,
|
|
92
82
|
encryptedBlobLike: { stream: () => encryptedStream },
|
|
93
83
|
};
|
|
94
84
|
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/protocols/lit.d.ts
CHANGED
|
@@ -18,9 +18,7 @@ export function getSessionSigs(litClient: LitNodeClient, { wallet, accessControl
|
|
|
18
18
|
*/
|
|
19
19
|
export function getPkpSessionSigs(litClient: LitNodeClient, { pkpPublicKey, authMethod, accessControlConditions, dataToEncryptHash, expiration, capabilityAuthSigs, }: Type.PkpSessionSignatureOptions): Promise<import("@lit-protocol/types").SessionSigsMap>;
|
|
20
20
|
export { encryptString } from "@lit-protocol/encryption";
|
|
21
|
-
export function getAccessControlConditions(spaceDID:
|
|
22
|
-
protocol: "did:";
|
|
23
|
-
}>, any>): import("@lit-protocol/types").AccessControlConditions;
|
|
21
|
+
export function getAccessControlConditions(spaceDID: Type.SpaceDID): import("@lit-protocol/types").AccessControlConditions;
|
|
24
22
|
export function executeUcanValidationAction(litClient: LitNodeClient, options: Type.ExecuteUcanValidationOptions): Promise<any>;
|
|
25
23
|
import { LitNodeClient } from '@lit-protocol/lit-node-client';
|
|
26
24
|
import * as Type from '../types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lit.d.ts","sourceRoot":"","sources":["../../src/protocols/lit.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH,uDAQC;AAED;;;;GAIG;AACH,0CAJW,aAAa,2FACb,IAAI,CAAC,uBAAuB,GAC1B,OAAO,CAAC,OAAO,qBAAqB,EAAE,cAAc,CAAC,CAsDjE;AAED;;;;;;;GAOG;AACH,6CAJW,aAAa,6GACb,IAAI,CAAC,0BAA0B,GAC7B,OAAO,CAAC,OAAO,qBAAqB,EAAE,cAAc,CAAC,CAqCjE;;AAnIM
|
|
1
|
+
{"version":3,"file":"lit.d.ts","sourceRoot":"","sources":["../../src/protocols/lit.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH,uDAQC;AAED;;;;GAIG;AACH,0CAJW,aAAa,2FACb,IAAI,CAAC,uBAAuB,GAC1B,OAAO,CAAC,OAAO,qBAAqB,EAAE,cAAc,CAAC,CAsDjE;AAED;;;;;;;GAOG;AACH,6CAJW,aAAa,6GACb,IAAI,CAAC,0BAA0B,GAC7B,OAAO,CAAC,OAAO,qBAAqB,EAAE,cAAc,CAAC,CAqCjE;;AAnIM,qDAHI,IAAI,CAAC,QAAQ,GACX,OAAO,qBAAqB,EAAE,uBAAuB,CAgBjE;AA6HM,uDAJI,aAAa,WACb,IAAI,CAAC,4BAA4B,gBA4B3C;8BA1L6B,+BAA+B;sBAUvC,aAAa"}
|
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",
|
|
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"}
|