تحميل مفتاح خاص RSA من الذاكرة باستخدام libxmlsec
سؤال
أنا أستخدم حاليًا libxmlsec في برنامج C ++ الخاص بي وأحاول تحميل مفتاح RSA الخاص من الذاكرة. للقيام بذلك ، بحثت في حوض واجهة برمجة التطبيقات ووجدت هذه الوظيفة.
يستغرق البيانات الثنائية ، وحجم ، وسلسلة تنسيق ، والعديد من المعلمات ذات الصلة PEM-Callback.
عندما أتصل بالوظيفة ، فإنها فقط تستخدم 100 ٪ من وقت وحدة المعالجة المركزية ولا تعود أبدًا. مزعج للغاية ، لأنه ليس لدي أي وسيلة لمعرفة الخطأ.
ها هو رمزتي:
d_xmlsec_dsig_context->signKey =
xmlSecCryptoAppKeyLoadMemory(
reinterpret_cast<const xmlSecByte*>(data),
static_cast<xmlSecSize>(datalen),
xmlSecKeyDataFormatBinary,
NULL,
NULL,
NULL
);
data
هو const char*
مشيرا إلى البايتات الخام لمفتاح RSA الخاص بي (باستخدام i2d_RSAPrivateKey()
, ، من عند OpenSSL) و datalen
حجم data
.
لي اختبار لا يحتوي المفتاح الخاص على عبارة تمريرة ، لذا قررت عدم استخدام عمليات الاسترجاعات في الوقت الحالي.
هل قام شخص ما بالفعل بشيء مماثل؟ هل ترى أيها الرجال أي شيء يمكنني تغييره/اختباره للمضي قدمًا في هذه المشكلة؟
لقد اكتشفت المكتبة يوم أمس ، لذلك قد أفتقد شيئًا واضحًا هنا ؛ أنا فقط لا أستطيع رؤيته.
شكرا جزيلا لك على مساعدتك.
المحلول
لقد غيرت شكل data
إلى PEM ، باستخدام وظيفة OpenSSL PEM_write_bio_RSAPrivateKey()
وغيرت الحجة الثالثة إلى الدعوة إلى xmlSecCryptoAppKeyLoadMemory()
لذلك يطابق التنسيق الجديد.
الرمز الجديد هو:
d_xmlsec_dsig_context->signKey =
xmlSecCryptoAppKeyLoadMemory(
reinterpret_cast<const xmlSecByte*>(data), // data is now in PEM format
static_cast<xmlSecSize>(datalen),
xmlSecKeyDataFormatPem, // Updated
NULL,
NULL,
NULL
);
ومنذ ذلك الحين ، كل شيء يعمل: لم تعد المكالمة عالقة.