1

Je suis dans le processus de mise en œuvre d'un ECDH CNG et j'essaie d'utiliser le BCDF BCRYPT_KDF_SP80056A_CONCAT pour dériver une clé symétrique AES256 (BCryptDeriveKey()). J'ai un problème (je reçois toujours le statut 0xc000000d retourné.)Problèmes d'utilisation de CNG et BCRYPT_KDF_SP80056A_CONCAT KDF

J'ai généré un secret partagé avec succès et j'ai créé le tampon desc "BCryptBufferDesc" qui a un tableau de "BCryptBuffer" avec 1 AlgorithmID, 1 PartyU et 1 PartyV "autres infos". Je pense avoir les structures définies et peuplées correctement. Je ne fais que choisir des "valeurs" pour les octets PartyU et PartyV (j'ai essayé 1 octet et 16 octets pour chacun mais j'ai obtenu le même résultat). La documentation de NIST ne donne aucun détail sur ce que l'autre information devrait être.

J'ai suivi le site Web de Microsoft pour créer ces structures, en utilisant leurs chaînes, définit, etc. J'ai essayé avec le standard "HASH" kdf et il fonctionne et je reçois la même clé dérivée sur les deux "côtés", mais avec la concaténation KDF je reçois toujours le même état 0xC000000D retour ..

Quelqu'un d'autre a été en mesure d'utiliser avec succès BCRYPT_KDF_SP80056A_CONCAT CNG KDF? Si vous l'avez fait, avez-vous des indices?

Répondre

2

Cela a fonctionné pour moi:

ULONG derivedKeySize = 32; 
    BCryptBufferDesc params; 
    params.ulVersion = BCRYPTBUFFER_VERSION; 
    params.cBuffers = 3; 
    params.pBuffers = new BCryptBuffer[params.cBuffers]; 
    params.pBuffers[0].cbBuffer = 0; 
    params.pBuffers[0].BufferType = KDF_ALGORITHMID; 
    params.pBuffers[0].pvBuffer = new byte[0]; 
    params.pBuffers[1].cbBuffer = 0; 
    params.pBuffers[1].BufferType = KDF_PARTYUINFO; 
    params.pBuffers[1].pvBuffer = new byte[0]; 
    params.pBuffers[2].cbBuffer = 0; 
    params.pBuffers[2].BufferType = KDF_PARTYVINFO; 
    params.pBuffers[2].pvBuffer = new byte[0]; 

    NTSTATUS rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, NULL, 0, &derivedKeySize, 0); 
    if (rv != 0){/*fail*/} 

    UCHAR derivedKey = new UCHAR[derivedKeySize]; 

    rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, derivedKey, derivedKeySize, &derivedKeySize, 0); 
    if (rv != 0){/*fail*/}