private static byte[] CreateHmacForSecureString(IntPtr hProv, IntPtr hKey, SecureString ss) { IntPtr hHash = IntPtr.Zero; CryptCreateHash(hProv, CALG_HMAC, hKey, 0, ref hHash); var hmacInfo = new _HMAC_Info() { HashAlgid = CALG_SHA512 }; CryptSetHashParam(hHash, HP_HMAC_INFO, ref hmacInfo, 0); var bstr = Marshal.SecureStringToBSTR(ss); var len = (uint)Marshal.ReadInt32(bstr, -4); CryptHashData(hHash, bstr, len, 0); Marshal.ZeroFreeBSTR(bstr); uint length = 64; byte[] pbData = new byte[64]; CryptGetHashParam(hHash, HP_HASHVAL, pbData, ref length, 0); CryptDestroyHash(hHash); return(pbData); }
static extern bool CryptSetHashParam(IntPtr hHash, uint dwParam, ref _HMAC_Info pbData, Int32 dwFlags);