using System.Security.Cryptography;
public class TripAdvisorRentalsHeader
private readonly Uri _uri;
private readonly string _requestBody;
private readonly string _client;
private readonly string _secret;
private readonly string _requestMethod;
private readonly string _timestamp;
private string _bodyDigest;
private string _requestDigest;
private string _signature;
private const string Algorithm = "VRS-HMAC-SHA512";
public TripAdvisorRentalsHeader(string url, string requestBody, string requestMethod, string client, string secret)
_requestBody = requestBody;
_requestMethod = requestMethod.ToUpper();
_timestamp = GetFormattedTimeStamp();
public string GetHeader()
var header = $"{Algorithm} timestamp={_timestamp},client={_client},signature={GetSignedHashFormatted(_uri, _timestamp, _requestBody, _secret, _requestMethod)}";
private string GetSignedHashFormatted(Uri uri, string timestamp, string requestBody, string secret,
var urlPath = uri.AbsolutePath;
var query = uri.Query.TrimStart('?');
_bodyDigest = GetSha512Hash(requestBody);
var requestData = $"{requestMethod}\n{urlPath}\n{query}\n{timestamp}\n{_bodyDigest}";
_requestDigest = GetSha512Hash(requestData);
var keyByte = Encoding.UTF8.GetBytes(secret);
using (var shaM = new HMACSHA512(keyByte))
using (var stream = new MemoryStream())
var signedHash = shaM.ComputeHash(GenerateStreamFromString(_requestDigest, stream));
_signature = FormatToHexadecimalString(signedHash);
private string FormatToHexadecimalString(byte[] hash)
return new StringBuilder(BitConverter.ToString(hash))
private string GetFormattedTimeStamp()
return $"{DateTime.UtcNow.ToString("s")}Z";
private string GetSha512Hash(string toHash)
using (SHA512 shaM = new SHA512Managed())
using (var stream = new MemoryStream())
var hash = shaM.ComputeHash(GenerateStreamFromString(toHash, stream));
return FormatToHexadecimalString(hash);
private Stream GenerateStreamFromString(string s, MemoryStream memoryStream)
var writer = new StreamWriter(memoryStream);
memoryStream.Position = 0;
public static void Main()
var tarHeader = new TripAdvisorRentalsHeader("https://rentals.tripadvisor.com/api/property/v1/4103393/eviivo_Greenhill_57092", null, "GET", "Eviivo",
"e5M6rvJTe9HM2vRjp0xFkcj0VpBn17Fxq3v7nqCiFUmNWTcq42YaIWPvVCqm5dMkeSB6NNX14NT9h5CJGPf4ZQ==");
var header = tarHeader.GetHeader();
Console.WriteLine("Hello World");
Console.WriteLine(header);