콘텐츠로 이동

v0.0

컴포넌트 간 데이터 흐름 및 인터페이스 명세

1. Executive Summary

본 문서는 D'CENT 엔터프라이즈 콜드월렛 커스터디 솔루션의 3개 컴포넌트(온라인 대시보드, 오프라인 서명 앱, D'CENT X 콜드월렛) 간 인터페이스를 명세한다. 에어갭 경계를 넘는 모든 데이터의 포맷, 인코딩, 메시지 구조를 정의하여 각 컴포넌트 팀이 독립적으로 구현에 착수할 수 있는 인터페이스 계약을 제공한다.

설계 범위: - 4개 인터페이스 (대시보드→앱, 앱→SE, SE→앱, 앱→대시보드) - 에어갭 경계 데이터 카테고리 4종 (트랜잭션, 정책, 설정, 응답) - 직렬화 형식 (CBOR, UR, RLP) - Data Flow Diagram (DFD) Level 0-2 - 메시지 버저닝 및 하위 호환성 원칙


2. 에어갭 경계 데이터 포맷 정의

2.1. 데이터 카테고리

카테고리 방향 설명 빈도
트랜잭션 데이터 Zone 1→2→3 / Zone 3→2→1 미서명 TX, 서명 요청, 서명 결과 매 트랜잭션
정책 데이터 Zone 1→2→3 PolicyUpdate, Merkle Root/Proof 정책 변경 시
설정 데이터 Zone 1→2→3 디바이스 설정, 토큰 목록 업데이트 간헐적
응답 데이터 Zone 3→2→1 서명 응답, 정책 위반, 상태 정보 매 요청

2.2. 직렬화 계층

Application Data (JSON-like 구조)
        │
        ▼
   CBOR Encoding (RFC 8949)
        │
        ▼
   UR Wrapping (Blockchain Commons UR v2)
        │
        ├──▶ QR: Animated QR (Fountain Code 멀티파트)
        │
        └──▶ USB-C: 앱↔콜드월렛 직접 전송

2.3. 공통 메시지 헤더

모든 에어갭 메시지는 공통 헤더를 포함한다:

MessageHeader {
    version: uint8           // 프로토콜 버전 (현재: 0x01)
    message_type: uint8      // 메시지 유형 코드
    request_id: bytes(16)    // UUID v4 — 요청/응답 매칭
    timestamp_ref: uint32    // Unix timestamp (참조용, SE에서 신뢰하지 않음)
    payload_hash: bytes(32)  // 페이로드의 SHA-256 해시 (무결성 검증)
}

message_type 코드 체계:

코드 유형 방향
0x01 BTC_SIGN_REQUEST → SE
0x02 EVM_SIGN_REQUEST → SE
0x03 SIGN_RESPONSE ← SE
0x10 POLICY_UPDATE → SE
0x11 POLICY_RESPONSE ← SE
0x20 WHITELIST_VERIFY → SE
0x21 WHITELIST_RESPONSE ← SE
0x30 DEVICE_STATUS_REQUEST → SE
0x31 DEVICE_STATUS_RESPONSE ← SE
0x40 CONFIG_UPDATE → SE
0x41 CONFIG_RESPONSE ← SE
0xFE ERROR ← SE
0xFF HEARTBEAT 양방향

3. 인터페이스 1: 대시보드 → 오프라인 앱

3.1. 서명 요청 메시지

BTC 서명 요청:

BTCSignRequest {
    header: MessageHeader
    chain_type: 0x00           // BTC
    wallet_id: bytes(16)       // 월렛 식별자
    psbt: bytes                // PSBT 바이너리 (BIP-174/370)
    derivation_paths: [        // 서명에 필요한 키 파생 경로
        {
            path: string       // e.g., "m/86'/0'/0'/0/0"
            signer_index: uint8  // MuSig2 참여자 인덱스
        }
    ]
    musig2_context: {          // MuSig2 세션 컨텍스트 (BIP-327)
        round: uint8           // 1 = nonce 요청, 2 = 부분 서명 요청
        aggregated_nonce: bytes(66)?  // Round 2에서만 포함
        participant_pubkeys: [bytes(33)]  // 참여자 공개키 목록
    }?
    policy_version: uint32     // 현재 정책 버전
    whitelist_version: uint32  // 현재 화이트리스트 버전
    app_hash: bytes(32)        // WYSIWYS 검증용 해시
}

EVM 서명 요청:

EVMSignRequest {
    header: MessageHeader
    chain_type: 0x01           // EVM
    chain_id: uint64           // EIP-155 Chain ID (1=ETH, 137=Polygon 등)
    wallet_id: bytes(16)
    transaction: {
        to: bytes(20)          // 수신 주소
        value: bytes(32)       // 전송 금액 (wei, big-endian)
        data: bytes            // calldata (컨트랙트 호출 시)
        gas_limit: uint64
        max_fee_per_gas: uint64      // EIP-1559
        max_priority_fee_per_gas: uint64
        nonce: uint64
        access_list: [{        // EIP-2930
            address: bytes(20)
            storage_keys: [bytes(32)]
        }]?
    }
    eip712_data: {             // EIP-712 구조화 데이터 (Safe 호출 등)
        domain_separator: bytes(32)
        message_hash: bytes(32)
        typed_data_json: string  // 원본 TypedData JSON
    }?
    derivation_path: string    // e.g., "m/44'/60'/0'/0/0"
    policy_version: uint32
    whitelist_version: uint32
    app_hash: bytes(32)
    token_info: {              // ERC-20 토큰 정보 (해당 시)
        symbol: string
        decimals: uint8
        contract_address: bytes(20)
    }?
}

3.2. 정책 동기화 메시지

PolicySyncMessage {
    header: MessageHeader
    policy_update: PolicyUpdate  // Phase 4 hardware-policy-engine.md 구조체
    merkle_data: {
        new_root: bytes(32)      // 새 Merkle Root
        root_version: uint32     // Root 버전
        admin_signatures: [{     // Admin 쿼럼 서명
            pubkey: bytes(33)
            signature: bytes(64)
        }]
        quorum_threshold: uint8  // 필요 쿼럼 수
    }?
}

3.3. 화이트리스트 검증 데이터

WhitelistVerifyRequest {
    header: MessageHeader
    recipient_address: bytes    // 수신 주소 (체인별 가변 길이)
    chain_type: uint8
    merkle_proof: [bytes(32)]   // Merkle Proof (최대 depth 20)
    whitelist_version: uint32
}

3.4. CBOR 인코딩 규칙

모든 메시지는 CBOR (RFC 8949)로 인코딩한다: - 정수: Major Type 0/1 (양수/음수) - 바이트 문자열: Major Type 2 - 텍스트 문자열: Major Type 3 - 배열: Major Type 4 - 맵: Major Type 5 - 태그: Major Type 6 (UR Type 식별용)

CBOR 맵 키 규칙: - 키는 정수(Major Type 0)로 인코딩하여 페이로드 크기 최소화 - 키 할당은 메시지 유형별로 고정 (하위 호환성 보장)


4. 인터페이스 2: 오프라인 앱 → 콜드월렛 (SE)

4.1. SignRequest 메시지 구조

오프라인 앱이 콜드월렛에 전달하는 서명 요청은 인터페이스 1의 메시지를 SE 입력 포맷으로 변환한 것이다.

SE_SignRequest {
    header: MessageHeader
    chain_type: uint8
    raw_tx: bytes              // PSBT 바이너리 또는 RLP 인코딩 TX
    derivation_path: bytes     // BIP-32 경로 (바이너리 인코딩)
    app_hash: bytes(32)        // WYSIWYS 검증용 해시
    metadata: {
        wallet_id: bytes(16)
        policy_version: uint32
        whitelist_version: uint32
        signer_index: uint8    // MuSig2 참여자 인덱스 (BTC)
    }
    musig2_round_data: {       // MuSig2 라운드별 데이터 (BTC)
        round: uint8
        aggregated_nonce: bytes(66)?
        participant_pubkeys: [bytes(33)]?
    }?
    whitelist_proof: {         // 화이트리스트 Merkle Proof
        recipient: bytes
        proof: [bytes(32)]
    }?
}

4.2. PolicyUpdate 메시지 구조

SE_PolicyUpdate {
    header: MessageHeader
    policy_data: {
        version: uint32           // 정책 버전 (단조 증가)
        target_policy: uint8      // 변경 대상 (0x01-0x04)
        previous_value: bytes(32) // 이전 값 (검증용)
        new_value: bytes(32)      // 신규 값
        cooldown_seconds: uint32  // 쿨다운 기간
    }
    admin_signatures: [{
        pubkey: bytes(33)
        signature: bytes(64)      // ECDSA 서명
    }]
    quorum_threshold: uint8
    payload_hash: bytes(32)
}

4.3. UR Type 매핑

UR Type 용도 CBOR 태그
crypto-psbt BTC PSBT 전달 (표준) 310
crypto-eth-sign-request EVM 서명 요청 (표준) 401
dcent-sign-request D'CENT 확장 서명 요청 45001
dcent-policy-update 정책 업데이트 페이로드 45010
dcent-whitelist-verify 화이트리스트 검증 45020
dcent-config-update 설정 업데이트 45030

5. 인터페이스 3: 콜드월렛 (SE) → 오프라인 앱

5.1. SignResponse 메시지 구조

SE_SignResponse {
    header: MessageHeader
    status_code: uint8          // 상태 코드 (아래 표 참조)
    signature: {                // 성공 시에만 포함
        chain_type: uint8
        sig_bytes: bytes        // BTC: 64B Schnorr / EVM: 65B ECDSA (r,s,v)
        pubkey: bytes(33)       // 서명한 공개키
        derivation_path: bytes  // 사용된 키 파생 경로
    }?
    se_parse_hash: bytes(32)    // WYSIWYS 검증 해시 (SE 독립 파싱 결과)
    sign_counter: uint32        // SE 서명 카운터 (현재값)
    musig2_data: {              // MuSig2 Round 1 응답 (BTC)
        public_nonce: bytes(66) // 공개 Nonce
    }?
    error_detail: {             // 실패 시에만 포함
        error_code: uint8
        error_message: string?  // 선택적 에러 설명
        policy_info: {          // 정책 위반 시 상세
            violated_policy: uint8
            current_value: bytes(32)
            requested_value: bytes(32)
        }?
    }?
}

5.2. 상태 코드 체계

코드 범위 카테고리 코드 의미
0x00 성공 0x00 SUCCESS — 서명 완료
0x10-0x1F 사용자 거부 0x10 REJECTED_BY_USER — 물리 버튼 거부
0x11 CANCELLED_BY_TIMEOUT — 사용자 응답 타임아웃
0x20-0x2F 정책 위반 0x20 POLICY_AMOUNT_EXCEEDED — 건당 한도 초과
0x21 POLICY_WHITELIST_FAILED — 미등록 주소
0x22 POLICY_DAILY_LIMIT_EXCEEDED — 일일 한도 초과
0x23 POLICY_RATE_LIMIT_EXCEEDED — 서명 횟수 초과
0x24 POLICY_VERSION_MISMATCH — 정책 버전 불일치
0x25 POLICY_COOLDOWN_ACTIVE — 쿨다운 진행 중
0x30-0x3F WYSIWYS 0x30 WYSIWYS_HASH_MISMATCH — 해시 불일치 (자동 거부)
0x31 WYSIWYS_PARSE_FAILED — TX 파싱 실패
0x32 WYSIWYS_LOCKOUT — 연속 불일치 잠금 (24시간)
0x40-0x4F 파싱 에러 0x40 PARSE_FAILED — TX 데이터 파싱 불가
0x41 UNSUPPORTED_CHAIN — 미지원 체인
0x42 INVALID_DERIVATION_PATH — 잘못된 키 경로
0xF0-0xFF 시스템 0xFE INTERNAL_ERROR — SE 내부 오류
0xFF NOT_INITIALIZED — 정책/키 미설정

5.3. PolicyViolation 메시지

정책 위반 시 SE가 반환하는 상세 메시지:

PolicyViolation {
    header: MessageHeader
    violation_code: uint8       // 0x20-0x25
    violated_policy: uint8      // 위반 규칙 ID (0x01-0x04)
    requested_value: bytes(32)  // 요청된 값 (예: TX 금액)
    limit_value: bytes(32)      // SE 한도 값
    current_counter: uint32     // 현재 카운터 (일일/횟수)
    display_message: string     // 디바이스 화면 표시 메시지
}

5.4. UR Type 매핑 (응답)

UR Type 용도 CBOR 태그
crypto-psbt 서명된 PSBT 반환 (표준) 310
crypto-eth-signature EVM 서명 반환 (표준) 402
dcent-sign-response D'CENT 확장 서명 응답 45002
dcent-policy-violation 정책 위반 상세 45011
dcent-device-status 디바이스 상태 응답 45031

6. 인터페이스 4: 오프라인 앱 → 대시보드

6.1. 서명 결과 메시지

SignatureResult {
    header: MessageHeader
    chain_type: uint8
    request_id: bytes(16)       // 원본 요청 ID (매칭용)
    status: uint8               // SE 응답 상태 코드 전달
    signatures: [{              // 부분 서명 또는 완성 서명
        signer_pubkey: bytes(33)
        sig_bytes: bytes
        signer_index: uint8
        derivation_path: bytes
    }]
    se_parse_hash: bytes(32)    // SE 검증 해시 (대시보드에서 재확인)
    sign_counter: uint32
    musig2_nonces: [{           // MuSig2 Round 1 응답 (해당 시)
        signer_index: uint8
        public_nonce: bytes(66)
    }]?
}

6.2. 정책 위반 리포트

PolicyViolationReport {
    header: MessageHeader
    request_id: bytes(16)
    violation: PolicyViolation   // SE에서 반환한 위반 상세
    app_context: {
        app_version: string
        device_id: bytes(16)     // 콜드월렛 디바이스 식별자
        timestamp: uint32
    }
}

6.3. 에러 코드 및 응답 포맷

오프라인 앱 → 대시보드 에러:

코드 의미 처리
0x00 성공 서명 결과 처리
0x10-0x3F SE 에러 전달 SE 상태 코드 그대로 전달
0x80 QR_SCAN_FAILED QR 스캔 실패 — 재시도 안내
0x81 USB_COMM_ERROR USB-C 통신 오류 — 재연결 후 재시도 안내
0x82 SESSION_EXPIRED 서명 세션 만료 — 재요청 필요
0x83 DEVICE_NOT_FOUND 콜드월렛 미감지
0x84 APP_INTEGRITY_FAILED 앱 무결성 검증 실패

7. Data Flow Diagram (DFD)

7.1. Level 0: 시스템 컨텍스트

                    ┌───────────┐
                    │  사용자    │
                    │ (Initiator│
                    │ /Approver)│
                    └─────┬─────┘
                          │ HTTPS
                    ┌─────▼─────┐              ┌───────────────┐
                    │           │  JSON-RPC     │               │
                    │  온라인    │──────────────▶│  블록체인      │
                    │  대시보드  │◀──────────────│  네트워크      │
                    │           │              │               │
                    └─────┬─────┘              └───────────────┘
                          │ QR (에어갭)
                   ═══════╪═══════ TB-3 (에어갭 경계)
                          │
                    ┌─────▼─────┐
                    │           │
                    │  오프라인  │
                    │  서명 앱   │
                    │           │
                    └─────┬─────┘
                          │ USB-C (유선)
                   ───────┼─────── TB-4 (오프라인 서명 유닛 내부)
                          │
                    ┌─────▼─────┐
                    │           │
                    │  D'CENT X │
                    │  콜드월렛  │
                    │  (SE)     │
                    │           │
                    └───────────┘

7.2. Level 1: 트랜잭션 서명 플로우

┌──────────────────────────────────────────────────────────────────┐
│ DFD Level 1: 트랜잭션 서명                                        │
│                                                                   │
│  [사용자] ──TX 요청──▶ ┌─────────────────┐                        │
│                        │ 1.1 TX 생성     │                        │
│                        │ + 정책 검증     │                        │
│                        └────────┬────────┘                        │
│                                 │ 미서명 TX                       │
│                        ┌────────▼────────┐                        │
│                        │ 1.2 승인 관리   │                        │
│                        │ (M-of-N)        │                        │
│                        └────────┬────────┘                        │
│                                 │ 승인 완료 TX                    │
│                        ┌────────▼────────┐                        │
│  ═══════════ TB-3 ═══  │ 1.3 에어갭      │  ═══════════════════  │
│                        │ 전달 (QR)       │                        │
│                        └────────┬────────┘                        │
│                                 │ SignRequest                     │
│                        ┌────────▼────────┐                        │
│  ═══════════ TB-4 ═══  │ 1.4 서명 요청   │  ═══════════════════  │
│                        │ 중계 (USB-C)    │                        │
│                        └────────┬────────┘                        │
│                                 │ SE_SignRequest                  │
│                        ┌────────▼────────┐                        │
│                        │ 1.5 WYSIWYS     │                        │
│                        │ + HW 정책 검증  │                        │
│                        │ + SE 서명       │                        │
│                        └────────┬────────┘                        │
│                                 │ SE_SignResponse                 │
│                        ┌────────▼────────┐                        │
│  ═══════════ TB-4 ═══  │ 1.6 서명 반환   │  ═══════════════════  │
│                        │ (USB-C)         │                        │
│                        └────────┬────────┘                        │
│                                 │ SignatureResult                 │
│                        ┌────────▼────────┐                        │
│  ═══════════ TB-3 ═══  │ 1.7 서명 전달   │  ═══════════════════  │
│                        │ (QR)            │                        │
│                        └────────┬────────┘                        │
│                                 │                                 │
│                        ┌────────▼────────┐                        │
│                        │ 1.8 서명 취합   │                        │
│                        │ + 블록체인 전파  │                        │
│                        └────────┬────────┘                        │
│                                 │ TX Hash                         │
│  [사용자] ◀──확인 알림──       │                                  │
│  [블록체인] ◀──TX Broadcast──  │                                  │
└──────────────────────────────────────────────────────────────────┘

7.3. Level 2: 정책 업데이트 플로우

┌──────────────────────────────────────────────────────────────────┐
│ DFD Level 2: 정책 업데이트                                        │
│                                                                   │
│  [Admin 1] ──정책 변경 요청──▶ ┌──────────────┐                   │
│  [Admin 2] ──쿼럼 서명────────▶│ 2.1 정책     │                   │
│  [Admin 3] ──쿼럼 서명────────▶│ 변경 승인    │                   │
│                                └──────┬───────┘                   │
│                                       │ PolicyUpdate + 쿼럼 서명   │
│                                ┌──────▼───────┐                   │
│                                │ 2.2 정책     │                   │
│  ═══════════ TB-3 ═══         │ 페이로드     │  ═══════════════  │
│                                │ 에어갭 전달  │                   │
│                                └──────┬───────┘                   │
│                                       │ SE_PolicyUpdate           │
│                                ┌──────▼───────┐                   │
│  ═══════════ TB-4 ═══         │ 2.3 SE 수신  │  ═══════════════  │
│                                │ + 서명 검증  │                   │
│                                └──────┬───────┘                   │
│                                       │                           │
│                                ┌──────▼───────┐                   │
│                                │ 2.4 물리     │                   │
│                                │ 버튼 확인    │                   │
│                                └──────┬───────┘                   │
│                                       │                           │
│                                ┌──────▼───────┐                   │
│                                │ 2.5 쿨다운   │                   │
│                                │ 적용         │                   │
│                                │ (24시간 대기) │                   │
│                                └──────┬───────┘                   │
│                                       │ PolicyResponse            │
│                                ┌──────▼───────┐                   │
│  ═══════════ TB-4 ═══         │ 2.6 결과     │  ═══════════════  │
│                                │ 반환 (QR)    │                   │
│                                └──────────────┘                   │
└──────────────────────────────────────────────────────────────────┘

7.4. Level 2: 화이트리스트 동기화 플로우

┌──────────────────────────────────────────────────────────────────┐
│ DFD Level 2: 화이트리스트 동기화                                   │
│                                                                   │
│  [Admin] ──주소 추가/삭제──▶ ┌──────────────┐                     │
│                              │ 3.1 화이트    │                     │
│                              │ 리스트 관리   │                     │
│                              └──────┬───────┘                     │
│                                     │                             │
│                              ┌──────▼───────┐                     │
│                              │ 3.2 Merkle   │                     │
│                              │ Tree 재구성  │                     │
│                              │ + 새 Root    │                     │
│                              └──────┬───────┘                     │
│                                     │ New Root + Admin 서명       │
│                              ┌──────▼───────┐                     │
│  ═══════ TB-3 + TB-4 ═══    │ 3.3 에어갭   │  ═══════════════   │
│                              │ Root 전달    │                     │
│                              └──────┬───────┘                     │
│                                     │                             │
│                              ┌──────▼───────┐                     │
│                              │ 3.4 SE Root  │                     │
│                              │ 교체 + 버전  │                     │
│                              │ 증가         │                     │
│                              └──────────────┘                     │
│                                                                   │
│  서명 시: 오프라인 앱이 Merkle Proof를 SE에 함께 전달             │
│  SE는 Proof로 leaf 계산 → 저장된 Root와 대조                     │
└──────────────────────────────────────────────────────────────────┘

8. 메시지 버저닝 및 하위 호환성

8.1. 버전 관리 원칙

원칙 설명
Semantic Versioning Major.Minor 형식. Major 변경 = 호환 불가, Minor 변경 = 하위 호환
버전 필드 MessageHeader.version 필드로 메시지 버전 식별
새 필드 추가 Optional 필드로만 추가 (CBOR 맵에 새 키 추가) → 하위 호환 유지
필드 삭제 금지 — deprecated로 표시하되 파싱은 계속 지원
디코더 관용 알 수 없는 CBOR 키는 무시 (forward compatibility)

8.2. 버전 불일치 처리

상황 송신측 수신측 처리
Minor 불일치 (1.0 → 1.1) 신버전 구버전 새 Optional 필드 무시, 정상 처리
Minor 불일치 (1.1 → 1.0) 구버전 신버전 새 필드 부재 → 기본값 사용, 정상 처리
Major 불일치 (1.x → 2.x) 신버전 구버전 ERROR(0xFE) + VERSION_MISMATCH 반환
버전 필드 부재 비정상 정상 버전 0으로 간주, 기본 파싱 시도

8.3. 펌웨어 업데이트와 프로토콜 버전

SE 펌웨어 업데이트 시 프로토콜 버전이 변경될 수 있다. 오프라인 앱은 SE에 GET_STATUS 요청을 보내 지원 프로토콜 버전을 확인한 후, 해당 버전에 맞는 메시지 포맷을 사용한다.

DeviceStatusResponse {
    header: MessageHeader
    se_version: string          // SE 펌웨어 버전 (e.g., "1.2.0")
    protocol_version: uint8     // 지원 프로토콜 버전
    supported_chains: [uint8]   // 지원 체인 목록
    policy_version: uint32      // 현재 정책 버전
    sign_counter: uint32        // 서명 카운터
    cooldown_remaining: uint32  // 쿨다운 잔여 (초)
    locked: bool                // WYSIWYS 잠금 상태
}

9. Phase 3/4 인터페이스 참조 매핑

9.1. airgap-signing-flow.md 매핑

Phase 3 에어갭 단계 본 문서 인터페이스 데이터
→ (1) 대시보드 → 오프라인 앱 인터페이스 1 BTCSignRequest / EVMSignRequest
→ (2) 오프라인 앱 → 콜드월렛 인터페이스 2 SE_SignRequest
← (3) 콜드월렛 → 오프라인 앱 인터페이스 3 SE_SignResponse
← (4) 오프라인 앱 → 대시보드 인터페이스 4 SignatureResult

9.2. wysiwys-design.md 매핑

WYSIWYS 요소 인터페이스 위치 필드
APP_HASH 인터페이스 1/2 BTCSignRequest.app_hash, SE_SignRequest.app_hash
SE_PARSE_HASH 인터페이스 3 SE_SignResponse.se_parse_hash
해시 불일치 에러 인터페이스 3 status_code: 0x30 (WYSIWYS_HASH_MISMATCH)
파싱 실패 인터페이스 3 status_code: 0x31 (WYSIWYS_PARSE_FAILED)
잠금 상태 인터페이스 3 status_code: 0x32 (WYSIWYS_LOCKOUT)

9.3. hardware-policy-engine.md 매핑

HW 정책 요소 인터페이스 위치 필드
PolicyUpdate 구조체 인터페이스 2 SE_PolicyUpdate.policy_data
Admin 쿼럼 서명 인터페이스 2 SE_PolicyUpdate.admin_signatures
정책 위반 코드 (0x01-0x04) 인터페이스 3 PolicyViolation.violation_code
쿨다운 상태 인터페이스 3 DeviceStatusResponse.cooldown_remaining

본 문서는 Phase 5 System Architecture Design의 일부로, 3-Zone 보안 아키텍처(three-zone-security-architecture.md)의 Zone 경계 정의에 기반하여 인터페이스를 명세한다. 에어갭 통신 프로토콜(airgap-communication-protocol.md)에서 UR/CBOR/APDU 수준의 바이트 레벨 명세가 추가로 제공된다.


관련 문서