حزمة خدمات أمن الشبكة والأداة المساعدة oidcalc

عند تنفيذ مشروع يتعلق باستخدام خوارزميات التشفير الروسية في عميل بريد KMail ، في تطبيقات Kleopatra و GnuPG ، لتحويل الأوديس الروسية من نقطة عشرية إلى ترميز DER ، قررت استخدام الأداة المساعدة oidcalc من حزمة NSS (خدمات أمان الشبكة) ، والتي يتم تثبيتها مسبقًا في جميع توزيعات Linux ، بما في ذلك النسخ المحلية. تم استخدام الرمز الناتج في العمل.

كل شيء سار على ما يرام حتى تم العثور على أويد ، حيث كان هناك رقم عشري 0 (صفر) ، وهو "1.2.643.2.2.36.0" (szOID_GostR3410_2001_CryptoPro_XchA_ParamSet). وهنا في انتظار مفاجأة غير سارة - توقفت الكود عن العمل. في مرحلة ما ، قررت أن أنظر إلى ما يترجم هذا العود :

# oidcalc 1.2.643.2.2.36.0
0x2a, 0x85, 0x3, 0x2, 0x2, 0x24,
#

ولكن يجب أن يكون هناك 0x2a و 0x85 و 0x3 و 0x2 و 0x2 و 0x24 و 0 × 0 - لم يكن هناك إنهاء سداسي عشري.

حاولت ترجمة oid آخر "1.2.643.3.6.0.1" (CryptoPro CA ، فترة صلاحية الشهادة شهر واحد):

# oidcalc 1.2.643.3.6.0.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#

نفس النتيجة المحزنة - لا يوجد بايت قبل الأخيرة بصفر. أصبح من الواضح أن أداة oidcalc ترمي الأصفار من OID. يؤكد المثال التالي هذا الافتراض فقط:

# oidcalc 1.2.643.3.6.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#

لإجراء فحص آخر ، كان علي استخدام أداة OID وحصلت على النتيجة التي توقعتها:

# ./oid 1.2.643.2.2.36.0
06 07 2A 85 03 02 02 24 00
# ./oid 1.2.643.3.6.0.1
06 07 2A 85 03 03 06 00 01
#

فائدة إمكانية احتواء مخرجات النتيجة بالفعل في ASN1 ترميز، حيث يحدد البايت الأول نوع من التسلسل، البايت الثاني - طول التسلسل بايت، وكذلك هناك هو في حد ذاته OID في تمثيل عشري.

بعد ذلك ، بقي تحليل التعليمات البرمجية المصدر لأداة oidcalc.c وتجميع التغييرات الدنيا:

       . . .
        memset(buf, 0, sizeof(buf));
        val = atoi(curstr);
        count = 0;
/* */
    if(curstr[0] != '0')
	
        while (val) {
            buf[count] = (val & 0x7f);
            val = val >> 7;
            count++;
        }
/*   */
    else
	buf[count++] = 0x00;
        . . . 

الآن ، إذا قمت بإعادة بناء الأداة المساعدة ، فكل شيء يعمل بشكل جيد:

#oidcalc 1.2.643.2.2.36.0
0x2a, 0x85, 0x3, 0x2, 0x2, 0x24, 0x0,
#oidcalc 1.2.643.3.6.0.1
0x2a, 0x85, 0x3, 0x3, 0x6, 0x0, 0x1,
#

ما هو خطأ مطور المرافق؟ في الأشياء الصغيرة. لترجمة رقم من سلسلة إلى جملة ، يستخدم المؤلف وظيفة atoi ، التي تُرجع 0 (صفر) في حالة ترجمة الحرف "0" وفي حالة استحالة الترجمة (لم يتم تحديد رقم). اتضح أنها كافية لإضافة تحقق إضافي وعملت.

هل كتبت إلى مطوري NSS؟ نعم ، لقد كتبت. علاوة على ذلك ، فإن حزمة NSS مع المكون الإضافي مع الرموز المميزة / البطاقات الذكية التي تدعم واجهة PKCS # 11 هي في الواقع جوهر التشفير للتطبيقاتمن موزيلا ، ويستخدم أيضًا في متصفحات Chrome من Google. لم يكن هناك رد ، لم يتم إصلاح الرمز. لذلك ، ظهرت هذه الملاحظة بحيث لا يخطو شخص آخر في هذه المدخنة كخادمك المتواضع. حسنًا ، بالطبع ، لنأمل أن يقوم موردو الشوك / المستنسخات المحلية في Linux بإصلاح هذا الخطأ في حزمهم.

Source: https://habr.com/ru/post/ar398783/


All Articles