@storacha/encrypt-upload-client 1.1.56 → 1.1.58
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/constants.d.ts +3 -3
- package/dist/config/constants.js +4 -3
- package/dist/config/env.d.ts +9 -6
- package/dist/config/service.d.ts +13 -13
- package/dist/core/client.d.ts +54 -41
- package/dist/core/client.js +68 -56
- package/dist/core/errors.d.ts +6 -6
- package/dist/core/metadata/encrypted-metadata.d.ts +13 -8
- package/dist/core/metadata/kms-metadata.d.ts +68 -36
- package/dist/core/metadata/lit-metadata.d.ts +63 -28
- package/dist/crypto/adapters/kms-crypto-adapter.d.ts +172 -137
- package/dist/crypto/adapters/lit-crypto-adapter.d.ts +107 -86
- package/dist/crypto/factories.browser.d.ts +9 -5
- package/dist/crypto/factories.browser.js +15 -7
- package/dist/crypto/factories.node.d.ts +13 -6
- package/dist/crypto/factories.node.js +19 -13
- package/dist/crypto/index.d.ts +5 -5
- package/dist/crypto/index.js +5 -5
- package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts +58 -54
- package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js +174 -146
- package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts +36 -32
- package/dist/crypto/symmetric/node-aes-cbc-crypto.js +101 -95
- package/dist/examples/decrypt-test.d.ts +2 -2
- package/dist/examples/decrypt-test.js +78 -69
- package/dist/examples/encrypt-test.d.ts +5 -3
- package/dist/examples/encrypt-test.js +58 -55
- package/dist/handlers/decrypt-handler.d.ts +19 -5
- package/dist/handlers/encrypt-handler.d.ts +9 -3
- package/dist/handlers/encrypt-handler.js +93 -57
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/protocols/lit.d.ts +33 -9
- package/dist/protocols/lit.js +134 -98
- package/dist/test/cid-verification.spec.d.ts +2 -2
- package/dist/test/cid-verification.spec.js +341 -313
- package/dist/test/crypto-compatibility.spec.d.ts +2 -2
- package/dist/test/crypto-compatibility.spec.js +184 -120
- package/dist/test/crypto-counter-security.spec.d.ts +2 -2
- package/dist/test/crypto-counter-security.spec.js +177 -138
- package/dist/test/crypto-streaming.spec.d.ts +2 -2
- package/dist/test/crypto-streaming.spec.js +208 -126
- package/dist/test/encrypted-metadata.spec.d.ts +2 -2
- package/dist/test/encrypted-metadata.spec.js +89 -62
- package/dist/test/factories.spec.d.ts +2 -2
- package/dist/test/factories.spec.js +275 -139
- package/dist/test/file-metadata.spec.d.ts +2 -2
- package/dist/test/file-metadata.spec.js +472 -416
- package/dist/test/fixtures/test-fixtures.d.ts +25 -20
- package/dist/test/fixtures/test-fixtures.js +61 -53
- package/dist/test/helpers/test-file-utils.d.ts +19 -14
- package/dist/test/helpers/test-file-utils.js +78 -76
- package/dist/test/https-enforcement.spec.d.ts +2 -2
- package/dist/test/https-enforcement.spec.js +278 -124
- package/dist/test/kms-crypto-adapter.spec.d.ts +2 -2
- package/dist/test/kms-crypto-adapter.spec.js +473 -304
- package/dist/test/lit-crypto-adapter.spec.d.ts +2 -2
- package/dist/test/lit-crypto-adapter.spec.js +206 -118
- package/dist/test/memory-efficiency.spec.d.ts +2 -2
- package/dist/test/memory-efficiency.spec.js +100 -87
- package/dist/test/mocks/key-manager.d.ts +71 -38
- package/dist/test/mocks/key-manager.js +129 -113
- package/dist/test/node-crypto-adapter.spec.d.ts +2 -2
- package/dist/test/node-crypto-adapter.spec.js +155 -102
- package/dist/test/node-generic-crypto-adapter.spec.d.ts +2 -2
- package/dist/test/node-generic-crypto-adapter.spec.js +134 -94
- package/dist/test/setup.d.ts +2 -2
- package/dist/test/setup.js +8 -9
- package/dist/tsconfig.spec.tsbuildinfo +1 -1
- package/dist/types.d.ts +219 -181
- package/dist/utils/file-metadata.d.ts +19 -13
- package/dist/utils.d.ts +14 -5
- package/package.json +4 -4
|
@@ -9,42 +9,70 @@
|
|
|
9
9
|
* @param {Function} [options.onKeyDecrypt] - Optional callback for decrypt calls
|
|
10
10
|
*/
|
|
11
11
|
export function createMockKeyManagerService(options: {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
mockPublicKey: string
|
|
13
|
+
mockProvider?: string | undefined
|
|
14
|
+
mockAlgorithm?: string | undefined
|
|
15
|
+
onEncryptionSetup?: Function | undefined
|
|
16
|
+
onKeyDecrypt?: Function | undefined
|
|
17
17
|
}): {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
18
|
+
space: {
|
|
19
|
+
encryption: {
|
|
20
|
+
setup: Server.ServiceMethod<
|
|
21
|
+
Server.API.Capability<
|
|
22
|
+
'space/encryption/setup',
|
|
23
|
+
`did:key:${string}` &
|
|
24
|
+
`did:${string}` &
|
|
25
|
+
Server.API.Phantom<{
|
|
26
|
+
protocol: 'did:'
|
|
27
|
+
}>,
|
|
28
|
+
Partial<
|
|
29
|
+
Pick<
|
|
30
|
+
{
|
|
31
|
+
location: string | undefined
|
|
32
|
+
keyring: string | undefined
|
|
33
|
+
},
|
|
34
|
+
'location' | 'keyring'
|
|
35
|
+
>
|
|
36
|
+
>
|
|
37
|
+
>,
|
|
38
|
+
{
|
|
39
|
+
publicKey: string
|
|
40
|
+
provider: string
|
|
41
|
+
algorithm: string
|
|
42
|
+
},
|
|
43
|
+
Server.API.Failure & {
|
|
44
|
+
name: string
|
|
45
|
+
message: string
|
|
46
|
+
}
|
|
47
|
+
>
|
|
48
|
+
key: {
|
|
49
|
+
decrypt: Server.ServiceMethod<
|
|
50
|
+
Server.API.Capability<
|
|
51
|
+
'space/encryption/key/decrypt',
|
|
52
|
+
`did:key:${string}` &
|
|
53
|
+
`did:${string}` &
|
|
54
|
+
Server.API.Phantom<{
|
|
55
|
+
protocol: 'did:'
|
|
56
|
+
}>,
|
|
57
|
+
Pick<
|
|
58
|
+
{
|
|
59
|
+
key: Uint8Array<ArrayBufferLike>
|
|
60
|
+
},
|
|
61
|
+
'key'
|
|
62
|
+
>
|
|
63
|
+
>,
|
|
64
|
+
{
|
|
65
|
+
decryptedSymmetricKey: string
|
|
66
|
+
},
|
|
67
|
+
Server.API.Failure & {
|
|
68
|
+
name: string
|
|
69
|
+
message: string
|
|
70
|
+
}
|
|
71
|
+
>
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
48
76
|
/**
|
|
49
77
|
* Create a mock key manager service server
|
|
50
78
|
*
|
|
@@ -53,6 +81,11 @@ export function createMockKeyManagerService(options: {
|
|
|
53
81
|
* @param {number} port - The port to listen on
|
|
54
82
|
* @param {boolean} [useHttps] - Whether to use HTTPS URLs (testing HTTPS scenarios)
|
|
55
83
|
*/
|
|
56
|
-
export function createMockKeyManagerServer(
|
|
57
|
-
|
|
58
|
-
|
|
84
|
+
export function createMockKeyManagerServer(
|
|
85
|
+
service: object,
|
|
86
|
+
keyManagerServiceDID: any,
|
|
87
|
+
port: number,
|
|
88
|
+
useHttps?: boolean
|
|
89
|
+
): Promise<any>
|
|
90
|
+
import * as Server from '@ucanto/server'
|
|
91
|
+
//# sourceMappingURL=key-manager.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createServer } from 'node:http'
|
|
2
|
-
import * as Server from '@ucanto/server'
|
|
3
|
-
import { CAR } from '@ucanto/transport'
|
|
4
|
-
import * as Space from '@storacha/capabilities/space'
|
|
5
|
-
import { base64 } from 'multiformats/bases/base64'
|
|
1
|
+
import { createServer } from 'node:http'
|
|
2
|
+
import * as Server from '@ucanto/server'
|
|
3
|
+
import { CAR } from '@ucanto/transport'
|
|
4
|
+
import * as Space from '@storacha/capabilities/space'
|
|
5
|
+
import { base64 } from 'multiformats/bases/base64'
|
|
6
6
|
/**
|
|
7
7
|
* Create mock KMS service with proper capability handlers
|
|
8
8
|
*
|
|
@@ -14,62 +14,68 @@ import { base64 } from 'multiformats/bases/base64';
|
|
|
14
14
|
* @param {Function} [options.onKeyDecrypt] - Optional callback for decrypt calls
|
|
15
15
|
*/
|
|
16
16
|
export function createMockKeyManagerService(options) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
17
|
+
const {
|
|
18
|
+
mockPublicKey,
|
|
19
|
+
mockProvider = 'google-kms',
|
|
20
|
+
mockAlgorithm = 'RSA-OAEP-2048-SHA256',
|
|
21
|
+
onEncryptionSetup,
|
|
22
|
+
onKeyDecrypt,
|
|
23
|
+
} = options
|
|
24
|
+
return {
|
|
25
|
+
space: {
|
|
26
|
+
encryption: {
|
|
27
|
+
setup: Server.provide(Space.EncryptionSetup, async (input) => {
|
|
28
|
+
// Call optional callback for testing
|
|
29
|
+
if (onEncryptionSetup) {
|
|
30
|
+
onEncryptionSetup(input)
|
|
31
|
+
}
|
|
32
|
+
// Validate the space DID format
|
|
33
|
+
if (!input.capability.with.startsWith('did:key:')) {
|
|
34
|
+
return Server.error({
|
|
35
|
+
name: 'InvalidSpace',
|
|
36
|
+
message: 'Space DID must be a did:key',
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
// Return mock RSA public key and metadata
|
|
40
|
+
return Server.ok({
|
|
41
|
+
publicKey: mockPublicKey,
|
|
42
|
+
provider: mockProvider,
|
|
43
|
+
algorithm: mockAlgorithm,
|
|
44
|
+
})
|
|
45
|
+
}),
|
|
46
|
+
key: {
|
|
47
|
+
decrypt: Server.provide(Space.EncryptionKeyDecrypt, async (input) => {
|
|
48
|
+
// Call optional callback for testing
|
|
49
|
+
if (onKeyDecrypt) {
|
|
50
|
+
onKeyDecrypt(input)
|
|
51
|
+
}
|
|
52
|
+
// Validate the space DID
|
|
53
|
+
if (!input.capability.with.startsWith('did:key:')) {
|
|
54
|
+
return Server.error({
|
|
55
|
+
name: 'InvalidSpace',
|
|
56
|
+
message: 'Space DID must be a did:key',
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
// Validate encrypted key is provided
|
|
60
|
+
if (!input.capability.nb.key) {
|
|
61
|
+
return Server.error({
|
|
62
|
+
name: 'KeyNotFound',
|
|
63
|
+
message: 'key is required',
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
// For testing purposes, "decrypt" by converting bytes back to base64 string
|
|
67
|
+
// In real implementation, this would call Google KMS
|
|
68
|
+
const keyBytes = input.capability.nb.key
|
|
69
|
+
// No base64 decode here, just return the bytes as base64 string for mock
|
|
70
|
+
const mockDecryptedKey = base64.encode(keyBytes)
|
|
71
|
+
return Server.ok({
|
|
72
|
+
decryptedSymmetricKey: mockDecryptedKey,
|
|
73
|
+
})
|
|
74
|
+
}),
|
|
71
75
|
},
|
|
72
|
-
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
}
|
|
73
79
|
}
|
|
74
80
|
/**
|
|
75
81
|
* Create a mock key manager service server
|
|
@@ -79,59 +85,69 @@ export function createMockKeyManagerService(options) {
|
|
|
79
85
|
* @param {number} port - The port to listen on
|
|
80
86
|
* @param {boolean} [useHttps] - Whether to use HTTPS URLs (testing HTTPS scenarios)
|
|
81
87
|
*/
|
|
82
|
-
export function createMockKeyManagerServer(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
88
|
+
export function createMockKeyManagerServer(
|
|
89
|
+
service,
|
|
90
|
+
keyManagerServiceDID,
|
|
91
|
+
port,
|
|
92
|
+
useHttps = false
|
|
93
|
+
) {
|
|
94
|
+
const ucantoServer = Server.create({
|
|
95
|
+
id: keyManagerServiceDID,
|
|
96
|
+
service,
|
|
97
|
+
codec: CAR.inbound,
|
|
98
|
+
validateAuthorization: () => ({ ok: {} }), // Skip auth validation for tests
|
|
99
|
+
})
|
|
100
|
+
const httpServer = createServer(async (req, res) => {
|
|
101
|
+
res.setHeader('Access-Control-Allow-Origin', '*')
|
|
102
|
+
res.setHeader('Access-Control-Allow-Methods', '*')
|
|
103
|
+
res.setHeader('Access-Control-Allow-Headers', '*')
|
|
104
|
+
if (req.method === 'OPTIONS') return res.end()
|
|
105
|
+
if (req.method === 'POST') {
|
|
106
|
+
const bodyBuffer = Buffer.concat(await collect(req))
|
|
107
|
+
const reqHeaders = /** @type {Record<string, string>} */ (
|
|
108
|
+
Object.fromEntries(Object.entries(req.headers))
|
|
109
|
+
)
|
|
110
|
+
const { headers, body, status } = await ucantoServer.request({
|
|
111
|
+
body: new Uint8Array(
|
|
112
|
+
bodyBuffer.buffer,
|
|
113
|
+
bodyBuffer.byteOffset,
|
|
114
|
+
bodyBuffer.byteLength
|
|
115
|
+
),
|
|
116
|
+
headers: reqHeaders,
|
|
117
|
+
})
|
|
118
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
119
|
+
res.setHeader(key, value)
|
|
120
|
+
}
|
|
121
|
+
res.writeHead(status ?? 200)
|
|
122
|
+
res.end(body)
|
|
123
|
+
} else {
|
|
124
|
+
res.end()
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
httpServer.listen(port, (/** @type {Error | undefined} */ err) => {
|
|
129
|
+
if (err) {
|
|
130
|
+
reject(err)
|
|
131
|
+
} else {
|
|
132
|
+
const protocol = useHttps ? 'https' : 'http'
|
|
133
|
+
resolve({
|
|
134
|
+
server: httpServer,
|
|
135
|
+
url: `${protocol}://localhost:${port}`,
|
|
136
|
+
close: () => new Promise((resolve) => httpServer.close(resolve)),
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
})
|
|
140
|
+
})
|
|
127
141
|
}
|
|
128
142
|
/** @param {import('node:stream').Readable} stream */
|
|
129
143
|
const collect = (stream) => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
144
|
+
return /** @type {Promise<Buffer[]>} */ (
|
|
145
|
+
new Promise((resolve, reject) => {
|
|
146
|
+
const chunks = /** @type {Buffer[]} */ ([])
|
|
147
|
+
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)))
|
|
148
|
+
stream.on('error', (err) => reject(err))
|
|
149
|
+
stream.on('end', () => resolve(chunks))
|
|
150
|
+
})
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=key-manager.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {}
|
|
2
|
-
//# sourceMappingURL=node-crypto-adapter.spec.d.ts.map
|
|
1
|
+
export {}
|
|
2
|
+
//# sourceMappingURL=node-crypto-adapter.spec.d.ts.map
|