@super-protocol/pki-attestation-engine 5.1.0-beta2 → 5.1.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.
@@ -1,4 +1,4 @@
1
1
  import { ChallengeType } from '@super-protocol/pki-common';
2
- export type DetectAttestationType = ChallengeType.TDX | ChallengeType.TDXGOOGLE | ChallengeType.TDXAZURE | ChallengeType.SEVSNP | ChallengeType.Untrusted;
2
+ export type DetectAttestationType = ChallengeType.TDX | ChallengeType.TDXGOOGLE | ChallengeType.TDXAZURE | ChallengeType.SEVSNP | ChallengeType.SEVSNPAZURE | ChallengeType.Untrusted;
3
3
  export declare const isGoogleCloudVm: () => Promise<boolean>;
4
4
  export declare const detectAttestationType: () => Promise<DetectAttestationType>;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.detectAttestationType = exports.isGoogleCloudVm = void 0;
4
4
  const pki_common_1 = require("@super-protocol/pki-common");
5
5
  const fs_1 = require("fs");
6
- const detectAzureTdx_1 = require("./azure/detectAzureTdx");
6
+ const azure_1 = require("./azure");
7
7
  const GCP_METADATA_URL = 'http://169.254.169.254/computeMetadata/v1/instance/id';
8
8
  const GCP_METADATA_TIMEOUT_MS = 500;
9
9
  const isGoogleCloudVm = async () => {
@@ -27,8 +27,11 @@ const isGoogleCloudVm = async () => {
27
27
  exports.isGoogleCloudVm = isGoogleCloudVm;
28
28
  const detectAttestationType = async () => {
29
29
  try {
30
- if (await (0, detectAzureTdx_1.isAzureTdxVm)()) {
31
- return pki_common_1.ChallengeType.TDXAZURE;
30
+ // Must run before the device checks: on Azure the Hyper-V
31
+ // isolation type takes precedence over /dev/sev-guest.
32
+ const azureType = (0, azure_1.detectAzureAttestationType)();
33
+ if (azureType) {
34
+ return azureType;
32
35
  }
33
36
  const tdxPath = '/dev/tdx_guest';
34
37
  const sevPath = '/dev/sev-guest';
@@ -55,4 +58,4 @@ const detectAttestationType = async () => {
55
58
  return pki_common_1.ChallengeType.Untrusted;
56
59
  };
57
60
  exports.detectAttestationType = detectAttestationType;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25UeXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F0dGVzdGF0aW9uVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBMkQ7QUFDM0QsMkJBQTBDO0FBRTFDLDJEQUFzRDtBQVN0RCxNQUFNLGdCQUFnQixHQUNsQix1REFBdUQsQ0FBQztBQUM1RCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUU3QixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDeEQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDM0MsT0FBTyxFQUFFO2dCQUNMLGlCQUFpQixFQUFFLFFBQVE7YUFDOUI7WUFDRCxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFsQlcsUUFBQSxlQUFlLG1CQWtCMUI7QUFFSyxNQUFNLHFCQUFxQixHQUM5QixLQUFLLElBQW9DLEVBQUU7SUFDdkMsSUFBSSxDQUFDO1FBQ0QsSUFBSSxNQUFNLElBQUEsNkJBQVksR0FBRSxFQUFFLENBQUM7WUFDdkIsT0FBTywwQkFBYSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7UUFFakMsSUFBSSxJQUFBLGVBQVUsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUEsYUFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLE1BQU0sSUFBQSx1QkFBZSxHQUFFLENBQUM7b0JBQzVCLENBQUMsQ0FBQywwQkFBYSxDQUFDLFNBQVM7b0JBQ3pCLENBQUMsQ0FBQywwQkFBYSxDQUFDLEdBQUcsQ0FBQztZQUM1QixDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBQSxlQUFVLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFBLGFBQVEsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxNQUFNLElBQUEsdUJBQWUsR0FBRSxDQUFDO29CQUM1QixDQUFDLENBQUMsMEJBQWEsQ0FBQyxTQUFTO29CQUN6QixDQUFDLENBQUMsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsb0RBQW9EO0lBQ3hELENBQUM7SUFFRCxPQUFPLDBCQUFhLENBQUMsU0FBUyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQWhDTyxRQUFBLHFCQUFxQix5QkFnQzVCIn0=
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25UeXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F0dGVzdGF0aW9uVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBMkQ7QUFDM0QsMkJBQTBDO0FBQzFDLG1DQUFxRDtBQVVyRCxNQUFNLGdCQUFnQixHQUNsQix1REFBdUQsQ0FBQztBQUM1RCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUU3QixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDeEQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDM0MsT0FBTyxFQUFFO2dCQUNMLGlCQUFpQixFQUFFLFFBQVE7YUFDOUI7WUFDRCxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFsQlcsUUFBQSxlQUFlLG1CQWtCMUI7QUFFSyxNQUFNLHFCQUFxQixHQUM5QixLQUFLLElBQW9DLEVBQUU7SUFDdkMsSUFBSSxDQUFDO1FBQ0QsMERBQTBEO1FBQzFELHVEQUF1RDtRQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFBLGtDQUEwQixHQUFFLENBQUM7UUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztRQUVqQyxJQUFJLElBQUEsZUFBVSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBQSxhQUFRLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsTUFBTSxJQUFBLHVCQUFlLEdBQUUsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDLDBCQUFhLENBQUMsU0FBUztvQkFDekIsQ0FBQyxDQUFDLDBCQUFhLENBQUMsR0FBRyxDQUFDO1lBQzVCLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFBLGVBQVUsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUEsYUFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLE1BQU0sSUFBQSx1QkFBZSxHQUFFLENBQUM7b0JBQzVCLENBQUMsQ0FBQywwQkFBYSxDQUFDLFNBQVM7b0JBQ3pCLENBQUMsQ0FBQywwQkFBYSxDQUFDLE1BQU0sQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCxvREFBb0Q7SUFDeEQsQ0FBQztJQUVELE9BQU8sMEJBQWEsQ0FBQyxTQUFTLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBbkNPLFFBQUEscUJBQXFCLHlCQW1DNUIifQ==
@@ -0,0 +1,40 @@
1
+ import { ChallengeType } from '@super-protocol/pki-common';
2
+ export type AzureAttestationType = ChallengeType.TDXAZURE | ChallengeType.SEVSNPAZURE;
3
+ export declare enum HvIsolationType {
4
+ None = 0,
5
+ VBS = 1,
6
+ SNP = 2,
7
+ TDX = 3
8
+ }
9
+ export type CpuidRegisters = [
10
+ eax: number,
11
+ ebx: number,
12
+ ecx: number,
13
+ edx: number
14
+ ];
15
+ /**
16
+ * Returns the Hyper-V isolation type from the interface leaf (0x40000000)
17
+ * and the isolation config leaf (0x4000000C), or undefined when this is not
18
+ * a Hyper-V guest.
19
+ */
20
+ export declare const parseHvIsolationType: (interfaceRegs: CpuidRegisters | undefined, isolationRegs: CpuidRegisters | undefined) => number | undefined;
21
+ /**
22
+ * Azure confidential VMs run behind a paravisor, so the guest is given none
23
+ * of the usual TEE interfaces: no /dev/tdx_guest, no TSM provider, no
24
+ * tdx_guest CPUID flag, no TDEL ACPI table, and CPUID leaf 0x21 reads back as
25
+ * zeroes. The instance metadata service does not name the TEE either. What
26
+ * the hypervisor does report is its isolation type, which is exactly what the
27
+ * kernel itself uses to decide it is running under TDX or SEV-SNP.
28
+ */
29
+ export declare const getHvIsolationType: () => number | undefined;
30
+ export declare const parseIsAzureChassisAssetTag: (tag: string) => boolean;
31
+ export declare const isAzureVm: () => boolean;
32
+ /**
33
+ * Azure confidential VM and the TEE backing it, detected offline: no
34
+ * network, no timeouts.
35
+ *
36
+ * NOT verified on a live SEV-SNP guest: the isolation type is read exactly
37
+ * like the TDX one, but only the TDX value has been confirmed against real
38
+ * hardware so far.
39
+ */
40
+ export declare const detectAzureAttestationType: () => AzureAttestationType | undefined;
package/dist/azure.js ADDED
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectAzureAttestationType = exports.isAzureVm = exports.parseIsAzureChassisAssetTag = exports.getHvIsolationType = exports.parseHvIsolationType = exports.HvIsolationType = void 0;
4
+ const pki_common_1 = require("@super-protocol/pki-common");
5
+ const fs_1 = require("fs");
6
+ // Azure stamps every VM with this chassis asset tag, so the platform can be
7
+ // identified offline, without the instance metadata service.
8
+ const DMI_CHASSIS_ASSET_TAG = '/sys/class/dmi/id/chassis_asset_tag';
9
+ const AZURE_CHASSIS_ASSET_TAG = '7783-7084-3265-9085-8269-3286-77';
10
+ // Hyper-V reports the TEE backing an isolated guest through its own CPUID
11
+ // leaves. This is what the kernel reads (hv_get_isolation_type()), and on
12
+ // Azure it is the only precise source: see getHvIsolationType() below.
13
+ const CPUID_DEVICE = '/dev/cpu/0/cpuid';
14
+ const HV_CPUID_INTERFACE = 0x40000000;
15
+ const HV_CPUID_ISOLATION_CONFIG = 0x4000000c;
16
+ const HV_SIGNATURE = 'Microsoft Hv';
17
+ const HV_ISOLATION_TYPE_MASK = 0xf;
18
+ var HvIsolationType;
19
+ (function (HvIsolationType) {
20
+ HvIsolationType[HvIsolationType["None"] = 0] = "None";
21
+ HvIsolationType[HvIsolationType["VBS"] = 1] = "VBS";
22
+ HvIsolationType[HvIsolationType["SNP"] = 2] = "SNP";
23
+ HvIsolationType[HvIsolationType["TDX"] = 3] = "TDX";
24
+ })(HvIsolationType || (exports.HvIsolationType = HvIsolationType = {}));
25
+ /** Read one CPUID leaf through /dev/cpu/0/cpuid (needs CONFIG_X86_CPUID). */
26
+ const readCpuid = (leaf, subleaf = 0) => {
27
+ let fd;
28
+ try {
29
+ fd = (0, fs_1.openSync)(CPUID_DEVICE, 'r');
30
+ const buffer = Buffer.alloc(16);
31
+ const position = (BigInt(subleaf) << 32n) | BigInt(leaf);
32
+ if ((0, fs_1.readSync)(fd, buffer, 0, 16, position) !== 16) {
33
+ return undefined;
34
+ }
35
+ return [
36
+ buffer.readUInt32LE(0),
37
+ buffer.readUInt32LE(4),
38
+ buffer.readUInt32LE(8),
39
+ buffer.readUInt32LE(12),
40
+ ];
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ finally {
46
+ if (fd !== undefined) {
47
+ try {
48
+ (0, fs_1.closeSync)(fd);
49
+ }
50
+ catch {
51
+ // ignore
52
+ }
53
+ }
54
+ }
55
+ };
56
+ /**
57
+ * Returns the Hyper-V isolation type from the interface leaf (0x40000000)
58
+ * and the isolation config leaf (0x4000000C), or undefined when this is not
59
+ * a Hyper-V guest.
60
+ */
61
+ const parseHvIsolationType = (interfaceRegs, isolationRegs) => {
62
+ if (!interfaceRegs) {
63
+ return undefined;
64
+ }
65
+ const [maxLeaf, ebx, ecx, edx] = interfaceRegs;
66
+ const signature = Buffer.alloc(12);
67
+ signature.writeUInt32LE(ebx, 0);
68
+ signature.writeUInt32LE(ecx, 4);
69
+ signature.writeUInt32LE(edx, 8);
70
+ if (signature.toString('latin1') !== HV_SIGNATURE) {
71
+ return undefined;
72
+ }
73
+ if (maxLeaf < HV_CPUID_ISOLATION_CONFIG || !isolationRegs) {
74
+ return undefined;
75
+ }
76
+ return isolationRegs[1] & HV_ISOLATION_TYPE_MASK;
77
+ };
78
+ exports.parseHvIsolationType = parseHvIsolationType;
79
+ /**
80
+ * Azure confidential VMs run behind a paravisor, so the guest is given none
81
+ * of the usual TEE interfaces: no /dev/tdx_guest, no TSM provider, no
82
+ * tdx_guest CPUID flag, no TDEL ACPI table, and CPUID leaf 0x21 reads back as
83
+ * zeroes. The instance metadata service does not name the TEE either. What
84
+ * the hypervisor does report is its isolation type, which is exactly what the
85
+ * kernel itself uses to decide it is running under TDX or SEV-SNP.
86
+ */
87
+ const getHvIsolationType = () => {
88
+ const interfaceRegs = readCpuid(HV_CPUID_INTERFACE);
89
+ if (!interfaceRegs) {
90
+ return undefined;
91
+ }
92
+ return (0, exports.parseHvIsolationType)(interfaceRegs, readCpuid(HV_CPUID_ISOLATION_CONFIG));
93
+ };
94
+ exports.getHvIsolationType = getHvIsolationType;
95
+ const parseIsAzureChassisAssetTag = (tag) => tag.replace(/\0/g, '').trim() === AZURE_CHASSIS_ASSET_TAG;
96
+ exports.parseIsAzureChassisAssetTag = parseIsAzureChassisAssetTag;
97
+ const isAzureVm = () => {
98
+ try {
99
+ return (0, exports.parseIsAzureChassisAssetTag)((0, fs_1.readFileSync)(DMI_CHASSIS_ASSET_TAG, 'latin1'));
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ };
105
+ exports.isAzureVm = isAzureVm;
106
+ /**
107
+ * Azure confidential VM and the TEE backing it, detected offline: no
108
+ * network, no timeouts.
109
+ *
110
+ * NOT verified on a live SEV-SNP guest: the isolation type is read exactly
111
+ * like the TDX one, but only the TDX value has been confirmed against real
112
+ * hardware so far.
113
+ */
114
+ const detectAzureAttestationType = () => {
115
+ if (!(0, exports.isAzureVm)()) {
116
+ return undefined;
117
+ }
118
+ switch ((0, exports.getHvIsolationType)()) {
119
+ case HvIsolationType.TDX:
120
+ return pki_common_1.ChallengeType.TDXAZURE;
121
+ case HvIsolationType.SNP:
122
+ return pki_common_1.ChallengeType.SEVSNPAZURE;
123
+ default:
124
+ return undefined;
125
+ }
126
+ };
127
+ exports.detectAzureAttestationType = detectAzureAttestationType;
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXp1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQTJEO0FBQzNELDJCQUFpRTtBQU1qRSw0RUFBNEU7QUFDNUUsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcscUNBQXFDLENBQUM7QUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUVuRSwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLHVFQUF1RTtBQUN2RSxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztBQUN4QyxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztBQUN0QyxNQUFNLHlCQUF5QixHQUFHLFVBQVUsQ0FBQztBQUM3QyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDcEMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFFbkMsSUFBWSxlQUtYO0FBTEQsV0FBWSxlQUFlO0lBQ3ZCLHFEQUFRLENBQUE7SUFDUixtREFBTyxDQUFBO0lBQ1AsbURBQU8sQ0FBQTtJQUNQLG1EQUFPLENBQUE7QUFDWCxDQUFDLEVBTFcsZUFBZSwrQkFBZixlQUFlLFFBSzFCO0FBU0QsNkVBQTZFO0FBQzdFLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQThCLEVBQUU7SUFDeEUsSUFBSSxFQUFzQixDQUFDO0lBQzNCLElBQUksQ0FBQztRQUNELEVBQUUsR0FBRyxJQUFBLGFBQVEsRUFBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFBLGFBQVEsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDL0MsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU87WUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztTQUMxQixDQUFDO0lBQ04sQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7WUFBUyxDQUFDO1FBQ1AsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDO2dCQUNELElBQUEsY0FBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ0wsU0FBUztZQUNiLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLENBQ2hDLGFBQXlDLEVBQ3pDLGFBQXlDLEVBQ3ZCLEVBQUU7SUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQ2hELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyx5QkFBeUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFuQlcsUUFBQSxvQkFBb0Isd0JBbUIvQjtBQUVGOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLGtCQUFrQixHQUFHLEdBQXVCLEVBQUU7SUFDdkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLElBQUEsNEJBQW9CLEVBQ3ZCLGFBQWEsRUFDYixTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FDdkMsQ0FBQztBQUNOLENBQUMsQ0FBQztBQVRXLFFBQUEsa0JBQWtCLHNCQVM3QjtBQUVLLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxHQUFXLEVBQVcsRUFBRSxDQUNoRSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQztBQURqRCxRQUFBLDJCQUEyQiwrQkFDc0I7QUFFdkQsTUFBTSxTQUFTLEdBQUcsR0FBWSxFQUFFO0lBQ25DLElBQUksQ0FBQztRQUNELE9BQU8sSUFBQSxtQ0FBMkIsRUFDOUIsSUFBQSxpQkFBWSxFQUFDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxDQUNoRCxDQUFDO0lBQ04sQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFSVyxRQUFBLFNBQVMsYUFRcEI7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSwwQkFBMEIsR0FBRyxHQUUxQixFQUFFO0lBQ2QsSUFBSSxDQUFDLElBQUEsaUJBQVMsR0FBRSxFQUFFLENBQUM7UUFDZixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsUUFBUSxJQUFBLDBCQUFrQixHQUFFLEVBQUUsQ0FBQztRQUMzQixLQUFLLGVBQWUsQ0FBQyxHQUFHO1lBQ3BCLE9BQU8sMEJBQWEsQ0FBQyxRQUFRLENBQUM7UUFDbEMsS0FBSyxlQUFlLENBQUMsR0FBRztZQUNwQixPQUFPLDBCQUFhLENBQUMsV0FBVyxDQUFDO1FBQ3JDO1lBQ0ksT0FBTyxTQUFTLENBQUM7SUFDekIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQWZXLFFBQUEsMEJBQTBCLDhCQWVyQyJ9
@@ -62,6 +62,7 @@ const getAttestationPayloadBase64FromChallenge = (challenge) => {
62
62
  case pki_common_1.ChallengeType.TDXGOOGLE:
63
63
  case pki_common_1.ChallengeType.TDXAZURE:
64
64
  case pki_common_1.ChallengeType.SEVSNP:
65
+ case pki_common_1.ChallengeType.SEVSNPAZURE:
65
66
  return challenge.evidenceBase64;
66
67
  default:
67
68
  return;
@@ -332,4 +333,4 @@ const getParamsFromCSR = async (csrPem) => {
332
333
  };
333
334
  };
334
335
  exports.getParamsFromCSR = getParamsFromCSR;
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBUWdDO0FBQ2hDLDJFQUs0QztBQUM1Qyw2QkFBMkI7QUFDM0IsMkRBb0JvQztBQUVwQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUU7SUFDakQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FB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
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBUWdDO0FBQ2hDLDJFQUs0QztBQUM1Qyw2QkFBMkI7QUFDM0IsMkRBb0JvQztBQUVwQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUU7SUFDakQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FB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
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ import { ChallengeProvider } from './challengeProvider';
3
+ import { Challenge, ChallengeType, Log } from '@super-protocol/pki-common';
4
+ export declare class ChallengeProviderAzure implements ChallengeProvider {
5
+ readonly logger: Log | undefined;
6
+ private readonly challengeType;
7
+ constructor(logger: Log | undefined, challengeType: ChallengeType.TDXAZURE | ChallengeType.SEVSNPAZURE);
8
+ generateChallenge(userData: Buffer, networkID?: string): Promise<Challenge>;
9
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ChallengeProviderAzure = void 0;
27
+ const challengeNvidiaCCHelper_1 = require("./challengeNvidiaCCHelper");
28
+ const pki_common_1 = require("@super-protocol/pki-common");
29
+ class ChallengeProviderAzure {
30
+ logger;
31
+ challengeType;
32
+ constructor(logger, challengeType) {
33
+ this.logger = logger;
34
+ this.challengeType = challengeType;
35
+ }
36
+ async generateChallenge(userData, networkID) {
37
+ // This module depends on native library that cannot be compiled for all architectures / operating systems.
38
+ // That is why we load it dynamically and use only when it's really needed.
39
+ const { TeeNative } = await Promise.resolve().then(() => __importStar(require('@super-protocol/addons-tee')));
40
+ const { challengeData, nvidiaTokens } = await challengeNvidiaCCHelper_1.ChallengeNvidiaCCHelper.getTokenAndCombinedChallengeData(userData, this.logger);
41
+ const azureCvmService = new TeeNative.AzureCvmService();
42
+ const evidence = this.challengeType === pki_common_1.ChallengeType.TDXAZURE
43
+ ? await azureCvmService.generateSerializedTDXAzureEvidence(challengeData)
44
+ : await azureCvmService.generateSerializedAmdSevSnpAzureEvidence(challengeData);
45
+ return {
46
+ type: this.challengeType,
47
+ evidenceBase64: evidence.toString('base64'),
48
+ nvidiaTokens,
49
+ networkID,
50
+ };
51
+ }
52
+ }
53
+ exports.ChallengeProviderAzure = ChallengeProviderAzure;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlUHJvdmlkZXJBenVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VQcm92aWRlci9jaGFsbGVuZ2VQcm92aWRlckF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQW9FO0FBRXBFLDJEQUEyRTtBQUUzRSxNQUFhLHNCQUFzQjtJQUVYO0lBQ0M7SUFGckIsWUFDb0IsTUFBdUIsRUFDdEIsYUFFYztRQUhmLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUVDO0lBQ2hDLENBQUM7SUFFSixLQUFLLENBQUMsaUJBQWlCLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWtCO1FBRWxCLDJHQUEyRztRQUMzRywyRUFBMkU7UUFDM0UsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLHdEQUFhLDRCQUE0QixHQUFDLENBQUM7UUFFakUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FDakMsTUFBTSxpREFBdUIsQ0FBQyxnQ0FBZ0MsQ0FDMUQsUUFBUSxFQUNSLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztRQUVOLE1BQU0sZUFBZSxHQUFHLElBQUksU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhELE1BQU0sUUFBUSxHQUNWLElBQUksQ0FBQyxhQUFhLEtBQUssMEJBQWEsQ0FBQyxRQUFRO1lBQ3pDLENBQUMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxrQ0FBa0MsQ0FDcEQsYUFBYSxDQUNoQjtZQUNILENBQUMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyx3Q0FBd0MsQ0FDMUQsYUFBYSxDQUNoQixDQUFDO1FBRVosT0FBTztZQUNILElBQUksRUFBRSxJQUFJLENBQUMsYUFBYTtZQUN4QixjQUFjLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDM0MsWUFBWTtZQUNaLFNBQVM7U0FDWixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBeENELHdEQXdDQyJ9
@@ -1,6 +1,6 @@
1
1
  export * from './challengeProvider';
2
2
  export * from './challengeProviderTdx';
3
- export * from './challengeProviderTdxAzure';
3
+ export * from './challengeProviderAzure';
4
4
  export * from './challengeProviderUntrusted';
5
5
  export * from './challengeProviderSevSnp';
6
6
  export * from './challengeNvidiaCCHelper';
@@ -16,10 +16,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./challengeProvider"), exports);
18
18
  __exportStar(require("./challengeProviderTdx"), exports);
19
- __exportStar(require("./challengeProviderTdxAzure"), exports);
19
+ __exportStar(require("./challengeProviderAzure"), exports);
20
20
  __exportStar(require("./challengeProviderUntrusted"), exports);
21
21
  __exportStar(require("./challengeProviderSevSnp"), exports);
22
22
  __exportStar(require("./challengeNvidiaCCHelper"), exports);
23
23
  __exportStar(require("./challengeProviderCertificate"), exports);
24
24
  __exportStar(require("./challengeProviderToken"), exports);
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyx5REFBdUM7QUFDdkMsOERBQTRDO0FBQzVDLCtEQUE2QztBQUM3Qyw0REFBMEM7QUFDMUMsNERBQTBDO0FBQzFDLGlFQUErQztBQUMvQywyREFBeUMifQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyx5REFBdUM7QUFDdkMsMkRBQXlDO0FBQ3pDLCtEQUE2QztBQUM3Qyw0REFBMEM7QUFDMUMsNERBQTBDO0FBQzFDLGlFQUErQztBQUMvQywyREFBeUMifQ==
@@ -0,0 +1,29 @@
1
+ import { Challenge, Log, NetworkType } from '@super-protocol/pki-common';
2
+ import { ChallengeResult, ChallengeValidator } from './challengeValidator';
3
+ import { AzureValidationConfig } from './validatorConfig';
4
+ import { AttestationWasmAzure } from './wasmVerificationPolicy';
5
+ export interface ChallengeValidatorAzureOptions {
6
+ /**
7
+ * A debug VM offers no confidentiality, so it is accepted only when the
8
+ * network is explicitly untrusted.
9
+ */
10
+ networkType?: NetworkType;
11
+ config?: AzureValidationConfig;
12
+ loadAttestationModule?: () => Promise<AttestationWasmAzure>;
13
+ }
14
+ /**
15
+ * Validates Azure confidential VM evidence (Intel TDX and AMD SEV-SNP) with
16
+ * @super-protocol/attestation-wasm: the Intel / AMD signature of the hardware
17
+ * report, the Microsoft vTPM attestation key, the TPM quote and the event log.
18
+ * Microsoft Azure Attestation is always asked whether the paravisor is a
19
+ * genuine Azure one; evidence is rejected when MAA is unreachable.
20
+ *
21
+ * NOT verified on a live SEV-SNP guest yet.
22
+ */
23
+ export declare class ChallengeValidatorAzure implements ChallengeValidator {
24
+ private readonly log;
25
+ private readonly options;
26
+ constructor(log: Log, options?: ChallengeValidatorAzureOptions);
27
+ validate(challenge: Challenge): Promise<ChallengeResult>;
28
+ private validateEvidence;
29
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChallengeValidatorAzure = void 0;
4
+ const attestation_common_1 = require("@super-protocol/attestation-common");
5
+ const pki_common_1 = require("@super-protocol/pki-common");
6
+ const wasmVerificationPolicy_1 = require("./wasmVerificationPolicy");
7
+ const preservedDynamicImport = new Function('specifier', 'return import(specifier)');
8
+ const defaultLoadAttestationModule = () => preservedDynamicImport('@super-protocol/attestation-wasm/node');
9
+ const EXPECTED_EVIDENCE_TYPE = {
10
+ [pki_common_1.ChallengeType.TDXAZURE]: attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE,
11
+ [pki_common_1.ChallengeType.SEVSNPAZURE]: attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE,
12
+ };
13
+ /**
14
+ * Validates Azure confidential VM evidence (Intel TDX and AMD SEV-SNP) with
15
+ * @super-protocol/attestation-wasm: the Intel / AMD signature of the hardware
16
+ * report, the Microsoft vTPM attestation key, the TPM quote and the event log.
17
+ * Microsoft Azure Attestation is always asked whether the paravisor is a
18
+ * genuine Azure one; evidence is rejected when MAA is unreachable.
19
+ *
20
+ * NOT verified on a live SEV-SNP guest yet.
21
+ */
22
+ class ChallengeValidatorAzure {
23
+ log;
24
+ options;
25
+ constructor(log, options = {}) {
26
+ this.log = log;
27
+ this.options = options;
28
+ }
29
+ async validate(challenge) {
30
+ switch (challenge.type) {
31
+ case pki_common_1.ChallengeType.TDXAZURE:
32
+ case pki_common_1.ChallengeType.SEVSNPAZURE:
33
+ try {
34
+ return await this.validateEvidence(challenge.type, Buffer.from(challenge.evidenceBase64, 'base64'));
35
+ }
36
+ catch (e) {
37
+ return {
38
+ success: false,
39
+ error: e.message,
40
+ };
41
+ }
42
+ }
43
+ throw new Error('Method not implemented.');
44
+ }
45
+ async validateEvidence(challengeType, evidence) {
46
+ const log = this.log.child({
47
+ validator: 'ChallengeValidatorAzure',
48
+ challengeType,
49
+ });
50
+ const attestation = await (this.options.loadAttestationModule ?? defaultLoadAttestationModule)();
51
+ const verification = await attestation.verifyTeeEvidence(evidence, (0, wasmVerificationPolicy_1.buildAzureVerifyOptions)(this.options.config));
52
+ if (verification.evidenceType !== EXPECTED_EVIDENCE_TYPE[challengeType]) {
53
+ throw new Error(`Evidence type ${verification.evidenceType} does not match challenge type ${challengeType}`);
54
+ }
55
+ const { mrEnclave, reportData } = (0, wasmVerificationPolicy_1.checkAzureVerificationResult)(verification, attestation, { networkType: this.options.networkType, log });
56
+ log.debug('Azure evidence verified', {
57
+ mrEnclaveHex: mrEnclave.toString('hex'),
58
+ });
59
+ return {
60
+ success: true,
61
+ validatedUserData: reportData,
62
+ validatedId: mrEnclave,
63
+ };
64
+ }
65
+ }
66
+ exports.ChallengeValidatorAzure = ChallengeValidatorAzure;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yQXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvckF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJFQUFxRTtBQUNyRSwyREFLb0M7QUFHcEMscUVBSWtDO0FBRWxDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxRQUFRLENBQ3ZDLFdBQVcsRUFDWCwwQkFBMEIsQ0FDVyxDQUFDO0FBRTFDLE1BQU0sNEJBQTRCLEdBQUcsR0FBa0MsRUFBRSxDQUNyRSxzQkFBc0IsQ0FDbEIsdUNBQXVDLENBQzFDLENBQUM7QUFFTixNQUFNLHNCQUFzQixHQUFHO0lBQzNCLENBQUMsMEJBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxvQ0FBZSxDQUFDLGlDQUFpQztJQUMzRSxDQUFDLDBCQUFhLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLG9DQUFlLENBQUMsbUNBQW1DO0NBQ2pELENBQUM7QUFZWDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsdUJBQXVCO0lBRVg7SUFDQTtJQUZyQixZQUNxQixHQUFRLEVBQ1IsVUFBMEMsRUFBRTtRQUQ1QyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsWUFBTyxHQUFQLE9BQU8sQ0FBcUM7SUFDOUQsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBb0I7UUFDL0IsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSywwQkFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLDBCQUFhLENBQUMsV0FBVztnQkFDMUIsSUFBSSxDQUFDO29CQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQzlCLFNBQVMsQ0FBQyxJQUFJLEVBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUNsRCxDQUFDO2dCQUNOLENBQUM7Z0JBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztvQkFDZCxPQUFPO3dCQUNILE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTztxQkFDbkIsQ0FBQztnQkFDTixDQUFDO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUMxQixhQUFpRSxFQUNqRSxRQUFnQjtRQUVoQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN2QixTQUFTLEVBQUUseUJBQXlCO1lBQ3BDLGFBQWE7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLDRCQUE0QixDQUNyRSxFQUFFLENBQUM7UUFFSixNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FDcEQsUUFBUSxFQUNSLElBQUEsZ0RBQXVCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDL0MsQ0FBQztRQUVGLElBQ0ksWUFBWSxDQUFDLFlBQVksS0FBSyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsRUFDckUsQ0FBQztZQUNDLE1BQU0sSUFBSSxLQUFLLENBQ1gsaUJBQWlCLFlBQVksQ0FBQyxZQUFZLGtDQUFrQyxhQUFhLEVBQUUsQ0FDOUYsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEscURBQTRCLEVBQzFELFlBQVksRUFDWixXQUFXLEVBQ1gsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQ2pELENBQUM7UUFDRixHQUFHLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ2pDLFlBQVksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMxQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0gsT0FBTyxFQUFFLElBQUk7WUFDYixpQkFBaUIsRUFBRSxVQUFVO1lBQzdCLFdBQVcsRUFBRSxTQUFTO1NBQ3pCLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFqRUQsMERBaUVDIn0=
@@ -1,8 +1,9 @@
1
1
  export * from './challengeValidator';
2
2
  export * from './validatorConfig';
3
+ export { ChallengeValidatorAzure, type ChallengeValidatorAzureOptions, } from './challengeValidatorAzure';
4
+ export { buildAzureVerifyOptions, checkAzureVerificationResult, checkTeeVerificationResult, isAzureEvidenceType, type AttestationWasmAzure, } from './wasmVerificationPolicy';
3
5
  export { ChallengeValidatorCertificate } from './challengeValidatorCertificate';
4
6
  export { ChallengeValidatorNvidia } from './challengeValidatorNvidia';
5
7
  export { ChallengeValidatorTdx } from './challengeValidatorTdx';
6
- export { ChallengeValidatorTdxAzure } from './challengeValidatorTdxAzure';
7
8
  export { ChallengeValidatorSevSnp } from './challengeValidatorSevSnp';
8
9
  export { ChallengeValidatorToken } from './challengeValidatorToken';
@@ -14,19 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.ChallengeValidatorToken = exports.ChallengeValidatorSevSnp = exports.ChallengeValidatorTdxAzure = exports.ChallengeValidatorTdx = exports.ChallengeValidatorNvidia = exports.ChallengeValidatorCertificate = void 0;
17
+ exports.ChallengeValidatorToken = exports.ChallengeValidatorSevSnp = exports.ChallengeValidatorTdx = exports.ChallengeValidatorNvidia = exports.ChallengeValidatorCertificate = exports.isAzureEvidenceType = exports.checkTeeVerificationResult = exports.checkAzureVerificationResult = exports.buildAzureVerifyOptions = exports.ChallengeValidatorAzure = void 0;
18
18
  __exportStar(require("./challengeValidator"), exports);
19
19
  __exportStar(require("./validatorConfig"), exports);
20
+ var challengeValidatorAzure_1 = require("./challengeValidatorAzure");
21
+ Object.defineProperty(exports, "ChallengeValidatorAzure", { enumerable: true, get: function () { return challengeValidatorAzure_1.ChallengeValidatorAzure; } });
22
+ var wasmVerificationPolicy_1 = require("./wasmVerificationPolicy");
23
+ Object.defineProperty(exports, "buildAzureVerifyOptions", { enumerable: true, get: function () { return wasmVerificationPolicy_1.buildAzureVerifyOptions; } });
24
+ Object.defineProperty(exports, "checkAzureVerificationResult", { enumerable: true, get: function () { return wasmVerificationPolicy_1.checkAzureVerificationResult; } });
25
+ Object.defineProperty(exports, "checkTeeVerificationResult", { enumerable: true, get: function () { return wasmVerificationPolicy_1.checkTeeVerificationResult; } });
26
+ Object.defineProperty(exports, "isAzureEvidenceType", { enumerable: true, get: function () { return wasmVerificationPolicy_1.isAzureEvidenceType; } });
20
27
  var challengeValidatorCertificate_1 = require("./challengeValidatorCertificate");
21
28
  Object.defineProperty(exports, "ChallengeValidatorCertificate", { enumerable: true, get: function () { return challengeValidatorCertificate_1.ChallengeValidatorCertificate; } });
22
29
  var challengeValidatorNvidia_1 = require("./challengeValidatorNvidia");
23
30
  Object.defineProperty(exports, "ChallengeValidatorNvidia", { enumerable: true, get: function () { return challengeValidatorNvidia_1.ChallengeValidatorNvidia; } });
24
31
  var challengeValidatorTdx_1 = require("./challengeValidatorTdx");
25
32
  Object.defineProperty(exports, "ChallengeValidatorTdx", { enumerable: true, get: function () { return challengeValidatorTdx_1.ChallengeValidatorTdx; } });
26
- var challengeValidatorTdxAzure_1 = require("./challengeValidatorTdxAzure");
27
- Object.defineProperty(exports, "ChallengeValidatorTdxAzure", { enumerable: true, get: function () { return challengeValidatorTdxAzure_1.ChallengeValidatorTdxAzure; } });
28
33
  var challengeValidatorSevSnp_1 = require("./challengeValidatorSevSnp");
29
34
  Object.defineProperty(exports, "ChallengeValidatorSevSnp", { enumerable: true, get: function () { return challengeValidatorSevSnp_1.ChallengeValidatorSevSnp; } });
30
35
  var challengeValidatorToken_1 = require("./challengeValidatorToken");
31
36
  Object.defineProperty(exports, "ChallengeValidatorToken", { enumerable: true, get: function () { return challengeValidatorToken_1.ChallengeValidatorToken; } });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLG9EQUFrQztBQUNsQyxpRkFBZ0Y7QUFBdkUsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLGlFQUFnRTtBQUF2RCw4SEFBQSxxQkFBcUIsT0FBQTtBQUM5QiwyRUFBMEU7QUFBakUsd0lBQUEsMEJBQTBCLE9BQUE7QUFDbkMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFFQUFvRTtBQUEzRCxrSUFBQSx1QkFBdUIsT0FBQSJ9
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLG9EQUFrQztBQUNsQyxxRUFHbUM7QUFGL0Isa0lBQUEsdUJBQXVCLE9BQUE7QUFHM0IsbUVBTWtDO0FBTDlCLGlJQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLHNJQUFBLDRCQUE0QixPQUFBO0FBQzVCLG9JQUFBLDBCQUEwQixPQUFBO0FBQzFCLDZIQUFBLG1CQUFtQixPQUFBO0FBR3ZCLGlGQUFnRjtBQUF2RSw4SUFBQSw2QkFBNkIsT0FBQTtBQUN0Qyx1RUFBc0U7QUFBN0Qsb0lBQUEsd0JBQXdCLE9BQUE7QUFDakMsaUVBQWdFO0FBQXZELDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLHVFQUFzRTtBQUE3RCxvSUFBQSx3QkFBd0IsT0FBQTtBQUNqQyxxRUFBb0U7QUFBM0Qsa0lBQUEsdUJBQXVCLE9BQUEifQ==
@@ -11,3 +11,8 @@ export interface NvtrustWrapperConfig {
11
11
  tmp?: string;
12
12
  timeout?: number;
13
13
  }
14
+ export interface AzureValidationConfig {
15
+ /** Microsoft Azure Attestation instance, https://sharedeus.eus.attest.azure.net by default. */
16
+ maaEndpoint?: string;
17
+ maaTimeoutMs?: number;
18
+ }
@@ -0,0 +1,60 @@
1
+ /// <reference types="node" />
2
+ import { TeeEvidenceType } from '@super-protocol/attestation-common';
3
+ import { Log, NetworkType } from '@super-protocol/pki-common';
4
+ import { AzureValidationConfig } from './validatorConfig';
5
+ type TcbSeverity = 'Ok' | 'Warning' | 'Critical';
6
+ export interface AttestationWasmAzure {
7
+ verifyTeeEvidence(serialized: Uint8Array, options: ReturnType<typeof buildAzureVerifyOptions>): Promise<{
8
+ evidenceType: TeeEvidenceType;
9
+ }>;
10
+ describeTdxTcbStatus(status: string): {
11
+ severity: TcbSeverity;
12
+ } | undefined;
13
+ }
14
+ type TcbDescriber = Pick<AttestationWasmAzure, 'describeTdxTcbStatus'>;
15
+ interface PolicyOptions {
16
+ /**
17
+ * A debug VM offers no confidentiality, so it is accepted only when the
18
+ * network is explicitly untrusted. Plain TDX needs no such check: its
19
+ * TDATTRIBUTES, which hold the DEBUG bit, are part of mrEnclave.
20
+ */
21
+ networkType?: NetworkType;
22
+ log?: Log;
23
+ }
24
+ export declare const isAzureEvidenceType: (evidenceType: TeeEvidenceType) => boolean;
25
+ export declare const buildAzureVerifyOptions: (config?: AzureValidationConfig) => {
26
+ tdx: {
27
+ getCollateral: boolean;
28
+ };
29
+ azure: {
30
+ maa: true;
31
+ maaEndpoint: string | undefined;
32
+ timeoutMs: number | undefined;
33
+ };
34
+ };
35
+ /**
36
+ * Applies the TEE policy to an attestation-wasm verification result: the
37
+ * hardware report integrity, an acceptable TDX TCB, an unrevoked certificate
38
+ * chain, no debug SEV-SNP VM unless the network is explicitly untrusted and,
39
+ * for Azure, a positive Microsoft Azure Attestation verdict.
40
+ *
41
+ * @throws If the result violates the policy.
42
+ */
43
+ export declare const checkTeeVerificationResult: (verification: {
44
+ evidenceType: TeeEvidenceType;
45
+ }, attestation: TcbDescriber, options: PolicyOptions) => void;
46
+ /**
47
+ * Applies the Azure CVM policy (see {@link checkTeeVerificationResult}).
48
+ * Debug is checked explicitly: the Azure mrEnclave covers the vTPM PCRs, not
49
+ * the TD attributes or the SEV-SNP policy of the paravisor. Returns the Azure
50
+ * mrEnclave and the 64-byte report data.
51
+ *
52
+ * @throws If the result violates the policy.
53
+ */
54
+ export declare const checkAzureVerificationResult: (verification: {
55
+ evidenceType: TeeEvidenceType;
56
+ }, attestation: TcbDescriber, options: PolicyOptions) => {
57
+ mrEnclave: Buffer;
58
+ reportData: Buffer;
59
+ };
60
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAzureVerificationResult = exports.checkTeeVerificationResult = exports.buildAzureVerifyOptions = exports.isAzureEvidenceType = void 0;
4
+ const attestation_common_1 = require("@super-protocol/attestation-common");
5
+ const REPORT_DATA_BYTES = 64;
6
+ const isAzureEvidenceType = (evidenceType) => evidenceType === attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE ||
7
+ evidenceType === attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE;
8
+ exports.isAzureEvidenceType = isAzureEvidenceType;
9
+ const buildAzureVerifyOptions = (config) => ({
10
+ tdx: { getCollateral: true },
11
+ azure: {
12
+ maa: true,
13
+ maaEndpoint: config?.maaEndpoint,
14
+ timeoutMs: config?.maaTimeoutMs,
15
+ },
16
+ });
17
+ exports.buildAzureVerifyOptions = buildAzureVerifyOptions;
18
+ const checkTcbStatus = (attestation, component, status, log) => {
19
+ const severity = attestation.describeTdxTcbStatus(status)?.severity;
20
+ if (severity === 'Ok') {
21
+ return;
22
+ }
23
+ if (severity === 'Warning') {
24
+ log?.warn(`${component} TCB status is not up to date: ${status}`);
25
+ return;
26
+ }
27
+ throw new Error(`${component} TCB status is not acceptable: ${status}`);
28
+ };
29
+ const checkTdxResult = (result, attestation, log) => {
30
+ if (!result.quoteIntegrity) {
31
+ throw new Error('TD quote integrity check failed');
32
+ }
33
+ if (!result.tdxTcbStatus) {
34
+ throw new Error('TD quote TCB status is missing');
35
+ }
36
+ checkTcbStatus(attestation, 'TDX', result.tdxTcbStatus, log);
37
+ if (result.qeTcbStatus) {
38
+ checkTcbStatus(attestation, 'QE', result.qeTcbStatus, log);
39
+ }
40
+ if (result.certChainRevocationStatusOk === false) {
41
+ throw new Error('TD quote certificate chain is revoked');
42
+ }
43
+ };
44
+ const checkSevSnpResult = (result) => {
45
+ if (!result.attestationReportIntegrity) {
46
+ throw new Error('SEV-SNP report integrity check failed');
47
+ }
48
+ if (result.certChainRevocationStatusOk === false) {
49
+ throw new Error('SEV-SNP certificate chain is revoked');
50
+ }
51
+ };
52
+ const checkDebug = (debug, options) => {
53
+ if (debug && options.networkType !== 'untrusted') {
54
+ throw new Error(`Debug VM is not allowed for networkType=${options.networkType ?? 'undefined'}`);
55
+ }
56
+ };
57
+ /**
58
+ * Applies the TEE policy to an attestation-wasm verification result: the
59
+ * hardware report integrity, an acceptable TDX TCB, an unrevoked certificate
60
+ * chain, no debug SEV-SNP VM unless the network is explicitly untrusted and,
61
+ * for Azure, a positive Microsoft Azure Attestation verdict.
62
+ *
63
+ * @throws If the result violates the policy.
64
+ */
65
+ const checkTeeVerificationResult = (verification, attestation, options) => {
66
+ const tee = verification;
67
+ switch (tee.evidenceType) {
68
+ case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_QEMU:
69
+ case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_GCP:
70
+ checkTdxResult(tee.result, attestation, options.log);
71
+ return;
72
+ case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_QEMU:
73
+ checkSevSnpResult(tee.result);
74
+ checkDebug(tee.result.securityFields.debugAllowed, options);
75
+ return;
76
+ case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE:
77
+ case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE:
78
+ (0, exports.checkAzureVerificationResult)(tee, attestation, options);
79
+ return;
80
+ default:
81
+ throw new Error(`Unsupported TEE evidence type ${verification.evidenceType}`);
82
+ }
83
+ };
84
+ exports.checkTeeVerificationResult = checkTeeVerificationResult;
85
+ /**
86
+ * Applies the Azure CVM policy (see {@link checkTeeVerificationResult}).
87
+ * Debug is checked explicitly: the Azure mrEnclave covers the vTPM PCRs, not
88
+ * the TD attributes or the SEV-SNP policy of the paravisor. Returns the Azure
89
+ * mrEnclave and the 64-byte report data.
90
+ *
91
+ * @throws If the result violates the policy.
92
+ */
93
+ const checkAzureVerificationResult = (verification, attestation, options) => {
94
+ const azureVerification = verification;
95
+ let debug;
96
+ if (azureVerification.evidenceType ===
97
+ attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE) {
98
+ const { result } = azureVerification;
99
+ checkTdxResult(result, attestation, options.log);
100
+ debug = result.azure.tdDebug;
101
+ }
102
+ else if (azureVerification.evidenceType ===
103
+ attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE) {
104
+ const { result } = azureVerification;
105
+ checkSevSnpResult(result);
106
+ debug = result.azure.debugAllowed || result.securityFields.debugAllowed;
107
+ }
108
+ else {
109
+ throw new Error(`Evidence type ${verification.evidenceType} is not an Azure confidential VM evidence`);
110
+ }
111
+ const { azure } = azureVerification.result;
112
+ if (!azure.maa?.azureCompliant) {
113
+ throw new Error('Microsoft Azure Attestation did not confirm a genuine Azure confidential VM');
114
+ }
115
+ checkDebug(debug, options);
116
+ const reportData = Buffer.from(azureVerification.reportData);
117
+ if (reportData.length !== REPORT_DATA_BYTES) {
118
+ throw new Error(`Unexpected report data length: ${reportData.length}`);
119
+ }
120
+ return { mrEnclave: Buffer.from(azure.mrEnclave), reportData };
121
+ };
122
+ exports.checkAzureVerificationResult = checkAzureVerificationResult;
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbVZlcmlmaWNhdGlvblBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VWYWxpZGF0b3Ivd2FzbVZlcmlmaWNhdGlvblBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFBcUU7QUFZckUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFrRXRCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxZQUE2QixFQUFXLEVBQUUsQ0FDMUUsWUFBWSxLQUFLLG9DQUFlLENBQUMsaUNBQWlDO0lBQ2xFLFlBQVksS0FBSyxvQ0FBZSxDQUFDLG1DQUFtQyxDQUFDO0FBRjVELFFBQUEsbUJBQW1CLHVCQUV5QztBQUVsRSxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RSxHQUFHLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFO0lBQzVCLEtBQUssRUFBRTtRQUNILEdBQUcsRUFBRSxJQUFhO1FBQ2xCLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVztRQUNoQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVk7S0FDbEM7Q0FDSixDQUFDLENBQUM7QUFQVSxRQUFBLHVCQUF1QiwyQkFPakM7QUFFSCxNQUFNLGNBQWMsR0FBRyxDQUNuQixXQUF5QixFQUN6QixTQUFpQixFQUNqQixNQUFjLEVBQ2QsR0FBUyxFQUNMLEVBQUU7SUFDTixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3BFLElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BCLE9BQU87SUFDWCxDQUFDO0lBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFNBQVMsa0NBQWtDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEUsT0FBTztJQUNYLENB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
package/dist/index.d.ts CHANGED
@@ -3,5 +3,5 @@ export * from './challengeProvider';
3
3
  export * from './challengeValidator';
4
4
  export * from './swarmCertValidation';
5
5
  export * from './attestationType';
6
- export * from './azure/detectAzureTdx';
7
- export * from './azure/tdxAzureEvidence';
6
+ export * from './azure';
7
+ export * from './mrEnclaveSignature';
package/dist/index.js CHANGED
@@ -19,6 +19,6 @@ __exportStar(require("./challengeProvider"), exports);
19
19
  __exportStar(require("./challengeValidator"), exports);
20
20
  __exportStar(require("./swarmCertValidation"), exports);
21
21
  __exportStar(require("./attestationType"), exports);
22
- __exportStar(require("./azure/detectAzureTdx"), exports);
23
- __exportStar(require("./azure/tdxAzureEvidence"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF1QztBQUN2QyxzREFBb0M7QUFDcEMsdURBQXFDO0FBQ3JDLHdEQUFzQztBQUN0QyxvREFBa0M7QUFDbEMseURBQXVDO0FBQ3ZDLDJEQUF5QyJ9
22
+ __exportStar(require("./azure"), exports);
23
+ __exportStar(require("./mrEnclaveSignature"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF1QztBQUN2QyxzREFBb0M7QUFDcEMsdURBQXFDO0FBQ3JDLHdEQUFzQztBQUN0QyxvREFBa0M7QUFDbEMsMENBQXdCO0FBQ3hCLHVEQUFxQyJ9
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ import { ChallengeType } from '@super-protocol/pki-common';
3
+ /**
4
+ * Verifies that the mrEnclave of a TEE challenge is signed by Super Protocol
5
+ * and present in the trusted registry.
6
+ *
7
+ * @throws If the challenge type has no registry or the signature is missing or invalid.
8
+ */
9
+ export declare const verifyChallengeMrEnclaveSignature: (mrEnclave: Buffer, challengeType: ChallengeType) => Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyChallengeMrEnclaveSignature = void 0;
4
+ const attestation_common_1 = require("@super-protocol/attestation-common");
5
+ const pki_common_1 = require("@super-protocol/pki-common");
6
+ const challengeTypeToEvidenceType = (challengeType) => {
7
+ switch (challengeType) {
8
+ case pki_common_1.ChallengeType.TDX:
9
+ return attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_QEMU;
10
+ case pki_common_1.ChallengeType.TDXGOOGLE:
11
+ return attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_GCP;
12
+ case pki_common_1.ChallengeType.TDXAZURE:
13
+ return attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE;
14
+ case pki_common_1.ChallengeType.SEVSNP:
15
+ return attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_QEMU;
16
+ case pki_common_1.ChallengeType.SEVSNPAZURE:
17
+ return attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE;
18
+ default:
19
+ throw new Error(`mrEnclave signature verification is not supported for challenge type ${challengeType}`);
20
+ }
21
+ };
22
+ /**
23
+ * Verifies that the mrEnclave of a TEE challenge is signed by Super Protocol
24
+ * and present in the trusted registry.
25
+ *
26
+ * @throws If the challenge type has no registry or the signature is missing or invalid.
27
+ */
28
+ const verifyChallengeMrEnclaveSignature = async (mrEnclave, challengeType) => {
29
+ await (0, attestation_common_1.verifyMrEnclaveSignature)(mrEnclave, challengeTypeToEvidenceType(challengeType));
30
+ };
31
+ exports.verifyChallengeMrEnclaveSignature = verifyChallengeMrEnclaveSignature;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXJFbmNsYXZlU2lnbmF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21yRW5jbGF2ZVNpZ25hdHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFHNEM7QUFDNUMsMkRBQTJEO0FBRTNELE1BQU0sMkJBQTJCLEdBQUcsQ0FDaEMsYUFBNEIsRUFDYixFQUFFO0lBQ2pCLFFBQVEsYUFBYSxFQUFFLENBQUM7UUFDcEIsS0FBSywwQkFBYSxDQUFDLEdBQUc7WUFDbEIsT0FBTyxvQ0FBZSxDQUFDLGdDQUFnQyxDQUFDO1FBQzVELEtBQUssMEJBQWEsQ0FBQyxTQUFTO1lBQ3hCLE9BQU8sb0NBQWUsQ0FBQywrQkFBK0IsQ0FBQztRQUMzRCxLQUFLLDBCQUFhLENBQUMsUUFBUTtZQUN2QixPQUFPLG9DQUFlLENBQUMsaUNBQWlDLENBQUM7UUFDN0QsS0FBSywwQkFBYSxDQUFDLE1BQU07WUFDckIsT0FBTyxvQ0FBZSxDQUFDLGtDQUFrQyxDQUFDO1FBQzlELEtBQUssMEJBQWEsQ0FBQyxXQUFXO1lBQzFCLE9BQU8sb0NBQWUsQ0FBQyxtQ0FBbUMsQ0FBQztRQUMvRDtZQUNJLE1BQU0sSUFBSSxLQUFLLENBQ1gsd0VBQXdFLGFBQWEsRUFBRSxDQUMxRixDQUFDO0lBQ1YsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxLQUFLLEVBQ2xELFNBQWlCLEVBQ2pCLGFBQTRCLEVBQ2YsRUFBRTtJQUNmLE1BQU0sSUFBQSw2Q0FBd0IsRUFDMUIsU0FBUyxFQUNULDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUM3QyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBUlcsUUFBQSxpQ0FBaUMscUNBUTVDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super-protocol/pki-attestation-engine",
3
- "version": "5.1.0-beta2",
3
+ "version": "5.1.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -20,9 +20,11 @@
20
20
  "license": "ISC",
21
21
  "dependencies": {
22
22
  "@sinclair/typebox": "0.33.22",
23
- "@super-protocol/addons-tee": "^4.1.0",
24
- "@super-protocol/pki-common": "5.1.0-beta1",
25
- "@super-protocol/sp-nvtrust-wrapper": "^2.6.0"
23
+ "@super-protocol/addons-tee": "^4.2.0",
24
+ "@super-protocol/attestation-common": "^0.3.1",
25
+ "@super-protocol/attestation-wasm": "^0.3.0",
26
+ "@super-protocol/pki-common": "^5.1.0",
27
+ "@super-protocol/sp-nvtrust-wrapper": "^2.7.0"
26
28
  },
27
29
  "peerDependencies": {
28
30
  "@super-protocol/sdk-js": "*"
@@ -1,3 +0,0 @@
1
- export declare const isTdxGuest: () => boolean;
2
- export declare const isAzureConfidentialVm: () => Promise<boolean>;
3
- export declare const isAzureTdxVm: () => Promise<boolean>;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAzureTdxVm = exports.isAzureConfidentialVm = exports.isTdxGuest = void 0;
4
- const fs_1 = require("fs");
5
- const AZURE_IMDS_COMPUTE_URL = 'http://169.254.169.254/metadata/instance/compute?api-version=2023-07-01';
6
- const IMDS_TIMEOUT_MS = 500;
7
- const SEV_DEVICE_PATH = '/dev/sev-guest';
8
- const cpuinfoFlagTokens = () => {
9
- try {
10
- const text = (0, fs_1.readFileSync)('/proc/cpuinfo', 'utf8');
11
- const tokens = new Set();
12
- for (const line of text.split('\n')) {
13
- const [key, value] = line.split(':');
14
- if (key?.trim() === 'flags' || key?.trim() === 'Features') {
15
- for (const token of (value ?? '').split(/\s+/)) {
16
- if (token) {
17
- tokens.add(token);
18
- }
19
- }
20
- }
21
- }
22
- return tokens;
23
- }
24
- catch {
25
- return new Set();
26
- }
27
- };
28
- const isTdxGuest = () => {
29
- try {
30
- if ((0, fs_1.existsSync)(SEV_DEVICE_PATH) &&
31
- (0, fs_1.statSync)(SEV_DEVICE_PATH).isCharacterDevice()) {
32
- return false;
33
- }
34
- }
35
- catch {
36
- // ignore
37
- }
38
- if (cpuinfoFlagTokens().has('tdx_guest')) {
39
- return true;
40
- }
41
- if ((0, fs_1.existsSync)('/sys/module/tdx_guest')) {
42
- return true;
43
- }
44
- try {
45
- return (0, fs_1.readFileSync)('/proc/cpuinfo', 'utf8').includes('Intel TDX');
46
- }
47
- catch {
48
- return false;
49
- }
50
- };
51
- exports.isTdxGuest = isTdxGuest;
52
- const isAzureConfidentialVm = async () => {
53
- try {
54
- const response = await fetch(AZURE_IMDS_COMPUTE_URL, {
55
- headers: { Metadata: 'true' },
56
- signal: AbortSignal.timeout(IMDS_TIMEOUT_MS),
57
- });
58
- if (!response.ok) {
59
- return false;
60
- }
61
- const compute = (await response.json());
62
- return (String(compute?.securityProfile?.securityType ?? '')
63
- .trim()
64
- .toLowerCase() === 'confidentialvm');
65
- }
66
- catch {
67
- return false;
68
- }
69
- };
70
- exports.isAzureConfidentialVm = isAzureConfidentialVm;
71
- const isAzureTdxVm = async () => (await (0, exports.isAzureConfidentialVm)()) && (0, exports.isTdxGuest)();
72
- exports.isAzureTdxVm = isAzureTdxVm;
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0QXp1cmVUZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp1cmUvZGV0ZWN0QXp1cmVUZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXdEO0FBRXhELE1BQU0sc0JBQXNCLEdBQ3hCLHlFQUF5RSxDQUFDO0FBQzlFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLGlCQUFpQixHQUFHLEdBQWdCLEVBQUU7SUFDeEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxpQkFBWSxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2pDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4RCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUssTUFBTSxVQUFVLEdBQUcsR0FBWSxFQUFFO0lBQ3BDLElBQUksQ0FBQztRQUNELElBQ0ksSUFBQSxlQUFVLEVBQUMsZUFBZSxDQUFDO1lBQzNCLElBQUEsYUFBUSxFQUFDLGVBQWUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQy9DLENBQUM7WUFDQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLFNBQVM7SUFDYixDQUFDO0lBRUQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLElBQUEsZUFBVSxFQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0QsT0FBTyxJQUFBLGlCQUFZLEVBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXZCVyxRQUFBLFVBQVUsY0F1QnJCO0FBRUssTUFBTSxxQkFBcUIsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDOUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUU7WUFDakQsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUM3QixNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7U0FDL0MsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNmLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUVyQyxDQUFDO1FBQ0YsT0FBTyxDQUNILE1BQU0sQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUM7YUFDL0MsSUFBSSxFQUFFO2FBQ04sV0FBVyxFQUFFLEtBQUssZ0JBQWdCLENBQzFDLENBQUM7SUFDTixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXBCVyxRQUFBLHFCQUFxQix5QkFvQmhDO0FBRUssTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFzQixFQUFFLENBQ3JELENBQUMsTUFBTSxJQUFBLDZCQUFxQixHQUFFLENBQUMsSUFBSSxJQUFBLGtCQUFVLEdBQUUsQ0FBQztBQUR2QyxRQUFBLFlBQVksZ0JBQzJCIn0=
@@ -1,16 +0,0 @@
1
- /// <reference types="node" />
2
- export declare const TDX_AZURE_EVIDENCE_FORMAT = "tdx-azure-maa-v1";
3
- export interface TdxAzureEvidenceV1 {
4
- format: typeof TDX_AZURE_EVIDENCE_FORMAT;
5
- token: string;
6
- }
7
- export declare const encodeTdxAzureEvidence: (token: string) => Buffer;
8
- export declare const parseTdxAzureEvidence: (evidence: Buffer) => TdxAzureEvidenceV1;
9
- /** vTPM SHA-256 PCRs mixed into Azure TDX mrEnclave. PCR[6] is omitted: Azure logs vmUniqueId there. */
10
- export declare const AZURE_TDX_MR_ENCLAVE_PCR_INDEXES: readonly [0, 1, 2, 3, 4, 5, 7];
11
- export declare const computeAzureTdxMrEnclave: (tdAttributesHex: string, mrtdHex: string, pcrSha256Hex: string[]) => Buffer;
12
- export declare const verifyMaaJwt: (token: string) => Promise<Record<string, unknown>>;
13
- export declare const validateAzureTdxClaims: (claims: Record<string, unknown>) => {
14
- userData: Buffer;
15
- mrenclave: Buffer;
16
- };
@@ -1,140 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateAzureTdxClaims = exports.verifyMaaJwt = exports.computeAzureTdxMrEnclave = exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES = exports.parseTdxAzureEvidence = exports.encodeTdxAzureEvidence = exports.TDX_AZURE_EVIDENCE_FORMAT = void 0;
4
- const crypto_1 = require("crypto");
5
- exports.TDX_AZURE_EVIDENCE_FORMAT = 'tdx-azure-maa-v1';
6
- const encodeTdxAzureEvidence = (token) => Buffer.from(JSON.stringify({
7
- format: exports.TDX_AZURE_EVIDENCE_FORMAT,
8
- token,
9
- }), 'utf8');
10
- exports.encodeTdxAzureEvidence = encodeTdxAzureEvidence;
11
- const parseTdxAzureEvidence = (evidence) => {
12
- const parsed = JSON.parse(evidence.toString('utf8'));
13
- if (parsed.format !== exports.TDX_AZURE_EVIDENCE_FORMAT || typeof parsed.token !== 'string') {
14
- throw new Error('Invalid tdx-azure evidence format');
15
- }
16
- return parsed;
17
- };
18
- exports.parseTdxAzureEvidence = parseTdxAzureEvidence;
19
- const hexToBuffer = (hex, expectedBytes) => {
20
- const normalized = hex.trim().toLowerCase().replace(/^0x/, '');
21
- if (!/^[0-9a-f]*$/.test(normalized) || normalized.length % 2 !== 0) {
22
- throw new Error(`Invalid hex value: ${hex}`);
23
- }
24
- const buffer = Buffer.from(normalized, 'hex');
25
- if (expectedBytes !== undefined && buffer.length !== expectedBytes) {
26
- throw new Error(`Expected ${expectedBytes} bytes, got ${buffer.length} from hex ${hex}`);
27
- }
28
- return buffer;
29
- };
30
- const decodeJwtPart = (part) => JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
31
- /** vTPM SHA-256 PCRs mixed into Azure TDX mrEnclave. PCR[6] is omitted: Azure logs vmUniqueId there. */
32
- exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES = [
33
- 0, 1, 2, 3, 4, 5, 7,
34
- ];
35
- const computeAzureTdxMrEnclave = (tdAttributesHex, mrtdHex, pcrSha256Hex) => {
36
- const lastIndex = exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES[exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES.length - 1];
37
- if (pcrSha256Hex.length <= lastIndex) {
38
- throw new Error(`tdx-azure mrEnclave requires SHA-256 PCR[0]..PCR[${lastIndex}] (PCR[6] is not mixed in)`);
39
- }
40
- const parts = [
41
- hexToBuffer(tdAttributesHex, 8),
42
- hexToBuffer(mrtdHex, 48),
43
- ...exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES.map((index) => hexToBuffer(pcrSha256Hex[index], 32)),
44
- ];
45
- return (0, crypto_1.createHash)('sha256').update(Buffer.concat(parts)).digest();
46
- };
47
- exports.computeAzureTdxMrEnclave = computeAzureTdxMrEnclave;
48
- const extractPcrSha256Hex = (claims) => {
49
- const values = claims['x-ms-azurevm-attested-pcr-values'];
50
- if (Array.isArray(values) && values.every((item) => typeof item === 'string')) {
51
- return values;
52
- }
53
- if (values && typeof values === 'object') {
54
- const sha256 = values.sha256;
55
- if (Array.isArray(sha256) && sha256.every((item) => typeof item === 'string')) {
56
- return sha256;
57
- }
58
- }
59
- throw new Error('MAA token is missing SHA-256 PCR values');
60
- };
61
- const isolationTee = (claims) => {
62
- const nested = claims['x-ms-isolation-tee'];
63
- if (nested && typeof nested === 'object') {
64
- return nested;
65
- }
66
- return claims;
67
- };
68
- const fetchJwks = async (url) => {
69
- const response = await fetch(url, { signal: AbortSignal.timeout(5000) });
70
- if (!response.ok) {
71
- throw new Error(`Failed to fetch MAA JWKS: ${response.status}`);
72
- }
73
- return (await response.json());
74
- };
75
- const verifyMaaJwt = async (token) => {
76
- const parts = token.split('.');
77
- if (parts.length !== 3) {
78
- throw new Error('MAA token is not a JWT');
79
- }
80
- const header = decodeJwtPart(parts[0]);
81
- const payload = decodeJwtPart(parts[1]);
82
- if (header.alg !== 'RS256') {
83
- throw new Error(`Unsupported MAA JWT alg: ${header.alg}`);
84
- }
85
- const iss = payload.iss;
86
- if (typeof iss !== 'string' || !/^https:\/\/[^/]+\.attest\.azure\.net\/?$/.test(iss)) {
87
- throw new Error(`Unexpected MAA issuer: ${String(iss)}`);
88
- }
89
- const jwksUrl = header.jku ?? `${iss.replace(/\/$/, '')}/certs`;
90
- if (typeof jwksUrl !== 'string' || !jwksUrl.startsWith(iss.replace(/\/$/, ''))) {
91
- throw new Error('MAA JWT jku is not on the issuer host');
92
- }
93
- const jwks = await fetchJwks(jwksUrl);
94
- const jwk = jwks.keys?.find((key) => key.kid === header.kid) ?? jwks.keys?.[0];
95
- if (!jwk) {
96
- throw new Error('MAA JWKS does not contain a verification key');
97
- }
98
- const key = (0, crypto_1.createPublicKey)({
99
- key: jwk,
100
- format: 'jwk',
101
- });
102
- const ok = (0, crypto_1.verify)('RSA-SHA256', Buffer.from(`${parts[0]}.${parts[1]}`), key, Buffer.from(parts[2], 'base64url'));
103
- if (!ok) {
104
- throw new Error('MAA JWT signature verification failed');
105
- }
106
- return payload;
107
- };
108
- exports.verifyMaaJwt = verifyMaaJwt;
109
- const validateAzureTdxClaims = (claims) => {
110
- const tee = isolationTee(claims);
111
- if (tee['tdx_td_attributes_debug'] === true) {
112
- throw new Error('Azure TDX debug attribute is enabled');
113
- }
114
- if (tee['x-ms-compliance-status'] !== 'azure-compliant-cvm') {
115
- throw new Error(`Azure TDX compliance status is ${String(tee['x-ms-compliance-status'])}`);
116
- }
117
- const tcbStatus = tee['attester_tcb_status'] ?? claims['attester_tcb_status'];
118
- if (tcbStatus && tcbStatus !== 'UpToDate') {
119
- throw new Error(`Azure TDX TCB is ${String(tcbStatus)}`);
120
- }
121
- const runtime = (tee['x-ms-runtime'] ?? claims['x-ms-runtime']);
122
- const userDataHex = runtime?.['user-data'];
123
- if (typeof userDataHex !== 'string') {
124
- throw new Error('MAA token is missing runtime user-data');
125
- }
126
- const userData = hexToBuffer(userDataHex);
127
- if (userData.length < 64) {
128
- throw new Error('MAA user-data is shorter than 64 bytes');
129
- }
130
- const tdAttributes = String(tee['tdx_td_attributes'] ?? '');
131
- const mrtd = String(tee['tdx_mrtd'] ?? '');
132
- const pcrs = extractPcrSha256Hex(claims);
133
- const mrenclave = (0, exports.computeAzureTdxMrEnclave)(tdAttributes, mrtd, pcrs);
134
- return {
135
- userData: userData.subarray(0, 64),
136
- mrenclave,
137
- };
138
- };
139
- exports.validateAzureTdxClaims = validateAzureTdxClaims;
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGR4QXp1cmVFdmlkZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9henVyZS90ZHhBenVyZUV2aWRlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFnRztBQUVuRixRQUFBLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBT3JELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUM1RCxNQUFNLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDWCxNQUFNLEVBQUUsaUNBQXlCO0lBQ2pDLEtBQUs7Q0FDcUIsQ0FBQyxFQUMvQixNQUFNLENBQ1QsQ0FBQztBQVBPLFFBQUEsc0JBQXNCLDBCQU83QjtBQUVDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxRQUFnQixFQUFzQixFQUFFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBZ0MsQ0FBQztJQUNwRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssaUNBQXlCLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxNQUE0QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQU5XLFFBQUEscUJBQXFCLHlCQU1oQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFFLGFBQXNCLEVBQVUsRUFBRTtJQUNoRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFH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
@@ -1,8 +0,0 @@
1
- /// <reference types="node" />
2
- import { ChallengeProvider } from './challengeProvider';
3
- import { Challenge, Log } from '@super-protocol/pki-common';
4
- export declare class ChallengeProviderTdxAzure implements ChallengeProvider {
5
- readonly logger?: Log | undefined;
6
- constructor(logger?: Log | undefined);
7
- generateChallenge(userData: Buffer, networkID?: string): Promise<Challenge>;
8
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChallengeProviderTdxAzure = void 0;
4
- const child_process_1 = require("child_process");
5
- const util_1 = require("util");
6
- const challengeNvidiaCCHelper_1 = require("./challengeNvidiaCCHelper");
7
- const pki_common_1 = require("@super-protocol/pki-common");
8
- const tdxAzureEvidence_1 = require("../azure/tdxAzureEvidence");
9
- const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
10
- class ChallengeProviderTdxAzure {
11
- logger;
12
- constructor(logger) {
13
- this.logger = logger;
14
- }
15
- async generateChallenge(userData, networkID) {
16
- const { challengeData, nvidiaTokens } = await challengeNvidiaCCHelper_1.ChallengeNvidiaCCHelper.getTokenAndCombinedChallengeData(userData, this.logger);
17
- const bin = process.env.AZURE_GUEST_ATTEST ?? 'azure-guest-attest';
18
- const args = [
19
- 'guest-attest',
20
- '--provider',
21
- 'maa',
22
- '--json',
23
- '--user-data',
24
- `hex:${challengeData.toString('hex')}`,
25
- ];
26
- let stdout;
27
- try {
28
- const result = await execFileAsync(bin, args, {
29
- timeout: 30000,
30
- maxBuffer: 4 * 1024 * 1024,
31
- });
32
- stdout = result.stdout;
33
- }
34
- catch (error) {
35
- throw new Error(`azure-guest-attest failed (${bin}): ${error.stderr || error.message}`);
36
- }
37
- const jsonStart = stdout.indexOf('{');
38
- if (jsonStart < 0) {
39
- throw new Error('azure-guest-attest returned no JSON');
40
- }
41
- const parsed = JSON.parse(stdout.slice(jsonStart));
42
- if (!parsed.passed || typeof parsed.token !== 'string') {
43
- throw new Error(`Azure MAA guest attestation failed: ${parsed.error || 'no token'}`);
44
- }
45
- return {
46
- type: pki_common_1.ChallengeType.TDXAZURE,
47
- evidenceBase64: (0, tdxAzureEvidence_1.encodeTdxAzureEvidence)(parsed.token).toString('base64'),
48
- nvidiaTokens,
49
- networkID,
50
- };
51
- }
52
- }
53
- exports.ChallengeProviderTdxAzure = ChallengeProviderTdxAzure;
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlUHJvdmlkZXJUZHhBenVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VQcm92aWRlci9jaGFsbGVuZ2VQcm92aWRlclRkeEF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUF5QztBQUN6QywrQkFBaUM7QUFDakMsdUVBQW9FO0FBRXBFLDJEQUEyRTtBQUMzRSxnRUFBbUU7QUFFbkUsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQkFBUyxFQUFDLHdCQUFRLENBQUMsQ0FBQztBQUUxQyxNQUFhLHlCQUF5QjtJQUNOO0lBQTVCLFlBQTRCLE1BQVk7UUFBWixXQUFNLEdBQU4sTUFBTSxDQUFNO0lBQUcsQ0FBQztJQUU1QyxLQUFLLENBQUMsaUJBQWlCLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWtCO1FBRWxCLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQ2pDLE1BQU0saURBQXVCLENBQUMsZ0NBQWdDLENBQzFELFFBQVEsRUFDUixJQUFJLENBQUMsTUFBTSxDQUNkLENBQUM7UUFFTixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHO1lBQ1QsY0FBYztZQUNkLFlBQVk7WUFDWixLQUFLO1lBQ0wsUUFBUTtZQUNSLGFBQWE7WUFDYixPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7U0FDekMsQ0FBQztRQUVGLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7Z0JBQzFDLE9BQU8sRUFBRSxLQUFNO2dCQUNmLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw4QkFBOEIsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUN6RSxDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBSWhELENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDWCx1Q0FBdUMsTUFBTSxDQUFDLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FDdEUsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPO1lBQ0gsSUFBSSxFQUFFLDBCQUFhLENBQUMsUUFBUTtZQUM1QixjQUFjLEVBQUUsSUFBQSx5Q0FBc0IsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUN6RCxRQUFRLENBQ1g7WUFDRCxZQUFZO1lBQ1osU0FBUztTQUNaLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE1REQsOERBNERDIn0=
@@ -1,7 +0,0 @@
1
- import { Challenge, Log } from '@super-protocol/pki-common';
2
- import { ChallengeResult, ChallengeValidator } from './challengeValidator';
3
- export declare class ChallengeValidatorTdxAzure implements ChallengeValidator {
4
- private readonly log;
5
- constructor(log: Log);
6
- validate(challenge: Challenge): Promise<ChallengeResult>;
7
- }
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChallengeValidatorTdxAzure = void 0;
4
- const pki_common_1 = require("@super-protocol/pki-common");
5
- const tdxAzureEvidence_1 = require("../azure/tdxAzureEvidence");
6
- class ChallengeValidatorTdxAzure {
7
- log;
8
- constructor(log) {
9
- this.log = log;
10
- }
11
- async validate(challenge) {
12
- if (challenge.type !== pki_common_1.ChallengeType.TDXAZURE) {
13
- throw new Error('Method not implemented.');
14
- }
15
- try {
16
- const evidence = (0, tdxAzureEvidence_1.parseTdxAzureEvidence)(Buffer.from(challenge.evidenceBase64, 'base64'));
17
- const claims = await (0, tdxAzureEvidence_1.verifyMaaJwt)(evidence.token);
18
- const { userData, mrenclave } = (0, tdxAzureEvidence_1.validateAzureTdxClaims)(claims);
19
- this.log.debug('Validated tdx-azure MAA claims', {
20
- mrenclaveHex: mrenclave.toString('hex'),
21
- });
22
- return {
23
- success: true,
24
- validatedUserData: userData,
25
- validatedId: mrenclave,
26
- };
27
- }
28
- catch (e) {
29
- return {
30
- success: false,
31
- error: e.message,
32
- };
33
- }
34
- }
35
- }
36
- exports.ChallengeValidatorTdxAzure = ChallengeValidatorTdxAzure;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yVGR4QXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvclRkeEF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUEyRTtBQUUzRSxnRUFJbUM7QUFFbkMsTUFBYSwwQkFBMEI7SUFDTjtJQUE3QixZQUE2QixHQUFRO1FBQVIsUUFBRyxHQUFILEdBQUcsQ0FBSztJQUFHLENBQUM7SUFFekMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFvQjtRQUMvQixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssMEJBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUEsd0NBQXFCLEVBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FDbEQsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwrQkFBWSxFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEseUNBQXNCLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQzdDLFlBQVksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUMxQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNILE9BQU8sRUFBRSxJQUFJO2dCQUNiLGlCQUFpQixFQUFFLFFBQVE7Z0JBQzNCLFdBQVcsRUFBRSxTQUFTO2FBQ3pCLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPO2FBQ25CLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBN0JELGdFQTZCQyJ9