// Derived from https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-dotnet
        private static byte[] GetSignatureKey(string key, string dateString, string region, string service)
        {
            var dateKey    = HashUtility.CalculateSHA256(dateString, Encoding.UTF8.GetBytes($"AWS4{key}"));
            var regionKey  = HashUtility.CalculateSHA256(region, dateKey);
            var serviceKey = HashUtility.CalculateSHA256(service, regionKey);

            return(HashUtility.CalculateSHA256("aws4_request", serviceKey));
        }
        private string CalculateSignature(string region, Uri url, string secretKey)
        {
            var now       = _clock.UtcNow;
            var shortDate = now.ToString("yyyyMMdd");
            var longDate  = now.ToString("yyyyMMddTHHmmss");

            var signingKey = GetSignatureKey(secretKey, shortDate, region, "codecommit");

            var canonicalRequest     = $"GIT\n{url.LocalPath}\n\nhost:{url.Host}\n\nhost\n";
            var canonicalRequestHash = HashUtility.CalculateSHA256(canonicalRequest);

            var stringToSign   = $"AWS4-HMAC-SHA256\n{longDate}\n{shortDate}/{region}/codecommit/aws4_request\n{HashUtility.HexStringFromBytes(canonicalRequestHash)}";
            var signatureBytes = HashUtility.CalculateSHA256(stringToSign, signingKey);

            return($"{longDate}Z{HashUtility.HexStringFromBytes(signatureBytes)}");
        }