- Python के डिफ़ॉल्ट hash और HMAC algorithms अब verified cryptographic code HACL* से बदल दिए गए हैं
- लगभग 15,000 पंक्तियों का C code HACL* से अपने-आप Python codebase में इंटीग्रेट किया गया है
- अलग-अलग block algorithms को संभालने के लिए streaming API को generic रूप से डिज़ाइन और verify किया गया है
- memory allocation failure handling, AVX2 compile issues का समाधान, CI environment optimization जैसे उन्नत engineering मुद्दों को संबोधित किया गया है
- Python और cryptography community के सहयोग से वास्तविक security और maintainability दोनों सुनिश्चित किए गए हैं
Python के cryptographic algorithms में पूरी तरह verified code का समावेश
- 2022 में सामने आए SHA3 implementation से जुड़े CVE-2022-37454 के बाद, Python में hash infrastructure को verified code पर शिफ्ट करने की ज़रूरत उठी
- इसके बाद ढाई साल में Python ने अपने डिफ़ॉल्ट hash और HMAC algorithms को HACL* आधारित verified implementation से पूरी तरह बदल दिया
- यह बदलाव users के लिए पूरी तरह transparent तरीके से किया गया और functionality में कोई कमी नहीं आई
- HACL* ने Python के लिए अतिरिक्त features भी implement किए: Blake2 के विभिन्न modes, SHA3 के Keccak variants के लिए support API, HMAC के लिए streaming optimization आदि
- नए versions का समावेश scripts के ज़रिए automated है, इसलिए maintenance आसान है
streaming API को समझना
- ज़्यादातर cryptographic algorithms block algorithms होते हैं, यानी उन्हें input को block units में process करना पड़ता है
- वास्तविक उपयोग स्थितियों में block units में input देना मुश्किल होता है, इसलिए streaming API की ज़रूरत पड़ती है
- streaming API input length की परवाह किए बिना काम करता है और intermediate results निकालना भी संभव बनाता है
- streaming implementation में जटिल state management चाहिए, और पहले के SHA3 implementation में इससे जुड़ी गंभीर security flaw मौजूद थी
- हर hash algorithm का processing तरीका अलग होने से complexity बढ़ती है: जैसे Blake2 empty block को allow नहीं करता, HMAC में key को initialize करने के बाद हटाया जा सकता है
generic streaming algorithm verification
- 2021 के एक paper में पेश किया गया तरीका पहले block algorithm को abstract करता है, फिर उसके ऊपर generic streaming algorithm define करता है
- बाद में इसे हर algorithm पर template की तरह apply किया जा सकता है, जिससे reuse संभव होता है
- इसे इस तरह generic बनाया गया कि सभी विशेष conditions शामिल हों:
- output length specify की जा सकती है या नहीं (SHA3 vs Shake)
- processing से पहले input की आवश्यकता है या नहीं (उदाहरण: Blake2 का key block)
- final block processing के तरीकों में अंतर
- internal state में सुरक्षित रखी जाने वाली अतिरिक्त जानकारी
- intermediate result extraction के लिए state copy का तरीका (stack vs heap)
- algorithm-specific API बनाम family API इस्तेमाल करने की रणनीति
Python integration के लिए build stability सुनिश्चित करना
- Python की CI 50 से अधिक toolchains और architectures पर verify की जाती है, जिससे बहुत छोटे issues भी सामने आ जाते हैं
- HMAC implementation के दौरान AVX2 instruction support से जुड़ी समस्या आई:
- कुछ compilers AVX2 के बिना
immintrin.h header को process नहीं कर पाते
- इसे हल करने के लिए C का abstract struct pattern इस्तेमाल किया गया
- F* से जनरेट हुए C code के abstraction concept और C struct के अंतर की वजह से
krml compiler में अधिक सटीक visibility analysis जोड़ना पड़ा
memory allocation failure से निपटना
- मौजूदा F* model सिद्धांत रूप में memory failure को model कर सकता था, लेकिन व्यावहारिक उपयोग में यह पहली बार हुआ
- Python की ज़रूरत के अनुसार state structs, algorithm definitions और streaming structures—सभी को allocation failure propagate करने में सक्षम बनाया गया
- F* में
option type का इस्तेमाल हुआ, जिसे C में tagged union के रूप में compile किया जाता है
- भविष्य में complexity कम करने के लिए इसे runtime failure flag approach में बदला जा सकता है
HACL* code updates का automation
- शुरुआती Python PR में
sed के जरिए अनावश्यक header definitions हटाना, paths ठीक करना आदि किया गया
- बाद में HACL* code की stability साबित होने पर जटिल
sed हटा दिया गया और उसकी जगह simple script इस्तेमाल की गई
- इस script की मदद से कोई भी Python source tree में HACL* code को नवीनतम version तक आसानी से update कर सकता है
निष्कर्ष
- verified cryptographic code को Python जैसे प्रमुख production environment में सफलतापूर्वक इंटीग्रेट किया गया
- यह इस बात का प्रमाण है कि यह तकनीक केवल academic research तक सीमित नहीं, बल्कि वास्तविक software में भी practical और maintainable है
- यह Python community और HACL* developers के सहयोग का अच्छा उदाहरण है, जो आगे दूसरे projects को भी प्रभावित कर सकता है
2 टिप्पणियां
जैसा कि Hacker News की टिप्पणियों में भी कहा गया था, यह समझना मुश्किल है कि Python ecosystem ने आखिर ऐसा क्या हासिल किया है जो 'academic research phase से आगे बढ़कर वास्तविक software में भी practical और maintainable' हो।
अगर कहना यह था कि मौजूदा unverified hash infrastructure के लिए streaming algorithm को abstract करने का काम किया गया है, तो यह फिर बस एक और 'Pythonic' शब्दों का खेल ही है।
Hacker News टिप्पणियाँ
Python वर्ज़न का उल्लेख नहीं किया गया है। देखने पर पता चलता है कि यह फीचर 3.14 वर्ज़न में शामिल होने वाला है। अक्टूबर से पहले यह देखने को नहीं मिलेगा
Microsoft के F* से जनरेट की गई verified C लाइब्रेरी को CPython में शामिल किया गया है और एक C extension लिखा गया है
सोच रहा हूँ कि क्या SHAKE के "streaming" output सपोर्ट को लाया जाएगा
आधुनिक, व्यापक रूप से इस्तेमाल होने वाली cryptography व्यावहारिक रूप से टूटी नहीं जा सकती, और 90 के दशक के crypto wars अब कुछ पुराने लगते हैं। सोच रहा हूँ कि इसका समाज पर क्या असर पड़ता है
सोच रहा हूँ कि सामान्य streaming verification framework, cryptographic hash के अलावा, कितना reusable है
सोच रहा हूँ कि cryptography module import करने वाली हर चीज़ में G++ या कुछ और शामिल होना चाहिए, या यह सीधे CPython में compile होता है
मुझे cryptography की ज़्यादा समझ नहीं है। सोच रहा हूँ कि Python के लिए इसका मतलब क्या है
सोच रहा हूँ कि विकास का कितना हिस्सा verified है, और उसमें क्या-क्या शामिल है
code lines मापने का बहुत ही अनुपयुक्त तरीका है। खासकर cryptography code के संदर्भ में, जब बड़े नंबरों का ढिंढोरा पीटा जाए, तब तो और भी