Ketika mengimplementasikan proyek terkait dengan penggunaan algoritma kriptografi Rusia di klien email KMail, di aplikasi Kleopatra dan GnuPG , untuk mengonversi oid Rusia dari dot-desimal ke pengkodean DER, saya memutuskan untuk menggunakan utilitas oidcalc dari paket NSS (Layanan Keamanan Jaringan) , yang sudah diinstal sebelumnya di semua distribusi Linux, termasuk klon domestik. Kode yang dihasilkan digunakan dalam pekerjaan.Dan semuanya berjalan dengan baik sampai oid ditemukan , di mana ada angka desimal 0 (nol), yaitu "1.2.643.2.2.36.0" (szOID_GostR3410_2001_CryptoPro_XchA_ParamSet). Dan di sini kejutan yang tidak menyenangkan menunggu saya - kode saya berhenti bekerja Pada titik tertentu, saya memutuskan untuk melihat apa yang dimaksud dengan terjemahan ini :# oidcalc 1.2.643.2.2.36.0
0x2a, 0x85, 0x3, 0x2, 0x2, 0x24,
#
Tetapi seharusnya ada 0x2a, 0x85, 0x3, 0x2, 0x2, 0x24, 0x0 - tidak ada terminasi nol heksadesimal.Saya mencoba menerjemahkan tawaran lain "1.2.643.3.6.0.1" (CryptoPro CA, Masa berlaku sertifikat 1 bulan):# oidcalc 1.2.643.3.6.0.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#
Hasil sedih yang sama - tidak ada byte kedua dari belakang dengan nol. Menjadi jelas bahwa utilitas oidcalc melempar nol dari oid. Contoh berikut hanya mengkonfirmasi asumsi ini:# oidcalc 1.2.643.3.6.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#
Untuk pemeriksaan lain, saya harus menggunakan utilitas oid dan mendapatkan hasil yang saya harapkan:# ./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
#
Utilitas oid menampilkan hasilnya sudah dalam pengkodean ASN1, di mana byte pertama menentukan jenis urutan, byte kedua - panjang urutan dalam byte, dan kemudian pergi sendiri dalam notasi heksadesimal.Setelah itu, tetap menganalisis kode sumber utilitas oidcalc.c dan mengumpulkan perubahan minimal: . . .
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;
. . .
Sekarang, jika Anda membangun kembali utilitas, maka semuanya berfungsi dengan baik:#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,
#
Apa kesalahan pengembang utilitas? Dalam hal-hal kecil. Untuk menerjemahkan angka dari string menjadi keseluruhan, penulis menggunakan fungsi atoi , yang mengembalikan 0 (nol) dalam kasus terjemahan karakter '0' dan dalam kasus ketidakmungkinan untuk menerjemahkan (bukan angka yang ditentukan). Ternyata cukup untuk menambahkan verifikasi tambahan dan berhasil.Apakah saya menulis kepada pengembang NSS? Ya saya menulis. Selain itu, paket NSS dengan plug-in dengan token kriptografi / kartu pintar yang mendukung antarmuka PKCS # 11 sebenarnya adalah inti kriptografi aplikasidari Mozilla, dan juga digunakan di browser Chrome dari Google. Tidak ada tanggapan, kode tidak diperbaiki. Oleh karena itu, catatan ini muncul sehingga orang lain tidak akan menginjak penggaruk ini sebagai pelayan Anda yang rendah hati. Yah, tentu saja, mari kita berharap bahwa pemasok garpu / klon Linux dalam negeri akan memperbaiki kesalahan ini dalam paket mereka.