Network Security Services Package und oidcalc Utility

Bei der Implementierung eines Projekts zur Verwendung russischer kryptografischer Algorithmen im KMail- Mail-Client in den Anwendungen Kleopatra und GnuPG zur Konvertierung russischer Oids von Punkt-Dezimal- in DER-Codierung habe ich mich für das Dienstprogramm oidcalc aus dem NSS- Paket (Network Security Services) entschieden , das in allen Linux-Distributionen vorinstalliert ist, einschließlich inländischer Klone. Der resultierende Code wurde in der Arbeit verwendet.

Und alles lief gut, bis eine OID gefunden wurde , in der es eine Dezimalstelle 0 (Null) gab, nämlich „1.2.643.2.2.36.0“ (szOID_GostR3410_2001_CryptoPro_XchA_ParamSet). Und hier erwartete mich eine unangenehme Überraschung - mein Code funktionierte nicht mehr. Irgendwann habe ich mich entschlossen zu sehen, in was dieses Oid übersetzt wird :

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

Aber es hätte 0x2a, 0x85, 0x3, 0x2, 0x2, 0x24, 0x0 geben sollen - es gab keine nachgestellte hexadezimale Null.

Ich habe versucht, eine andere OID "1.2.643.3.6.0.1" (CryptoPro CA, Gültigkeitsdauer des Zertifikats 1 Monat) zu übersetzen:

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

Das gleiche traurige Ergebnis - es gibt kein vorletztes Byte mit Null. Es wurde klar, dass das Dienstprogramm oidcalc Nullen von oid auslöst. Das folgende Beispiel bestätigt nur diese Annahme:

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

Für eine weitere Überprüfung musste ich das Dienstprogramm oid verwenden und erhielt das erwartete Ergebnis:

# ./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
#

Das Dienstprogramm oid gibt das Ergebnis bereits in der ASN1-Codierung aus, wobei das erste Byte den Typ der Sequenz bestimmt, das zweite Byte die Länge der Sequenz in Bytes, und dann wird oid selbst in hexadezimaler Schreibweise angegeben.

Danach musste der Quellcode des Dienstprogramms oidcalc.c analysiert und die minimalen Änderungen zusammengestellt werden:

       . . .
        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;
        . . . 

Wenn Sie das Dienstprogramm neu erstellen, funktioniert alles einwandfrei:

#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,
#

Was ist der Fehler des Utility-Entwicklers? In den kleinen Dingen. Um eine Zahl aus einer Zeichenfolge in eine Ganzzahl zu übersetzen, verwendet der Autor die Funktion atoi , die bei der Übersetzung des Zeichens '0' und bei Unmöglichkeit der Übersetzung (es wird keine Zahl angegeben) 0 (Null) zurückgibt. Es stellte sich heraus, dass es ausreichte, zusätzliche Überprüfungen hinzuzufügen, und es funktionierte.

Habe ich an NSS-Entwickler geschrieben? Ja, ich habe geschrieben. Darüber hinaus ist das NSS-Paket mit Plug-In mit kryptografischen Token / Smartcards, die die PKCS # 11-Schnittstelle unterstützen, der kryptografische Kern von Anwendungenvon Mozilla und auch in Chrome-Browsern von Google verwendet. Es gab keine Antwort, der Code wurde nicht behoben. Daher erschien diese Notiz, damit nicht jemand anderes als Ihr bescheidener Diener auf diesen Rechen tritt. Hoffen wir natürlich, dass die Anbieter von inländischen Gabeln / Klonen von Linux diesen Fehler in ihren Paketen beheben.

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


All Articles