
क्रिप्टोग्राफ़िक सॉफ़्टवेयर के लिए स्वचालित डिफरेंशियल फ़ज़िंग टूल जो स्मार्ट, समानांतर परीक्षण के माध्यम से कई भाषाओं और प्लेटफ़ॉर्मों पर कार्यान्वयन त्रुटियों, अनुपालन विफलताओं और साइड-चैनल लीक का पता लगाता है।
CDF एक उपकरण है जो क्रिप्टोग्राफ़िक सॉफ़्टवेयर की शुद्धता और सुरक्षा का स्वचालित रूप से परीक्षण करता है। CDF कार्यान्वयन त्रुटियों, अनुपालन विफलताओं, साइड-चैनल लीक आदि का पता लगा सकता है।
CDF यूनिट परीक्षणों को "डिफरेंशियल फज़िंग" के साथ जोड़ता है, एक दृष्टिकोण जो समान प्रिमिटिव के विभिन्न कार्यान्वयनों के व्यवहार की तुलना करता है जब उन्हें कोड कवरेज को अधिकतम करने वाले किनारे के मामलों और मानों से फीड किया जाता है।
सामान्य-उद्देश्य वाले फ़ज़र्स और परीक्षण सॉफ़्टवेयर के विपरीत, CDF है:
स्मार्ट: CDF जानता है कि वह किस प्रकार के एल्गोरिदम का परीक्षण कर रहा है और परीक्षण किए जा रहे फ़ंक्शनों के अनुकूल होता है
तेज़: CDF केवल उसी का परीक्षण करता है जिसका परीक्षण करने की आवश्यकता है और अपने परीक्षणों को यथासंभव समानांतर करता है
बहुमुखी: CDF किसी विशिष्ट भाषा या API से बंधा नहीं है, बल्कि मनमाने निष्पादन योग्य प्रोग्राम या स्क्रिप्ट का समर्थन करता है
पोर्टेबल: CDF किसी भी Unix या Windows प्लेटफ़ॉर्म पर चलेगा, क्योंकि यह बिना किसी प्लेटफ़ॉर्म-विशिष्ट निर्भरता के Go में लिखा गया है
CDF का उद्देश्य डेवलपर्स और सुरक्षा शोधकर्ताओं को अधिक कुशल परीक्षण उपकरण प्रदान करना है, जो परीक्षण वैक्टरों से अधिक प्रभावी और औपचारिक सत्यापन के मैन्युअल ऑडिट से सस्ता हो।
CDF को पहली बार Black Hat USA 2017 में प्रस्तुत किया गया था। आप हमारी प्रस्तुति की स्लाइड्स देख सकते हैं, जिसमें CDF के पीछे के तर्क और डिज़ाइन के बारे में सामान्य जानकारी है।
CDF Go में कोडित है, वर्तमान संस्करण Go 1.8 का उपयोग करके विकसित किया गया है। Go के मानक पुस्तकालय के अलावा इसकी कोई निर्भरता नहीं है।
हालाँकि, हम CDF का उपयोग करके परीक्षण किए जाने वाले उदाहरण प्रोग्राम प्रदान करते हैं, जो C, Python, C++, Java और Go में हैं और चलाने के लिए विशिष्ट क्रिप्टो लाइब्रेरी की आवश्यकता होती है। वर्तमान में आवश्यक लाइब्रेरी हैं:
make cdf बाइनरी का निर्माण करेगा।
example के अंतर्गत बहुत सारे उदाहरण प्रोग्राम उपलब्ध हैं: make examples-all सभी उदाहरणों का निर्माण करेगा, जबकि make examples-go केवल Go उदाहरणों का निर्माण करेगा।
make test यूनिट परीक्षण (CDF के) चलाएगा।
शुरुआत के लिए आप cdf -h चलाकर उपयोग जानकारी देख सकते हैं।
फिर आप एक उदाहरण आज़मा सकते हैं जैसे कि rsaenc इंटरफ़ेस RSA OAEP Go और CryptoPP उदाहरणों के विरुद्ध। CryptoPP को हमारा संदर्भ मानते हुए, आप Go कार्यान्वयन का परीक्षण इस प्रकार कर सकते हैं:
cdf rsaenc /examples/oaep_rsa2048_go /examples/oaep_rsa2048_cryptopp
यह कमांड rsaenc इंटरफ़ेस के लिए विशिष्ट विभिन्न परीक्षण करेगा।
इस उदाहरण में, CDF को Go कार्यान्वयन द्वारा समर्थित अधिकतम सार्वजनिक घातांक आकार के बारे में शिकायत करनी चाहिए: यदि हम इसके कोड की जाँच करते हैं, तो हम देख सकते हैं कि सार्वजनिक घातांक एक सामान्य पूर्णांक के रूप में संग्रहीत किया जा रहा है, जबकि CryptoPP (और अधिकांश अन्य कार्यान्वयनों) में, इसे एक बड़े पूर्णांक के रूप में संग्रहीत किया जाता है। हालाँकि यह डिज़ाइन द्वारा है और संभवतः इसे बदला नहीं जाएगा।
पैरामीटर config.json में परिभाषित हैं।
अधिकांश पैरामीटर स्व-व्याख्यात्मक हैं। आप rsaenc और ecdsa के लिए अन्य निजी कुंजियाँ सेट करना चाह सकते हैं (ये इंटरफ़ेस निश्चित कुंजियों के साथ परीक्षण किए जाते हैं, हालाँकि कुछ कुंजी पैरामीटर, जैसे घातांक, कुछ परीक्षणों में बदल दिए जाते हैं)।
seed पैरामीटर आपको CDF के छद्म-यादृच्छिक जनरेटर में उपयोग किए जाने वाले बीज को बदलने देता है। (फिर भी, परीक्षण किया गया प्रोग्राम किसी अन्य तरीके से बीजित PRNG का उपयोग कर सकता है, जैसे OAEP उदाहरण।) concurrency पैरामीटर आपको उन समवर्ती गोरूटीनों की संख्या निर्धारित करने देता है जिन्हें CDF को प्रोग्रामों को फोर्क करते समय स्पॉन करना चाहिए। ध्यान दें कि इस संख्या को वास्तविक कोर की संख्या से कम रखना सबसे अच्छा है। verboseLog पैरामीटर, यदि true पर सेट है, तो सफल परीक्षणों के लिए भी सभी प्रोग्रामों के इनपुट और आउटपुट को log.txt फ़ाइल में लिखेगा।
CDF का उपयोग करके अपने सॉफ़्टवेयर का परीक्षण करने के लिए, आपको एक प्रोग्राम बनाना होगा जो CDF इंटरफ़ेस के अनुरूप इनपुट पढ़ता है और आउटपुट लिखता है, और जो आंतरिक रूप से परीक्षण किए जा रहे प्रोग्राम को कॉल करता है। CDF इंटरफ़ेस एक क्रिप्टो कार्यक्षमता के अमूर्तन हैं, ताकि मनमाने कार्यान्वयनों के ब्लैक-बॉक्स परीक्षण की अनुमति मिल सके।
उदाहरण के लिए, यदि आपने ECDSA हस्ताक्षर योजना लागू की है, तो आपके प्रोग्राम को ecdsa इंटरफ़ेस को संतुष्ट करना चाहिए और इस तरह हस्ताक्षर करने या हस्ताक्षर सत्यापित करने के लिए क्रमशः 4 या 5 तर्क इनपुट के रूप में लेने चाहिए। ये तर्क सार्वजनिक X निर्देशांक, सार्वजनिक Y निर्देशांक, निजी D बड़ा पूर्णांक और वह संदेश है जिस पर आप हस्ताक्षर करना चाहते हैं, और फिर इसे केवल बड़े पूर्णांक R और S को प्रत्येक एक नई पंक्ति पर आउटपुट करना चाहिए। या, किसी संदेश को सत्यापित करने के लिए, इसे X, Y, R, S और संदेश स्वीकार करना चाहिए और फिर केवल True या False आउटपुट करना चाहिए। इंटरफ़ेस के विनिर्देश नीचे विस्तृत हैं।
इंटरफ़ेस कार्यान्वयन के हमारे उदाहरण आपको अपने स्वयं के बनाने में मदद करेंगे।
त्रुटि प्रबंधन परीक्षण किए जा रहे प्रोग्राम पर छोड़ दिया गया है, हालाँकि CDF में सार्थक त्रुटियाँ प्राप्त करने के लिए विफलता पर बाहर निकलना, त्रुटि कोड लौटाना और त्रुटि संदेश प्रिंट करना सबसे अच्छा है।
इंटरफ़ेस प्रोग्राम किसी भी भाषा में लिखा जा सकता है, इसे बस CDF इंटरफ़ेस के अनुरूप एक निष्पादन योग्य फ़ाइल होना चाहिए। एक इंटरफ़ेस प्रोग्राम आमतौर पर परीक्षण किए जा रहे प्रोग्राम के समान भाषा में लिखा जाता है, लेकिन यह अनिवार्य नहीं है (यह किसी अन्य भाषा में एक रैपर हो सकता है, उदाहरण के लिए Java प्रोग्राम के लिए)।
CDF वर्तमान में निम्नलिखित इंटरफ़ेस का समर्थन करता है, जिसमें पैरामीटर हेक्साडेसिमल ASCII स्ट्रिंग के रूप में एन्कोड किए जाते हैं, जब तक कि अन्यथा वर्णित न हो:
dsa इंटरफ़ेस डिजिटल सिग्नेचर एल्गोरिदम (DSA) के कार्यान्वयन का परीक्षण करता है। इसे हस्ताक्षर और सत्यापन संचालन का समर्थन करना चाहिए:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| हस्ताक्षर | p q g y x m | r s |
| सत्यापन | p q g y r s m | सत्य मान |
यहाँ p, q, g DSA पैरामीटर हैं, y एक सार्वजनिक कुंजी है, x एक निजी कुंजी है, m एक संदेश है, r और s हस्ताक्षर बनाते हैं, जिन्हें एक नई पंक्ति से अलग करके लौटाया जाना चाहिए। सत्य मान, या तो "true" या "false", एक स्ट्रिंग के रूप में दर्शाया जाता है।
dsa इंटरफ़ेस एक वैकल्पिक परीक्षण का समर्थन करता है: -h हैशिंग प्रक्रिया को बायपास करने और हस्ताक्षर किए जाने वाले हैश मान को सीधे प्रदान करने की अनुमति देता है। यह CDF को अधिक परीक्षण करने की अनुमति देता है, जैसे कि ओवरफ़्लो या हैश ट्रंकेशन की जाँच करना।
ecdsa इंटरफ़ेस एलिप्टिक कर्व डिजिटल सिग्नेचर एल्गोरिदम (ECDSA) के कार्यान्वयन का परीक्षण करता है। इसे हस्ताक्षर और सत्यापन संचालन का समर्थन करना चाहिए:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| हस्ताक्षर | x y d m | r s |
| सत्यापन | x y r s m | सत्य मान |
यहाँ x और y एक सार्वजनिक ECDSA कुंजी के निर्देशांक हैं, d एक निजी कुंजी है, m एक संदेश है, और r और s हस्ताक्षर बनाते हैं, जिन्हें एक नई पंक्ति से अलग करके लौटाया जाना चाहिए। सत्य मान, या तो "true" या "false", एक स्ट्रिंग द्वारा दर्शाया जाता है।
फ़्लैग -h dsa के समान उद्देश्य पूरा करता है।
कृपया ध्यान दें कि हमारा वर्तमान डिज़ाइन एक निश्चित वक्र मानता है, जो परीक्षण किए जा रहे प्रोग्राम में परिभाषित है।
इन परीक्षणों के साथ प्रतिलिपि प्रस्तुत करने योग्य परिणाम प्राप्त करने और CDF की सभी पहचान क्षमताओं का लाभ उठाने के लिए, आपको या तो अपने यादृच्छिक जनरेटर को एक निश्चित बीज के साथ बीज करना होगा या एक नियतात्मक ECDSA variant का उपयोग करना होगा, अन्यथा CDF स्वचालित रूप से समान टैग समस्याओं जैसी समस्याओं का पता नहीं लगा सकता है।
enc इंटरफ़ेस सममित एन्क्रिप्शन और डिक्रिप्शन संचालन का परीक्षण करता है, आमतौर पर जब ब्लॉक सिफर के साथ प्रदर्शन किया जाता है (स्ट्रीम सिफर का परीक्षण prf इंटरफ़ेस के साथ किया जा सकता है)। इसे एन्क्रिप्शन और डिक्रिप्शन का समर्थन करना चाहिए:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| एन्क्रिप्शन | k m | c |
| डिक्रिप्शन | k c | r |
यहाँ k एक कुंजी है, m एक संदेश है, c एक सिफरटेक्स्ट c है और r एक पुनर्प्राप्त प्लेनटेक्स्ट है।
prf इंटरफ़ेस कीड हैशिंग (छद्म-यादृच्छिक फ़ंक्शन, MAC) के साथ-साथ स्ट्रीम सिफर का परीक्षण करता है:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| गणना | k m | h |
यहाँ k एक कुंजी है, m एक संदेश (या स्ट्रीम सिफर के मामले में नॉन्स) है, और h PRF गणना का परिणाम है। हमारा इंटरफ़ेस निश्चित कुंजी आकार और परिवर्तनीय इनपुट लंबाई मानता है। यदि एक विशिष्ट कुंजी निर्दिष्ट की जानी है, तो परीक्षण किए जा रहे प्रोग्राम की जिम्मेदारी है कि वह कुंजी इनपुट को अनदेखा करे या xof इंटरफ़ेस एक बेहतर विकल्प हो सकता है।
rsaenc RSA एन्क्रिप्शन और डिक्रिप्शन का परीक्षण करता है, दोनों OAEP (PKCS 2.1) और PKCS 1.5:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| एन्क्रिप्शन | n e m | c |
| डिक्रिप्शन | p q e d c | r |
यहाँ n एक मॉड्यूलस है, e एक सार्वजनिक घातांक है (कुछ लाइब्रेरी के साथ संगतता के लिए, डिक्रिप्शन के लिए भी e की आवश्यकता है), m एक संदेश m है, p और q n के गुणनखंड हैं (जैसे कि p > q, क्योंकि लाइब्रेरी आमतौर पर इसकी आवश्यकता होती है), d एक निजी घातांक है, और r एक पुनर्प्राप्त प्लेनटेक्स्ट है।
xof इंटरफ़ेस हैश फ़ंक्शन, एक्सटेंडेबल-आउटपुट फ़ंक्शन (XOF), नियतात्मक यादृच्छिक बिट जनरेटर (DRBG) का परीक्षण करता है:
| संचालन | इनपुट | आउटपुट |
|---|---|---|
| गणना | m | h |
यहाँ m संदेश है और h परिणाम h है।
CDF JP Aumasson के प्रारंभिक विचारों पर आधारित है, जिसे पहली बार WarCon 2016 में प्रकट किया गया था, और अधिकांश कोड Yolan Romailler द्वारा लिखा गया था।
CDF कॉपीराइट (c) 2016-2017 Nagravision SA, सर्वाधिकार सुरक्षित।
CDF GPLv3 के तहत जारी किया गया है।