Exportation de secret partagé sous forme de tableau BYTE à partir de BCRYPT_SECRET_HANDLE

J’implémente ECDHE en utilisant des API crypto de prochaine génération (CNG). Je génère des clés publiques et privées avec succès. Pour la clé pré-partagée, j’utilise l’ API BCryptSecretAgreement , qui me renvoie le descripteur secret de la clé pré-partagée (BCRYPT_SECRET_HANDLE).

Comment puis-je exporter la clé pré-partagée en tant que tableau BYTE à partir de BCRYPT_SECRET_HANDLE?

    Une fois que vous avez obtenu votre BCRYPT_SECRET_HANDLE , vous utilisez BCryptDeriveKey pour obtenir la clé de chiffrement symésortingque réelle.

    Après avoir appelé BCryptSecretAgreement , vous devez utiliser la fonction BCryptDeriveKey pour extraire le secret partagé.

    Cela peut être fait comme suit:

     // generates an ECDH shared secret from a public key and a private key int get_ECDH_key(BCRYPT_KEY_HANDLE pubkey, BCRYPT_KEY_HANDLE privkey, unsigned char **key, unsigned int *keylen) { SECURITY_STATUS sstatus; BCRYPT_SECRET_HANDLE secret; int _len; // creates the shared secret, stored in a BCRYPT_SECRET_HANDLE sstatus = BCryptSecretAgreement(privkey, pubkey, &secret, 0); if (!BCRYPT_SUCCESS(sstatus)) { printf("BCryptSecretAgreement failed with status %d", sstatus); return 0; } // find out how much space is needed before resortingeving the shared secret sstatus = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, NULL, NULL, 0, &_len, 0); if (!BCRYPT_SUCCESS(sstatus)) { printf("BCryptDeriveKey failed with status %d", sstatus); return 0; } // allocate space for the shared secret *key = malloc(_len); if (*key == NULL) { perror("malloc failed"); exit(1); } // resortingeve the shared secret sstatus = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, NULL, *key, _len, keylen, 0 ); if (!BCRYPT_SUCCESS(sstatus)) { printf("BCryptDeriveKey failed with status %d", sstatus); return 0; } return 1; } 

    Pour le second paramètre, la constante BCRYPT_KDF_HASH indique d’utiliser un hachage comme fonction de dérivation de clé. Le hachage à utiliser peut être spécifié dans le troisième paramètre. Dans cet exemple, le troisième paramètre est NULL et utilise donc SHA1 par défaut.

    En outre, le quasortingème paramètre, qui est un pointeur sur la mémoire tampon pour recevoir la clé, peut être NULL. Si c’est le cas, la clé n’est pas copiée, mais le nombre d’octets qui seraient copiés est écrit à l’adresse indiquée par le sixième paramètre. Cela nous permet d’allouer la quantité d’espace appropriée, puis d’appeler à nouveau la fonction, en transmettant cette fois l’adresse du tampon alloué.