
सुरक्षित, तेज़, और पोर्टेबल C90 कार्यान्वयन ML-KEM / FIPS 203 का
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-bit, Neon), Intel/AMD (64-bit, AVX2), RISC-V (64-bit, RVV) और POWER (ppc64le, VSX) के लिए मूल बैकएंड शामिल हैं। प्रदर्शन डेटा के लिए benchmarks देखें।
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 बनाम 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