@super-protocol/pki-attestation-engine 5.1.0-beta3 → 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.
- package/dist/attestationType.d.ts +1 -1
- package/dist/attestationType.js +7 -4
- package/dist/azure.d.ts +40 -0
- package/dist/azure.js +128 -0
- package/dist/certificateGenerator.js +2 -1
- package/dist/challengeProvider/challengeNvidiaCCHelper.js +1 -7
- package/dist/challengeProvider/challengeProviderAzure.d.ts +9 -0
- package/dist/challengeProvider/challengeProviderAzure.js +54 -0
- package/dist/challengeProvider/index.d.ts +1 -1
- package/dist/challengeProvider/index.js +2 -2
- package/dist/challengeValidator/challengeValidatorAzure.d.ts +29 -0
- package/dist/challengeValidator/challengeValidatorAzure.js +67 -0
- package/dist/challengeValidator/index.d.ts +2 -1
- package/dist/challengeValidator/index.js +9 -4
- package/dist/challengeValidator/validatorConfig.d.ts +5 -0
- package/dist/challengeValidator/wasmVerificationPolicy.d.ts +60 -0
- package/dist/challengeValidator/wasmVerificationPolicy.js +123 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/mrEnclaveSignature.d.ts +9 -0
- package/dist/mrEnclaveSignature.js +32 -0
- package/package.json +6 -4
- package/dist/azure/detectAzureTdx.d.ts +0 -3
- package/dist/azure/detectAzureTdx.js +0 -87
- package/dist/azure/tdxAzureEvidence.d.ts +0 -16
- package/dist/azure/tdxAzureEvidence.js +0 -207
- package/dist/challengeProvider/challengeProviderTdxAzure.d.ts +0 -8
- package/dist/challengeProvider/challengeProviderTdxAzure.js +0 -66
- package/dist/challengeValidator/challengeValidatorTdxAzure.d.ts +0 -7
- package/dist/challengeValidator/challengeValidatorTdxAzure.js +0 -37
|
@@ -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
|
|
7
|
-
export * from './
|
|
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
|
|
23
|
-
__exportStar(require("./
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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
|
|
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.
|
|
24
|
-
"@super-protocol/
|
|
25
|
-
"@super-protocol/
|
|
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,87 +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 () => {
|
|
72
|
-
if (!(await (0, exports.isAzureConfidentialVm)())) {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
try {
|
|
76
|
-
if ((0, fs_1.existsSync)(SEV_DEVICE_PATH) &&
|
|
77
|
-
(0, fs_1.statSync)(SEV_DEVICE_PATH).isCharacterDevice()) {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
// ignore
|
|
83
|
-
}
|
|
84
|
-
return true;
|
|
85
|
-
};
|
|
86
|
-
exports.isAzureTdxVm = isAzureTdxVm;
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0QXp1cmVUZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp1cmUvZGV0ZWN0QXp1cmVUZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXdEO0FBRXhELE1BQU0sc0JBQXNCLEdBQ3hCLHlFQUF5RSxDQUFDO0FBQzlFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLGlCQUFpQixHQUFHLEdBQWdCLEVBQUU7SUFDeEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxpQkFBWSxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2pDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4RCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNy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
|
|
@@ -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,207 +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 ||
|
|
14
|
-
typeof parsed.token !== 'string') {
|
|
15
|
-
throw new Error('Invalid tdx-azure evidence format');
|
|
16
|
-
}
|
|
17
|
-
return parsed;
|
|
18
|
-
};
|
|
19
|
-
exports.parseTdxAzureEvidence = parseTdxAzureEvidence;
|
|
20
|
-
const hexToBuffer = (hex, expectedBytes) => {
|
|
21
|
-
const normalized = hex.trim().toLowerCase().replace(/^0x/, '');
|
|
22
|
-
if (!/^[0-9a-f]*$/.test(normalized) || normalized.length % 2 !== 0) {
|
|
23
|
-
throw new Error(`Invalid hex value: ${hex}`);
|
|
24
|
-
}
|
|
25
|
-
const buffer = Buffer.from(normalized, 'hex');
|
|
26
|
-
if (expectedBytes !== undefined && buffer.length !== expectedBytes) {
|
|
27
|
-
throw new Error(`Expected ${expectedBytes} bytes, got ${buffer.length} from hex ${hex}`);
|
|
28
|
-
}
|
|
29
|
-
return buffer;
|
|
30
|
-
};
|
|
31
|
-
const decodeJwtPart = (part) => JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
|
|
32
|
-
/** vTPM SHA-256 PCRs mixed into Azure TDX mrEnclave. PCR[6] is omitted: Azure logs vmUniqueId there. */
|
|
33
|
-
exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES = [0, 1, 2, 3, 4, 5, 7];
|
|
34
|
-
const computeAzureTdxMrEnclave = (tdAttributesHex, mrtdHex, pcrSha256Hex) => {
|
|
35
|
-
const lastIndex = exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES[exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES.length - 1];
|
|
36
|
-
if (pcrSha256Hex.length <= lastIndex) {
|
|
37
|
-
throw new Error(`tdx-azure mrEnclave requires SHA-256 PCR[0]..PCR[${lastIndex}] (PCR[6] is not mixed in)`);
|
|
38
|
-
}
|
|
39
|
-
const parts = [
|
|
40
|
-
hexToBuffer(tdAttributesHex, 8),
|
|
41
|
-
hexToBuffer(mrtdHex, 48),
|
|
42
|
-
...exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES.map((index) => hexToBuffer(pcrSha256Hex[index], 32)),
|
|
43
|
-
];
|
|
44
|
-
return (0, crypto_1.createHash)('sha256').update(Buffer.concat(parts)).digest();
|
|
45
|
-
};
|
|
46
|
-
exports.computeAzureTdxMrEnclave = computeAzureTdxMrEnclave;
|
|
47
|
-
const pcrValueToHex = (value) => {
|
|
48
|
-
const trimmed = value.trim();
|
|
49
|
-
if (/^[0-9a-f]{64}$/i.test(trimmed)) {
|
|
50
|
-
return trimmed.toLowerCase();
|
|
51
|
-
}
|
|
52
|
-
const decoded = Buffer.from(trimmed, 'base64');
|
|
53
|
-
if (decoded.length === 32) {
|
|
54
|
-
return decoded.toString('hex');
|
|
55
|
-
}
|
|
56
|
-
throw new Error('MAA PCR value is neither SHA-256 hex nor 32-byte base64');
|
|
57
|
-
};
|
|
58
|
-
const extractPcrSha256Hex = (claims) => {
|
|
59
|
-
const values = claims['x-ms-azurevm-attested-pcr-values'];
|
|
60
|
-
if (Array.isArray(values) &&
|
|
61
|
-
values.every((item) => typeof item === 'string')) {
|
|
62
|
-
return values.map(pcrValueToHex);
|
|
63
|
-
}
|
|
64
|
-
if (values && typeof values === 'object') {
|
|
65
|
-
const rec = values;
|
|
66
|
-
const sha256 = rec.sha256;
|
|
67
|
-
if (Array.isArray(sha256) &&
|
|
68
|
-
sha256.every((item) => typeof item === 'string')) {
|
|
69
|
-
return sha256.map(pcrValueToHex);
|
|
70
|
-
}
|
|
71
|
-
const out = [];
|
|
72
|
-
for (let index = 0; index < 24; index += 1) {
|
|
73
|
-
const item = rec[`pcr${index}`];
|
|
74
|
-
if (typeof item !== 'string') {
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
out[index] = pcrValueToHex(item);
|
|
78
|
-
}
|
|
79
|
-
if (out.length >
|
|
80
|
-
exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES[exports.AZURE_TDX_MR_ENCLAVE_PCR_INDEXES.length - 1]) {
|
|
81
|
-
return out;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
throw new Error('MAA token is missing SHA-256 PCR values');
|
|
85
|
-
};
|
|
86
|
-
const decodeClaimBytes = (value) => {
|
|
87
|
-
const trimmed = value.trim();
|
|
88
|
-
if (/^[0-9a-f]+$/i.test(trimmed) && trimmed.length % 2 === 0) {
|
|
89
|
-
return Buffer.from(trimmed, 'hex');
|
|
90
|
-
}
|
|
91
|
-
return Buffer.from(trimmed, 'base64');
|
|
92
|
-
};
|
|
93
|
-
const toUserData64 = (value) => {
|
|
94
|
-
if (value.length < 32) {
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
if (value.length >= 64) {
|
|
98
|
-
return value.subarray(0, 64);
|
|
99
|
-
}
|
|
100
|
-
const padded = Buffer.alloc(64);
|
|
101
|
-
value.copy(padded);
|
|
102
|
-
return padded;
|
|
103
|
-
};
|
|
104
|
-
const asRecord = (value) => value && typeof value === 'object'
|
|
105
|
-
? value
|
|
106
|
-
: undefined;
|
|
107
|
-
const userDataFromRuntime = (runtime) => {
|
|
108
|
-
if (!runtime) {
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
const payload = asRecord(runtime['client-payload']);
|
|
112
|
-
if (typeof payload?.['user-data'] === 'string') {
|
|
113
|
-
const decoded = toUserData64(decodeClaimBytes(payload['user-data']));
|
|
114
|
-
if (decoded) {
|
|
115
|
-
return decoded;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (typeof runtime['user-data'] === 'string') {
|
|
119
|
-
return toUserData64(decodeClaimBytes(runtime['user-data']));
|
|
120
|
-
}
|
|
121
|
-
return undefined;
|
|
122
|
-
};
|
|
123
|
-
const extractRuntimeUserData = (claims, tee) => {
|
|
124
|
-
const fromTopLevel = userDataFromRuntime(asRecord(claims['x-ms-runtime']));
|
|
125
|
-
if (fromTopLevel) {
|
|
126
|
-
return fromTopLevel;
|
|
127
|
-
}
|
|
128
|
-
const fromTee = userDataFromRuntime(asRecord(tee['x-ms-runtime']));
|
|
129
|
-
if (fromTee) {
|
|
130
|
-
return fromTee;
|
|
131
|
-
}
|
|
132
|
-
throw new Error('MAA token is missing runtime user-data');
|
|
133
|
-
};
|
|
134
|
-
const isolationTee = (claims) => {
|
|
135
|
-
const nested = claims['x-ms-isolation-tee'];
|
|
136
|
-
if (nested && typeof nested === 'object') {
|
|
137
|
-
return nested;
|
|
138
|
-
}
|
|
139
|
-
return claims;
|
|
140
|
-
};
|
|
141
|
-
const fetchJwks = async (url) => {
|
|
142
|
-
const response = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
143
|
-
if (!response.ok) {
|
|
144
|
-
throw new Error(`Failed to fetch MAA JWKS: ${response.status}`);
|
|
145
|
-
}
|
|
146
|
-
return (await response.json());
|
|
147
|
-
};
|
|
148
|
-
const verifyMaaJwt = async (token) => {
|
|
149
|
-
const parts = token.split('.');
|
|
150
|
-
if (parts.length !== 3) {
|
|
151
|
-
throw new Error('MAA token is not a JWT');
|
|
152
|
-
}
|
|
153
|
-
const header = decodeJwtPart(parts[0]);
|
|
154
|
-
const payload = decodeJwtPart(parts[1]);
|
|
155
|
-
if (header.alg !== 'RS256') {
|
|
156
|
-
throw new Error(`Unsupported MAA JWT alg: ${header.alg}`);
|
|
157
|
-
}
|
|
158
|
-
const iss = payload.iss;
|
|
159
|
-
if (typeof iss !== 'string' ||
|
|
160
|
-
!/^https:\/\/[^/]+\.attest\.azure\.net\/?$/.test(iss)) {
|
|
161
|
-
throw new Error(`Unexpected MAA issuer: ${String(iss)}`);
|
|
162
|
-
}
|
|
163
|
-
const jwksUrl = header.jku ?? `${iss.replace(/\/$/, '')}/certs`;
|
|
164
|
-
if (typeof jwksUrl !== 'string' ||
|
|
165
|
-
!jwksUrl.startsWith(iss.replace(/\/$/, ''))) {
|
|
166
|
-
throw new Error('MAA JWT jku is not on the issuer host');
|
|
167
|
-
}
|
|
168
|
-
const jwks = await fetchJwks(jwksUrl);
|
|
169
|
-
const jwk = jwks.keys?.find((key) => key.kid === header.kid) ?? jwks.keys?.[0];
|
|
170
|
-
if (!jwk) {
|
|
171
|
-
throw new Error('MAA JWKS does not contain a verification key');
|
|
172
|
-
}
|
|
173
|
-
const key = (0, crypto_1.createPublicKey)({
|
|
174
|
-
key: jwk,
|
|
175
|
-
format: 'jwk',
|
|
176
|
-
});
|
|
177
|
-
const ok = (0, crypto_1.verify)('RSA-SHA256', Buffer.from(`${parts[0]}.${parts[1]}`), key, Buffer.from(parts[2], 'base64url'));
|
|
178
|
-
if (!ok) {
|
|
179
|
-
throw new Error('MAA JWT signature verification failed');
|
|
180
|
-
}
|
|
181
|
-
return payload;
|
|
182
|
-
};
|
|
183
|
-
exports.verifyMaaJwt = verifyMaaJwt;
|
|
184
|
-
const validateAzureTdxClaims = (claims) => {
|
|
185
|
-
const tee = isolationTee(claims);
|
|
186
|
-
if (tee['tdx_td_attributes_debug'] === true) {
|
|
187
|
-
throw new Error('Azure TDX debug attribute is enabled');
|
|
188
|
-
}
|
|
189
|
-
if (tee['x-ms-compliance-status'] !== 'azure-compliant-cvm') {
|
|
190
|
-
throw new Error(`Azure TDX compliance status is ${String(tee['x-ms-compliance-status'])}`);
|
|
191
|
-
}
|
|
192
|
-
const tcbStatus = tee['attester_tcb_status'] ?? claims['attester_tcb_status'];
|
|
193
|
-
if (tcbStatus && tcbStatus !== 'UpToDate') {
|
|
194
|
-
throw new Error(`Azure TDX TCB is ${String(tcbStatus)}`);
|
|
195
|
-
}
|
|
196
|
-
const userData = extractRuntimeUserData(claims, tee);
|
|
197
|
-
const tdAttributes = String(tee['tdx_td_attributes'] ?? '');
|
|
198
|
-
const mrtd = String(tee['tdx_mrtd'] ?? '');
|
|
199
|
-
const pcrs = extractPcrSha256Hex(claims);
|
|
200
|
-
const mrenclave = (0, exports.computeAzureTdxMrEnclave)(tdAttributes, mrtd, pcrs);
|
|
201
|
-
return {
|
|
202
|
-
userData,
|
|
203
|
-
mrenclave,
|
|
204
|
-
};
|
|
205
|
-
};
|
|
206
|
-
exports.validateAzureTdxClaims = validateAzureTdxClaims;
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGR4QXp1cmVFdmlkZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9henVyZS90ZHhBenVyZUV2aWRlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUtnQjtBQUVILFFBQUEseUJBQXlCLEdBQUcsa0JBQWtCLENBQUM7QUFPckQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQzVELE1BQU0sQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNYLE1BQU0sRUFBRSxpQ0FBeUI7SUFDakMsS0FBSztDQUNxQixDQUFDLEVBQy9CLE1BQU0sQ0FDVCxDQUFDO0FBUE8sUUFBQSxzQkFBc0IsMEJBTzdCO0FBRUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQWdCLEVBQXNCLEVBQUU7SUFDMUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDRyxDQUFDO0lBQ2pDLElBQ0ksTUFBTSxDQUFDLE1BQU0sS0FBSyxpQ0FBeUI7UUFDM0MsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDbEMsQ0FBQztRQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxNQUE0QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQVhXLFFBQUEscUJBQXFCLHlCQVdoQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFFLGFBQXNCLEVBQVUsRUFBRTtJQUNoRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFH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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
|
-
}
|