
أداة اختبار تشويش تفاضلي آلي للبرامج التشفيرية تكتشف أخطاء التنفيذ، وإخفاقات الامتثال، وتسربات القنوات الجانبية من خلال اختبار ذكي ومتوازي عبر لغات ومنصات متعددة.
CDF هي أداة لاختبار صحة وأمان البرامج التشفيرية بشكل تلقائي. يمكن لـ CDF اكتشاف أخطاء التنفيذ، وعدم الامتثال للمعايير، وتسريبات القنوات الجانبية، وغير ذلك.
يطبق CDF مزيجًا من اختبارات الوحدة مع "التمييز التفاضلي"، وهو نهج يقارن سلوك التطبيقات المختلفة لنفس البدائيات عند تغذيتها بحالات الحافة والقيم التي تزيد من تغطية الكود.
على عكس أدوات التمييز وأدوات الاختبار ذات الأغراض العامة، يتميز CDF بأنه:
ذكي: يعرف CDF نوع الخوارزمية التي يختبرها ويتكيف مع الدوال المختبرة
سريع: يختبر CDF فقط ما يجب اختباره ويوازي اختباراته قدر الإمكان
متعدد الاستخدامات: ليس CDF محددًا بأي لغة أو واجهة برمجة تطبيقات، بل يدعم أي برامج أو نصوص قابلة للتنفيذ
محمول: سيعمل 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 بتعيين عدد goroutines المتزامنة التي يجب أن يطلقها 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 حتمي، وإلا فلن يتمكن CDF من اكتشاف مشاكل مثل مشكلات العلامات المتطابقة تلقائيًا.
تختبر واجهة enc عمليات التشفير وفك التشفير المتناظر، عادةً عند إجرائها باستخدام تشفير كتلي (يمكن اختبار تشفير التدفق باستخدام واجهة prf). يجب أن تدعم التشفير وفك التشفير:
| العملية | المدخلات | المخرجات |
|---|---|---|
| التشفير | k m | c |
| فك التشفير | k c | r |
هنا k هو مفتاح، m هي رسالة، c هو نص مشفر، و r هو نص واضح مستعاد.
تختبر واجهة prf التجزئة المفتاحية (دوال شبه عشوائية، MACs)، بالإضافة إلى تشفير التدفق:
| العملية | المدخلات | المخرجات |
|---|---|---|
| الحساب | k m | h |
هنا k هو مفتاح، m هي رسالة (أو nonce في حالة تشفير التدفق)، و 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 هي رسالة، p و q هما عاملا n (بحيث p > q، لأن المكتبات تتطلب ذلك عادةً)، d هو أس خاص، و r هو نص واضح مستعاد.
تختبر واجهة xof دوال التجزئة، دوال الإخراج القابلة للتمديد (XOFs)، مولدات البت العشوائية الحتمية (DRBGs):
| العملية | المدخلات | المخرجات |
|---|---|---|
| الحساب | m | h |
هنا m هي الرسالة و h هي النتيجة.
CDF مبني على أفكار أولية من JP Aumasson، تم الكشف عنها لأول مرة في WarCon 2016، وقد كتب معظم الكود Yolan Romailler.
CDF محمي بحقوق الطبع والنشر (c) 2016-2017 Nagravision SA، جميع الحقوق محفوظة.
تم إصدار CDF تحت رخصة GPLv3.