@super-protocol/pki-attestation-engine 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/certificateGenerator.d.ts +34 -0
  2. package/dist/certificateGenerator.js +271 -0
  3. package/dist/challengeProvider/challengeNvidiaCCHelper.d.ts +10 -0
  4. package/dist/challengeProvider/challengeNvidiaCCHelper.js +62 -0
  5. package/dist/challengeProvider/challengeProvider.d.ts +6 -0
  6. package/dist/challengeProvider/challengeProvider.js +3 -0
  7. package/dist/challengeProvider/challengeProviderCertificate.d.ts +15 -0
  8. package/dist/challengeProvider/challengeProviderCertificate.js +82 -0
  9. package/dist/challengeProvider/challengeProviderSevSnp.d.ts +8 -0
  10. package/dist/challengeProvider/challengeProviderSevSnp.js +49 -0
  11. package/dist/challengeProvider/challengeProviderSgx.d.ts +8 -0
  12. package/dist/challengeProvider/challengeProviderSgx.js +47 -0
  13. package/dist/challengeProvider/challengeProviderTdx.d.ts +8 -0
  14. package/dist/challengeProvider/challengeProviderTdx.js +50 -0
  15. package/dist/challengeProvider/challengeProviderToken.d.ts +9 -0
  16. package/dist/challengeProvider/challengeProviderToken.js +22 -0
  17. package/dist/challengeProvider/challengeProviderUntrusted.d.ts +9 -0
  18. package/dist/challengeProvider/challengeProviderUntrusted.js +22 -0
  19. package/dist/challengeProvider/index.d.ts +8 -0
  20. package/dist/challengeProvider/index.js +25 -0
  21. package/dist/challengeValidator/challengeValidator.d.ts +18 -0
  22. package/dist/challengeValidator/challengeValidator.js +3 -0
  23. package/dist/challengeValidator/challengeValidatorCertificate.d.ts +9 -0
  24. package/dist/challengeValidator/challengeValidatorCertificate.js +55 -0
  25. package/dist/challengeValidator/challengeValidatorNvidia.d.ts +10 -0
  26. package/dist/challengeValidator/challengeValidatorNvidia.js +81 -0
  27. package/dist/challengeValidator/challengeValidatorSevSnp.d.ts +13 -0
  28. package/dist/challengeValidator/challengeValidatorSevSnp.js +137 -0
  29. package/dist/challengeValidator/challengeValidatorSgx.d.ts +8 -0
  30. package/dist/challengeValidator/challengeValidatorSgx.js +54 -0
  31. package/dist/challengeValidator/challengeValidatorTdx.d.ts +8 -0
  32. package/dist/challengeValidator/challengeValidatorTdx.js +52 -0
  33. package/dist/challengeValidator/challengeValidatorToken.d.ts +8 -0
  34. package/dist/challengeValidator/challengeValidatorToken.js +38 -0
  35. package/dist/challengeValidator/index.d.ts +8 -0
  36. package/dist/challengeValidator/index.js +32 -0
  37. package/dist/challengeValidator/schemas.d.ts +13 -0
  38. package/dist/challengeValidator/schemas.js +21 -0
  39. package/dist/challengeValidator/validatorConfig.d.ts +13 -0
  40. package/dist/challengeValidator/validatorConfig.js +3 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.js +20 -0
  43. package/dist/validator/challengeValidator.d.ts +18 -0
  44. package/dist/validator/challengeValidator.js +3 -0
  45. package/dist/validator/challengeValidatorCertificate.d.ts +8 -0
  46. package/dist/validator/challengeValidatorCertificate.js +70 -0
  47. package/dist/validator/challengeValidatorNvidia.d.ts +10 -0
  48. package/dist/validator/challengeValidatorNvidia.js +81 -0
  49. package/dist/validator/challengeValidatorSevSnp.d.ts +14 -0
  50. package/dist/validator/challengeValidatorSevSnp.js +137 -0
  51. package/dist/validator/challengeValidatorSgx.d.ts +8 -0
  52. package/dist/validator/challengeValidatorSgx.js +69 -0
  53. package/dist/validator/challengeValidatorTdx.d.ts +8 -0
  54. package/dist/validator/challengeValidatorTdx.js +67 -0
  55. package/dist/validator/challengeValidatorToken.d.ts +9 -0
  56. package/dist/validator/challengeValidatorToken.js +38 -0
  57. package/dist/validator/schemas.d.ts +13 -0
  58. package/dist/validator/schemas.js +21 -0
  59. package/dist/validator/validatorConfig.d.ts +13 -0
  60. package/dist/validator/validatorConfig.js +3 -0
  61. package/package.json +30 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChallengeValidatorTdx = void 0;
4
+ const pki_common_1 = require("@super-protocol/pki-common");
5
+ const addons_tee_1 = require("@super-protocol/addons-tee");
6
+ const sdk_js_1 = require("@super-protocol/sdk-js");
7
+ class ChallengeValidatorTdx {
8
+ log;
9
+ verifierService = new addons_tee_1.SgxNative.DcapQuoteVerifyService();
10
+ constructor(log) {
11
+ this.log = log;
12
+ }
13
+ async validate(challenge) {
14
+ switch (challenge.type) {
15
+ case pki_common_1.ChallengeType.TDX:
16
+ const quote = Buffer.from(challenge.quoteBase64, 'base64');
17
+ try {
18
+ try {
19
+ await this.verifierService.validateQuoteVerifierEnclave(quote);
20
+ }
21
+ catch (e) {
22
+ this.log.debug(`validateQuoteVerifierEnclave returned error: ${e}`);
23
+ if (!e.hasOwnProperty('criticalError') ||
24
+ e.criticalError) {
25
+ throw e;
26
+ }
27
+ }
28
+ const parser = new sdk_js_1.TeeTdxParser();
29
+ const parsedQuote = parser.parseQuote(quote);
30
+ this.log.debug(`Parsed quote: ${JSON.stringify(parsedQuote)}`);
31
+ const parsedBody = parser.parseBody(parsedQuote.tdQuoteBody);
32
+ const userData = parsedBody.reportData;
33
+ this.log.debug(`Parsed report: ${JSON.stringify(parsedBody)}`);
34
+ const mrenclave = sdk_js_1.TeeTdxParser.getMrEnclave(quote);
35
+ return {
36
+ success: true,
37
+ validatedUserData: Buffer.from(userData.slice(0, 64)),
38
+ validatedId: Buffer.from(mrenclave),
39
+ };
40
+ }
41
+ catch (e) {
42
+ return {
43
+ success: false,
44
+ error: e.message,
45
+ };
46
+ }
47
+ }
48
+ throw new Error('Method not implemented.');
49
+ }
50
+ }
51
+ exports.ChallengeValidatorTdx = ChallengeValidatorTdx;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yVGR4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYWxsZW5nZVZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3JUZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQTJFO0FBRTNFLDJEQUF1RDtBQUN2RCxtREFBc0Q7QUFFdEQsTUFBYSxxQkFBcUI7SUFHRDtJQUZyQixlQUFlLEdBQUcsSUFBSSxzQkFBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFFakUsWUFBNkIsR0FBUTtRQUFSLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFBRyxDQUFDO0lBRXpDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBb0I7UUFDL0IsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSywwQkFBYSxDQUFDLEdBQUc7Z0JBQ2xCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDO29CQUNELElBQUksQ0FBQzt3QkFDRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQ25ELEtBQUssQ0FDUixDQUFDO29CQUNOLENBQUM7b0JBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQzt3QkFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDVixnREFBZ0QsQ0FBQyxFQUFFLENBQ3RELENBQUM7d0JBQ0YsSUFDSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDOzRCQUNsQyxDQUFDLENBQUMsYUFBYSxFQUNqQixDQUFDOzRCQUNDLE1BQU0sQ0FBQyxDQUFDO3dCQUNaLENBQUM7b0JBQ0wsQ0FBQztvQkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFZLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1YsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FDakQsQ0FBQztvQkFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUMvQixXQUFXLENBQUMsV0FBVyxDQUMxQixDQUFDO29CQUNGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNWLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ2pELENBQUM7b0JBQ0YsTUFBTSxTQUFTLEdBQUcscUJBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRW5ELE9BQU87d0JBQ0gsT0FBTyxFQUFFLElBQUk7d0JBQ2IsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDckQsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUN0QyxDQUFDO2dCQUNOLENBQUM7Z0JBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztvQkFDZCxPQUFPO3dCQUNILE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTztxQkFDbkIsQ0FBQztnQkFDTixDQUFDO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0o7QUFyREQsc0RBcURDIn0=
@@ -0,0 +1,8 @@
1
+ import { Challenge, Log } from '@super-protocol/pki-common';
2
+ import { ChallengeResult, ChallengeValidator } from './challengeValidator';
3
+ export declare class ChallengeValidatorToken implements ChallengeValidator {
4
+ private readonly token;
5
+ private readonly log;
6
+ constructor(token: string, log: Log);
7
+ validate(challenge: Challenge): Promise<ChallengeResult>;
8
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChallengeValidatorToken = void 0;
4
+ const pki_common_1 = require("@super-protocol/pki-common");
5
+ class ChallengeValidatorToken {
6
+ token;
7
+ log;
8
+ constructor(token, log) {
9
+ this.token = token;
10
+ this.log = log;
11
+ }
12
+ async validate(challenge) {
13
+ switch (challenge.type) {
14
+ case pki_common_1.ChallengeType.Token:
15
+ try {
16
+ if (challenge.token !== this.token) {
17
+ throw new Error('Invalid token');
18
+ }
19
+ this.log.info(`token challenge validated successfully`);
20
+ return {
21
+ success: true,
22
+ validatedUserData: Buffer.from(challenge.userDataBase64, 'base64'),
23
+ validatedId: Buffer.alloc(0), // empty as we don't have id in token challenge
24
+ };
25
+ }
26
+ catch (e) {
27
+ this.log.error(`challengeValidatorToken returned error: ${e}`);
28
+ return {
29
+ success: false,
30
+ error: e.message,
31
+ };
32
+ }
33
+ }
34
+ throw new Error('Method not implemented.');
35
+ }
36
+ }
37
+ exports.ChallengeValidatorToken = ChallengeValidatorToken;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvclRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUEyRTtBQUczRSxNQUFhLHVCQUF1QjtJQUVYO0lBQ0E7SUFGckIsWUFDcUIsS0FBYSxFQUNiLEdBQVE7UUFEUixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsUUFBRyxHQUFILEdBQUcsQ0FBSztJQUMxQixDQUFDO0lBRUosS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFvQjtRQUMvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixLQUFLLDBCQUFhLENBQUMsS0FBSztnQkFDcEIsSUFBSSxDQUFDO29CQUNELElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7b0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztvQkFFeEQsT0FBTzt3QkFDSCxPQUFPLEVBQUUsSUFBSTt3QkFDYixpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUMxQixTQUFTLENBQUMsY0FBYyxFQUN4QixRQUFRLENBQ1g7d0JBQ0QsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsK0NBQStDO3FCQUNoRixDQUFDO2dCQUNOLENBQUM7Z0JBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDViwyQ0FBMkMsQ0FBQyxFQUFFLENBQ2pELENBQUM7b0JBQ0YsT0FBTzt3QkFDSCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU87cUJBQ25CLENBQUM7Z0JBQ04sQ0FBQztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNKO0FBbkNELDBEQW1DQyJ9
@@ -0,0 +1,8 @@
1
+ export * from './challengeValidator';
2
+ export * from './validatorConfig';
3
+ export { ChallengeValidatorCertificate } from './challengeValidatorCertificate';
4
+ export { ChallengeValidatorNvidia } from './challengeValidatorNvidia';
5
+ export { ChallengeValidatorSgx } from './challengeValidatorSgx';
6
+ export { ChallengeValidatorTdx } from './challengeValidatorTdx';
7
+ export { ChallengeValidatorSevSnp } from './challengeValidatorSevSnp';
8
+ export { ChallengeValidatorToken } from './challengeValidatorToken';
@@ -0,0 +1,32 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ChallengeValidatorToken = exports.ChallengeValidatorSevSnp = exports.ChallengeValidatorTdx = exports.ChallengeValidatorSgx = exports.ChallengeValidatorNvidia = exports.ChallengeValidatorCertificate = void 0;
18
+ __exportStar(require("./challengeValidator"), exports);
19
+ __exportStar(require("./validatorConfig"), exports);
20
+ var challengeValidatorCertificate_1 = require("./challengeValidatorCertificate");
21
+ Object.defineProperty(exports, "ChallengeValidatorCertificate", { enumerable: true, get: function () { return challengeValidatorCertificate_1.ChallengeValidatorCertificate; } });
22
+ var challengeValidatorNvidia_1 = require("./challengeValidatorNvidia");
23
+ Object.defineProperty(exports, "ChallengeValidatorNvidia", { enumerable: true, get: function () { return challengeValidatorNvidia_1.ChallengeValidatorNvidia; } });
24
+ var challengeValidatorSgx_1 = require("./challengeValidatorSgx");
25
+ Object.defineProperty(exports, "ChallengeValidatorSgx", { enumerable: true, get: function () { return challengeValidatorSgx_1.ChallengeValidatorSgx; } });
26
+ var challengeValidatorTdx_1 = require("./challengeValidatorTdx");
27
+ Object.defineProperty(exports, "ChallengeValidatorTdx", { enumerable: true, get: function () { return challengeValidatorTdx_1.ChallengeValidatorTdx; } });
28
+ var challengeValidatorSevSnp_1 = require("./challengeValidatorSevSnp");
29
+ Object.defineProperty(exports, "ChallengeValidatorSevSnp", { enumerable: true, get: function () { return challengeValidatorSevSnp_1.ChallengeValidatorSevSnp; } });
30
+ var challengeValidatorToken_1 = require("./challengeValidatorToken");
31
+ Object.defineProperty(exports, "ChallengeValidatorToken", { enumerable: true, get: function () { return challengeValidatorToken_1.ChallengeValidatorToken; } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLG9EQUFrQztBQUNsQyxpRkFBZ0Y7QUFBdkUsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLGlFQUFnRTtBQUF2RCw4SEFBQSxxQkFBcUIsT0FBQTtBQUM5QixpRUFBZ0U7QUFBdkQsOEhBQUEscUJBQXFCLE9BQUE7QUFDOUIsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFFQUFvRTtBQUEzRCxrSUFBQSx1QkFBdUIsT0FBQSJ9
@@ -0,0 +1,13 @@
1
+ export declare const accessCredentialsSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
2
+ storageType: import("@sinclair/typebox").TLiteral<"STORJ">;
3
+ credentials: import("@sinclair/typebox").TObject<{
4
+ token: import("@sinclair/typebox").TString;
5
+ }>;
6
+ }>, import("@sinclair/typebox").TObject<{
7
+ storageType: import("@sinclair/typebox").TLiteral<"S3">;
8
+ credentials: import("@sinclair/typebox").TObject<{
9
+ accessKeyId: import("@sinclair/typebox").TString;
10
+ secretKey: import("@sinclair/typebox").TString;
11
+ endpoint: import("@sinclair/typebox").TString;
12
+ }>;
13
+ }>]>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accessCredentialsSchema = void 0;
4
+ const typebox_1 = require("@sinclair/typebox");
5
+ exports.accessCredentialsSchema = typebox_1.Type.Union([
6
+ typebox_1.Type.Object({
7
+ storageType: typebox_1.Type.Literal('STORJ'),
8
+ credentials: typebox_1.Type.Object({
9
+ token: typebox_1.Type.String(),
10
+ }),
11
+ }),
12
+ typebox_1.Type.Object({
13
+ storageType: typebox_1.Type.Literal('S3'),
14
+ credentials: typebox_1.Type.Object({
15
+ accessKeyId: typebox_1.Type.String(),
16
+ secretKey: typebox_1.Type.String(),
17
+ endpoint: typebox_1.Type.String(),
18
+ }),
19
+ }),
20
+ ]);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VWYWxpZGF0b3Ivc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBeUM7QUFFNUIsUUFBQSx1QkFBdUIsR0FBRyxjQUFJLENBQUMsS0FBSyxDQUFDO0lBQzlDLGNBQUksQ0FBQyxNQUFNLENBQUM7UUFDUixXQUFXLEVBQUUsY0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbEMsV0FBVyxFQUFFLGNBQUksQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxFQUFFLGNBQUksQ0FBQyxNQUFNLEVBQUU7U0FDdkIsQ0FBQztLQUNMLENBQUM7SUFDRixjQUFJLENBQUMsTUFBTSxDQUFDO1FBQ1IsV0FBVyxFQUFFLGNBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQy9CLFdBQVcsRUFBRSxjQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1lBQzFCLFNBQVMsRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3hCLFFBQVEsRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1NBQzFCLENBQUM7S0FDTCxDQUFDO0NBQ0wsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,13 @@
1
+ export interface SevValidationConfig {
2
+ sevTmp?: string;
3
+ cacheFolder?: string;
4
+ vmRepoOwner?: string;
5
+ vmRepo?: string;
6
+ releaseAsset?: string;
7
+ storageAccess?: Record<string, unknown>;
8
+ securityPolicy?: Record<string, unknown>;
9
+ }
10
+ export interface NvtrustWrapperConfig {
11
+ tmp?: string;
12
+ timeout?: number;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYWxsZW5nZVZhbGlkYXRvci92YWxpZGF0b3JDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,3 @@
1
+ export * from './certificateGenerator';
2
+ export * from './challengeProvider';
3
+ export * from './challengeValidator';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./certificateGenerator"), exports);
18
+ __exportStar(require("./challengeProvider"), exports);
19
+ __exportStar(require("./challengeValidator"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF1QztBQUN2QyxzREFBb0M7QUFDcEMsdURBQXFDIn0=
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { Challenge } from '@super-protocol/pki-common';
3
+ export interface SuccessChallengeResult {
4
+ success: true;
5
+ validatedUserData: Buffer;
6
+ validatedId: Buffer;
7
+ validatedCommonId?: Buffer;
8
+ validatedSolutionHash?: Buffer;
9
+ }
10
+ export interface UnsuccessfulChallengeResult {
11
+ success: false;
12
+ error: string;
13
+ }
14
+ export type ChallengeResult = SuccessChallengeResult | UnsuccessfulChallengeResult;
15
+ export interface ChallengeValidator {
16
+ validate(challenge: Challenge, publicKeyPem?: string): Promise<ChallengeResult>;
17
+ initialize?: () => Promise<void>;
18
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,8 @@
1
+ import { Challenge } from '@super-protocol/pki-common';
2
+ import { ChallengeResult, ChallengeValidator } from './challengeValidator';
3
+ import { Log } from '@super-protocol/pki-apps-common';
4
+ export declare class ChallengeValidatorCertificate implements ChallengeValidator {
5
+ log: Log;
6
+ validate(challenge: Challenge, publicKeyPem: string): Promise<ChallengeResult>;
7
+ private verifyUserData;
8
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ChallengeValidatorCertificate = void 0;
16
+ const crypto_1 = __importDefault(require("crypto"));
17
+ const pki_common_1 = require("@super-protocol/pki-common");
18
+ const inversify_1 = require("inversify");
19
+ const sdk_js_1 = require("@super-protocol/sdk-js");
20
+ const pki_apps_common_1 = require("@super-protocol/pki-apps-common");
21
+ let ChallengeValidatorCertificate = class ChallengeValidatorCertificate {
22
+ log = new pki_apps_common_1.MockLog();
23
+ async validate(challenge, publicKeyPem) {
24
+ switch (challenge.type) {
25
+ case pki_common_1.ChallengeType.Certificate:
26
+ try {
27
+ await sdk_js_1.TeeCertificateService.validateTeeCertChainOrFail(challenge.orderCertificate + challenge.orderCABundle);
28
+ this.verifyUserData(publicKeyPem, challenge.userDataSignatureBase64, challenge.orderCertificate);
29
+ return {
30
+ success: true,
31
+ validatedUserData: (0, pki_common_1.getPublicKeyPemHash)(publicKeyPem),
32
+ validatedId: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_ID) ?? Buffer.alloc(0),
33
+ validatedCommonId: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID),
34
+ validatedSolutionHash: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, sdk_js_1.constants.OID_CUSTOM_EXTENSION_USER_DATA),
35
+ };
36
+ }
37
+ catch (e) {
38
+ return {
39
+ success: false,
40
+ error: e.message,
41
+ };
42
+ }
43
+ }
44
+ throw new Error('Method not implemented.');
45
+ }
46
+ async verifyUserData(publicKeyPem, signatureBase64, certificatePem) {
47
+ const cert = await sdk_js_1.CertificateGenerator.checkAndParseCert(certificatePem);
48
+ const certPublicKeyPem = await sdk_js_1.CryptoKeysTransformer.cryptoKeyToSpkiPem(cert.publicKey);
49
+ const certPublicKeyKeyObj = crypto_1.default.createPublicKey(certPublicKeyPem);
50
+ const publicKeyHash = (0, pki_common_1.getPublicKeyPemHash)(publicKeyPem);
51
+ const isValid = await sdk_js_1.Crypto.verify({
52
+ data: publicKeyHash,
53
+ signature: signatureBase64,
54
+ publicKey: certPublicKeyKeyObj,
55
+ signatureFormat: 'base64',
56
+ });
57
+ if (!isValid) {
58
+ throw Error('Signature verification failed');
59
+ }
60
+ }
61
+ };
62
+ exports.ChallengeValidatorCertificate = ChallengeValidatorCertificate;
63
+ __decorate([
64
+ (0, inversify_1.inject)(pki_apps_common_1.CommonInjectable.Logger),
65
+ __metadata("design:type", Object)
66
+ ], ChallengeValidatorCertificate.prototype, "log", void 0);
67
+ exports.ChallengeValidatorCertificate = ChallengeValidatorCertificate = __decorate([
68
+ (0, inversify_1.injectable)()
69
+ ], ChallengeValidatorCertificate);
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yQ2VydGlmaWNhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvckNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFNb0M7QUFFcEMseUNBQStDO0FBQy9DLG1EQU9nQztBQUVoQyxxRUFJeUM7QUFHbEMsSUFBTSw2QkFBNkIsR0FBbkMsTUFBTSw2QkFBNkI7SUFFL0IsR0FBRyxHQUFRLElBQUkseUJBQU8sRUFBRSxDQUFDO0lBRWhDLEtBQUssQ0FBQyxRQUFRLENBQ1YsU0FBb0IsRUFDcEIsWUFBb0I7UUFFcEIsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSywwQkFBYSxDQUFDLFdBQVc7Z0JBQzFCLElBQUksQ0FBQztvQkFDRCxNQUFNLDhCQUFxQixDQUFDLDBCQUEwQixDQUNsRCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FDdkQsQ0FBQztvQkFDRixJQUFJLENBQUMsY0FBYyxDQUNmLFlBQVksRUFDWixTQUFTLENBQUMsdUJBQXVCLEVBQ2pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FDN0IsQ0FBQztvQkFDRixPQUFPO3dCQUNILE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLElBQUEsZ0NBQW1CLEVBQUMsWUFBWSxDQUFDO3dCQUNwRCxXQUFXLEVBQ1AsMkJBQWtCLENBQUMsaUJBQWlCLENBQ2hDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFDMUIsOENBQWlDLENBQ3BDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3hCLGlCQUFpQixFQUFFLDJCQUFrQixDQUFDLGlCQUFpQixDQUNuRCxTQUFTLENBQUMsZ0JBQWdCLEVBQzFCLHFEQUF3QyxDQUMzQzt3QkFDRCxxQkFBcUIsRUFDakIsMkJBQWtCLENBQUMsaUJBQWlCLENBQ2hDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFDMUIsa0JBQVMsQ0FBQyw4QkFBOEIsQ0FDM0M7cUJBQ1IsQ0FBQztnQkFDTixDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2QsT0FBTzt3QkFDSCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU87cUJBQ25CLENBQUM7Z0JBQ04sQ0FBQztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQ3hCLFlBQW9CLEVBQ3BCLGVBQXVCLEVBQ3ZCLGNBQXNCO1FBRXRCLE1BQU0sSUFBSSxHQUNOLE1BQU0sNkJBQW9CLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLDhCQUFxQixDQUFDLGtCQUFrQixDQUNuRSxJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO1FBQ0YsTUFBTSxtQkFBbUIsR0FBRyxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sYUFBYSxHQUFHLElBQUEsZ0NBQW1CLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxlQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2hDLElBQUksRUFBRSxhQUFhO1lBQ25CLFNBQVMsRUFBRSxlQUFlO1lBQzFCLFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsZUFBZSxFQUFFLFFBQVE7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUF2RVksc0VBQTZCO0FBRS9CO0lBRE4sSUFBQSxrQkFBTSxFQUFDLGtDQUFnQixDQUFDLE1BQU0sQ0FBQzs7MERBQ0E7d0NBRnZCLDZCQUE2QjtJQUR6QyxJQUFBLHNCQUFVLEdBQUU7R0FDQSw2QkFBNkIsQ0F1RXpDIn0=
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import { NvtrustWrapperConfig } from './validatorConfig';
3
+ import { Challenge, NetworkType } from '@super-protocol/pki-common';
4
+ import { Log } from '@super-protocol/pki-apps-common';
5
+ export declare class ChallengeValidatorNvidia {
6
+ private readonly log;
7
+ private readonly config?;
8
+ constructor(log: Log, config?: NvtrustWrapperConfig | undefined);
9
+ validate(challenge: Challenge, userData: Buffer, networkType?: NetworkType): Promise<void>;
10
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChallengeValidatorNvidia = void 0;
4
+ const sp_nvtrust_wrapper_1 = require("@super-protocol/sp-nvtrust-wrapper");
5
+ const pki_common_1 = require("@super-protocol/pki-common");
6
+ const challengeProvider_1 = require("../challengeProvider");
7
+ class ChallengeValidatorNvidia {
8
+ log;
9
+ config;
10
+ constructor(log, config) {
11
+ this.log = log;
12
+ this.config = config;
13
+ }
14
+ async validate(challenge, userData, networkType) {
15
+ this.log.debug(`NVIDIA validation networkType: ${networkType}`);
16
+ if (!(0, pki_common_1.hasChallengeNvidiaToken)(challenge)) {
17
+ return;
18
+ }
19
+ const tokenHash = challengeProvider_1.ChallengeNvidiaCCHelper.getTokenHash(challenge.nvidiaTokens);
20
+ if (userData.length < 64) {
21
+ throw new Error('userData must be at least 64 bytes');
22
+ }
23
+ const expectedHash = userData.slice(32, 64);
24
+ const tokenHashHex = tokenHash.toString('hex');
25
+ const expectedHashHex = expectedHash.toString('hex');
26
+ this.log.debug(`NVIDIA tokenHash: ${tokenHashHex}, expectedHash: ${expectedHashHex}`);
27
+ if (tokenHashHex !== expectedHashHex) {
28
+ throw new Error('Nvidia hash included in the challenge does not match the hash of the nvidia token specified in the request');
29
+ }
30
+ const nvtrusWrapper = new sp_nvtrust_wrapper_1.NvtrustWrapper(this.config?.tmp ?? '/sp/nvtrust-tmp', this.config?.timeout ?? 60000);
31
+ let nvidiaTokenValidationResult = {
32
+ success: false,
33
+ };
34
+ try {
35
+ nvidiaTokenValidationResult = await nvtrusWrapper.validateToken({
36
+ device: sp_nvtrust_wrapper_1.NvidiaDeviceType.GPU,
37
+ policy: sp_nvtrust_wrapper_1.defaultGPUpolicy,
38
+ token: { jwt: challenge.nvidiaTokens.gpuToken },
39
+ });
40
+ if (nvidiaTokenValidationResult.success !== true) {
41
+ throw new Error('Failed to verify Nvidia GPU token: validateToken returned success=false');
42
+ }
43
+ if (networkType === 'trusted') {
44
+ const gpusInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractGPUInfoFromToken({
45
+ jwt: challenge.nvidiaTokens.gpuToken,
46
+ });
47
+ const debugGpuNumbers = gpusInfo.gpus
48
+ .map((gpu, index) => ({ gpu, gpuNumber: index + 1 }))
49
+ .filter(({ gpu }) => gpu.dbgStat === true)
50
+ .map(({ gpuNumber }) => gpuNumber);
51
+ const hasDebugEnabledGpu = debugGpuNumbers.length > 0;
52
+ if (hasDebugEnabledGpu) {
53
+ const debugGpuNumbersText = debugGpuNumbers.join(', ');
54
+ throw new Error(`Trusted network does not allow NVIDIA GPUs with dbgStat=true. Debug enabled on GPU(s): ${debugGpuNumbersText}`);
55
+ }
56
+ }
57
+ }
58
+ catch (error) {
59
+ if (error instanceof sp_nvtrust_wrapper_1.NvtrustWrapperCallError) {
60
+ this.log.error(`NvtrustWrapperCallError: ${error.message}`);
61
+ if (error.traceback?.trim()) {
62
+ this.log.debug(`Traceback:\n${error.traceback}`);
63
+ }
64
+ const logEntries = Object.entries(error.logs ?? {});
65
+ if (logEntries.length > 0) {
66
+ this.log.debug('Logs from nvtrust wrapper:');
67
+ for (const [fileName, logContent] of logEntries) {
68
+ this.log.debug(`--- ${fileName} ---`);
69
+ this.log.debug(String(logContent));
70
+ }
71
+ }
72
+ }
73
+ else {
74
+ this.log.error(`Error during NVIDIA token validation: ${error}`);
75
+ }
76
+ throw error;
77
+ }
78
+ }
79
+ }
80
+ exports.ChallengeValidatorNvidia = ChallengeValidatorNvidia;
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yTnZpZGlhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3JOdmlkaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBTTRDO0FBRTVDLDJEQUlvQztBQUNwQyw0REFBK0Q7QUFHL0QsTUFBYSx3QkFBd0I7SUFFWjtJQUNBO0lBRnJCLFlBQ3FCLEdBQVEsRUFDUixNQUE2QjtRQUQ3QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7SUFDL0MsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQ1YsU0FBb0IsRUFDcEIsUUFBZ0IsRUFDaEIsV0FBeUI7UUFFekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUEsb0NBQXVCLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLDJDQUF1QixDQUFDLFlBQVksQ0FDbEQsU0FBUyxDQUFDLFlBQVksQ0FDekIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDVixxQkFBcUIsWUFBWSxtQkFB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
@@ -0,0 +1,14 @@
1
+ import { Challenge } from '@super-protocol/pki-common';
2
+ import { Log } from '@super-protocol/pki-apps-common';
3
+ import { ChallengeResult, ChallengeValidator } from './challengeValidator';
4
+ import { SevValidationConfig } from './validatorConfig';
5
+ export declare class ChallengeValidatorSevSnp implements ChallengeValidator {
6
+ private readonly log;
7
+ private measureInstance;
8
+ private readonly sevTmp;
9
+ private static instance;
10
+ private readonly securityPolicy;
11
+ static getInstance(log: Log, config?: SevValidationConfig): ChallengeValidatorSevSnp;
12
+ private constructor();
13
+ validate(challenge: Challenge): Promise<ChallengeResult>;
14
+ }
@@ -0,0 +1,137 @@
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.ChallengeValidatorSevSnp = void 0;
27
+ const path = __importStar(require("path"));
28
+ const addons_tee_1 = require("@super-protocol/addons-tee");
29
+ const pki_common_1 = require("@super-protocol/pki-common");
30
+ const sdk_js_1 = require("@super-protocol/sdk-js");
31
+ const schemas_1 = require("./schemas");
32
+ class ChallengeValidatorSevSnp {
33
+ log;
34
+ measureInstance;
35
+ sevTmp;
36
+ static instance;
37
+ securityPolicy;
38
+ static getInstance(log, config) {
39
+ if (!ChallengeValidatorSevSnp.instance) {
40
+ ChallengeValidatorSevSnp.instance = new ChallengeValidatorSevSnp(log, config);
41
+ }
42
+ return ChallengeValidatorSevSnp.instance;
43
+ }
44
+ constructor(log, config) {
45
+ this.log = log;
46
+ this.log.debug(`SEV config: ${JSON.stringify(config)}`);
47
+ this.sevTmp = config?.sevTmp ?? '/tmp';
48
+ const cacheFolder = config?.cacheFolder ??
49
+ path.join(this.sevTmp, 'snp-mrenclave-cache');
50
+ let storageAccess;
51
+ if (config?.storageAccess) {
52
+ const { isValid } = (0, sdk_js_1.validateBySchema)(config.storageAccess, schemas_1.accessCredentialsSchema);
53
+ if (!isValid) {
54
+ throw new Error(`sev storageAccess is not valid!})`);
55
+ }
56
+ storageAccess = config.storageAccess;
57
+ }
58
+ if (config?.securityPolicy) {
59
+ try {
60
+ this.securityPolicy = addons_tee_1.SgxNative.SevSNP.parsePolicySet(config.securityPolicy);
61
+ }
62
+ catch (error) {
63
+ this.log.error(`Failed to parse SEV-SNP security policy: ${error}`);
64
+ throw new Error(`Invalid SEV-SNP security policy configuration: ${error}`);
65
+ }
66
+ }
67
+ this.measureInstance = new addons_tee_1.SgxNative.SNPMrEnclaveCalculator({
68
+ cacheFolder,
69
+ vmRepo: config?.vmRepo,
70
+ vmRepoOwner: config?.vmRepoOwner,
71
+ releaseAsset: config?.releaseAsset,
72
+ storageAccess,
73
+ rmPrevCache: false,
74
+ });
75
+ }
76
+ async validate(challenge) {
77
+ switch (challenge.type) {
78
+ case pki_common_1.ChallengeType.SEVSNP:
79
+ try {
80
+ let report;
81
+ try {
82
+ report = addons_tee_1.SgxNative.SevSNP.deserializeSNPReport(Buffer.from(challenge.serializedReportBase64, 'base64'));
83
+ }
84
+ catch (e) {
85
+ this.log.error(`deserializeSNPReport returned error: ${e}`);
86
+ throw e;
87
+ }
88
+ try {
89
+ await addons_tee_1.SgxNative.SevSNP.verifyReport(report, {
90
+ timeoutMs: 60000,
91
+ tmpDirTemplate: `${this.sevTmp}/verify-`,
92
+ });
93
+ }
94
+ catch (e) {
95
+ this.log.error(`verifyReport returned error: ${e}`);
96
+ throw e;
97
+ }
98
+ if (!report.snpReport?.rawReport) {
99
+ throw new Error('Missing snpReport or rawReport');
100
+ }
101
+ try {
102
+ if (this.securityPolicy) {
103
+ await addons_tee_1.SgxNative.SevSNP.verifyPolicy(Buffer.from(report.snpReport?.rawReport), this.securityPolicy);
104
+ }
105
+ }
106
+ catch (e) {
107
+ this.log.error(`verifyPolicy returned error: ${e}`);
108
+ throw e;
109
+ }
110
+ const userData = await addons_tee_1.SgxNative.SevSNP.getReportData(Buffer.from(report.snpReport.rawReport));
111
+ let mrenclave;
112
+ try {
113
+ mrenclave =
114
+ await this.measureInstance.getSingleCoreMrEnclave(report.snpReport);
115
+ }
116
+ catch (e) {
117
+ this.log.error(`getSingleCoreMrEnclave returned error: ${e}`);
118
+ throw e;
119
+ }
120
+ return {
121
+ success: true,
122
+ validatedUserData: Buffer.from(userData.slice(0, 64)),
123
+ validatedId: mrenclave,
124
+ };
125
+ }
126
+ catch (e) {
127
+ return {
128
+ success: false,
129
+ error: e.message,
130
+ };
131
+ }
132
+ }
133
+ throw new Error('Method not implemented.');
134
+ }
135
+ }
136
+ exports.ChallengeValidatorSevSnp = ChallengeValidatorSevSnp;
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yU2V2U25wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3JTZXZTbnAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsMkRBQXVEO0FBQ3ZELDJEQUFzRTtBQUl0RSxtREFBeUU7QUFDekUsdUNBQW9EO0FBRXBELE1BQWEsd0JBQXdCO0lBcUJaO0lBcEJiLGVBQWUsQ0FBbUM7SUFDekMsTUFBTSxDQUFTO0lBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQTJCO0lBQ2pDLGNBQWMsQ0FBa0M7SUFFMUQsTUFBTSxDQUFDLFdBQVcsQ0FDckIsR0FBUSxFQUNSLE1BQTRCO1FBRTVCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQyx3QkFBd0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBd0IsQ0FDNUQsR0FBRyxFQUNILE1BQU0sQ0FDVCxDQUFDO1FBQ04sQ0FBQztRQUVELE9BQU8sd0JBQXdCLENBQUMsUUFBUSxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUNxQixHQUFRLEVBQ3pCLE1BQTRCO1FBRFgsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUd6QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDdkMsTUFBTSxXQUFXLEdBQ2IsTUFBTSxFQUFFLFdBQVc7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFbEQsSUFBSSxhQUF3QyxDQUFDO1FBQzdDLElBQUksTUFBTSxFQUFFLGFBQWEsRUFBRSxD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
@@ -0,0 +1,8 @@
1
+ import { Challenge } from '@super-protocol/pki-common';
2
+ import { ChallengeResult, ChallengeValidator } from './challengeValidator';
3
+ import { Log } from '@super-protocol/pki-apps-common';
4
+ export declare class ChallengeValidatorSgx implements ChallengeValidator {
5
+ log: Log;
6
+ private verifierService;
7
+ validate(challenge: Challenge): Promise<ChallengeResult>;
8
+ }