@serve.zone/interfaces 23.2.0 → 24.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.
@@ -0,0 +1,129 @@
1
+ import type { TSha256Digest, TImmutableContainerPlatform } from './data/index.js';
2
+ export declare const workloadInitReleaseContract: Readonly<{
3
+ readonly packageName: "@serve.zone/workloadinit";
4
+ readonly sourceRepository: "https://code.foss.global/serve.zone/workloadinit.git";
5
+ readonly imageRegistry: "code.foss.global";
6
+ readonly imageRepository: "serve.zone/workloadinit";
7
+ readonly imageIndexMediaType: "application/vnd.oci.image.index.v1+json";
8
+ readonly statementType: "https://in-toto.io/Statement/v1";
9
+ readonly predicateType: "https://slsa.dev/provenance/v1";
10
+ readonly buildType: "https://serve.zone/buildtypes/workloadinit-gitzone-tsdocker/v1";
11
+ readonly builderId: "https://serve.zone/builders/workloadinit-manual-release/v1";
12
+ readonly signatureFormat: "cosign-dsse-bundle-v0.3";
13
+ readonly signatureAlgorithm: "ecdsa-p256-sha256";
14
+ }>;
15
+ export interface IWorkloadInitBuildToolVersionsV1 {
16
+ dockerBuildx: string;
17
+ gitzone: string;
18
+ tsdocker: string;
19
+ tsrust: string;
20
+ }
21
+ export interface IWorkloadInitReleaseIdentityV1 {
22
+ packageName: typeof workloadInitReleaseContract.packageName;
23
+ version: string;
24
+ sourceRepository: typeof workloadInitReleaseContract.sourceRepository;
25
+ sourceRevision: string;
26
+ sourceRef: string;
27
+ sourceDirty: false;
28
+ imageRegistry: typeof workloadInitReleaseContract.imageRegistry;
29
+ imageRepository: typeof workloadInitReleaseContract.imageRepository;
30
+ imageTag: string;
31
+ }
32
+ export interface IWorkloadInitReleaseAttestationStatementV1 {
33
+ _type: typeof workloadInitReleaseContract.statementType;
34
+ subject: [
35
+ {
36
+ name: string;
37
+ digest: {
38
+ sha256: string;
39
+ };
40
+ }
41
+ ];
42
+ predicateType: typeof workloadInitReleaseContract.predicateType;
43
+ predicate: {
44
+ buildDefinition: {
45
+ buildType: typeof workloadInitReleaseContract.buildType;
46
+ externalParameters: {
47
+ artifact: {
48
+ mediaType: typeof workloadInitReleaseContract.imageIndexMediaType;
49
+ platforms: ['linux/amd64', 'linux/arm64'];
50
+ repository: string;
51
+ tag: string;
52
+ };
53
+ source: {
54
+ repository: typeof workloadInitReleaseContract.sourceRepository;
55
+ tag: string;
56
+ dirty: false;
57
+ };
58
+ };
59
+ resolvedDependencies: [
60
+ {
61
+ uri: string;
62
+ digest: {
63
+ gitCommit: string;
64
+ };
65
+ }
66
+ ];
67
+ };
68
+ runDetails: {
69
+ builder: {
70
+ id: typeof workloadInitReleaseContract.builderId;
71
+ version: IWorkloadInitBuildToolVersionsV1;
72
+ };
73
+ };
74
+ };
75
+ }
76
+ /**
77
+ * Cloudly-created summary of a private DSSE verification. Shape and digest
78
+ * validation do not independently prove the signature or its trust policy.
79
+ */
80
+ export interface IWorkloadInitCloudlyVerificationSummaryV1 {
81
+ signatureFormat: typeof workloadInitReleaseContract.signatureFormat;
82
+ signatureAlgorithm: typeof workloadInitReleaseContract.signatureAlgorithm;
83
+ signerKeyId: TSha256Digest;
84
+ detachedBundleDigest: TSha256Digest;
85
+ statementDigest: TSha256Digest;
86
+ subjectImageIndexDigest: TSha256Digest;
87
+ builderId: typeof workloadInitReleaseContract.builderId;
88
+ policyGeneration: number;
89
+ policyDigest: TSha256Digest;
90
+ verifiedAt: number;
91
+ }
92
+ export interface IWorkloadInitApprovedArtifactV1 {
93
+ platform: TImmutableContainerPlatform;
94
+ workloadInitPlatformManifestDigest: TSha256Digest;
95
+ workloadInitExecutableDigest: TSha256Digest;
96
+ }
97
+ export interface IWorkloadInitReleaseApprovalV1 {
98
+ schemaVersion: 1;
99
+ release: IWorkloadInitReleaseIdentityV1;
100
+ imageIndexMediaType: typeof workloadInitReleaseContract.imageIndexMediaType;
101
+ workloadInitImageIndexDigest: TSha256Digest;
102
+ artifacts: [IWorkloadInitApprovedArtifactV1, IWorkloadInitApprovedArtifactV1];
103
+ verificationSummary: IWorkloadInitCloudlyVerificationSummaryV1;
104
+ approvedAt: number;
105
+ approvalDigest: TSha256Digest;
106
+ }
107
+ export interface IWorkloadInitApprovalAuthorityReferenceV1 {
108
+ authorityVersion: 1;
109
+ authorityGeneration: number;
110
+ approvalDigest: TSha256Digest;
111
+ }
112
+ export interface IWorkloadInitActiveApprovalAuthorityV1 extends IWorkloadInitApprovalAuthorityReferenceV1 {
113
+ approval: IWorkloadInitReleaseApprovalV1;
114
+ }
115
+ export declare const validateWorkloadInitReleaseIdentity: (releaseArg: unknown) => string[];
116
+ export declare const createWorkloadInitReleaseAttestationStatement: (inputArg: {
117
+ release: IWorkloadInitReleaseIdentityV1;
118
+ workloadInitImageIndexDigest: TSha256Digest;
119
+ toolVersions: IWorkloadInitBuildToolVersionsV1;
120
+ }) => IWorkloadInitReleaseAttestationStatementV1;
121
+ export declare const createWorkloadInitReleaseAttestationPayload: (statementArg: IWorkloadInitReleaseAttestationStatementV1) => Uint8Array;
122
+ export declare const computeWorkloadInitReleaseAttestationStatementDigest: (statementArg: IWorkloadInitReleaseAttestationStatementV1) => Promise<TSha256Digest>;
123
+ export declare const validateWorkloadInitReleaseAttestationStatement: (statementArg: unknown) => string[];
124
+ export declare const validateWorkloadInitCloudlyVerificationSummary: (summaryArg: unknown) => string[];
125
+ export declare const createWorkloadInitReleaseApprovalDigestInput: (approvalArg: IWorkloadInitReleaseApprovalV1) => string;
126
+ export declare const computeWorkloadInitReleaseApprovalDigest: (approvalArg: IWorkloadInitReleaseApprovalV1) => Promise<TSha256Digest>;
127
+ export declare const validateWorkloadInitReleaseApproval: (approvalArg: unknown) => Promise<string[]>;
128
+ export declare const validateWorkloadInitApprovalAuthorityReference: (referenceArg: unknown) => string[];
129
+ export declare const validateWorkloadInitActiveApprovalAuthority: (authorityArg: unknown) => Promise<string[]>;
@@ -0,0 +1,405 @@
1
+ import { isSha256Digest } from './data/immutableimage.js';
2
+ export const workloadInitReleaseContract = Object.freeze({
3
+ packageName: '@serve.zone/workloadinit',
4
+ sourceRepository: 'https://code.foss.global/serve.zone/workloadinit.git',
5
+ imageRegistry: 'code.foss.global',
6
+ imageRepository: 'serve.zone/workloadinit',
7
+ imageIndexMediaType: 'application/vnd.oci.image.index.v1+json',
8
+ statementType: 'https://in-toto.io/Statement/v1',
9
+ predicateType: 'https://slsa.dev/provenance/v1',
10
+ buildType: 'https://serve.zone/buildtypes/workloadinit-gitzone-tsdocker/v1',
11
+ builderId: 'https://serve.zone/builders/workloadinit-manual-release/v1',
12
+ signatureFormat: 'cosign-dsse-bundle-v0.3',
13
+ signatureAlgorithm: 'ecdsa-p256-sha256',
14
+ });
15
+ const semanticVersionRegex = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;
16
+ const gitRevisionRegex = /^[a-f0-9]{40}$/;
17
+ const bareSha256Regex = /^[a-f0-9]{64}$/;
18
+ const toolVersionRegex = /^[A-Za-z0-9][A-Za-z0-9.+_-]{0,63}$/;
19
+ const isRecord = (valueArg) => (Boolean(valueArg) && typeof valueArg === 'object' && !Array.isArray(valueArg));
20
+ const hasExactKeys = (valueArg, keysArg) => JSON.stringify(Object.keys(valueArg).sort()) === JSON.stringify([...keysArg].sort());
21
+ const isPositiveSafeInteger = (valueArg) => (Number.isSafeInteger(valueArg) && valueArg > 0);
22
+ const computeSha256 = async (inputArg) => {
23
+ const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', new Uint8Array(inputArg)));
24
+ return `sha256:${[...digest]
25
+ .map((byteArg) => byteArg.toString(16).padStart(2, '0'))
26
+ .join('')}`;
27
+ };
28
+ export const validateWorkloadInitReleaseIdentity = (releaseArg) => {
29
+ if (!isRecord(releaseArg)
30
+ || !hasExactKeys(releaseArg, [
31
+ 'packageName',
32
+ 'version',
33
+ 'sourceRepository',
34
+ 'sourceRevision',
35
+ 'sourceRef',
36
+ 'sourceDirty',
37
+ 'imageRegistry',
38
+ 'imageRepository',
39
+ 'imageTag',
40
+ ])) {
41
+ return ['WorkloadInit release identity must use its exact schema'];
42
+ }
43
+ const errors = [];
44
+ if (releaseArg.packageName !== workloadInitReleaseContract.packageName
45
+ || releaseArg.sourceRepository !== workloadInitReleaseContract.sourceRepository
46
+ || releaseArg.imageRegistry !== workloadInitReleaseContract.imageRegistry
47
+ || releaseArg.imageRepository !== workloadInitReleaseContract.imageRepository) {
48
+ errors.push('WorkloadInit release identity must use the canonical package and repositories');
49
+ }
50
+ if (typeof releaseArg.version !== 'string' || !semanticVersionRegex.test(releaseArg.version)) {
51
+ errors.push('WorkloadInit release version must be canonical stable semver');
52
+ }
53
+ else if (releaseArg.sourceRef !== `refs/tags/v${releaseArg.version}`
54
+ || releaseArg.imageTag !== `v${releaseArg.version}`) {
55
+ errors.push('WorkloadInit release source ref and image tag must match its version');
56
+ }
57
+ if (typeof releaseArg.sourceRevision !== 'string'
58
+ || !gitRevisionRegex.test(releaseArg.sourceRevision)
59
+ || releaseArg.sourceDirty !== false) {
60
+ errors.push('WorkloadInit release source must be an exact clean Git revision');
61
+ }
62
+ return errors;
63
+ };
64
+ const canonicalToolVersions = (versionsArg) => ({
65
+ dockerBuildx: versionsArg.dockerBuildx,
66
+ gitzone: versionsArg.gitzone,
67
+ tsdocker: versionsArg.tsdocker,
68
+ tsrust: versionsArg.tsrust,
69
+ });
70
+ export const createWorkloadInitReleaseAttestationStatement = (inputArg) => ({
71
+ _type: workloadInitReleaseContract.statementType,
72
+ subject: [{
73
+ name: `${inputArg.release.imageRegistry}/${inputArg.release.imageRepository}:${inputArg.release.imageTag}`,
74
+ digest: {
75
+ sha256: inputArg.workloadInitImageIndexDigest.slice('sha256:'.length),
76
+ },
77
+ }],
78
+ predicateType: workloadInitReleaseContract.predicateType,
79
+ predicate: {
80
+ buildDefinition: {
81
+ buildType: workloadInitReleaseContract.buildType,
82
+ externalParameters: {
83
+ artifact: {
84
+ mediaType: workloadInitReleaseContract.imageIndexMediaType,
85
+ platforms: ['linux/amd64', 'linux/arm64'],
86
+ repository: `${inputArg.release.imageRegistry}/${inputArg.release.imageRepository}`,
87
+ tag: inputArg.release.imageTag,
88
+ },
89
+ source: {
90
+ repository: inputArg.release.sourceRepository,
91
+ tag: inputArg.release.sourceRef,
92
+ dirty: inputArg.release.sourceDirty,
93
+ },
94
+ },
95
+ resolvedDependencies: [{
96
+ uri: `git+${inputArg.release.sourceRepository}@${inputArg.release.sourceRef}`,
97
+ digest: {
98
+ gitCommit: inputArg.release.sourceRevision,
99
+ },
100
+ }],
101
+ },
102
+ runDetails: {
103
+ builder: {
104
+ id: workloadInitReleaseContract.builderId,
105
+ version: canonicalToolVersions(inputArg.toolVersions),
106
+ },
107
+ },
108
+ },
109
+ });
110
+ export const createWorkloadInitReleaseAttestationPayload = (statementArg) => new TextEncoder().encode(JSON.stringify(statementArg));
111
+ export const computeWorkloadInitReleaseAttestationStatementDigest = async (statementArg) => computeSha256(createWorkloadInitReleaseAttestationPayload(statementArg));
112
+ export const validateWorkloadInitReleaseAttestationStatement = (statementArg) => {
113
+ try {
114
+ if (!isRecord(statementArg)
115
+ || !hasExactKeys(statementArg, ['_type', 'subject', 'predicateType', 'predicate'])) {
116
+ return ['WorkloadInit release attestation statement must use its exact schema'];
117
+ }
118
+ const errors = [];
119
+ if (statementArg._type !== workloadInitReleaseContract.statementType
120
+ || statementArg.predicateType !== workloadInitReleaseContract.predicateType) {
121
+ errors.push('WorkloadInit release attestation types must be canonical');
122
+ }
123
+ if (!Array.isArray(statementArg.subject)
124
+ || statementArg.subject.length !== 1
125
+ || !isRecord(statementArg.subject[0])
126
+ || !hasExactKeys(statementArg.subject[0], ['name', 'digest'])
127
+ || !isRecord(statementArg.subject[0].digest)
128
+ || !hasExactKeys(statementArg.subject[0].digest, ['sha256'])
129
+ || typeof statementArg.subject[0].digest.sha256 !== 'string'
130
+ || !bareSha256Regex.test(statementArg.subject[0].digest.sha256)) {
131
+ errors.push('WorkloadInit release attestation must have one canonical root-index subject');
132
+ }
133
+ if (!isRecord(statementArg.predicate)
134
+ || !hasExactKeys(statementArg.predicate, ['buildDefinition', 'runDetails'])) {
135
+ return [...errors, 'WorkloadInit release attestation predicate must use its exact schema'];
136
+ }
137
+ const buildDefinition = statementArg.predicate.buildDefinition;
138
+ const runDetails = statementArg.predicate.runDetails;
139
+ if (!isRecord(buildDefinition)
140
+ || !hasExactKeys(buildDefinition, [
141
+ 'buildType',
142
+ 'externalParameters',
143
+ 'resolvedDependencies',
144
+ ])
145
+ || buildDefinition.buildType !== workloadInitReleaseContract.buildType
146
+ || !isRecord(buildDefinition.externalParameters)
147
+ || !hasExactKeys(buildDefinition.externalParameters, ['artifact', 'source'])
148
+ || !Array.isArray(buildDefinition.resolvedDependencies)
149
+ || buildDefinition.resolvedDependencies.length !== 1
150
+ || !isRecord(runDetails)
151
+ || !hasExactKeys(runDetails, ['builder'])
152
+ || !isRecord(runDetails.builder)
153
+ || !hasExactKeys(runDetails.builder, ['id', 'version'])
154
+ || runDetails.builder.id !== workloadInitReleaseContract.builderId) {
155
+ return [...errors, 'WorkloadInit release attestation build definition must be canonical'];
156
+ }
157
+ const artifact = buildDefinition.externalParameters.artifact;
158
+ const source = buildDefinition.externalParameters.source;
159
+ const dependency = buildDefinition.resolvedDependencies[0];
160
+ const toolVersions = runDetails.builder.version;
161
+ if (!isRecord(artifact)
162
+ || !hasExactKeys(artifact, ['mediaType', 'platforms', 'repository', 'tag'])
163
+ || artifact.mediaType !== workloadInitReleaseContract.imageIndexMediaType
164
+ || JSON.stringify(artifact.platforms) !== JSON.stringify(['linux/amd64', 'linux/arm64'])
165
+ || artifact.repository !== `${workloadInitReleaseContract.imageRegistry}/${workloadInitReleaseContract.imageRepository}`
166
+ || typeof artifact.tag !== 'string'
167
+ || !/^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/.test(artifact.tag)) {
168
+ errors.push('WorkloadInit release attestation artifact must be canonical and version-tagged');
169
+ }
170
+ if (!isRecord(source)
171
+ || !hasExactKeys(source, ['repository', 'tag', 'dirty'])
172
+ || source.repository !== workloadInitReleaseContract.sourceRepository
173
+ || source.dirty !== false
174
+ || typeof source.tag !== 'string'
175
+ || source.tag !== `refs/tags/${artifact && isRecord(artifact) ? artifact.tag : ''}`) {
176
+ errors.push('WorkloadInit release attestation source must match its clean version tag');
177
+ }
178
+ if (!isRecord(dependency)
179
+ || !hasExactKeys(dependency, ['uri', 'digest'])
180
+ || !isRecord(dependency.digest)
181
+ || !hasExactKeys(dependency.digest, ['gitCommit'])
182
+ || typeof dependency.digest.gitCommit !== 'string'
183
+ || !gitRevisionRegex.test(dependency.digest.gitCommit)
184
+ || dependency.uri !== `git+${workloadInitReleaseContract.sourceRepository}@${source && isRecord(source)
185
+ ? source.tag
186
+ : ''}`) {
187
+ errors.push('WorkloadInit release attestation source dependency must be canonical');
188
+ }
189
+ if (!isRecord(toolVersions)
190
+ || !hasExactKeys(toolVersions, ['dockerBuildx', 'gitzone', 'tsdocker', 'tsrust'])
191
+ || Object.values(toolVersions).some((valueArg) => (typeof valueArg !== 'string' || !toolVersionRegex.test(valueArg)))) {
192
+ errors.push('WorkloadInit release attestation tool versions must be canonical');
193
+ }
194
+ if (Array.isArray(statementArg.subject)
195
+ && isRecord(statementArg.subject[0])
196
+ && isRecord(artifact)
197
+ && statementArg.subject[0].name
198
+ !== `${artifact.repository}:${artifact.tag}`) {
199
+ errors.push('WorkloadInit release attestation subject name must match the versioned image');
200
+ }
201
+ return errors;
202
+ }
203
+ catch {
204
+ return ['WorkloadInit release attestation statement must be safely inspectable'];
205
+ }
206
+ };
207
+ export const validateWorkloadInitCloudlyVerificationSummary = (summaryArg) => {
208
+ if (!isRecord(summaryArg)
209
+ || !hasExactKeys(summaryArg, [
210
+ 'signatureFormat',
211
+ 'signatureAlgorithm',
212
+ 'signerKeyId',
213
+ 'detachedBundleDigest',
214
+ 'statementDigest',
215
+ 'subjectImageIndexDigest',
216
+ 'builderId',
217
+ 'policyGeneration',
218
+ 'policyDigest',
219
+ 'verifiedAt',
220
+ ])) {
221
+ return ['WorkloadInit Cloudly verification summary must use its exact schema'];
222
+ }
223
+ const errors = [];
224
+ if (summaryArg.signatureFormat !== workloadInitReleaseContract.signatureFormat
225
+ || summaryArg.signatureAlgorithm !== workloadInitReleaseContract.signatureAlgorithm
226
+ || summaryArg.builderId !== workloadInitReleaseContract.builderId) {
227
+ errors.push('WorkloadInit Cloudly verification summary policy identifiers must be canonical');
228
+ }
229
+ for (const field of [
230
+ 'signerKeyId',
231
+ 'detachedBundleDigest',
232
+ 'statementDigest',
233
+ 'subjectImageIndexDigest',
234
+ 'policyDigest',
235
+ ]) {
236
+ if (typeof summaryArg[field] !== 'string' || !isSha256Digest(summaryArg[field])) {
237
+ errors.push(`WorkloadInit Cloudly verification summary ${field} must be canonical`);
238
+ }
239
+ }
240
+ if (!isPositiveSafeInteger(summaryArg.policyGeneration)
241
+ || !isPositiveSafeInteger(summaryArg.verifiedAt)) {
242
+ errors.push('WorkloadInit Cloudly verification summary generation and time must be positive');
243
+ }
244
+ return errors;
245
+ };
246
+ const canonicalReleaseIdentity = (releaseArg) => ({
247
+ packageName: releaseArg.packageName,
248
+ version: releaseArg.version,
249
+ sourceRepository: releaseArg.sourceRepository,
250
+ sourceRevision: releaseArg.sourceRevision,
251
+ sourceRef: releaseArg.sourceRef,
252
+ sourceDirty: releaseArg.sourceDirty,
253
+ imageRegistry: releaseArg.imageRegistry,
254
+ imageRepository: releaseArg.imageRepository,
255
+ imageTag: releaseArg.imageTag,
256
+ });
257
+ const canonicalApprovedArtifact = (artifactArg) => ({
258
+ platform: artifactArg.platform,
259
+ workloadInitPlatformManifestDigest: artifactArg.workloadInitPlatformManifestDigest,
260
+ workloadInitExecutableDigest: artifactArg.workloadInitExecutableDigest,
261
+ });
262
+ const canonicalVerificationSummary = (summaryArg) => ({
263
+ signatureFormat: summaryArg.signatureFormat,
264
+ signatureAlgorithm: summaryArg.signatureAlgorithm,
265
+ signerKeyId: summaryArg.signerKeyId,
266
+ detachedBundleDigest: summaryArg.detachedBundleDigest,
267
+ statementDigest: summaryArg.statementDigest,
268
+ subjectImageIndexDigest: summaryArg.subjectImageIndexDigest,
269
+ builderId: summaryArg.builderId,
270
+ policyGeneration: summaryArg.policyGeneration,
271
+ policyDigest: summaryArg.policyDigest,
272
+ verifiedAt: summaryArg.verifiedAt,
273
+ });
274
+ export const createWorkloadInitReleaseApprovalDigestInput = (approvalArg) => JSON.stringify({
275
+ schemaVersion: approvalArg.schemaVersion,
276
+ purpose: 'serve.zone/workloadinit-release-approval',
277
+ release: canonicalReleaseIdentity(approvalArg.release),
278
+ imageIndexMediaType: approvalArg.imageIndexMediaType,
279
+ workloadInitImageIndexDigest: approvalArg.workloadInitImageIndexDigest,
280
+ artifacts: approvalArg.artifacts.map(canonicalApprovedArtifact),
281
+ verificationSummary: canonicalVerificationSummary(approvalArg.verificationSummary),
282
+ approvedAt: approvalArg.approvedAt,
283
+ });
284
+ export const computeWorkloadInitReleaseApprovalDigest = async (approvalArg) => computeSha256(new TextEncoder().encode(createWorkloadInitReleaseApprovalDigestInput(approvalArg)));
285
+ export const validateWorkloadInitReleaseApproval = async (approvalArg) => {
286
+ try {
287
+ if (!isRecord(approvalArg)
288
+ || !hasExactKeys(approvalArg, [
289
+ 'schemaVersion',
290
+ 'release',
291
+ 'imageIndexMediaType',
292
+ 'workloadInitImageIndexDigest',
293
+ 'artifacts',
294
+ 'verificationSummary',
295
+ 'approvedAt',
296
+ 'approvalDigest',
297
+ ])) {
298
+ return ['WorkloadInit release approval must use its exact schema'];
299
+ }
300
+ const errors = [
301
+ ...validateWorkloadInitReleaseIdentity(approvalArg.release),
302
+ ...validateWorkloadInitCloudlyVerificationSummary(approvalArg.verificationSummary),
303
+ ];
304
+ if (approvalArg.schemaVersion !== 1
305
+ || approvalArg.imageIndexMediaType !== workloadInitReleaseContract.imageIndexMediaType
306
+ || typeof approvalArg.workloadInitImageIndexDigest !== 'string'
307
+ || !isSha256Digest(approvalArg.workloadInitImageIndexDigest)
308
+ || !isPositiveSafeInteger(approvalArg.approvedAt)
309
+ || typeof approvalArg.approvalDigest !== 'string'
310
+ || !isSha256Digest(approvalArg.approvalDigest)) {
311
+ errors.push('WorkloadInit release approval authority fields must be canonical');
312
+ }
313
+ if (!Array.isArray(approvalArg.artifacts)
314
+ || approvalArg.artifacts.length !== 2
315
+ || approvalArg.artifacts.map((artifactArg) => (isRecord(artifactArg) ? artifactArg.platform : undefined)).join(',') !== 'linux/amd64,linux/arm64') {
316
+ errors.push('WorkloadInit release approval must contain amd64 then arm64 artifacts');
317
+ }
318
+ else {
319
+ const manifestDigests = new Set();
320
+ for (const [index, artifactArg] of approvalArg.artifacts.entries()) {
321
+ if (!isRecord(artifactArg)
322
+ || !hasExactKeys(artifactArg, [
323
+ 'platform',
324
+ 'workloadInitPlatformManifestDigest',
325
+ 'workloadInitExecutableDigest',
326
+ ])
327
+ || typeof artifactArg.workloadInitPlatformManifestDigest !== 'string'
328
+ || !isSha256Digest(artifactArg.workloadInitPlatformManifestDigest)
329
+ || typeof artifactArg.workloadInitExecutableDigest !== 'string'
330
+ || !isSha256Digest(artifactArg.workloadInitExecutableDigest)) {
331
+ errors.push(`WorkloadInit release approval artifacts[${index}] must be canonical`);
332
+ }
333
+ else {
334
+ manifestDigests.add(artifactArg.workloadInitPlatformManifestDigest);
335
+ }
336
+ }
337
+ if (manifestDigests.size !== approvalArg.artifacts.length) {
338
+ errors.push('WorkloadInit release approval platform manifest digests must be unique');
339
+ }
340
+ }
341
+ if (isRecord(approvalArg.verificationSummary)) {
342
+ if (approvalArg.verificationSummary.subjectImageIndexDigest
343
+ !== approvalArg.workloadInitImageIndexDigest) {
344
+ errors.push('WorkloadInit release approval subject must match its image index');
345
+ }
346
+ if (isPositiveSafeInteger(approvalArg.verificationSummary.verifiedAt)
347
+ && isPositiveSafeInteger(approvalArg.approvedAt)
348
+ && approvalArg.verificationSummary.verifiedAt > approvalArg.approvedAt) {
349
+ errors.push('WorkloadInit release approval cannot predate verification');
350
+ }
351
+ }
352
+ if (errors.length === 0
353
+ && approvalArg.approvalDigest !== await computeWorkloadInitReleaseApprovalDigest(approvalArg)) {
354
+ errors.push('WorkloadInit release approval digest does not match');
355
+ }
356
+ return errors;
357
+ }
358
+ catch {
359
+ return ['WorkloadInit release approval must be safely inspectable'];
360
+ }
361
+ };
362
+ export const validateWorkloadInitApprovalAuthorityReference = (referenceArg) => {
363
+ if (!isRecord(referenceArg)
364
+ || !hasExactKeys(referenceArg, [
365
+ 'authorityVersion',
366
+ 'authorityGeneration',
367
+ 'approvalDigest',
368
+ ])) {
369
+ return ['WorkloadInit approval authority reference must use its exact schema'];
370
+ }
371
+ const errors = [];
372
+ if (referenceArg.authorityVersion !== 1
373
+ || !isPositiveSafeInteger(referenceArg.authorityGeneration)
374
+ || typeof referenceArg.approvalDigest !== 'string'
375
+ || !isSha256Digest(referenceArg.approvalDigest)) {
376
+ errors.push('WorkloadInit approval authority reference fields must be canonical');
377
+ }
378
+ return errors;
379
+ };
380
+ export const validateWorkloadInitActiveApprovalAuthority = async (authorityArg) => {
381
+ if (!isRecord(authorityArg)
382
+ || !hasExactKeys(authorityArg, [
383
+ 'authorityVersion',
384
+ 'authorityGeneration',
385
+ 'approvalDigest',
386
+ 'approval',
387
+ ])) {
388
+ return ['active WorkloadInit approval authority must use its exact schema'];
389
+ }
390
+ const reference = {
391
+ authorityVersion: authorityArg.authorityVersion,
392
+ authorityGeneration: authorityArg.authorityGeneration,
393
+ approvalDigest: authorityArg.approvalDigest,
394
+ };
395
+ const errors = [
396
+ ...validateWorkloadInitApprovalAuthorityReference(reference),
397
+ ...await validateWorkloadInitReleaseApproval(authorityArg.approval),
398
+ ];
399
+ if (isRecord(authorityArg.approval)
400
+ && authorityArg.approvalDigest !== authorityArg.approval.approvalDigest) {
401
+ errors.push('active WorkloadInit authority must reference its embedded approval');
402
+ }
403
+ return errors;
404
+ };
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS53b3JrbG9hZGluaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ydW50aW1lLndvcmtsb2FkaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RCxXQUFXLEVBQUUsMEJBQTBCO0lBQ3ZDLGdCQUFnQixFQUFFLHNEQUFzRDtJQUN4RSxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLGVBQWUsRUFBRSx5QkFBeUI7SUFDMUMsbUJBQW1CLEVBQUUseUNBQXlDO0lBQzlELGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsYUFBYSxFQUFFLGdDQUFnQztJQUMvQyxTQUFTLEVBQUUsZ0VBQWdFO0lBQzNFLFNBQVMsRUFBRSw0REFBNEQ7SUFDdkUsZUFBZSxFQUFFLHlCQUF5QjtJQUMxQyxrQkFBa0IsRUFBRSxtQkFBbUI7Q0FDL0IsQ0FBQyxDQUFDO0FBMkdaLE1BQU0sb0JBQW9CLEdBQUcscURBQXFELENBQUM7QUFDbkYsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUMxQyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUN6QyxNQUFNLGdCQUFnQixHQUFHLG9DQUFvQyxDQUFDO0FBRTlELE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBaUIsRUFBdUMsRUFBRSxDQUFDLENBQzNFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUM5RSxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsUUFBaUMsRUFDakMsT0FBaUIsRUFDUixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "23.2.0",
3
+ "version": "24.0.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {