
ML-KEM / FIPS 203의 안전하고 빠르며 휴대 가능한 C90 구현
mlkem-native은 ML-KEM[^FIPS203]의 안전하고 빠르며 이식 가능한 C90[^C90] 구현체입니다. 이는 ML-KEM 참조 구현체[^REF]의 포크입니다.
mlkem/src/* 및 mlkem/src/fips202/*의 모든 C 코드는 CBMC[^CBMC]를 사용하여 메모리 안전성(메모리 오버플로 없음)과 타입 안전성(정수 오버플로 없음)이 증명되었습니다. 모든 AArch64 및 x86_64 어셈블리는 HOL-Light[^HOL-Light]를 사용하여 기능적 정확성, 메모리 안전성, 비밀 독립적 타이밍(상수 시간)이 증명되었습니다.
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 코드는 적절한 배리어와 상수 시간 패턴을 통해 컴파일러 도입 타이밍 부채널(KyberSlash[^KyberSlash] 또는 clangover[^clangover] 등)에 대해 강화되었습니다.
비밀 종속 분기, 메모리 접근 패턴 및 가변 지연 명령어의 부재는 다양한 컴파일러 및 컴파일 옵션 조합으로 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 논문[^SLOTHY_Paper]에 설명된 접근 방식을 따라 SLOTHY 슈퍼최적화기를 사용하여 개발되었습니다: '깨끗한' 어셈블리를 수동으로 작성하고 마이크로 최적화를 자동화합니다(예: clean vs optimized AArch64 NTT 참조). 자세한 내용은 dev/README.md를 참조하세요.
mlkem-native는 모든 공식 ACVP ML-KEM 테스트 벡터[^ACVP] 및 Wycheproof[^wycheproof] 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 클라이언트를 직접 사용하여 Wycheproof[^wycheproof] 테스트를 실행할 수 있습니다:
# 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를 참조하세요.