Le Service Pack 1 pour Windows Vista, ainsi que Windows Server 2008 sont bien là, au détour de virage de la nouvelle année. Une rapide recherche des nouveautés n'arrête pas de cracher « Adds an Elliptical Curve Cryptography (ECC) pseudo-random number generator (PRNG) to the list of available PRNGs in Windows Vista ». Cette information, quoiqu'exacte, mérite quelques précisions.

Le PRNG en question correspond au mécanisme DUAL_EC_DRBG à base de courbes elliptiques de la publication NIST SP 800-90 qui répond aux exigences de certaines entités gouvernementales. Cependant, DUAL_EC_DRBG est en quelque sorte sujet à controverse. Il est accessible pour les applications via l'API CNG (Crypt Next Generation) et le provider d'algorithme « DUALECRNG » (constante BCRYPT_RNG_DUAL_EC_ALGORITHM). DUAL_EC_DRBG n'est pas l'algorithme de génération de nombre aléatoire par défaut de la plateforme. Même s'il est possible de configurer CNG pour qu'il le soit, une telle configuration n'affecte que les applications CNG (note : cependant, de plus en plus d'applications et protocoles, aussi bien en mode noyau qu'en mode utilisateur, utilisent CNG).

Plus intéressant, l'algorithme PRNG par défaut de la plateforme est nouveau. Il s'agit du mécanisme CTR_DRBG (« Counter » Deterministic Random Bit Generation toujours de la publication NIST SP 800-90) qui met en jeu l'algorithme de chiffrement par blocs AES-256. CTR_DRBG concerne aussi bien les applications CNG en mode noyau ou utilisateur, que les applications CryptoAPI (via les CSP Microsoft). Le livre blanc du SP1 de Windows Vista a été mis à jour pour refléter cet état de choses.

Un troisième algorithme est disponible, il s'agit de l'algorithme dit « FIPS 186-2 » conforme à l'annexe 3.1 du standard DSS (FIPS 186-2) et à base de SHA-1 pour le calcul de la fonction G. FIPS 186-2 est exposé par CNG via le provider d'algorithme BCRYPT_RNG_FIPS186_DSA_ALGORITHM, et par CryptoAPI via les CSP de Microsoft de type DSS (CryptGenRandom prend en paramètre le handle du CSP). Cet algorithme est utilisé pour la génération de nombres aléatoires nécessaires à la signature électronique DSA. Je ne suis pas sur qu'une application en ait directement besoin, mais le provider d'algorithme DSA pour CNG (BCRYPT_DSA_ALGORITHM), et les CSP de type DSS en dependent.

Avec le SP1 de Windows Vista et sur Windows Server 2008, on a donc trois algorithmes PRNG :

Algorithme

Standard

Commentaire

CTR_DRBG

NIST SP 800-90

PRNG par défaut de la plateforme. PRNG des CSP MS de type RSA et disponible via CNG (BCRYPT_RNG_ALGORITHM).

DUAL_EC_DRBG

NIST SP 800-90

Disponible via CNG seulement (BCRYPT_RNG_DUAL_EC_ALGORITHM).

FIPS 186-2

FIPS 186-2

PRNG des CSP MS de type DSS et du provider d'algorithme BCRYPT_DSA_ALGORITHM pour CNG et disponible via CNG (BCRYPT_RNG_FIPS186_DSA_ALGORITHM).

 

La source d'entropie des PRNG a aussi été enrichie par le Trusted Platform Module (fonction TPM_GetRandom) lorsque disponible.

Sur Windows Vista RTM et Windows Server 2003 SP2, le PRNG par défaut (CSP MS de type RSA, FIPS.SYS sur Windows Server 2003, ou pour Windows Vista CNG, le provider d'algorithme BCRYPT_RNG_ALGORITHM) suit les recommandations de la section « General Purpose Random Number Generation » toujours de la publication FIPS 186-2 et aussi à base de SHA-1 pour la fonction G. Alors que le PRNG FIPS 186-2 assure que le nombre aléatoire généré est inférieur au nombre premier q de la clé publique DSA, cette variante générique, elle ne procède pas à cette réduction. La motivation pour son remplacement par CTR_DRBG de NIST 800-90 est de bénéficier des avancées les plus récentes en matière de standards cryptographiques.

Récemment, la presse s'est fait écho de défauts du PRNG de Windows 2000 et Windows XP mis en exergue par les informaticiens Dorrendorf/Gutterman/Pinkas de l'Université Hébraïque de Jérusalem et l'Université d'Haïfa. En principe, la conformité du PRNG de Windows Vista RTM et Windows Server 2003 SP2 à FIPS 186-2 fait que ces défauts n'affectent pas ces plateformes. De même, ils seront corrigés dans le Service Pack 3 de Windows XP par une conformité plus stricte au standard FIPS 186-2.

Finalement, il est bien connu qu'on peut utiliser l'API RtlGenRandom pour faire l'économie du « chargement » de CryptoAPI et un CSP (CryptAcquireContext). De même, les librairies c-runtime récentes de Microsoft utilisent RtlGenRandom pour la fonction rand_s. Il faut noter cependant que RtlGenRandom, même s'il utilise la même source d'entropie, n'implémente pas FIPS 186-2. D'ailleurs le commentaire de la documentation n'en recommande pas l'usage : «It (RtlGenRandom) may be altered or unavailable in subsequent versions. Instead, use the CryptGenRandom function. ». Pour avoir du FIPS 186-2 il faut utiliser CryptoAPI ou CNG, et on peut s'attendre à ce que sur Windows Vista SP1 et Windows Server 2008 ce soit la même chose pour CTR_DRBG.