@serve.zone/interfaces 31.8.0 → 32.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/.smartconfig.json +1 -0
- package/changelog.md +512 -0
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/appstore/types.d.ts +4 -6
- package/dist_ts/appstore/types.js +5 -5
- package/dist_ts/data/backup.d.ts +3 -26
- package/dist_ts/data/cluster.d.ts +36 -11
- package/dist_ts/data/cluster.js +33 -22
- package/dist_ts/data/clusteringress.d.ts +8 -0
- package/dist_ts/data/clusteringress.js +13 -8
- package/dist_ts/data/clusternode.d.ts +121 -74
- package/dist_ts/data/clusternode.js +109 -132
- package/dist_ts/data/clusterruntime.d.ts +39 -0
- package/dist_ts/data/clusterruntime.js +11 -0
- package/dist_ts/data/coremail.d.ts +3 -7
- package/dist_ts/data/coremail.js +2 -2
- package/dist_ts/data/coremail.runtime.d.ts +0 -1
- package/dist_ts/data/coremail.runtime.js +5 -22
- package/dist_ts/data/deploymentadoption.d.ts +0 -2
- package/dist_ts/data/deploymentadoption.js +40 -6
- package/dist_ts/data/deploymentoperation.js +16 -3
- package/dist_ts/data/deploymentpreflight.d.ts +0 -2
- package/dist_ts/data/deploymentpreflight.js +1 -1
- package/dist_ts/data/immutableimage.d.ts +38 -21
- package/dist_ts/data/immutableimage.js +45 -5
- package/dist_ts/data/index.d.ts +5 -1
- package/dist_ts/data/index.js +5 -1
- package/dist_ts/data/isolatedrestore.d.ts +139 -21
- package/dist_ts/data/isolatedrestore.golden.d.ts +0 -1
- package/dist_ts/data/isolatedrestore.golden.js +6 -9
- package/dist_ts/data/isolatedrestore.js +176 -40
- package/dist_ts/data/mail.d.ts +1 -1
- package/dist_ts/data/networkaddressplan.d.ts +78 -0
- package/dist_ts/data/networkaddressplan.js +114 -0
- package/dist_ts/data/networkauthority.d.ts +20 -22
- package/dist_ts/data/networkauthority.js +29 -43
- package/dist_ts/data/networkcredential.d.ts +10 -10
- package/dist_ts/data/networkcredential.js +16 -16
- package/dist_ts/data/networkdelivery.d.ts +18 -18
- package/dist_ts/data/networkdelivery.js +16 -16
- package/dist_ts/data/networklease.d.ts +18 -7
- package/dist_ts/data/networklease.js +29 -7
- package/dist_ts/data/networknode.d.ts +37 -0
- package/dist_ts/data/networknode.js +6 -0
- package/dist_ts/data/networkprojection.d.ts +59 -60
- package/dist_ts/data/networkprojection.js +53 -57
- package/dist_ts/data/networkprotection.d.ts +27 -28
- package/dist_ts/data/networkprotection.js +36 -36
- package/dist_ts/data/networkrouter.d.ts +11 -11
- package/dist_ts/data/networkrouter.js +1 -1
- package/dist_ts/data/networksigning.d.ts +16 -18
- package/dist_ts/data/networksigning.js +20 -21
- package/dist_ts/data/nodecredential.d.ts +4 -6
- package/dist_ts/data/nodeenrollment.d.ts +35 -40
- package/dist_ts/data/nodeenrollment.js +57 -72
- package/dist_ts/data/privatenetwork.d.ts +21 -24
- package/dist_ts/data/privatenetwork.js +39 -54
- package/dist_ts/data/runtimeassignment.d.ts +50 -34
- package/dist_ts/data/runtimeassignment.js +79 -45
- package/dist_ts/data/runtimeconfig.d.ts +21 -22
- package/dist_ts/data/runtimeconfig.js +37 -100
- package/dist_ts/data/runtimesession.d.ts +100 -62
- package/dist_ts/data/runtimesession.js +98 -79
- package/dist_ts/data/runtimeterminalreceipt.d.ts +28 -29
- package/dist_ts/data/runtimeterminalreceipt.js +42 -42
- package/dist_ts/data/secret.d.ts +18 -25
- package/dist_ts/data/secret.js +12 -52
- package/dist_ts/data/servicecredential.d.ts +14 -16
- package/dist_ts/data/servicecredential.js +17 -28
- package/dist_ts/data/serviceruntime.d.ts +128 -0
- package/dist_ts/data/serviceruntime.js +92 -0
- package/dist_ts/data/sparknodereport.d.ts +27 -14
- package/dist_ts/data/sparknodereport.js +35 -28
- package/dist_ts/data/webpush.d.ts +0 -1
- package/dist_ts/index.d.ts +2 -1
- package/dist_ts/index.js +3 -2
- package/dist_ts/platform/objectstorageretention.d.ts +21 -24
- package/dist_ts/platform/objectstorageretention.js +6 -18
- package/dist_ts/platform/storage.d.ts +1 -3
- package/dist_ts/platform/storagemigration.d.ts +0 -7
- package/dist_ts/platform/storagemigration.golden.d.ts +0 -1
- package/dist_ts/platform/storagemigration.golden.js +8 -12
- package/dist_ts/platform/storagemigration.js +6 -51
- package/dist_ts/platform/types.d.ts +2 -2
- package/dist_ts/private/canonicaljson.d.ts +9 -1
- package/dist_ts/private/canonicaljson.js +14 -2
- package/dist_ts/private/dataproperties.d.ts +62 -0
- package/dist_ts/private/dataproperties.js +117 -0
- package/dist_ts/private/networkcontract.d.ts +14 -10
- package/dist_ts/private/networkcontract.js +15 -1
- package/dist_ts/private/producercontract.d.ts +11 -0
- package/dist_ts/private/producercontract.js +21 -0
- package/dist_ts/private/releaseversion.d.ts +37 -0
- package/dist_ts/private/releaseversion.js +48 -0
- package/dist_ts/private/runtimepolicy.d.ts +31 -0
- package/dist_ts/private/runtimepolicy.js +90 -0
- package/dist_ts/private/tokenlist.d.ts +9 -0
- package/dist_ts/private/tokenlist.js +23 -0
- package/dist_ts/protocol.d.ts +137 -0
- package/dist_ts/protocol.js +255 -0
- package/dist_ts/requests/admin.d.ts +8 -8
- package/dist_ts/requests/backup.d.ts +102 -112
- package/dist_ts/requests/cluster.d.ts +47 -10
- package/dist_ts/requests/cluster.js +1 -1
- package/dist_ts/requests/clusteringress.d.ts +9 -0
- package/dist_ts/requests/clusteringress.js +1 -1
- package/dist_ts/requests/config.d.ts +3 -3
- package/dist_ts/requests/corestore.d.ts +0 -3
- package/dist_ts/requests/corestore.js +5 -9
- package/dist_ts/requests/network.d.ts +87 -31
- package/dist_ts/requests/node.d.ts +15 -28
- package/dist_ts/requests/pallet.d.ts +13 -13
- package/dist_ts/requests/runtimesession.d.ts +53 -41
- package/dist_ts/requests/secret.d.ts +4 -5
- package/dist_ts/requests/secret.js +1 -5
- package/dist_ts/requests/service.d.ts +60 -0
- package/dist_ts/runtime.corestore.d.ts +56 -74
- package/dist_ts/runtime.corestore.databaseexportpackage.d.ts +30 -36
- package/dist_ts/runtime.corestore.databaseexportpackage.golden.d.ts +11 -12
- package/dist_ts/runtime.corestore.databaseexportpackage.golden.js +54 -71
- package/dist_ts/runtime.corestore.databaseexportpackage.js +9 -25
- package/dist_ts/runtime.corestore.js +35 -135
- package/dist_ts/runtime.corestore.relay.js +2 -7
- package/dist_ts/runtime.d.ts +38 -48
- package/dist_ts/runtime.js +20 -77
- package/dist_ts/runtime.networkprojection.d.ts +4 -4
- package/dist_ts/runtime.networkprojection.js +18 -18
- package/dist_ts/runtime.workloadinit.d.ts +23 -24
- package/dist_ts/runtime.workloadinit.js +6 -13
- package/package.json +2 -2
- package/readme.md +540 -269
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/appstore/types.ts +4 -6
- package/ts/data/backup.ts +3 -38
- package/ts/data/cluster.ts +51 -34
- package/ts/data/clusteringress.ts +12 -12
- package/ts/data/clusternode.ts +204 -232
- package/ts/data/clusterruntime.ts +45 -0
- package/ts/data/coremail.runtime.ts +4 -21
- package/ts/data/coremail.ts +3 -7
- package/ts/data/deploymentadoption.ts +46 -4
- package/ts/data/deploymentoperation.ts +16 -1
- package/ts/data/deploymentpreflight.ts +0 -2
- package/ts/data/immutableimage.ts +71 -24
- package/ts/data/index.ts +5 -1
- package/ts/data/isolatedrestore.golden.ts +5 -9
- package/ts/data/isolatedrestore.ts +339 -54
- package/ts/data/mail.ts +1 -1
- package/ts/data/networkaddressplan.ts +175 -0
- package/ts/data/networkauthority.ts +45 -61
- package/ts/data/networkcredential.ts +24 -24
- package/ts/data/networkdelivery.ts +27 -27
- package/ts/data/networklease.ts +40 -13
- package/ts/data/networknode.ts +37 -0
- package/ts/data/networkprojection.ts +119 -124
- package/ts/data/networkprotection.ts +54 -55
- package/ts/data/networkrouter.ts +14 -14
- package/ts/data/networksigning.ts +29 -32
- package/ts/data/nodecredential.ts +4 -6
- package/ts/data/nodeenrollment.ts +96 -114
- package/ts/data/privatenetwork.ts +58 -74
- package/ts/data/runtimeassignment.ts +143 -94
- package/ts/data/runtimeconfig.ts +62 -122
- package/ts/data/runtimesession.ts +185 -138
- package/ts/data/runtimeterminalreceipt.ts +72 -73
- package/ts/data/secret.ts +28 -76
- package/ts/data/servicecredential.ts +33 -43
- package/ts/data/serviceruntime.ts +208 -0
- package/ts/data/sparknodereport.ts +48 -36
- package/ts/data/webpush.ts +0 -1
- package/ts/index.ts +2 -0
- package/ts/platform/objectstorageretention.ts +36 -55
- package/ts/platform/storage.ts +1 -3
- package/ts/platform/storagemigration.golden.ts +7 -11
- package/ts/platform/storagemigration.ts +5 -55
- package/ts/platform/types.ts +2 -2
- package/ts/private/canonicaljson.ts +13 -1
- package/ts/private/dataproperties.ts +139 -0
- package/ts/private/networkcontract.ts +23 -9
- package/ts/private/producercontract.ts +19 -0
- package/ts/private/releaseversion.ts +70 -0
- package/ts/private/runtimepolicy.ts +105 -0
- package/ts/private/tokenlist.ts +30 -0
- package/ts/protocol.ts +364 -0
- package/ts/requests/admin.ts +11 -11
- package/ts/requests/backup.ts +112 -117
- package/ts/requests/cluster.ts +58 -13
- package/ts/requests/clusteringress.ts +9 -0
- package/ts/requests/config.ts +3 -3
- package/ts/requests/corestore.ts +4 -16
- package/ts/requests/network.ts +90 -41
- package/ts/requests/node.ts +21 -38
- package/ts/requests/pallet.ts +17 -17
- package/ts/requests/runtimesession.ts +63 -51
- package/ts/requests/secret.ts +5 -10
- package/ts/requests/service.ts +81 -0
- package/ts/runtime.corestore.databaseexportpackage.golden.ts +77 -95
- package/ts/runtime.corestore.databaseexportpackage.ts +51 -73
- package/ts/runtime.corestore.relay.ts +1 -10
- package/ts/runtime.corestore.ts +118 -268
- package/ts/runtime.networkprojection.ts +30 -30
- package/ts/runtime.ts +83 -158
- package/ts/runtime.workloadinit.ts +36 -48
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.d.ts +0 -902
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.d.ts +0 -35
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.js +0 -315
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.js +0 -3315
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.d.ts +0 -291
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.d.ts +0 -30
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.js +0 -408
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.js +0 -1126
- package/ts/runtime.cloudlylegacydeploymentsettlement.golden.ts +0 -421
- package/ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.ts +0 -510
- package/ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.ts +0 -2470
- package/ts/runtime.cloudlylegacydeploymentsettlement.ts +0 -6630
|
@@ -1,3315 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.runtime.js';
|
|
2
|
-
import { canonicalizeStrictJson, deepFreezeValue, } from './private/canonicaljson.js';
|
|
3
|
-
export const cloudlyLegacyDeploymentSettlementLimits = Object.freeze({
|
|
4
|
-
maximumIdentifierLength: 200,
|
|
5
|
-
maximumSourceDocuments: 2000,
|
|
6
|
-
maximumOperations: 500,
|
|
7
|
-
maximumPlanBytes: 512 * 1024,
|
|
8
|
-
maximumSafeResultBytes: 16 * 1024,
|
|
9
|
-
maximumReceiptBytes: 512 * 1024,
|
|
10
|
-
maximumAuthorityBytes: 16 * 1024,
|
|
11
|
-
maximumAuthenticatedArtifactBytes: 768 * 1024,
|
|
12
|
-
maximumAuthorityLifetimeMs: 24 * 60 * 60 * 1000,
|
|
13
|
-
maximumFailureReasons: 32,
|
|
14
|
-
});
|
|
15
|
-
export const cloudlyLegacyDeploymentSettlementDomains = Object.freeze({
|
|
16
|
-
authorityAad: 'serve.zone/cloudly-legacy-deployment-settlement/authority-aad-v1\0',
|
|
17
|
-
rehearsalBindingHmac: 'serve.zone/cloudly-legacy-deployment-settlement/rehearsal-binding-hmac-v1\0',
|
|
18
|
-
planHmac: 'serve.zone/cloudly-legacy-deployment-settlement/plan-hmac-v1\0',
|
|
19
|
-
productionRequestHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-request-hmac-v1\0',
|
|
20
|
-
checkResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/check-result-hmac-v1\0',
|
|
21
|
-
applyResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/apply-result-hmac-v1\0',
|
|
22
|
-
stableOutcomeHmac: 'serve.zone/cloudly-legacy-deployment-settlement/stable-outcome-hmac-v1\0',
|
|
23
|
-
scratchReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/scratch-receipt-hmac-v1\0',
|
|
24
|
-
productionReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-receipt-hmac-v1\0',
|
|
25
|
-
productionExecutionAuthorizationHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-execution-authorization-hmac-v1\0',
|
|
26
|
-
productionReceiptV2Hmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-receipt-hmac-v2\0',
|
|
27
|
-
resolutionHmac: 'serve.zone/cloudly-legacy-deployment-settlement/resolution-recovery-attestation-hmac-v1\0',
|
|
28
|
-
});
|
|
29
|
-
/** Safe error surface: code and schema path are finite and never contain values. */
|
|
30
|
-
export class CloudlyLegacyDeploymentSettlementCodecError extends Error {
|
|
31
|
-
code;
|
|
32
|
-
path;
|
|
33
|
-
constructor(codeArg, pathArg) {
|
|
34
|
-
super(`${codeArg}:${pathArg}`);
|
|
35
|
-
this.name = 'CloudlyLegacyDeploymentSettlementCodecError';
|
|
36
|
-
this.code = codeArg;
|
|
37
|
-
this.path = pathArg;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const authorityCoreKeys = ['operationId', 'authorityId', 'keyId', 'keyVersion'];
|
|
41
|
-
const authorityReferenceKeys = [...authorityCoreKeys, 'authorityMetadataSha256'];
|
|
42
|
-
const authorityMetadataKeys = [
|
|
43
|
-
'schemaVersion',
|
|
44
|
-
...authorityCoreKeys,
|
|
45
|
-
'settlementId',
|
|
46
|
-
'issuedAt',
|
|
47
|
-
'expiresAt',
|
|
48
|
-
'maintenanceImageDigest',
|
|
49
|
-
'sourceImageDigest',
|
|
50
|
-
'targetImageDigest',
|
|
51
|
-
'targetVersion',
|
|
52
|
-
'targetManifestSha256',
|
|
53
|
-
'targetConfigSha256',
|
|
54
|
-
'backupId',
|
|
55
|
-
'backupSnapshotIdSha256',
|
|
56
|
-
'backupProofSha256',
|
|
57
|
-
'runId',
|
|
58
|
-
'rehearsalId',
|
|
59
|
-
'scratchServiceId',
|
|
60
|
-
'allocationId',
|
|
61
|
-
'allocationGeneration',
|
|
62
|
-
'allocationBindingSha256',
|
|
63
|
-
'allocationReceiptSha256',
|
|
64
|
-
'sourceDataSha256',
|
|
65
|
-
'restoredDataSha256',
|
|
66
|
-
'digestProofSha256',
|
|
67
|
-
];
|
|
68
|
-
const authorityMetadataOptionalKeys = [
|
|
69
|
-
'executionProtocol',
|
|
70
|
-
'sourceAuthority',
|
|
71
|
-
'sourceAuthenticatedPlanSha256',
|
|
72
|
-
'sourceRequestBundleSha256',
|
|
73
|
-
'scratchReceiptSha256',
|
|
74
|
-
];
|
|
75
|
-
const authorityMetadataCrossAuthorityKeys = [
|
|
76
|
-
'schemaVersion',
|
|
77
|
-
'operationId',
|
|
78
|
-
'keyVersion',
|
|
79
|
-
'settlementId',
|
|
80
|
-
'maintenanceImageDigest',
|
|
81
|
-
'sourceImageDigest',
|
|
82
|
-
'targetImageDigest',
|
|
83
|
-
'targetVersion',
|
|
84
|
-
'targetManifestSha256',
|
|
85
|
-
'targetConfigSha256',
|
|
86
|
-
'backupId',
|
|
87
|
-
'backupSnapshotIdSha256',
|
|
88
|
-
'backupProofSha256',
|
|
89
|
-
'runId',
|
|
90
|
-
'rehearsalId',
|
|
91
|
-
'scratchServiceId',
|
|
92
|
-
'allocationId',
|
|
93
|
-
'allocationGeneration',
|
|
94
|
-
'allocationBindingSha256',
|
|
95
|
-
'allocationReceiptSha256',
|
|
96
|
-
'sourceDataSha256',
|
|
97
|
-
'restoredDataSha256',
|
|
98
|
-
'digestProofSha256',
|
|
99
|
-
];
|
|
100
|
-
const classificationKeys = [
|
|
101
|
-
'image-recorded-not-current',
|
|
102
|
-
'image-recorded-current-failed',
|
|
103
|
-
'rolling-out-current-failed',
|
|
104
|
-
'rolling-out-superseded',
|
|
105
|
-
];
|
|
106
|
-
const censusKeys = [
|
|
107
|
-
'operations',
|
|
108
|
-
'services',
|
|
109
|
-
'images',
|
|
110
|
-
'releases',
|
|
111
|
-
'rolloutOperations',
|
|
112
|
-
'routeClaims',
|
|
113
|
-
'resourceClaims',
|
|
114
|
-
];
|
|
115
|
-
const mutationCountKeys = [
|
|
116
|
-
'operationCount',
|
|
117
|
-
'routeClaimsStabilized',
|
|
118
|
-
'routeClaimsRemoved',
|
|
119
|
-
'resourceClaimsRemoved',
|
|
120
|
-
];
|
|
121
|
-
const planEntryKeys = [
|
|
122
|
-
'operationId',
|
|
123
|
-
'serviceId',
|
|
124
|
-
'sourceRevision',
|
|
125
|
-
'sourceState',
|
|
126
|
-
'classification',
|
|
127
|
-
'finalRevision',
|
|
128
|
-
'sourceDocumentHmac',
|
|
129
|
-
'finalDocumentHmac',
|
|
130
|
-
'routeClaimsStabilized',
|
|
131
|
-
'routeClaimsRemoved',
|
|
132
|
-
'resourceClaimsRemoved',
|
|
133
|
-
];
|
|
134
|
-
const failureReasons = new Set([
|
|
135
|
-
'AUTHORITY_INVALID',
|
|
136
|
-
'AUTHORITY_EXPIRED',
|
|
137
|
-
'REQUEST_MISMATCH',
|
|
138
|
-
'PLAN_MISMATCH',
|
|
139
|
-
'SOURCE_STATE_MISMATCH',
|
|
140
|
-
'FINAL_STATE_MISMATCH',
|
|
141
|
-
'TRANSACTIONS_UNSUPPORTED',
|
|
142
|
-
'OPERATION_DRIFT',
|
|
143
|
-
'CLAIM_DRIFT',
|
|
144
|
-
'CLASSIFICATION_MISMATCH',
|
|
145
|
-
]);
|
|
146
|
-
const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9:._@-]{0,199}$/;
|
|
147
|
-
const sha256Pattern = /^[a-f0-9]{64}$/;
|
|
148
|
-
const ociDigestPattern = /^sha256:[a-f0-9]{64}$/;
|
|
149
|
-
const stateHmacPattern = /^hmac-sha256:[a-f0-9]{64}$/;
|
|
150
|
-
const macPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
151
|
-
const raw32ByteBase64UrlPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
152
|
-
const fail = (codeArg, pathArg) => {
|
|
153
|
-
throw new CloudlyLegacyDeploymentSettlementCodecError(codeArg, pathArg);
|
|
154
|
-
};
|
|
155
|
-
const readRecord = (valueArg, pathArg) => {
|
|
156
|
-
if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
|
|
157
|
-
return fail('INVALID_DATA', pathArg);
|
|
158
|
-
}
|
|
159
|
-
const prototype = Object.getPrototypeOf(valueArg);
|
|
160
|
-
if (prototype !== Object.prototype && prototype !== null) {
|
|
161
|
-
return fail('INVALID_DATA', pathArg);
|
|
162
|
-
}
|
|
163
|
-
const record = valueArg;
|
|
164
|
-
for (const key of Reflect.ownKeys(record)) {
|
|
165
|
-
if (typeof key !== 'string')
|
|
166
|
-
return fail('INVALID_DATA', pathArg);
|
|
167
|
-
const descriptor = Object.getOwnPropertyDescriptor(record, key);
|
|
168
|
-
if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
|
|
169
|
-
return fail('INVALID_DATA', pathArg);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return record;
|
|
173
|
-
};
|
|
174
|
-
const readArray = (valueArg, pathArg, maximumLengthArg, minimumLengthArg = 0) => {
|
|
175
|
-
if (!Array.isArray(valueArg) || Object.getPrototypeOf(valueArg) !== Array.prototype) {
|
|
176
|
-
return fail('INVALID_DATA', pathArg);
|
|
177
|
-
}
|
|
178
|
-
if (valueArg.length < minimumLengthArg || valueArg.length > maximumLengthArg) {
|
|
179
|
-
return fail('LIMIT_EXCEEDED', pathArg);
|
|
180
|
-
}
|
|
181
|
-
for (let index = 0; index < valueArg.length; index++) {
|
|
182
|
-
if (!Object.hasOwn(valueArg, index))
|
|
183
|
-
return fail('INVALID_DATA', `${pathArg}[${index}]`);
|
|
184
|
-
const descriptor = Object.getOwnPropertyDescriptor(valueArg, String(index));
|
|
185
|
-
if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
|
|
186
|
-
return fail('INVALID_DATA', `${pathArg}[${index}]`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
for (const key of Reflect.ownKeys(valueArg)) {
|
|
190
|
-
if (key === 'length')
|
|
191
|
-
continue;
|
|
192
|
-
if (typeof key !== 'string'
|
|
193
|
-
|| !/^(?:0|[1-9][0-9]*)$/.test(key)
|
|
194
|
-
|| Number(key) >= valueArg.length) {
|
|
195
|
-
return fail('INVALID_DATA', pathArg);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return valueArg;
|
|
199
|
-
};
|
|
200
|
-
const assertExactKeys = (valueArg, keysArg, pathArg) => {
|
|
201
|
-
const actual = Object.keys(valueArg).sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
|
|
202
|
-
const expected = [...keysArg].sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
|
|
203
|
-
if (actual.length !== expected.length
|
|
204
|
-
|| actual.some((keyArg, indexArg) => keyArg !== expected[indexArg])) {
|
|
205
|
-
fail('INVALID_SCHEMA', pathArg);
|
|
206
|
-
}
|
|
207
|
-
};
|
|
208
|
-
const readIdentifier = (valueArg, pathArg) => {
|
|
209
|
-
if (typeof valueArg !== 'string' || !identifierPattern.test(valueArg)) {
|
|
210
|
-
return fail('INVALID_VALUE', pathArg);
|
|
211
|
-
}
|
|
212
|
-
return valueArg;
|
|
213
|
-
};
|
|
214
|
-
const readSha256 = (valueArg, pathArg) => {
|
|
215
|
-
if (typeof valueArg !== 'string' || !sha256Pattern.test(valueArg)) {
|
|
216
|
-
return fail('INVALID_VALUE', pathArg);
|
|
217
|
-
}
|
|
218
|
-
return valueArg;
|
|
219
|
-
};
|
|
220
|
-
const readOciDigest = (valueArg, pathArg) => {
|
|
221
|
-
if (typeof valueArg !== 'string' || !ociDigestPattern.test(valueArg)) {
|
|
222
|
-
return fail('INVALID_VALUE', pathArg);
|
|
223
|
-
}
|
|
224
|
-
return valueArg;
|
|
225
|
-
};
|
|
226
|
-
const readStateHmac = (valueArg, pathArg) => {
|
|
227
|
-
if (typeof valueArg !== 'string' || !stateHmacPattern.test(valueArg)) {
|
|
228
|
-
return fail('INVALID_VALUE', pathArg);
|
|
229
|
-
}
|
|
230
|
-
return valueArg;
|
|
231
|
-
};
|
|
232
|
-
const readMac = (valueArg, pathArg) => {
|
|
233
|
-
if (typeof valueArg !== 'string' || !macPattern.test(valueArg)) {
|
|
234
|
-
return fail('INVALID_VALUE', pathArg);
|
|
235
|
-
}
|
|
236
|
-
const bytes = Buffer.from(valueArg, 'base64url');
|
|
237
|
-
if (bytes.byteLength !== 32 || bytes.toString('base64url') !== valueArg) {
|
|
238
|
-
return fail('INVALID_VALUE', pathArg);
|
|
239
|
-
}
|
|
240
|
-
return valueArg;
|
|
241
|
-
};
|
|
242
|
-
const readInteger = (valueArg, pathArg, minimumArg = 0, maximumArg = Number.MAX_SAFE_INTEGER) => {
|
|
243
|
-
if (typeof valueArg !== 'number'
|
|
244
|
-
|| !Number.isSafeInteger(valueArg)
|
|
245
|
-
|| Object.is(valueArg, -0)
|
|
246
|
-
|| valueArg < minimumArg
|
|
247
|
-
|| valueArg > maximumArg) {
|
|
248
|
-
return fail('INVALID_VALUE', pathArg);
|
|
249
|
-
}
|
|
250
|
-
return valueArg;
|
|
251
|
-
};
|
|
252
|
-
const readBoolean = (valueArg, pathArg) => {
|
|
253
|
-
if (typeof valueArg !== 'boolean')
|
|
254
|
-
return fail('INVALID_VALUE', pathArg);
|
|
255
|
-
return valueArg;
|
|
256
|
-
};
|
|
257
|
-
const readLiteral = (valueArg, literalsArg, pathArg) => {
|
|
258
|
-
if (typeof valueArg !== 'string' || !literalsArg.includes(valueArg)) {
|
|
259
|
-
return fail('INVALID_VALUE', pathArg);
|
|
260
|
-
}
|
|
261
|
-
return valueArg;
|
|
262
|
-
};
|
|
263
|
-
const canonicalize = (valueArg, pathArg) => (canonicalizeStrictJson(valueArg, () => fail('INVALID_DATA', pathArg), pathArg));
|
|
264
|
-
const finalize = (valueArg, maximumBytesArg, pathArg) => {
|
|
265
|
-
const json = canonicalize(valueArg, pathArg);
|
|
266
|
-
if (Buffer.byteLength(json, 'utf8') > maximumBytesArg) {
|
|
267
|
-
return fail('LIMIT_EXCEEDED', pathArg);
|
|
268
|
-
}
|
|
269
|
-
return deepFreezeValue(valueArg);
|
|
270
|
-
};
|
|
271
|
-
const encodeNormalized = (valueArg, pathArg) => (Buffer.from(canonicalize(valueArg, pathArg), 'utf8'));
|
|
272
|
-
const frame = (domainArg, payloadArg) => {
|
|
273
|
-
const domain = Buffer.from(domainArg, 'utf8');
|
|
274
|
-
const output = new Uint8Array(domain.byteLength + payloadArg.byteLength);
|
|
275
|
-
output.set(domain, 0);
|
|
276
|
-
output.set(payloadArg, domain.byteLength);
|
|
277
|
-
return output;
|
|
278
|
-
};
|
|
279
|
-
const digestBytes = (valueArg) => (plugins.crypto.createHash('sha256').update(new Uint8Array(valueArg)).digest('hex'));
|
|
280
|
-
const normalizeAuthorityReferenceInternal = (valueArg, pathArg) => {
|
|
281
|
-
const value = readRecord(valueArg, pathArg);
|
|
282
|
-
assertExactKeys(value, authorityReferenceKeys, pathArg);
|
|
283
|
-
if (value.keyVersion !== 1)
|
|
284
|
-
fail('INVALID_VALUE', `${pathArg}.keyVersion`);
|
|
285
|
-
return {
|
|
286
|
-
operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
|
|
287
|
-
authorityId: readIdentifier(value.authorityId, `${pathArg}.authorityId`),
|
|
288
|
-
keyId: readIdentifier(value.keyId, `${pathArg}.keyId`),
|
|
289
|
-
keyVersion: 1,
|
|
290
|
-
authorityMetadataSha256: readSha256(value.authorityMetadataSha256, `${pathArg}.authorityMetadataSha256`),
|
|
291
|
-
};
|
|
292
|
-
};
|
|
293
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReference = (valueArg) => finalize(normalizeAuthorityReferenceInternal(valueArg, 'authorityReference'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
|
|
294
|
-
const normalizeAuthorityMetadataInternal = (valueArg, pathArg) => {
|
|
295
|
-
const value = readRecord(valueArg, pathArg);
|
|
296
|
-
const optionalKeys = authorityMetadataOptionalKeys.filter((keyArg) => Object.hasOwn(value, keyArg));
|
|
297
|
-
assertExactKeys(value, [...authorityMetadataKeys, ...optionalKeys], pathArg);
|
|
298
|
-
if (value.schemaVersion !== 1 || value.keyVersion !== 1) {
|
|
299
|
-
fail('INVALID_VALUE', `${pathArg}.schemaVersion`);
|
|
300
|
-
}
|
|
301
|
-
const issuedAt = readInteger(value.issuedAt, `${pathArg}.issuedAt`, 1);
|
|
302
|
-
const expiresAt = readInteger(value.expiresAt, `${pathArg}.expiresAt`, 1);
|
|
303
|
-
if (expiresAt <= issuedAt
|
|
304
|
-
|| expiresAt - issuedAt
|
|
305
|
-
> cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityLifetimeMs) {
|
|
306
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.expiresAt`);
|
|
307
|
-
}
|
|
308
|
-
const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
|
|
309
|
-
const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
|
|
310
|
-
if (sourceDataSha256 !== restoredDataSha256) {
|
|
311
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
|
|
312
|
-
}
|
|
313
|
-
const predecessorKeys = authorityMetadataOptionalKeys.filter((keyArg) => (keyArg !== 'executionProtocol'));
|
|
314
|
-
const hasExecutionProtocol = Object.hasOwn(value, 'executionProtocol');
|
|
315
|
-
const predecessorKeyCount = predecessorKeys.filter((keyArg) => Object.hasOwn(value, keyArg)).length;
|
|
316
|
-
if (hasExecutionProtocol && value.executionProtocol !== 'fenced-attempt-v1') {
|
|
317
|
-
fail('INVALID_VALUE', `${pathArg}.executionProtocol`);
|
|
318
|
-
}
|
|
319
|
-
if (predecessorKeyCount !== 0 && predecessorKeyCount !== predecessorKeys.length) {
|
|
320
|
-
fail('INVALID_SCHEMA', `${pathArg}.sourceAuthority`);
|
|
321
|
-
}
|
|
322
|
-
if (predecessorKeyCount > 0 && !hasExecutionProtocol) {
|
|
323
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.executionProtocol`);
|
|
324
|
-
}
|
|
325
|
-
const operationId = readIdentifier(value.operationId, `${pathArg}.operationId`);
|
|
326
|
-
const authorityId = readIdentifier(value.authorityId, `${pathArg}.authorityId`);
|
|
327
|
-
const keyId = readIdentifier(value.keyId, `${pathArg}.keyId`);
|
|
328
|
-
const sourceAuthority = predecessorKeyCount === 0
|
|
329
|
-
? undefined
|
|
330
|
-
: normalizeAuthorityReferenceInternal(value.sourceAuthority, `${pathArg}.sourceAuthority`);
|
|
331
|
-
if (sourceAuthority
|
|
332
|
-
&& (sourceAuthority.operationId !== operationId
|
|
333
|
-
|| sourceAuthority.authorityId === authorityId
|
|
334
|
-
|| sourceAuthority.keyId === keyId)) {
|
|
335
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.sourceAuthority`);
|
|
336
|
-
}
|
|
337
|
-
const common = {
|
|
338
|
-
schemaVersion: 1,
|
|
339
|
-
operationId,
|
|
340
|
-
authorityId,
|
|
341
|
-
keyId,
|
|
342
|
-
keyVersion: 1,
|
|
343
|
-
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
344
|
-
issuedAt,
|
|
345
|
-
expiresAt,
|
|
346
|
-
maintenanceImageDigest: readOciDigest(value.maintenanceImageDigest, `${pathArg}.maintenanceImageDigest`),
|
|
347
|
-
sourceImageDigest: readOciDigest(value.sourceImageDigest, `${pathArg}.sourceImageDigest`),
|
|
348
|
-
targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
|
|
349
|
-
targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
|
|
350
|
-
targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
|
|
351
|
-
targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
|
|
352
|
-
backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
|
|
353
|
-
backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
|
|
354
|
-
backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
|
|
355
|
-
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
356
|
-
rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
|
|
357
|
-
scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
|
|
358
|
-
allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
|
|
359
|
-
allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
|
|
360
|
-
allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
|
|
361
|
-
allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
|
|
362
|
-
sourceDataSha256,
|
|
363
|
-
restoredDataSha256,
|
|
364
|
-
digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
|
|
365
|
-
};
|
|
366
|
-
if (!hasExecutionProtocol) {
|
|
367
|
-
return common;
|
|
368
|
-
}
|
|
369
|
-
if (!sourceAuthority) {
|
|
370
|
-
return {
|
|
371
|
-
...common,
|
|
372
|
-
executionProtocol: 'fenced-attempt-v1',
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
return {
|
|
376
|
-
...common,
|
|
377
|
-
executionProtocol: 'fenced-attempt-v1',
|
|
378
|
-
sourceAuthority,
|
|
379
|
-
sourceAuthenticatedPlanSha256: readSha256(value.sourceAuthenticatedPlanSha256, `${pathArg}.sourceAuthenticatedPlanSha256`),
|
|
380
|
-
sourceRequestBundleSha256: readSha256(value.sourceRequestBundleSha256, `${pathArg}.sourceRequestBundleSha256`),
|
|
381
|
-
scratchReceiptSha256: readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`),
|
|
382
|
-
};
|
|
383
|
-
};
|
|
384
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => finalize(normalizeAuthorityMetadataInternal(valueArg, 'authorityMetadata'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityMetadata');
|
|
385
|
-
export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg), 'authorityMetadata');
|
|
386
|
-
export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadataAad = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.authorityAad, encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
|
|
387
|
-
export const digestCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
|
|
388
|
-
export const createCloudlyLegacyDeploymentSettlementAuthorityReference = (metadataArg) => {
|
|
389
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
390
|
-
return finalize({
|
|
391
|
-
operationId: metadata.operationId,
|
|
392
|
-
authorityId: metadata.authorityId,
|
|
393
|
-
keyId: metadata.keyId,
|
|
394
|
-
keyVersion: metadata.keyVersion,
|
|
395
|
-
authorityMetadataSha256: digestCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadata),
|
|
396
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
|
|
397
|
-
};
|
|
398
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata = (referenceArg, metadataArg) => {
|
|
399
|
-
const reference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReference(referenceArg);
|
|
400
|
-
const expected = createCloudlyLegacyDeploymentSettlementAuthorityReference(metadataArg);
|
|
401
|
-
if (canonicalize(reference, 'authorityReference')
|
|
402
|
-
!== canonicalize(expected, 'authorityReference.expected')) {
|
|
403
|
-
fail('CROSS_FIELD_MISMATCH', 'authorityReference');
|
|
404
|
-
}
|
|
405
|
-
return reference;
|
|
406
|
-
};
|
|
407
|
-
const normalizeFencedSourceAuthorityMetadata = (metadataArg, pathArg) => {
|
|
408
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
409
|
-
if (metadata.executionProtocol !== 'fenced-attempt-v1'
|
|
410
|
-
|| Object.hasOwn(metadata, 'sourceAuthority')) {
|
|
411
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
412
|
-
}
|
|
413
|
-
return metadata;
|
|
414
|
-
};
|
|
415
|
-
const normalizeProductionAuthorityMetadataPair = (productionMetadataArg, sourceMetadataArg) => {
|
|
416
|
-
const productionMetadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(productionMetadataArg);
|
|
417
|
-
const sourceMetadata = normalizeFencedSourceAuthorityMetadata(sourceMetadataArg, 'sourceAuthorityMetadata');
|
|
418
|
-
if (productionMetadata.executionProtocol !== 'fenced-attempt-v1'
|
|
419
|
-
|| !Object.hasOwn(productionMetadata, 'sourceAuthority')) {
|
|
420
|
-
fail('CROSS_FIELD_MISMATCH', 'productionAuthorityMetadata');
|
|
421
|
-
}
|
|
422
|
-
const fencedSourceMetadata = sourceMetadata;
|
|
423
|
-
const fencedProductionMetadata = productionMetadata;
|
|
424
|
-
const sourceAuthority = createCloudlyLegacyDeploymentSettlementAuthorityReference(fencedSourceMetadata);
|
|
425
|
-
const productionAuthority = createCloudlyLegacyDeploymentSettlementAuthorityReference(fencedProductionMetadata);
|
|
426
|
-
const sourceContext = Object.fromEntries(authorityMetadataCrossAuthorityKeys.map((keyArg) => [
|
|
427
|
-
keyArg,
|
|
428
|
-
fencedSourceMetadata[keyArg],
|
|
429
|
-
]));
|
|
430
|
-
const productionContext = Object.fromEntries(authorityMetadataCrossAuthorityKeys.map((keyArg) => [
|
|
431
|
-
keyArg,
|
|
432
|
-
fencedProductionMetadata[keyArg],
|
|
433
|
-
]));
|
|
434
|
-
if (canonicalize(fencedProductionMetadata.sourceAuthority, 'productionMetadata.sourceAuthority')
|
|
435
|
-
!== canonicalize(sourceAuthority, 'sourceMetadata.authority')
|
|
436
|
-
|| canonicalize(productionAuthority, 'productionMetadata.authority')
|
|
437
|
-
=== canonicalize(sourceAuthority, 'sourceMetadata.authority')
|
|
438
|
-
|| fencedProductionMetadata.authorityId === fencedSourceMetadata.authorityId
|
|
439
|
-
|| fencedProductionMetadata.keyId === fencedSourceMetadata.keyId
|
|
440
|
-
|| canonicalize(productionContext, 'productionMetadata.context')
|
|
441
|
-
!== canonicalize(sourceContext, 'sourceMetadata.context')) {
|
|
442
|
-
fail('CROSS_FIELD_MISMATCH', 'productionAuthorityMetadata.sourceAuthority');
|
|
443
|
-
}
|
|
444
|
-
return {
|
|
445
|
-
productionMetadata: fencedProductionMetadata,
|
|
446
|
-
sourceMetadata: fencedSourceMetadata,
|
|
447
|
-
};
|
|
448
|
-
};
|
|
449
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionAuthorityMetadataForSourceAuthority = (productionMetadataArg, sourceMetadataArg) => (normalizeProductionAuthorityMetadataPair(productionMetadataArg, sourceMetadataArg).productionMetadata);
|
|
450
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => {
|
|
451
|
-
const value = readRecord(valueArg, 'authorityHandoffPlaintext');
|
|
452
|
-
assertExactKeys(value, [
|
|
453
|
-
'schemaVersion',
|
|
454
|
-
'kind',
|
|
455
|
-
'authorityMetadata',
|
|
456
|
-
'authorityReference',
|
|
457
|
-
'hmacKeyPlaintext',
|
|
458
|
-
], 'authorityHandoffPlaintext');
|
|
459
|
-
if (value.schemaVersion !== 1
|
|
460
|
-
|| value.kind
|
|
461
|
-
!== 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext') {
|
|
462
|
-
fail('INVALID_VALUE', 'authorityHandoffPlaintext.kind');
|
|
463
|
-
}
|
|
464
|
-
const authorityMetadata = normalizeAuthorityMetadataInternal(value.authorityMetadata, 'authorityHandoffPlaintext.authorityMetadata');
|
|
465
|
-
const authorityReference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(value.authorityReference, authorityMetadata);
|
|
466
|
-
const key = readRecord(value.hmacKeyPlaintext, 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
467
|
-
assertExactKeys(key, ['format', 'value'], 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
468
|
-
const keyValue = typeof key.value === 'string'
|
|
469
|
-
? key.value
|
|
470
|
-
: fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
|
|
471
|
-
if (key.format !== 'raw-32-byte-base64url'
|
|
472
|
-
|| !raw32ByteBase64UrlPattern.test(keyValue)) {
|
|
473
|
-
fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
474
|
-
}
|
|
475
|
-
const keyBytes = Buffer.from(keyValue, 'base64url');
|
|
476
|
-
try {
|
|
477
|
-
if (keyBytes.byteLength !== 32 || keyBytes.toString('base64url') !== keyValue) {
|
|
478
|
-
fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
finally {
|
|
482
|
-
keyBytes.fill(0);
|
|
483
|
-
}
|
|
484
|
-
return finalize({
|
|
485
|
-
schemaVersion: 1,
|
|
486
|
-
kind: 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext',
|
|
487
|
-
authorityMetadata,
|
|
488
|
-
authorityReference,
|
|
489
|
-
hmacKeyPlaintext: { format: 'raw-32-byte-base64url', value: keyValue },
|
|
490
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityHandoffPlaintext');
|
|
491
|
-
};
|
|
492
|
-
export const encodeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(valueArg), 'authorityHandoffPlaintext');
|
|
493
|
-
/**
|
|
494
|
-
* Private in-process stdio handoff verification only. Do not persist or log the
|
|
495
|
-
* handoff or returned verifier; discard both as soon as the stdio exchange ends.
|
|
496
|
-
*/
|
|
497
|
-
export const createCloudlyLegacyDeploymentSettlementStdioHandoffHmacVerifier = (handoffArg) => {
|
|
498
|
-
const handoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(handoffArg);
|
|
499
|
-
const authorityCanonical = canonicalize(handoff.authorityReference, 'stdioHandoffHmacVerifier.authority');
|
|
500
|
-
const keyValue = handoff.hmacKeyPlaintext.value;
|
|
501
|
-
return (inputArg) => {
|
|
502
|
-
let keyBytes;
|
|
503
|
-
let suppliedMacBytes;
|
|
504
|
-
let expectedMacBytes;
|
|
505
|
-
try {
|
|
506
|
-
if (!(inputArg.hmacInput instanceof Uint8Array)
|
|
507
|
-
|| canonicalize(inputArg.authority, 'stdioHandoffHmacVerifier.input.authority')
|
|
508
|
-
!== authorityCanonical
|
|
509
|
-
|| !macPattern.test(inputArg.mac)) {
|
|
510
|
-
return false;
|
|
511
|
-
}
|
|
512
|
-
const domainBytes = Buffer.from(inputArg.domain, 'utf8');
|
|
513
|
-
const hmacInputBytes = Buffer.from(inputArg.hmacInput);
|
|
514
|
-
if (hmacInputBytes.byteLength < domainBytes.byteLength
|
|
515
|
-
|| !hmacInputBytes.subarray(0, domainBytes.byteLength).equals(domainBytes)) {
|
|
516
|
-
return false;
|
|
517
|
-
}
|
|
518
|
-
keyBytes = Buffer.from(keyValue, 'base64url');
|
|
519
|
-
suppliedMacBytes = Buffer.from(inputArg.mac, 'base64url');
|
|
520
|
-
if (keyBytes.byteLength !== 32
|
|
521
|
-
|| keyBytes.toString('base64url') !== keyValue
|
|
522
|
-
|| suppliedMacBytes.byteLength !== 32
|
|
523
|
-
|| suppliedMacBytes.toString('base64url') !== inputArg.mac) {
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
expectedMacBytes = plugins.crypto
|
|
527
|
-
.createHmac('sha256', keyBytes)
|
|
528
|
-
.update(hmacInputBytes)
|
|
529
|
-
.digest();
|
|
530
|
-
return plugins.crypto.timingSafeEqual(expectedMacBytes, suppliedMacBytes);
|
|
531
|
-
}
|
|
532
|
-
catch {
|
|
533
|
-
return false;
|
|
534
|
-
}
|
|
535
|
-
finally {
|
|
536
|
-
keyBytes?.fill(0);
|
|
537
|
-
suppliedMacBytes?.fill(0);
|
|
538
|
-
expectedMacBytes?.fill(0);
|
|
539
|
-
}
|
|
540
|
-
};
|
|
541
|
-
};
|
|
542
|
-
const normalizeClassificationCounts = (valueArg, pathArg) => {
|
|
543
|
-
const value = readRecord(valueArg, pathArg);
|
|
544
|
-
assertExactKeys(value, classificationKeys, pathArg);
|
|
545
|
-
return {
|
|
546
|
-
'image-recorded-not-current': readInteger(value['image-recorded-not-current'], `${pathArg}.image-recorded-not-current`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
547
|
-
'image-recorded-current-failed': readInteger(value['image-recorded-current-failed'], `${pathArg}.image-recorded-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
548
|
-
'rolling-out-current-failed': readInteger(value['rolling-out-current-failed'], `${pathArg}.rolling-out-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
549
|
-
'rolling-out-superseded': readInteger(value['rolling-out-superseded'], `${pathArg}.rolling-out-superseded`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
550
|
-
};
|
|
551
|
-
};
|
|
552
|
-
const sumClassificationCounts = (valueArg) => classificationKeys.reduce((sumArg, keyArg) => sumArg + valueArg[keyArg], 0);
|
|
553
|
-
const normalizeSourceCensus = (valueArg, pathArg) => {
|
|
554
|
-
const value = readRecord(valueArg, pathArg);
|
|
555
|
-
assertExactKeys(value, censusKeys, pathArg);
|
|
556
|
-
const output = Object.fromEntries(censusKeys.map((keyArg) => [
|
|
557
|
-
keyArg,
|
|
558
|
-
readInteger(value[keyArg], `${pathArg}.${keyArg}`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments),
|
|
559
|
-
]));
|
|
560
|
-
if (censusKeys.reduce((sumArg, keyArg) => sumArg + output[keyArg], 0)
|
|
561
|
-
> cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments) {
|
|
562
|
-
fail('LIMIT_EXCEEDED', pathArg);
|
|
563
|
-
}
|
|
564
|
-
return output;
|
|
565
|
-
};
|
|
566
|
-
const normalizeMutationCounts = (valueArg, pathArg) => {
|
|
567
|
-
const value = readRecord(valueArg, pathArg);
|
|
568
|
-
assertExactKeys(value, mutationCountKeys, pathArg);
|
|
569
|
-
return {
|
|
570
|
-
operationCount: readInteger(value.operationCount, `${pathArg}.operationCount`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
571
|
-
routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
|
|
572
|
-
routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
|
|
573
|
-
resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
|
|
574
|
-
};
|
|
575
|
-
};
|
|
576
|
-
const assertCountsMatchClassifications = (countsArg, classificationsArg, pathArg) => {
|
|
577
|
-
if (countsArg.operationCount !== sumClassificationCounts(classificationsArg)) {
|
|
578
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
579
|
-
}
|
|
580
|
-
};
|
|
581
|
-
const normalizePlanEntry = (valueArg, pathArg) => {
|
|
582
|
-
const value = readRecord(valueArg, pathArg);
|
|
583
|
-
assertExactKeys(value, planEntryKeys, pathArg);
|
|
584
|
-
const sourceRevision = readInteger(value.sourceRevision, `${pathArg}.sourceRevision`, 0);
|
|
585
|
-
const finalRevision = readInteger(value.finalRevision, `${pathArg}.finalRevision`, 0);
|
|
586
|
-
if (finalRevision !== sourceRevision + 3 || !Number.isSafeInteger(sourceRevision + 3)) {
|
|
587
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.finalRevision`);
|
|
588
|
-
}
|
|
589
|
-
const sourceState = readLiteral(value.sourceState, ['image-recorded', 'rolling-out'], `${pathArg}.sourceState`);
|
|
590
|
-
const classification = readLiteral(value.classification, classificationKeys, `${pathArg}.classification`);
|
|
591
|
-
if ((classification.startsWith('image-recorded-') && sourceState !== 'image-recorded')
|
|
592
|
-
|| (classification.startsWith('rolling-out-') && sourceState !== 'rolling-out')) {
|
|
593
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.classification`);
|
|
594
|
-
}
|
|
595
|
-
return {
|
|
596
|
-
operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
|
|
597
|
-
serviceId: readIdentifier(value.serviceId, `${pathArg}.serviceId`),
|
|
598
|
-
sourceRevision,
|
|
599
|
-
sourceState,
|
|
600
|
-
classification,
|
|
601
|
-
finalRevision,
|
|
602
|
-
sourceDocumentHmac: readStateHmac(value.sourceDocumentHmac, `${pathArg}.sourceDocumentHmac`),
|
|
603
|
-
finalDocumentHmac: readStateHmac(value.finalDocumentHmac, `${pathArg}.finalDocumentHmac`),
|
|
604
|
-
routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
|
|
605
|
-
routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
|
|
606
|
-
resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
|
|
607
|
-
};
|
|
608
|
-
};
|
|
609
|
-
export const normalizeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => {
|
|
610
|
-
const value = readRecord(valueArg, 'plan');
|
|
611
|
-
assertExactKeys(value, [
|
|
612
|
-
'schemaVersion',
|
|
613
|
-
'kind',
|
|
614
|
-
'authority',
|
|
615
|
-
'settlementId',
|
|
616
|
-
'effectiveAt',
|
|
617
|
-
'sourceStateHmac',
|
|
618
|
-
'finalStateHmac',
|
|
619
|
-
'sourceCensus',
|
|
620
|
-
'entries',
|
|
621
|
-
'classificationCounts',
|
|
622
|
-
'operationCount',
|
|
623
|
-
], 'plan');
|
|
624
|
-
if (value.schemaVersion !== 1
|
|
625
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-plan') {
|
|
626
|
-
fail('INVALID_VALUE', 'plan.kind');
|
|
627
|
-
}
|
|
628
|
-
const entries = readArray(value.entries, 'plan.entries', cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => normalizePlanEntry(entryArg, `plan.entries[${indexArg}]`));
|
|
629
|
-
for (let index = 1; index < entries.length; index++) {
|
|
630
|
-
if (entries[index - 1].operationId >= entries[index].operationId) {
|
|
631
|
-
fail('ORDERING_REQUIRED', `plan.entries[${index}].operationId`);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
const classificationCounts = normalizeClassificationCounts(value.classificationCounts, 'plan.classificationCounts');
|
|
635
|
-
const operationCount = readInteger(value.operationCount, 'plan.operationCount', 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations);
|
|
636
|
-
if (operationCount !== entries.length
|
|
637
|
-
|| operationCount !== sumClassificationCounts(classificationCounts)) {
|
|
638
|
-
fail('CROSS_FIELD_MISMATCH', 'plan.operationCount');
|
|
639
|
-
}
|
|
640
|
-
const actualCounts = Object.fromEntries(classificationKeys.map((keyArg) => [
|
|
641
|
-
keyArg,
|
|
642
|
-
entries.filter((entryArg) => entryArg.classification === keyArg).length,
|
|
643
|
-
]));
|
|
644
|
-
if (classificationKeys.some((keyArg) => actualCounts[keyArg] !== classificationCounts[keyArg])) {
|
|
645
|
-
fail('CROSS_FIELD_MISMATCH', 'plan.classificationCounts');
|
|
646
|
-
}
|
|
647
|
-
return finalize({
|
|
648
|
-
schemaVersion: 1,
|
|
649
|
-
kind: 'cloudly-legacy-deployment-settlement-plan',
|
|
650
|
-
authority: normalizeAuthorityReferenceInternal(value.authority, 'plan.authority'),
|
|
651
|
-
settlementId: readIdentifier(value.settlementId, 'plan.settlementId'),
|
|
652
|
-
effectiveAt: readInteger(value.effectiveAt, 'plan.effectiveAt', 1),
|
|
653
|
-
sourceStateHmac: readStateHmac(value.sourceStateHmac, 'plan.sourceStateHmac'),
|
|
654
|
-
finalStateHmac: readStateHmac(value.finalStateHmac, 'plan.finalStateHmac'),
|
|
655
|
-
sourceCensus: normalizeSourceCensus(value.sourceCensus, 'plan.sourceCensus'),
|
|
656
|
-
entries,
|
|
657
|
-
classificationCounts,
|
|
658
|
-
operationCount,
|
|
659
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumPlanBytes, 'plan');
|
|
660
|
-
};
|
|
661
|
-
export const encodeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementPlan(valueArg), 'plan');
|
|
662
|
-
export const encodeCloudlyLegacyDeploymentSettlementPlanHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeNormalized(normalizeUnsignedAuthenticatedPlanInternal(valueArg, 'unsignedAuthenticatedPlan'), 'unsignedAuthenticatedPlan'));
|
|
663
|
-
export const digestCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementPlan(valueArg));
|
|
664
|
-
const normalizeFailureReasons = (valueArg, pathArg) => {
|
|
665
|
-
const values = readArray(valueArg, pathArg, cloudlyLegacyDeploymentSettlementLimits.maximumFailureReasons, 1);
|
|
666
|
-
const output = values.map((entryArg, indexArg) => {
|
|
667
|
-
if (typeof entryArg !== 'string'
|
|
668
|
-
|| !failureReasons.has(entryArg)) {
|
|
669
|
-
return fail('INVALID_VALUE', `${pathArg}[${indexArg}]`);
|
|
670
|
-
}
|
|
671
|
-
return entryArg;
|
|
672
|
-
});
|
|
673
|
-
for (let index = 1; index < output.length; index++) {
|
|
674
|
-
if (output[index - 1] >= output[index]) {
|
|
675
|
-
fail('ORDERING_REQUIRED', `${pathArg}[${index}]`);
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
return output;
|
|
679
|
-
};
|
|
680
|
-
const normalizeSafeResultBase = (valueArg, pathArg) => {
|
|
681
|
-
const counts = normalizeMutationCounts(valueArg.counts, `${pathArg}.counts`);
|
|
682
|
-
const classificationCounts = normalizeClassificationCounts(valueArg.classificationCounts, `${pathArg}.classificationCounts`);
|
|
683
|
-
assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
|
|
684
|
-
return {
|
|
685
|
-
requestSha256: readSha256(valueArg.requestSha256, `${pathArg}.requestSha256`),
|
|
686
|
-
planSha256: readSha256(valueArg.planSha256, `${pathArg}.planSha256`),
|
|
687
|
-
settlementId: readIdentifier(valueArg.settlementId, `${pathArg}.settlementId`),
|
|
688
|
-
sourceStateHmac: readStateHmac(valueArg.sourceStateHmac, `${pathArg}.sourceStateHmac`),
|
|
689
|
-
finalStateHmac: readStateHmac(valueArg.finalStateHmac, `${pathArg}.finalStateHmac`),
|
|
690
|
-
transactionSupported: readBoolean(valueArg.transactionSupported, `${pathArg}.transactionSupported`),
|
|
691
|
-
counts,
|
|
692
|
-
classificationCounts,
|
|
693
|
-
};
|
|
694
|
-
};
|
|
695
|
-
export const normalizeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => {
|
|
696
|
-
const value = readRecord(valueArg, 'checkResult');
|
|
697
|
-
const status = readLiteral(value.status, ['ready', 'blocked'], 'checkResult.status');
|
|
698
|
-
assertExactKeys(value, [
|
|
699
|
-
'schemaVersion',
|
|
700
|
-
'kind',
|
|
701
|
-
'status',
|
|
702
|
-
'requestSha256',
|
|
703
|
-
'planSha256',
|
|
704
|
-
'settlementId',
|
|
705
|
-
'sourceStateHmac',
|
|
706
|
-
'finalStateHmac',
|
|
707
|
-
'transactionSupported',
|
|
708
|
-
'disposition',
|
|
709
|
-
'counts',
|
|
710
|
-
'classificationCounts',
|
|
711
|
-
...(status === 'blocked' ? ['failureReasons'] : []),
|
|
712
|
-
'checkedAt',
|
|
713
|
-
], 'checkResult');
|
|
714
|
-
if (value.schemaVersion !== 1
|
|
715
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-check-result') {
|
|
716
|
-
fail('INVALID_VALUE', 'checkResult.kind');
|
|
717
|
-
}
|
|
718
|
-
const base = normalizeSafeResultBase(value, 'checkResult');
|
|
719
|
-
const result = status === 'ready'
|
|
720
|
-
? {
|
|
721
|
-
schemaVersion: 1,
|
|
722
|
-
kind: 'cloudly-legacy-deployment-settlement-check-result',
|
|
723
|
-
status,
|
|
724
|
-
...base,
|
|
725
|
-
disposition: readLiteral(value.disposition, ['unapplied', 'exact-replay', 'no-op'], 'checkResult.disposition'),
|
|
726
|
-
checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
|
|
727
|
-
}
|
|
728
|
-
: {
|
|
729
|
-
schemaVersion: 1,
|
|
730
|
-
kind: 'cloudly-legacy-deployment-settlement-check-result',
|
|
731
|
-
status,
|
|
732
|
-
...base,
|
|
733
|
-
disposition: readLiteral(value.disposition, ['unapplied'], 'checkResult.disposition'),
|
|
734
|
-
failureReasons: normalizeFailureReasons(value.failureReasons, 'checkResult.failureReasons'),
|
|
735
|
-
checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
|
|
736
|
-
};
|
|
737
|
-
const transactionFailurePresent = result.status === 'blocked'
|
|
738
|
-
&& result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
|
|
739
|
-
if ((result.status === 'ready' && !result.transactionSupported)
|
|
740
|
-
|| (result.status === 'blocked'
|
|
741
|
-
&& transactionFailurePresent === result.transactionSupported)) {
|
|
742
|
-
fail('CROSS_FIELD_MISMATCH', 'checkResult.transactionSupported');
|
|
743
|
-
}
|
|
744
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'checkResult');
|
|
745
|
-
};
|
|
746
|
-
export const encodeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementCheckResult(valueArg), 'checkResult');
|
|
747
|
-
export const encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedCheckResultInternal(valueArg, 'unsignedAuthenticatedCheckResult'), 'unsignedAuthenticatedCheckResult'));
|
|
748
|
-
export const digestCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
|
|
749
|
-
export const normalizeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => {
|
|
750
|
-
const value = readRecord(valueArg, 'applyResult');
|
|
751
|
-
const status = readLiteral(value.status, ['completed', 'rejected'], 'applyResult.status');
|
|
752
|
-
assertExactKeys(value, [
|
|
753
|
-
'schemaVersion',
|
|
754
|
-
'kind',
|
|
755
|
-
'status',
|
|
756
|
-
'requestSha256',
|
|
757
|
-
'planSha256',
|
|
758
|
-
'settlementId',
|
|
759
|
-
'sourceStateHmac',
|
|
760
|
-
'finalStateHmac',
|
|
761
|
-
'transactionSupported',
|
|
762
|
-
'disposition',
|
|
763
|
-
'counts',
|
|
764
|
-
'classificationCounts',
|
|
765
|
-
...(status === 'rejected' ? ['failureReasons', 'rejectedAt'] : ['completedAt']),
|
|
766
|
-
], 'applyResult');
|
|
767
|
-
if (value.schemaVersion !== 1
|
|
768
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-apply-result') {
|
|
769
|
-
fail('INVALID_VALUE', 'applyResult.kind');
|
|
770
|
-
}
|
|
771
|
-
const base = normalizeSafeResultBase(value, 'applyResult');
|
|
772
|
-
const result = status === 'completed'
|
|
773
|
-
? {
|
|
774
|
-
schemaVersion: 1,
|
|
775
|
-
kind: 'cloudly-legacy-deployment-settlement-apply-result',
|
|
776
|
-
status,
|
|
777
|
-
...base,
|
|
778
|
-
disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], 'applyResult.disposition'),
|
|
779
|
-
completedAt: readInteger(value.completedAt, 'applyResult.completedAt', 1),
|
|
780
|
-
}
|
|
781
|
-
: {
|
|
782
|
-
schemaVersion: 1,
|
|
783
|
-
kind: 'cloudly-legacy-deployment-settlement-apply-result',
|
|
784
|
-
status,
|
|
785
|
-
...base,
|
|
786
|
-
disposition: readLiteral(value.disposition, ['unapplied'], 'applyResult.disposition'),
|
|
787
|
-
failureReasons: normalizeFailureReasons(value.failureReasons, 'applyResult.failureReasons'),
|
|
788
|
-
rejectedAt: readInteger(value.rejectedAt, 'applyResult.rejectedAt', 1),
|
|
789
|
-
};
|
|
790
|
-
const transactionFailurePresent = result.status === 'rejected'
|
|
791
|
-
&& result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
|
|
792
|
-
if ((result.status === 'completed' && !result.transactionSupported)
|
|
793
|
-
|| (result.status === 'rejected'
|
|
794
|
-
&& transactionFailurePresent === result.transactionSupported)) {
|
|
795
|
-
fail('CROSS_FIELD_MISMATCH', 'applyResult.transactionSupported');
|
|
796
|
-
}
|
|
797
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'applyResult');
|
|
798
|
-
};
|
|
799
|
-
export const encodeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementApplyResult(valueArg), 'applyResult');
|
|
800
|
-
export const encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedApplyResultInternal(valueArg, 'unsignedAuthenticatedApplyResult'), 'unsignedAuthenticatedApplyResult'));
|
|
801
|
-
export const digestCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
|
|
802
|
-
const rehearsalBindingKeys = [
|
|
803
|
-
'schemaVersion',
|
|
804
|
-
'kind',
|
|
805
|
-
'settlementId',
|
|
806
|
-
'runId',
|
|
807
|
-
'rehearsalId',
|
|
808
|
-
'scratchServiceId',
|
|
809
|
-
'allocationId',
|
|
810
|
-
'allocationGeneration',
|
|
811
|
-
'allocationBindingSha256',
|
|
812
|
-
'allocationReceiptSha256',
|
|
813
|
-
'backupId',
|
|
814
|
-
'backupSnapshotIdSha256',
|
|
815
|
-
'backupProofSha256',
|
|
816
|
-
'sourceDataSha256',
|
|
817
|
-
'restoredDataSha256',
|
|
818
|
-
'digestProofSha256',
|
|
819
|
-
'targetImageDigest',
|
|
820
|
-
'targetVersion',
|
|
821
|
-
'targetManifestSha256',
|
|
822
|
-
'targetConfigSha256',
|
|
823
|
-
];
|
|
824
|
-
const normalizeRehearsalBindingInternal = (valueArg, pathArg) => {
|
|
825
|
-
const value = readRecord(valueArg, pathArg);
|
|
826
|
-
assertExactKeys(value, rehearsalBindingKeys, pathArg);
|
|
827
|
-
if (value.schemaVersion !== 1
|
|
828
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-rehearsal-binding') {
|
|
829
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
830
|
-
}
|
|
831
|
-
const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
|
|
832
|
-
const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
|
|
833
|
-
if (sourceDataSha256 !== restoredDataSha256) {
|
|
834
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
|
|
835
|
-
}
|
|
836
|
-
return {
|
|
837
|
-
schemaVersion: 1,
|
|
838
|
-
kind: 'cloudly-legacy-deployment-settlement-rehearsal-binding',
|
|
839
|
-
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
840
|
-
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
841
|
-
rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
|
|
842
|
-
scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
|
|
843
|
-
allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
|
|
844
|
-
allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
|
|
845
|
-
allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
|
|
846
|
-
allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
|
|
847
|
-
backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
|
|
848
|
-
backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
|
|
849
|
-
backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
|
|
850
|
-
sourceDataSha256,
|
|
851
|
-
restoredDataSha256,
|
|
852
|
-
digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
|
|
853
|
-
targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
|
|
854
|
-
targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
|
|
855
|
-
targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
|
|
856
|
-
targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
|
|
857
|
-
};
|
|
858
|
-
};
|
|
859
|
-
export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => finalize(normalizeRehearsalBindingInternal(valueArg, 'rehearsalBinding'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'rehearsalBinding');
|
|
860
|
-
export const encodeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg), 'rehearsalBinding');
|
|
861
|
-
export const encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeNormalized(normalizeUnsignedAuthenticatedRehearsalBindingInternal(valueArg, 'unsignedAuthenticatedRehearsalBinding'), 'unsignedAuthenticatedRehearsalBinding'));
|
|
862
|
-
export const digestCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
|
|
863
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => {
|
|
864
|
-
const value = readRecord(valueArg, 'productionRequest');
|
|
865
|
-
assertExactKeys(value, [
|
|
866
|
-
'schemaVersion',
|
|
867
|
-
'kind',
|
|
868
|
-
'authority',
|
|
869
|
-
'plan',
|
|
870
|
-
'planSha256',
|
|
871
|
-
'rehearsalBinding',
|
|
872
|
-
'rehearsalBindingSha256',
|
|
873
|
-
'requestedAt',
|
|
874
|
-
], 'productionRequest');
|
|
875
|
-
if (value.schemaVersion !== 1
|
|
876
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-production-request') {
|
|
877
|
-
fail('INVALID_VALUE', 'productionRequest.kind');
|
|
878
|
-
}
|
|
879
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, 'productionRequest.authority');
|
|
880
|
-
const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(value.plan);
|
|
881
|
-
const planSha256 = readSha256(value.planSha256, 'productionRequest.planSha256');
|
|
882
|
-
const rehearsalBinding = normalizeRehearsalBindingInternal(value.rehearsalBinding, 'productionRequest.rehearsalBinding');
|
|
883
|
-
const rehearsalBindingSha256 = readSha256(value.rehearsalBindingSha256, 'productionRequest.rehearsalBindingSha256');
|
|
884
|
-
if (canonicalize(authority, 'productionRequest.authority')
|
|
885
|
-
!== canonicalize(plan.authority, 'productionRequest.plan.authority')) {
|
|
886
|
-
fail('CROSS_FIELD_MISMATCH', 'productionRequest.authority');
|
|
887
|
-
}
|
|
888
|
-
if (planSha256 !== digestCloudlyLegacyDeploymentSettlementPlan(plan)) {
|
|
889
|
-
fail('CROSS_FIELD_MISMATCH', 'productionRequest.planSha256');
|
|
890
|
-
}
|
|
891
|
-
if (rehearsalBindingSha256
|
|
892
|
-
!== digestCloudlyLegacyDeploymentSettlementRehearsalBinding(rehearsalBinding)) {
|
|
893
|
-
fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBindingSha256');
|
|
894
|
-
}
|
|
895
|
-
if (plan.settlementId !== rehearsalBinding.settlementId) {
|
|
896
|
-
fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBinding.settlementId');
|
|
897
|
-
}
|
|
898
|
-
const requestedAt = readInteger(value.requestedAt, 'productionRequest.requestedAt', 1);
|
|
899
|
-
if (requestedAt < plan.effectiveAt) {
|
|
900
|
-
fail('CROSS_FIELD_MISMATCH', 'productionRequest.requestedAt');
|
|
901
|
-
}
|
|
902
|
-
return finalize({
|
|
903
|
-
schemaVersion: 1,
|
|
904
|
-
kind: 'cloudly-legacy-deployment-settlement-production-request',
|
|
905
|
-
authority,
|
|
906
|
-
plan,
|
|
907
|
-
planSha256,
|
|
908
|
-
rehearsalBinding,
|
|
909
|
-
rehearsalBindingSha256,
|
|
910
|
-
requestedAt,
|
|
911
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, 'productionRequest');
|
|
912
|
-
};
|
|
913
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg), 'productionRequest');
|
|
914
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
|
|
915
|
-
const stableOutcomeKeys = [
|
|
916
|
-
'schemaVersion',
|
|
917
|
-
'kind',
|
|
918
|
-
'settlementId',
|
|
919
|
-
'runId',
|
|
920
|
-
'rehearsalBindingSha256',
|
|
921
|
-
'effectiveAt',
|
|
922
|
-
'planSha256',
|
|
923
|
-
'sourceStateHmac',
|
|
924
|
-
'finalStateHmac',
|
|
925
|
-
'settlements',
|
|
926
|
-
'counts',
|
|
927
|
-
'classificationCounts',
|
|
928
|
-
];
|
|
929
|
-
const normalizeStableOutcomeInternal = (valueArg, pathArg) => {
|
|
930
|
-
const value = readRecord(valueArg, pathArg);
|
|
931
|
-
assertExactKeys(value, stableOutcomeKeys, pathArg);
|
|
932
|
-
if (value.schemaVersion !== 1
|
|
933
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-stable-outcome') {
|
|
934
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
935
|
-
}
|
|
936
|
-
const counts = normalizeMutationCounts(value.counts, `${pathArg}.counts`);
|
|
937
|
-
const classificationCounts = normalizeClassificationCounts(value.classificationCounts, `${pathArg}.classificationCounts`);
|
|
938
|
-
assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
|
|
939
|
-
const settlements = readArray(value.settlements, `${pathArg}.settlements`, cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => {
|
|
940
|
-
const entryPath = `${pathArg}.settlements[${indexArg}]`;
|
|
941
|
-
const entry = readRecord(entryArg, entryPath);
|
|
942
|
-
assertExactKeys(entry, ['operationId', 'finalRevision', 'finalDocumentHmac'], entryPath);
|
|
943
|
-
return {
|
|
944
|
-
operationId: readIdentifier(entry.operationId, `${entryPath}.operationId`),
|
|
945
|
-
finalRevision: readInteger(entry.finalRevision, `${entryPath}.finalRevision`, 1),
|
|
946
|
-
finalDocumentHmac: readStateHmac(entry.finalDocumentHmac, `${entryPath}.finalDocumentHmac`),
|
|
947
|
-
};
|
|
948
|
-
});
|
|
949
|
-
for (let index = 1; index < settlements.length; index++) {
|
|
950
|
-
if (settlements[index - 1].operationId >= settlements[index].operationId) {
|
|
951
|
-
fail('ORDERING_REQUIRED', `${pathArg}.settlements[${index}].operationId`);
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
if (settlements.length !== counts.operationCount) {
|
|
955
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.settlements`);
|
|
956
|
-
}
|
|
957
|
-
return {
|
|
958
|
-
schemaVersion: 1,
|
|
959
|
-
kind: 'cloudly-legacy-deployment-settlement-stable-outcome',
|
|
960
|
-
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
961
|
-
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
962
|
-
rehearsalBindingSha256: readSha256(value.rehearsalBindingSha256, `${pathArg}.rehearsalBindingSha256`),
|
|
963
|
-
effectiveAt: readInteger(value.effectiveAt, `${pathArg}.effectiveAt`, 1),
|
|
964
|
-
planSha256: readSha256(value.planSha256, `${pathArg}.planSha256`),
|
|
965
|
-
sourceStateHmac: readStateHmac(value.sourceStateHmac, `${pathArg}.sourceStateHmac`),
|
|
966
|
-
finalStateHmac: readStateHmac(value.finalStateHmac, `${pathArg}.finalStateHmac`),
|
|
967
|
-
settlements,
|
|
968
|
-
counts,
|
|
969
|
-
classificationCounts,
|
|
970
|
-
};
|
|
971
|
-
};
|
|
972
|
-
export const normalizeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => finalize(normalizeStableOutcomeInternal(valueArg, 'stableOutcome'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'stableOutcome');
|
|
973
|
-
export const encodeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg), 'stableOutcome');
|
|
974
|
-
export const encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeNormalized(normalizeUnsignedAuthenticatedStableOutcomeInternal(valueArg, 'unsignedAuthenticatedStableOutcome'), 'unsignedAuthenticatedStableOutcome'));
|
|
975
|
-
export const digestCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
|
|
976
|
-
const authenticatedArtifactKeys = [
|
|
977
|
-
'schemaVersion',
|
|
978
|
-
'kind',
|
|
979
|
-
'authority',
|
|
980
|
-
'payload',
|
|
981
|
-
'payloadSha256',
|
|
982
|
-
'mac',
|
|
983
|
-
];
|
|
984
|
-
const unsignedAuthenticatedArtifactKeys = authenticatedArtifactKeys.filter((keyArg) => keyArg !== 'mac');
|
|
985
|
-
const normalizeUnsignedAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
|
|
986
|
-
const value = readRecord(valueArg, pathArg);
|
|
987
|
-
assertExactKeys(value, unsignedAuthenticatedArtifactKeys, pathArg);
|
|
988
|
-
if (value.schemaVersion !== 1 || value.kind !== kindArg) {
|
|
989
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
990
|
-
}
|
|
991
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
992
|
-
const payload = normalizePayloadArg(value.payload);
|
|
993
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
994
|
-
if (payloadSha256 !== digestBytes(encodeNormalized(payload, `${pathArg}.payload`))) {
|
|
995
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
996
|
-
}
|
|
997
|
-
if (getPayloadAuthorityArg
|
|
998
|
-
&& canonicalize(authority, `${pathArg}.authority`)
|
|
999
|
-
!== canonicalize(getPayloadAuthorityArg(payload), `${pathArg}.payload.authority`)) {
|
|
1000
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
|
|
1001
|
-
}
|
|
1002
|
-
return {
|
|
1003
|
-
schemaVersion: 1,
|
|
1004
|
-
kind: kindArg,
|
|
1005
|
-
authority,
|
|
1006
|
-
payload: payload,
|
|
1007
|
-
payloadSha256,
|
|
1008
|
-
};
|
|
1009
|
-
};
|
|
1010
|
-
const normalizeAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
|
|
1011
|
-
const value = readRecord(valueArg, pathArg);
|
|
1012
|
-
assertExactKeys(value, authenticatedArtifactKeys, pathArg);
|
|
1013
|
-
const unsignedInput = Object.fromEntries(unsignedAuthenticatedArtifactKeys.map((keyArg) => [
|
|
1014
|
-
keyArg,
|
|
1015
|
-
value[keyArg],
|
|
1016
|
-
]));
|
|
1017
|
-
return {
|
|
1018
|
-
...normalizeUnsignedAuthenticatedArtifactInternal(unsignedInput, `${pathArg}.unsigned`, kindArg, normalizePayloadArg, getPayloadAuthorityArg),
|
|
1019
|
-
mac: readMac(value.mac, `${pathArg}.mac`),
|
|
1020
|
-
};
|
|
1021
|
-
};
|
|
1022
|
-
const normalizeUnsignedAuthenticatedRehearsalBindingInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding);
|
|
1023
|
-
const normalizeUnsignedAuthenticatedPlanInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority);
|
|
1024
|
-
const normalizeUnsignedAuthenticatedProductionRequestInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority);
|
|
1025
|
-
const normalizeUnsignedAuthenticatedCheckResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult);
|
|
1026
|
-
const normalizeUnsignedAuthenticatedApplyResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult);
|
|
1027
|
-
const normalizeUnsignedAuthenticatedStableOutcomeInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome);
|
|
1028
|
-
const finalizeAuthenticatedArtifact = (valueArg, pathArg) => finalize(valueArg, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, pathArg);
|
|
1029
|
-
/** Structural only. Use the async ForAuthority variant to authenticate its MAC. */
|
|
1030
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedRehearsalBinding', 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding), 'authenticatedRehearsalBinding'));
|
|
1031
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedPlan', 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority), 'authenticatedPlan'));
|
|
1032
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedProductionRequest', 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority), 'authenticatedProductionRequest'));
|
|
1033
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedCheckResult', 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult), 'authenticatedCheckResult'));
|
|
1034
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedApplyResult', 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult), 'authenticatedApplyResult'));
|
|
1035
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedStableOutcome', 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome), 'authenticatedStableOutcome'));
|
|
1036
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeNormalized(normalizeUnsignedAuthenticatedProductionRequestInternal(valueArg, 'unsignedAuthenticatedProductionRequest'), 'unsignedAuthenticatedProductionRequest'));
|
|
1037
|
-
const encodeAuthenticatedArtifact = (valueArg, normalizeArg, pathArg) => encodeNormalized(normalizeArg(valueArg), pathArg);
|
|
1038
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure, 'authenticatedRehearsalBinding');
|
|
1039
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure, 'authenticatedPlan');
|
|
1040
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure, 'authenticatedProductionRequest');
|
|
1041
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure, 'authenticatedCheckResult');
|
|
1042
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure, 'authenticatedApplyResult');
|
|
1043
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure, 'authenticatedStableOutcome');
|
|
1044
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
|
|
1045
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan(valueArg));
|
|
1046
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
|
|
1047
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
|
|
1048
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
|
|
1049
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
|
|
1050
|
-
const scratchReceiptKeys = [
|
|
1051
|
-
'schemaVersion',
|
|
1052
|
-
'kind',
|
|
1053
|
-
'authority',
|
|
1054
|
-
'requestSha256',
|
|
1055
|
-
'stableOutcome',
|
|
1056
|
-
'stableOutcomeSha256',
|
|
1057
|
-
'transactionCommitted',
|
|
1058
|
-
'disposition',
|
|
1059
|
-
'completedAt',
|
|
1060
|
-
'payloadSha256',
|
|
1061
|
-
'mac',
|
|
1062
|
-
];
|
|
1063
|
-
const scratchReceiptPayloadKeys = scratchReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
|
|
1064
|
-
const unsignedScratchReceiptKeys = scratchReceiptKeys.filter((keyArg) => keyArg !== 'mac');
|
|
1065
|
-
const scratchReceiptPayload = (valueArg) => ({
|
|
1066
|
-
schemaVersion: valueArg.schemaVersion,
|
|
1067
|
-
kind: valueArg.kind,
|
|
1068
|
-
authority: valueArg.authority,
|
|
1069
|
-
requestSha256: valueArg.requestSha256,
|
|
1070
|
-
stableOutcome: valueArg.stableOutcome,
|
|
1071
|
-
stableOutcomeSha256: valueArg.stableOutcomeSha256,
|
|
1072
|
-
transactionCommitted: valueArg.transactionCommitted,
|
|
1073
|
-
disposition: valueArg.disposition,
|
|
1074
|
-
completedAt: valueArg.completedAt,
|
|
1075
|
-
});
|
|
1076
|
-
const normalizeScratchReceiptPayloadInternal = (valueArg, pathArg) => {
|
|
1077
|
-
const value = readRecord(valueArg, pathArg);
|
|
1078
|
-
assertExactKeys(value, scratchReceiptPayloadKeys, pathArg);
|
|
1079
|
-
if (value.schemaVersion !== 1
|
|
1080
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-scratch-receipt'
|
|
1081
|
-
|| value.transactionCommitted !== true) {
|
|
1082
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1083
|
-
}
|
|
1084
|
-
const output = {
|
|
1085
|
-
schemaVersion: 1,
|
|
1086
|
-
kind: 'cloudly-legacy-deployment-settlement-scratch-receipt',
|
|
1087
|
-
authority: normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`),
|
|
1088
|
-
requestSha256: readSha256(value.requestSha256, `${pathArg}.requestSha256`),
|
|
1089
|
-
stableOutcome: normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`),
|
|
1090
|
-
stableOutcomeSha256: readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`),
|
|
1091
|
-
transactionCommitted: true,
|
|
1092
|
-
disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`),
|
|
1093
|
-
completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, 1),
|
|
1094
|
-
};
|
|
1095
|
-
if (output.stableOutcomeSha256
|
|
1096
|
-
!== digestBytes(encodeNormalized(output.stableOutcome, `${pathArg}.stableOutcome`))) {
|
|
1097
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcomeSha256`);
|
|
1098
|
-
}
|
|
1099
|
-
return output;
|
|
1100
|
-
};
|
|
1101
|
-
const normalizeUnsignedScratchReceiptInternal = (valueArg, pathArg) => {
|
|
1102
|
-
const value = readRecord(valueArg, pathArg);
|
|
1103
|
-
assertExactKeys(value, unsignedScratchReceiptKeys, pathArg);
|
|
1104
|
-
const payloadInput = Object.fromEntries(scratchReceiptPayloadKeys.map((keyArg) => [
|
|
1105
|
-
keyArg,
|
|
1106
|
-
value[keyArg],
|
|
1107
|
-
]));
|
|
1108
|
-
const payload = normalizeScratchReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
1109
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
1110
|
-
if (payloadSha256 !== digestBytes(encodeNormalized(scratchReceiptPayload(payload), `${pathArg}.payload`))) {
|
|
1111
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
1112
|
-
}
|
|
1113
|
-
return { ...payload, payloadSha256 };
|
|
1114
|
-
};
|
|
1115
|
-
const normalizeScratchReceiptInternal = (valueArg, pathArg) => {
|
|
1116
|
-
const value = readRecord(valueArg, pathArg);
|
|
1117
|
-
assertExactKeys(value, scratchReceiptKeys, pathArg);
|
|
1118
|
-
const unsignedInput = Object.fromEntries(unsignedScratchReceiptKeys.map((keyArg) => [
|
|
1119
|
-
keyArg,
|
|
1120
|
-
value[keyArg],
|
|
1121
|
-
]));
|
|
1122
|
-
const unsigned = normalizeUnsignedScratchReceiptInternal(unsignedInput, `${pathArg}.unsigned`);
|
|
1123
|
-
return {
|
|
1124
|
-
...unsigned,
|
|
1125
|
-
mac: readMac(value.mac, `${pathArg}.mac`),
|
|
1126
|
-
};
|
|
1127
|
-
};
|
|
1128
|
-
export const digestCloudlyLegacyDeploymentSettlementScratchReceiptPayload = (valueArg) => {
|
|
1129
|
-
const payload = normalizeScratchReceiptPayloadInternal(valueArg, 'scratchReceiptPayload');
|
|
1130
|
-
return digestBytes(encodeNormalized(scratchReceiptPayload(payload), 'scratchReceiptPayload'));
|
|
1131
|
-
};
|
|
1132
|
-
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => finalize(normalizeScratchReceiptInternal(valueArg, 'scratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'scratchReceipt');
|
|
1133
|
-
export const encodeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg), 'scratchReceipt');
|
|
1134
|
-
export const encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput = (valueArg) => {
|
|
1135
|
-
const authenticated = finalize(normalizeUnsignedScratchReceiptInternal(valueArg, 'unsignedScratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedScratchReceipt');
|
|
1136
|
-
return frame(cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeNormalized(authenticated, 'scratchReceipt.authenticated'));
|
|
1137
|
-
};
|
|
1138
|
-
export const digestCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg));
|
|
1139
|
-
const productionReceiptKeys = [
|
|
1140
|
-
'schemaVersion',
|
|
1141
|
-
'kind',
|
|
1142
|
-
'authority',
|
|
1143
|
-
'requestSha256',
|
|
1144
|
-
'scratchReceipt',
|
|
1145
|
-
'scratchReceiptSha256',
|
|
1146
|
-
'stableOutcome',
|
|
1147
|
-
'stableOutcomeSha256',
|
|
1148
|
-
'transactionCommitted',
|
|
1149
|
-
'disposition',
|
|
1150
|
-
'completedAt',
|
|
1151
|
-
'payloadSha256',
|
|
1152
|
-
'mac',
|
|
1153
|
-
];
|
|
1154
|
-
const productionReceiptPayloadKeys = productionReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
|
|
1155
|
-
const unsignedProductionReceiptKeys = productionReceiptKeys.filter((keyArg) => keyArg !== 'mac');
|
|
1156
|
-
const productionReceiptPayload = (valueArg) => ({
|
|
1157
|
-
schemaVersion: valueArg.schemaVersion,
|
|
1158
|
-
kind: valueArg.kind,
|
|
1159
|
-
authority: valueArg.authority,
|
|
1160
|
-
requestSha256: valueArg.requestSha256,
|
|
1161
|
-
scratchReceipt: valueArg.scratchReceipt,
|
|
1162
|
-
scratchReceiptSha256: valueArg.scratchReceiptSha256,
|
|
1163
|
-
stableOutcome: valueArg.stableOutcome,
|
|
1164
|
-
stableOutcomeSha256: valueArg.stableOutcomeSha256,
|
|
1165
|
-
transactionCommitted: valueArg.transactionCommitted,
|
|
1166
|
-
disposition: valueArg.disposition,
|
|
1167
|
-
completedAt: valueArg.completedAt,
|
|
1168
|
-
});
|
|
1169
|
-
const normalizeProductionReceiptPayloadInternal = (valueArg, pathArg) => {
|
|
1170
|
-
const value = readRecord(valueArg, pathArg);
|
|
1171
|
-
assertExactKeys(value, productionReceiptPayloadKeys, pathArg);
|
|
1172
|
-
if (value.schemaVersion !== 1
|
|
1173
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-production-receipt'
|
|
1174
|
-
|| value.transactionCommitted !== true) {
|
|
1175
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1176
|
-
}
|
|
1177
|
-
const scratchReceipt = normalizeScratchReceiptInternal(value.scratchReceipt, `${pathArg}.scratchReceipt`);
|
|
1178
|
-
const stableOutcome = normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`);
|
|
1179
|
-
const stableOutcomeSha256 = readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`);
|
|
1180
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
1181
|
-
if (canonicalize(authority, `${pathArg}.authority`)
|
|
1182
|
-
!== canonicalize(scratchReceipt.authority, `${pathArg}.scratchReceipt.authority`)) {
|
|
1183
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
|
|
1184
|
-
}
|
|
1185
|
-
const requestSha256 = readSha256(value.requestSha256, `${pathArg}.requestSha256`);
|
|
1186
|
-
const disposition = readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`);
|
|
1187
|
-
const dispositionMatchesScratch = disposition === scratchReceipt.disposition
|
|
1188
|
-
|| (scratchReceipt.disposition === 'applied' && disposition === 'exact-replay');
|
|
1189
|
-
if (requestSha256 !== scratchReceipt.requestSha256 || !dispositionMatchesScratch) {
|
|
1190
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceipt`);
|
|
1191
|
-
}
|
|
1192
|
-
if (canonicalize(stableOutcome, `${pathArg}.stableOutcome`)
|
|
1193
|
-
!== canonicalize(scratchReceipt.stableOutcome, `${pathArg}.scratchReceipt.stableOutcome`)
|
|
1194
|
-
|| stableOutcomeSha256 !== scratchReceipt.stableOutcomeSha256
|
|
1195
|
-
|| stableOutcomeSha256
|
|
1196
|
-
!== digestBytes(encodeNormalized(stableOutcome, `${pathArg}.stableOutcome`))) {
|
|
1197
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcome`);
|
|
1198
|
-
}
|
|
1199
|
-
const scratchReceiptSha256 = readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
|
|
1200
|
-
if (scratchReceiptSha256
|
|
1201
|
-
!== digestBytes(encodeNormalized(scratchReceipt, `${pathArg}.scratchReceipt`))) {
|
|
1202
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceiptSha256`);
|
|
1203
|
-
}
|
|
1204
|
-
return {
|
|
1205
|
-
schemaVersion: 1,
|
|
1206
|
-
kind: 'cloudly-legacy-deployment-settlement-production-receipt',
|
|
1207
|
-
authority,
|
|
1208
|
-
requestSha256,
|
|
1209
|
-
scratchReceipt,
|
|
1210
|
-
scratchReceiptSha256,
|
|
1211
|
-
stableOutcome,
|
|
1212
|
-
stableOutcomeSha256,
|
|
1213
|
-
transactionCommitted: true,
|
|
1214
|
-
disposition,
|
|
1215
|
-
completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, scratchReceipt.completedAt),
|
|
1216
|
-
};
|
|
1217
|
-
};
|
|
1218
|
-
const normalizeUnsignedProductionReceiptInternal = (valueArg, pathArg) => {
|
|
1219
|
-
const value = readRecord(valueArg, pathArg);
|
|
1220
|
-
assertExactKeys(value, unsignedProductionReceiptKeys, pathArg);
|
|
1221
|
-
const payloadInput = Object.fromEntries(productionReceiptPayloadKeys.map((keyArg) => [
|
|
1222
|
-
keyArg,
|
|
1223
|
-
value[keyArg],
|
|
1224
|
-
]));
|
|
1225
|
-
const payload = normalizeProductionReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
1226
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
1227
|
-
if (payloadSha256 !== digestBytes(encodeNormalized(productionReceiptPayload(payload), `${pathArg}.payload`))) {
|
|
1228
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
1229
|
-
}
|
|
1230
|
-
return { ...payload, payloadSha256 };
|
|
1231
|
-
};
|
|
1232
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionReceiptPayload = (valueArg) => {
|
|
1233
|
-
const payload = normalizeProductionReceiptPayloadInternal(valueArg, 'productionReceiptPayload');
|
|
1234
|
-
return digestBytes(encodeNormalized(productionReceiptPayload(payload), 'productionReceiptPayload'));
|
|
1235
|
-
};
|
|
1236
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => {
|
|
1237
|
-
const value = readRecord(valueArg, 'productionReceipt');
|
|
1238
|
-
assertExactKeys(value, productionReceiptKeys, 'productionReceipt');
|
|
1239
|
-
const unsignedInput = Object.fromEntries(unsignedProductionReceiptKeys.map((keyArg) => [
|
|
1240
|
-
keyArg,
|
|
1241
|
-
value[keyArg],
|
|
1242
|
-
]));
|
|
1243
|
-
const unsigned = normalizeUnsignedProductionReceiptInternal(unsignedInput, 'productionReceipt.unsigned');
|
|
1244
|
-
return finalize({
|
|
1245
|
-
...unsigned,
|
|
1246
|
-
mac: readMac(value.mac, 'productionReceipt.mac'),
|
|
1247
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'productionReceipt');
|
|
1248
|
-
};
|
|
1249
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg), 'productionReceipt');
|
|
1250
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput = (valueArg) => {
|
|
1251
|
-
const authenticated = finalize(normalizeUnsignedProductionReceiptInternal(valueArg, 'unsignedProductionReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedProductionReceipt');
|
|
1252
|
-
return frame(cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeNormalized(authenticated, 'productionReceipt.authenticated'));
|
|
1253
|
-
};
|
|
1254
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg));
|
|
1255
|
-
const withoutArtifactMac = (artifactArg) => {
|
|
1256
|
-
const { mac: _mac, ...unsigned } = artifactArg;
|
|
1257
|
-
return unsigned;
|
|
1258
|
-
};
|
|
1259
|
-
const requireConsumerVerifiedHmac = async (authorityArg, domainArg, hmacInputArg, macArg, verifierArg, pathArg) => {
|
|
1260
|
-
let verified = false;
|
|
1261
|
-
try {
|
|
1262
|
-
verified = await verifierArg({
|
|
1263
|
-
authority: authorityArg,
|
|
1264
|
-
domain: domainArg,
|
|
1265
|
-
hmacInput: new Uint8Array(hmacInputArg),
|
|
1266
|
-
mac: macArg,
|
|
1267
|
-
});
|
|
1268
|
-
}
|
|
1269
|
-
catch {
|
|
1270
|
-
verified = false;
|
|
1271
|
-
}
|
|
1272
|
-
if (!verified)
|
|
1273
|
-
fail('INVALID_VALUE', pathArg);
|
|
1274
|
-
};
|
|
1275
|
-
const assertAuthorityTimestamp = (timestampArg, metadataArg, pathArg) => {
|
|
1276
|
-
if (timestampArg < metadataArg.issuedAt || timestampArg >= metadataArg.expiresAt) {
|
|
1277
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1278
|
-
}
|
|
1279
|
-
};
|
|
1280
|
-
const assertAuthorityReferenceMatchesMetadata = (referenceArg, metadataArg, pathArg) => {
|
|
1281
|
-
try {
|
|
1282
|
-
normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(referenceArg, metadataArg);
|
|
1283
|
-
}
|
|
1284
|
-
catch {
|
|
1285
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1286
|
-
}
|
|
1287
|
-
};
|
|
1288
|
-
const assertRehearsalBindingMatchesAuthorityMetadata = (bindingArg, metadataArg, pathArg) => {
|
|
1289
|
-
const expected = {
|
|
1290
|
-
settlementId: metadataArg.settlementId,
|
|
1291
|
-
runId: metadataArg.runId,
|
|
1292
|
-
rehearsalId: metadataArg.rehearsalId,
|
|
1293
|
-
scratchServiceId: metadataArg.scratchServiceId,
|
|
1294
|
-
allocationId: metadataArg.allocationId,
|
|
1295
|
-
allocationGeneration: metadataArg.allocationGeneration,
|
|
1296
|
-
allocationBindingSha256: metadataArg.allocationBindingSha256,
|
|
1297
|
-
allocationReceiptSha256: metadataArg.allocationReceiptSha256,
|
|
1298
|
-
backupId: metadataArg.backupId,
|
|
1299
|
-
backupSnapshotIdSha256: metadataArg.backupSnapshotIdSha256,
|
|
1300
|
-
backupProofSha256: metadataArg.backupProofSha256,
|
|
1301
|
-
sourceDataSha256: metadataArg.sourceDataSha256,
|
|
1302
|
-
restoredDataSha256: metadataArg.restoredDataSha256,
|
|
1303
|
-
digestProofSha256: metadataArg.digestProofSha256,
|
|
1304
|
-
targetImageDigest: metadataArg.targetImageDigest,
|
|
1305
|
-
targetVersion: metadataArg.targetVersion,
|
|
1306
|
-
targetManifestSha256: metadataArg.targetManifestSha256,
|
|
1307
|
-
targetConfigSha256: metadataArg.targetConfigSha256,
|
|
1308
|
-
};
|
|
1309
|
-
const actual = {
|
|
1310
|
-
settlementId: bindingArg.settlementId,
|
|
1311
|
-
runId: bindingArg.runId,
|
|
1312
|
-
rehearsalId: bindingArg.rehearsalId,
|
|
1313
|
-
scratchServiceId: bindingArg.scratchServiceId,
|
|
1314
|
-
allocationId: bindingArg.allocationId,
|
|
1315
|
-
allocationGeneration: bindingArg.allocationGeneration,
|
|
1316
|
-
allocationBindingSha256: bindingArg.allocationBindingSha256,
|
|
1317
|
-
allocationReceiptSha256: bindingArg.allocationReceiptSha256,
|
|
1318
|
-
backupId: bindingArg.backupId,
|
|
1319
|
-
backupSnapshotIdSha256: bindingArg.backupSnapshotIdSha256,
|
|
1320
|
-
backupProofSha256: bindingArg.backupProofSha256,
|
|
1321
|
-
sourceDataSha256: bindingArg.sourceDataSha256,
|
|
1322
|
-
restoredDataSha256: bindingArg.restoredDataSha256,
|
|
1323
|
-
digestProofSha256: bindingArg.digestProofSha256,
|
|
1324
|
-
targetImageDigest: bindingArg.targetImageDigest,
|
|
1325
|
-
targetVersion: bindingArg.targetVersion,
|
|
1326
|
-
targetManifestSha256: bindingArg.targetManifestSha256,
|
|
1327
|
-
targetConfigSha256: bindingArg.targetConfigSha256,
|
|
1328
|
-
};
|
|
1329
|
-
if (canonicalize(actual, pathArg) !== canonicalize(expected, `${pathArg}.expected`)) {
|
|
1330
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1331
|
-
}
|
|
1332
|
-
};
|
|
1333
|
-
export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = (bindingArg, metadataArg) => {
|
|
1334
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1335
|
-
const binding = normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(bindingArg);
|
|
1336
|
-
assertRehearsalBindingMatchesAuthorityMetadata(binding, metadata, 'rehearsalBinding.authority');
|
|
1337
|
-
return binding;
|
|
1338
|
-
};
|
|
1339
|
-
export const normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority = (planArg, metadataArg) => {
|
|
1340
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1341
|
-
const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(planArg);
|
|
1342
|
-
assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
|
|
1343
|
-
if (plan.settlementId !== metadata.settlementId) {
|
|
1344
|
-
fail('CROSS_FIELD_MISMATCH', 'plan.settlementId');
|
|
1345
|
-
}
|
|
1346
|
-
assertAuthorityTimestamp(plan.effectiveAt, metadata, 'plan.effectiveAt');
|
|
1347
|
-
return plan;
|
|
1348
|
-
};
|
|
1349
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = (requestArg, metadataArg) => {
|
|
1350
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1351
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementProductionRequest(requestArg);
|
|
1352
|
-
assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
|
|
1353
|
-
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(request.plan, metadata);
|
|
1354
|
-
normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(request.rehearsalBinding, metadata);
|
|
1355
|
-
assertAuthorityTimestamp(request.requestedAt, metadata, 'productionRequest.requestedAt');
|
|
1356
|
-
return request;
|
|
1357
|
-
};
|
|
1358
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = async (bindingArg, metadataArg, verifierArg) => {
|
|
1359
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1360
|
-
const binding = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure(bindingArg);
|
|
1361
|
-
assertAuthorityReferenceMatchesMetadata(binding.authority, metadata, 'rehearsalBinding.authority');
|
|
1362
|
-
normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(binding.payload, metadata);
|
|
1363
|
-
await requireConsumerVerifiedHmac(binding.authority, cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput(withoutArtifactMac(binding)), binding.mac, verifierArg, 'rehearsalBinding.mac');
|
|
1364
|
-
return binding;
|
|
1365
|
-
};
|
|
1366
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority = async (planArg, metadataArg, verifierArg) => {
|
|
1367
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1368
|
-
const plan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(planArg);
|
|
1369
|
-
assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
|
|
1370
|
-
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(plan.payload, metadata);
|
|
1371
|
-
await requireConsumerVerifiedHmac(plan.authority, cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeCloudlyLegacyDeploymentSettlementPlanHmacInput(withoutArtifactMac(plan)), plan.mac, verifierArg, 'plan.mac');
|
|
1372
|
-
return plan;
|
|
1373
|
-
};
|
|
1374
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = async (requestArg, metadataArg, verifierArg) => {
|
|
1375
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1376
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1377
|
-
assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
|
|
1378
|
-
normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(request.payload, metadata);
|
|
1379
|
-
await requireConsumerVerifiedHmac(request.authority, cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput(withoutArtifactMac(request)), request.mac, verifierArg, 'productionRequest.mac');
|
|
1380
|
-
return request;
|
|
1381
|
-
};
|
|
1382
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
|
|
1383
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1384
|
-
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1385
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest(resultArg, request);
|
|
1386
|
-
assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'checkResult.authority');
|
|
1387
|
-
assertAuthorityTimestamp(result.payload.checkedAt, metadata, 'checkResult.checkedAt');
|
|
1388
|
-
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'checkResult.mac');
|
|
1389
|
-
return result;
|
|
1390
|
-
};
|
|
1391
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
|
|
1392
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1393
|
-
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1394
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest(resultArg, request);
|
|
1395
|
-
assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'applyResult.authority');
|
|
1396
|
-
assertAuthorityTimestamp(result.payload.status === 'completed'
|
|
1397
|
-
? result.payload.completedAt
|
|
1398
|
-
: result.payload.rejectedAt, metadata, 'applyResult.completedAt');
|
|
1399
|
-
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'applyResult.mac');
|
|
1400
|
-
return result;
|
|
1401
|
-
};
|
|
1402
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcomeForAuthority = async (outcomeArg, metadataArg, requestArg, verifierArg) => {
|
|
1403
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1404
|
-
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1405
|
-
const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest(outcomeArg, request);
|
|
1406
|
-
assertAuthorityReferenceMatchesMetadata(outcome.authority, metadata, 'stableOutcome.authority');
|
|
1407
|
-
if (outcome.payload.settlementId !== metadata.settlementId
|
|
1408
|
-
|| outcome.payload.runId !== metadata.runId) {
|
|
1409
|
-
fail('CROSS_FIELD_MISMATCH', 'stableOutcome.authority');
|
|
1410
|
-
}
|
|
1411
|
-
assertAuthorityTimestamp(outcome.payload.effectiveAt, metadata, 'stableOutcome.effectiveAt');
|
|
1412
|
-
await requireConsumerVerifiedHmac(outcome.authority, cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput(withoutArtifactMac(outcome)), outcome.mac, verifierArg, 'stableOutcome.mac');
|
|
1413
|
-
return outcome;
|
|
1414
|
-
};
|
|
1415
|
-
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
|
|
1416
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1417
|
-
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1418
|
-
const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receiptArg, request);
|
|
1419
|
-
assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'scratchReceipt.authority');
|
|
1420
|
-
if (receipt.stableOutcome.settlementId !== metadata.settlementId
|
|
1421
|
-
|| receipt.stableOutcome.runId !== metadata.runId) {
|
|
1422
|
-
fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.stableOutcome');
|
|
1423
|
-
}
|
|
1424
|
-
assertAuthorityTimestamp(receipt.stableOutcome.effectiveAt, metadata, 'scratchReceipt.effectiveAt');
|
|
1425
|
-
assertAuthorityTimestamp(receipt.completedAt, metadata, 'scratchReceipt.completedAt');
|
|
1426
|
-
await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'scratchReceipt.mac');
|
|
1427
|
-
return receipt;
|
|
1428
|
-
};
|
|
1429
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
|
|
1430
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1431
|
-
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1432
|
-
const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest(receiptArg, request);
|
|
1433
|
-
assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'productionReceipt.authority');
|
|
1434
|
-
await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(receipt.scratchReceipt, metadata, request, verifierArg);
|
|
1435
|
-
if (receipt.stableOutcome.settlementId !== metadata.settlementId
|
|
1436
|
-
|| receipt.stableOutcome.runId !== metadata.runId) {
|
|
1437
|
-
fail('CROSS_FIELD_MISMATCH', 'productionReceipt.stableOutcome');
|
|
1438
|
-
}
|
|
1439
|
-
assertAuthorityTimestamp(receipt.completedAt, metadata, 'productionReceipt.completedAt');
|
|
1440
|
-
await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'productionReceipt.mac');
|
|
1441
|
-
return receipt;
|
|
1442
|
-
};
|
|
1443
|
-
const assertAuthenticatedAuthorityMatches = (authorityArg, expectedArg, pathArg) => {
|
|
1444
|
-
if (canonicalize(authorityArg, pathArg) !== canonicalize(expectedArg, `${pathArg}.expected`)) {
|
|
1445
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1446
|
-
}
|
|
1447
|
-
};
|
|
1448
|
-
const assertSummaryMatchesProductionRequest = (summaryArg, requestArg, pathArg) => {
|
|
1449
|
-
if (summaryArg.requestSha256
|
|
1450
|
-
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg)
|
|
1451
|
-
|| summaryArg.planSha256 !== requestArg.planSha256
|
|
1452
|
-
|| summaryArg.settlementId !== requestArg.plan.settlementId
|
|
1453
|
-
|| summaryArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
|
|
1454
|
-
|| summaryArg.finalStateHmac !== requestArg.plan.finalStateHmac
|
|
1455
|
-
|| canonicalize(summaryArg.counts, `${pathArg}.counts`)
|
|
1456
|
-
!== canonicalize({
|
|
1457
|
-
operationCount: requestArg.plan.operationCount,
|
|
1458
|
-
routeClaimsStabilized: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsStabilized, 0),
|
|
1459
|
-
routeClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsRemoved, 0),
|
|
1460
|
-
resourceClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.resourceClaimsRemoved, 0),
|
|
1461
|
-
}, `${pathArg}.expectedCounts`)
|
|
1462
|
-
|| canonicalize(summaryArg.classificationCounts, `${pathArg}.classificationCounts`)
|
|
1463
|
-
!== canonicalize(requestArg.plan.classificationCounts, `${pathArg}.expectedClassificationCounts`)) {
|
|
1464
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1465
|
-
}
|
|
1466
|
-
};
|
|
1467
|
-
const assertStableOutcomeMatchesProductionRequest = (stableOutcomeArg, requestArg, pathArg) => {
|
|
1468
|
-
const expectedSettlements = requestArg.plan.entries.map((entryArg) => ({
|
|
1469
|
-
operationId: entryArg.operationId,
|
|
1470
|
-
finalRevision: entryArg.finalRevision,
|
|
1471
|
-
finalDocumentHmac: entryArg.finalDocumentHmac,
|
|
1472
|
-
}));
|
|
1473
|
-
if (stableOutcomeArg.settlementId !== requestArg.plan.settlementId
|
|
1474
|
-
|| stableOutcomeArg.runId !== requestArg.rehearsalBinding.runId
|
|
1475
|
-
|| stableOutcomeArg.rehearsalBindingSha256 !== requestArg.rehearsalBindingSha256
|
|
1476
|
-
|| stableOutcomeArg.effectiveAt !== requestArg.plan.effectiveAt
|
|
1477
|
-
|| stableOutcomeArg.planSha256 !== requestArg.planSha256
|
|
1478
|
-
|| stableOutcomeArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
|
|
1479
|
-
|| stableOutcomeArg.finalStateHmac !== requestArg.plan.finalStateHmac
|
|
1480
|
-
|| canonicalize(stableOutcomeArg.settlements, `${pathArg}.settlements`)
|
|
1481
|
-
!== canonicalize(expectedSettlements, `${pathArg}.expectedSettlements`)) {
|
|
1482
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1483
|
-
}
|
|
1484
|
-
assertSummaryMatchesProductionRequest({
|
|
1485
|
-
schemaVersion: 1,
|
|
1486
|
-
requestSha256: digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg),
|
|
1487
|
-
planSha256: stableOutcomeArg.planSha256,
|
|
1488
|
-
settlementId: stableOutcomeArg.settlementId,
|
|
1489
|
-
sourceStateHmac: stableOutcomeArg.sourceStateHmac,
|
|
1490
|
-
finalStateHmac: stableOutcomeArg.finalStateHmac,
|
|
1491
|
-
transactionSupported: true,
|
|
1492
|
-
counts: stableOutcomeArg.counts,
|
|
1493
|
-
classificationCounts: stableOutcomeArg.classificationCounts,
|
|
1494
|
-
}, requestArg, pathArg);
|
|
1495
|
-
};
|
|
1496
|
-
/** Structural/request binding only; this function does not authenticate MACs. */
|
|
1497
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest = (resultArg, requestArg) => {
|
|
1498
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1499
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure(resultArg);
|
|
1500
|
-
assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'checkResult.authority');
|
|
1501
|
-
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'checkResult.payload');
|
|
1502
|
-
if (result.payload.checkedAt < request.payload.requestedAt) {
|
|
1503
|
-
fail('CROSS_FIELD_MISMATCH', 'checkResult.payload.checkedAt');
|
|
1504
|
-
}
|
|
1505
|
-
return result;
|
|
1506
|
-
};
|
|
1507
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest = (resultArg, requestArg) => {
|
|
1508
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1509
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure(resultArg);
|
|
1510
|
-
assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'applyResult.authority');
|
|
1511
|
-
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'applyResult.payload');
|
|
1512
|
-
const resultAt = result.payload.status === 'completed'
|
|
1513
|
-
? result.payload.completedAt
|
|
1514
|
-
: result.payload.rejectedAt;
|
|
1515
|
-
if (resultAt < request.payload.requestedAt) {
|
|
1516
|
-
fail('CROSS_FIELD_MISMATCH', 'applyResult.payload.completedAt');
|
|
1517
|
-
}
|
|
1518
|
-
return result;
|
|
1519
|
-
};
|
|
1520
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest = (outcomeArg, requestArg) => {
|
|
1521
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1522
|
-
const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure(outcomeArg);
|
|
1523
|
-
assertAuthenticatedAuthorityMatches(outcome.authority, request.authority, 'stableOutcome.authority');
|
|
1524
|
-
assertStableOutcomeMatchesProductionRequest(outcome.payload, request.payload, 'stableOutcome.payload');
|
|
1525
|
-
return outcome;
|
|
1526
|
-
};
|
|
1527
|
-
/** Structural/request binding only; this function does not authenticate MACs. */
|
|
1528
|
-
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest = (receiptArg, requestArg) => {
|
|
1529
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1530
|
-
const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(receiptArg);
|
|
1531
|
-
assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'scratchReceipt.authority');
|
|
1532
|
-
if (receipt.requestSha256
|
|
1533
|
-
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
|
|
1534
|
-
|| receipt.completedAt < request.payload.requestedAt) {
|
|
1535
|
-
fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.requestSha256');
|
|
1536
|
-
}
|
|
1537
|
-
assertStableOutcomeMatchesProductionRequest(receipt.stableOutcome, request.payload, 'scratchReceipt.stableOutcome');
|
|
1538
|
-
return receipt;
|
|
1539
|
-
};
|
|
1540
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest = (receiptArg, requestArg) => {
|
|
1541
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1542
|
-
const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(receiptArg);
|
|
1543
|
-
normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receipt.scratchReceipt, request);
|
|
1544
|
-
assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'productionReceipt.authority');
|
|
1545
|
-
if (receipt.requestSha256
|
|
1546
|
-
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
|
|
1547
|
-
|| receipt.completedAt < request.payload.requestedAt) {
|
|
1548
|
-
fail('CROSS_FIELD_MISMATCH', 'productionReceipt.requestSha256');
|
|
1549
|
-
}
|
|
1550
|
-
return receipt;
|
|
1551
|
-
};
|
|
1552
|
-
const requestBundleKeys = [
|
|
1553
|
-
'schemaVersion',
|
|
1554
|
-
'kind',
|
|
1555
|
-
'authenticatedRehearsalBinding',
|
|
1556
|
-
'authenticatedRequest',
|
|
1557
|
-
];
|
|
1558
|
-
export const normalizeCloudlyLegacyDeploymentSettlementRequestBundle = (valueArg) => {
|
|
1559
|
-
const value = readRecord(valueArg, 'requestBundle');
|
|
1560
|
-
assertExactKeys(value, requestBundleKeys, 'requestBundle');
|
|
1561
|
-
if (value.schemaVersion !== 1
|
|
1562
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-request-bundle') {
|
|
1563
|
-
fail('INVALID_VALUE', 'requestBundle.kind');
|
|
1564
|
-
}
|
|
1565
|
-
const authenticatedRehearsalBinding = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure(value.authenticatedRehearsalBinding);
|
|
1566
|
-
const authenticatedRequest = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(value.authenticatedRequest);
|
|
1567
|
-
if (canonicalize(authenticatedRehearsalBinding.authority, 'requestBundle.binding.authority')
|
|
1568
|
-
!== canonicalize(authenticatedRequest.authority, 'requestBundle.request.authority')
|
|
1569
|
-
|| canonicalize(authenticatedRehearsalBinding.payload, 'requestBundle.binding.payload') !== canonicalize(authenticatedRequest.payload.rehearsalBinding, 'requestBundle.request.rehearsalBinding')
|
|
1570
|
-
|| authenticatedRehearsalBinding.payloadSha256
|
|
1571
|
-
!== authenticatedRequest.payload.rehearsalBindingSha256) {
|
|
1572
|
-
fail('CROSS_FIELD_MISMATCH', 'requestBundle.authenticatedRehearsalBinding');
|
|
1573
|
-
}
|
|
1574
|
-
return finalize({
|
|
1575
|
-
schemaVersion: 1,
|
|
1576
|
-
kind: 'cloudly-legacy-deployment-settlement-request-bundle',
|
|
1577
|
-
authenticatedRehearsalBinding,
|
|
1578
|
-
authenticatedRequest,
|
|
1579
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes * 2, 'requestBundle');
|
|
1580
|
-
};
|
|
1581
|
-
export const encodeCloudlyLegacyDeploymentSettlementRequestBundle = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementRequestBundle(valueArg), 'requestBundle');
|
|
1582
|
-
export const digestCloudlyLegacyDeploymentSettlementRequestBundle = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementRequestBundle(valueArg));
|
|
1583
|
-
const executionAttemptIdentityKeys = [
|
|
1584
|
-
'schemaVersion',
|
|
1585
|
-
'kind',
|
|
1586
|
-
'attemptId',
|
|
1587
|
-
'purpose',
|
|
1588
|
-
'operationId',
|
|
1589
|
-
'settlementId',
|
|
1590
|
-
'executionAuthority',
|
|
1591
|
-
'sourceAuthority',
|
|
1592
|
-
'authenticatedPlanSha256',
|
|
1593
|
-
'requestBundleSha256',
|
|
1594
|
-
'scratchReceiptSha256',
|
|
1595
|
-
];
|
|
1596
|
-
const executionAttemptIdentitySeed = (valueArg) => ({
|
|
1597
|
-
schemaVersion: valueArg.schemaVersion,
|
|
1598
|
-
kind: valueArg.kind,
|
|
1599
|
-
purpose: valueArg.purpose,
|
|
1600
|
-
operationId: valueArg.operationId,
|
|
1601
|
-
settlementId: valueArg.settlementId,
|
|
1602
|
-
executionAuthority: valueArg.executionAuthority,
|
|
1603
|
-
sourceAuthority: valueArg.sourceAuthority,
|
|
1604
|
-
authenticatedPlanSha256: valueArg.authenticatedPlanSha256,
|
|
1605
|
-
requestBundleSha256: valueArg.requestBundleSha256,
|
|
1606
|
-
scratchReceiptSha256: valueArg.scratchReceiptSha256,
|
|
1607
|
-
});
|
|
1608
|
-
const createExecutionAttemptId = (valueArg) => `settlement-attempt-${digestBytes(encodeNormalized(executionAttemptIdentitySeed(valueArg), 'executionAttemptIdentity.seed')).slice(0, 40)}`;
|
|
1609
|
-
const normalizeExecutionAttemptIdentityInternal = (valueArg, pathArg) => {
|
|
1610
|
-
const value = readRecord(valueArg, pathArg);
|
|
1611
|
-
assertExactKeys(value, executionAttemptIdentityKeys, pathArg);
|
|
1612
|
-
if (value.schemaVersion !== 1
|
|
1613
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-execution-attempt-identity') {
|
|
1614
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1615
|
-
}
|
|
1616
|
-
const purpose = readLiteral(value.purpose, ['scratch-rehearsal', 'production'], `${pathArg}.purpose`);
|
|
1617
|
-
const operationId = readIdentifier(value.operationId, `${pathArg}.operationId`);
|
|
1618
|
-
const executionAuthority = normalizeAuthorityReferenceInternal(value.executionAuthority, `${pathArg}.executionAuthority`);
|
|
1619
|
-
const sourceAuthority = normalizeAuthorityReferenceInternal(value.sourceAuthority, `${pathArg}.sourceAuthority`);
|
|
1620
|
-
const usesSameAuthority = canonicalize(executionAuthority, `${pathArg}.executionAuthority`)
|
|
1621
|
-
=== canonicalize(sourceAuthority, `${pathArg}.sourceAuthority`);
|
|
1622
|
-
if (executionAuthority.operationId !== operationId
|
|
1623
|
-
|| sourceAuthority.operationId !== operationId
|
|
1624
|
-
|| (purpose === 'scratch-rehearsal') !== usesSameAuthority) {
|
|
1625
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.executionAuthority`);
|
|
1626
|
-
}
|
|
1627
|
-
const scratchReceiptSha256 = value.scratchReceiptSha256 === null
|
|
1628
|
-
? null
|
|
1629
|
-
: readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
|
|
1630
|
-
if ((purpose === 'production') !== (scratchReceiptSha256 !== null)) {
|
|
1631
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceiptSha256`);
|
|
1632
|
-
}
|
|
1633
|
-
const identityWithoutId = {
|
|
1634
|
-
schemaVersion: 1,
|
|
1635
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-attempt-identity',
|
|
1636
|
-
purpose,
|
|
1637
|
-
operationId,
|
|
1638
|
-
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
1639
|
-
executionAuthority,
|
|
1640
|
-
sourceAuthority,
|
|
1641
|
-
authenticatedPlanSha256: readSha256(value.authenticatedPlanSha256, `${pathArg}.authenticatedPlanSha256`),
|
|
1642
|
-
requestBundleSha256: readSha256(value.requestBundleSha256, `${pathArg}.requestBundleSha256`),
|
|
1643
|
-
scratchReceiptSha256,
|
|
1644
|
-
};
|
|
1645
|
-
const attemptId = readIdentifier(value.attemptId, `${pathArg}.attemptId`);
|
|
1646
|
-
if (attemptId !== createExecutionAttemptId(identityWithoutId)) {
|
|
1647
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.attemptId`);
|
|
1648
|
-
}
|
|
1649
|
-
return { ...identityWithoutId, attemptId };
|
|
1650
|
-
};
|
|
1651
|
-
export function createCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity(valueArg) {
|
|
1652
|
-
const seed = {
|
|
1653
|
-
schemaVersion: 1,
|
|
1654
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-attempt-identity',
|
|
1655
|
-
purpose: valueArg.purpose,
|
|
1656
|
-
operationId: valueArg.operationId,
|
|
1657
|
-
settlementId: valueArg.settlementId,
|
|
1658
|
-
executionAuthority: valueArg.executionAuthority,
|
|
1659
|
-
sourceAuthority: valueArg.sourceAuthority,
|
|
1660
|
-
authenticatedPlanSha256: valueArg.authenticatedPlanSha256,
|
|
1661
|
-
requestBundleSha256: valueArg.requestBundleSha256,
|
|
1662
|
-
scratchReceiptSha256: valueArg.scratchReceiptSha256,
|
|
1663
|
-
};
|
|
1664
|
-
return normalizeCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity({
|
|
1665
|
-
...seed,
|
|
1666
|
-
attemptId: createExecutionAttemptId(seed),
|
|
1667
|
-
});
|
|
1668
|
-
}
|
|
1669
|
-
export const normalizeCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity = (valueArg) => finalize(normalizeExecutionAttemptIdentityInternal(valueArg, 'executionAttemptIdentity'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'executionAttemptIdentity');
|
|
1670
|
-
export const encodeCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity(valueArg), 'executionAttemptIdentity');
|
|
1671
|
-
export const digestCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementExecutionAttemptIdentity(valueArg));
|
|
1672
|
-
const normalizeExecutionAttemptObservationInternal = (valueArg, pathArg) => {
|
|
1673
|
-
const value = readRecord(valueArg, pathArg);
|
|
1674
|
-
const state = readLiteral(value.state, ['prepared', 'committed', 'aborted'], `${pathArg}.state`);
|
|
1675
|
-
assertExactKeys(value, [
|
|
1676
|
-
'schemaVersion',
|
|
1677
|
-
'kind',
|
|
1678
|
-
'identity',
|
|
1679
|
-
'state',
|
|
1680
|
-
'preparedAt',
|
|
1681
|
-
...(state === 'committed' ? ['resolvedAt', 'receiptSchemaVersion', 'receiptSha256'] : []),
|
|
1682
|
-
...(state === 'aborted' ? ['resolvedAt'] : []),
|
|
1683
|
-
], pathArg);
|
|
1684
|
-
if (value.schemaVersion !== 1
|
|
1685
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-execution-attempt-observation') {
|
|
1686
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1687
|
-
}
|
|
1688
|
-
const identity = normalizeExecutionAttemptIdentityInternal(value.identity, `${pathArg}.identity`);
|
|
1689
|
-
const preparedAt = readInteger(value.preparedAt, `${pathArg}.preparedAt`, 1);
|
|
1690
|
-
if (state === 'prepared') {
|
|
1691
|
-
return {
|
|
1692
|
-
schemaVersion: 1,
|
|
1693
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-attempt-observation',
|
|
1694
|
-
identity,
|
|
1695
|
-
state,
|
|
1696
|
-
preparedAt,
|
|
1697
|
-
};
|
|
1698
|
-
}
|
|
1699
|
-
const resolvedAt = readInteger(value.resolvedAt, `${pathArg}.resolvedAt`, preparedAt);
|
|
1700
|
-
if (state === 'aborted') {
|
|
1701
|
-
return {
|
|
1702
|
-
schemaVersion: 1,
|
|
1703
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-attempt-observation',
|
|
1704
|
-
identity,
|
|
1705
|
-
state,
|
|
1706
|
-
preparedAt,
|
|
1707
|
-
resolvedAt,
|
|
1708
|
-
};
|
|
1709
|
-
}
|
|
1710
|
-
if (value.receiptSchemaVersion !== 1 && value.receiptSchemaVersion !== 2) {
|
|
1711
|
-
fail('INVALID_VALUE', `${pathArg}.receiptSchemaVersion`);
|
|
1712
|
-
}
|
|
1713
|
-
const receiptSchemaVersion = value.receiptSchemaVersion;
|
|
1714
|
-
return {
|
|
1715
|
-
schemaVersion: 1,
|
|
1716
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-attempt-observation',
|
|
1717
|
-
identity,
|
|
1718
|
-
state,
|
|
1719
|
-
preparedAt,
|
|
1720
|
-
resolvedAt,
|
|
1721
|
-
receiptSchemaVersion,
|
|
1722
|
-
receiptSha256: readSha256(value.receiptSha256, `${pathArg}.receiptSha256`),
|
|
1723
|
-
};
|
|
1724
|
-
};
|
|
1725
|
-
export const normalizeCloudlyLegacyDeploymentSettlementExecutionAttemptObservation = (valueArg) => finalize(normalizeExecutionAttemptObservationInternal(valueArg, 'executionAttemptObservation'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'executionAttemptObservation');
|
|
1726
|
-
export const encodeCloudlyLegacyDeploymentSettlementExecutionAttemptObservation = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementExecutionAttemptObservation(valueArg), 'executionAttemptObservation');
|
|
1727
|
-
export const digestCloudlyLegacyDeploymentSettlementExecutionAttemptObservation = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementExecutionAttemptObservation(valueArg));
|
|
1728
|
-
const productionExecutionAuthorizationPayloadKeys = [
|
|
1729
|
-
'schemaVersion',
|
|
1730
|
-
'kind',
|
|
1731
|
-
'authority',
|
|
1732
|
-
'sourceAuthority',
|
|
1733
|
-
'executionAttempt',
|
|
1734
|
-
'authenticatedPlanSha256',
|
|
1735
|
-
'requestBundleSha256',
|
|
1736
|
-
'scratchReceiptSha256',
|
|
1737
|
-
'maintenanceImageDigest',
|
|
1738
|
-
'operationId',
|
|
1739
|
-
'settlementId',
|
|
1740
|
-
'runId',
|
|
1741
|
-
'rehearsalId',
|
|
1742
|
-
'scratchServiceId',
|
|
1743
|
-
'allocationId',
|
|
1744
|
-
'allocationGeneration',
|
|
1745
|
-
'allocationBindingSha256',
|
|
1746
|
-
'allocationReceiptSha256',
|
|
1747
|
-
'sourceImageDigest',
|
|
1748
|
-
'targetImageDigest',
|
|
1749
|
-
'requestedAt',
|
|
1750
|
-
'approvedAt',
|
|
1751
|
-
];
|
|
1752
|
-
const unsignedProductionExecutionAuthorizationKeys = [
|
|
1753
|
-
...productionExecutionAuthorizationPayloadKeys,
|
|
1754
|
-
'payloadSha256',
|
|
1755
|
-
];
|
|
1756
|
-
const productionExecutionAuthorizationKeys = [
|
|
1757
|
-
...unsignedProductionExecutionAuthorizationKeys,
|
|
1758
|
-
'mac',
|
|
1759
|
-
];
|
|
1760
|
-
const productionExecutionAuthorizationPayload = (valueArg) => Object.fromEntries(productionExecutionAuthorizationPayloadKeys.map((keyArg) => [
|
|
1761
|
-
keyArg,
|
|
1762
|
-
valueArg[keyArg],
|
|
1763
|
-
]));
|
|
1764
|
-
const normalizeProductionExecutionAuthorizationPayloadInternal = (valueArg, pathArg) => {
|
|
1765
|
-
const value = readRecord(valueArg, pathArg);
|
|
1766
|
-
assertExactKeys(value, productionExecutionAuthorizationPayloadKeys, pathArg);
|
|
1767
|
-
if (value.schemaVersion !== 1
|
|
1768
|
-
|| value.kind
|
|
1769
|
-
!== 'cloudly-legacy-deployment-settlement-production-execution-authorization') {
|
|
1770
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1771
|
-
}
|
|
1772
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
1773
|
-
const sourceAuthority = normalizeAuthorityReferenceInternal(value.sourceAuthority, `${pathArg}.sourceAuthority`);
|
|
1774
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, `${pathArg}.executionAttempt`);
|
|
1775
|
-
const operationId = readIdentifier(value.operationId, `${pathArg}.operationId`);
|
|
1776
|
-
const settlementId = readIdentifier(value.settlementId, `${pathArg}.settlementId`);
|
|
1777
|
-
const authenticatedPlanSha256 = readSha256(value.authenticatedPlanSha256, `${pathArg}.authenticatedPlanSha256`);
|
|
1778
|
-
const requestBundleSha256 = readSha256(value.requestBundleSha256, `${pathArg}.requestBundleSha256`);
|
|
1779
|
-
const scratchReceiptSha256 = readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
|
|
1780
|
-
if (executionAttempt.purpose !== 'production'
|
|
1781
|
-
|| executionAttempt.operationId !== operationId
|
|
1782
|
-
|| executionAttempt.settlementId !== settlementId
|
|
1783
|
-
|| authority.authorityId === sourceAuthority.authorityId
|
|
1784
|
-
|| authority.keyId === sourceAuthority.keyId
|
|
1785
|
-
|| canonicalize(authority, `${pathArg}.authority`)
|
|
1786
|
-
=== canonicalize(sourceAuthority, `${pathArg}.sourceAuthority`)
|
|
1787
|
-
|| canonicalize(executionAttempt.executionAuthority, `${pathArg}.attempt.executionAuthority`)
|
|
1788
|
-
!== canonicalize(authority, `${pathArg}.authority`)
|
|
1789
|
-
|| canonicalize(executionAttempt.sourceAuthority, `${pathArg}.attempt.sourceAuthority`)
|
|
1790
|
-
!== canonicalize(sourceAuthority, `${pathArg}.sourceAuthority`)
|
|
1791
|
-
|| executionAttempt.authenticatedPlanSha256 !== authenticatedPlanSha256
|
|
1792
|
-
|| executionAttempt.requestBundleSha256 !== requestBundleSha256
|
|
1793
|
-
|| executionAttempt.scratchReceiptSha256 !== scratchReceiptSha256) {
|
|
1794
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.executionAttempt`);
|
|
1795
|
-
}
|
|
1796
|
-
const requestedAt = readInteger(value.requestedAt, `${pathArg}.requestedAt`, 1);
|
|
1797
|
-
const approvedAt = readInteger(value.approvedAt, `${pathArg}.approvedAt`, requestedAt);
|
|
1798
|
-
return {
|
|
1799
|
-
schemaVersion: 1,
|
|
1800
|
-
kind: 'cloudly-legacy-deployment-settlement-production-execution-authorization',
|
|
1801
|
-
authority,
|
|
1802
|
-
sourceAuthority,
|
|
1803
|
-
executionAttempt: executionAttempt,
|
|
1804
|
-
authenticatedPlanSha256,
|
|
1805
|
-
requestBundleSha256,
|
|
1806
|
-
scratchReceiptSha256,
|
|
1807
|
-
maintenanceImageDigest: readOciDigest(value.maintenanceImageDigest, `${pathArg}.maintenanceImageDigest`),
|
|
1808
|
-
operationId,
|
|
1809
|
-
settlementId,
|
|
1810
|
-
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
1811
|
-
rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
|
|
1812
|
-
scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
|
|
1813
|
-
allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
|
|
1814
|
-
allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
|
|
1815
|
-
allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
|
|
1816
|
-
allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
|
|
1817
|
-
sourceImageDigest: readOciDigest(value.sourceImageDigest, `${pathArg}.sourceImageDigest`),
|
|
1818
|
-
targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
|
|
1819
|
-
requestedAt,
|
|
1820
|
-
approvedAt,
|
|
1821
|
-
};
|
|
1822
|
-
};
|
|
1823
|
-
const normalizeUnsignedProductionExecutionAuthorizationInternal = (valueArg, pathArg) => {
|
|
1824
|
-
const value = readRecord(valueArg, pathArg);
|
|
1825
|
-
assertExactKeys(value, unsignedProductionExecutionAuthorizationKeys, pathArg);
|
|
1826
|
-
const payloadInput = Object.fromEntries(productionExecutionAuthorizationPayloadKeys.map((keyArg) => [keyArg, value[keyArg]]));
|
|
1827
|
-
const payload = normalizeProductionExecutionAuthorizationPayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
1828
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
1829
|
-
if (payloadSha256 !== digestBytes(encodeNormalized(productionExecutionAuthorizationPayload(payload), `${pathArg}.payload`))) {
|
|
1830
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
1831
|
-
}
|
|
1832
|
-
return { ...payload, payloadSha256 };
|
|
1833
|
-
};
|
|
1834
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization = (valueArg) => {
|
|
1835
|
-
const value = readRecord(valueArg, 'productionExecutionAuthorization');
|
|
1836
|
-
assertExactKeys(value, productionExecutionAuthorizationKeys, 'productionExecutionAuthorization');
|
|
1837
|
-
const unsignedInput = Object.fromEntries(unsignedProductionExecutionAuthorizationKeys.map((keyArg) => [keyArg, value[keyArg]]));
|
|
1838
|
-
return finalize({
|
|
1839
|
-
...normalizeUnsignedProductionExecutionAuthorizationInternal(unsignedInput, 'productionExecutionAuthorization.unsigned'),
|
|
1840
|
-
mac: readMac(value.mac, 'productionExecutionAuthorization.mac'),
|
|
1841
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'productionExecutionAuthorization');
|
|
1842
|
-
};
|
|
1843
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationPayload = (valueArg) => digestBytes(encodeNormalized(productionExecutionAuthorizationPayload(normalizeProductionExecutionAuthorizationPayloadInternal(valueArg, 'productionExecutionAuthorizationPayload')), 'productionExecutionAuthorizationPayload'));
|
|
1844
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(valueArg), 'productionExecutionAuthorization');
|
|
1845
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(valueArg));
|
|
1846
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.productionExecutionAuthorizationHmac, encodeNormalized(finalize(normalizeUnsignedProductionExecutionAuthorizationInternal(valueArg, 'unsignedProductionExecutionAuthorization'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedProductionExecutionAuthorization'), 'productionExecutionAuthorization.authenticated'));
|
|
1847
|
-
export const normalizeCloudlyLegacyDeploymentSettlementRequestBundleForAuthority = async (bundleArg, authenticatedPlanArg, metadataArg, verifierArg) => {
|
|
1848
|
-
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1849
|
-
const plan = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority(authenticatedPlanArg, metadata, verifierArg);
|
|
1850
|
-
const bundle = normalizeCloudlyLegacyDeploymentSettlementRequestBundle(bundleArg);
|
|
1851
|
-
await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(bundle.authenticatedRehearsalBinding, metadata, verifierArg);
|
|
1852
|
-
await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(bundle.authenticatedRequest, metadata, verifierArg);
|
|
1853
|
-
if (canonicalize(plan.payload, 'requestBundle.plan')
|
|
1854
|
-
!== canonicalize(bundle.authenticatedRequest.payload.plan, 'requestBundle.request.plan')
|
|
1855
|
-
|| plan.payloadSha256 !== bundle.authenticatedRequest.payload.planSha256) {
|
|
1856
|
-
fail('CROSS_FIELD_MISMATCH', 'requestBundle.authenticatedRequest.plan');
|
|
1857
|
-
}
|
|
1858
|
-
return bundle;
|
|
1859
|
-
};
|
|
1860
|
-
const assertProductionAuthorizationMetadata = (authorizationArg, productionMetadataArg, sourceMetadataArg) => {
|
|
1861
|
-
assertAuthorityReferenceMatchesMetadata(authorizationArg.authority, productionMetadataArg, 'productionExecutionAuthorization.authority');
|
|
1862
|
-
assertAuthorityReferenceMatchesMetadata(authorizationArg.sourceAuthority, sourceMetadataArg, 'productionExecutionAuthorization.sourceAuthority');
|
|
1863
|
-
if (canonicalize(productionMetadataArg.sourceAuthority, 'productionMetadata.sourceAuthority')
|
|
1864
|
-
!== canonicalize(authorizationArg.sourceAuthority, 'authorization.sourceAuthority')
|
|
1865
|
-
|| productionMetadataArg.sourceAuthenticatedPlanSha256
|
|
1866
|
-
!== authorizationArg.authenticatedPlanSha256
|
|
1867
|
-
|| productionMetadataArg.sourceRequestBundleSha256 !== authorizationArg.requestBundleSha256
|
|
1868
|
-
|| productionMetadataArg.scratchReceiptSha256 !== authorizationArg.scratchReceiptSha256
|
|
1869
|
-
|| authorizationArg.operationId !== productionMetadataArg.operationId
|
|
1870
|
-
|| authorizationArg.operationId !== sourceMetadataArg.operationId
|
|
1871
|
-
|| authorizationArg.settlementId !== productionMetadataArg.settlementId
|
|
1872
|
-
|| authorizationArg.settlementId !== sourceMetadataArg.settlementId
|
|
1873
|
-
|| authorizationArg.runId !== productionMetadataArg.runId
|
|
1874
|
-
|| authorizationArg.runId !== sourceMetadataArg.runId
|
|
1875
|
-
|| authorizationArg.rehearsalId !== productionMetadataArg.rehearsalId
|
|
1876
|
-
|| authorizationArg.rehearsalId !== sourceMetadataArg.rehearsalId
|
|
1877
|
-
|| authorizationArg.scratchServiceId !== productionMetadataArg.scratchServiceId
|
|
1878
|
-
|| authorizationArg.scratchServiceId !== sourceMetadataArg.scratchServiceId
|
|
1879
|
-
|| authorizationArg.allocationId !== productionMetadataArg.allocationId
|
|
1880
|
-
|| authorizationArg.allocationId !== sourceMetadataArg.allocationId
|
|
1881
|
-
|| authorizationArg.allocationGeneration !== productionMetadataArg.allocationGeneration
|
|
1882
|
-
|| authorizationArg.allocationGeneration !== sourceMetadataArg.allocationGeneration
|
|
1883
|
-
|| authorizationArg.allocationBindingSha256 !== productionMetadataArg.allocationBindingSha256
|
|
1884
|
-
|| authorizationArg.allocationBindingSha256 !== sourceMetadataArg.allocationBindingSha256
|
|
1885
|
-
|| authorizationArg.allocationReceiptSha256 !== productionMetadataArg.allocationReceiptSha256
|
|
1886
|
-
|| authorizationArg.allocationReceiptSha256 !== sourceMetadataArg.allocationReceiptSha256
|
|
1887
|
-
|| authorizationArg.maintenanceImageDigest !== productionMetadataArg.maintenanceImageDigest
|
|
1888
|
-
|| authorizationArg.sourceImageDigest !== productionMetadataArg.sourceImageDigest
|
|
1889
|
-
|| authorizationArg.sourceImageDigest !== sourceMetadataArg.sourceImageDigest
|
|
1890
|
-
|| authorizationArg.targetImageDigest !== productionMetadataArg.targetImageDigest
|
|
1891
|
-
|| authorizationArg.targetImageDigest !== sourceMetadataArg.targetImageDigest) {
|
|
1892
|
-
fail('CROSS_FIELD_MISMATCH', 'productionExecutionAuthorization.authorityMetadata');
|
|
1893
|
-
}
|
|
1894
|
-
assertAuthorityTimestamp(authorizationArg.requestedAt, productionMetadataArg, 'productionExecutionAuthorization.requestedAt');
|
|
1895
|
-
assertAuthorityTimestamp(authorizationArg.approvedAt, productionMetadataArg, 'productionExecutionAuthorization.approvedAt');
|
|
1896
|
-
};
|
|
1897
|
-
const assertProductionAuthorizationArtifacts = (authorizationArg, productionMetadataArg, sourceMetadataArg, authenticatedPlanArg, requestBundleArg, scratchReceiptArg) => {
|
|
1898
|
-
if (authorizationArg.authenticatedPlanSha256
|
|
1899
|
-
!== digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan(authenticatedPlanArg)
|
|
1900
|
-
|| authorizationArg.requestBundleSha256
|
|
1901
|
-
!== digestCloudlyLegacyDeploymentSettlementRequestBundle(requestBundleArg)
|
|
1902
|
-
|| authorizationArg.scratchReceiptSha256
|
|
1903
|
-
!== digestCloudlyLegacyDeploymentSettlementScratchReceipt(scratchReceiptArg)
|
|
1904
|
-
|| productionMetadataArg.issuedAt <= scratchReceiptArg.completedAt
|
|
1905
|
-
|| authorizationArg.requestedAt <= scratchReceiptArg.completedAt
|
|
1906
|
-
|| authorizationArg.requestedAt < productionMetadataArg.issuedAt
|
|
1907
|
-
|| authorizationArg.approvedAt < authorizationArg.requestedAt) {
|
|
1908
|
-
fail('CROSS_FIELD_MISMATCH', 'productionExecutionAuthorization.sourceProof');
|
|
1909
|
-
}
|
|
1910
|
-
assertProductionAuthorizationMetadata(authorizationArg, productionMetadataArg, sourceMetadataArg);
|
|
1911
|
-
};
|
|
1912
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationForAuthorities = async (authorizationArg, productionMetadataArg, sourceMetadataArg, authenticatedPlanArg, requestBundleArg, scratchReceiptArg, verifierArg) => {
|
|
1913
|
-
const { productionMetadata, sourceMetadata, } = normalizeProductionAuthorityMetadataPair(productionMetadataArg, sourceMetadataArg);
|
|
1914
|
-
const plan = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority(authenticatedPlanArg, sourceMetadata, verifierArg);
|
|
1915
|
-
const requestBundle = await normalizeCloudlyLegacyDeploymentSettlementRequestBundleForAuthority(requestBundleArg, plan, sourceMetadata, verifierArg);
|
|
1916
|
-
const scratchReceipt = await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(scratchReceiptArg, sourceMetadata, requestBundle.authenticatedRequest, verifierArg);
|
|
1917
|
-
const authorization = normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(authorizationArg);
|
|
1918
|
-
assertProductionAuthorizationArtifacts(authorization, productionMetadata, sourceMetadata, plan, requestBundle, scratchReceipt);
|
|
1919
|
-
await requireConsumerVerifiedHmac(authorization.authority, cloudlyLegacyDeploymentSettlementDomains.productionExecutionAuthorizationHmac, encodeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationHmacInput(withoutArtifactMac(authorization)), authorization.mac, verifierArg, 'productionExecutionAuthorization.mac');
|
|
1920
|
-
return authorization;
|
|
1921
|
-
};
|
|
1922
|
-
const productionReceiptV2PayloadKeys = [
|
|
1923
|
-
'schemaVersion',
|
|
1924
|
-
'kind',
|
|
1925
|
-
'authority',
|
|
1926
|
-
'sourceAuthority',
|
|
1927
|
-
'executionAttempt',
|
|
1928
|
-
'productionAuthorization',
|
|
1929
|
-
'productionAuthorizationSha256',
|
|
1930
|
-
'requestSha256',
|
|
1931
|
-
'requestBundleSha256',
|
|
1932
|
-
'scratchReceipt',
|
|
1933
|
-
'scratchReceiptSha256',
|
|
1934
|
-
'stableOutcome',
|
|
1935
|
-
'stableOutcomeSha256',
|
|
1936
|
-
'transactionCommitted',
|
|
1937
|
-
'disposition',
|
|
1938
|
-
'completedAt',
|
|
1939
|
-
];
|
|
1940
|
-
const unsignedProductionReceiptV2Keys = [...productionReceiptV2PayloadKeys, 'payloadSha256'];
|
|
1941
|
-
const productionReceiptV2Keys = [...unsignedProductionReceiptV2Keys, 'mac'];
|
|
1942
|
-
const productionReceiptV2Payload = (valueArg) => Object.fromEntries(productionReceiptV2PayloadKeys.map((keyArg) => [
|
|
1943
|
-
keyArg,
|
|
1944
|
-
valueArg[keyArg],
|
|
1945
|
-
]));
|
|
1946
|
-
const normalizeProductionReceiptV2PayloadInternal = (valueArg, pathArg) => {
|
|
1947
|
-
const value = readRecord(valueArg, pathArg);
|
|
1948
|
-
assertExactKeys(value, productionReceiptV2PayloadKeys, pathArg);
|
|
1949
|
-
if (value.schemaVersion !== 2
|
|
1950
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-production-receipt'
|
|
1951
|
-
|| value.transactionCommitted !== true) {
|
|
1952
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1953
|
-
}
|
|
1954
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
1955
|
-
const sourceAuthority = normalizeAuthorityReferenceInternal(value.sourceAuthority, `${pathArg}.sourceAuthority`);
|
|
1956
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, `${pathArg}.executionAttempt`);
|
|
1957
|
-
const productionAuthorization = normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(value.productionAuthorization);
|
|
1958
|
-
const productionAuthorizationSha256 = readSha256(value.productionAuthorizationSha256, `${pathArg}.productionAuthorizationSha256`);
|
|
1959
|
-
const requestBundleSha256 = readSha256(value.requestBundleSha256, `${pathArg}.requestBundleSha256`);
|
|
1960
|
-
const scratchReceipt = normalizeScratchReceiptInternal(value.scratchReceipt, `${pathArg}.scratchReceipt`);
|
|
1961
|
-
const scratchReceiptSha256 = readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
|
|
1962
|
-
const stableOutcome = normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`);
|
|
1963
|
-
const stableOutcomeSha256 = readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`);
|
|
1964
|
-
const requestSha256 = readSha256(value.requestSha256, `${pathArg}.requestSha256`);
|
|
1965
|
-
const disposition = readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`);
|
|
1966
|
-
const dispositionMatchesScratch = disposition === scratchReceipt.disposition
|
|
1967
|
-
|| (scratchReceipt.disposition === 'applied' && disposition === 'exact-replay');
|
|
1968
|
-
if (canonicalize(authority, `${pathArg}.authority`)
|
|
1969
|
-
!== canonicalize(productionAuthorization.authority, `${pathArg}.authorization.authority`)
|
|
1970
|
-
|| canonicalize(sourceAuthority, `${pathArg}.sourceAuthority`)
|
|
1971
|
-
!== canonicalize(productionAuthorization.sourceAuthority, `${pathArg}.authorization.sourceAuthority`)
|
|
1972
|
-
|| canonicalize(executionAttempt, `${pathArg}.executionAttempt`)
|
|
1973
|
-
!== canonicalize(productionAuthorization.executionAttempt, `${pathArg}.authorization.attempt`)
|
|
1974
|
-
|| productionAuthorizationSha256
|
|
1975
|
-
!== digestCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(productionAuthorization)
|
|
1976
|
-
|| requestBundleSha256 !== productionAuthorization.requestBundleSha256
|
|
1977
|
-
|| scratchReceiptSha256 !== productionAuthorization.scratchReceiptSha256
|
|
1978
|
-
|| scratchReceiptSha256
|
|
1979
|
-
!== digestCloudlyLegacyDeploymentSettlementScratchReceipt(scratchReceipt)
|
|
1980
|
-
|| canonicalize(sourceAuthority, `${pathArg}.sourceAuthority`)
|
|
1981
|
-
!== canonicalize(scratchReceipt.authority, `${pathArg}.scratchReceipt.authority`)
|
|
1982
|
-
|| requestSha256 !== scratchReceipt.requestSha256
|
|
1983
|
-
|| !dispositionMatchesScratch
|
|
1984
|
-
|| canonicalize(stableOutcome, `${pathArg}.stableOutcome`)
|
|
1985
|
-
!== canonicalize(scratchReceipt.stableOutcome, `${pathArg}.scratchReceipt.stableOutcome`)
|
|
1986
|
-
|| stableOutcomeSha256 !== scratchReceipt.stableOutcomeSha256
|
|
1987
|
-
|| stableOutcomeSha256
|
|
1988
|
-
!== digestCloudlyLegacyDeploymentSettlementStableOutcome(stableOutcome)) {
|
|
1989
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.productionAuthorization`);
|
|
1990
|
-
}
|
|
1991
|
-
return {
|
|
1992
|
-
schemaVersion: 2,
|
|
1993
|
-
kind: 'cloudly-legacy-deployment-settlement-production-receipt',
|
|
1994
|
-
authority,
|
|
1995
|
-
sourceAuthority,
|
|
1996
|
-
executionAttempt: executionAttempt,
|
|
1997
|
-
productionAuthorization,
|
|
1998
|
-
productionAuthorizationSha256,
|
|
1999
|
-
requestSha256,
|
|
2000
|
-
requestBundleSha256,
|
|
2001
|
-
scratchReceipt,
|
|
2002
|
-
scratchReceiptSha256,
|
|
2003
|
-
stableOutcome,
|
|
2004
|
-
stableOutcomeSha256,
|
|
2005
|
-
transactionCommitted: true,
|
|
2006
|
-
disposition,
|
|
2007
|
-
completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, productionAuthorization.approvedAt),
|
|
2008
|
-
};
|
|
2009
|
-
};
|
|
2010
|
-
const normalizeUnsignedProductionReceiptV2Internal = (valueArg, pathArg) => {
|
|
2011
|
-
const value = readRecord(valueArg, pathArg);
|
|
2012
|
-
assertExactKeys(value, unsignedProductionReceiptV2Keys, pathArg);
|
|
2013
|
-
const payloadInput = Object.fromEntries(productionReceiptV2PayloadKeys.map((keyArg) => [keyArg, value[keyArg]]));
|
|
2014
|
-
const payload = normalizeProductionReceiptV2PayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
2015
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
2016
|
-
if (payloadSha256 !== digestBytes(encodeNormalized(productionReceiptV2Payload(payload), `${pathArg}.payload`))) {
|
|
2017
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
2018
|
-
}
|
|
2019
|
-
return { ...payload, payloadSha256 };
|
|
2020
|
-
};
|
|
2021
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionReceiptPayloadV2 = (valueArg) => digestBytes(encodeNormalized(productionReceiptV2Payload(normalizeProductionReceiptV2PayloadInternal(valueArg, 'productionReceiptPayloadV2')), 'productionReceiptPayloadV2'));
|
|
2022
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2 = (valueArg) => {
|
|
2023
|
-
const value = readRecord(valueArg, 'productionReceiptV2');
|
|
2024
|
-
assertExactKeys(value, productionReceiptV2Keys, 'productionReceiptV2');
|
|
2025
|
-
const unsignedInput = Object.fromEntries(unsignedProductionReceiptV2Keys.map((keyArg) => [keyArg, value[keyArg]]));
|
|
2026
|
-
return finalize({
|
|
2027
|
-
...normalizeUnsignedProductionReceiptV2Internal(unsignedInput, 'productionReceiptV2.unsigned'),
|
|
2028
|
-
mac: readMac(value.mac, 'productionReceiptV2.mac'),
|
|
2029
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 3, 'productionReceiptV2');
|
|
2030
|
-
};
|
|
2031
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptAnyVersion = (valueArg) => {
|
|
2032
|
-
const value = readRecord(valueArg, 'productionReceipt');
|
|
2033
|
-
return value.schemaVersion === 2
|
|
2034
|
-
? normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2(value)
|
|
2035
|
-
: normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(value);
|
|
2036
|
-
};
|
|
2037
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionReceiptV2 = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2(valueArg), 'productionReceiptV2');
|
|
2038
|
-
export const digestCloudlyLegacyDeploymentSettlementProductionReceiptV2 = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionReceiptV2(valueArg));
|
|
2039
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionReceiptV2HmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.productionReceiptV2Hmac, encodeNormalized(finalize(normalizeUnsignedProductionReceiptV2Internal(valueArg, 'unsignedProductionReceiptV2'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 3, 'unsignedProductionReceiptV2'), 'productionReceiptV2.authenticated'));
|
|
2040
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2ForAuthorities = async (receiptArg, productionMetadataArg, sourceMetadataArg, authenticatedPlanArg, requestBundleArg, verifierArg) => {
|
|
2041
|
-
const { productionMetadata, sourceMetadata, } = normalizeProductionAuthorityMetadataPair(productionMetadataArg, sourceMetadataArg);
|
|
2042
|
-
const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2(receiptArg);
|
|
2043
|
-
const requestBundle = normalizeCloudlyLegacyDeploymentSettlementRequestBundle(requestBundleArg);
|
|
2044
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationForAuthorities(receipt.productionAuthorization, productionMetadata, sourceMetadata, authenticatedPlanArg, requestBundle, receipt.scratchReceipt, verifierArg);
|
|
2045
|
-
await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(receipt.scratchReceipt, sourceMetadata, requestBundle.authenticatedRequest, verifierArg);
|
|
2046
|
-
assertAuthorityReferenceMatchesMetadata(receipt.authority, productionMetadata, 'productionReceiptV2.authority');
|
|
2047
|
-
assertAuthorityTimestamp(receipt.completedAt, productionMetadata, 'productionReceiptV2.completedAt');
|
|
2048
|
-
await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.productionReceiptV2Hmac, encodeCloudlyLegacyDeploymentSettlementProductionReceiptV2HmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'productionReceiptV2.mac');
|
|
2049
|
-
return receipt;
|
|
2050
|
-
};
|
|
2051
|
-
const normalizeCommittedResolutionReceipt = (valueArg, pathArg) => {
|
|
2052
|
-
const value = readRecord(valueArg, pathArg);
|
|
2053
|
-
if (value.kind === 'cloudly-legacy-deployment-settlement-scratch-receipt') {
|
|
2054
|
-
return normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(value);
|
|
2055
|
-
}
|
|
2056
|
-
if (value.kind !== 'cloudly-legacy-deployment-settlement-production-receipt') {
|
|
2057
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
2058
|
-
}
|
|
2059
|
-
if (value.schemaVersion !== 2) {
|
|
2060
|
-
fail('INVALID_VALUE', `${pathArg}.schemaVersion`);
|
|
2061
|
-
}
|
|
2062
|
-
return normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2(value);
|
|
2063
|
-
};
|
|
2064
|
-
/** Structural only; this function does not authenticate receipt MACs. */
|
|
2065
|
-
export const normalizeCloudlyLegacyDeploymentSettlementResolutionBundle = (valueArg) => {
|
|
2066
|
-
const value = readRecord(valueArg, 'resolutionBundle');
|
|
2067
|
-
const outcome = readLiteral(value.outcome, ['committed', 'unapplied'], 'resolutionBundle.outcome');
|
|
2068
|
-
const mode = readLiteral(value.mode, [
|
|
2069
|
-
'committed-schema1',
|
|
2070
|
-
'committed-schema2',
|
|
2071
|
-
'aborted-prepared',
|
|
2072
|
-
'observed-aborted',
|
|
2073
|
-
'absent-tombstone',
|
|
2074
|
-
'legacy-no-op',
|
|
2075
|
-
], 'resolutionBundle.mode');
|
|
2076
|
-
const committed = outcome === 'committed';
|
|
2077
|
-
assertExactKeys(value, [
|
|
2078
|
-
'schemaVersion',
|
|
2079
|
-
'kind',
|
|
2080
|
-
'executionAttempt',
|
|
2081
|
-
'observedAt',
|
|
2082
|
-
'sourceAuthorityStatus',
|
|
2083
|
-
'executionAuthorityStatus',
|
|
2084
|
-
'outcome',
|
|
2085
|
-
'mode',
|
|
2086
|
-
'attemptObservation',
|
|
2087
|
-
...(committed ? ['originalReceipt', 'originalReceiptSha256'] : []),
|
|
2088
|
-
], 'resolutionBundle');
|
|
2089
|
-
if (value.schemaVersion !== 1
|
|
2090
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-resolution-bundle') {
|
|
2091
|
-
fail('INVALID_VALUE', 'resolutionBundle.kind');
|
|
2092
|
-
}
|
|
2093
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, 'resolutionBundle.executionAttempt');
|
|
2094
|
-
const observedAt = readInteger(value.observedAt, 'resolutionBundle.observedAt', 1);
|
|
2095
|
-
const sourceAuthorityStatus = readLiteral(value.sourceAuthorityStatus, ['active', 'expired'], 'resolutionBundle.sourceAuthorityStatus');
|
|
2096
|
-
const executionAuthorityStatus = readLiteral(value.executionAuthorityStatus, ['active', 'expired'], 'resolutionBundle.executionAuthorityStatus');
|
|
2097
|
-
if (canonicalize(executionAttempt.sourceAuthority, 'resolutionBundle.sourceAuthority')
|
|
2098
|
-
=== canonicalize(executionAttempt.executionAuthority, 'resolutionBundle.executionAuthority')
|
|
2099
|
-
&& sourceAuthorityStatus !== executionAuthorityStatus) {
|
|
2100
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.executionAuthorityStatus');
|
|
2101
|
-
}
|
|
2102
|
-
if (committed) {
|
|
2103
|
-
if (mode !== 'committed-schema1' && mode !== 'committed-schema2') {
|
|
2104
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.mode');
|
|
2105
|
-
}
|
|
2106
|
-
const attemptObservation = normalizeExecutionAttemptObservationInternal(value.attemptObservation, 'resolutionBundle.attemptObservation');
|
|
2107
|
-
if (attemptObservation.state !== 'committed') {
|
|
2108
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2109
|
-
}
|
|
2110
|
-
const committedObservation = attemptObservation;
|
|
2111
|
-
if (canonicalize(committedObservation.identity, 'resolutionBundle.observation.identity')
|
|
2112
|
-
!== canonicalize(executionAttempt, 'resolutionBundle.executionAttempt')) {
|
|
2113
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2114
|
-
}
|
|
2115
|
-
const originalReceipt = normalizeCommittedResolutionReceipt(value.originalReceipt, 'resolutionBundle.originalReceipt');
|
|
2116
|
-
const receiptSchemaVersion = originalReceipt.schemaVersion;
|
|
2117
|
-
const originalReceiptSha256 = readSha256(value.originalReceiptSha256, 'resolutionBundle.originalReceiptSha256');
|
|
2118
|
-
const expectedReceiptSha256 = originalReceipt.kind
|
|
2119
|
-
=== 'cloudly-legacy-deployment-settlement-scratch-receipt'
|
|
2120
|
-
? digestCloudlyLegacyDeploymentSettlementScratchReceipt(originalReceipt)
|
|
2121
|
-
: originalReceipt.schemaVersion === 2
|
|
2122
|
-
? digestCloudlyLegacyDeploymentSettlementProductionReceiptV2(originalReceipt)
|
|
2123
|
-
: digestCloudlyLegacyDeploymentSettlementProductionReceipt(originalReceipt);
|
|
2124
|
-
const receiptExecutionAuthority = originalReceipt.authority;
|
|
2125
|
-
const receiptSourceAuthority = originalReceipt.schemaVersion === 2
|
|
2126
|
-
? originalReceipt.sourceAuthority
|
|
2127
|
-
: originalReceipt.authority;
|
|
2128
|
-
if ((mode === 'committed-schema1') !== (receiptSchemaVersion === 1)
|
|
2129
|
-
|| committedObservation.receiptSchemaVersion !== receiptSchemaVersion
|
|
2130
|
-
|| committedObservation.receiptSha256 !== originalReceiptSha256
|
|
2131
|
-
|| originalReceiptSha256 !== expectedReceiptSha256
|
|
2132
|
-
|| committedObservation.resolvedAt !== originalReceipt.completedAt
|
|
2133
|
-
|| observedAt < committedObservation.resolvedAt
|
|
2134
|
-
|| canonicalize(receiptExecutionAuthority, 'resolutionBundle.receipt.executionAuthority')
|
|
2135
|
-
!== canonicalize(executionAttempt.executionAuthority, 'resolutionBundle.executionAuthority')
|
|
2136
|
-
|| canonicalize(receiptSourceAuthority, 'resolutionBundle.receipt.sourceAuthority')
|
|
2137
|
-
!== canonicalize(executionAttempt.sourceAuthority, 'resolutionBundle.sourceAuthority')
|
|
2138
|
-
|| (originalReceipt.schemaVersion === 2
|
|
2139
|
-
&& canonicalize(originalReceipt.executionAttempt, 'resolutionBundle.receipt.executionAttempt')
|
|
2140
|
-
!== canonicalize(executionAttempt, 'resolutionBundle.executionAttempt'))
|
|
2141
|
-
|| (executionAttempt.purpose === 'scratch-rehearsal')
|
|
2142
|
-
!== (originalReceipt.kind
|
|
2143
|
-
=== 'cloudly-legacy-deployment-settlement-scratch-receipt')) {
|
|
2144
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.originalReceipt');
|
|
2145
|
-
}
|
|
2146
|
-
let result;
|
|
2147
|
-
if (mode === 'committed-schema1'
|
|
2148
|
-
&& originalReceipt.kind === 'cloudly-legacy-deployment-settlement-scratch-receipt') {
|
|
2149
|
-
const scratchAttempt = executionAttempt;
|
|
2150
|
-
result = {
|
|
2151
|
-
schemaVersion: 1,
|
|
2152
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2153
|
-
executionAttempt: scratchAttempt,
|
|
2154
|
-
observedAt,
|
|
2155
|
-
sourceAuthorityStatus,
|
|
2156
|
-
executionAuthorityStatus,
|
|
2157
|
-
outcome,
|
|
2158
|
-
mode,
|
|
2159
|
-
attemptObservation: {
|
|
2160
|
-
...committedObservation,
|
|
2161
|
-
identity: scratchAttempt,
|
|
2162
|
-
receiptSchemaVersion: 1,
|
|
2163
|
-
},
|
|
2164
|
-
originalReceipt,
|
|
2165
|
-
originalReceiptSha256,
|
|
2166
|
-
};
|
|
2167
|
-
}
|
|
2168
|
-
else {
|
|
2169
|
-
const productionAttempt = executionAttempt;
|
|
2170
|
-
result = {
|
|
2171
|
-
schemaVersion: 1,
|
|
2172
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2173
|
-
executionAttempt: productionAttempt,
|
|
2174
|
-
observedAt,
|
|
2175
|
-
sourceAuthorityStatus,
|
|
2176
|
-
executionAuthorityStatus,
|
|
2177
|
-
outcome,
|
|
2178
|
-
mode: 'committed-schema2',
|
|
2179
|
-
attemptObservation: {
|
|
2180
|
-
...committedObservation,
|
|
2181
|
-
identity: productionAttempt,
|
|
2182
|
-
receiptSchemaVersion: 2,
|
|
2183
|
-
},
|
|
2184
|
-
originalReceipt: originalReceipt,
|
|
2185
|
-
originalReceiptSha256,
|
|
2186
|
-
};
|
|
2187
|
-
}
|
|
2188
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 4, 'resolutionBundle');
|
|
2189
|
-
}
|
|
2190
|
-
if (mode === 'committed-schema1' || mode === 'committed-schema2') {
|
|
2191
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.mode');
|
|
2192
|
-
}
|
|
2193
|
-
if (mode === 'aborted-prepared'
|
|
2194
|
-
|| mode === 'observed-aborted'
|
|
2195
|
-
|| mode === 'absent-tombstone') {
|
|
2196
|
-
const attemptObservation = normalizeExecutionAttemptObservationInternal(value.attemptObservation, 'resolutionBundle.attemptObservation');
|
|
2197
|
-
if (attemptObservation.state !== 'aborted') {
|
|
2198
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2199
|
-
}
|
|
2200
|
-
const abortedObservation = attemptObservation;
|
|
2201
|
-
if (canonicalize(abortedObservation.identity, 'resolutionBundle.observation.identity')
|
|
2202
|
-
!== canonicalize(executionAttempt, 'resolutionBundle.executionAttempt')
|
|
2203
|
-
|| observedAt < abortedObservation.resolvedAt) {
|
|
2204
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2205
|
-
}
|
|
2206
|
-
if (mode === 'absent-tombstone') {
|
|
2207
|
-
const result = {
|
|
2208
|
-
schemaVersion: 1,
|
|
2209
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2210
|
-
executionAttempt,
|
|
2211
|
-
observedAt,
|
|
2212
|
-
sourceAuthorityStatus,
|
|
2213
|
-
executionAuthorityStatus,
|
|
2214
|
-
outcome,
|
|
2215
|
-
mode,
|
|
2216
|
-
attemptObservation: abortedObservation,
|
|
2217
|
-
};
|
|
2218
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'resolutionBundle');
|
|
2219
|
-
}
|
|
2220
|
-
const result = mode === 'aborted-prepared'
|
|
2221
|
-
? {
|
|
2222
|
-
schemaVersion: 1,
|
|
2223
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2224
|
-
executionAttempt,
|
|
2225
|
-
observedAt,
|
|
2226
|
-
sourceAuthorityStatus,
|
|
2227
|
-
executionAuthorityStatus,
|
|
2228
|
-
outcome,
|
|
2229
|
-
mode,
|
|
2230
|
-
attemptObservation: abortedObservation,
|
|
2231
|
-
}
|
|
2232
|
-
: {
|
|
2233
|
-
schemaVersion: 1,
|
|
2234
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2235
|
-
executionAttempt,
|
|
2236
|
-
observedAt,
|
|
2237
|
-
sourceAuthorityStatus,
|
|
2238
|
-
executionAuthorityStatus,
|
|
2239
|
-
outcome,
|
|
2240
|
-
mode,
|
|
2241
|
-
attemptObservation: abortedObservation,
|
|
2242
|
-
};
|
|
2243
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'resolutionBundle');
|
|
2244
|
-
}
|
|
2245
|
-
if (value.attemptObservation !== null) {
|
|
2246
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2247
|
-
}
|
|
2248
|
-
if (executionAttempt.purpose !== 'scratch-rehearsal') {
|
|
2249
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.executionAttempt');
|
|
2250
|
-
}
|
|
2251
|
-
const scratchExecutionAttempt = executionAttempt;
|
|
2252
|
-
const result = {
|
|
2253
|
-
schemaVersion: 1,
|
|
2254
|
-
kind: 'cloudly-legacy-deployment-settlement-resolution-bundle',
|
|
2255
|
-
executionAttempt: scratchExecutionAttempt,
|
|
2256
|
-
observedAt,
|
|
2257
|
-
sourceAuthorityStatus,
|
|
2258
|
-
executionAuthorityStatus,
|
|
2259
|
-
outcome,
|
|
2260
|
-
mode: 'legacy-no-op',
|
|
2261
|
-
attemptObservation: null,
|
|
2262
|
-
};
|
|
2263
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'resolutionBundle');
|
|
2264
|
-
};
|
|
2265
|
-
export const encodeCloudlyLegacyDeploymentSettlementResolutionBundle = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementResolutionBundle(valueArg), 'resolutionBundle');
|
|
2266
|
-
export const digestCloudlyLegacyDeploymentSettlementResolutionBundle = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementResolutionBundle(valueArg));
|
|
2267
|
-
const unsignedAuthenticatedResolutionKeys = [
|
|
2268
|
-
'schemaVersion',
|
|
2269
|
-
'kind',
|
|
2270
|
-
'authority',
|
|
2271
|
-
'payload',
|
|
2272
|
-
'payloadSha256',
|
|
2273
|
-
];
|
|
2274
|
-
const authenticatedResolutionKeys = [...unsignedAuthenticatedResolutionKeys, 'mac'];
|
|
2275
|
-
const normalizeUnsignedAuthenticatedResolutionInternal = (valueArg, pathArg) => {
|
|
2276
|
-
const value = readRecord(valueArg, pathArg);
|
|
2277
|
-
assertExactKeys(value, unsignedAuthenticatedResolutionKeys, pathArg);
|
|
2278
|
-
if (value.schemaVersion !== 1
|
|
2279
|
-
|| value.kind !== 'authenticated-cloudly-legacy-deployment-settlement-resolution') {
|
|
2280
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
2281
|
-
}
|
|
2282
|
-
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
2283
|
-
const payload = normalizeCloudlyLegacyDeploymentSettlementResolutionBundle(value.payload);
|
|
2284
|
-
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
2285
|
-
if (canonicalize(authority, `${pathArg}.authority`)
|
|
2286
|
-
!== canonicalize(payload.executionAttempt.executionAuthority, `${pathArg}.payload.authority`)
|
|
2287
|
-
|| payloadSha256 !== digestCloudlyLegacyDeploymentSettlementResolutionBundle(payload)) {
|
|
2288
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payload`);
|
|
2289
|
-
}
|
|
2290
|
-
return {
|
|
2291
|
-
schemaVersion: 1,
|
|
2292
|
-
kind: 'authenticated-cloudly-legacy-deployment-settlement-resolution',
|
|
2293
|
-
authority,
|
|
2294
|
-
payload,
|
|
2295
|
-
payloadSha256,
|
|
2296
|
-
};
|
|
2297
|
-
};
|
|
2298
|
-
/** Structural only; this function does not authenticate the recovery-attestation MAC. */
|
|
2299
|
-
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedResolutionStructure = (valueArg) => {
|
|
2300
|
-
const value = readRecord(valueArg, 'authenticatedResolution');
|
|
2301
|
-
assertExactKeys(value, authenticatedResolutionKeys, 'authenticatedResolution');
|
|
2302
|
-
return finalize({
|
|
2303
|
-
...normalizeUnsignedAuthenticatedResolutionInternal(Object.fromEntries(unsignedAuthenticatedResolutionKeys.map((keyArg) => [
|
|
2304
|
-
keyArg,
|
|
2305
|
-
value[keyArg],
|
|
2306
|
-
])), 'authenticatedResolution.unsigned'),
|
|
2307
|
-
mac: readMac(value.mac, 'authenticatedResolution.mac'),
|
|
2308
|
-
}, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 5, 'authenticatedResolution');
|
|
2309
|
-
};
|
|
2310
|
-
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementResolution = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthenticatedResolutionStructure(valueArg), 'authenticatedResolution');
|
|
2311
|
-
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementResolution = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementResolution(valueArg));
|
|
2312
|
-
export const encodeCloudlyLegacyDeploymentSettlementResolutionHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.resolutionHmac, encodeNormalized(finalize(normalizeUnsignedAuthenticatedResolutionInternal(valueArg, 'unsignedAuthenticatedResolution'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 5, 'unsignedAuthenticatedResolution'), 'authenticatedResolution.authenticated'));
|
|
2313
|
-
const normalizeExecutionAttemptAuthorityMetadata = (attemptArg, sourceMetadataArg, executionMetadataArg) => {
|
|
2314
|
-
const sourceMetadata = normalizeFencedSourceAuthorityMetadata(sourceMetadataArg, 'executionAttempt.sourceAuthorityMetadata');
|
|
2315
|
-
const executionMetadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(executionMetadataArg);
|
|
2316
|
-
assertAuthorityReferenceMatchesMetadata(attemptArg.sourceAuthority, sourceMetadata, 'executionAttempt.sourceAuthority');
|
|
2317
|
-
assertAuthorityReferenceMatchesMetadata(attemptArg.executionAuthority, executionMetadata, 'executionAttempt.executionAuthority');
|
|
2318
|
-
const splitProductionAuthority = canonicalize(attemptArg.sourceAuthority, 'executionAttempt.sourceAuthority') !== canonicalize(attemptArg.executionAuthority, 'executionAttempt.executionAuthority');
|
|
2319
|
-
if (attemptArg.purpose === 'scratch-rehearsal') {
|
|
2320
|
-
if (splitProductionAuthority) {
|
|
2321
|
-
fail('CROSS_FIELD_MISMATCH', 'executionAttempt.executionAuthority');
|
|
2322
|
-
}
|
|
2323
|
-
normalizeFencedSourceAuthorityMetadata(executionMetadata, 'executionAttempt.executionAuthorityMetadata');
|
|
2324
|
-
}
|
|
2325
|
-
else {
|
|
2326
|
-
if (!splitProductionAuthority) {
|
|
2327
|
-
fail('CROSS_FIELD_MISMATCH', 'executionAttempt.executionAuthority');
|
|
2328
|
-
}
|
|
2329
|
-
const productionMetadata = normalizeProductionAuthorityMetadataPair(executionMetadata, sourceMetadata).productionMetadata;
|
|
2330
|
-
if (productionMetadata.sourceAuthenticatedPlanSha256
|
|
2331
|
-
!== attemptArg.authenticatedPlanSha256
|
|
2332
|
-
|| productionMetadata.sourceRequestBundleSha256 !== attemptArg.requestBundleSha256
|
|
2333
|
-
|| productionMetadata.scratchReceiptSha256 !== attemptArg.scratchReceiptSha256) {
|
|
2334
|
-
fail('CROSS_FIELD_MISMATCH', 'executionAttempt.productionAuthorityMetadata');
|
|
2335
|
-
}
|
|
2336
|
-
}
|
|
2337
|
-
return { sourceMetadata, executionMetadata, splitProductionAuthority };
|
|
2338
|
-
};
|
|
2339
|
-
const authorityStatusAt = (observedAtArg, metadataArg, pathArg) => {
|
|
2340
|
-
if (observedAtArg < metadataArg.issuedAt) {
|
|
2341
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
2342
|
-
}
|
|
2343
|
-
return observedAtArg < metadataArg.expiresAt ? 'active' : 'expired';
|
|
2344
|
-
};
|
|
2345
|
-
const normalizeExecutionAttemptProofArtifacts = async (argsArg) => {
|
|
2346
|
-
const metadata = normalizeExecutionAttemptAuthorityMetadata(argsArg.executionAttempt, argsArg.sourceMetadata, argsArg.executionMetadata);
|
|
2347
|
-
const authenticatedPlan = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority(argsArg.authenticatedPlan, metadata.sourceMetadata, argsArg.verifier);
|
|
2348
|
-
const requestBundle = await normalizeCloudlyLegacyDeploymentSettlementRequestBundleForAuthority(argsArg.requestBundle, authenticatedPlan, metadata.sourceMetadata, argsArg.verifier);
|
|
2349
|
-
let scratchReceipt = null;
|
|
2350
|
-
let productionAuthorization = null;
|
|
2351
|
-
if (argsArg.executionAttempt.purpose === 'production') {
|
|
2352
|
-
if (argsArg.scratchReceipt === null) {
|
|
2353
|
-
fail('INVALID_SCHEMA', 'executionAttempt.scratchReceipt');
|
|
2354
|
-
}
|
|
2355
|
-
scratchReceipt = await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(argsArg.scratchReceipt, metadata.sourceMetadata, requestBundle.authenticatedRequest, argsArg.verifier);
|
|
2356
|
-
if (metadata.splitProductionAuthority) {
|
|
2357
|
-
if (argsArg.productionAuthorization === null) {
|
|
2358
|
-
if (argsArg.requireProductionAuthorization) {
|
|
2359
|
-
fail('INVALID_SCHEMA', 'executionAttempt.productionAuthorization');
|
|
2360
|
-
}
|
|
2361
|
-
}
|
|
2362
|
-
else {
|
|
2363
|
-
productionAuthorization =
|
|
2364
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationForAuthorities(argsArg.productionAuthorization, metadata.executionMetadata, metadata.sourceMetadata, authenticatedPlan, requestBundle, scratchReceipt, argsArg.verifier);
|
|
2365
|
-
}
|
|
2366
|
-
}
|
|
2367
|
-
else if (argsArg.productionAuthorization !== null) {
|
|
2368
|
-
fail('INVALID_SCHEMA', 'executionAttempt.productionAuthorization');
|
|
2369
|
-
}
|
|
2370
|
-
}
|
|
2371
|
-
else if (argsArg.scratchReceipt !== null || argsArg.productionAuthorization !== null) {
|
|
2372
|
-
fail('INVALID_SCHEMA', 'executionAttempt.sourceProof');
|
|
2373
|
-
}
|
|
2374
|
-
const expectedScratchReceiptSha256 = scratchReceipt
|
|
2375
|
-
? digestCloudlyLegacyDeploymentSettlementScratchReceipt(scratchReceipt)
|
|
2376
|
-
: null;
|
|
2377
|
-
if (argsArg.executionAttempt.authenticatedPlanSha256
|
|
2378
|
-
!== digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan(authenticatedPlan)
|
|
2379
|
-
|| argsArg.executionAttempt.requestBundleSha256
|
|
2380
|
-
!== digestCloudlyLegacyDeploymentSettlementRequestBundle(requestBundle)
|
|
2381
|
-
|| argsArg.executionAttempt.scratchReceiptSha256 !== expectedScratchReceiptSha256) {
|
|
2382
|
-
fail('CROSS_FIELD_MISMATCH', 'executionAttempt.sourceProof');
|
|
2383
|
-
}
|
|
2384
|
-
return {
|
|
2385
|
-
...metadata,
|
|
2386
|
-
authenticatedPlan,
|
|
2387
|
-
requestBundle,
|
|
2388
|
-
scratchReceipt,
|
|
2389
|
-
productionAuthorization,
|
|
2390
|
-
};
|
|
2391
|
-
};
|
|
2392
|
-
const normalizeAuthenticatedApplyResultForExecutionAuthority = async (resultArg, executionMetadataArg, requestArg, productionAuthorizationArg, verifierArg) => {
|
|
2393
|
-
const executionMetadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(executionMetadataArg);
|
|
2394
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
2395
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure(resultArg);
|
|
2396
|
-
assertAuthorityReferenceMatchesMetadata(result.authority, executionMetadata, 'applyResult.authority');
|
|
2397
|
-
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'applyResult.payload');
|
|
2398
|
-
const resultAt = result.payload.status === 'completed'
|
|
2399
|
-
? result.payload.completedAt
|
|
2400
|
-
: result.payload.rejectedAt;
|
|
2401
|
-
const resultAtPath = result.payload.status === 'completed'
|
|
2402
|
-
? 'applyResult.payload.completedAt'
|
|
2403
|
-
: 'applyResult.payload.rejectedAt';
|
|
2404
|
-
if (canonicalize(result.authority, 'applyResult.authority')
|
|
2405
|
-
!== canonicalize(productionAuthorizationArg.authority, 'productionAuthorization.authority')
|
|
2406
|
-
|| resultAt < request.payload.requestedAt
|
|
2407
|
-
|| resultAt < productionAuthorizationArg.approvedAt) {
|
|
2408
|
-
fail('CROSS_FIELD_MISMATCH', resultAtPath);
|
|
2409
|
-
}
|
|
2410
|
-
assertAuthorityTimestamp(resultAt, executionMetadata, resultAtPath);
|
|
2411
|
-
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'applyResult.mac');
|
|
2412
|
-
return result;
|
|
2413
|
-
};
|
|
2414
|
-
const normalizeAuthenticatedCheckResultForExecutionAuthority = async (resultArg, executionMetadataArg, requestArg, productionAuthorizationArg, verifierArg) => {
|
|
2415
|
-
const executionMetadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(executionMetadataArg);
|
|
2416
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
2417
|
-
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure(resultArg);
|
|
2418
|
-
assertAuthorityReferenceMatchesMetadata(result.authority, executionMetadata, 'checkResult.authority');
|
|
2419
|
-
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'checkResult.payload');
|
|
2420
|
-
if (canonicalize(result.authority, 'checkResult.authority')
|
|
2421
|
-
!== canonicalize(productionAuthorizationArg.authority, 'productionAuthorization.authority')
|
|
2422
|
-
|| result.payload.checkedAt < request.payload.requestedAt
|
|
2423
|
-
|| result.payload.checkedAt < productionAuthorizationArg.approvedAt) {
|
|
2424
|
-
fail('CROSS_FIELD_MISMATCH', 'checkResult.payload.checkedAt');
|
|
2425
|
-
}
|
|
2426
|
-
assertAuthorityTimestamp(result.payload.checkedAt, executionMetadata, 'checkResult.checkedAt');
|
|
2427
|
-
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'checkResult.mac');
|
|
2428
|
-
return result;
|
|
2429
|
-
};
|
|
2430
|
-
/** Artifact/status binding only; trust the authenticated recovery attestation instead. */
|
|
2431
|
-
export const normalizeCloudlyLegacyDeploymentSettlementResolutionBundleForAuthorities = async (bundleArg, sourceMetadataArg, executionMetadataArg, authenticatedPlanArg, requestBundleArg, scratchReceiptArg, productionAuthorizationArg, verifierArg) => {
|
|
2432
|
-
const bundle = normalizeCloudlyLegacyDeploymentSettlementResolutionBundle(bundleArg);
|
|
2433
|
-
const artifacts = await normalizeExecutionAttemptProofArtifacts({
|
|
2434
|
-
executionAttempt: bundle.executionAttempt,
|
|
2435
|
-
sourceMetadata: sourceMetadataArg,
|
|
2436
|
-
executionMetadata: executionMetadataArg,
|
|
2437
|
-
authenticatedPlan: authenticatedPlanArg,
|
|
2438
|
-
requestBundle: requestBundleArg,
|
|
2439
|
-
scratchReceipt: scratchReceiptArg,
|
|
2440
|
-
productionAuthorization: productionAuthorizationArg,
|
|
2441
|
-
requireProductionAuthorization: true,
|
|
2442
|
-
verifier: verifierArg,
|
|
2443
|
-
});
|
|
2444
|
-
if (bundle.sourceAuthorityStatus !== authorityStatusAt(bundle.observedAt, artifacts.sourceMetadata, 'resolutionBundle.sourceAuthorityStatus')) {
|
|
2445
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.sourceAuthorityStatus');
|
|
2446
|
-
}
|
|
2447
|
-
if (bundle.executionAuthorityStatus !== authorityStatusAt(bundle.observedAt, artifacts.executionMetadata, 'resolutionBundle.executionAuthorityStatus')) {
|
|
2448
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.executionAuthorityStatus');
|
|
2449
|
-
}
|
|
2450
|
-
if (bundle.executionAttempt.purpose === 'production') {
|
|
2451
|
-
const productionAuthorization = artifacts.productionAuthorization
|
|
2452
|
-
?? fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.productionAuthorization');
|
|
2453
|
-
const attemptObservation = bundle.attemptObservation
|
|
2454
|
-
?? fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation');
|
|
2455
|
-
if (attemptObservation.preparedAt < productionAuthorization.approvedAt
|
|
2456
|
-
|| attemptObservation.resolvedAt < productionAuthorization.approvedAt
|
|
2457
|
-
|| bundle.observedAt < productionAuthorization.approvedAt) {
|
|
2458
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.attemptObservation.preparedAt');
|
|
2459
|
-
}
|
|
2460
|
-
}
|
|
2461
|
-
if (bundle.outcome === 'committed') {
|
|
2462
|
-
const receipt = bundle.originalReceipt;
|
|
2463
|
-
if (receipt.kind === 'cloudly-legacy-deployment-settlement-scratch-receipt') {
|
|
2464
|
-
await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(receipt, artifacts.sourceMetadata, artifacts.requestBundle.authenticatedRequest, verifierArg);
|
|
2465
|
-
}
|
|
2466
|
-
else if (receipt.schemaVersion === 2) {
|
|
2467
|
-
if (!artifacts.splitProductionAuthority || !artifacts.productionAuthorization) {
|
|
2468
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.originalReceipt.authority');
|
|
2469
|
-
}
|
|
2470
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2ForAuthorities(receipt, artifacts.executionMetadata, artifacts.sourceMetadata, artifacts.authenticatedPlan, artifacts.requestBundle, verifierArg);
|
|
2471
|
-
if (canonicalize(receipt.productionAuthorization, 'resolutionBundle.originalReceipt.productionAuthorization') !== canonicalize(artifacts.productionAuthorization, 'resolutionBundle.productionAuthorization')) {
|
|
2472
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.originalReceipt.productionAuthorization');
|
|
2473
|
-
}
|
|
2474
|
-
}
|
|
2475
|
-
else {
|
|
2476
|
-
if (artifacts.splitProductionAuthority) {
|
|
2477
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.originalReceipt.authority');
|
|
2478
|
-
}
|
|
2479
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionReceiptForAuthority(receipt, artifacts.sourceMetadata, artifacts.requestBundle.authenticatedRequest, verifierArg);
|
|
2480
|
-
}
|
|
2481
|
-
if (receipt.kind === 'cloudly-legacy-deployment-settlement-production-receipt'
|
|
2482
|
-
&& artifacts.scratchReceipt
|
|
2483
|
-
&& digestCloudlyLegacyDeploymentSettlementScratchReceipt(receipt.scratchReceipt)
|
|
2484
|
-
!== digestCloudlyLegacyDeploymentSettlementScratchReceipt(artifacts.scratchReceipt)) {
|
|
2485
|
-
fail('CROSS_FIELD_MISMATCH', 'resolutionBundle.originalReceipt.scratchReceipt');
|
|
2486
|
-
}
|
|
2487
|
-
}
|
|
2488
|
-
return bundle;
|
|
2489
|
-
};
|
|
2490
|
-
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementResolutionForAuthorities = async (attestationArg, sourceMetadataArg, executionMetadataArg, authenticatedPlanArg, requestBundleArg, scratchReceiptArg, productionAuthorizationArg, verifierArg) => {
|
|
2491
|
-
const attestation = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedResolutionStructure(attestationArg);
|
|
2492
|
-
const executionMetadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(executionMetadataArg);
|
|
2493
|
-
assertAuthorityReferenceMatchesMetadata(attestation.authority, executionMetadata, 'authenticatedResolution.authority');
|
|
2494
|
-
await requireConsumerVerifiedHmac(attestation.authority, cloudlyLegacyDeploymentSettlementDomains.resolutionHmac, encodeCloudlyLegacyDeploymentSettlementResolutionHmacInput(withoutArtifactMac(attestation)), attestation.mac, verifierArg, 'authenticatedResolution.mac');
|
|
2495
|
-
const payload = await normalizeCloudlyLegacyDeploymentSettlementResolutionBundleForAuthorities(attestation.payload, sourceMetadataArg, executionMetadata, authenticatedPlanArg, requestBundleArg, scratchReceiptArg, productionAuthorizationArg, verifierArg);
|
|
2496
|
-
if (canonicalize(attestation.payload, 'authenticatedResolution.payload')
|
|
2497
|
-
!== canonicalize(payload, 'authenticatedResolution.verifiedPayload')) {
|
|
2498
|
-
fail('CROSS_FIELD_MISMATCH', 'authenticatedResolution.payload');
|
|
2499
|
-
}
|
|
2500
|
-
return attestation;
|
|
2501
|
-
};
|
|
2502
|
-
const normalizeSettlementExecutionBundleCommon = (valueArg, pathArg, purposeArg) => {
|
|
2503
|
-
const value = readRecord(valueArg, pathArg);
|
|
2504
|
-
const hasReceipt = Object.hasOwn(value, 'receipt');
|
|
2505
|
-
assertExactKeys(value, [
|
|
2506
|
-
'schemaVersion',
|
|
2507
|
-
'kind',
|
|
2508
|
-
'purpose',
|
|
2509
|
-
'executionAttempt',
|
|
2510
|
-
'authenticatedResult',
|
|
2511
|
-
...(hasReceipt ? ['receipt'] : []),
|
|
2512
|
-
], pathArg);
|
|
2513
|
-
if (value.kind !== 'cloudly-legacy-deployment-settlement-execution-bundle'
|
|
2514
|
-
|| value.purpose !== purposeArg) {
|
|
2515
|
-
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
2516
|
-
}
|
|
2517
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, `${pathArg}.executionAttempt`);
|
|
2518
|
-
const authenticatedResult = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure(value.authenticatedResult);
|
|
2519
|
-
if (executionAttempt.purpose !== purposeArg
|
|
2520
|
-
|| canonicalize(authenticatedResult.authority, `${pathArg}.result.authority`)
|
|
2521
|
-
!== canonicalize(executionAttempt.executionAuthority, `${pathArg}.attempt.authority`)
|
|
2522
|
-
|| (authenticatedResult.payload.status === 'completed') !== hasReceipt) {
|
|
2523
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.authenticatedResult`);
|
|
2524
|
-
}
|
|
2525
|
-
return { value, executionAttempt, authenticatedResult, hasReceipt };
|
|
2526
|
-
};
|
|
2527
|
-
/** Structural only; this function does not authenticate result or receipt MACs. */
|
|
2528
|
-
export const normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundle = (valueArg) => {
|
|
2529
|
-
const normalized = normalizeSettlementExecutionBundleCommon(valueArg, 'scratchExecutionBundle', 'scratch-rehearsal');
|
|
2530
|
-
if (normalized.value.schemaVersion !== 1) {
|
|
2531
|
-
fail('INVALID_VALUE', 'scratchExecutionBundle.schemaVersion');
|
|
2532
|
-
}
|
|
2533
|
-
const receipt = normalized.hasReceipt
|
|
2534
|
-
? normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(normalized.value.receipt)
|
|
2535
|
-
: undefined;
|
|
2536
|
-
if (receipt
|
|
2537
|
-
&& (canonicalize(receipt.authority, 'scratchExecutionBundle.receipt.authority')
|
|
2538
|
-
!== canonicalize(normalized.executionAttempt.executionAuthority, 'scratchExecutionBundle.attempt.authority')
|
|
2539
|
-
|| normalized.authenticatedResult.payload.status !== 'completed'
|
|
2540
|
-
|| normalized.authenticatedResult.payload.requestSha256 !== receipt.requestSha256
|
|
2541
|
-
|| (normalized.authenticatedResult.payload.disposition !== receipt.disposition
|
|
2542
|
-
&& !(receipt.disposition === 'applied'
|
|
2543
|
-
&& normalized.authenticatedResult.payload.disposition === 'exact-replay')))) {
|
|
2544
|
-
fail('CROSS_FIELD_MISMATCH', 'scratchExecutionBundle.receipt');
|
|
2545
|
-
}
|
|
2546
|
-
const executionAttempt = normalized.executionAttempt;
|
|
2547
|
-
const result = receipt
|
|
2548
|
-
? {
|
|
2549
|
-
schemaVersion: 1,
|
|
2550
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-bundle',
|
|
2551
|
-
purpose: 'scratch-rehearsal',
|
|
2552
|
-
executionAttempt,
|
|
2553
|
-
authenticatedResult: normalized.authenticatedResult,
|
|
2554
|
-
receipt,
|
|
2555
|
-
}
|
|
2556
|
-
: {
|
|
2557
|
-
schemaVersion: 1,
|
|
2558
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-bundle',
|
|
2559
|
-
purpose: 'scratch-rehearsal',
|
|
2560
|
-
executionAttempt,
|
|
2561
|
-
authenticatedResult: normalized.authenticatedResult,
|
|
2562
|
-
};
|
|
2563
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 2, 'scratchExecutionBundle');
|
|
2564
|
-
};
|
|
2565
|
-
/** Structural only; this function does not authenticate result or receipt MACs. */
|
|
2566
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2 = (valueArg) => {
|
|
2567
|
-
const normalized = normalizeSettlementExecutionBundleCommon(valueArg, 'productionExecutionBundleV2', 'production');
|
|
2568
|
-
if (normalized.value.schemaVersion !== 2) {
|
|
2569
|
-
fail('INVALID_VALUE', 'productionExecutionBundleV2.schemaVersion');
|
|
2570
|
-
}
|
|
2571
|
-
const receipt = normalized.hasReceipt
|
|
2572
|
-
? normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2(normalized.value.receipt)
|
|
2573
|
-
: undefined;
|
|
2574
|
-
if (receipt
|
|
2575
|
-
&& (canonicalize(receipt.executionAttempt, 'productionExecutionBundleV2.receipt.attempt')
|
|
2576
|
-
!== canonicalize(normalized.executionAttempt, 'productionExecutionBundleV2.executionAttempt')
|
|
2577
|
-
|| normalized.authenticatedResult.payload.status !== 'completed'
|
|
2578
|
-
|| normalized.authenticatedResult.payload.requestSha256 !== receipt.requestSha256
|
|
2579
|
-
|| (normalized.authenticatedResult.payload.disposition !== receipt.disposition
|
|
2580
|
-
&& !(receipt.disposition === 'applied'
|
|
2581
|
-
&& normalized.authenticatedResult.payload.disposition === 'exact-replay')))) {
|
|
2582
|
-
fail('CROSS_FIELD_MISMATCH', 'productionExecutionBundleV2.receipt');
|
|
2583
|
-
}
|
|
2584
|
-
const executionAttempt = normalized.executionAttempt;
|
|
2585
|
-
const result = receipt
|
|
2586
|
-
? {
|
|
2587
|
-
schemaVersion: 2,
|
|
2588
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-bundle',
|
|
2589
|
-
purpose: 'production',
|
|
2590
|
-
executionAttempt,
|
|
2591
|
-
authenticatedResult: normalized.authenticatedResult,
|
|
2592
|
-
receipt,
|
|
2593
|
-
}
|
|
2594
|
-
: {
|
|
2595
|
-
schemaVersion: 2,
|
|
2596
|
-
kind: 'cloudly-legacy-deployment-settlement-execution-bundle',
|
|
2597
|
-
purpose: 'production',
|
|
2598
|
-
executionAttempt,
|
|
2599
|
-
authenticatedResult: normalized.authenticatedResult,
|
|
2600
|
-
};
|
|
2601
|
-
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes * 4, 'productionExecutionBundleV2');
|
|
2602
|
-
};
|
|
2603
|
-
export const encodeCloudlyLegacyDeploymentSettlementScratchExecutionBundle = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundle(valueArg), 'scratchExecutionBundle');
|
|
2604
|
-
export const encodeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2 = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2(valueArg), 'productionExecutionBundleV2');
|
|
2605
|
-
export const normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundleForAuthority = async (bundleArg, sourceMetadataArg, authenticatedPlanArg, requestBundleArg, verifierArg) => {
|
|
2606
|
-
const bundle = normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundle(bundleArg);
|
|
2607
|
-
const artifacts = await normalizeExecutionAttemptProofArtifacts({
|
|
2608
|
-
executionAttempt: bundle.executionAttempt,
|
|
2609
|
-
sourceMetadata: sourceMetadataArg,
|
|
2610
|
-
executionMetadata: sourceMetadataArg,
|
|
2611
|
-
authenticatedPlan: authenticatedPlanArg,
|
|
2612
|
-
requestBundle: requestBundleArg,
|
|
2613
|
-
scratchReceipt: null,
|
|
2614
|
-
productionAuthorization: null,
|
|
2615
|
-
requireProductionAuthorization: false,
|
|
2616
|
-
verifier: verifierArg,
|
|
2617
|
-
});
|
|
2618
|
-
await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResultForAuthority(bundle.authenticatedResult, artifacts.sourceMetadata, artifacts.requestBundle.authenticatedRequest, verifierArg);
|
|
2619
|
-
if (bundle.receipt) {
|
|
2620
|
-
await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(bundle.receipt, artifacts.sourceMetadata, artifacts.requestBundle.authenticatedRequest, verifierArg);
|
|
2621
|
-
}
|
|
2622
|
-
return bundle;
|
|
2623
|
-
};
|
|
2624
|
-
export const normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2ForAuthorities = async (bundleArg, productionAuthorizationArg, productionMetadataArg, sourceMetadataArg, authenticatedPlanArg, requestBundleArg, scratchReceiptArg, verifierArg) => {
|
|
2625
|
-
const bundle = normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2(bundleArg);
|
|
2626
|
-
const artifacts = await normalizeExecutionAttemptProofArtifacts({
|
|
2627
|
-
executionAttempt: bundle.executionAttempt,
|
|
2628
|
-
sourceMetadata: sourceMetadataArg,
|
|
2629
|
-
executionMetadata: productionMetadataArg,
|
|
2630
|
-
authenticatedPlan: authenticatedPlanArg,
|
|
2631
|
-
requestBundle: requestBundleArg,
|
|
2632
|
-
scratchReceipt: scratchReceiptArg,
|
|
2633
|
-
productionAuthorization: productionAuthorizationArg,
|
|
2634
|
-
requireProductionAuthorization: true,
|
|
2635
|
-
verifier: verifierArg,
|
|
2636
|
-
});
|
|
2637
|
-
const productionAuthorization = artifacts.productionAuthorization
|
|
2638
|
-
?? fail('CROSS_FIELD_MISMATCH', 'productionExecutionBundleV2.executionAuthority');
|
|
2639
|
-
if (!artifacts.splitProductionAuthority) {
|
|
2640
|
-
fail('CROSS_FIELD_MISMATCH', 'productionExecutionBundleV2.executionAuthority');
|
|
2641
|
-
}
|
|
2642
|
-
await normalizeAuthenticatedApplyResultForExecutionAuthority(bundle.authenticatedResult, artifacts.executionMetadata, artifacts.requestBundle.authenticatedRequest, productionAuthorization, verifierArg);
|
|
2643
|
-
if (bundle.receipt) {
|
|
2644
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionReceiptV2ForAuthorities(bundle.receipt, artifacts.executionMetadata, artifacts.sourceMetadata, artifacts.authenticatedPlan, artifacts.requestBundle, verifierArg);
|
|
2645
|
-
if (canonicalize(bundle.receipt.productionAuthorization, 'productionExecutionBundleV2.receipt.productionAuthorization') !== canonicalize(artifacts.productionAuthorization, 'productionExecutionBundleV2.productionAuthorization')) {
|
|
2646
|
-
fail('CROSS_FIELD_MISMATCH', 'productionExecutionBundleV2.productionAuthorization');
|
|
2647
|
-
}
|
|
2648
|
-
}
|
|
2649
|
-
return bundle;
|
|
2650
|
-
};
|
|
2651
|
-
export const cloudlyLegacyDeploymentSettlementStdioLimits = Object.freeze({
|
|
2652
|
-
maximumMongoDescriptorBytes: 16 * 1024,
|
|
2653
|
-
maximumPrivateArtifactAggregateBytes: 4 * 1024 * 1024,
|
|
2654
|
-
maximumRequestFrameBytes: 5 * 1024 * 1024,
|
|
2655
|
-
maximumResponseFrameBytes: 4 * 1024 * 1024,
|
|
2656
|
-
});
|
|
2657
|
-
export const cloudlyLegacyDeploymentSettlementStdioCommands = Object.freeze([
|
|
2658
|
-
'settlement-plan',
|
|
2659
|
-
'settlement-request',
|
|
2660
|
-
'settlement-scratch-check',
|
|
2661
|
-
'settlement-scratch-apply',
|
|
2662
|
-
'settlement-scratch-resolve',
|
|
2663
|
-
'settlement-production-authorize',
|
|
2664
|
-
'settlement-production-check',
|
|
2665
|
-
'settlement-production-apply',
|
|
2666
|
-
'settlement-production-resolve',
|
|
2667
|
-
]);
|
|
2668
|
-
export const cloudlyLegacyDeploymentSettlementStdioErrorMetadata = Object.freeze({
|
|
2669
|
-
INVALID_FRAME: Object.freeze({ retryable: false }),
|
|
2670
|
-
INVALID_REQUEST: Object.freeze({ retryable: false }),
|
|
2671
|
-
AUTHORITY_INVALID: Object.freeze({ retryable: false }),
|
|
2672
|
-
AUTHORITY_EXPIRED: Object.freeze({ retryable: true }),
|
|
2673
|
-
REQUEST_MISMATCH: Object.freeze({ retryable: false }),
|
|
2674
|
-
PLAN_MISMATCH: Object.freeze({ retryable: false }),
|
|
2675
|
-
SOURCE_STATE_MISMATCH: Object.freeze({ retryable: false }),
|
|
2676
|
-
FINAL_STATE_MISMATCH: Object.freeze({ retryable: true }),
|
|
2677
|
-
TRANSACTIONS_UNSUPPORTED: Object.freeze({ retryable: false }),
|
|
2678
|
-
OPERATION_DRIFT: Object.freeze({ retryable: false }),
|
|
2679
|
-
CLAIM_DRIFT: Object.freeze({ retryable: false }),
|
|
2680
|
-
CLASSIFICATION_MISMATCH: Object.freeze({ retryable: false }),
|
|
2681
|
-
ATTEMPT_CONFLICT: Object.freeze({ retryable: false }),
|
|
2682
|
-
ATTEMPT_NOT_FOUND: Object.freeze({ retryable: false }),
|
|
2683
|
-
INTERNAL_ERROR: Object.freeze({ retryable: true }),
|
|
2684
|
-
});
|
|
2685
|
-
const stdioRequestKeys = ['schemaVersion', 'kind', 'requestId', 'command', 'payload'];
|
|
2686
|
-
const stdioResponseSuccessKeys = [
|
|
2687
|
-
'schemaVersion',
|
|
2688
|
-
'kind',
|
|
2689
|
-
'requestId',
|
|
2690
|
-
'command',
|
|
2691
|
-
'ok',
|
|
2692
|
-
'payload',
|
|
2693
|
-
];
|
|
2694
|
-
const stdioResponseErrorKeys = [
|
|
2695
|
-
'schemaVersion',
|
|
2696
|
-
'kind',
|
|
2697
|
-
'requestId',
|
|
2698
|
-
'command',
|
|
2699
|
-
'ok',
|
|
2700
|
-
'error',
|
|
2701
|
-
];
|
|
2702
|
-
const normalizeSettlementMongoDescriptor = (valueArg, pathArg) => {
|
|
2703
|
-
const value = readRecord(valueArg, pathArg);
|
|
2704
|
-
assertExactKeys(value, ['mongoDbUrl', 'mongoDbName', 'mongoDbUser', 'mongoDbPass'], pathArg);
|
|
2705
|
-
for (const key of ['mongoDbUrl', 'mongoDbName', 'mongoDbUser', 'mongoDbPass']) {
|
|
2706
|
-
if (typeof value[key] !== 'string'
|
|
2707
|
-
|| value[key].length === 0
|
|
2708
|
-
|| Buffer.byteLength(value[key], 'utf8')
|
|
2709
|
-
> cloudlyLegacyDeploymentSettlementStdioLimits.maximumMongoDescriptorBytes
|
|
2710
|
-
|| /[\u0000-\u0020\u007f]/u.test(value[key])) {
|
|
2711
|
-
fail('INVALID_VALUE', `${pathArg}.${key}`);
|
|
2712
|
-
}
|
|
2713
|
-
}
|
|
2714
|
-
const descriptor = value;
|
|
2715
|
-
let url;
|
|
2716
|
-
let mongoDbName;
|
|
2717
|
-
let mongoDbUser;
|
|
2718
|
-
let mongoDbPass;
|
|
2719
|
-
try {
|
|
2720
|
-
url = new URL(descriptor.mongoDbUrl);
|
|
2721
|
-
mongoDbName = decodeURIComponent(url.pathname.slice(1));
|
|
2722
|
-
mongoDbUser = decodeURIComponent(url.username);
|
|
2723
|
-
mongoDbPass = decodeURIComponent(url.password);
|
|
2724
|
-
}
|
|
2725
|
-
catch {
|
|
2726
|
-
return fail('INVALID_VALUE', `${pathArg}.mongoDbUrl`);
|
|
2727
|
-
}
|
|
2728
|
-
const queryKeys = [...new Set(url.searchParams.keys())].sort();
|
|
2729
|
-
if (url.protocol !== 'mongodb:'
|
|
2730
|
-
|| !url.hostname
|
|
2731
|
-
|| !url.port
|
|
2732
|
-
|| url.hash !== ''
|
|
2733
|
-
|| mongoDbName !== descriptor.mongoDbName
|
|
2734
|
-
|| mongoDbUser !== descriptor.mongoDbUser
|
|
2735
|
-
|| mongoDbPass !== descriptor.mongoDbPass
|
|
2736
|
-
|| JSON.stringify(queryKeys) !== JSON.stringify(['authSource', 'directConnection'])
|
|
2737
|
-
|| url.searchParams.getAll('authSource').length !== 1
|
|
2738
|
-
|| url.searchParams.get('authSource') !== descriptor.mongoDbName
|
|
2739
|
-
|| url.searchParams.getAll('directConnection').length !== 1
|
|
2740
|
-
|| url.searchParams.get('directConnection') !== 'true') {
|
|
2741
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
2742
|
-
}
|
|
2743
|
-
const output = {
|
|
2744
|
-
mongoDbUrl: descriptor.mongoDbUrl,
|
|
2745
|
-
mongoDbName: descriptor.mongoDbName,
|
|
2746
|
-
mongoDbUser: descriptor.mongoDbUser,
|
|
2747
|
-
mongoDbPass: descriptor.mongoDbPass,
|
|
2748
|
-
};
|
|
2749
|
-
if (Buffer.byteLength(canonicalize(output, pathArg), 'utf8')
|
|
2750
|
-
> cloudlyLegacyDeploymentSettlementStdioLimits.maximumMongoDescriptorBytes) {
|
|
2751
|
-
fail('LIMIT_EXCEEDED', pathArg);
|
|
2752
|
-
}
|
|
2753
|
-
return output;
|
|
2754
|
-
};
|
|
2755
|
-
export const normalizeCloudlyLegacyDeploymentSettlementMongoDescriptor = (valueArg) => finalize(normalizeSettlementMongoDescriptor(valueArg, 'mongoDescriptor'), cloudlyLegacyDeploymentSettlementStdioLimits.maximumMongoDescriptorBytes, 'mongoDescriptor');
|
|
2756
|
-
const assertStdioArtifactAggregate = (valueArg, pathArg) => {
|
|
2757
|
-
if (Buffer.byteLength(canonicalize(valueArg, pathArg), 'utf8')
|
|
2758
|
-
> cloudlyLegacyDeploymentSettlementStdioLimits.maximumPrivateArtifactAggregateBytes) {
|
|
2759
|
-
fail('LIMIT_EXCEEDED', pathArg);
|
|
2760
|
-
}
|
|
2761
|
-
};
|
|
2762
|
-
const assertDistinctStdioHandoffKeyMaterial = (sourceHandoffArg, executionHandoffArg, pathArg) => {
|
|
2763
|
-
const sourceKey = Buffer.from(sourceHandoffArg.hmacKeyPlaintext.value, 'base64url');
|
|
2764
|
-
const executionKey = Buffer.from(executionHandoffArg.hmacKeyPlaintext.value, 'base64url');
|
|
2765
|
-
let equal = false;
|
|
2766
|
-
try {
|
|
2767
|
-
equal = plugins.crypto.timingSafeEqual(sourceKey, executionKey);
|
|
2768
|
-
}
|
|
2769
|
-
finally {
|
|
2770
|
-
sourceKey.fill(0);
|
|
2771
|
-
executionKey.fill(0);
|
|
2772
|
-
}
|
|
2773
|
-
if (equal) {
|
|
2774
|
-
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
2775
|
-
}
|
|
2776
|
-
};
|
|
2777
|
-
const assertExecutionAttemptMatchesStdioArtifacts = (argsArg) => {
|
|
2778
|
-
const sourceReference = argsArg.sourceHandoff.authorityReference;
|
|
2779
|
-
const executionReference = argsArg.executionHandoff.authorityReference;
|
|
2780
|
-
const sourceMetadata = normalizeFencedSourceAuthorityMetadata(argsArg.sourceHandoff.authorityMetadata, `${argsArg.path}.sourceAuthorityMetadata`);
|
|
2781
|
-
if (argsArg.purpose === 'production') {
|
|
2782
|
-
assertDistinctStdioHandoffKeyMaterial(argsArg.sourceHandoff, argsArg.executionHandoff, `${argsArg.path}.authorityKeySeparation`);
|
|
2783
|
-
normalizeProductionAuthorityMetadataPair(argsArg.executionHandoff.authorityMetadata, sourceMetadata);
|
|
2784
|
-
}
|
|
2785
|
-
else {
|
|
2786
|
-
normalizeFencedSourceAuthorityMetadata(argsArg.executionHandoff.authorityMetadata, `${argsArg.path}.executionAuthorityMetadata`);
|
|
2787
|
-
}
|
|
2788
|
-
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(argsArg.authenticatedPlan.payload, sourceMetadata);
|
|
2789
|
-
normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(argsArg.requestBundle.authenticatedRequest.payload, sourceMetadata);
|
|
2790
|
-
if (argsArg.scratchReceipt) {
|
|
2791
|
-
normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(argsArg.scratchReceipt, argsArg.requestBundle.authenticatedRequest);
|
|
2792
|
-
}
|
|
2793
|
-
if (canonicalize(argsArg.authenticatedPlan.authority, `${argsArg.path}.plan.authority`)
|
|
2794
|
-
!== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2795
|
-
|| canonicalize(argsArg.requestBundle.authenticatedRequest.authority, `${argsArg.path}.request.authority`) !== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2796
|
-
|| canonicalize(argsArg.requestBundle.authenticatedRehearsalBinding.authority, `${argsArg.path}.binding.authority`) !== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2797
|
-
|| canonicalize(argsArg.authenticatedPlan.payload, `${argsArg.path}.plan.payload`)
|
|
2798
|
-
!== canonicalize(argsArg.requestBundle.authenticatedRequest.payload.plan, `${argsArg.path}.request.plan`)
|
|
2799
|
-
|| argsArg.authenticatedPlan.payloadSha256
|
|
2800
|
-
!== argsArg.requestBundle.authenticatedRequest.payload.planSha256
|
|
2801
|
-
|| (argsArg.scratchReceipt !== undefined
|
|
2802
|
-
&& (canonicalize(argsArg.scratchReceipt.authority, `${argsArg.path}.scratch.authority`)
|
|
2803
|
-
!== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2804
|
-
|| argsArg.scratchReceipt.requestSha256
|
|
2805
|
-
!== argsArg.requestBundle.authenticatedRequest.payloadSha256))) {
|
|
2806
|
-
fail('CROSS_FIELD_MISMATCH', `${argsArg.path}.sourceArtifacts`);
|
|
2807
|
-
}
|
|
2808
|
-
const scratchReceiptSha256 = argsArg.scratchReceipt
|
|
2809
|
-
? digestCloudlyLegacyDeploymentSettlementScratchReceipt(argsArg.scratchReceipt)
|
|
2810
|
-
: null;
|
|
2811
|
-
if (argsArg.attempt.purpose !== argsArg.purpose
|
|
2812
|
-
|| argsArg.attempt.operationId !== argsArg.executionHandoff.authorityMetadata.operationId
|
|
2813
|
-
|| argsArg.attempt.settlementId !== argsArg.executionHandoff.authorityMetadata.settlementId
|
|
2814
|
-
|| canonicalize(argsArg.attempt.sourceAuthority, `${argsArg.path}.attempt.sourceAuthority`)
|
|
2815
|
-
!== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2816
|
-
|| canonicalize(argsArg.attempt.executionAuthority, `${argsArg.path}.attempt.executionAuthority`)
|
|
2817
|
-
!== canonicalize(executionReference, `${argsArg.path}.executionAuthority`)
|
|
2818
|
-
|| argsArg.attempt.authenticatedPlanSha256
|
|
2819
|
-
!== digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan(argsArg.authenticatedPlan)
|
|
2820
|
-
|| argsArg.attempt.requestBundleSha256
|
|
2821
|
-
!== digestCloudlyLegacyDeploymentSettlementRequestBundle(argsArg.requestBundle)
|
|
2822
|
-
|| argsArg.attempt.scratchReceiptSha256 !== scratchReceiptSha256) {
|
|
2823
|
-
fail('CROSS_FIELD_MISMATCH', `${argsArg.path}.executionAttempt`);
|
|
2824
|
-
}
|
|
2825
|
-
if (argsArg.purpose === 'production') {
|
|
2826
|
-
const productionMetadata = argsArg.executionHandoff.authorityMetadata;
|
|
2827
|
-
if (!productionMetadata.sourceAuthority
|
|
2828
|
-
|| canonicalize(productionMetadata.sourceAuthority, `${argsArg.path}.metadata.sourceAuthority`)
|
|
2829
|
-
!== canonicalize(sourceReference, `${argsArg.path}.sourceAuthority`)
|
|
2830
|
-
|| productionMetadata.sourceAuthenticatedPlanSha256
|
|
2831
|
-
!== argsArg.attempt.authenticatedPlanSha256
|
|
2832
|
-
|| productionMetadata.sourceRequestBundleSha256 !== argsArg.attempt.requestBundleSha256
|
|
2833
|
-
|| productionMetadata.scratchReceiptSha256 !== scratchReceiptSha256) {
|
|
2834
|
-
fail('CROSS_FIELD_MISMATCH', `${argsArg.path}.productionAuthorityHandoff`);
|
|
2835
|
-
}
|
|
2836
|
-
}
|
|
2837
|
-
};
|
|
2838
|
-
const normalizeScratchStdioPayload = (valueArg, pathArg, resolveArg) => {
|
|
2839
|
-
const value = readRecord(valueArg, pathArg);
|
|
2840
|
-
assertExactKeys(value, [
|
|
2841
|
-
'mongoDescriptor',
|
|
2842
|
-
'authorityHandoff',
|
|
2843
|
-
'authenticatedPlan',
|
|
2844
|
-
'requestBundle',
|
|
2845
|
-
'executionAttempt',
|
|
2846
|
-
...(resolveArg ? ['observedAt'] : []),
|
|
2847
|
-
], pathArg);
|
|
2848
|
-
const authorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(value.authorityHandoff);
|
|
2849
|
-
const authenticatedPlan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(value.authenticatedPlan);
|
|
2850
|
-
const requestBundle = normalizeCloudlyLegacyDeploymentSettlementRequestBundle(value.requestBundle);
|
|
2851
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, `${pathArg}.executionAttempt`);
|
|
2852
|
-
assertExecutionAttemptMatchesStdioArtifacts({
|
|
2853
|
-
attempt: executionAttempt,
|
|
2854
|
-
purpose: 'scratch-rehearsal',
|
|
2855
|
-
sourceHandoff: authorityHandoff,
|
|
2856
|
-
executionHandoff: authorityHandoff,
|
|
2857
|
-
authenticatedPlan,
|
|
2858
|
-
requestBundle,
|
|
2859
|
-
path: pathArg,
|
|
2860
|
-
});
|
|
2861
|
-
const output = {
|
|
2862
|
-
mongoDescriptor: normalizeSettlementMongoDescriptor(value.mongoDescriptor, `${pathArg}.mongoDescriptor`),
|
|
2863
|
-
authorityHandoff,
|
|
2864
|
-
authenticatedPlan,
|
|
2865
|
-
requestBundle,
|
|
2866
|
-
executionAttempt: executionAttempt,
|
|
2867
|
-
...(resolveArg
|
|
2868
|
-
? { observedAt: readInteger(value.observedAt, `${pathArg}.observedAt`, 1) }
|
|
2869
|
-
: {}),
|
|
2870
|
-
};
|
|
2871
|
-
assertStdioArtifactAggregate(output, pathArg);
|
|
2872
|
-
return output;
|
|
2873
|
-
};
|
|
2874
|
-
const normalizeProductionStdioPayload = (valueArg, pathArg, resolveArg) => {
|
|
2875
|
-
const value = readRecord(valueArg, pathArg);
|
|
2876
|
-
assertExactKeys(value, [
|
|
2877
|
-
'mongoDescriptor',
|
|
2878
|
-
'sourceAuthorityHandoff',
|
|
2879
|
-
'productionAuthorityHandoff',
|
|
2880
|
-
'authenticatedPlan',
|
|
2881
|
-
'requestBundle',
|
|
2882
|
-
'scratchReceipt',
|
|
2883
|
-
'productionAuthorization',
|
|
2884
|
-
'executionAttempt',
|
|
2885
|
-
...(resolveArg ? ['observedAt'] : []),
|
|
2886
|
-
], pathArg);
|
|
2887
|
-
const sourceAuthorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(value.sourceAuthorityHandoff);
|
|
2888
|
-
const productionAuthorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(value.productionAuthorityHandoff);
|
|
2889
|
-
const authenticatedPlan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(value.authenticatedPlan);
|
|
2890
|
-
const requestBundle = normalizeCloudlyLegacyDeploymentSettlementRequestBundle(value.requestBundle);
|
|
2891
|
-
const scratchReceipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(value.scratchReceipt);
|
|
2892
|
-
const productionAuthorization = normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(value.productionAuthorization);
|
|
2893
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(value.executionAttempt, `${pathArg}.executionAttempt`);
|
|
2894
|
-
assertExecutionAttemptMatchesStdioArtifacts({
|
|
2895
|
-
attempt: executionAttempt,
|
|
2896
|
-
purpose: 'production',
|
|
2897
|
-
sourceHandoff: sourceAuthorityHandoff,
|
|
2898
|
-
executionHandoff: productionAuthorityHandoff,
|
|
2899
|
-
authenticatedPlan,
|
|
2900
|
-
requestBundle,
|
|
2901
|
-
scratchReceipt,
|
|
2902
|
-
path: pathArg,
|
|
2903
|
-
});
|
|
2904
|
-
if (canonicalize(productionAuthorization.executionAttempt, `${pathArg}.authorization.attempt`)
|
|
2905
|
-
!== canonicalize(executionAttempt, `${pathArg}.executionAttempt`)) {
|
|
2906
|
-
fail('CROSS_FIELD_MISMATCH', `${pathArg}.productionAuthorization`);
|
|
2907
|
-
}
|
|
2908
|
-
const metadata = normalizeProductionAuthorityMetadataPair(productionAuthorityHandoff.authorityMetadata, sourceAuthorityHandoff.authorityMetadata);
|
|
2909
|
-
assertProductionAuthorizationArtifacts(productionAuthorization, metadata.productionMetadata, metadata.sourceMetadata, authenticatedPlan, requestBundle, scratchReceipt);
|
|
2910
|
-
const output = {
|
|
2911
|
-
mongoDescriptor: normalizeSettlementMongoDescriptor(value.mongoDescriptor, `${pathArg}.mongoDescriptor`),
|
|
2912
|
-
sourceAuthorityHandoff,
|
|
2913
|
-
productionAuthorityHandoff,
|
|
2914
|
-
authenticatedPlan,
|
|
2915
|
-
requestBundle,
|
|
2916
|
-
scratchReceipt,
|
|
2917
|
-
productionAuthorization,
|
|
2918
|
-
executionAttempt: executionAttempt,
|
|
2919
|
-
...(resolveArg
|
|
2920
|
-
? { observedAt: readInteger(value.observedAt, `${pathArg}.observedAt`, 1) }
|
|
2921
|
-
: {}),
|
|
2922
|
-
};
|
|
2923
|
-
assertStdioArtifactAggregate(output, pathArg);
|
|
2924
|
-
return output;
|
|
2925
|
-
};
|
|
2926
|
-
/** Structural only; use the authority-aware variant before trusting artifacts. */
|
|
2927
|
-
export const normalizeCloudlyLegacyDeploymentSettlementStdioRequest = (valueArg) => {
|
|
2928
|
-
const value = readRecord(valueArg, 'stdioRequest');
|
|
2929
|
-
assertExactKeys(value, stdioRequestKeys, 'stdioRequest');
|
|
2930
|
-
assertStdioArtifactAggregate(value.payload, 'stdioRequest.payload');
|
|
2931
|
-
if (value.schemaVersion !== 1
|
|
2932
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-stdio-request') {
|
|
2933
|
-
fail('INVALID_VALUE', 'stdioRequest.kind');
|
|
2934
|
-
}
|
|
2935
|
-
const requestId = readIdentifier(value.requestId, 'stdioRequest.requestId');
|
|
2936
|
-
const command = readLiteral(value.command, cloudlyLegacyDeploymentSettlementStdioCommands, 'stdioRequest.command');
|
|
2937
|
-
const payloadPath = 'stdioRequest.payload';
|
|
2938
|
-
let payload;
|
|
2939
|
-
if (command === 'settlement-plan') {
|
|
2940
|
-
const input = readRecord(value.payload, payloadPath);
|
|
2941
|
-
assertExactKeys(input, ['mongoDescriptor', 'authorityHandoff', 'effectiveAt'], payloadPath);
|
|
2942
|
-
const authorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(input.authorityHandoff);
|
|
2943
|
-
const sourceMetadata = normalizeFencedSourceAuthorityMetadata(authorityHandoff.authorityMetadata, `${payloadPath}.authorityHandoff.authorityMetadata`);
|
|
2944
|
-
const effectiveAt = readInteger(input.effectiveAt, `${payloadPath}.effectiveAt`, 1);
|
|
2945
|
-
assertAuthorityTimestamp(effectiveAt, sourceMetadata, `${payloadPath}.effectiveAt`);
|
|
2946
|
-
payload = {
|
|
2947
|
-
mongoDescriptor: normalizeSettlementMongoDescriptor(input.mongoDescriptor, `${payloadPath}.mongoDescriptor`),
|
|
2948
|
-
authorityHandoff,
|
|
2949
|
-
effectiveAt,
|
|
2950
|
-
};
|
|
2951
|
-
}
|
|
2952
|
-
else if (command === 'settlement-request') {
|
|
2953
|
-
const input = readRecord(value.payload, payloadPath);
|
|
2954
|
-
assertExactKeys(input, ['authorityHandoff', 'authenticatedPlan', 'requestedAt'], payloadPath);
|
|
2955
|
-
const authorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(input.authorityHandoff);
|
|
2956
|
-
const sourceMetadata = normalizeFencedSourceAuthorityMetadata(authorityHandoff.authorityMetadata, `${payloadPath}.authorityHandoff.authorityMetadata`);
|
|
2957
|
-
const authenticatedPlan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(input.authenticatedPlan);
|
|
2958
|
-
assertAuthorityReferenceMatchesMetadata(authenticatedPlan.authority, sourceMetadata, `${payloadPath}.authenticatedPlan.authority`);
|
|
2959
|
-
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(authenticatedPlan.payload, sourceMetadata);
|
|
2960
|
-
const requestedAt = readInteger(input.requestedAt, `${payloadPath}.requestedAt`, 1);
|
|
2961
|
-
assertAuthorityTimestamp(requestedAt, sourceMetadata, `${payloadPath}.requestedAt`);
|
|
2962
|
-
if (requestedAt < authenticatedPlan.payload.effectiveAt) {
|
|
2963
|
-
fail('CROSS_FIELD_MISMATCH', `${payloadPath}.requestedAt`);
|
|
2964
|
-
}
|
|
2965
|
-
payload = {
|
|
2966
|
-
authorityHandoff,
|
|
2967
|
-
authenticatedPlan,
|
|
2968
|
-
requestedAt,
|
|
2969
|
-
};
|
|
2970
|
-
}
|
|
2971
|
-
else if (command === 'settlement-scratch-check'
|
|
2972
|
-
|| command === 'settlement-scratch-apply') {
|
|
2973
|
-
payload = normalizeScratchStdioPayload(value.payload, payloadPath, false);
|
|
2974
|
-
}
|
|
2975
|
-
else if (command === 'settlement-scratch-resolve') {
|
|
2976
|
-
payload = normalizeScratchStdioPayload(value.payload, payloadPath, true);
|
|
2977
|
-
}
|
|
2978
|
-
else if (command === 'settlement-production-authorize') {
|
|
2979
|
-
const input = readRecord(value.payload, payloadPath);
|
|
2980
|
-
assertExactKeys(input, [
|
|
2981
|
-
'sourceAuthorityHandoff',
|
|
2982
|
-
'productionAuthorityHandoff',
|
|
2983
|
-
'authenticatedPlan',
|
|
2984
|
-
'requestBundle',
|
|
2985
|
-
'scratchReceipt',
|
|
2986
|
-
'executionAttempt',
|
|
2987
|
-
'requestedAt',
|
|
2988
|
-
'approvedAt',
|
|
2989
|
-
], payloadPath);
|
|
2990
|
-
const sourceAuthorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(input.sourceAuthorityHandoff);
|
|
2991
|
-
const productionAuthorityHandoff = normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(input.productionAuthorityHandoff);
|
|
2992
|
-
const authenticatedPlan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(input.authenticatedPlan);
|
|
2993
|
-
const requestBundle = normalizeCloudlyLegacyDeploymentSettlementRequestBundle(input.requestBundle);
|
|
2994
|
-
const scratchReceipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(input.scratchReceipt);
|
|
2995
|
-
const executionAttempt = normalizeExecutionAttemptIdentityInternal(input.executionAttempt, `${payloadPath}.executionAttempt`);
|
|
2996
|
-
assertExecutionAttemptMatchesStdioArtifacts({
|
|
2997
|
-
attempt: executionAttempt,
|
|
2998
|
-
purpose: 'production',
|
|
2999
|
-
sourceHandoff: sourceAuthorityHandoff,
|
|
3000
|
-
executionHandoff: productionAuthorityHandoff,
|
|
3001
|
-
authenticatedPlan,
|
|
3002
|
-
requestBundle,
|
|
3003
|
-
scratchReceipt,
|
|
3004
|
-
path: payloadPath,
|
|
3005
|
-
});
|
|
3006
|
-
const requestedAt = readInteger(input.requestedAt, `${payloadPath}.requestedAt`, 1);
|
|
3007
|
-
const metadata = normalizeProductionAuthorityMetadataPair(productionAuthorityHandoff.authorityMetadata, sourceAuthorityHandoff.authorityMetadata);
|
|
3008
|
-
const approvedAt = readInteger(input.approvedAt, `${payloadPath}.approvedAt`, requestedAt);
|
|
3009
|
-
assertAuthorityTimestamp(requestedAt, metadata.productionMetadata, `${payloadPath}.requestedAt`);
|
|
3010
|
-
assertAuthorityTimestamp(approvedAt, metadata.productionMetadata, `${payloadPath}.approvedAt`);
|
|
3011
|
-
if (metadata.productionMetadata.issuedAt <= scratchReceipt.completedAt
|
|
3012
|
-
|| requestedAt <= scratchReceipt.completedAt) {
|
|
3013
|
-
fail('CROSS_FIELD_MISMATCH', `${payloadPath}.requestedAt`);
|
|
3014
|
-
}
|
|
3015
|
-
payload = {
|
|
3016
|
-
sourceAuthorityHandoff,
|
|
3017
|
-
productionAuthorityHandoff,
|
|
3018
|
-
authenticatedPlan,
|
|
3019
|
-
requestBundle,
|
|
3020
|
-
scratchReceipt,
|
|
3021
|
-
executionAttempt: executionAttempt,
|
|
3022
|
-
requestedAt,
|
|
3023
|
-
approvedAt,
|
|
3024
|
-
};
|
|
3025
|
-
}
|
|
3026
|
-
else if (command === 'settlement-production-resolve') {
|
|
3027
|
-
payload = normalizeProductionStdioPayload(value.payload, payloadPath, true);
|
|
3028
|
-
}
|
|
3029
|
-
else {
|
|
3030
|
-
payload = normalizeProductionStdioPayload(value.payload, payloadPath, false);
|
|
3031
|
-
}
|
|
3032
|
-
assertStdioArtifactAggregate(payload, payloadPath);
|
|
3033
|
-
return finalize({
|
|
3034
|
-
schemaVersion: 1,
|
|
3035
|
-
kind: 'cloudly-legacy-deployment-settlement-stdio-request',
|
|
3036
|
-
requestId,
|
|
3037
|
-
command,
|
|
3038
|
-
payload,
|
|
3039
|
-
}, cloudlyLegacyDeploymentSettlementStdioLimits.maximumRequestFrameBytes - 1, 'stdioRequest');
|
|
3040
|
-
};
|
|
3041
|
-
const createCloudlyLegacyDeploymentSettlementStdioRequestHmacVerifier = (requestArg) => {
|
|
3042
|
-
if (requestArg.command === 'settlement-plan'
|
|
3043
|
-
|| requestArg.command === 'settlement-request'
|
|
3044
|
-
|| requestArg.command === 'settlement-scratch-check'
|
|
3045
|
-
|| requestArg.command === 'settlement-scratch-apply'
|
|
3046
|
-
|| requestArg.command === 'settlement-scratch-resolve') {
|
|
3047
|
-
return createCloudlyLegacyDeploymentSettlementStdioHandoffHmacVerifier(requestArg.payload.authorityHandoff);
|
|
3048
|
-
}
|
|
3049
|
-
const sourceVerifier = createCloudlyLegacyDeploymentSettlementStdioHandoffHmacVerifier(requestArg.payload.sourceAuthorityHandoff);
|
|
3050
|
-
const executionVerifier = createCloudlyLegacyDeploymentSettlementStdioHandoffHmacVerifier(requestArg.payload.productionAuthorityHandoff);
|
|
3051
|
-
return async (inputArg) => (await sourceVerifier(inputArg) || await executionVerifier(inputArg));
|
|
3052
|
-
};
|
|
3053
|
-
export const normalizeCloudlyLegacyDeploymentSettlementStdioRequestForAuthorities = async (valueArg) => {
|
|
3054
|
-
const request = normalizeCloudlyLegacyDeploymentSettlementStdioRequest(valueArg);
|
|
3055
|
-
const verifier = createCloudlyLegacyDeploymentSettlementStdioRequestHmacVerifier(request);
|
|
3056
|
-
if (request.command === 'settlement-plan') {
|
|
3057
|
-
return request;
|
|
3058
|
-
}
|
|
3059
|
-
if (request.command === 'settlement-request') {
|
|
3060
|
-
await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority(request.payload.authenticatedPlan, request.payload.authorityHandoff.authorityMetadata, verifier);
|
|
3061
|
-
return request;
|
|
3062
|
-
}
|
|
3063
|
-
if (request.command === 'settlement-scratch-check'
|
|
3064
|
-
|| request.command === 'settlement-scratch-apply'
|
|
3065
|
-
|| request.command === 'settlement-scratch-resolve') {
|
|
3066
|
-
await normalizeExecutionAttemptProofArtifacts({
|
|
3067
|
-
executionAttempt: request.payload.executionAttempt,
|
|
3068
|
-
sourceMetadata: request.payload.authorityHandoff.authorityMetadata,
|
|
3069
|
-
executionMetadata: request.payload.authorityHandoff.authorityMetadata,
|
|
3070
|
-
authenticatedPlan: request.payload.authenticatedPlan,
|
|
3071
|
-
requestBundle: request.payload.requestBundle,
|
|
3072
|
-
scratchReceipt: null,
|
|
3073
|
-
productionAuthorization: null,
|
|
3074
|
-
requireProductionAuthorization: false,
|
|
3075
|
-
verifier,
|
|
3076
|
-
});
|
|
3077
|
-
return request;
|
|
3078
|
-
}
|
|
3079
|
-
await normalizeExecutionAttemptProofArtifacts({
|
|
3080
|
-
executionAttempt: request.payload.executionAttempt,
|
|
3081
|
-
sourceMetadata: request.payload.sourceAuthorityHandoff.authorityMetadata,
|
|
3082
|
-
executionMetadata: request.payload.productionAuthorityHandoff.authorityMetadata,
|
|
3083
|
-
authenticatedPlan: request.payload.authenticatedPlan,
|
|
3084
|
-
requestBundle: request.payload.requestBundle,
|
|
3085
|
-
scratchReceipt: request.payload.scratchReceipt,
|
|
3086
|
-
productionAuthorization: request.command === 'settlement-production-authorize'
|
|
3087
|
-
? null
|
|
3088
|
-
: request.payload.productionAuthorization,
|
|
3089
|
-
requireProductionAuthorization: request.command !== 'settlement-production-authorize',
|
|
3090
|
-
verifier,
|
|
3091
|
-
});
|
|
3092
|
-
return request;
|
|
3093
|
-
};
|
|
3094
|
-
const normalizeStdioSuccessPayload = (commandArg, valueArg) => {
|
|
3095
|
-
const path = 'stdioResponse.payload';
|
|
3096
|
-
const value = readRecord(valueArg, path);
|
|
3097
|
-
if (commandArg === 'settlement-plan') {
|
|
3098
|
-
assertExactKeys(value, ['authenticatedPlan'], path);
|
|
3099
|
-
return {
|
|
3100
|
-
authenticatedPlan: normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(value.authenticatedPlan),
|
|
3101
|
-
};
|
|
3102
|
-
}
|
|
3103
|
-
if (commandArg === 'settlement-request') {
|
|
3104
|
-
assertExactKeys(value, ['requestBundle'], path);
|
|
3105
|
-
return { requestBundle: normalizeCloudlyLegacyDeploymentSettlementRequestBundle(value.requestBundle) };
|
|
3106
|
-
}
|
|
3107
|
-
if (commandArg === 'settlement-scratch-check'
|
|
3108
|
-
|| commandArg === 'settlement-production-check') {
|
|
3109
|
-
assertExactKeys(value, ['authenticatedResult'], path);
|
|
3110
|
-
return {
|
|
3111
|
-
authenticatedResult: normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure(value.authenticatedResult),
|
|
3112
|
-
};
|
|
3113
|
-
}
|
|
3114
|
-
if (commandArg === 'settlement-scratch-apply') {
|
|
3115
|
-
assertExactKeys(value, ['executionBundle'], path);
|
|
3116
|
-
return {
|
|
3117
|
-
executionBundle: normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundle(value.executionBundle),
|
|
3118
|
-
};
|
|
3119
|
-
}
|
|
3120
|
-
if (commandArg === 'settlement-production-apply') {
|
|
3121
|
-
assertExactKeys(value, ['executionBundle'], path);
|
|
3122
|
-
return {
|
|
3123
|
-
executionBundle: normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2(value.executionBundle),
|
|
3124
|
-
};
|
|
3125
|
-
}
|
|
3126
|
-
if (commandArg === 'settlement-production-authorize') {
|
|
3127
|
-
assertExactKeys(value, ['productionAuthorization'], path);
|
|
3128
|
-
return {
|
|
3129
|
-
productionAuthorization: normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorization(value.productionAuthorization),
|
|
3130
|
-
};
|
|
3131
|
-
}
|
|
3132
|
-
assertExactKeys(value, ['authenticatedResolution'], path);
|
|
3133
|
-
return {
|
|
3134
|
-
authenticatedResolution: normalizeCloudlyLegacyDeploymentSettlementAuthenticatedResolutionStructure(value.authenticatedResolution),
|
|
3135
|
-
};
|
|
3136
|
-
};
|
|
3137
|
-
const createCloudlyLegacyDeploymentSettlementStdioSafeError = (codeArg) => ({
|
|
3138
|
-
code: codeArg,
|
|
3139
|
-
retryable: cloudlyLegacyDeploymentSettlementStdioErrorMetadata[codeArg].retryable,
|
|
3140
|
-
});
|
|
3141
|
-
/** Structural only; use the request-authority-aware variant before trusting artifacts. */
|
|
3142
|
-
export const normalizeCloudlyLegacyDeploymentSettlementStdioResponse = (valueArg) => {
|
|
3143
|
-
const value = readRecord(valueArg, 'stdioResponse');
|
|
3144
|
-
if (typeof value.ok !== 'boolean')
|
|
3145
|
-
fail('INVALID_VALUE', 'stdioResponse.ok');
|
|
3146
|
-
assertExactKeys(value, value.ok ? stdioResponseSuccessKeys : stdioResponseErrorKeys, 'stdioResponse');
|
|
3147
|
-
if (value.schemaVersion !== 1
|
|
3148
|
-
|| value.kind !== 'cloudly-legacy-deployment-settlement-stdio-response') {
|
|
3149
|
-
fail('INVALID_VALUE', 'stdioResponse.kind');
|
|
3150
|
-
}
|
|
3151
|
-
if (value.ok) {
|
|
3152
|
-
assertStdioArtifactAggregate(value.payload, 'stdioResponse.payload');
|
|
3153
|
-
}
|
|
3154
|
-
const requestId = readIdentifier(value.requestId, 'stdioResponse.requestId');
|
|
3155
|
-
const command = readLiteral(value.command, cloudlyLegacyDeploymentSettlementStdioCommands, 'stdioResponse.command');
|
|
3156
|
-
if (value.ok) {
|
|
3157
|
-
const payload = normalizeStdioSuccessPayload(command, value.payload);
|
|
3158
|
-
assertStdioArtifactAggregate(payload, 'stdioResponse.payload');
|
|
3159
|
-
return finalize({
|
|
3160
|
-
schemaVersion: 1,
|
|
3161
|
-
kind: 'cloudly-legacy-deployment-settlement-stdio-response',
|
|
3162
|
-
requestId,
|
|
3163
|
-
command,
|
|
3164
|
-
ok: true,
|
|
3165
|
-
payload,
|
|
3166
|
-
}, cloudlyLegacyDeploymentSettlementStdioLimits.maximumResponseFrameBytes - 1, 'stdioResponse');
|
|
3167
|
-
}
|
|
3168
|
-
const error = readRecord(value.error, 'stdioResponse.error');
|
|
3169
|
-
assertExactKeys(error, ['code', 'retryable'], 'stdioResponse.error');
|
|
3170
|
-
if (typeof error.code !== 'string'
|
|
3171
|
-
|| !Object.hasOwn(cloudlyLegacyDeploymentSettlementStdioErrorMetadata, error.code)) {
|
|
3172
|
-
fail('INVALID_VALUE', 'stdioResponse.error.code');
|
|
3173
|
-
}
|
|
3174
|
-
const code = error.code;
|
|
3175
|
-
if (error.retryable !== cloudlyLegacyDeploymentSettlementStdioErrorMetadata[code].retryable) {
|
|
3176
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.error.retryable');
|
|
3177
|
-
}
|
|
3178
|
-
return finalize({
|
|
3179
|
-
schemaVersion: 1,
|
|
3180
|
-
kind: 'cloudly-legacy-deployment-settlement-stdio-response',
|
|
3181
|
-
requestId,
|
|
3182
|
-
command,
|
|
3183
|
-
ok: false,
|
|
3184
|
-
error: createCloudlyLegacyDeploymentSettlementStdioSafeError(code),
|
|
3185
|
-
}, cloudlyLegacyDeploymentSettlementStdioLimits.maximumResponseFrameBytes - 1, 'stdioResponse');
|
|
3186
|
-
};
|
|
3187
|
-
export const normalizeCloudlyLegacyDeploymentSettlementStdioResponseForRequestAuthorities = async (responseArg, requestArg) => {
|
|
3188
|
-
const request = await normalizeCloudlyLegacyDeploymentSettlementStdioRequestForAuthorities(requestArg);
|
|
3189
|
-
const verifier = createCloudlyLegacyDeploymentSettlementStdioRequestHmacVerifier(request);
|
|
3190
|
-
const response = normalizeCloudlyLegacyDeploymentSettlementStdioResponse(responseArg);
|
|
3191
|
-
if (response.requestId !== request.requestId || response.command !== request.command) {
|
|
3192
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.request');
|
|
3193
|
-
}
|
|
3194
|
-
if (!response.ok) {
|
|
3195
|
-
return response;
|
|
3196
|
-
}
|
|
3197
|
-
if (request.command === 'settlement-plan') {
|
|
3198
|
-
const success = response;
|
|
3199
|
-
const plan = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority(success.payload.authenticatedPlan, request.payload.authorityHandoff.authorityMetadata, verifier);
|
|
3200
|
-
if (plan.payload.effectiveAt !== request.payload.effectiveAt) {
|
|
3201
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.payload.authenticatedPlan.effectiveAt');
|
|
3202
|
-
}
|
|
3203
|
-
return response;
|
|
3204
|
-
}
|
|
3205
|
-
if (request.command === 'settlement-request') {
|
|
3206
|
-
const success = response;
|
|
3207
|
-
const requestBundle = await normalizeCloudlyLegacyDeploymentSettlementRequestBundleForAuthority(success.payload.requestBundle, request.payload.authenticatedPlan, request.payload.authorityHandoff.authorityMetadata, verifier);
|
|
3208
|
-
if (requestBundle.authenticatedRequest.payload.requestedAt
|
|
3209
|
-
!== request.payload.requestedAt) {
|
|
3210
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.payload.requestBundle.requestedAt');
|
|
3211
|
-
}
|
|
3212
|
-
return response;
|
|
3213
|
-
}
|
|
3214
|
-
if (request.command === 'settlement-scratch-check') {
|
|
3215
|
-
const success = response;
|
|
3216
|
-
await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResultForAuthority(success.payload.authenticatedResult, request.payload.authorityHandoff.authorityMetadata, request.payload.requestBundle.authenticatedRequest, verifier);
|
|
3217
|
-
return response;
|
|
3218
|
-
}
|
|
3219
|
-
if (request.command === 'settlement-scratch-apply') {
|
|
3220
|
-
const success = response;
|
|
3221
|
-
await normalizeCloudlyLegacyDeploymentSettlementScratchExecutionBundleForAuthority(success.payload.executionBundle, request.payload.authorityHandoff.authorityMetadata, request.payload.authenticatedPlan, request.payload.requestBundle, verifier);
|
|
3222
|
-
return response;
|
|
3223
|
-
}
|
|
3224
|
-
if (request.command === 'settlement-scratch-resolve') {
|
|
3225
|
-
const success = response;
|
|
3226
|
-
const resolution = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementResolutionForAuthorities(success.payload.authenticatedResolution, request.payload.authorityHandoff.authorityMetadata, request.payload.authorityHandoff.authorityMetadata, request.payload.authenticatedPlan, request.payload.requestBundle, null, null, verifier);
|
|
3227
|
-
if (resolution.payload.observedAt !== request.payload.observedAt) {
|
|
3228
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.payload.authenticatedResolution.observedAt');
|
|
3229
|
-
}
|
|
3230
|
-
return response;
|
|
3231
|
-
}
|
|
3232
|
-
if (request.command === 'settlement-production-authorize') {
|
|
3233
|
-
const success = response;
|
|
3234
|
-
const authorization = await normalizeCloudlyLegacyDeploymentSettlementProductionExecutionAuthorizationForAuthorities(success.payload.productionAuthorization, request.payload.productionAuthorityHandoff.authorityMetadata, request.payload.sourceAuthorityHandoff.authorityMetadata, request.payload.authenticatedPlan, request.payload.requestBundle, request.payload.scratchReceipt, verifier);
|
|
3235
|
-
if (authorization.requestedAt !== request.payload.requestedAt
|
|
3236
|
-
|| authorization.approvedAt !== request.payload.approvedAt) {
|
|
3237
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.payload.productionAuthorization.timestamp');
|
|
3238
|
-
}
|
|
3239
|
-
return response;
|
|
3240
|
-
}
|
|
3241
|
-
if (request.command === 'settlement-production-check') {
|
|
3242
|
-
const success = response;
|
|
3243
|
-
await normalizeAuthenticatedCheckResultForExecutionAuthority(success.payload.authenticatedResult, request.payload.productionAuthorityHandoff.authorityMetadata, request.payload.requestBundle.authenticatedRequest, request.payload.productionAuthorization, verifier);
|
|
3244
|
-
return response;
|
|
3245
|
-
}
|
|
3246
|
-
if (request.command === 'settlement-production-apply') {
|
|
3247
|
-
const success = response;
|
|
3248
|
-
await normalizeCloudlyLegacyDeploymentSettlementProductionExecutionBundleV2ForAuthorities(success.payload.executionBundle, request.payload.productionAuthorization, request.payload.productionAuthorityHandoff.authorityMetadata, request.payload.sourceAuthorityHandoff.authorityMetadata, request.payload.authenticatedPlan, request.payload.requestBundle, request.payload.scratchReceipt, verifier);
|
|
3249
|
-
return response;
|
|
3250
|
-
}
|
|
3251
|
-
const success = response;
|
|
3252
|
-
const resolution = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementResolutionForAuthorities(success.payload.authenticatedResolution, request.payload.sourceAuthorityHandoff.authorityMetadata, request.payload.productionAuthorityHandoff.authorityMetadata, request.payload.authenticatedPlan, request.payload.requestBundle, request.payload.scratchReceipt, request.payload.productionAuthorization, verifier);
|
|
3253
|
-
if (resolution.payload.observedAt !== request.payload.observedAt) {
|
|
3254
|
-
fail('CROSS_FIELD_MISMATCH', 'stdioResponse.payload.authenticatedResolution.observedAt');
|
|
3255
|
-
}
|
|
3256
|
-
return response;
|
|
3257
|
-
};
|
|
3258
|
-
const encodeStdioFrame = (valueArg, maximumBytesArg, pathArg) => {
|
|
3259
|
-
const payload = encodeNormalized(valueArg, pathArg);
|
|
3260
|
-
try {
|
|
3261
|
-
if (payload.byteLength + 1 > maximumBytesArg)
|
|
3262
|
-
fail('LIMIT_EXCEEDED', pathArg);
|
|
3263
|
-
const output = new Uint8Array(payload.byteLength + 1);
|
|
3264
|
-
output.set(payload);
|
|
3265
|
-
output[payload.byteLength] = 0x0a;
|
|
3266
|
-
return output;
|
|
3267
|
-
}
|
|
3268
|
-
finally {
|
|
3269
|
-
payload.fill(0);
|
|
3270
|
-
}
|
|
3271
|
-
};
|
|
3272
|
-
export const encodeCloudlyLegacyDeploymentSettlementStdioRequestFrame = (valueArg) => encodeStdioFrame(normalizeCloudlyLegacyDeploymentSettlementStdioRequest(valueArg), cloudlyLegacyDeploymentSettlementStdioLimits.maximumRequestFrameBytes, 'stdioRequest');
|
|
3273
|
-
export const encodeCloudlyLegacyDeploymentSettlementStdioResponseFrame = (valueArg) => encodeStdioFrame(normalizeCloudlyLegacyDeploymentSettlementStdioResponse(valueArg), cloudlyLegacyDeploymentSettlementStdioLimits.maximumResponseFrameBytes, 'stdioResponse');
|
|
3274
|
-
const decodeStdioFrame = (frameArg, maximumBytesArg, pathArg, normalizeArg, encodeArg) => {
|
|
3275
|
-
if (!(frameArg instanceof Uint8Array)
|
|
3276
|
-
|| frameArg.byteLength < 3
|
|
3277
|
-
|| frameArg.byteLength > maximumBytesArg
|
|
3278
|
-
|| frameArg.at(-1) !== 0x0a
|
|
3279
|
-
|| frameArg.subarray(0, -1).some((byteArg) => byteArg === 0x0a || byteArg === 0x0d)) {
|
|
3280
|
-
fail('INVALID_DATA', pathArg);
|
|
3281
|
-
}
|
|
3282
|
-
const payloadBytes = new Uint8Array(frameArg.subarray(0, -1));
|
|
3283
|
-
let canonicalFrame;
|
|
3284
|
-
try {
|
|
3285
|
-
let text;
|
|
3286
|
-
try {
|
|
3287
|
-
text = new TextDecoder('utf-8', { fatal: true }).decode(payloadBytes);
|
|
3288
|
-
}
|
|
3289
|
-
catch {
|
|
3290
|
-
return fail('INVALID_DATA', pathArg);
|
|
3291
|
-
}
|
|
3292
|
-
let value;
|
|
3293
|
-
try {
|
|
3294
|
-
value = JSON.parse(text);
|
|
3295
|
-
}
|
|
3296
|
-
catch {
|
|
3297
|
-
return fail('INVALID_DATA', pathArg);
|
|
3298
|
-
}
|
|
3299
|
-
const normalized = normalizeArg(value);
|
|
3300
|
-
canonicalFrame = encodeArg(normalized);
|
|
3301
|
-
if (canonicalFrame.byteLength !== frameArg.byteLength
|
|
3302
|
-
|| canonicalFrame.some((byteArg, indexArg) => byteArg !== frameArg[indexArg])) {
|
|
3303
|
-
fail('INVALID_DATA', pathArg);
|
|
3304
|
-
}
|
|
3305
|
-
return normalized;
|
|
3306
|
-
}
|
|
3307
|
-
finally {
|
|
3308
|
-
payloadBytes.fill(0);
|
|
3309
|
-
canonicalFrame?.fill(0);
|
|
3310
|
-
}
|
|
3311
|
-
};
|
|
3312
|
-
export const decodeCloudlyLegacyDeploymentSettlementStdioRequestFrame = (frameArg) => decodeStdioFrame(frameArg, cloudlyLegacyDeploymentSettlementStdioLimits.maximumRequestFrameBytes, 'stdioRequestFrame', normalizeCloudlyLegacyDeploymentSettlementStdioRequest, encodeCloudlyLegacyDeploymentSettlementStdioRequestFrame);
|
|
3313
|
-
export const decodeCloudlyLegacyDeploymentSettlementStdioResponseFrame = (frameArg) => decodeStdioFrame(frameArg, cloudlyLegacyDeploymentSettlementStdioLimits.maximumResponseFrameBytes, 'stdioResponseFrame', normalizeCloudlyLegacyDeploymentSettlementStdioResponse, encodeCloudlyLegacyDeploymentSettlementStdioResponseFrame);
|
|
3314
|
-
export { cloudlyLegacyDeploymentSettlementGoldenVectors } from './runtime.cloudlylegacydeploymentsettlement.golden.js';
|
|
3315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5jbG91ZGx5bGVnYWN5ZGVwbG95bWVudHNldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ydW50aW1lLmNsb3VkbHlsZWdhY3lkZXBsb3ltZW50c2V0dGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxHQUNoQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkUsdUJBQXVCLEVBQUUsR0FBRztJQUM1QixzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDNUIsc0JBQXNCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDakMsbUJBQW1CLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDL0IscUJBQXFCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDaEMsaUNBQWlDLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDN0MsMEJBQTBCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUMvQyxxQkFBcUIsRUFBRSxFQUFFO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEUsWUFBWSxFQUNWLG9FQUFvRTtJQUN0RSxvQkFBb0IsRUFDbEIsNkVBQTZFO0lBQy9FLFFBQVEsRUFDTixnRUFBZ0U7SUFDbEUscUJBQXFCLEVBQ25CLDhFQUE4RTtJQUNoRixlQUFlLEVBQ2Isd0VBQXdFO0lBQzFFLGVBQWUsRUFDYix3RUFBd0U7SUFDMUUsaUJBQWlCLEVBQ2YsMEVBQTBFO0lBQzVFLGtCQUFrQixFQUNoQiwyRUFBMkU7SUFDN0UscUJB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
|