@dynamic-labs-wallet/forward-mpc-client 0.5.4 → 0.6.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/index.cjs CHANGED
@@ -515,6 +515,7 @@ var ForwardMPCClient = class extends EventEmitter2.EventEmitter {
515
515
  roomUuid: params.roomUuid,
516
516
  traceContext: params.traceContext,
517
517
  userId: params.userId,
518
+ walletId: params.walletId,
518
519
  environmentId: params.environmentId
519
520
  });
520
521
  return this.sendRequest(request);
@@ -617,7 +618,11 @@ var ErrorCode = {
617
618
  HANDSHAKE_FAILED: "HANDSHAKE_FAILED",
618
619
  HANDSHAKE_INVALID_RESPONSE: "HANDSHAKE_INVALID_RESPONSE",
619
620
  ATTESTATION_FAILED: "ATTESTATION_FAILED",
621
+ ATTESTATION_PCR_MISMATCH: "ATTESTATION_PCR_MISMATCH",
622
+ ATTESTATION_CHALLENGE_MISMATCH: "ATTESTATION_CHALLENGE_MISMATCH",
623
+ ATTESTATION_NONCE_MISMATCH: "ATTESTATION_NONCE_MISMATCH",
620
624
  ATTESTATION_NONCE_MISSING: "ATTESTATION_NONCE_MISSING",
625
+ ATTESTATION_DOCUMENT_MISSING: "ATTESTATION_DOCUMENT_MISSING",
621
626
  REQUEST_TIMEOUT: "REQUEST_TIMEOUT",
622
627
  SESSION_DISPOSED: "SESSION_DISPOSED",
623
628
  SERVER_ERROR: "SERVER_ERROR",
@@ -626,6 +631,20 @@ var ErrorCode = {
626
631
  SESSION_ESTABLISH_FAILED: "SESSION_ESTABLISH_FAILED",
627
632
  UNSUPPORTED_ALGORITHM: "UNSUPPORTED_ALGORITHM"
628
633
  };
634
+ var AttestationErrorCode = {
635
+ /** Generic / unrecognised attestation failure */
636
+ FAILED: ErrorCode.ATTESTATION_FAILED,
637
+ /** PCR8 hash mismatch — enclave measurement changed */
638
+ PCR_MISMATCH: ErrorCode.ATTESTATION_PCR_MISMATCH,
639
+ /** Challenge / ciphertext binding mismatch */
640
+ CHALLENGE_MISMATCH: ErrorCode.ATTESTATION_CHALLENGE_MISMATCH,
641
+ /** Nonce value mismatch — possible tampering */
642
+ NONCE_MISMATCH: ErrorCode.ATTESTATION_NONCE_MISMATCH,
643
+ /** Nonce field missing from attestation document */
644
+ NONCE_MISSING: ErrorCode.ATTESTATION_NONCE_MISSING,
645
+ /** Server did not return an attestation document */
646
+ DOCUMENT_MISSING: ErrorCode.ATTESTATION_DOCUMENT_MISSING
647
+ };
629
648
  var ForwardMPCErrorType = {
630
649
  TRANSPORT: "transport",
631
650
  SESSION: "session",
@@ -728,16 +747,12 @@ var SessionAttestationError = class extends SessionError {
728
747
  static {
729
748
  __name(this, "SessionAttestationError");
730
749
  }
731
- constructor(context) {
732
- super("Attestation verification failed", ErrorCode.ATTESTATION_FAILED, context);
733
- }
734
- };
735
- var SessionAttestationNonceMissingError = class extends SessionError {
736
- static {
737
- __name(this, "SessionAttestationNonceMissingError");
738
- }
739
- constructor(context) {
740
- super("Nonce missing from attestation document", ErrorCode.ATTESTATION_NONCE_MISSING, context);
750
+ cause;
751
+ constructor(message = "Attestation verification failed", code = ErrorCode.ATTESTATION_FAILED, context, cause) {
752
+ super(message, code, context);
753
+ if (cause !== void 0) {
754
+ this.cause = cause;
755
+ }
741
756
  }
742
757
  };
743
758
  var SessionRequestTimeoutError = class extends SessionError {
@@ -1028,9 +1043,7 @@ var Session = class _Session {
1028
1043
  if (!data.attestationDoc) {
1029
1044
  sharedSecret.fill(0);
1030
1045
  nonceBytes.fill(0);
1031
- throw new SessionAttestationError({
1032
- reason: "Server did not return an attestation document"
1033
- });
1046
+ throw new SessionAttestationError("Server did not return an attestation document", ErrorCode.ATTESTATION_DOCUMENT_MISSING);
1034
1047
  }
1035
1048
  try {
1036
1049
  await _Session.verifyAttestation(data.attestationDoc, cipherText, nonceBytes, options.attestationVerifier);
@@ -1118,7 +1131,13 @@ var Session = class _Session {
1118
1131
  requestId
1119
1132
  }));
1120
1133
  } else {
1121
- resolve(msg.getData());
1134
+ const data = msg.getData();
1135
+ const maybeError = data !== null && typeof data === "object" && "error" in data ? data.error : void 0;
1136
+ if (isWebSocketError(maybeError)) {
1137
+ reject(new SessionRemoteError(maybeError));
1138
+ } else {
1139
+ resolve(data);
1140
+ }
1122
1141
  }
1123
1142
  }, "handler");
1124
1143
  transport.on("message", handler);
@@ -1156,10 +1175,29 @@ var Session = class _Session {
1156
1175
  const expectedChallenge = Array.from(challengeHash).map((b) => b.toString(16).padStart(2, "0")).join("");
1157
1176
  const result = await verifier.verify(attestationDocBase64, expectedChallenge, nonce);
1158
1177
  if (!result.valid) {
1159
- throw new SessionAttestationError({
1178
+ const primaryError = result.errors[0] || "";
1179
+ throw new SessionAttestationError("Attestation verification failed", _Session.classifyAttestationError(primaryError), {
1160
1180
  errors: result.errors
1161
- });
1181
+ }, primaryError);
1182
+ }
1183
+ }
1184
+ /**
1185
+ * Classifies an attestation verifier error message into a specific ErrorCode.
1186
+ */
1187
+ static classifyAttestationError(primaryError) {
1188
+ if (primaryError.includes("PCR verification failed")) {
1189
+ return ErrorCode.ATTESTATION_PCR_MISMATCH;
1190
+ }
1191
+ if (primaryError.includes("challenge mismatch") || primaryError.includes("ciphertext hash") || primaryError.includes("user data") || primaryError.includes("ciphertext binding")) {
1192
+ return ErrorCode.ATTESTATION_CHALLENGE_MISMATCH;
1193
+ }
1194
+ if (primaryError.includes("No nonce found")) {
1195
+ return ErrorCode.ATTESTATION_NONCE_MISSING;
1196
+ }
1197
+ if (primaryError.includes("nonce mismatch") || primaryError.includes("Nonce length mismatch") || primaryError.includes("Nonce verification failed")) {
1198
+ return ErrorCode.ATTESTATION_NONCE_MISMATCH;
1162
1199
  }
1200
+ return ErrorCode.ATTESTATION_FAILED;
1163
1201
  }
1164
1202
  };
1165
1203
 
@@ -1407,6 +1445,7 @@ Object.defineProperty(exports, "SigningAlgorithm", {
1407
1445
  enumerable: true,
1408
1446
  get: function () { return core.SigningAlgorithm; }
1409
1447
  });
1448
+ exports.AttestationErrorCode = AttestationErrorCode;
1410
1449
  exports.ClientError = ClientError;
1411
1450
  exports.ClientSessionEstablishFailedError = ClientSessionEstablishFailedError;
1412
1451
  exports.ClientUnsupportedAlgorithmError = ClientUnsupportedAlgorithmError;
@@ -1418,7 +1457,6 @@ exports.ForwardMPCError = ForwardMPCError;
1418
1457
  exports.ForwardMPCErrorType = ForwardMPCErrorType;
1419
1458
  exports.NitroAttestationVerifier = NitroAttestationVerifier;
1420
1459
  exports.SessionAttestationError = SessionAttestationError;
1421
- exports.SessionAttestationNonceMissingError = SessionAttestationNonceMissingError;
1422
1460
  exports.SessionDisposedError = SessionDisposedError;
1423
1461
  exports.SessionError = SessionError;
1424
1462
  exports.SessionHandshakeError = SessionHandshakeError;