سؤال

أنا أستخدم حاليًا 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
);

ومنذ ذلك الحين ، كل شيء يعمل: لم تعد المكالمة عالقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top