
सुरक्षित, तेज़, और पोर्टेबल C90 कार्यान्वयन ML-KEM / FIPS 203 का
mlkem-native, ML-KEM1 का एक सुरक्षित, तेज़ और पोर्टेबल C902 कार्यान्वयन है। यह ML-KEM संदर्भ कार्यान्वयन3 का एक फोर्क है।
mlkem/src/* और mlkem/src/fips202/* में सभी C कोड CBMC4 का उपयोग करके मेमोरी-सुरक्षित (कोई मेमोरी ओवरफ्लो नहीं) और टाइप-सुरक्षित (कोई इंटीजर ओवरफ्लो नहीं) सिद्ध किया गया है। सभी AArch64 और x86_64 असेंबली HOL-Light5 का उपयोग करके कार्यात्मक रूप से सही, मेमोरी-सुरक्षित और गोपनीय-स्वतंत्र टाइमिंग (कॉन्स्टेंट-टाइम) सिद्ध की गई है।
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 कोड उपयुक्त बाधाओं और कॉन्स्टेंट-टाइम पैटर्न के माध्यम से कंपाइलर-प्रस्तुत टाइमिंग साइड चैनलों (जैसे 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 बनाम 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 के साथ भेजे गए कार्यान्वयन के बजाय इसका उपयोग कर सकते हैं। tiny_sha312 का उपयोग करने वाले उदाहरण के लिए FIPS202.md और 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 issue न बनाएं।
यदि आपके पास कोई अन्य प्रश्न / गैर-सुरक्षा संबंधी मुद्दा / फीचर अनुरोध है, तो कृपया एक GitHub issue खोलें।
यदि आप 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-bit 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,
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 ↩