
ML-KEM / FIPS 203의 안전하고 빠르며 휴대 가능한 C90 구현
mlkem-native은 ML-KEM1의 안전하고 빠르며 이식 가능한 C902 구현체입니다. 이는 ML-KEM 참조 구현체3의 포크입니다.
mlkem/src/* 및 mlkem/src/fips202/*의 모든 C 코드는 CBMC4를 사용하여 메모리 안전성(메모리 오버플로 없음)과 타입 안전성(정수 오버플로 없음)이 증명되었습니다. 모든 AArch64 및 x86_64 어셈블리는 HOL-Light5를 사용하여 기능적 정확성, 메모리 안전성, 비밀 독립적 타이밍(상수 시간)이 증명되었습니다.
mlkem-native는 Arm(64비트, Neon), Intel/AMD(64비트, AVX2), RISC-V(64비트, RVV), POWER(ppc64le, VSX)용 네이티브 백엔드를 포함합니다. 성능 데이터는 벤치마크를 참조하세요.
mlkem-native는 Linux Foundation의 일부인 Post-Quantum Cryptography Alliance의 지원을 받습니다.
# 기본 패키지 설치
sudo apt-get update
sudo apt-get install make gcc python3 git
# mlkem-native 클론
git clone https://github.com/pq-code-package/mlkem-native.git
cd mlkem-native
# 빌드 및 테스트 실행
make build
make test
# `make`를 감싸는 편의 래퍼인 `tests`를 사용하는 동일한 방법
./scripts/tests all
# 모든 옵션 표시
./scripts/tests --help
자세한 내용은 BUILDING.md를 참조하세요.
mlkem-native는 다음에서 사용됩니다.
mlkem/src/* 및 mlkem/src/fips202/*의 모든 C 코드는 메모리 안전성(메모리 오버플로 없음)과 타입 안전성(정수 오버플로 없음)이 증명되었습니다. 이는 C Bounded Model Checker (CBMC)를 사용하며 소스 코드의 함수 계약 및 루프 불변식 주석을 기반으로 합니다. 자세한 내용은 proofs/cbmc를 참조하세요.
모든 AArch64 및 x86_64 어셈블리는 객체 코드 수준에서 기능적 정확성, 메모리 안전성, 비밀 독립적 타이밍(상수 시간)이 증명되었습니다. 이는 HOL-Light 대화형 정리 증명기와 s2n-bignum 검증 인프라(Arm 및 x86 아키텍처의 관련 부분 모델 포함)를 사용합니다. 자세한 내용은 proofs/hol_light를 참조하세요.
참고: 정형 검증은 절대적이지 않습니다. mlkem-native 관련 정형 검증 노력의 범위, 가정 및 위험에 대한 자세한 분석은 SOUNDNESS.md를 참조하세요.
mlkem-native의 모든 AArch64 및 x86_64 어셈블리는 HOL Light에서 비밀 종속 제어 흐름, 메모리 접근 패턴 및 가변 지연 명령어가 없음이 공식적으로 증명되어 대부분의 타이밍 부채널을 차단합니다 (자세한 내용은 proofs/hol_light 참조). C 코드는 적절한 배리어와 상수 시간 패턴을 통해 컴파일러 도입 타이밍 부채널(KyberSlash6 또는 clangover7 등)에 대해 강화되었습니다.
비밀 종속 분기, 메모리 접근 패턴 및 가변 지연 명령어의 부재는 다양한 컴파일러 및 컴파일 옵션 조합으로 valgrind를 사용하여 테스트됩니다.
기타 공격. mlkem-native는 타이밍 부채널에 대한 저항만을 목표로 합니다. 전력 및 전자기 부채널, 마이크로아키텍처 부채널(예: 추측 실행), 또는 오류 주입 공격과 같은 다른 공격 클래스는 현재 범위를 벗어납니다.
mlkem-native는 산술 및 FIPS202 / SHA3용 _프론트엔드_와 두 개의 _백엔드_로 분할됩니다. 프론트엔드는 고정되어 있으며 C로 작성되고 성능에 중요하지 않은 모든 루틴을 다룹니다. 백엔드는 유연하며 성능에 민감한 루틴을 처리하고 C 또는 네이티브 코드(어셈블리/인트린직)로 구현할 수 있습니다. 산술 백엔드는 mlkem/src/native/api.h, FIPS-202 백엔드는 mlkem/src/fips202/native/api.h를 참조하세요.
mlkem-native는 현재 다음 백엔드를 제공합니다:
새 백엔드를 기여하려면 연락하거나 PR을 열어주세요.
우리의 AArch64 어셈블리는 SLOTHY 논문8에 설명된 접근 방식을 따라 SLOTHY 슈퍼최적화기를 사용하여 개발되었습니다: '깨끗한' 어셈블리를 수동으로 작성하고 마이크로 최적화를 자동화합니다(예: clean vs optimized AArch64 NTT 참조). 자세한 내용은 dev/README.md를 참조하세요.
mlkem-native는 모든 공식 ACVP ML-KEM 테스트 벡터9 및 Wycheproof10 ML-KEM 테스트 벡터에 대해 테스트됩니다.
tests 스크립트 또는 ACVP 클라이언트를 직접 사용하여 ACVP 테스트를 실행할 수 있습니다:
# tests 스크립트 사용
./scripts/tests acvp
# 특정 ACVP 릴리스 사용
./scripts/tests acvp --version v1.1.0.41
# ACVP 클라이언트 직접 사용
python3 ./test/acvp/acvp_client.py
python3 ./test/acvp/acvp_client.py --version v1.1.0.41
# 특정 ACVP 테스트 벡터 파일 사용 (ACVP-Server에서 다운로드)
# python3 ./test/acvp/acvp_client.py -p {PROMPT}.json -e {EXPECTED_RESULT}.json
# 예를 들어, 위 명령을 실행했다고 가정
python3 ./test/acvp/acvp_client.py \
-p ./test/acvp/.acvp-data/v1.1.0.41/files/ML-KEM-keyGen-FIPS203/prompt.json \
-e ./test/acvp/.acvp-data/v1.1.0.41/files/ML-KEM-keyGen-FIPS203/expectedResults.json
tests 스크립트 또는 Wycheproof 클라이언트를 직접 사용하여 Wycheproof10 테스트를 실행할 수 있습니다:
# tests 스크립트 사용
./scripts/tests wycheproof
# Wycheproof 클라이언트 직접 사용
python3 ./test/wycheproof/wycheproof_client.py
tests 스크립트를 사용하여 성능, 메모리 사용량 및 바이너리 크기를 측정할 수 있습니다:
# 속도 벤치마크 (-c는 사이클 카운터 선택: NO, PMU, PERF 또는 MAC)
# 참고: PERF/MAC은 sudo로 벤치마킹 바이너리를 실행하기 위해 -r 플래그가 필요할 수 있습니다
./scripts/tests bench -c PMU
./scripts/tests bench -c PERF -r
# 스택 사용량 분석
./scripts/tests stack
# 바이너리 크기 측정
./scripts/tests size
CI 벤치마크 결과 및 과거 성능 데이터는 벤치마킹 페이지를 참조하세요.
mlkem-native를 사용하려면 mlkem을 프로젝트의 소스 트리로 가져오고 선호하는 빌드 시스템을 사용하여 빌드하세요. 자세한 내용은 mlkem을, 간단한 예제는 examples/basic을 참조하세요. 이 저장소에 제공된 빌드 시스템은 개발 목적으로만 사용됩니다.
반환 값, 포인터 유효성, 오류 시 출력 버퍼 상태 등 모든 공용 함수에 적용되는 규칙은 API-CONVENTIONS.md를 참조하세요.
mlkem-native는 FIPS-20211 구현에 의존하며 함께 제공됩니다. 라이브러리에 자체 FIPS-202 구현이 있는 경우 mlkem-native와 함께 제공되는 구현 대신 사용할 수 있습니다. FIPS202.md 및 tiny_sha312을 사용하는 예제는 examples/bring_your_own_fips202를 참조하세요.
아니요. C 전용 빌드를 원하면 가져오기에서 mlkem/src/native 및/또는 mlkem/src/fips202/native 디렉토리를 생략하고
mlkem_native_config.h에서 MLK_CONFIG_USE_NATIVE_BACKEND_ARITH 및/또는 MLK_CONFIG_USE_NATIVE_BACKEND_FIPS202를 설정 해제하세요.
아니요. 사용을 고려하는 것을 권장하지만 mlkem-native는 CBMC 없이도 잘 빌드되고 실행됩니다. cbmc.h를
포함하고 CBMC가 정의되지 않았는지 확인하기만 하면 됩니다. 특히 코드에서 모든 함수
계약 및 루프 불변식을 제거할 필요는 없습니다. CBMC가 설정되지 않은 한 무시됩니다.
예. 보안 수준은 mlkem_native_config.h에서 MLK_CONFIG_PARAMETER_SET=512/768/1024를 설정하여 구성되는 컴파일 타임 매개변수입니다.
라이브러리/응용 프로그램에 여러 보안 수준이 필요한 경우 공통 코드를 공유하면서 mlkem-native의 세 인스턴스를 빌드하고 링크할 수 있습니다.
이를 '다중 수준 빌드'라고 하며 examples/multilevel_build에서 시연됩니다. mlkem도 참조하세요.
예, ML-KEM 네이티브 산술 및/또는 FIPS-202용 추가 백엔드를 추가할 수 있습니다. 기존 백엔드를 템플릿으로 따르거나 사용자 정의 백엔드를 등록하는 방법에 대한 최소 예제는 examples/custom_backend를 참조하세요.
mlkem-native에서 보안 버그를 발견했다고 생각되면 Github의 비공개 취약점 보고를 통해 취약점을 보고해 주세요. 공개 GitHub 이슈를 생성하지 마십시오.
다른 질문 / 보안 관련 없는 이슈 / 기능 요청이 있으면 GitHub 이슈를 열어주세요.
mlkem-native 구축을 도와주고 싶다면 연락해 주세요. PQCA Discord를 통해 mlkem-native 팀에 연락할 수 있습니다. CONTRIBUTING.md도 참조하세요.
National Institute of Standards and Technology: FIPS 203 Module-Lattice-Based Key-Encapsulation Mechanism Standard, https://csrc.nist.gov/pubs/fips/203/final ↩
엄밀히 말하면 C90 + stdint.h + 64비트 unsigned long long에 의존합니다. ↩
Bos, Ducas, Kiltz, Lepoint, Lyubashevsky, Schanck, Schwabe, Seiler, Stehlé: CRYSTALS-Kyber C reference implementation, https://github.com/pq-crystals/kyber/tree/main/ref ↩
Diffblue, Amazon Web Services: C Bounded Model Checker, https://github.com/diffblue/cbmc ↩
John Harrison: HOL-Light Theorem Prover, https://hol-light.github.io/ ↩
Bernstein, Bhargavan, Bhasin, Chattopadhyay, Chia, Kannwischer, Kiefer, Paiva, Ravi, Tamvada: KyberSlash: Exploiting secret-dependent division timings in Kyber implementations, https://kyberslash.cr.yp.to/papers.html ↩
Antoon Purnal: clangover, https://github.com/antoonpurnal/clangover
Abdulrahman, Becker, Kannwischer, Klein: Fast and Clean: Auditable high-performance assembly via constraint solving, https://eprint.iacr.org/2022/1303 ↩
National Institute of Standards and Technology: Automated Cryptographic Validation Protocol (ACVP) Server, https://github.com/usnistgov/ACVP-Server ↩
Community Cryptography Specification Project: Project Wycheproof, https://github.com/C2SP/wycheproof ↩ ↩2
National Institute of Standards and Technology: FIPS202 SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions, https://csrc.nist.gov/pubs/fips/202/final ↩
Markku-Juhani O. Saarinen: tiny_sha3, https://github.com/mjosaarinen/tiny_sha3 ↩