2009-02-04 10 views
4

Je souhaite essayer de lier la fonction API CryptUnprotectData et la chaîne .net SecureString de la meilleure façon possible. CryptUnprotectData renvoie une structure DATA_BLOB constituée d'un tableau d'octets et d'une longueur d'octets. Dans mon programme, ce sera une chaîne UTF-16 Unicode. SecureString a un constructeur qui prend un char * et params longueur, donc je voudrais pouvoir faire quelque chose comme:Création de SecureString à partir d'une chaîne unicode non gérée

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

Cela fonctionne, sauf UTF-16 est de longueur variable, donc je ne sais pas vraiment ce qu'il faut utiliser comme argument de longueur. L'exemple ci-dessus suppose des caractères de 2 octets (BMP), mais pour les autres plans, il peut aller jusqu'à 4 octets. J'ai besoin de connaître le nombre de caractères UTF-16 dans le tableau d'octets. Quel est le meilleur moyen de le faire sans copier les valeurs en mémoire (compromettant ainsi la sécurité)? Je prévois de mettre à zéro et libérer le tableau d'octets le plus rapidement possible.

Répondre

2

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

Par exemple, si pbData contenu (juste) une paire de substitution, cbData serait 4 et vous auriez encore envie de passer 2 comme second argument - parce que c'est le nombre de System.Char valeurs que vous construisez la SecureString de. Le fait qu'il s'agisse d'un caractère unicode non BMP est sans rapport avec le nombre de valeurs UTF-16 System.Char dans lesquelles il est représenté.

(Et oui, le support pour les données non-BMP est un peu en désordre, et je soupçonne Je suis sûr que je ne le fais pas ... Heureusement, dans beaucoup d'endroits, vous n'avez pas besoin de vous inquiéter ...)

+0

Merci beaucoup Jon, ça a du sens! Ce truc est encore nouveau pour moi. – Jarrod

Questions connexes