عند تنفيذ مشروع يتعلق باستخدام خوارزميات التشفير الروسية في عميل بريد 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 بإصلاح هذا الخطأ في حزمهم.