Question

Je suis désireux d'essayer de lier la fonction API Windows CryptUnprotectData et le .net SecureString ensemble la meilleure façon possible. CryptUnprotectData renvoie une structure DATA_BLOB constitué par un tableau d'octets et une longueur d'octet. Dans mon programme, ce sera une chaîne Unicode UTF-16. SecureString a un constructeur qui prend un params ombles * et longueur, donc je voudrais pouvoir faire quelque chose comme:

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

Cela fonctionne, sauf UTF-16 est de longueur variable, donc je ne sais pas vraiment quoi utiliser comme argument de longueur. L'exemple ci-dessus suppose 2 caractères d'octet (BMP), mais pour d'autres plans, il pourrait être jusqu'à 4 octets. Je dois connaître le nombre de caractères UTF-16 dans le tableau d'octets. Quelle est la meilleure façon de le faire sans copier les valeurs autour de la mémoire (compromettant ainsi la sécurité). Je prévois mettre à zéro et de libérer le tableau d'octets le plus rapidement possible.

Était-ce utile?

La solution

La plupart des offres de l'API de Windows avec des points de code UTF-16 pour autant que je suis au courant - en d'autres termes, vous traiter des paires de substitution comme deux points de code au lieu d'un seul caractère. Étant donné que le constructeur de SecureString traite avec un pointeur vers des valeurs .NET (qui System.Char sont UTF-16) Je pense que le code extrait que vous avez est très bien - le nombre d'éléments dans pbData la moitié de sa taille en octets.

Par exemple, si contenu pbData (juste) une paire de substitution, serait 4 cbData et vous auriez encore envie de passer 2 comme second argument - parce que c'est le nombre de valeurs que vous êtes SecureString la construction du de <=>. Le fait que ce soit un caractère non-BMP unicode est sans rapport avec le nombre de UTF-16 <=> valeurs qu'elle est représentée dans.

(Et oui, le support pour les données non-BMP est un peu un gâchis, et je soupçonne que très peu de gens ont tout de partout. Je suis sûr que je ne suis pas. Heureusement, dans de nombreux endroits que vous n'avez pas besoin à vous inquiéter ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top