private DaikinUniversityApiSignature GenerateRequestAPISessionSignature(HttpMethod method, string apiRelativeUrl, HttpRequestHeaders headers)
        {
            StringBuilder sbToSign = new StringBuilder();

            // Get all the x-csod headers that we must include in signature except the signature itself
            var csodHeaders = headers.Where(w => w.Key.StartsWith("x-csod-") &&
                                            w.Key != "x-csod-signature")
                              .Select(sm => new
            {
                Key   = sm.Key,
                Value = sm.Value.Aggregate(string.Empty, (a, l) => a.Trim() + l.Trim())
            })
                              .Distinct()
                              .OrderBy(o => o.Key);

            sbToSign.Append(method);

            foreach (var csodHeader in csodHeaders)
            {
                sbToSign.AppendFormat("\n{0}:{1}", csodHeader.Key, csodHeader.Value);
            }

            sbToSign.Append("\n").Append(apiRelativeUrl);

            var signature = new DaikinUniversityApiSignature()
            {
                ApiSecret          = SessionToken != null ? SessionToken.Secret : ConfigApiSecret,
                RequestedSignature = sbToSign.ToString()
            };

            byte[] secretKeyBytes = Convert.FromBase64String(signature.ApiSecret);
            byte[] inputBytes     = Encoding.UTF8.GetBytes(sbToSign.ToString());

            using (var hmac = new HMACSHA512(secretKeyBytes))
            {
                byte[] hashValue = hmac.ComputeHash(inputBytes);

                signature.Signature = Convert.ToBase64String(hashValue);
            }

            return(signature);
        }
        private HttpRequestMessage GenerateRequestApplyAPISignature(HttpRequestMessage reqMsg, DaikinUniversityApiSignature signature)
        {
            reqMsg.Headers.Add("x-csod-signature", signature.Signature);

            return(reqMsg);
        }