
تنفيذ نقي بلغة رست لمعيار (مسودة) FIPS 203 الخاص بآلية تغليف المفاتيح القائمة على الشبكات النمطية، لتطبيقات الخوادم وأجهزة سطح المكتب والمتصفحات والأنظمة المدمجة.
FIPS 203 (المسودة العامة الأولية) معيار آلية تغليف المفاتيح القائمة على الشبكات النمطية المكتوب بلغة Rust نقية لتطبيقات الخوادم وأجهزة سطح المكتب والمتصفحات والأنظمة المدمجة. يتضمن مستودع المصدر أمثلة توضح القياس المرجعي (benchmarking)، وهدفًا مدمجًا، وقياسات إحصائية للزمن الثابت، واختبار fuzzing، وتنفيذ WASM، وربط C FFI وPython.
تنفّذ هذه الحزمة (crate) معيار FIPS 203 المسودة بلغة Rust نقية مع اعتماديات ضئيلة وسائدة، ودون أي كود غير آمن. جميع مجموعات معاملات الأمان الثلاث مدعومة ومختبرة بالكامل. يعمل التنفيذ في زمن ثابت (باستثناء rho، وهو جزء من مفتاح التغليف الذي يُرسل عبر حدود الثقة بنص واضح)، ولا يتطلب المكتبة القياسية، مثل #[no_std]، ولا يحتوي على تخصيصات في كومة الذاكرة (heap)، أي لا حاجة إلى alloc، ويُظهر اختياريًا RNG بحيث يكون مناسبًا لمجموعة كاملة من التطبيقات وصولًا إلى العتاد المجرد (bare-metal). الواجهة البرمجية (API) مستقرة والكود منحاز بشدة نحو السلامة والصحة؛ وسيتم تنفيذ المزيد من تحسينات الأداء مع نضوج المعيار. ستتابع هذه الحزمة (crate) بسرعة أي تغييرات تطرأ على FIPS 203 فور توفرها.
انظر https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf للحصول على وصف كامل للوظائف المستهدفة.
استخدام هذه الوظيفة بسيط للغاية، كما يتضح من المثال التالي.
// Use the desired target parameter set.
use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024.
use fips203::traits::{Decaps, Encaps, KeyGen, SerDes};
// Alice runs `try_keygen()` and then serializes the encaps key `ek` for Bob (to bytes).
let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen().unwrap();
let alice_ek_bytes = alice_ek.into_bytes();
// Alice sends the encaps key `ek_bytes` to Bob.
let bob_ek_bytes = alice_ek_bytes;
// Bob deserializes the encaps `ek_bytes` and then runs `encaps() to get the shared
// secret `ssk` and ciphertext `ct`. He serializes the ciphertext `ct` for Alice (to bytes).
let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap();
let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps().unwrap();
let bob_ct_bytes = bob_ct.into_bytes();
// Bob sends the ciphertext `ct_bytes` to Alice
let alice_ct_bytes = bob_ct_bytes;
// Alice deserializes the ciphertext `ct` and runs `decaps()` with her decaps key
let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap();
let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap();
// Alice and Bob will now have the same secret key
assert_eq!(bob_ssk_bytes, alice_ssk_bytes);
تجد التوثيق الخاص بلغة Rust ضمن كل وحدة (Module) تقابل معامل الأمان المطلوب أدناه.
dudect الديناميكية.RNG.المحتويات مرخصة بموجب رخصة Apache الإصدار 2.0 أو رخصة MIT حسب اختيارك.
ما لم تذكر خلاف ذلك صراحةً، فإن أي مساهمة تقدمها عمدًا لإدراجها في العمل، كما هو محدد في رخصة Apache-2.0، ستكون مرخصة بشكل مزدوج كما هو مذكور أعلاه دون أي شروط أو أحكام إضافية.