
Baochip-1x를 위한 암호화 프레임워크 시도.

이 프로젝트는 **오픈 발명 네트워크(OIN) Open Invention Network (OIN)**에 등록되어 있습니다. OIN은 방어적 특허 풀입니다: 회원들은 리눅스 관련 특허를 상호 라이선스하여 참여자들이 특허 노출을 줄이고 오픈소스 소프트웨어를 배포 및 사용할 수 있도록 합니다.
상태: 테스트를 위한 하드웨어 도착 대기 중. https://www.crowdsupply.com/baochip/dabao/updates/our-campaign-has-launched
Baochip-1x (Dabao 평가 보드) 장치를 위한 펌웨어로, Xous 마이크로커널에서 실행되며 riscv32imac-unknown-none-elf용으로 빌드되었습니다.
위치는 다음과 같습니다: https://www.baochip.com/
이 장치는 Nitrokey급 장치와 동일한 범주의 하드웨어 보안 토큰으로, OpenPGP 스마트카드급 동작과 암호화된 금고를 갖추고 있습니다. 전체 하드웨어 스택 (RTL, 회로도, 부트로더, OS)은 오픈소스이며 감사 가능합니다.
하드웨어 사양, 부트 모델, 요구 사항 테이블, ComboHash/PKE 사용법은 **Supermagnum/Baochip-1x-firmware**에 문서화되어 있습니다. Dabao 평가 보드 (KiCad, 회로도, 스위치, 핀아웃)는 **baochip/dabao**에 있습니다. 플래싱을 위해 부트로더 모드로 들어가려면 SW2를 눌러 전환하십시오 (해당 저장소의 회로도 참조). 이 저장소의 아키텍처 노트: docs/ARCHITECTURE.md.
Galdra 호스트 도구는 수신자(연락처)의 로컬 SQLite 디렉터리를 유지합니다. 각 저장된 신원에는 공개 키 자료와 선택적 사이드카 레이블(아래 표 참조)이 포함됩니다. 이러한 태그는 호스트 데이터베이스에 있으며, Galdra 키의 경우 온칩 연락처 저장소(crates/contact-store)에 있습니다. 직접 정렬하지 않는 한 OpenPGP 사용자 ID에 마법처럼 바인딩되지 않으며, 대역 외로 확인하지 않는 한 암호화 방식으로 단정되지 않습니다. 선택적 **galdra keyserver push**는 내보낸 공개 키와 함께 중첩된 필드를 JSON으로 프로젝트 레지스트리에 보낼 수 있습니다. 토큰의 필드별 출처는 SelfAttested, HostVerified, RegistrySync, OobVerified를 사용합니다 (메타데이터 비교 (GnuPG vs Galdra) 및 docs/RRAM_LAYOUT.md의 연락처 저장소 레이아웃 참조).
호스트 측 세부 사항 및 CLI 동작: docs/GALDRA-TOOL.md. 와이어 레이아웃 및 슬롯 수: crates/contact-store/src/layout.rs 및 docs/RRAM_LAYOUT.md.
이 펌웨어는 Baochip-1x용 하드웨어 보안 토큰입니다: USB CCID를 통한 OpenPGP 카드 애플리케이션으로, 장치 내 금고, PIN 정책, 저장소별 기능 (암호 프로필 — 하나의 캐스케이드에 최대 4개의 서로 다른 대칭 암호를 쌓을 수 있으며, 각각 자체 파생 키가 있음; 키 기능 참조), 샤미르 관련 흐름, 구현된 경우 인증된 임시 ECDH, Galdra 호스트 도구를 포함합니다. 주요 상호 운용성 대상은 시장의 모든 토큰 프로토콜이 아닌 GnuPG 스타일 OpenPGP 카드 사용입니다.
이 펌웨어는 다음이 아닙니다:
동일한 제약 조건과 일치하는 크레이트 수준의 제외 항목은 docs/future-todo.md의 **명시적으로 제외된 크레이트**에 나열되어 있습니다.
CESS: 이 펌웨어는 트리 내에 구현된 표준 구조( Mode A 외부 AEAD, **K_outer**용 HKDF-BLAKE3, 바이트 단위 GF(2^8) 샤미르 분할 포함)에 대해 CESS를 준수합니다. 전체 적합성 설명, 편차 등록부 및 인증 수준(예: 전체 고정 계층의 경우 CESS-CORE)은 docs/CESS_CONFORMANCE.md 및 아래 CESS (관련 오픈 표준)에 문서화되어 있습니다.
OpenPGP / CCID 애플리케이션 로직은 **crates/usb-personality**에 있습니다. Xous에서 CCID를 노출하는 USB 서비스는 usb-bao1x (xous-core 체크아웃 내)이며, ccid-openpgp 기능으로 빌드되고 OpenPGP RRAM 윈도우 및 프로비저닝에 **crates/baochip-openpgp**를 사용합니다. 레이아웃: docs/RRAM_LAYOUT.md. 생산 전 격차 (운영자 PIN UX, 플랫폼 맵 서명): 알려진 제한 사항/미해결 작업.
전반적인 목표는 완전하고 테스트된 오픈소스 하드웨어 보안 토큰 펌웨어를 유지하는 것입니다: CCID를 통한 GnuPG용 OpenPGP 카드 스타일 동작 (OpenPGP 및 GnuPG 호환성 참조)에 더해 OpenPGP 카드 표준에 현재 정의되지 않은 추가 장치 내 기능 — 전방향 비밀성을 갖춘 임시 ECDH, 샤미르 K-of-N, 암호에 구애받지 않는 프로필, microSD 유인 볼륨 — 이 표준과 펌웨어별 기능에 요약되어 있습니다. 모두 재현 가능한 부트로더를 갖춘 오픈 RTL에서 실행됩니다.
Baochip-1x용 출하 가능 펌웨어는 Ed25519로 서명됩니다. Ed25519 개인 키로 펌웨어 이미지에 서명하며; GnuPG는 Ed25519 서명 하위 키를 사용하여 **gpg --sign**으로 이를 수행할 수 있습니다 (일반적인 OpenPGP 분리 서명 워크플로로, 빌드가 생성하는 모든 패키징에 맞게 조정됨). SoC의 불변 boot0 ROM은 다음 단계 — boot1 — 이 실행되도록 허용되기 전에 장치에 구워진 해당 공개 키(및 부트 체인의 더 넓은 키 매니페스트)에 대해 해당 서명을 검증합니다. 그런 다음 boot1은 서명된 애플리케이션 이미지(예: 부트로더 모드에서 USB 대용량 저장소를 통해 전달되는 UF2 blob)를 로드합니다. 기본 부품은 4개의 온칩 Ed25519 공개 키(코드 배포, 베타, 개발자 등의 역할)를 포함합니다; boot0/boot1은 Baochip과 타사 서명 키 간의 상호 불신 정책을 강제합니다. 전체 부트 흐름, UF2 전달, 콘솔, boot1 업데이트 및 보안 모델: xous-core의 Baochip 대상 시작하기.
모든 명령어에서 모든 테스트가 실행되는 것은 아닙니다; 의도된 것입니다.
xtask가 기본 워크스페이스 테스트에 포함되지 않음: 일반적인 방법은 cargo test --workspace --exclude xtask입니다. xtask는 빌드 오케스트레이션 크레이트이기 때문입니다. 해당 테스트를 원할 때는 cargo test -p xtask를 실행하세요.#[ignore]로 표시된 테스트: --ignored(및 필요한 크레이트 필터)를 전달하지 않으면 건너뜁니다. 이유: 포커스된 단위 테스트에서 이미 수행된 적용 범위(예: 드롭 후 제로화), 느린 경우(예: RSA 키 생성), 연결된 장치나 픽스처가 필요한 galdra와 같은 호스트 도구의 하드웨어 또는 토큰 종속 흐름.test-all --no-fuzz: CI나 빠른 실행을 짧게 유지하고 해당 단계에 nightly 툴체인이 필요하지 않도록 cargo-fuzz 단계를 건너뜁니다; --no-fuzz 없이 cargo run -p xtask -- test-all을 실행하거나 퍼즈 대상을 별도로 호출하세요 (fuzz/README.md 참조).또한 PR이 닫힐 때 이를 통해 크레이트의 무결성을 확인할 수 있습니다: https://github.com/rust-lang/cargo/issues/16850
상태: 실제 하드웨어에서 인간에 의한 테스트 준비 완료 — 프로덕션 준비 릴리스는 존재하지 않음. 검증되고 감사된 암호화 크레이트를 사용하여 Rust로 작성되었습니다. 암호화 기본 요소는 감사된 워크스페이스 의존성에서만 가져옵니다. 포스트퀀텀 알고리즘은 기능 게이트되어 있으며 독립 감사 대기 중으로 표시됩니다. 포스트퀀텀 상태를 참조하세요.
참고: 이 프로젝트의 일부는 AI 지원(Claude, Anthropic)으로 개발되었습니다. 설계, 암호화 선택 및 보안 결정은 전문 암호학자에 의해 검토되지 않았습니다. 이 프로젝트를 실험적인 것으로 취급하고 자신의 비판적 판단을 적용하십시오. 프로덕션 배포 전에 독립적인 전문가 검토를 강력히 권장합니다.
인간에 의한 테스트 준비가 되었습니다. 이 소프트웨어의 빌드 또는 실행 여부는 여러분이 결정합니다; 단위 테스트, 퍼징 및 기타 검사에서 찾지 못한 버그가 있을 수 있습니다. 실험을 위해 선택적 가상 머신을 사용하면 호스트 시스템에 대한 위험이 줄어들지만 완전히 제거되지는 않습니다. 자세한 결과는 테스트 결과(docs/TEST_RESULTS.md#run-metadata)에 있습니다. 기술 용어의 평이한 정의(A–Z): 용어 사전.
주요 개발자는 난산증과 관련된 신경학적 상태를 가지고 있습니다. 난산증은 수 감각 및 관련 기호 처리에 영향을 미쳐, 그들에게 전통적인 프로그래밍 — 유일한 워크플로로서 수동 코드 편집 — 을 보조 도구(예: 대화형 AI 편집기) 없이 작동 불가능하게 만듭니다. 이러한 제약은 정확성과는 별개입니다: 검토자는 이 페이지의 다른 곳에 문서화된 테스트, 퍼징 및 독립 감사를 여전히 평가해야 합니다.
Galdralag를 검토하는 암호학자나 진지한 구현자는 일반적으로 산문을 읽기 전에 crates/vault/tests/ 및 crates/cipher-profile/tests/를 엽니다. 테스트 스위트는 작업 증명입니다: 서술만으로 대체할 수 없는 도메인 지식을 인코딩합니다.
그렇다고 해서 다른 모든 사람들로부터 요점을 숨겨야 하는 이유는 아닙니다. 조달을 위해 프로젝트를 평가하는 사람들, 기여 여부를 결정하는 사람들, 또는 암호화 테스트 방법론에 대한 깊은 교육 없이 코드를 배송하는 사람들은 여전히 구체적인 증거에 대한 포인터를 받을 자격이 있습니다.
확인할 사항: 적합성 자료에는 crates/vault/tests/rfc_vectors/ 아래의 ChaCha20-Poly1305에 대한 RFC 8439 작업 예제, crates/vault/tests/data/wycheproof/ 아래의 ChaCha20-Poly1305 및 Brainpool ECDH/ECDSA 엣지 케이스에 대한 vendored Wycheproof JSON, crates/vault/tests/bsi_vectors/ 아래의 BrainpoolP256r1 및 P384r1에 대한 BSI TR-03111 벡터, crates/vault/tests/blake3_vectors.json 아래의 공식 BLAKE3 참조 벡터(모든 35개 입력 길이, 모든 세 가지 모드), crates/vault/tests/twofish_vectors.json 아래의 Twofish 사양 벡터(Monte Carlo 포함 1203개 사례), crates/cipher-profile/tests/fixtures/cascade_cess_kat.json 아래의 독립적으로 검증된 중간값이 있는 프로젝트 자체 CESS 캐스케이드 KAT 픽스처가 포함됩니다. 이들은 함께 실행자와 검토자가 cargo test --workspace 및 python3 scripts/verify_cascade_kats.py로 실행할 수 있는 근본 진실입니다.RFC 8439는 IETF(Internet Engineering Task Force)에서 발행한 문서로, 인터넷 상호 운용성의 많은 부분을 표준화하는 조직입니다. RFC(Request for Comments)는 프로토콜 및 많은 암호화 사양의 일반적인 형식입니다. RFC 8439는 ChaCha20-Poly1305 인증 암호화(Daniel Bernstein의 설계를 기반으로 함)를 정의하고, 특정 입력과 예상 출력을 포함한 구체적인 작업 예제를 제공하여 독립적인 구현이 바이트 단위로 일치하는지 확인할 수 있도록 합니다. RFC의 부록 예제에는 '99학번 신사숙녀 여러분: 자외선 차단제를 바르세요로 시작하는 널리 재현된 평문이 포함되어 있습니다. 코드가 AEAD 출력을 정확히 재현한다면 구성을 올바르게 구현했다는 강력한 확인이 됩니다. 이는 공식 정답지의 암호학적 유사체입니다. ChaCha20-Poly1305는 이 펌웨어의 모든 다중 계층 캐스케이드 프로필의 내부 계층이므로, 이 확인은 전체 암호 스택의 기초에 자리잡고 있습니다.
Wycheproof는 Google 보안 팀(2017년)이 공개한 테스트 코퍼스입니다. 이름은 호주에 있는 Mount Wycheproof(종종 세계에서 가장 작은 산으로 인용됨)에서 유래했는데, 이 프로젝트가 작지만 치명적인 장애물(정수 오버플로, 경계 사례, 잘못된 입력, 변조된 인증 태그 등)을 제거하는 데 초점을 맞추고 있기 때문입니다. 이러한 실패는 실제 배포된 암호화에서 반복적으로 나타납니다. 이는 RFC 스타일의 벡터를 보완합니다. RFC 8439 스타일 예제는 게시된 AEAD에 대한 정확성을 입증하고, Wycheproof는 구현이 역사적으로 실패하는 지점에서 견고성을 강조합니다. 이 저장소에서 Wycheproof JSON은 ChaCha20-Poly1305, AES-GCM, HMAC, HKDF, X25519, Ed25519, RSA 및 Brainpool ECDH/ECDSA 변형을 다룹니다.
BSI TR-03111은 독일 연방정보보안청(Bundesamt für Sicherheit in der Informationstechnik)이 발행한 타원 곡선 암호화에 대한 기술 지침입니다. 버전 2.10이 최신 개정판입니다. 이 펌웨어에서 사용되는 Brainpool 곡선(P256r1 및 P384r1)은 BSI 표준에 지정되어 있으므로 TR-03111은 테스트 벡터의 자연스러운 참조입니다. 각 곡선은 ECDH 및 ECDSA 적용 범위를 가지며, ECDSA 서명은 cryptography 라이브러리를 사용하는 독립적인 Python 구현에 대해 추가로 교차 확인되었습니다.
BLAKE3 참조 벡터는 BLAKE3 사양과 함께 저자가 공개한 공식 테스트 코퍼스입니다. 0바이트에서 102400바이트까지 35개의 입력 길이를 다루며, 특히 짧은 입력 테스트에서 보이지 않는 모든 내부 청크 및 트리 해싱 경계 조건을 실행하도록 선택되었습니다. 기본 해시, 키 해시, 파생 키의 세 가지 BLAKE3 모드가 모두 포함됩니다. BLAKE3는 이 펌웨어 전체에서 HKDF 키 파생 및 캐스케이드 암호 프로필의 계층 간 무결성 검사에 사용됩니다. 경계 커버리지가 중요한 이유는 BLAKE3의 트리 구조가 1024바이트 이상에서만 활성화되기 때문입니다.
테스트 스위트는 공급망 변조 탐지이기도 합니다. 이 펌웨어의 모든 암호화 기본 요소는 감사된 RustCrypto 크레이트에서 가져옵니다. 자체 암호화 구현은 없습니다. 위의 컨펌 벡터는 cargo test --workspace를 실행할 때마다 해당 크레이트에 대해 실행되므로, 변조되거나 대체된 종속성이 있으면 손상된 코드가 배포 시스템에 도달하기 전에 알려진 답안 테스트 실패가 발생합니다. python3 scripts/verify_cascade_kats.py는 두 번째 독립적인 경로를 추가합니다. Python 구현이 캐스케이드 KAT 픽스처에서 동일한 중간 값을 확인하므로, 잘못된 출력을 생성하는 손상된 Rust 도구 체인도 교차 검사에 의해 포착됩니다. 이는 C 라이브러리에 바인딩하는 것보다 훨씬 강력한 공급망 무결성 스토리입니다. C 라이브러리의 경우 모든 내부 작업을 동등하게 확인하려면 훨씬 더 많은 노력과 전문 도구가 필요하기 때문입니다.
이제 독자가 이러한 주장이 거짓인지 아닌지 판단할 차례입니다.
USB 포트에 꽂으면 됩니다. 호스트 관점에서 펌웨어는 암호 모드 또는 위장 모드로 표시될 수 있습니다. 암호 모드에서는 컴퓨터가 스마트 카드를 인식합니다. GnuPG 또는 호환되는 OpenPGP 스택(GnuPG란 무엇인가?)을 사용하면 다른 하드웨어 보안 토큰과 동일한 방식으로 사용할 수 있습니다. 토큰은 중요한 암호화 작업을 처리하므로 개인 키가 컴퓨터에 보호되지 않은 상태로 존재하지 않습니다. 위장 모드에서는 일반적인 이동식 저장 장치로 열거될 수 있으며, 무해해 보이는 파일을 표시하여 빠른 검사에서 실제 역할을 드러내지 않도록 합니다. 아래의 저장소 위장을 참조하세요.
GnuPG는 GNU Privacy Guard의 약자입니다. 이는 GNU 프로젝트의 OpenPGP 구현으로, 키 관리 및 암호화된 메시지를 위한 개방형 표준입니다(PGP와 같은 개념적 계열이지만 RFC 4880 및 커뮤니티 업데이트와 같은 문서에 명시됨). 일반적으로 Linux, BSD, macOS 또는 Windows에서 gpg 명령으로 실행합니다. 많은 그래픽 메일 및 키 유틸리티가 내부적으로 이것을 래핑합니다.
사람들은 GnuPG를 다음과 같은 용도로 사용합니다.
gpg-agent**가 스마트 카드 또는 로컬 키스토어에서 인증 키를 노출할 때.GnuPG와 암호화된 드라이브 (LUKS). Linux에는 LUKS라는 전체 드라이브나 파티션을 암호화하는 기본 제공 방법이 있습니다. 드라이브가 암호화되면 키가 없는 사람에게는 의미 없는 노이즈처럼 보이므로 분실되거나 도난당한 노트북이 파일을 넘겨주지 않습니다.
일반적으로 이러한 드라이브는 비밀번호를 입력하여 잠금 해제합니다. GnuPG를 사용하면 토큰을 대신 사용할 수 있습니다. 아이디어는 간단합니다. 드라이브의 잠금 해제 키 자체가 토큰의 키로 잠겨 있습니다. 드라이브를 열려면 토큰이 연결되어 있고 PIN을 입력한 경우에만 토큰이 해당 잠금 해제 키를 해독합니다. 토큰을 빼면 동일한 컴퓨터에서도 드라이브를 전혀 열 수 없습니다.
즉, 이는 토큰을 암호화된 드라이브의 물리적 키로 바꿉니다. 설정(및 토큰을 분실한 경우를 대비한 백업 방법 추가)은 Linux 자체 디스크 도구로 수행됩니다. 토큰은 단순히 키를 보유합니다. 여러 사람이 드라이브 잠금 해제 권한을 공유하여 단 한 사람이 혼자 할 수 없도록 하려면 샤미르 비밀 공유와 드라이브 암호화를 참조하세요.
기본적으로 GnuPG는 ~/.gnupg 아래에 키를 저장합니다. OpenPGP 스마트 카드를 사용하면 중요한 개인 키가 카드에 상주합니다. scdaemon(GnuPG 제품군의 일부)은 CCID/USB를 통해 카드와 통신하고, **gpg**는 호스트에서 OpenPGP 패킷을 조립합니다.
사용할 수 있는 것. 암호 모드에서 토큰은 다른 OpenPGP 스마트 카드와 동일한 작업을 위해 설계되었습니다. 메일 및 파일 서명 및 복호화, 인증(예: 평소처럼 gpg-agent를 사용할 때 SSH), 그리고 장기 개인 키를 입력하는 컴퓨터에서 멀리 유지하는 것입니다. 조직은 이를 토큰의 샤미르 공유와 결합하여 단 한 사람이 전체 비밀을 보유하지 않도록 할 수 있습니다(아래에서 자세히 설명). GnuPG는 호스트의 기본 상호 운용성 대상입니다. 이 펌웨어는 CCID를 통해 OpenPGP 카드 애플리케이션을 구현하며, scdaemon이 이를 구동합니다(gpg --card-status, gpg --card-edit, 카드의 키를 사용한 일반적인 암호화/서명/복호화). 동일한 스마트 카드 프로토콜을 사용하는 다른 소프트웨어도 작동할 수 있습니다. 명령, 슬롯, 알고리즘 및 현재 통합 제한 사항은 OpenPGP 및 GnuPG 호환성에 있습니다. NFC가 하드웨어에서 지원될 때(계획된 통합 — 아직 펌웨어에 없음), 동일한 디바이스 클래스는 물리적 접근을 지원할 수 있습니다. 문, 게이트 또는 잠금 패널의 NFC 리더기에 접촉하면 암호화 검사 후에만 잠금을 해제하는 정책에 참여할 수 있습니다(종종 배포에 따라 PIN, 생체 인식 또는 샤미르 쿼럼과 결합). 리더기 및 패널용 PN532 중심 스케치는 docs/NFC_PN532_INTEGRATION.md에 있습니다.
이것이 짧은 버전입니다. 다음은 다른 토큰과 차별화되는 점입니다.
저장소 위장. 디바이스는 일반 이동식 저장 장치로 작동하여 빠른 검사에서 실제 역할이 드러나지 않도록 할 수 있습니다. 일반적인 컴퓨터에 연결하면 일반 USB 드라이브 또는 SD 기반 볼륨처럼 표시될 수 있습니다. 눈에 띄지 않는 일상적인 파일(예: 휴가 사진)로 보이는 파일 시스템을 채울 수 있으므로, 대충 살펴보면 단순한 저장소라는 인상을 강화합니다. 이는 책상이나 검문소에서의 표면 검사를 방해합니다. 실제로 보안 토큰이라는 것을 알아내려면 일반적으로 하우징을 분해해야 하며, 단순히 연결하는 것만으로는 알 수 없습니다.
키는 디바이스에 남아 있습니다. 이메일에 서명하거나 파일을 복호화할 때 개인 키는 토큰을 떠나지 않습니다. 컴퓨터가 데이터를 보내면 토큰이 작업을 수행하고 결과가 반환됩니다. 컴퓨터를 손상시킨 공격자는 유용한 정보를 얻을 수 없습니다.
과거 세션은 토큰이 도난당하더라도 안전합니다. 대부분의 하드웨어 토큰은 키 교환에 장기 개인 키를 직접 사용합니다. 이 토큰은 각 세션에 대해 새로운 일회용 키 쌍을 생성하고, 장기 키로 서명하여 진위를 증명한 후 실제 교환에 일회용 쌍을 사용합니다. 누군가 몇 년 후에 토큰을 도난당해 장기 키를 추출하더라도 과거 세션의 어떤 것도 복호화할 수 없습니다. 이 속성을 전방향 비밀성(forward secrecy)이라고 하며, 하드웨어 토큰에서는 드뭅니다.
여러 사람 간에 키를 분할할 수 있습니다. 토큰은 장기 키를 N개의 공유로 나누어 재구성에 K개의 공유가 필요하도록 할 수 있습니다. 그러나 단일 공유 보유자는 혼자 아무것도 할 수 없습니다. 이를 샤미르 비밀 공유(Shamir secret sharing)라고 합니다. 이는 단일 개인이 단독 접근 권한을 가져서는 안 되는 조직 키나, 공유를 별도 위치에 저장하는 백업 전략에 유용합니다. 이 역시 하드웨어 토큰에서는 드뭅니다.
암호화는 계층화되어 있습니다. 토큰은 단일 암호로 데이터를 암호화하는 대신, 여러 독립적인 암호를 순차적으로 실행할 수 있습니다(예: ChaCha20, Serpent, Twofish). 각각 별도로 파생된 키를 사용합니다. 하나의 암호를 깨는 미래의 돌파구가 다른 암호를 깨지는 않습니다. 특정 조합을 암호 프로필(cipher profile)이라고 하며, 상황에 필요한 주의 수준에 따라 여러 내장 프로필 중에서 선택할 수 있습니다.
개인적인 권장 사항은 BrainpoolP256r1 + ChaCha20-Poly1305 + BLAKE3입니다. 이것은 내장된 standard 프로필입니다. 일회성 키 교환에는 BSI Brainpool P-256 곡선을, 대칭 암호화에는 ChaCha20-Poly1305를, 키 파생 및 계층 간 무결성에는 BLAKE3를 사용합니다. 빠르고, 잘 테스트되었으며, 배터리 친화적이고(ChaCha20-Poly1305는 AES 가속 없는 하드웨어에서 효율적으로 작동하도록 설계되어 CPU 시간과 호스트 전력 소비를 줄입니다. P-256은 이 펌웨어의 세 Brainpool 곡선 중 가장 작습니다), NIST가 설계한 기본 요소에 의존하지 않습니다. 단일 암호에 대한 미래의 암호분석적 돌파에 대비해 더 높은 마진이 필요하다면 conservative 프로필이 Serpent-256 계층을 추가합니다.
알고리즘 선택은 의도적입니다. 사용된 암호(ChaCha20-Poly1305, Serpent, Twofish, Camellia)는 모두 정부 표준 기관과 독립적으로 설계되었습니다. AES와 NIST 제품군은 의도적으로 제외되었습니다. 이는 단일 국가의 표준화 프로세스로부터 암호학적 독립성을 원하는 사용자 및 조직을 위한 의식적인 선택입니다. Camellia는 EU NESSIE 프로젝트와 일본의 CRYPTREC 프로그램에 의해 독립적으로 평가되었으며, RFC 3713 및 ISO/IEC 18033-3에 명시되어 있습니다.
잘못된 PIN은 적절하게 잠금 처리됩니다. 토큰은 PIN이 올바른지 확인하기 전에 실패한 PIN 시도 횟수를 계산하며, 그 후가 아닙니다. 이는 시도 중에 충돌이나 전원 손실이 발생해도 카운터를 재설정하는 데 악용될 수 없음을 의미합니다. 너무 많은 잘못된 시도 후에는 토큰이 민감한 자료를 삭제합니다.
아직 하지 않는 것. 아직 사용 가능한 하드웨어가 없습니다. 이것은 활발히 개발 중인 펌웨어입니다. 실제 USB 하드웨어 및 GnuPG를 사용한 종단간 테스트는 향후 마일스톤입니다. NFC 전송 및 도어 스타일 접근 리더기는 문서에서 통합 대상으로 설명되어 있지만, 아직 출하된 동작은 아닙니다. 문서에 설명된 생체 인식 제3 요소는 아직 구현되지 않았습니다. 실제 하드웨어가 필요한 일부 타이밍 부채널 테스트는 디바이스가 존재할 때까지 완료할 수 없습니다.
Galdralag는 한 번에 두 가지 다른 종류의 비대칭 키와 함께 작동할 수 있습니다. 이들은 디바이스와 호스트에서 다른 질문에 답하며, 동일한 사람에게 속하더라도 상호 교환할 수 없습니다. OpenPGP 및 GnuPG 호환성, 신뢰의 망과 키 서명 파티, Galdra 연락처 메타데이터, 메타데이터 비교 (GnuPG vs Galdra) 섹션에서 각 스택을 더 자세히 설명합니다. 여기서는 일상적인 용어로 어떻게 다른지 설명합니다.
OpenPGP 키(GnuPG가 생성하고 사용하는 의미)는 구조화된 패킷이지, 단순한 공개 숫자가 아닙니다. 기본 키, 서명 및 암호화용 하위 키, 그리고 하나 이상의 사용자 ID(일반적으로 표시 이름과 이메일 주소(예: Alice Example <[email protected]>)를 묶습니다. 다른 사람들은 해당 사용자 ID에 서명하여 신원 주장이 진짜라고 믿는다는 것을 표시할 수 있습니다. 이 사회적 그래프는 이 README의 뒷부분에 있는 신뢰의 망과 키 서명 파티에 설명된 신뢰의 망의 기초입니다. Galdralag가 OpenPGP 스마트카드로 작동할 때는 개인 키 자료를 칩에 보관하고 서명 및 복호화를 수행합니다. 공개 키, 사용자 ID 및 다른 사람의 서명은 호스트에 있으며 평소처럼 GnuPG로 관리됩니다. 토큰은 전선상의 OpenPGP 메시지 형식을 변경하지 않습니다. GnuPG는 다른 OpenPGP 카드처럼 취급합니다.
Galdra 키는 순수한 비대칭 키 쌍(Ed25519, X25519, 또는 펌웨어가 지원하는 Brainpool 또는 NIST 곡선 중 하나)입니다. 키 바이트 자체에는 어떤 신원 주장도 포함되지 않습니다. 사용자 ID 패킷, 내장된 이메일, 키 구조에 첨부된 신뢰의 망 서명이 없습니다. Galdra 키의 신원은 키 구조에 첨부된 것이 아니라 호스트 SQLite 데이터베이스와 칩 내 연락처 저장소에 키 옆에 저장된 연락처 레코드에서 비롯되며, 지문으로 키에 연결됩니다.
아래 표는 신원 및 연락처 메타데이터를 필드별로 비교합니다. OpenPGP / GnuPG 열은 일반 인증서 및 사용자 ID(동일한 디렉토리에 OpenPGP 공개 키를 저장할 때 Galdra의 선택적 호스트 측 연락처 행 포함)에서 얻을 수 있는 것을 설명합니다. Galdra 키 열은 운영 연락처를 위한 구조화된 사이드카 필드(전체 호스트 및 칩 상세 정보는 Galdra 연락처 메타데이터 참조)를 설명합니다. 대시는 해당 스택에 해당 항목에 대한 표준적인 별도 필드가 없음을 의미합니다.
OpenPGP는 이름과 이메일을 하나의 사용자 ID 문자열에 넣습니다. 기계가 읽을 수 있는 별도의 콜사인, DMR 또는 우편 필드를 제공하지 않습니다. Galdra는 이러한 항목을 명명된 열로 유지하여 무선 및 운영 팀이 인증서 텍스트를 구문 분석하지 않고도 검색하고 표시할 수 있도록 합니다.
BrainpoolP512r1을 제공한 펌웨어에서 업그레이드된 토큰은 GET DATA에서 여전히 P-512 속성을 반환할 수 있습니다. 해당 슬롯의 GnuPG 작업은 일반 카드 오류와 함께 실패합니다. galdra device status를 실행하거나 docs/OPENPGP_CARD.md를 참조하여 오래된 슬롯을 식별하십시오. 제거 배경은 CHANGELOG.md에 있습니다.
| PW1 / PW3 | 저장되지 않음 | 칩에서 검증 (최소 5자, 기본 3회 시도) |
| 카드 소유자 DO (로그인, 언어, URL, …) | GnuPG가 캐시 | 선택 사항 (DO당 최대 254 바이트) |
카드 애플리케이션 3.4.1, CCID 및 GnuPG 워크플로우: docs/OPENPGP_CARD.md 및 OpenPGP 및 GnuPG 호환성.
이러한 분리가 존재하는 이유는 Galdralag가 대상으로 하는 커뮤니티에서 중요한 신원 정보(콜사인, DMR ID, 무선 네트워크 소속)가 OpenPGP 사용자 ID에 자연스럽게 들어갈 자리가 없기 때문입니다. 사용자 ID는 이름과 이메일을 위한 것입니다. 사용자 ID 문자열에 LA5XYZ <[email protected]> DMR:2345678과 같이 작성하는 것은 비공식적이고 구조화되지 않았으며 표준적인 방법으로 기계가 읽을 수 없습니다. Galdra 키는 암호화 자료를 깨끗하게 유지하고 운영 신원을 호스트 도구와 칩 내 저장소가 기본적으로 이해하는 레코드 형식에 저장합니다.
실제로 단일 디바이스는 충돌 없이 두 가지 유형의 키를 모두 보유할 수 있습니다. OpenPGP 카드 애플리케이션은 표준 SIG, DEC 및 AUT 슬롯을 통해 GnuPG를 제공합니다. 연락처 저장소는 운영 작업(예: 콜사인으로 무선 연락처 암호화, DMR 가입자 ID로 메시지 확인, 배지 번호로 동료 조회)을 위해 Galdra 키를 보유합니다. 두 경로는 서로 간섭하지 않습니다.만약 누군가 호스트에서 GnuPG로 관리되는 OpenPGP 인증서 와 온칩 연락처 저장소에 있는 Galdra 키를 가지고 있다면, 이들은 두 개의 서로 다른 키이며 두 개의 서로 다른 지문을 가집니다. G: 접두사가 붙고 원시 공개 키 바이트에서 BLAKE3로 파생된 Galdra 지문은 그 사람의 GnuPG 인증서의 OpenPGP v4 지문과 동일하지 않습니다. 호스트 도구와 장치는 이들을 독립적인 신원으로 취급합니다. 둘 다 확인하지 않고 한 지문이 다른 지문을 암시한다고 가정하지 마십시오.
어느 키 유형도 자동으로 그 주변의 레이블을 보증하지 않습니다. OpenPGP 사용자 ID는 다른 사람이 서명하기 전까지는 자체 주장에 불과합니다. Galdra 연락처 레코드의 콜사인 또는 DMR 필드는 그 출처(키서버 가져오기, 수동 입력, 또는 직접 수행한 대역외 확인)만큼만 신뢰할 수 있습니다. 출처 레이블(SelfAttested, HostVerified, RegistrySync, OobVerified)은 필드가 어떻게 도착했는지를 기록합니다. 이들이 관심 있는 신원을 실제로 확인하는 작업을 대체하지는 않습니다.
이 펌웨어는 Rust로 작성되었습니다. Rust는 C나 C++만큼 빠르고 저수준이면서도 근본적으로 다른 안전성 접근 방식을 가진 시스템 프로그래밍 언어입니다.
업계 코드베이스에서 보안 관련 버그의 상당 부분은 메모리 안전성 위반(버퍼 오버플로, use-after-free, 널 역참조 등)에서 비롯됩니다. Microsoft의 MSRC는 반복적으로 보고하기를 자사 제품에서 해결된 CVE의 약 **70%**가 이 범주에 속한다고 합니다. Chrome 팀도 Chrome에 대해 비슷한 비율을 발표했습니다. 이 수치는 해당 벤더의 제품을 설명하는 것이지 모든 펌웨어에 대한 보편적인 법칙은 아니지만, 메모리 안전 언어가 중요한 이유를 보여줍니다.
안전한 Rust(기본값)에서는 대여 검사기가 컴파일 타임에 데이터 경합과 일반적인 정의되지 않은 동작 메모리 오류를 가비지 컬렉션에 의존하지 않고 배제합니다. 안전하지 않은 Rust 및 C로의 FFI는 여전히 메모리 버그를 유발할 수 있으므로 작게 유지하고 검토해야 합니다.
Rust의 경계 검사와 소유권 규칙은 C/C++ 임베디드 코드에서 흔한 여러 종류의 실패 모드를 줄여줍니다:
unsafe 블록은 명시적이어야 합니다. MMIO 및 레지스터용 원시 포인터는 여기에 있으므로 검토자는 감사 표면을 grep할 수 있습니다(unsafe가 잘못된 MMIO를 불가능하게 만들지는 않으며, 국소화를 더 쉽게 할 뿐입니다).Rust는 그 자체로 논리 버그(예: 플래시를 닳게 하는 빡빡한 루프, 잘못된 레지스터 값 선택)를 막지 않습니다. 이러한 부분은 여전히 엔지니어링 및 검토 문제로 남습니다.
이 코드베이스는 비밀 정보에 대해 일반적인 Rust 패턴을 적용합니다. 이 패턴은 모든 타입에 대해 자동으로 적용되는 것은 아닙니다:
zeroize::Zeroize / ZeroizeOnDrop 같은 타입은 drop 시 버퍼를 지웁니다. 호출자가 옵트인(opt in)합니다.subtle::ConstantTimeEq (및 유사한 것)을 사용합니다. 일반적인 ==는 마술처럼 일정 시간이 되지 않습니다.Copy 없음은 우발적인 복제를 줄입니다. 도메인 분리는 별개의 타입과 HKDF 레이블을 사용합니다(암호화 종속성 정책).catch_unwind 또는 abort 전략을 사용하십시오.**unsafe**는 소스에서 명시적으로 표시되어야 하므로 수동 검토 범위가 좁아집니다. 종속성: 이 프로젝트의 암호화 정책은 감사된 Rust 크레이트(RustCrypto 등)를 선호합니다. 암호화 종속성 정책의 표를 참조하십시오. 모든 종속성이 단일 우산 프로젝트에서 오는 것은 아닙니다.
Rust는 데드락(예: 잘못된 순서의 Mutex 잠금), 논리 버그, 잘못된 프로토콜, 잘못된 루프로 인한 플래시 마모, 물리적 공격(글리칭, 전력 분석) 또는 잘못된 이미지의 올바른 빌드로 인한 위험을 제거하지 않습니다. 또한 신중한 코딩 없이 모든 하드웨어에서 일정 시간 실행을 보장하지 않습니다. 이러한 영역은 이 README의 다른 곳에서 설명된 설계, 검토, 테스트 및 프로젝트의 암호화 및 공급망 관행에 의존합니다.
검증(테스트 및 퍼징): 언어 외에도 이 저장소는 단위 테스트, 통합 테스트, dudect 타이밍 하니스 및 libFuzzer(cargo-fuzz) 타겟을 사용합니다. 요약과 행렬은 **테스트 결과**에 있습니다. 기록된 실행 메타데이터는 docs/TEST_RESULTS.md#run-metadata에서 시작됩니다. 테스트 통과가 프로덕션 준비 상태나 취약점 부재를 증명하지는 않습니다. 위험을 좁힐 뿐입니다. 사용자가 빌드 또는 테스트 실행이 자신의 환경에 적합한지 판단하십시오. 가상 머신은 선택 사항이지만 머신의 폭발 반경을 제한합니다.
주요 VM 플랫폼은 모두 적합합니다 — VirtualBox(무료, 오픈 소스), QEMU(무료, 오픈 소스, 명령줄) 또는 VMware. Linux 게스트가 권장됩니다. 빌드 환경이 가장 잘 지원되기 때문입니다.
QEMU와 Ubuntu를 사용한 빠른 시작:```bash
sudo apt install qemu-system-x86 # Debian/Ubuntu host
brew install qemu # macOS host
qemu-system-x86_64 -m 2G -cdrom ubuntu-24.04-live-server-amd64.iso
VM 내부에서는 표준 빌드 지침이 적용됩니다. VM은 각 실험 전에 **스냅샷**을 찍을 수 있으며, 문제가 발생하면 깨끗하게 **롤백**할 수 있습니다.
### 위험 평가 및 배포
**궁극적으로 이 펌웨어를 사용자 환경에 배포해도 안전한지 여부는 오직 사용자만이 결정할 수 있습니다.** 이는 사용자의 위험 평가, 보호하려는 대상의 민감도, 배포 전에 독립적인 제3자 감사를 기다릴지 여부에 따라 달라집니다. 이 프로젝트는 사용자가 스스로 결정을 내리는 데 필요한 모든 정보를 제공하는 것을 목표로 합니다.
자산, 위협 **T1–T14**, 명시적 비목표, Q2 검증 격차의 구조화된 목록은 **[docs/THREAT_MODEL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/THREAT_MODEL.md)** 에 있습니다.
---
## 이름에 관하여
**Galdr**는 구전 또는 노래 마법의 고대 노르드 관행입니다: 묶고, 보호하거나, 드러내는 데 사용되는 주문입니다. 사가에서는 단어뿐만 아니라 주문 자체를 시전하는 행위를 나타냅니다. 때로는 [Kragehul I lance shaft](https://en.wikipedia.org/wiki/Kragehul_I), [Lindholm amulet](https://en.wikipedia.org/wiki/Lindholm_amulet), [Vadstena bracteate](https://en.wikipedia.org/wiki/Vadstena_bracteate) 및 기타 고대 푸타르 유물에서와 같이 마법 룬 문자를 활성화하는 데 사용됩니다.
**Galdralag**는 galdr에 사용되는 운율 형식입니다: 패턴이 주문의 힘의 일부인 구조화되고 정확하며 규칙에 얽매인 운문입니다. 접미사 *lag*는 "법칙" 또는 "패턴"과 유사합니다.
**룬**은 문자 그대로 비밀스럽고 인코딩된 지식이었습니다 — 샤머니즘적 사용은 이해하는 사람들에게만 알려졌습니다.
---
## 문서
**용어집:** [docs/GLOSSARY.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GLOSSARY.md) — 용어를 **평이한 언어**로 설명 (A–Z 정렬). README나 다른 문서가 전문 용어가 많다고 느껴지면 여기서 시작하세요.
**디버깅:** [docs/DEBUG_INSTRUCTIONS.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/DEBUG_INSTRUCTIONS.md) — 역추적, `cargo test` 범위 좁히기, `xtask` 단축키, 펌웨어 삼중 검사, 퍼징, 문제 보고 전 수집할 사항.
**AI 어시스턴트 (Claude, Cursor):** [CLAUDE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/CLAUDE.md) — 코딩 에이전트를 위한 프로젝트 지침. Cursor 특정 규칙: [`.cursor/rules/`](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/.cursor/rules/).
**모든 파일 보기:** [github.com/Supermagnum/Galdralag-firmware — `docs/`](https://github.com/Supermagnum/Galdralag-firmware/tree/main/docs)
**하드웨어 (USB 동글 및 관련):** 두 개의 KiCad 트리: [Hardware/kicad-files-usb/](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-files-usb/) — `dabao_v3c` (마이크로 SD **없는** USB-A 토큰); 및 [Hardware/kicad-sd-card/](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-sd-card/) — `dabao_v3c_sdcard` (마이크로 SD 홀더가 **있는** 동일 기본 레이아웃), 거버, BOM, 생산 출력물, [핀 배치 문서](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-sd-card/docs/pinout/README.md). USB-A 동글 PCB 레이아웃 (미니멀 토큰 대 Pico 형식 평가)은 [docs/USB_DONGLE_PCB.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/USB_DONGLE_PCB.md)에 설명되어 있습니다.
| Document | Description |
|----------|-------------|
| [Hardware/kicad-files-usb/](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-files-usb/) | **USB 동글** KiCad 프로젝트 `dabao_v3c` (마이크로 SD 없음); 거버, BOM, 생산 출력물; [USB_DONGLE_PCB.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/USB_DONGLE_PCB.md) 보완 |
| [Hardware/kicad-sd-card/](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-sd-card/) | **USB 동글** KiCad 프로젝트 `dabao_v3c_sdcard` (마이크로 SD 홀더); 거버, BOM, 핀 배치는 [docs/pinout](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/Hardware/kicad-sd-card/docs/pinout/README.md); [USB_DONGLE_PCB.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/USB_DONGLE_PCB.md) 보완 |
| [docs/CODE_MAP.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CODE_MAP.md) | 작업 공간 **함수 및 모듈 인덱스** (파일별 `pub fn` / 행 앵커가 있는 유형) |
| [docs/CRATE_DEPENDENCIES.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CRATE_DEPENDENCIES.md) | **업스트림 대 프로젝트** Rust 크레이트 및 상호 의존 관계 |
| [docs/API_REFERENCE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/API_REFERENCE.md) | 코드 맵 + IETF/I-D/GnuPG/Sequoia에 대한 **부록**: Shamir GF(256) 구성, GALDRA SHARE 아머, 임시 ECDH 와이어 형식, HKDF 레이블, 프리이미지; `galdrad` 경로; rustdoc 힌트 |
| [docs/ARCHITECTURE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/ARCHITECTURE.md) | 고수준 펌웨어 아키텍처 및 주요 하위 시스템 |
| [docs/AUDIT_LOG.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/AUDIT_LOG.md) | 프로필 감사 기록 (`cipher-profile`), OpenPGP `OpenPgpAudit` 훅; **추가 전용 RRAM 로그는 아직 구현되지 않음** |
| [docs/BIOMETRIC_API.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/BIOMETRIC_API.md) | 생체 인식 사전 게이트: 아키텍처, 와이어 형식, 볼트 레이아웃; 통합이 부분적으로 구현됨 |
| [docs/BIOMETRIC_DEVICE_GUIDE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/BIOMETRIC_DEVICE_GUIDE.md) | 새로운 생체 인식 하드웨어 백엔드 지원 추가 방법 |
| [docs/BIOMETRIC_TESTING.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/BIOMETRIC_TESTING.md) | 테스트 방법론: ISO/IEC 30107-3 PAD 메트릭, 데이터 세트, 실행 방법 |
| [docs/FINGERVEIN_DEVICE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/FINGERVEIN_DEVICE.md) | ESP32-CAM 개방형 손가락 정맥 장치: 하드웨어, 프로토콜 스케치, 활성 감지 |
| [docs/SWEET_PLATFORM_INTEGRATION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/SWEET_PLATFORM_INTEGRATION.md) | sweet 플랫폼 손 스캐너: 하드웨어, 통합, 활성 감지, 데이터 세트 |
| [docs/GALDRA-TOOL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md) | 호스트 도구 (`galdra`, `galdrad`, `galdra-gtk`): 워크플로, 프로비저닝, PIN 정책, 운영 동작 |
| [Supermagnum/Fulla](https://github.com/Supermagnum/Fulla) | **Fulla**: WoT 중심의 OpenPGP 공개 키 레지스트리 (서버 저장소 및 구현). **아직 공개 레지스트리 인스턴스가 실행 중이 아닙니다**; 하나가 계획되어 있습니다. **`galdra keyserver push`** / **`galdra keyserver fetch`** 및 선택적 **`[keyserver]`** 구성은 이 생태계를 대상으로 합니다—[Web of Trust and Key Signing Parties](#web-of-trust-and-key-signing-parties)도 참조하세요. 보충 설계 노트는 [docs/server.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/server.md)에 남아 있습니다. |
| [docs/GLOSSARY.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GLOSSARY.md) | **평이한 언어 용어집** (A–Z) 비기술적 독자용; 기술적 세부 사항은 연결된 문서에 남아 있음 |
| [CLAUDE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/CLAUDE.md) | **Claude** / AI 코딩 에이전트를 위한 지침; **Cursor**용으로 [`.cursor/rules/`](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/.cursor/rules/)를 가리킴 |
| [docs/GALDRALAG_DEV_REFERENCE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRALAG_DEV_REFERENCE.md) | 도구 체인, `xtask` 명령어, 퍼징 및 암호화 테스트 진입점 |
| [docs/dev-ref.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/dev-ref.md) | 작업 공간 레이아웃, 크레이트, HAL 특성, USB/PSRAM 동작, 보안 불변 조건 |
| [docs/DEBUG_INSTRUCTIONS.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/DEBUG_INSTRUCTIONS.md) | 디버깅: `RUST_BACKTRACE`, 자세한 빌드, 범위 테스트, `xtask` 레시피, 임베디드 대상 확인, 퍼징 포인터, OpenPGP 호스트 확인 |
| [docs/KEY_LIFECYCLE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/KEY_LIFECYCLE.md) | 키 생성, 가져오기, 내보내기 정책, 순환, 제로화, Shamir (`vault` / OpenPGP에 반영된 대로) |
| [docs/OPENPGP_CARD.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/OPENPGP_CARD.md) | OpenPGP 카드 애플리케이션, GnuPG/CCID 호스트 설정, 키 슬롯, 알고리즘, udev |
| [docs/CIPHER_PROFILES.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CIPHER_PROFILES.md) | 암호 프로필 시스템 및 구성 |
| [docs/CIPHER_PROFILE_SECURITY.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CIPHER_PROFILE_SECURITY.md) | 보안 고려 사항: 일반 텍스트 프로필 식별자, 트래픽 분석, BrainpoolP384r1 외부 래퍼 근거, 암호화된 식별자, 와일드카드 속성 |
| [docs/CESS_CONFORMANCE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CESS_CONFORMANCE.md) | [CESS](https://github.com/Supermagnum/CESS/tree/main) 정렬: 모드 A 와이어 레이아웃, [ALGORITHM-REGISTRY.md — 조회 테이블](https://github.com/Supermagnum/CESS/blob/main/ALGORITHM-REGISTRY.md#cipher-suite-identifier-lookup-table)의 `suite_id`, 편차 레지스터 (유지된 AES/SHA-2 대 CESS-CORE), 로드맵 |
| [crates/cess](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/crates/cess) | CESS 모드 A: HKDF-BLAKE3 (`derive_k_outer`, `hkdf_blake3`), ChaCha 외부 봉인/열기, `suite_id \|\| inner_blob` 레이아웃; [CESS_CONFORMANCE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/CESS_CONFORMANCE.md) 참조 |
| [docs/EPHEMERAL_SESSION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/EPHEMERAL_SESSION.md) | 인증된 임시 ECDH 세션 프로토콜 |
| [Supermagnum/CESS](https://github.com/Supermagnum/CESS) | **CESS** (*Cryptologically Enchanted Shamir's Secret*) — 인증 암호화, 비밀번호 기반 공유 래핑, 선택적 양자 후 하이브리드 키 교환을 사용한 임계 비밀 공유를 위한 공개 사양 (규범 텍스트 및 테스트 벡터); 이 펌웨어와는 별개이지만 여기의 Shamir 및 암호 프로필과 동일한 설계 공간에 있음 |
| [docs/PQ_SIGNATURES.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/PQ_SIGNATURES.md) | 양자 후 상태 저장 서명 (XMSS, LMS/HSS), 기능 게이팅 |
| [docs/Psram.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/Psram.md) | 선택적 마이크로SD 유인 볼륨 및 관련 동작 |
| [docs/RRAM_LAYOUT.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/RRAM_LAYOUT.md) | **4,194,304 바이트** 온칩 RRAM: 소스의 볼트 오프셋, HAL 매핑, 마모/제로화 참고 사항 |
| [docs/TEST_RESULTS.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/TEST_RESULTS.md#run-metadata) | **실행 메타데이터**에서 열림; 파이프라인 요약, 벡터, dudect, cargo-fuzz ([섹션 6](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/TEST_RESULTS.md#6-cargo-fuzz-libfuzzer)), 키 수명 주기 |
| [docs/THREE_FACTOR_AUTH.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/THREE_FACTOR_AUTH.md) | 토큰 + PIN + 선택적 생체 인식: 이 저장소가 구현하는 것 vs 자리 표시자; 위협 스케치 |
| [docs/THREAT_MODEL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/THREAT_MODEL.md) | 위협 모델: 자산, 위협 T1–T14, 방어되는 것과 방어되지 않는 것, Q2 하드웨어를 기다리는 미검증 항목, 감사 상태 |
| [docs/PERFORMANCE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/PERFORMANCE.md) | 성능 참고 사항 |
| [docs/HARDWARE_BRINGUP_TEST_PLAN.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/HARDWARE_BRINGUP_TEST_PLAN.md) | Q2 첫 하드웨어 부팅: CCID 열거, `gpg --card-status`, 첫 부팅 PIN을 위한 USB CDC `galdralag-provision`, 그 다음 `gpg --card-edit` / 암호화 연기 테스트 |
| [docs/HARDWARE_VERIFICATION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/HARDWARE_VERIFICATION.md) | 하드웨어 제로화: 시뮬레이션 대 실리콘 검증 |
| [docs/HARDWARE_TEST.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/HARDWARE_TEST.md) | 하드웨어 중심 테스트 참고 사항 |
| [docs/NFC_PN532_INTEGRATION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/NFC_PN532_INTEGRATION.md) | PN532 / NFC: libnfc, Rust 옵션, 도어 수동 대 USB 패널, Shamir 및 PIN과의 쿼럼 |
| [docs/SDMMC_STORAGE_INTEGRATION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/SDMMC_STORAGE_INTEGRATION.md) | `embedded-sdmmc` + SPI 마이크로SD를 선택적 대용량 저장소로 사용; PSRAM 대체 BOM |
| [docs/USB_DONGLE_PCB.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/USB_DONGLE_PCB.md) | Dabao 참조에서 USB-A 동글 PCB 만드는 방법: Pico 형식 평가는 펌웨어 부팅용; GPIO 헤더를 제거하여 미니멀 토큰; KiCad, FreeCAD, 5V / 500mA 대 USB-C PD, QSPI PSRAM 라우팅 |
동일한 경로는 GitHub에서 [`tree/main/docs`](https://github.com/Supermagnum/Galdralag-firmware/tree/main/docs) 및 [`tree/main/Hardware`](https://github.com/Supermagnum/Galdralag-firmware/tree/main/Hardware) 아래에서 확인할 수 있습니다.
---
## OpenPGP 및 GnuPG 호환성
펌웨어는 **OpenPGP 카드 애플리케이션**을 구현합니다 ([docs/OPENPGP_CARD.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/OPENPGP_CARD.md)에 버전 **3.4.1**로 문서화됨). 이는 GnuPG가 **CCID/USB**를 통해 **OpenPGP 스마트 카드**에 대해 구동하는 것과 동일한 클래스의 장치입니다: 호스트는 일반 스마트 카드 스택 (`pcscd`, `ccid` 드라이버, GnuPG의 `scdaemon`)이 필요합니다. 다른 OpenPGP 카드에 사용하는 것 이상의 **사용자 정의 호스트 측 암호화 드라이버**는 필요하지 않습니다.
**호스트에서 이것이 가능하게 하는 것 (장치가 CCID 리더로 인식되면):**
| Area | Notes |
|------|--------|
| **GnuPG 워크플로** | `gpg --card-status`, `gpg --card-edit`, 카드의 키를 사용한 암호화/복호화 및 서명 |
| **SSH** | `enable-ssh-support`가 포함된 `gpg-agent` 및 일반적인 `SSH_AUTH_SOCK` 설정 |
| **메일 및 파일** | GnuPG를 사용하는 클라이언트 (예: Thunderbird, Evolution, Kleopatra) 및 표준 `gpg` 파일 암호화 |
| **기타 도구** | GnuPG와 동일한 방식으로 OpenPGP 카드 + CCID와 통신하는 모든 것 |
**키 슬롯 (일반 기본값):** **SIG** (서명), **DEC** (복호화 / ECDH), **AUT** (인증, 예: SSH). 알고리즘은 슬롯별로 선택 가능 (Brainpool 곡선, NIST P-256/P-384, Ed25519 / X25519, RSA). 전체 테이블과 `key-attr` 동작은 [docs/OPENPGP_CARD.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/OPENPGP_CARD.md)에 있습니다.
**여기서 OpenPGP 카드 / GnuPG가 다루지 않는 것:** **WebAuthn / FIDO2**는 다른 프로토콜이며 이 카드 애플리케이션의 범위를 벗어납니다 (동일 문서 참조).
**OpenPGP 카드 대 OpenPGP 메시지:** **카드** 사양은 토큰이 CCID를 통해 PIN, 키 슬롯 및 온카드 작업을 노출하는 방법을 정의합니다. **GnuPG**는 `scdaemon`을 통해 이를 사용합니다. 파일 및 메일용 **OpenPGP 메시지 형식** (RFC 4880 및 후속)은 **호스트 측** 계층입니다: 카드는 키를 제공하고 GnuPG는 PC에서 메시지 형식을 적용합니다. 카드 사양이나 RFC 4880 모두 **Shamir 분할**, **임시 ECDH 세션** 또는 **암호 프로필**을 정의하지 않습니다 — 이는 [펌웨어 특정](#standards-vs-firmware-specific-features)입니다.
**통합 상태:** OpenPGP 및 CCID 로직은 **`usb-personality`**, **`baochip-openpgp`** 및 **Xous** **`usb-bao1x`** 서비스에 있습니다 (**xous-core** 참조). 선택적 **`galdralag-service`** (`services/galdralag`)는 별도의 Xous 프로세스로 실행되며, **CCID** IPC를 위해 **`usb-bao1x`**에 연결하고 **PDDB** 프로비저닝 데이터를 **RRAM**으로 브리지합니다; 빌드 및 **`baosec`** 등록: [services/galdralag/README.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/services/galdralag/README.md) 및 **`cargo run -p xtask -- build-and-register`**. 메모리 레이아웃: [docs/RRAM_LAYOUT.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/RRAM_LAYOUT.md). **실제 하드웨어에서의 종단 간 GnuPG**는 여전히 전체 Xous 이미지 (**`ccid-openpgp`** 포함), 작동하는 호스트 CCID 스택 (`pcscd`, 드라이버) 및 [Known limitations / open work](#known-limitations--open-work) 아래의 항목이 출시 대상에 적용되는 대로 해결되어야 합니다.
## 토큰 세션 및 키 내보내기
**물리적 연결 해제 (분리):** 호스트는 USB 장치를 잃습니다; 진행 중인 작업은 토큰이 다시 연결되고 재열거될 때까지 실패합니다. 장치에서 OpenPGP **카드 세션**이 지워집니다: **PIN 확인 상태**는 전원이 꺼지거나 제거되어도 유지되지 않으므로, 다른 OpenPGP 스마트 카드와 마찬가지로 **서명, 복호화 및 기타 보호된 작업은 다시 연결 후 VERIFY PIN이 필요합니다**. **개인 키 자료는 봉인된 볼트 저장소에 토큰에 계속 저장됩니다**; 분리는 별도의 **제로화** 또는 지우기 경로가 실행되지 않는 한 지우지 않습니다.
**장치를 떠날 수 있는 것:** 설계상 **공개 키 자료만** USB 링크를 통해 전송될 수 있습니다 (예: OpenPGP **공개** 키 패킷 및 카드 사양이 호스트에 노출하는 관련 데이터). **개인** 키, 원시 비밀 스칼라 및 봉인된 키 블롭은 일반 펌웨어 경로를 통해 장치를 **떠나지 않습니다**; 개인 키 작업은 **토큰에서** 실행됩니다. 호스트는 표준 명령이 요구하는 경우 **암호화 결과** (서명, 카드 지원 복호화 워크플로를 위한 복호화된 평문)를 받으며, 개인 키의 휴대용 복사본은 아닙니다.
**장치로 키 가져오기:** 토큰으로 **공개 키를 가져오는** 것도 가능합니다 (예: 신뢰 앵커, 피어 인증서 또는 온디바이스 검증을 위한 OpenPGP 공개 패킷). 펌웨어 **볼트**는 비밀 자료가 아닌 것을 위한 **공개 키 슬롯**을 제공합니다 (`crates/vault/src/public_key_vault.rs`). 해당 슬롯을 로드하기 위한 호스트 도구는 통합이 성숙함에 따라 [docs/GALDRA-TOOL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md)에 설명되어 있습니다.
---
## 신뢰 웹 및 키 서명 파티
OpenPGP 및 **GnuPG**는 분산된 신뢰 모델인 **신뢰 웹**을 사용하여 누가 어떤 키를 소유하고 있는지, 그리고 주어진 **공개 키**에 의존할지 여부를 확인하는 데 도움을 줍니다. 이 모델은 완전히 **호스트 측**입니다. [German eID and Governikus](#german-eid-and-governikus-as-a-trust-anchor-for-public-keys)와 같은 칩 기반 증명을 사용할 수 없거나 부적절한 경우, 일반적인 분산 대안 (**키 서명 파티**, 인증서에 서명)입니다; 사용 **가능한** 경우 두 접근 방식은 상호 보완적인 경로로 공존할 수 있습니다.
**Galdralag 지문 (`G:`):** 직접 확인 워크플로를 위해 **Galdra**는 토큰의 **SIG** 공개 키에서 파생된 **장치 바인딩된** 지문을 표시할 수 있습니다 (**BLAKE3-160**, `G:` 접두사). 이는 OpenPGP v4 인증서 지문이 **아닙니다**. 활성 **암호 프로필**에 **`ephemeral_ecdh: false`**가 있는 경우에만 사용 가능합니다; 내장 프로필은 기본적으로 **`ephemeral_ecdh: true`**이므로, **WoT** 스타일의 호스트 서명과 함께 이 식별자가 필요한 워크플로를 위해 **`galdra profile add ... --no-ephemeral-ecdh`**로 사용자 프로필을 추가하는 것이 일반적입니다. 평이한 언어 정의 및 형식 사양: [Galdralag 지문](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GLOSSARY.md#g). 수명 주기, 순환 정책 및 임시 ECDH 게이트: [KEY_LIFECYCLE.md — Galdralag 지문](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/KEY_LIFECYCLE.md#galdralag-fingerprint-host).
### Galdralag 지문 얻기
호스트는 **항상 `G:`로 시작하는** 문자열을 출력합니다 (SIG 공개 키 바이트에 대한 BLAKE3-160, 표준 형식에서 접두사 뒤에 **40개의 소문자 16진수 문자**).
1. 호스트에 **[Galdra](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md)**를 설치하고 **PC/SC**가 작동하는지 확인하세요 (**`pcscd`**, **`libpcsclite`**). 도구가 토큰에 CCID로 통신할 수 있도록 합니다 ([호스트 도구 컴파일 및 설치](#compile-and-install-host-tools-galdra-galdrad-galdra-gtk) 참조).
2. 토큰을 연결하세요 (워크플로에서 필요한 경우 잠금 해제).
3. **`ephemeral_ecdh: false`**인 **암호 프로필**을 선택하세요. **`galdra profile show <name>`**으로 확인하세요 (`ephemeral_ecdh: off`). 기본 프로필 이름 **`standard`**는 일반적으로 **`ephemeral_ecdh: on`**입니다; 필요한 경우 **`galdra profile add <name> ... --no-ephemeral-ecdh`**로 생성하세요.
4. 실행:```bash
galdra identity fingerprint
# If you use a non-default profile:
galdra identity fingerprint --profile <name>
기계가 읽을 수 있는 출력: galdra --emit json identity fingerprint (선택적으로 --profile <name>).
OpenPGP 호환 구현체는 키 소유권 확인을 돕기 위한 인증서 검증 체계를 포함하며, 그 작동 방식은 웹 오브 트러스트로 불립니다. OpenPGP 인증서(하나 이상의 공개 키와 소유자/사용자 ID 자료)는 다른 사용자에 의해 디지털 서명될 수 있으며, 이를 통해 해당 공개 키와 인증서에 명시된 사람 또는 단체 간의 연관성을 보증합니다.
gpg --full-generate-key로 생성된 키 또는 OpenPGP 호환 토큰에 저장된 키)를 게시하거나 전송합니다.키 서명 파티는 참가자들이 키 지문을 교환하고 서로의 신원을 확인한 후 나중에 인증서에 서명하는 대면 모임입니다.
일반적인 특징:
이로 인해 소셜 그래프가 생성됩니다. Alice가 Bob을 신뢰하고 Bob이 Charlie의 키에 서명했다면, Alice는 신뢰 깊이와 정책에 따라 Charlie의 키를 신뢰하도록 선택할 수 있습니다.
이러한 행사가 중요한 이유:
파티는 보통 신원 교환 중에 컴퓨터 사용을 피합니다. 이렇게 하면 공격자가 공유 머신에 대체 키나 멀웨어를 몰래 넣을 기회가 줄어듭니다.
행사 전. 지문(공개 키의 해시 기반 다이제스트 — 신뢰할 수 있게 비교할 수 있을 만큼 짧음)을 계산하고 기록하세요. 주최자가 달리 명시하지 않는 한, 이 단계에서는 전체 키를 종이로 교환하는 데 의존하지 마십시오.```bash
gpg --fingerprint YOUR_KEY_ID
지문을 종이 또는 다른 내구성 있는 매체에 지참하세요 (예시 형식: `ABCD 1234 EFGH 5678 90AB CDEF 1234 5678 90AB CDEF`).
**이벤트에서 (지문만).** **지문**을 교환하고, ID를 확인하며, 어떤 지문이 어떤 확인된 사람의 것인지 기록하세요. 각 참가자의 주장된 신원이 확인된 문서와 일치하는지 확인하세요.
**이벤트 후.** **키서버** 또는 직접 배포를 통해 전체 **공개 키**를 가져오고, 다운로드한 키가 종이에 기록된 **지문**과 일치하는지 확인하세요; 확인한 키에 **서명**하세요; 선택적으로 다른 사람들이 사용할 수 있도록 서명을 **업로드**하세요.
### 이벤트에서 전체 키 대신 지문 사용
- **운영 보안.** 대체 공격을 확인된 지문에 연결하여 이벤트 중 임의의 기계를 신뢰하지 않습니다.
- **간편함.** 지문은 종이에 적합하며 소리내어 읽거나 비교하기 빠릅니다.
- **확인.** 다운로드 후 지문을 다시 계산하여 종단 간 무결성을 확인합니다.
### 키서버
**키서버**는 **공개** OpenPGP 키(및 서명, 폐지와 같은 업데이트)를 저장하고 복제하는 네트워크 저장소입니다. 키를 **사용자 ID**, **키 ID** 또는 **지문**으로 검색 가능하게 하며, 신뢰의 웹을 위한 광역 배포를 지원합니다.
원칙적으로 동작 방식:
- **분산 복제.** 동기화 메시에 참여하는 하나의 서버에 업로드하면 종종 피어로 전파됩니다 (고전적인 **SKS** 스타일 풀이 이런 방식으로 작동했습니다).
- **동기화.** 새 키, 서명 및 폐지 인증서는 각 서버의 정책과 연결 상태에 따라 확산됩니다.
- **공개 읽기 접근.** **공개** 자료만 게시용입니다. **개인 키**는 절대 업로드해서는 안 됩니다.
**개인정보 보호.** 게시된 키는 **사용자 ID**(종종 이메일 주소 포함)를 노출합니다. 업로드는 많은 서버에서 **공개 및 장기 보존**으로 간주하세요; 키를 폐기해야 할 때는 **폐지 인증서**를 업로드하세요. 정책은 운영자에 따라 다릅니다 ([keys.openpgp.org](https://keys.openpgp.org/)는 레거시 풀과 다릅니다).
**피어 토폴로지.** 서버 관계 그래프는 [spider.pgpkeys.eu/graphs/](https://spider.pgpkeys.eu/graphs/)에서 확인할 수 있습니다; SKS 기반 피어 목록은 [spider.pgpkeys.eu/sks-peers](https://spider.pgpkeys.eu/sks-peers)에서 확인할 수 있습니다.
### 키서버 사용하기```bash
# Upload your signed key (after local signing)
gpg --send-keys YOUR_KEY_ID
# Search by mail or name (behaviour depends on keyserver configured in gpg.conf)
gpg --search-keys [email protected]
# Refresh imported keys from configured keyservers
gpg --refresh-keys
| Server | 비고 |
|---|---|
| keys.openpgp.org | 널리 사용됨; 메일 연동 사용자 ID에 대한 동의 기반 검증 |
| pgp.mit.edu | MIT에서 호스팅하는 서버, 역사적으로 SKS 시대 메시와 연결됨 |
| pool.sks-keyservers.net | 이전 SKS 생태계와 관련된 레거시 풀 호스트명; 현재 연결 상태는 다양함 |
gpg --refresh-keys**를 실행하여 폐지 및 새 서명이 로컬로 전파되도록 하세요.galdra profile show <name>으로 활성 프로필에 ephemeral_ecdh: false가 있는지 확인하세요.**gpg**의 권위 있는 동작, 신뢰 모델 및 배포 옵션에 대해서는 GnuPG 매뉴얼과 업스트림 문서를 참조하세요.
Fulla 프로젝트(Supermagnum/Fulla on GitHub)는 WoT 정렬 레지스트리 서버 작업을 호스팅합니다: 기여자 공개 키와 선택적 아마추어 무선 레이블, 우편 힌트, organisation(JSON 철자), role, note, badge_number, phone_number 및 Galdra 연락처 메타데이터와 정렬된 관련 열을 저장하기 위한 구현 및 진화하는 사양입니다. galdra keyserver push는 POST /api/v1/keys JSON(armored_public_key, email, 그리고 CLI 플래그를 전달할 때 해당 선택적 필드 포함)을 제출합니다; galdra keyserver fetch 및 [keyserver] 설정 스탠자는 galdra / ****에서 해당 방향으로 구현되었습니다. ; 향후 공개 운영 서비스가 예상됩니다. 추가 역사적 디자인 내용은 ****에 있습니다.
이 프로젝트의 여러 부분은 서로 다른 표준과 정렬됩니다. GnuPG 상호 운용성은 OpenPGP 카드 애플리케이션과 CCID가 정의하는 것으로 제한됩니다. 다른 기능들은 펌웨어(그리고 때로는 Galdra 호스트 도구)에 구현되어 있지만, 표준 gpg 카드 워크플로우를 통해 호출할 수 있는 것이 아닙니다.
일상적인 카드 동작에 대해서는 docs/OPENPGP_CARD.md를 참조하세요. 볼트 전용 또는 토큰 고유 기능의 경우 이 리포지토리의 펌웨어 및 Galdra 도구 문서를 사용하세요.
OpenPGP 카드 및 GnuPG 스택은 키 또는 디스크 잠금 해제를 위한 Shamir의 비밀 공유(SSS)를 정의하지 않습니다. SSS는 여전히 일반 암호화 와 함께 유용합니다: 디스크의 대칭 암호를 거의 대체하지 않으며 — 해당 암호화를 잠금 해제하는 작은 비밀(마스터 키 또는 암호)을 보호합니다.
Pattern (항상 동일한 아이디어):
1. LUKS (Linux) 및 외부 SSS
LUKS는 마스터 키로 볼륨을 암호화합니다. 해당 키(또는 절차에 따라 키-슬롯 비밀)를 추출하고, SSS 도구로 분할한 다음 공유를 별도로 저장할 수 있습니다. 잠금 해제 시 K개의 공유를 결합하고, 키 자료를 재구성한 다음 cryptsetup에 제공합니다(배포판 문서 참조; 키를 잘못 처리하면 액세스가 차단될 수 있습니다).
ssss("Shamir's Secret Sharing Scheme") 유틸리티를 사용한 예시 형태(이름과 패키징은 OS에 따라 다름):```bash
ssss-split -t 3 -n 5 < luks_master.key
ssss-combine -t 3 | cryptsetup luksOpen /dev/sdX vault
**2. HashiCorp Vault**
[Vault](https://www.hashicorp.com/products/vault)는 **봉인 해제(unseal)**에 Shamir를 사용합니다. 초기화 시 저장소 암호화 키가 분할됩니다(예: 5명의 운영자 중 3명이 각각 하나의 share를 보유). 재시작 후 봉인을 해제하려면 **K**개의 share를 입력해야 합니다. 이는 LUKS와 동일한 **마스터 비밀에 대한 K-of-N** 패턴으로, 블록 장치 대신 시크릿 엔진에 적용됩니다.
**3. Galdralag 펌웨어 (`vsss-rs`)**
이 저장소는 온디바이스 Shamir를 위해 [`vsss-rs`](https://crates.io/crates/vsss-rs)(RustCrypto 생태계)를 사용합니다. 대량 암호화와 결합할 경우 동일한 **계층화**가 적용됩니다:
- 무작위 256비트(또는 적절한) 마스터 키를 생성합니다.
- 해당 키로 **AES-GCM** 또는 **ChaCha20-Poly1305**를 사용하여 드라이브 또는 대량 저장소를 암호화합니다(이는 워크스페이스의 감사된 대칭 크레이트와 일치합니다).
- `vsss-rs`를 사용하여 마스터 키를 임계값 **K**를 가진 **N**개의 share로 분할합니다.
- share를 볼트 슬롯, 다른 장치 또는 키 보유자에게 저장합니다.
- 부팅 또는 복구 시 **K**개의 share를 수집하여 재구성한 후, 필요에 따라 **HKDF**(또는 정책)를 사용하여 도메인 분리된 서브키를 생성합니다.
**4. VeraCrypt**
VeraCrypt는 SSS를 내부적으로 구현하지 않습니다. 동일한 **외부** 패턴이 적용됩니다. SSS 도구를 사용하여 **암호 또는 키 파일 자료**를 분할하고, 볼륨의 암호문을 Shamir 분할하려고 시도하지 마십시오.
### 하이브리드 패턴(대량 데이터)
SSS는 **작은 비밀**(키 크기)을 위한 것입니다. 수 기가바이트의 암호문에 Shamir를 적용하지 **않습니다**. 일반적인 계층화:```text
[Drive data]
encrypted by
[Symmetric master key, e.g. 32-byte AES-256]
split by SSS into
[Share 1] [Share 2] ... [Share N]
(each share may be wrapped with a recipient's PGP key, HSM, or offline media)
이 프로젝트가 이미 갖추고 있는 것과 일치합니다: 저장 데이터용 aes-gcm / chacha20poly1305, 마스터 비밀 분할용 vsss-rs, 재구성 후 파생용 hkdf.
| 결정 | 일반적인 옵션 |
|---|---|
| 임계값 | 2-of-3 (소규모 팀, 일부 중복성); 3-of-5 (조직에서 일반적) |
| 공유 저장소 | 하드웨어 토큰, 별도 머신, 종이, 지리적으로 분할된 사이트 |
LUKS 및 전체 디스크 암호화를 위한 운영 키 처리는 보안에 민감합니다. 사용자 환경에 맞는 공급업체 및 배포판 지침과 위협 모델을 따르십시오.
한 가지 구체적인 패턴은 귀하의 스택이 요구하는 경우(예: 마스터 비밀을 중심으로 한 ECDH/ECDSA) Brainpool 곡선을 사용하여 암호화된 드라이브 또는 볼륨과, 해당 암호화를 해제하는 키 자료에 대한 Shamir의 비밀 공유를 결합하는 것입니다(위의 하이브리드 패턴-대용량 데이터와 동일한 소규모 비밀 계층화: SSS는 키를 보호하며, 기가바이트 단위의 암호문을 보호하지 않습니다). 그 워크플로를 구현하는 펌웨어 및 호스트 소프트웨어가 독립적으로 감사된 경우, 이러한 조합은 동시에 정족수 정책과 국가 암호 프로필을 충족해야 하는 조직에 유용할 수 있습니다.
그 맥락에서 Brainpool 곡선(예: BrainpoolP256r1, BrainpoolP384r1)이 자주 논의되는 이유:
SSS와 Brainpool급 암호를 결합하여 기관의 요구를 해결하는 시나리오(설명용이며 법적 또는 규정 준수 조언이 아님):
Governikus 스타일의 OpenPGP 서명 또는 이에 상응하는 칩 기반 국가 eID 증명이 귀하의 관할권 또는 워크플로에서 사용 불가능하거나 실용적이지 않은 경우, 신뢰의 웹 및 키 서명 파티에서는 대면 확인 및 인증서에 대한 제3자 서명을 기반으로 하는 대체 호스트 측 접근 방식을 설명합니다.
Governikus OpenPGP 키 인증은 BSI(독일 연방 정보 보안청)를 대신하여 운영되는 온라인 서비스입니다. 제출자가 독일 eID 기능이 있는 ID 카드, EU 시민용 EU eID 카드 또는 전자 거주 허가증으로 인증한 후, 서비스는 인증된 법적 이름이 업로드된 공개 키의 OpenPGP 사용자 ID와 일치하는지 확인합니다. 일치하면 Governikus는 서비스 서명 키로 해당 공개 키에 서명하여 제3자가 증명을 확인할 수 있도록 합니다.
이 펌웨어를 사용한 실용적인 워크플로: 토큰에서 Brainpool 비대칭 키를 생성하고(OpenPGP 카드 생성은 평소와 같이), 공개 키 또는 인증서를 호스트로 내보내고, eID 인증(일반적으로 AusweisApp 및 NFC 카드 읽기)을 포함한 Governikus 제출 플로우를 완료하고, 서비스에서 반환된 서명된 공개 키(예: 이메일 배포를 통해)를 사용합니다. 개인 키는 Galdralag에 남아 있습니다.
어느 경로도 다른 경로를 대체하지 않습니다. eID 및 Governikus 단계는 공개 키를 제출 시점에 칩에 대해 확인된 신원에 바인딩합니다. 이들은 전방향 비밀성, 장기 키 자료를 위한 Shamir K-of-N, 또는 대량 데이터를 위한 암호 프로필을 제공하지 않습니다. 이들은 이 README의 다른 곳에서 설명된 펌웨어별 기능입니다. eID 칩과 주변 발급 프로세스도 그 자체로 토큰의 임시 ECDH 및 캐스케이드 동작을 구현하지 않습니다. 반대로, 기기 내에서 생성된 Brainpool OpenPGP 키는 Brainpool 기관 사용에 대해 이미 논의된 BSI/EU 배포 컨텍스트와 일치하지만, 외부 증명 단계 없이는 통신 상대가 지문을 법인에 연결하기 위해 다른 수단에 의존해야 합니다.
| 계층 | 역할 |
|---|---|
| OpenPGP 공개 키 (예: Galdralag의 Brainpool) | 암호 구조 및 온토큰 개인 키 제어; 곡선 선택은 BSI TR-03111급 기대치를 추적합니다(Brainpool 기능 행 및 이것이 AI 슬롭인가요?의 TR-03111 논의 참고) |
| Governikus 서명 | 사용자가 플로우를 완료했을 때 인증서의 이름이 칩 인증 신원과 일치했음을 확인함 |
제한 사항: 확인은 이름 기반입니다. 서비스가 비교하는 필드에서 두 사람이 동일한 법적 이름을 공유하는 경우, 증명은 그들을 구별하지 않습니다. 이는 증명 시점의 해당 이름에 대한 신원 연결을 확인할 뿐, 전역적 고유성을 확인하지 않습니다. 일상적인 OpenPGP 우려 사항(이메일 바인딩, 키 교체, 폐기)은 계속 유효합니다.
정책 정렬: Brainpool 관련 기술 지침(BSI TR-03111; crates/vault/tests/bsi_vectors/ 아래 적합성 벡터)을 정의하는 동일한 BSI가 Governikus eID 서명 프로세스를 뒷받침합니다. 이는 Brainpool이 이미 요구되거나 선호되는 독일 및 EU 환경에서 종종 중요합니다—Shamir + Brainpool: 예시 및 기관 적합성 참조.
더 넓은 범위(연구 노트, 완성된 조사는 아님): 동일한 패턴—OpenPGP 공개 키를 칩 확인 신원에 바인딩—은 원칙적으로 국가 eID가 존재하는 모든 곳에 적용 가능합니다. 어떤 제공자가 Governikus와 유사한 서명 단계를 제공하는지, 그리고 어떤 규칙에 따라 제공하는지는 배포가 확장됨에 따라 조사할 가치가 있는 별도의 질문입니다. 다른 EU 회원국은 eIDAS 하에서 카드 기반 eID 생태계를 운영하며, 이는 독일 경로만으로는 가능한 것보다 비교 가능하거나 더 강력한 신뢰 앵커를 지원할 수 있습니다. 이 README는 이를 목록화하지 않습니다.
에스토니아와 벨기에 모두 Brainpool 대신 온칩 NIST P-384를 채택한 반면, 독일의 공공 부문 BSI 프로필은 Brainpool에 중점을 둡니다(위 참조). Galdralag는 이미 OpenPGP 사용 가능(비대칭 / 키 합의)을 위한 Brainpool, NIST P-256/P-384 및 RSA를 지원하므로, 동일한 신뢰 앵커 패턴이 독일의 곡선 선호도만 일치시키는 데 의존하지 않습니다.
EU/EEA 외부에서는 카드 기반 신뢰 앵커 패턴을 적용하기가 더 어렵습니다. 미국은 칩 카드(PIV)가 있지만 연방 인력으로 제한되며 X.509/FPKI에 있으며 OpenPGP와 통합되지 않습니다. 캐나다에는 위에서 사용된 의미의 국가 온칩 서명 카드가 없습니다. 이는 패턴을 주로 보편적으로 발급된 정부 칩 자격 증명이 있는 관할권으로 제한합니다—EU eIDAS 영역은 현재 이 모델이 가장 강력한 곳입니다.
하드웨어가 소비자 준비 상태에 도달하면, Shamir의 비밀 공유 및 인증된 임시 키 교환이 (펌웨어별 기능 대신) 상호 운용 가능한 OpenPGP / GnuPG 동작의 일부가 되기를 원하는 사람들은 다른 곳에서 표준 및 구현 변경을 추진해야 할 것입니다. 이 저장소는 IETF 또는 GnuPG를 대변하지 않습니다. 아래의 장소는 일반적으로 그러한 수정이 추구되는 장소입니다.
CESS — Cryptologically Enchanted Shamir's Secret — 은 임계값 비밀 공유와 함께 암호-무관 인증 암호화, 비밀번호 기반 공유 래핑, 선택적 포스트퀀텀 하이브리드 키 교환을 위한 공개 암호 표준입니다. CESS 저장소는 규범 사양, 알고리즘 레지스트리, 테스트 벡터 및 적합성 실행기를 보유합니다.
이 펌웨어는 여기에 구현된 구성에 대해 CESS를 준수합니다. 사양의 상호 운용 가능한 공유 및 봉투 규칙은 이 README의 다른 곳에 설명된 동일한 Shamir, Brainpool 및 암호 프로필 테마와 함께 있습니다. 규범 텍스트는 이 저장소와 별개입니다. 적합성 자세(사양과 일치하는 것, 프로필에서 AES 및 SHA-256과 같은 알고리즘을 유지하면서 다른 점, 더 강력한 상호 운용성을 위한 로드맵): docs/CESS_CONFORMANCE.md.
이 GitHub 저장소의 관리자가 이슈, 풀 리퀘스트 또는 메일에 응답하지 않는 경우, 더 넓은 생태계에서 새로운 암호, OpenPGP 동작 및 표준 관련 작업을 계속 진행할 수 있습니다. Sequoia PGP 는 독립적인 Rust 기반 OpenPGP 스택(메모리 안전, 라이브러리 우선 설계, 적극적인 IETF/생태계 참여)으로, 많은 공개 개발이 이루어집니다. 이 프로젝트가 아니며, 여기의 업스트림이 침묵할 때 실용적인 대체 경로로 여기에 문서화되어 있습니다.
기여 페이지는 라이선싱(대부분의 프로젝트에 대해 LGPL 2.0 이상), 개발자 인증서 원본, 그리고 더 큰 상업적 기능은 사전 동의 및 장기 유지 관리 약정이 필요할 수 있음을 설명합니다—상당한 노력을 투자하기 전에 해당 페이지를 읽으십시오.
https://autocrypt2.org/#/ 를 주시하는 것도 좋습니다.
이 코드베이스 및 관련 앱은 macOS 또는 Windows용으로 컴파일되지 않습니다. 호스트 도구(galdra, galdrad, galdra-gtk) 및 지원 도구는 Linux를 대상으로 합니다. 이는 프로젝트의 위협 모델과 이 문서 전체에 명시된 감사 가능성 요구 사항에 기반한 신중한 결정입니다.
_NSAKEY 변수는 상당한 논란을 일으켰습니다. Microsoft는 백업 키라고 밝혔습니다. 이것은 어느 쪽으로도 완전히 입증되지 않았습니다.의심되지만 입증되지 않음:
main, restricted, universe 및 multiverse 저장소의 모든 패키지는 Canonical의 GPG 키로 서명됩니다.security.ubuntu.com에서 제공됩니다.패키지 관리자는 일반적으로 안전하지만, 타사 .deb / .rpm / AppImage 설치는 안전하지 않을 수 있습니다. 신뢰할 수 있는 저장소의 서명된 패키지를 선호하고, 외부에서 얻은 패키지를 설치하기 전에 서명을 확인하십시오.
rust-toolchain.toml에 고정된 안정적인 Rust 도구 체인을 사용하십시오. 펌웨어는 riscv32imac-unknown-none-elf 대상을 사용합니다. 호스트 도구는 호스트 트리플을 사용합니다.
test-hal이 프로덕션 빌드로 유출될 경우 실패): ```bash
cargo run -p xtask -- check-fw
오브젝트 코드 및 아카이브는 target/riscv32imac-unknown-none-elf/release/ 아래에 위치합니다. 특정 보드용 완전한 부팅 가능한 Xous 시스템 이미지는 해당 제품의 빌드를 따를 때 더 넓은 Baochip / Xous 통합 흐름에 의해 생성됩니다. 여기 xtask는 xtask에 나열된 펌웨어 라이브러리 크레이트에 대해 cargo build를 실행합니다 (단일 준비된 플래시 파일이 아닙니다).
galdralag-service) — riscv32imac-unknown-xous-elf Xous 툴체인이 필요합니다 (위의 베어 riscv32imac-unknown-none-elf 펌웨어 트리플이 아닙니다). 리포지토리 루트에서: cargo run -p xtask -- build-and-register release. 이는 ELF를 재빌드하고, 디스크에서 검증하며, baosec 크레이트스펙을 출력하고, **--xous-core /path/to/xous-core**가 주어지면 선택적으로 **cargo xtask baosec**를 실행합니다. 자세한 내용: services/galdralag/README.md.이 리포지토리는 아직 원-커맨드 플래셔를 제공하지 않습니다. Baochip-1x 프로그래밍 (JTAG, ROM/USB 부트, 또는 벤더 도구)은 보드 및 실리콘 문서를 따릅니다. Supermagnum/Baochip-1x-firmware 에서 시작하세요; 평가 보드 하드웨어는 baochip/dabao 에 있습니다 — Dabao 보드에서 SW2는 부트로더 모드를 전환합니다 (해당 회로도 참조).
물리적 부트 버튼 없이 UF2 커밋: loader.uf2, xous.uf2, **apps.uf2**를 BAOCHIP 볼륨에 복사한 후, 물리적 boot 버튼을 누르거나 boot1 USB 시리얼 콘솔에서 **boot**를 입력할 수 있습니다 (1 000 000 baud, 예: screen /dev/ttyACM0 1000000). 이 단계에서만 boot 버튼에 의존하지 않아도 됩니다. **boot**를 입력하면 콘솔이 연결 해제됩니다. 이는 정상입니다 (시스템이 다음 단계로 재부팅됨). Linux에서는 dmesg --follow를 사용하여 USB 재열거를 확인할 수 있습니다. 이는 PROG와는 다릅니다 (USB 연결 시 PROG를 눌러 BAOCHIP 대용량 저장소 부트로더로 진입). baochip/dabao#2 (종료됨) 참조.
Xous / Baochip 흐름: 이미지는 실행 전에 Ed25519 서명되고 boot0에 의해 검증됩니다. 서명된 펌웨어 (Ed25519, boot0)를 참조하세요. dabao의 경우 UF2 레이아웃, USB 연결 시 PROG를 눌러 대용량 저장소 모드로 진입, boot1 업데이트 단계는 Getting Started with Baochip Targets 를 참조하세요.
galdra, galdrad, galdra-gtk)호스트 크레이트는 워크스페이스 루트에 있습니다: galdra/, galdrad/, galdra-gtk/.
Ubuntu / Debian (cargo build / cargo install 전에 설치):```bash
sudo apt update
sudo apt install build-essential pkg-config libpcsclite-dev pcscd libssl-dev
galdra-gtk:sudo apt install libgtk-4-dev
`libpcsclite-dev`는 **기본** **`galdra`** **PC/SC** 연결 경로를 충족합니다; **`pcscd`**는 런타임에 스마트 카드 리더기를 제공하는 데몬입니다. **`libssl-dev`**는 **openssl-sys**가 링크할 수 있도록 필요합니다 (**sequoia-net** 키서버 조회 및 **ldap3** TLS는 현재 **native-tls**를 사용합니다). **`galdra-gtk`**를 빌드하지 않는다면 **`libgtk-4-dev`**를 생략하세요.
**GTK 4 (`galdra-gtk` 전용):** `pkg-config`는 **gtk4**를 해결해야 합니다 (워크스페이스 크레이트 **`gtk`** 0.9.x, 패키지 **`gtk4`**). Fedora에서는 **`gtk4-devel`**을 사용하고, Arch에서는 **`gtk4`**를 사용합니다.
저장소 루트에서 릴리스 바이너리를 빌드하세요:```bash
cargo build --release -p galdra -p galdrad -p galdra-gtk
실행 파일들: target/release/galdra, target/release/galdrad, target/release/galdra-gtk.
설치를 ~/.cargo/bin에 하세요 (저장소 루트에 있지 않은 경우 --path를 조정하세요):```bash
cargo install --locked --path galdra
cargo install --locked --path galdrad
cargo install --locked --path galdra-gtk
대신 해당 세 바이너리를 `PATH`에 있는 디렉토리로 복사할 수 있습니다.
### `galdrad`와 데스크탑 GUI(`galdra-gtk`) 실행하기
**`galdra-gtk`**는 GTK4 데스크탑 바이너리입니다(Cargo 패키지 **`galdra-gtk`**; **`galdra-gui`**는 없습니다). **`galdrad`** REST API의 프론트엔드입니다. 먼저 **`galdrad`**를 실행하세요.
**데몬** — **`galdrad`**는 기본적으로 **`127.0.0.1:8742`**에서 수신합니다(`--listen`으로 재정의 가능). [`galdrad/src/main.rs`](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/galdrad/src/main.rs)를 참조하세요.```bash
galdrad
빠른 확인: curl -s http://127.0.0.1:8742/health (대화형 API 문서: http://127.0.0.1:8742/swagger-ui/.)
데스크톱 GUI — **galdra-gtk**는 기본적으로 **http://127.0.0.1:8742**를 사용합니다 (--base-url 또는 GALDRAD_URL); galdra-gtk/src/main.rs를 참조하세요.```bash
galdra-gtk
galdra-gtk --base-url http://127.0.0.1:8742
GALDRAD_URL=http://127.0.0.1:8742 galdra-gtk
새로운 **`cargo build --release`** 후, 설치 없이 저장소 루트에서 **`./target/release/galdrad`**를 실행한 다음 **`./target/release/galdra-gtk`**를 실행합니다.
**Host vs 토큰:** **`galdra-gtk`**는 **`galdrad`**가 HTTP로 노출하는 모든 것을 미러링하며, 토큰 **unlock**, **provision** 및 기타 CCID 흐름은 **`galdra`** CLI에 남아 있습니다. (자세한 내용은 **[docs/GALDRA-TOOL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md)** 및 계층 **2c**의 **`galdra device`** 참조).
**연락처 디렉토리 (`galdra contact`, `galdrad` `/contacts`):** 연락처를 생성하려면 **이메일이 필요**합니다 (CLI: `--email`; HTTP: JSON 필드 `email`). 선택적 필드에는 **표시 이름** (`--name` / `name`), **조직** (**`--org`** / `org`), **역할**, **배지** (**`--badge`** / `badge`), **메모**, **콜사인**, **Fluxer**, **Discord**, **IRC** ID, **전화번호** (`--phone-number` / `phone_number`), 추가로 **우편 힌트** (`street`, `country`, `postal_code`, `region`), 아마추어 무선 **`dmr_id`**, **`radio_affiliation`**이 있습니다. 이 값들은 로컬 SQLite 메타데이터에만 저장됩니다 (외부 서비스에 대해 **검증되지 않습니다**). **연락처 조회** (예: `galdra contact show`, `PATCH`/`DELETE` 경로, `galdrad` **`GET /contacts/{id}`**, 그룹 멤버 ID, 또는 **`POST /decrypt`** `recipient`)는 행의 **UUID**, **콜사인**, **이메일**, 완전한 **40자리 16진수 OpenPGP v4 지문** (공백 무시), 해당 소셜 ID, 또는 십진 토큰으로 제공된 **DMR 가입자 ID**(범위 **1..16777215**)를 허용합니다. **`galdra keyserver push`**는 동일한 레이블 중 다수를 Fulla 스타일 레지스트리로 미러링할 수 있습니다 (**`organisation`**, **`role`**, **`note`**, **`badge_number`**, **`phone_number`**, 무선/소셜/우편 필드, 이름 — **`galdra keyserver push --help`** 참조). 명령어 및 필드 제한은 **[docs/GALDRA-TOOL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md)**의 **Contacts** 및 **Identity model** 아래에 요약되어 있습니다.
### 호스트 도구 제거
위와 같이 `cargo install --path`를 사용한 경우:```bash
cargo uninstall galdra
cargo uninstall galdrad
cargo uninstall galdra-gtk
바이너리를 수동으로 복사했다면 추가한 파일을 제거하세요. 펌웨어는 호스트에 "설치"되지 않습니다. 장치를 지우거나 다시 플래시하는 작업은 하드웨어 문서에서 다룹니다.
아래 항목들은 Galdralag 펌웨어 기능이며, OpenPGP 카드 애플리케이션이나 GnuPG의 요구사항이 아닙니다.
3요소 대비 보안 모델 — USB 토큰의 소유 및 PIN의 지식이 현재 펌웨어에서 강제됩니다. 선택적 생체인식 세 번째 요소는 이 저장소에서 구현되지 않았습니다 (플레이스홀더: docs/BIOMETRIC_API.md). 범위와 제한 사항은 docs/THREE_FACTOR_AUTH.md를 참조하세요.
인증된 임시 ECDH 온디바이스 — 진정한 암호학적 순방향 비밀성. 각 세션은 토큰의 하드웨어 TRNG에서 새로운 임시 키 쌍을 생성합니다. 장기 키는 임시 제공값에 서명하지만 키 합의에 참여하지 않습니다. 과거 세션은 완전히 손상된 장기 키로도 복호화할 수 없습니다. 프로젝트 저자가 아는 한, 상용 하드웨어 보안 토큰 중 이 기능을 일급 기능으로 제공하는 제품은 없습니다.
샤미르 K-of-N 비밀 공유 온디바이스 — 장기 키를 N개의 조각으로 분할하여 K개를 모아야 복원할 수 있으며, 단독 보유자는 키를 혼자 복구할 수 없습니다. 프로젝트 저자가 아는 한, 상용 토큰 중 이 기능을 일급 기능으로 제공하는 제품도 없습니다.
암호화 알고리즘 불가지 프로필 시스템 — 대칭 암호화, ECDHE 곡선, 샤미르 설정이 명명된 감사 가능한 프로필로 결합됩니다. 프로필 아래의 대량 데이터에 대해 평문은 내부에서 외부로 암호화됩니다. 최대 4개의 서로 다른 대칭 AEAD를 서로 겹쳐 쌓을 수 있습니다. 따라서 한 프로필에 3개의 독립적인 암호화를 사용할 수 있습니다 (예: ChaCha20-Poly1305, Serpent-256, Twofish-256 순서), 또는 정책이 허용하는 경우 네 번째 별도 계층을 추가할 수 있습니다. 같은 프로필 내에서 암호화 중복 없음, 계층별 독립적인 HKDF-파생 키와 논스 자료를 사용합니다. 기본 제공 이름(예: standard, conservative, conservative-shamir)은 1~2개 계층을 제공하며, 더 깊은 스택은 고급 또는 사용자 정의 프로필용입니다. 전체 규칙 및 와이어 레이아웃: docs/CIPHER_PROFILES.md. 모든 프로필 선택은 감사 추적에 기록됩니다.
계단식 계층 간 키드 BLAKE3 (CESS) — 각 계층 자체의 AEAD 태그와 모드 A 외부 ChaCha20-Poly1305 봉투 외에도 CESS는 내부 계단식 단계 간에 키드 BLAKE3 스타일 무결성을 정의합니다. 레지스트리 매핑된 프로필(기본 제공 이름을 통한 suite_id)의 경우 ****은 다음 계층이 암호화하기 전에 각 내부 계층의 AEAD 출력 위에 를 추가합니다. 키는 를 사용하는 로 파생됩니다 (). 기본 제공 프로필은 추가 태그를 생략합니다. 프로필( 없음)은 계층 간 MAC 없이 레거시 계단식을 유지합니다. 및 참조. 암호화 규칙 아래의 ( AEAD 프리미티브, 한 프로필 내 , 순서 중요). BLAKE3 열은 CESS 개수(각 간격에 대해 독립적 on/off)이며, 메시지당 호스트 토글링이 아닙니다:
모든 프리미티브는 독립적으로 감사된 작업 공간 종속성에서 제공됩니다. 인트리에서 구현된 것은 없습니다.
pin-policy가 호출되기 전에 적용됩니다. 짧은 입력은 카운터를 증가시키지 않습니다.HMAC-SHA256(HostChallengeKey, nonce || passphrase)로만 전송됨.시도 임계값 설정 또는 조정: 카운터 제한은 토큰이 처음 프로비저닝될 때 기록되며 런타임 gpg 설정이 아닙니다. galdra 호스트 도구를 사용하십시오 (빌드 후):```bash
galdra device provision --pin-attempts 5
| Flag | Range | Default | Meaning |
|------|--------|---------|---------|
| `--pin-attempts` | 3–10 | **3** | 잠금/제로화 전 허용되는 실패한 PIN 시도 횟수 |
| `--min-pin-length` | 5–32 | **5** | 정책에 저장된 최소 사용자 PIN 길이 (영숫자) |
두 플래그를 모두 생략하면 기본값(`3`회 시도, `5`자 최소 길이)이 유지됩니다. 두 플래그를 모두 사용한 예: `galdra device provision --pin-attempts 7 --min-pin-length 8`.
정책은 **토큰에 저장**됩니다(볼트 정책). 호스트 도구는 프로비저닝 **이후**에 장치 자체의 인증된 관리 흐름을 거치지 않고는 임계값을 높이거나 낮출 수 없습니다. 프로비저닝을 위협 모델에 맞게 **3–10**을 선택하는 시점으로 취급하세요. 기본값과 더 높은 제한에 대한 근거는 [docs/GALDRA-TOOL.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/GALDRA-TOOL.md)의 PIN 정책 섹션에 설명되어 있습니다.
---
## 양자 내성 상태
### 구현됨 — 감사되지 않은 크레이트 (기능 플래그)
XMSS (RFC 8391, NIST SP 800-208) 및 LMS/HSS (RFC 8554, NIST SP 800-208)는 `--features pq-signatures` 뒤에 구현되어 있습니다. 기본 Rust 크레이트는 독립적으로 감사되지 않았습니다. [docs/PQ_SIGNATURES.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/PQ_SIGNATURES.md) 및 [docs/STATEFUL_SIG_STATE.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/STATEFUL_SIG_STATE.md)를 참조하세요.
### 독립 감사 대기 중 — 아직 구현되지 않음
이 알고리즘들은 NIST 표준화되었습니다. 구현은 독립적으로 감사된 `no_std` Rust 크레이트를 사용할 수 있을 때까지 차단되어 있습니다.
| Algorithm | Standard | Awaiting |
|-----------|----------|---------|
| ML-KEM | FIPS 203 | 감사된 `no_std` Rust 크레이트 |
| ML-DSA | FIPS 204 | 감사된 `no_std` Rust 크레이트 |
| SLH-DSA | FIPS 205 | 감사된 `no_std` Rust 크레이트 |
| FN-DSA (FALCON) | FIPS 206 초안 | 표준 최종화 + 감사된 크레이트 |
| HQC | 초안 ~2027 | 표준 최종화 + 감사된 크레이트 |
**libcrux에 대한 참고사항:** 2026년 학술 논문에서 libcrux의 공식 검증된 ML-KEM 및 ML-DSA 구현에서 증명이 무효화되는 것을 포함한 명세 수준의 버그가 확인되었습니다. 평가하기 전에 libcrux 변경 로그를 확인하세요.
### 구현되지 않을 것들
**BIKE**는 2025년 3월 NIST 표준화에서 **HQC**를 위해 제외되었습니다. **NTRU** 암호화는 2022년 7월에 제외되었습니다. 둘 다 NIST 표준으로 가는 경로가 없습니다.
---
## 제로화(Zeroisation) — 하드웨어 주의사항
제로화 구현은 **소프트웨어적으로는 정확하나 하드웨어로는 검증되지 않았습니다**. `test-hal` 시뮬레이션만으로 테스트되었습니다. Baochip-1x 실리콘에서의 물리적 검증(JTAG 메모리 검사, 전원 순환 복원력, 부채널 확인)은 아직 수행되지 않았습니다. [docs/HARDWARE_VERIFICATION.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/HARDWARE_VERIFICATION.md)를 참조하세요. 볼트 하위 시스템에 대한 의도된 **영역 순서** 및 **레이아웃 앵커**는 [docs/RRAM_LAYOUT.md](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/RRAM_LAYOUT.md)에 요약되어 있습니다. **물리적** 소거 순서는 플랫폼 및 **boot0** 통합 작업에 따라 달라집니다.
---
## 테스트 결과
공식 참조: **[`docs/TEST_RESULTS.md#run-metadata`](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/TEST_RESULTS.md#run-metadata)** (커밋, 범위 및 섹션 구성 방법). 해당 페이지에는 **파이프라인 요약** 표, 단위 테스트 총계, 벡터 범위(Wycheproof, RFC, BSI TR-03111 ECDH + ECDSA, NIST CAVP, BLAKE3 해시/키 해시/키 파생), **dudect** 타이밍 표, 키 수명 주기 검사, **[섹션 6 — cargo-fuzz](https://github.com/supermagnum/galdralag-firmware/blob/HEAD/docs/TEST_RESULTS.md#6-cargo-fuzz-libfuzzer)** (행렬, **`chacha_roundtrip`**, 기록된 **`openpgp_dispatch`** 장기 실행)이 포함되어 있습니다. **귀하**는 해당 결과가 이 프로젝트를 빌드하거나 실행하려고 시도하기에 충분한지 결정하세요. **가상 머신**은 선택 사항이지만 호스트 위험을 **줄여**줍니다.```
cargo run -p xtask -- test-all
펌웨어 중심 크레이트는 crates/ 아래에, 호스트 바이너리는 저장소 루트에 위치합니다 (멤버 목록은 루트 Cargo.toml [workspace] 참조):
이 작업 공간 테이블에 별도 크레이트로 포함되지 않음: baochip-openpgp 및 services/galdralag는 **--manifest-path**를 통해 빌드됩니다 (루트 Cargo.toml exclude 및 services/galdralag/README.md 참조). 선택적 대량/미끼 블록 저장소 (psram-store 설계 문서)는 아직 작업 공간 멤버가 아닙니다. 자세한 내용은 docs/Psram.md, docs/dev-ref.md 및 docs/SDMMC_STORAGE_INTEGRATION.md를 참조하세요.
원시 암호화는 인트리(in-tree)로 구현되지 않았습니다. 모든 암호화 작업은 RustCrypto 프로젝트의 감사된 작업 공간 종속성을 사용합니다. (vsss-rs와 dalek 패밀리는 별도 검토를 거쳤습니다.)```
aes-gcm chacha20poly1305 ed25519-dalek x25519-dalek
hkdf pbkdf2 hmac sha2 sha3 blake2 blake3
vsss-rs zeroize subtle p256 p384
감사된 크레이트를 사용한다는 것은 이 프로젝트가 검토되지 않은 암호화 코드를 도입하는 대신 해당 크레이트의 감사 이력을 상속받는다는 의미입니다.
---
---
[Read more](https://github.com/supermagnum/galdralag-firmware)
| 필드 | 목적 | 호스트 (galdra SQLite) | 온칩 연락처 저장소 | 형식/제한 |
|---|
| 연락처 ID | 안정적인 호스트 기본 키 | 예 | 아니요 | 텍스트 (SQLite의 id) |
| 표시 이름 | 사람이 읽을 수 있는 레이블 | 예 | 예 | UTF-8 문자열; 칩에서 힙 필드당 최대 240바이트 |
| 이메일 | 기본 메일 주소 | 예 | 예 | UTF-8 문자열; 칩에서 이메일 스캔으로 조회 |
| 콜사인 | 아마추어 무선 콜사인 | 예 | 예 | 12바이트, NUL 패딩; 칩에서 조회 |
| DMR 가입자 ID | DMR 무선 ID | 예 | 예 | 32비트 부호 없음 (0 = 없음); 칩에서 조회 |
| 배지 번호 | 직원 또는 배지 ID | 예 | 예 | UTF-8 문자열 |
| 조직 | 기관 또는 고용주 | 예 | 예 | UTF-8 문자열 |
| 부서 | 팀 또는 단위 | 예 | 예 | UTF-8 문자열 |
| 역할 | 직무 또는 기능 레이블 | 예 | 예 | UTF-8 문자열 |
| 참고 | 자유 형식의 주석 | 예 | 예 | UTF-8 문자열 |
| 무선 소속 | 클럽, 네트워크 또는 동맹 레이블 | 예 | 예 | UTF-8 문자열 |
| 거리 | 거리 주소 라인 | 예 | 예 | UTF-8 문자열 |
| 국가 | 국가 이름 또는 코드 | 예 | 예 | UTF-8 문자열 |
| 우편 번호 | 우편 번호 | 예 | 예 | UTF-8 문자열 |
| 지역 | 주, 군 또는 지역 | 예 | 예 | UTF-8 문자열 |
| Fluxer ID | Fluxer 핸들 또는 ID | 예 | 예 | UTF-8 문자열 |
| Discord ID | Discord 사용자 ID | 예 | 예 | UTF-8 문자열 |
| IRC ID | IRC 닉 또는 유사 | 예 | 예 | UTF-8 문자열 |
| 전화 번호 | 음성 또는 SMS 연락처 번호 | 예 | 아니요 | UTF-8 문자열; 호스트에서 최대 32자; 제출자가 선언, 확인되지 않음 |
| 지문 | 키 앵커 (조회, 동기화) | 예 (pgp_fingerprint) | 예 | 32바이트; 와이어 상 OpenPGP v4 스타일; G: 장치 지문과 다름 |
| 공개 키 | 암호화/검증 자료 | 예 (pgp_pubkey) | 예 (키 영역) | 알고리즘: Ed25519, X25519, Brainpool P-256/P-384/P-512, NIST P-256/P-384, RSA-2048/3072/4096; 칩에서 최대 768바이트 blob |
| PIN 보호 키 | PIN 잠금 해제가 필요한 키 | 호스트가 OpenPGP 키를 별도로 저장 | 예 | 칩에서 PIN 검증기 다이제스트 + AES-GCM 래핑 메타데이터 |
| 마지막 가져오기 | 키 자료가 새로고침된 시점 | 예 (fetched_at) | 예 (last_fetched) | 호스트에서 UTC; 칩에서 32비트 타임스탬프 |
| 만료 시간 | 키 만료 시간 | 예 | 아니요 | SQLite에서만 UTC 날짜시간 |
| 키 출처 | 호스트 레코드 생성 방법 | 예 (source) | 아니요 | 예: 수동, 키서버, WKD, LDAP, 파일, 피어 |
| 필드 출처 | 메타데이터 필드별 신뢰 레이블 | 아니요 | 예 (source_map) | 필드당 2비트: SelfAttested, HostVerified, RegistrySync, OobVerified |
| 레코드 플래그 | 활성, 오래됨, 자신의 신원, 취소됨 | 부분적으로 (호스트 로직) | 예 | 예: 칩에서 STALE, SELF_KEY |
| 메타데이터 필드 | OpenPGP / GnuPG | Galdra 키 (호스트 + 연락처 저장소) |
|---|
| 연락처 / 레코드 ID | 없음 (키 ID 또는 지문 사용) | 예 (호스트의 SQLite id, 칩에는 없음) |
| 표시 이름 | 사용자 ID 텍스트 내에만 (Name <email>) | 예 (별도 UTF-8 필드) |
| 이메일 | 사용자 ID 텍스트 내에만 | 예 (별도 필드, 칩에서 이메일로 조회) |
| 주소 | 표준 필드 없음 | 예 |
| 국가 | 표준 필드 없음 | 예 |
| 우편번호 / 우편번호 | 표준 필드 없음 | 예 |
| 지역 / 주 | 표준 필드 없음 | 예 |
| 조직 | 표준 필드 없음 | 예 |
| 부서 | 표준 필드 없음 | 예 |
| 역할 / 직책 | 표준 필드 없음 | 예 |
| 배지 / 직원 ID | 표준 필드 없음 | 예 |
| 콜사인 | 표준 필드 없음 | 예 (12 바이트, 칩에서 NUL 패딩) |
| DMR 가입자 ID | 표준 필드 없음 | 예 (32비트, 칩에서 조회) |
| 무선 소속 | 표준 필드 없음 | 예 |
| Fluxer ID | 표준 필드 없음 | 예 |
| Discord ID | 표준 필드 없음 | 예 |
| IRC id | 표준 필드 없음 | 예 |
| 전화번호 | 표준 필드 없음 | 예 (호스트 SQLite만) |
| 자유 형식 메모 | 표준 필드 없음 | 예 |
| OpenPGP v4 지문 | 예 (40 16진수 문자) | 인증서 연결 시 호스트 행에 선택 사항(pgp_fingerprint); Galdra 키의 경우 칩에 32 바이트 |
G: 디바이스 지문 | 없음 | 예 (SIG 공개 키에 대한 BLAKE3-160, 호스트 도구, OpenPGP v4 값 아님) |
| OpenPGP 키 ID | 예 (짧은 / 긴 형식) | 없음 |
| 신뢰 / 출처 | 사용자 ID에 대한 WoT 서명 | 필드별 레이블: SelfAttested, HostVerified, RegistrySync, OobVerified (칩) |
| 키 만료 | 예 (인증서 / 하위 키) | 호스트만 (expires_at in SQLite) |
| 마지막 키 가져오기 시간 | 호스트 도구에 따라 다름 | 예 (fetched_at / last_fetched) |
| 토큰의 개인 키 | SIG, DEC, AUT 카드 슬롯 | 별도 Galdra 키 영역 (사용자 ID 패킷 아님) |
| 개인 키 사용 PIN | PW1 / PW3 (OpenPGP 카드) | Galdra 연락처 레코드당 선택적 PIN 래핑 |
| OpenPGP 카드 객체 (위 표에 없음) | 호스트 (GnuPG) | 토큰 |
|---|
| 기본 + SIG / DEC / AUT 하위 키 | 키링에 공개 | 밀봉된 슬롯에 개인 |
| 인증 서명 (WoT) | 예 | 아니요 |
| 폐기 인증서 | 예 | 아니요 |
| 알고리즘 속성 (DO 0xC1 / 0xC2 / 0xC3) | gpg --card-edit | 예 |
galdra-core-host| 범위 | 일반적인 표준 / 문서 | 표준 OpenPGP 카드 + GnuPG로 노출됨? |
|---|
| OpenPGP 카드 애플리케이션 — APDU, PIN, SIG/DEC/AUT 슬롯, 카드에서 생성/서명/복호화 | OpenPGP 카드 사양 (docs/OPENPGP_CARD.md 참조) | 예 — 다른 OpenPGP 스마트 카드와 동일한 호스트 스택 (gpg, scdaemon, CCID) |
| USB CCID — 장치를 스마트 카드 리더기로 통신 | USB CCID 장치 클래스 | 예 — 클래스 드라이버 |
| OpenPGP 메시지 형식 — 암호화된 파일, 메일, 키 패킷 | RFC 4880 (및 업데이트) | 호스트에서 예 — GnuPG가 사용; 카드는 메일을 파싱하지 않음 |
| Shamir K-of-N — 볼트에서 장기 키 자료 분할/복구 | OpenPGP 카드 사양에 없음; GnuPG에 없음 | 아니오 — 펌웨어 및 프로비저닝 도구 전용; gpg --card-edit 작업이 아님 (Shamir and full-disk encryption 참조) |
| 인증된 임시 ECDH — 토큰에서 전방 비밀 세션 프로토콜 | OpenPGP 카드 사양에 없음 | 아니오 — 토큰 전용; GnuPG 카드 명령이 아님 |
| 암호 프로필 시스템 — 명명된 대칭 캐스케이드(독립 암호를 서로 위에 쌓음; 최대 4개 계층, 3개는 지원되는 깊이) 및 관련 정책 | OpenPGP 카드 사양에 없음 | 아니오 — 펌웨어 / 호스트 토큰 도구 |
| microSD 유인 / 대량 저장 페르소나 — 정보 없는 호스트 USB 동작 | OpenPGP 카드 사양에 없음 | 아니오 — 별도 USB 성격 코드 경로 |
| WebAuthn / FIDO2 | CTAP / WebAuthn | 구현되지 않음 — OpenPGP 카드와 다른 표준 |
| 계층 | 역할 |
|---|
| 드라이브 | 마스터 키(예: LUKS, VeraCrypt 또는 원시 블록 계층을 통한 AES-256)로 암호화됨 |
| 마스터 키 | SSS로 N개의 공유로 분할, 임계값 K-of-N |
| 공유 | 사람, 장치 또는 오프라인 저장소가 보유; K개의 공유가 함께 마스터 키를 재구성 |
| 잠금 해제 | 키를 재구성한 다음 cryptsetup, veracrypt 또는 스택에 전달 |
| 공유 보호 | 배포 전에 각 공유를 특정 수신자(예: 해당 수신자의 OpenPGP 키)로 암호화 |
| 재구성 위치 | 에어갭 머신, HSM 정책, 또는 통제된 환경 — 신뢰할 수 없는 공유 호스트는 안 됨 |
| 시나리오 | SSS와 강력하고 정책에 부합하는 곡선이 중요한 이유 |
|---|
| 직원 퇴사 또는 사망 | 해당 직원의 독점 비밀 없이도 복구가 가능함 |
| 적법한 절차에 따른 합법적 접근 | 정족수가 요구될 수 있음 — 어떤 단일 당사자도 전체 잠금 해제 비밀을 보유하지 않음 |
| 기업 키 에스크로 | 감사 가능한 분할; 단일 관리자가 완전한 접근 권한을 가지지 않음 |
| 하드웨어 압수 | 미디어가 K of N 공유를 캡처하지 않고 압수될 수 있음 |
| 규제 정렬 (EU / BSI) | Brainpool은 많은 독일 및 EU 정부 암호화 요구 사항을 충족함 |
| 관할권 | 이 문서에서 다루어진 상태 |
|---|
| 독일 | 위에 설명된 Governikus/BSI 플로우 |
| 에스토니아 | 칩 기반 eID. 2017~2018년 ROCA 취약점으로 인해 RSA를 완전히 포기해야 했던 후(칩이 안전한 RSA 키를 생성할 수 없었고 더 큰 키 크기로의 경로가 없었음) RSA에서 NIST P-384(secp384r1) ECDSA로 마이그레이션됨. 개인 키는 하드웨어에 바인딩되어 있으며 카드에서 읽을 수 없음. Governikus 스타일의 OpenPGP 서명 서비스는 발견되지 않음. |
| 벨기에 | 칩 기반 eID. 이전 카드는 RSA 1024비트를 사용했음. 새로운 카드(애플릿 1.8 이후)는 NIST P-384 ECDSA를 사용함. 활성 오픈 소스 미들웨어 생태계(eid-mw, OpenSC). Governikus 스타일의 OpenPGP 서명 서비스는 발견되지 않음. |
| 노르웨이 | 국가 ID 카드 칩(2020년부터 발급)은 ICAO 9303 호환 가능하며 여행 문서 칩만 구현함. eID 서명 기능은 없음. 서명 eID는 별도: SEID 하에서 인증된 민간 제공자(Buypass, Commfides), 역사적으로 RSA 2048비트, SEID 2.0에서 ECC 도입과 함께 RSA 3072비트로 이동 중. Governikus 스타일의 OpenPGP 서명 서비스는 발견되지 않음. 여행 칩과 서명 eID는 별개임—누군가 카드 칩만 직접 사용하려고 할 때 관련됨. |
| 오스트리아 | 부분적으로 조사됨. eID는 ECC 사용(확인됨). 사용 가능한 출처에서 특정 곡선은 확인되지 않음. 단일 카드가 아닌 다중 토큰 Bürgerkarte 모델; 주로 모바일 앱으로 마이그레이션됨. 곡선 세부 사항 및 OpenPGP 서명 서비스에 대한 추가 조사 필요. |
| 미국 | PIV 카드(개인 신원 확인, FIPS 201 / NIST SP 800-78): 연방 직원 및 계약자에게만 발급—보편적인 민간 카드가 아님. 알고리즘: 인증 키에 NIST P-256 필수; 서명/키 관리에 P-256 또는 P-384; RSA 2048/3072도 허용됨; NIST 곡선만, Brainpool 없음. 신뢰 루트는 연방 공통 정책 CA(FCPCAG2), 표준 상업 신뢰 저장소에 포함되지 않음. Governikus 스타일의 OpenPGP 서명 서비스는 발견되지 않음. FPKI는 OpenPGP와 별개의 X.509 인프라임. PIV가 연방 전용이므로 독일 eID와 같은 민간 신뢰 앵커가 아님. |
| 캐나다 | 온칩 서명 키가 있는 국가 칩 기반 신분증 없음. 디지털 신원은 지방별 체계(예: BC 서비스 카드), 모바일 앱(예: eID-Me), 진화하는 연방 디지털 자격 증명 프레임워크에 걸쳐 분산됨. 독일, 에스토니아 또는 벨기에 모델과 비교할 수 있는 단일 카드 없음. 동등한 카드 인프라 발견되지 않음—이러한 의미에서 실행 가능한 신뢰 앵커가 아님. |
| 기타 국가 | 조사되지 않음 |
| 목표 | 시작 위치 |
|---|
| 프로젝트 개요, 뉴스, 커뮤니티 | sequoia-pgp.org |
| 기여(이슈, 수정, 기능, 문서); 대규모 작업 전에 연락 | 기여, 연락처 |
개발자 문서 — 구현 확장을 위한 API 표면(sequoia-openpgp 및 관련 크레이트) | 문서 — 예: docs.rs의 sequoia-openpgp |
| 소스 및 트래커 | gitlab.com/sequoia-pgp (핵심 라이브러리 및 도구); github.com/sequoia-pgp (미러 / 선택된 저장소); 프로젝트 |
| OpenPGP 표준의 새로운 알고리즘 | 여전히 IETF OpenPGP 작업 그룹 을 통해 진행. Sequoia 및 기타 구현은 초안 및 RFC를 구현함. 프로토콜 변경 사항을 거기서 제안하고, 구현자(Sequoia 포함)와 조정하여 동작이 사양과 일치하도록 함. |
cipher-profilecess::cess_blake3_integrity_gap_infosuite_idcipher-profile| 계단식 길이 | 정렬된 구분되는 암호화 스택 | × 각 길이−1 간격에서 선택적 BLAKE3 on/off |
|---|---|---|
| 1계층 | 5 | 5 × 2^0 = 5 |
| 2계층 | 20 | 20 × 2^1 = 40 |
| 3계층 | 60 | 60 × 2^2 = 240 |
| 4계층 | 120 | 120 × 2^3 = 960 |
| 합계 | 205 | 1245 |
205 수치는 암호화 스택만 계산한 것입니다 (AES-256-GCM, ChaCha20-Poly1305, Twofish-256, Serpent-256, Camellia-256 중 1~4개의 구분되는 선택의 순열). 1245 수치는 동일한 스택에 각 계층 간 선택적 BLAKE3의 모든 독립적인 on/off 패턴을 곱한 것입니다 (k계층에 대해 2^(k−1) 패턴). 이 펌웨어는 기본 제공 suite_id 프로필이 ≥ 2 계층을 가질 때 모든 간격에 대해 계층 간 MAC을 적용합니다 (간격별 토글링 아님). 기본 제공 프로필 이름은 205개 중 작은 하위 집합을 사용합니다.
선택적 microSD 낚시 볼륨 — PSRAM 칩이 장착된 경우 잠금 해제 후 추가 대량 낚시 LUN이 나타날 수 있습니다. microSD가 장착되지 않은 경우 장치는 여전히 하드웨어 보안 토큰입니다 (볼트, PIN 정책, OpenPGP/CCID 및 기타 토큰 기능은 변경되지 않으며, 선택적 대량 볼륨만 없음). 정보가 없는 호스트의 경우 장치는 여전히 구성된 곳에서 일반적인 온칩 대량 저장 낚시 페르소나를 제공합니다. microSD 콘텐츠(있는 경우)는 의도적으로 암호화되지 않고 평범합니다. 실제 키 자료는 PIN 정책 및 볼트 뒤의 온칩 RRAM에 저장됩니다.
완전 개방형 스택 — CERN-OHL-W-2.0 RTL, 오픈 회로도, 재현 가능한 부트로더, Rust/Xous OS, IRIS 검사 가능한 실리콘.
| 알고리즘 | 표준 | 비고 |
|---|
| BrainpoolP256r1 ECDH + ECDSA | RFC 5639, BSI TR-03111 | BSI 표준, NSA 개입 없음 |
| BrainpoolP384r1 ECDH + ECDSA | RFC 5639, BSI TR-03111 | ~192비트 보안 |
| X25519 ECDH | RFC 7748 | |
| Ed25519 서명 / 검증 | RFC 8032 | |
| RSA-2048 / 3072 / 4096 OAEP, PSS | RFC 8017 | 최소 2048비트 강제 |
| P-256, P-384 | NIST | p256 / p384 작업 공간 종속성 통해 |
| 알고리즘 | 표준 | 비고 |
|---|
| AES-256-GCM | FIPS 197, NIST SP 800-38D | Baochip-1x의 하드웨어 AES |
| ChaCha20-Poly1305 | RFC 8439 | NSA 개입 없음 |
| Twofish-256 | Schneier 외 1998 | AES 최종 후보, NSA 개입 없음 |
| Serpent-256 | Anderson / Biham / Knudsen 1998 | AES 최종 후보, 32라운드, 보수적 마진 |
| 알고리즘 | 표준 |
|---|
| HKDF (SHA-256 / SHA-512) | RFC 5869 |
| HMAC (SHA-256 / SHA-512) | RFC 2104 |
| PBKDF2 | RFC 8018 |
| SHA-2 (224 / 256 / 384 / 512) | FIPS 180-4 |
| SHA-3 패밀리 | FIPS 202 |
| BLAKE2b / BLAKE2s | RFC 7693 |
| BLAKE3 | BLAKE3 명세 |
| 기능 | 비고 |
|---|
| 샤미르 K-of-N 비밀 공유 | vsss-rs — 온디바이스 분할 및 복구 |
| 인증된 임시 ECDH | 순방향 비밀 세션 프로토콜 — ephemeral-session 크레이트 |
| 암호화 프로필 시스템 | 대칭 계단식: 최대 4개의 다른 AEAD 스택 (예: 3개의 독립 계층); 계층별 키 — cipher-profile — docs/CIPHER_PROFILES.md |
| 속성 | 구현 |
|---|
| 순방향 비밀성 | 임시 ECDH: 장기 키는 서명만, 합의하지 않음 |
| 비교 전 PIN 카운터 | subtle::ConstantTimeEq 전에 RRAM에 플러시됨 — 예외 없음 |
| 하드웨어 영점화 | TRNG 소스 다중 패스 덮어쓰기; boot0은 USB 열거 전 영점화 |
| USB 버스에 비밀 없음 | 정보 없는 호스트는 표준 대량 저장만 봄; 지문 가능성 없음 |
| 단조 부정 조작 증거 | 항상 켜짐 도메인의 하드웨어 단방향 카운터 |
| 3요소 인증 | 소유: USB 토큰; 지식: 온디바이스 PIN (pin-policy); 선택적 생체인식 미구현 — docs/THREE_FACTOR_AUTH.md |
| RRAM 카운터 및 감사 추적 | PIN용 단조 HAL (및 미래 상태 기반 PQ 서명); 프로필 감사 기록 및 인-램 OpenPGP 감사 후크 — 추가 전용 NV 감사 로그 미구현 — docs/AUDIT_LOG.md, docs/RRAM_LAYOUT.md |
| 상수 시간 연산 | 모든 비밀 비교는 subtle을 통해; dudect 하네스로 검증됨 |
| test-hal은 제품에 사용되지 않음 | check-fw xtask로 강제됨 |
| 크레이트 | 역할 |
|---|
galdr-core | HAL 트레이트 (MonotonicCounter, HardwareTrng, ZeroiseController, VaultStorage), 공유 오류, test-hal 페이크 |
vault | RRAM 금고 계약, HKDF KeyPurpose 레이블, 키 자료 타입 (zeroize, Clone/Copy 없음) |
pin-policy | PIN 상태 머신; subtle::ConstantTimeEq 이전 카운터 증가; 임계값 제로화 |
usb-personality | 대용량 저장소 대 인증된 잠금 해제 페르소나 (미끼 대용량 저장소 역할 포함); 챌린지/응답; OpenPGP/CCID 카드 애플리케이션; 잠금 시 USB 연결 해제 |
ephemeral-session | 인증된 임시 ECDH 세션 프로토콜; 전방향 보안 |
cipher-profile | 사용자 구성 가능한 암호 캐스케이드 프로필; 내장 및 사용자 정의 |
cess | HKDF-BLAKE3 K_outer, ChaCha 외부 AEAD, suite_id || inner_blob; CESS_CONFORMANCE.md 참조 |
biometric-api | 생체 인식 사전 게이트 와이어 타입 (CBOR, SignedMatchResult), 세션 토큰 헬퍼 |
biometric-vault | 템플릿 봉인 및 금고 측 통합 부품 |
biometric-fingervein / biometric-sweet | 플러그형 생체 인식 백엔드 스케치 |
security-tests | 암호화 경로에 대한 dudect 타이밍 harness |
host-tools | 호스트 매니페스트 해싱, 업데이트 검증, psram-unlock, galdralag-provision (Xous 2선 CDC PIN 프로비저닝) |
xtask | 빌드, 검사, 테스트, 퍼즈, build-and-register (Xous galdralag-service), 타이밍 테스트 |
galdra-core-host | SQLite 스키마, 연락처/그룹/감사/동기화, HKP/WKD/LDAP 가져오기, 장치 및 OpenPGP 호스트 헬퍼 |
galdra | galdra-core-host 위의 CLI |
galdrad | 로컬 REST 데몬 |
galdra-gtk | GTK4 데스크탑 UI |