@serve.zone/interfaces 32.8.0 → 32.10.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/changelog.md +12 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/runtimestorageclaim.d.ts +44 -0
- package/dist_ts/data/runtimestorageclaim.js +129 -0
- package/dist_ts/data/secret.d.ts +10 -3
- package/dist_ts/data/secret.js +3 -1
- package/dist_ts/requests/runtimesession.d.ts +23 -0
- package/dist_ts/runtime.assignmentsecret.d.ts +151 -0
- package/dist_ts/runtime.assignmentsecret.js +427 -0
- package/dist_ts/runtime.d.ts +1 -0
- package/dist_ts/runtime.js +2 -1
- package/package.json +1 -1
- package/readme.md +86 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +1 -0
- package/ts/data/runtimestorageclaim.ts +162 -0
- package/ts/data/secret.ts +16 -2
- package/ts/requests/runtimesession.ts +35 -0
- package/ts/runtime.assignmentsecret.ts +581 -0
- package/ts/runtime.ts +1 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { bindRuntimeConfigToAssignment, getRuntimeAssignmentReference, isSha256Digest, snapshotRuntimeAssignment, snapshotRuntimeSessionBinding, validateRuntimeAssignment, validateResolvedSecretManifest, validateResolvedSecretManifestReference, validateSecretRecipientMetadata, validateSecretRecipientSet, verifyResolvedSecretManifestDigest, verifySecretEnvelopeContext, } from './data/index.js';
|
|
3
|
+
import { secretValueLimits } from './data/secret.js';
|
|
4
|
+
import { validateWorkloadInitActiveApprovalAuthority, validateWorkloadInitApprovalAuthorityReference, } from './runtime.workloadinit.js';
|
|
5
|
+
import { canonicalizeStrictJson, createCanonicalJsonSha256Hex } from './private/canonicaljson.js';
|
|
6
|
+
import { isClusterNodeId } from './private/nodeidentifier.js';
|
|
7
|
+
/**
|
|
8
|
+
* Content contracts only. Authentication of the physical peer, current session,
|
|
9
|
+
* node credential and slot, recipient-generation CAS, accepted manifest/version
|
|
10
|
+
* retention, challenge consumption and material issuance are Cloudly-owned.
|
|
11
|
+
*/
|
|
12
|
+
export const runtimeAssignmentSecretContract = Object.freeze({
|
|
13
|
+
descriptorDomain: 'serve.zone/runtime-assignment-secret-authority',
|
|
14
|
+
maximumRequestBytes: 327_680,
|
|
15
|
+
maximumMaterialBytes: 192 * 1024 * 1024,
|
|
16
|
+
error: 'Runtime assignment secret contract rejected.',
|
|
17
|
+
});
|
|
18
|
+
const fail = () => { throw new Error(runtimeAssignmentSecretContract.error); };
|
|
19
|
+
function requireValue(conditionArg) {
|
|
20
|
+
if (!conditionArg)
|
|
21
|
+
fail();
|
|
22
|
+
}
|
|
23
|
+
const exact = (valueArg, keysArg) => {
|
|
24
|
+
requireValue(valueArg !== null && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
25
|
+
const keys = Object.keys(valueArg);
|
|
26
|
+
requireValue(keys.length === keysArg.length && keysArg.every((keyArg) => keys.includes(keyArg)));
|
|
27
|
+
return valueArg;
|
|
28
|
+
};
|
|
29
|
+
const positive = (valueArg) => {
|
|
30
|
+
requireValue(Number.isSafeInteger(valueArg) && valueArg > 0);
|
|
31
|
+
return valueArg;
|
|
32
|
+
};
|
|
33
|
+
const nonnegative = (valueArg) => {
|
|
34
|
+
requireValue(Number.isSafeInteger(valueArg) && valueArg >= 0);
|
|
35
|
+
return valueArg;
|
|
36
|
+
};
|
|
37
|
+
const identifier = (valueArg) => {
|
|
38
|
+
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/.test(valueArg));
|
|
39
|
+
return valueArg;
|
|
40
|
+
};
|
|
41
|
+
const digest = (valueArg) => {
|
|
42
|
+
requireValue(typeof valueArg === 'string' && isSha256Digest(valueArg));
|
|
43
|
+
return valueArg;
|
|
44
|
+
};
|
|
45
|
+
const canonical = (valueArg) => canonicalizeStrictJson(valueArg, fail);
|
|
46
|
+
const capture = (valueArg, maximumArg = runtimeAssignmentSecretContract.maximumRequestBytes) => {
|
|
47
|
+
const serialized = canonical(valueArg);
|
|
48
|
+
requireValue(new TextEncoder().encode(serialized).byteLength <= maximumArg);
|
|
49
|
+
return JSON.parse(serialized);
|
|
50
|
+
};
|
|
51
|
+
const same = (leftArg, rightArg) => canonical(leftArg) === canonical(rightArg);
|
|
52
|
+
const snapshot = (callbackArg) => {
|
|
53
|
+
try {
|
|
54
|
+
return callbackArg();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return fail();
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const session = (valueArg) => snapshotRuntimeSessionBinding(valueArg);
|
|
61
|
+
const assignmentReference = (valueArg) => {
|
|
62
|
+
const value = exact(valueArg, ['assignmentId', 'generation', 'digest']);
|
|
63
|
+
return { assignmentId: identifier(value.assignmentId), generation: positive(value.generation), digest: digest(value.digest) };
|
|
64
|
+
};
|
|
65
|
+
const authorityReference = (valueArg) => {
|
|
66
|
+
const value = exact(valueArg, ['id', 'generation', 'digest']);
|
|
67
|
+
return { id: identifier(value.id), generation: positive(value.generation), digest: digest(value.digest) };
|
|
68
|
+
};
|
|
69
|
+
const manifestReference = (manifestArg) => ({
|
|
70
|
+
manifestId: manifestArg.id, manifestDigest: manifestArg.digest, clusterId: manifestArg.clusterId,
|
|
71
|
+
imageRolloutId: manifestArg.imageRolloutId, imageRolloutGeneration: manifestArg.imageRolloutGeneration,
|
|
72
|
+
requestedImageDigest: manifestArg.requestedImageDigest, invocationDigest: manifestArg.invocationDigest,
|
|
73
|
+
secretRolloutId: manifestArg.secretRolloutId, secretRolloutGeneration: manifestArg.secretRolloutGeneration,
|
|
74
|
+
});
|
|
75
|
+
const launcher = (valueArg, platformArg) => {
|
|
76
|
+
const value = exact(valueArg, ['approval', 'artifact']);
|
|
77
|
+
requireValue(validateWorkloadInitApprovalAuthorityReference(value.approval).length === 0);
|
|
78
|
+
const artifact = exact(value.artifact, [
|
|
79
|
+
'platform', 'workloadInitPlatformManifestDigest', 'workloadInitExecutableDigest',
|
|
80
|
+
]);
|
|
81
|
+
requireValue(artifact.platform === platformArg);
|
|
82
|
+
digest(artifact.workloadInitPlatformManifestDigest);
|
|
83
|
+
digest(artifact.workloadInitExecutableDigest);
|
|
84
|
+
return valueArg;
|
|
85
|
+
};
|
|
86
|
+
export const snapshotRuntimeAssignmentSecretAuthority = (valueArg) => snapshot(() => {
|
|
87
|
+
const value = exact(capture(valueArg), [
|
|
88
|
+
'id', 'generation', 'digest', 'organizationId', 'serviceId', 'platform', 'manifest', 'workloadInit',
|
|
89
|
+
]);
|
|
90
|
+
const reference = authorityReference({
|
|
91
|
+
id: value.id, generation: value.generation, digest: value.digest,
|
|
92
|
+
});
|
|
93
|
+
requireValue(value.platform === 'linux/amd64' || value.platform === 'linux/arm64');
|
|
94
|
+
const manifest = value.manifest;
|
|
95
|
+
requireValue(validateResolvedSecretManifestReference(manifest, manifest?.clusterId).length === 0);
|
|
96
|
+
requireValue(reference.id === manifest.manifestId
|
|
97
|
+
&& reference.generation === manifest.secretRolloutGeneration);
|
|
98
|
+
if (value.workloadInit !== null)
|
|
99
|
+
launcher(value.workloadInit, value.platform);
|
|
100
|
+
return value;
|
|
101
|
+
});
|
|
102
|
+
export const computeRuntimeAssignmentSecretAuthorityDigest = async (authorityArg) => {
|
|
103
|
+
const authority = snapshotRuntimeAssignmentSecretAuthority(authorityArg);
|
|
104
|
+
const { digest: _digest, ...payload } = authority;
|
|
105
|
+
return `sha256:${await createCanonicalJsonSha256Hex(canonical({
|
|
106
|
+
domain: runtimeAssignmentSecretContract.descriptorDomain, payload,
|
|
107
|
+
}), fail)}`;
|
|
108
|
+
};
|
|
109
|
+
export const validateRuntimeAssignmentSecretAuthority = async (valueArg) => {
|
|
110
|
+
try {
|
|
111
|
+
const value = snapshotRuntimeAssignmentSecretAuthority(valueArg);
|
|
112
|
+
return value.digest === await computeRuntimeAssignmentSecretAuthorityDigest(value)
|
|
113
|
+
? [] : [runtimeAssignmentSecretContract.error];
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return [runtimeAssignmentSecretContract.error];
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
/** Producer creates this before assignment digest computation. */
|
|
120
|
+
export const createRuntimeAssignmentSecretAuthority = async (manifestArg, platformArg, workloadInitArg) => {
|
|
121
|
+
try {
|
|
122
|
+
const manifest = capture(manifestArg);
|
|
123
|
+
requireValue(validateResolvedSecretManifest(manifest).length === 0
|
|
124
|
+
&& await verifyResolvedSecretManifestDigest(manifest)
|
|
125
|
+
&& (platformArg === 'linux/amd64' || platformArg === 'linux/arm64')
|
|
126
|
+
&& (manifest.entries.some((entryArg) => entryArg.delivery.type === 'launcher-environment')
|
|
127
|
+
? workloadInitArg !== null : workloadInitArg === null));
|
|
128
|
+
const workloadInit = workloadInitArg === null
|
|
129
|
+
? null : launcher(capture(workloadInitArg), platformArg);
|
|
130
|
+
const authority = {
|
|
131
|
+
id: manifest.id, generation: manifest.secretRolloutGeneration,
|
|
132
|
+
digest: 'sha256:0000000000000000000000000000000000000000000000000000000000000000',
|
|
133
|
+
organizationId: manifest.organizationId, serviceId: manifest.serviceId,
|
|
134
|
+
platform: platformArg, manifest: manifestReference(manifest), workloadInit,
|
|
135
|
+
};
|
|
136
|
+
authority.digest = await computeRuntimeAssignmentSecretAuthorityDigest(authority);
|
|
137
|
+
return authority;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return fail();
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
/** Trusted manifest/config are required: the reference alone is no authorization. */
|
|
144
|
+
export const bindRuntimeAssignmentSecretAuthority = async (authorityArg, manifestArg, assignmentArg, configArg, trustedClusterIdArg) => {
|
|
145
|
+
try {
|
|
146
|
+
const authority = snapshotRuntimeAssignmentSecretAuthority(authorityArg);
|
|
147
|
+
const assignment = snapshotRuntimeAssignment(assignmentArg);
|
|
148
|
+
const manifest = capture(manifestArg);
|
|
149
|
+
requireValue((await validateRuntimeAssignmentSecretAuthority(authority)).length === 0
|
|
150
|
+
&& (await validateRuntimeAssignment(assignment)).length === 0
|
|
151
|
+
&& validateResolvedSecretManifest(manifest).length === 0
|
|
152
|
+
&& await verifyResolvedSecretManifestDigest(manifest));
|
|
153
|
+
const { config } = await bindRuntimeConfigToAssignment(configArg, assignment);
|
|
154
|
+
requireValue(assignment.disposition === 'run' && assignment.generation === 1
|
|
155
|
+
&& assignment.previous === null && assignment.workload.secrets !== null
|
|
156
|
+
&& same(assignment.workload.secrets, {
|
|
157
|
+
id: authority.id, generation: authority.generation, digest: authority.digest,
|
|
158
|
+
})
|
|
159
|
+
&& same(authority.manifest, manifestReference(manifest))
|
|
160
|
+
&& authority.organizationId === assignment.organizationId
|
|
161
|
+
&& authority.serviceId === assignment.serviceId
|
|
162
|
+
&& authority.platform === assignment.workload.platform
|
|
163
|
+
&& identifier(trustedClusterIdArg) === manifest.clusterId
|
|
164
|
+
&& manifest.organizationId === assignment.organizationId
|
|
165
|
+
&& manifest.serviceId === assignment.serviceId
|
|
166
|
+
&& manifest.requestedImageDigest === assignment.workload.imageDigest
|
|
167
|
+
&& manifest.invocationDigest === config.image.invocation.digest
|
|
168
|
+
&& (manifest.entries.some((entryArg) => entryArg.delivery.type === 'launcher-environment')
|
|
169
|
+
? authority.workloadInit !== null : authority.workloadInit === null));
|
|
170
|
+
return authority;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return fail();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const raw32ByteBase64Url = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
177
|
+
export const snapshotRuntimeSecretRecipientState = (valueArg) => snapshot(() => {
|
|
178
|
+
const state = exact(capture(valueArg), ['nodeId', 'generation', 'recipients']);
|
|
179
|
+
requireValue(isClusterNodeId(state.nodeId));
|
|
180
|
+
const generation = nonnegative(state.generation);
|
|
181
|
+
requireValue(Array.isArray(state.recipients));
|
|
182
|
+
requireValue(generation === 0
|
|
183
|
+
? state.recipients.length === 0
|
|
184
|
+
: validateSecretRecipientSet(state.recipients).length === 0
|
|
185
|
+
&& state.recipients.some((recipientArg) => recipientArg.lifecycleState === 'active' && recipientArg.generation === generation));
|
|
186
|
+
return state;
|
|
187
|
+
});
|
|
188
|
+
export const bindGetRuntimeSecretRecipientStateRequest = (valueArg, trustedSessionArg) => snapshot(() => {
|
|
189
|
+
const value = exact(capture(valueArg), ['session']);
|
|
190
|
+
const trusted = session(trustedSessionArg);
|
|
191
|
+
requireValue(same(session(value.session), trusted));
|
|
192
|
+
return { session: trusted };
|
|
193
|
+
});
|
|
194
|
+
export const bindGetRuntimeSecretRecipientStateResponse = (valueArg, requestArg) => snapshot(() => {
|
|
195
|
+
const request = exact(capture(requestArg), ['session']);
|
|
196
|
+
const value = exact(capture(valueArg), ['state']);
|
|
197
|
+
const state = snapshotRuntimeSecretRecipientState(value.state);
|
|
198
|
+
requireValue(state.nodeId === session(request.session).nodeId);
|
|
199
|
+
return { state };
|
|
200
|
+
});
|
|
201
|
+
export const bindBeginRuntimeSecretRecipientEnrollmentRequest = (valueArg, trustedSessionArg, currentStateArg) => snapshot(() => {
|
|
202
|
+
const value = exact(capture(valueArg), [
|
|
203
|
+
'session', 'proposedRecipientKeyId', 'proposedPublicKey', 'expectedGeneration',
|
|
204
|
+
]);
|
|
205
|
+
const trusted = session(trustedSessionArg);
|
|
206
|
+
const state = snapshotRuntimeSecretRecipientState(currentStateArg);
|
|
207
|
+
requireValue(same(session(value.session), trusted) && state.nodeId === trusted.nodeId
|
|
208
|
+
&& nonnegative(value.expectedGeneration) === state.generation
|
|
209
|
+
&& raw32ByteBase64Url.test(value.proposedPublicKey));
|
|
210
|
+
return {
|
|
211
|
+
session: trusted, proposedRecipientKeyId: identifier(value.proposedRecipientKeyId),
|
|
212
|
+
proposedPublicKey: value.proposedPublicKey, expectedGeneration: state.generation,
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
/** Use the existing SmartCrypto X25519 envelope and one-time challenge proof. */
|
|
216
|
+
export const createRuntimeSecretRecipientEnrollmentChallengeContext = (challengeArg) => new TextEncoder().encode(canonical({
|
|
217
|
+
purpose: 'serve.zone/runtime-secret-recipient-enrollment-challenge',
|
|
218
|
+
session: challengeArg.session,
|
|
219
|
+
enrollmentId: challengeArg.enrollmentId,
|
|
220
|
+
recipientKeyId: challengeArg.recipientKeyId,
|
|
221
|
+
publicKey: challengeArg.publicKey,
|
|
222
|
+
generation: challengeArg.generation,
|
|
223
|
+
expiresAt: challengeArg.expiresAt,
|
|
224
|
+
}));
|
|
225
|
+
export const bindBeginRuntimeSecretRecipientEnrollmentResponse = async (valueArg, requestArg, trustedSessionArg, nowArg) => {
|
|
226
|
+
try {
|
|
227
|
+
const value = exact(capture(valueArg), ['challenge']);
|
|
228
|
+
const challenge = exact(value.challenge, [
|
|
229
|
+
'session', 'enrollmentId', 'recipientKeyId', 'publicKey', 'generation', 'expiresAt', 'envelope',
|
|
230
|
+
]);
|
|
231
|
+
const request = exact(capture(requestArg), [
|
|
232
|
+
'session', 'proposedRecipientKeyId', 'proposedPublicKey', 'expectedGeneration',
|
|
233
|
+
]);
|
|
234
|
+
const trusted = session(trustedSessionArg);
|
|
235
|
+
requireValue(same(session(request.session), trusted) && same(session(challenge.session), trusted)
|
|
236
|
+
&& identifier(challenge.enrollmentId).length > 0
|
|
237
|
+
&& challenge.recipientKeyId === identifier(request.proposedRecipientKeyId)
|
|
238
|
+
&& challenge.publicKey === request.proposedPublicKey
|
|
239
|
+
&& typeof challenge.publicKey === 'string' && raw32ByteBase64Url.test(challenge.publicKey)
|
|
240
|
+
&& positive(challenge.generation) === nonnegative(request.expectedGeneration) + 1
|
|
241
|
+
&& positive(challenge.expiresAt) > positive(nowArg));
|
|
242
|
+
const envelope = plugins.smartcrypto.parseX25519Envelope(challenge.envelope);
|
|
243
|
+
requireValue(envelope.recipientKeyId === challenge.recipientKeyId
|
|
244
|
+
&& raw32ByteBase64Url.test(envelope.ciphertext));
|
|
245
|
+
const captured = { ...challenge, session: trusted, envelope };
|
|
246
|
+
requireValue(await verifySecretEnvelopeContext(envelope, createRuntimeSecretRecipientEnrollmentChallengeContext(captured)));
|
|
247
|
+
return { challenge: captured };
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return fail();
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
export const bindCompleteRuntimeSecretRecipientEnrollmentRequest = async (valueArg, challengeArg, trustedSessionArg, nowArg) => {
|
|
254
|
+
try {
|
|
255
|
+
const value = exact(capture(valueArg), ['session', 'enrollmentId', 'expectedGeneration', 'response']);
|
|
256
|
+
const challenge = exact(capture(challengeArg), [
|
|
257
|
+
'session', 'enrollmentId', 'recipientKeyId', 'publicKey', 'generation', 'expiresAt', 'envelope',
|
|
258
|
+
]);
|
|
259
|
+
const trusted = session(trustedSessionArg);
|
|
260
|
+
requireValue(same(session(value.session), trusted) && same(session(challenge.session), trusted)
|
|
261
|
+
&& identifier(value.enrollmentId) === identifier(challenge.enrollmentId)
|
|
262
|
+
&& identifier(challenge.recipientKeyId).length > 0
|
|
263
|
+
&& nonnegative(value.expectedGeneration) + 1 === positive(challenge.generation)
|
|
264
|
+
&& positive(challenge.expiresAt) > positive(nowArg)
|
|
265
|
+
&& typeof value.response === 'string' && raw32ByteBase64Url.test(value.response));
|
|
266
|
+
const envelope = plugins.smartcrypto.parseX25519Envelope(challenge.envelope);
|
|
267
|
+
requireValue(envelope.recipientKeyId === challenge.recipientKeyId
|
|
268
|
+
&& typeof challenge.publicKey === 'string' && raw32ByteBase64Url.test(challenge.publicKey)
|
|
269
|
+
&& raw32ByteBase64Url.test(envelope.ciphertext)
|
|
270
|
+
&& await verifySecretEnvelopeContext(envelope, createRuntimeSecretRecipientEnrollmentChallengeContext(challenge)));
|
|
271
|
+
return value;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return fail();
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
export const bindCompleteRuntimeSecretRecipientEnrollmentResponse = (valueArg, challengeArg) => snapshot(() => {
|
|
278
|
+
const value = exact(capture(valueArg), ['recipient']);
|
|
279
|
+
const challenge = exact(capture(challengeArg), [
|
|
280
|
+
'session', 'enrollmentId', 'recipientKeyId', 'publicKey', 'generation', 'expiresAt', 'envelope',
|
|
281
|
+
]);
|
|
282
|
+
requireValue(validateSecretRecipientMetadata(value.recipient).length === 0);
|
|
283
|
+
const recipient = value.recipient;
|
|
284
|
+
requireValue(recipient.lifecycleState === 'active' && recipient.recipientKeyId === challenge.recipientKeyId
|
|
285
|
+
&& recipient.publicKey === challenge.publicKey && recipient.generation === challenge.generation);
|
|
286
|
+
return { recipient };
|
|
287
|
+
});
|
|
288
|
+
/**
|
|
289
|
+
* The descriptor was hashed before assignment seal. This context binds each
|
|
290
|
+
* envelope to the final run digest, node and recipient generation afterwards.
|
|
291
|
+
* Use SmartCrypto sealX25519Envelope with these exact bytes.
|
|
292
|
+
*/
|
|
293
|
+
export const createRuntimeAssignmentSecretMaterialEnvelopeContext = (contextArg) => new TextEncoder().encode(canonical({
|
|
294
|
+
purpose: 'serve.zone/runtime-assignment-secret-material',
|
|
295
|
+
recipientKeyId: contextArg.recipientKeyId,
|
|
296
|
+
recipientGeneration: contextArg.recipientGeneration,
|
|
297
|
+
organizationId: contextArg.organizationId,
|
|
298
|
+
clusterId: contextArg.clusterId,
|
|
299
|
+
serviceId: contextArg.serviceId,
|
|
300
|
+
nodeId: contextArg.nodeId,
|
|
301
|
+
assignment: contextArg.assignment,
|
|
302
|
+
authorityDigest: contextArg.authorityDigest,
|
|
303
|
+
manifestId: contextArg.manifestId,
|
|
304
|
+
manifestDigest: contextArg.manifestDigest,
|
|
305
|
+
imageRolloutId: contextArg.imageRolloutId,
|
|
306
|
+
imageRolloutGeneration: contextArg.imageRolloutGeneration,
|
|
307
|
+
requestedImageDigest: contextArg.requestedImageDigest,
|
|
308
|
+
invocationDigest: contextArg.invocationDigest,
|
|
309
|
+
secretRolloutId: contextArg.secretRolloutId,
|
|
310
|
+
secretRolloutGeneration: contextArg.secretRolloutGeneration,
|
|
311
|
+
secretId: contextArg.secretId,
|
|
312
|
+
secretVersionId: contextArg.secretVersionId,
|
|
313
|
+
}));
|
|
314
|
+
/**
|
|
315
|
+
* trustedSessionArg MUST be the current authenticated connection's server-owned
|
|
316
|
+
* binding; assignmentArg MUST be its current durable run. Content checks here
|
|
317
|
+
* do not prove either source, recipient possession, version issuance policy or
|
|
318
|
+
* the native workload's mount ownership.
|
|
319
|
+
*/
|
|
320
|
+
export const bindGetRuntimeAssignmentSecretMaterialRequest = async (valueArg, assignmentArg, trustedSessionArg, activeRecipientArg) => {
|
|
321
|
+
try {
|
|
322
|
+
const value = exact(capture(valueArg), [
|
|
323
|
+
'session', 'assignment', 'secrets', 'expectedRecipientKeyId', 'expectedRecipientGeneration',
|
|
324
|
+
]);
|
|
325
|
+
const assignment = snapshotRuntimeAssignment(assignmentArg);
|
|
326
|
+
const trusted = session(trustedSessionArg);
|
|
327
|
+
const recipient = activeRecipientArg;
|
|
328
|
+
requireValue((await validateRuntimeAssignment(assignment)).length === 0
|
|
329
|
+
&& validateSecretRecipientMetadata(recipient).length === 0
|
|
330
|
+
&& recipient.lifecycleState === 'active'
|
|
331
|
+
&& same(session(value.session), trusted)
|
|
332
|
+
&& trusted.nodeId === assignment.nodeId
|
|
333
|
+
&& trusted.runtimeNamespace === assignment.runtimeNamespace
|
|
334
|
+
&& same(trusted.controller, assignment.controller)
|
|
335
|
+
&& assignment.generation === 1 && assignment.previous === null
|
|
336
|
+
&& assignment.disposition === 'run' && assignment.workload.secrets !== null
|
|
337
|
+
&& same(assignmentReference(value.assignment), getRuntimeAssignmentReference(assignment))
|
|
338
|
+
&& same(authorityReference(value.secrets), assignment.workload.secrets)
|
|
339
|
+
&& identifier(value.expectedRecipientKeyId) === recipient.recipientKeyId
|
|
340
|
+
&& positive(value.expectedRecipientGeneration) === recipient.generation);
|
|
341
|
+
return {
|
|
342
|
+
session: trusted, assignment: getRuntimeAssignmentReference(assignment),
|
|
343
|
+
secrets: assignment.workload.secrets,
|
|
344
|
+
expectedRecipientKeyId: recipient.recipientKeyId,
|
|
345
|
+
expectedRecipientGeneration: recipient.generation,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
return fail();
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
353
|
+
* Verify one complete response without opening a private key. The caller must
|
|
354
|
+
* supply its authenticated current session, current assignment, pinned config,
|
|
355
|
+
* enrolled cluster and active recipient from their respective trusted owners.
|
|
356
|
+
*/
|
|
357
|
+
export const bindGetRuntimeAssignmentSecretMaterialResponse = async (valueArg, requestArg, assignmentArg, configArg, trustedSessionArg, trustedClusterIdArg, activeRecipientArg) => {
|
|
358
|
+
try {
|
|
359
|
+
const value = exact(capture(valueArg, runtimeAssignmentSecretContract.maximumMaterialBytes), ['material']);
|
|
360
|
+
const material = exact(value.material, [
|
|
361
|
+
'assignment', 'nodeId', 'secrets', 'recipientKeyId', 'recipientGeneration',
|
|
362
|
+
'authority', 'manifest', 'workloadInit', 'entries',
|
|
363
|
+
]);
|
|
364
|
+
const request = await bindGetRuntimeAssignmentSecretMaterialRequest(requestArg, assignmentArg, trustedSessionArg, activeRecipientArg);
|
|
365
|
+
const assignment = snapshotRuntimeAssignment(assignmentArg);
|
|
366
|
+
const authority = await bindRuntimeAssignmentSecretAuthority(material.authority, material.manifest, assignment, configArg, trustedClusterIdArg);
|
|
367
|
+
const manifest = material.manifest;
|
|
368
|
+
requireValue(identifier(trustedClusterIdArg) === manifest.clusterId
|
|
369
|
+
&& material.nodeId === assignment.nodeId
|
|
370
|
+
&& same(assignmentReference(material.assignment), request.assignment)
|
|
371
|
+
&& same(authorityReference(material.secrets), request.secrets)
|
|
372
|
+
&& material.recipientKeyId === request.expectedRecipientKeyId
|
|
373
|
+
&& material.recipientGeneration === request.expectedRecipientGeneration
|
|
374
|
+
&& Array.isArray(material.entries)
|
|
375
|
+
&& material.entries.length === manifest.entries.length);
|
|
376
|
+
if (authority.workloadInit === null) {
|
|
377
|
+
requireValue(material.workloadInit === null);
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
requireValue((await validateWorkloadInitActiveApprovalAuthority(material.workloadInit)).length === 0);
|
|
381
|
+
const approval = material.workloadInit;
|
|
382
|
+
requireValue(same({
|
|
383
|
+
authorityGeneration: approval.authorityGeneration, approvalDigest: approval.approvalDigest,
|
|
384
|
+
}, authority.workloadInit.approval)
|
|
385
|
+
&& approval.approval.artifacts.some((artifactArg) => same(artifactArg, authority.workloadInit.artifact)));
|
|
386
|
+
}
|
|
387
|
+
const expectedIds = manifest.entries.map((entryArg) => entryArg.secretVersionId).sort();
|
|
388
|
+
const actualIds = material.entries.map((entryArg) => exact(entryArg, ['secretVersionId', 'envelope']).secretVersionId);
|
|
389
|
+
requireValue(actualIds.every((idArg) => typeof idArg === 'string')
|
|
390
|
+
&& same(actualIds, expectedIds));
|
|
391
|
+
const byVersion = new Map(manifest.entries.map((entryArg) => [entryArg.secretVersionId, entryArg]));
|
|
392
|
+
for (const entryValue of material.entries) {
|
|
393
|
+
const entry = exact(entryValue, ['secretVersionId', 'envelope']);
|
|
394
|
+
const manifestEntry = byVersion.get(entry.secretVersionId);
|
|
395
|
+
requireValue(manifestEntry);
|
|
396
|
+
const envelope = plugins.smartcrypto.parseX25519Envelope(entry.envelope);
|
|
397
|
+
requireValue(envelope.recipientKeyId === request.expectedRecipientKeyId
|
|
398
|
+
&& envelope.ciphertext.length <= Math.ceil(secretValueLimits.maximumBytes * 4 / 3));
|
|
399
|
+
const context = createRuntimeAssignmentSecretMaterialEnvelopeContext({
|
|
400
|
+
recipientKeyId: request.expectedRecipientKeyId,
|
|
401
|
+
recipientGeneration: request.expectedRecipientGeneration,
|
|
402
|
+
organizationId: manifest.organizationId,
|
|
403
|
+
clusterId: manifest.clusterId,
|
|
404
|
+
serviceId: manifest.serviceId,
|
|
405
|
+
nodeId: assignment.nodeId,
|
|
406
|
+
assignment: request.assignment,
|
|
407
|
+
authorityDigest: authority.digest,
|
|
408
|
+
manifestId: manifest.id,
|
|
409
|
+
manifestDigest: manifest.digest,
|
|
410
|
+
imageRolloutId: manifest.imageRolloutId,
|
|
411
|
+
imageRolloutGeneration: manifest.imageRolloutGeneration,
|
|
412
|
+
requestedImageDigest: manifest.requestedImageDigest,
|
|
413
|
+
invocationDigest: manifest.invocationDigest,
|
|
414
|
+
secretRolloutId: manifest.secretRolloutId,
|
|
415
|
+
secretRolloutGeneration: manifest.secretRolloutGeneration,
|
|
416
|
+
secretId: manifestEntry.secretId,
|
|
417
|
+
secretVersionId: manifestEntry.secretVersionId,
|
|
418
|
+
});
|
|
419
|
+
requireValue(await verifySecretEnvelopeContext(envelope, context));
|
|
420
|
+
}
|
|
421
|
+
return { material: material };
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
return fail();
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5hc3NpZ25tZW50c2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcnVudGltZS5hc3NpZ25tZW50c2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBTXhDLE9BQU8sRUFDTCw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSxjQUFjLEVBQzVFLHlCQUF5QixFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUNuRiw4QkFBOEIsRUFBRSx1Q0FBdUMsRUFDdkUsK0JBQStCLEVBQUUsMEJBQTBCLEVBQUUsa0NBQWtDLEVBQy9GLDJCQUEyQixHQUM1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQ0FBMkMsRUFBRSw4Q0FBOEMsR0FHNUYsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0QsZ0JBQWdCLEVBQUUsZ0RBQWdEO0lBQ2xFLG1CQUFtQixFQUFFLE9BQU87SUFDNUIsb0JBQW9CLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ3ZDLEtBQUssRUFBRSw4Q0FBOEM7Q0FDN0MsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxJQUFJLENBQUMsWUFBWTtRQUFF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
|
package/dist_ts/runtime.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './runtime.networkprojection.js';
|
|
|
7
7
|
export * from './runtime.corestore.js';
|
|
8
8
|
export * from './runtime.corestore.databaseexportpackage.js';
|
|
9
9
|
export * from './runtime.corestore.relay.js';
|
|
10
|
+
export * from './runtime.assignmentsecret.js';
|
|
10
11
|
export interface ISealedResolvedSecretMaterialEntry {
|
|
11
12
|
secretVersionId: string;
|
|
12
13
|
envelope: plugins.smartcrypto.IX25519EnvelopeV1;
|