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);