,
KMail, Kleopatra GnuPG,
oid- - DER-,
oidcalc NSS (Network Security Services), Linux, . .
Et tout s'est bien passé jusqu'à ce qu'un oid soit trouvé , dans lequel il y avait un chiffre décimal 0 (zéro), à savoir «1.2.643.2.2.36.0» (szOID_GostR3410_2001_CryptoPro_XchA_ParamSet). Et ici, une surprise désagréable m'attendait - mon code a cessé de fonctionner. À un moment donné, j'ai décidé de voir en quoi cet oid se traduit :# oidcalc 1.2.643.2.2.36.0
0x2a, 0x85, 0x3, 0x2, 0x2, 0x24,
#
Mais il aurait dû y avoir 0x2a, 0x85, 0x3, 0x2, 0x2, 0x24, 0x0 - il n'y avait pas de zéro hexadécimal à la fin.J'ai essayé de traduire un autre oid "1.2.643.3.6.0.1" (CryptoPro CA, période de validité du certificat 1 mois):# oidcalc 1.2.643.3.6.0.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#
Le même triste résultat - il n'y a pas avant-dernier octet avec zéro. Il est devenu clair que l'utilitaire oidcalc jette des zéros depuis oid. L'exemple suivant ne fait que confirmer cette hypothèse:# oidcalc 1.2.643.3.6.1
0x2a, 0x85, 0x3, 0x3 0x3, 0x6, 0x1,
#
Pour une autre vérification, j'ai dû utiliser l'utilitaire oid et obtenu le résultat que j'attendais:# ./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
#
L'utilitaire oid affiche le résultat déjà dans le codage ASN1, où le premier octet détermine le type de séquence, le deuxième octet - la longueur de la séquence en octets, puis va l'oid lui-même en notation hexadécimale.Après cela, il restait à analyser le code source de l'utilitaire oidcalc.c et à rassembler les modifications minimales: . . .
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;
. . .
Maintenant, si vous reconstruisez l'utilitaire, alors tout fonctionne 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,
#
Quelle est l'erreur du développeur de l'utilitaire? Dans les petites choses. Pour traduire un nombre d'une chaîne en un tout, l'auteur utilise la fonction atoi , qui renvoie 0 (zéro) dans le cas de la traduction du caractère '0' et en cas d'impossibilité de traduire (aucun nombre n'est spécifié). Il s'est avéré suffisant d'ajouter une vérification supplémentaire et cela a fonctionné.Ai-je écrit aux développeurs NSS? Oui, j'ai écrit. De plus, le package NSS avec plug-in avec jetons cryptographiques / cartes à puce prenant en charge l' interface PKCS # 11 est en fait le cœur cryptographique des applicationsde Mozilla, et également utilisé dans les navigateurs Chrome de Google. Il n'y a pas eu de réponse, le code n'a pas été corrigé. Par conséquent, cette note est apparue pour que quelqu'un d'autre ne marche pas sur ce râteau en tant qu'humble serviteur. Bien sûr, espérons que les fournisseurs de forks / clones domestiques de Linux corrigeront cette erreur dans leurs packages.