10. MPC Key Share Distribution

MPC-CMP · 3-share 분포 · key lifecycle

Protocol

  • MPC-CMP (Canetti–Makriyannis–Peled, NIST 2020 / ACM CCS 2020) — UC Non-Interactive, Proactive, Threshold ECDSA
  • ECDSA + EdDSA 양쪽 지원
  • 4 rounds (3 pre-processed) vs GG18 의 8 rounds → 800% faster
  • 마지막 라운드 QR offline 가능 → true air-gapped wallet
  • Universally composable · proactive security · accountability (bad-party identification)
  • Additive Secret Sharing (= Shamir t=n) — share 조합은 simple addition 만, perfect secrecy, "the secret itself never exists"

Share 분포 (Default SaaS MPC)

graph TB
  subgraph FB["Fireblocks (Azure SGX)"]
    S1[Co-Signer 1
SGX Confidential Enclave] S2[Co-Signer 2
SGX Confidential Enclave] end subgraph CUS["Customer"] M[Mobile device
Secure Enclave
iOS Keychain / Android TEE] A[API Co-Signer
SGX server option] end S1 -.signing ceremony.-> M S2 -.signing ceremony.-> M S1 -.signing ceremony.-> A S2 -.signing ceremony.-> A BAK[(Cloud backup
passphrase-encrypted
Fireblocks cloud servers)] M -.backup.-> BAK
Figure 3. Default SaaS MPC — 3 share within-group (1 customer + 2 Fireblocks). Across-group: 각 Admin/Signer 가 자체 3-share set 보유.

Threshold 구조

  • Within-group: 3/3 (1 customer-side + 2 Fireblocks cloud)
  • Across-group: 1/N OR (각 Admin/Signer 가 자체 3-share set 보유)
  • 모든 signing user 의 set 은 Owner 의 set 에서 derived

Hosted MPC Variant

모델Customer 측Fireblocks 측
Default SaaS MPC1 share (mobile or API Co-Signer)2 shares (Fireblocks Azure SGX)
Hosted MPC3 shares (1 Primary + 2 Guard, 모두 SGX)0 shares

Hosted MPC = customer ownership deployment axis — Fireblocks 는 cryptographic 참여 없음.

DB Schema — Key Lifecycle (auditdb)

-- 키 자체는 forbidden storage. row 는 lifecycle event 만 기록.
CREATE TABLE key_lifecycle (
  id              BINARY(16) PRIMARY KEY,
  workspace_id    BINARY(16) NOT NULL,
  user_id         BINARY(16) NOT NULL,
  key_set_id      BINARY(16) NOT NULL,        -- 한 user 의 3-share set 식별자
  event_type      ENUM('provisioned', 're-enrolled', 'migrated', 'revoked', 'backup-verified') NOT NULL,
  approved_by_owner_user_id BINARY(16),         -- provisioning 은 Owner 단독
  occurred_at     DATETIME(6) NOT NULL,
  source_aggregate VARCHAR(64),                  -- 'add-user', 'device-migration', ...
  -- ★ append-only — BEFORE UPDATE / DELETE 트리거로 강제
  KEY (workspace_id, user_id, occurred_at)
);

-- 절대 컬럼 X: private key, MPC share material, recovery passphrase, RSA private key
-- → 어떤 컬럼에도 plaintext 또는 cipher 로도 저장 금지 (Stage 23 참조)

Key Share Derivation 이벤트

이벤트인증 강도출처
Add user (signing role)Owner 단독 MPC key share derivation 별도 승인add-users.md, p.1
Re-enroll deviceOwner 재승인 (2-day window) + 사용자 재등록 (2-day window)re-enroll-a-users-mobile-device.md, p.1
Device migration사용자 본인 self-service, 관리자 승인 없이 PIN+passphrase+biometric 3중device-migration.md, p.2
Co-signer pairingOwner 가 Co-signer key shares 승인re-enrolling-api-users.md, p.1