Paquete de servicios de seguridad de red y utilidad oidcalc

, KMail, Kleopatra GnuPG, oid- - DER-, oidcalc NSS (Network Security Services), Linux, . .

Y todo salió bien hasta que se encontró un oid , en el que había un dígito decimal 0 (cero), es decir, "1.2.643.2.2.36.0" (szOID_GostR3410_2001_CryptoPro_XchA_ParamSet). Y aquí me esperaba una desagradable sorpresa: mi código dejó de funcionar. En algún momento, decidí ver en qué se traduce este oid :

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

Pero debería haber habido 0x2a, 0x85, 0x3, 0x2, 0x2, 0x24, 0x0 , no había cero hexadecimal de terminación.

Traté de traducir otro oid "1.2.643.3.6.0.1" (CryptoPro CA, período de validez del certificado de 1 mes):

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

El mismo triste resultado: no hay penúltimo byte con cero. Quedó claro que la utilidad oidcalc arroja ceros desde oid. El siguiente ejemplo solo confirma esta suposición:

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

Para otra verificación, tuve que usar la utilidad oid y obtuve el resultado que esperaba:

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

La utilidad oid muestra el resultado ya en la codificación ASN1, donde el primer byte determina el tipo de secuencia, el segundo byte, la longitud de la secuencia en bytes, y luego va el oid en notación hexadecimal.

Después de eso, quedaba por analizar el código fuente de la utilidad oidcalc.c y reunir los cambios mínimos:

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

Ahora, si reconstruye la utilidad, entonces todo funciona bien:

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

¿Cuál es el error del desarrollador de la utilidad? En las pequeñas cosas. Para traducir un número de una cadena a un todo, el autor utiliza la función atoi , que devuelve 0 (cero) en el caso de la traducción del carácter '0' y en caso de imposibilidad de traducir (no se especifica un número). Resultó ser suficiente para agregar verificación adicional y funcionó.

¿Escribí a los desarrolladores de NSS? Sí, escribí Además, el paquete NSS con plug-in con tokens criptográficos / tarjetas inteligentes que admite la interfaz PKCS # 11 es en realidad el núcleo criptográfico de las aplicacionesde Mozilla, y también se usa en los navegadores Chrome de Google. No hubo respuesta, el código no fue corregido. Por lo tanto, esta nota apareció para que alguien más no pisara este rastrillo como su humilde servidor. Bueno, por supuesto, esperemos que los proveedores de horquillas / clones domésticos de Linux arreglen este error en sus paquetes.

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


All Articles