@@ -53,7 +53,7 @@ private static async Task<AwsCredentials> GetTemporaryCredentialsAsync(string id
53
53
} ;
54
54
}
55
55
56
- private static async Task < JToken > GenerateDataKey ( AwsCredentials credentials , IThirdwebHttpClient httpClient )
56
+ private static async Task < JToken > GenerateDataKey ( AwsCredentials credentials , IThirdwebHttpClient httpClient , DateTime ? dateOverride = null )
57
57
{
58
58
var client = Utils . ReconstructHttpClient ( httpClient ) ;
59
59
var endpoint = $ "https://kms.{ AWS_REGION } .amazonaws.com/";
@@ -64,9 +64,10 @@ private static async Task<JToken> GenerateDataKey(AwsCredentials credentials, IT
64
64
65
65
client . AddHeader ( "X-Amz-Target" , "TrentService.GenerateDataKey" ) ;
66
66
67
- var dateTimeNow = DateTime . UtcNow ;
67
+ var dateTimeNow = dateOverride ?? DateTime . UtcNow ;
68
68
var dateStamp = dateTimeNow . ToString ( "yyyyMMdd" ) ;
69
- var amzDate = dateTimeNow . ToString ( "yyyyMMddTHHmmssZ" ) ;
69
+ var amzDateFormat = "yyyyMMddTHHmmssZ" ;
70
+ var amzDate = dateTimeNow . ToString ( amzDateFormat ) ;
70
71
var canonicalUri = "/" ;
71
72
72
73
var canonicalHeaders = $ "host:kms.{ AWS_REGION } .amazonaws.com\n x-amz-date:{ amzDate } \n ";
@@ -104,6 +105,12 @@ private static async Task<JToken> GenerateDataKey(AwsCredentials credentials, IT
104
105
105
106
if ( ! response . IsSuccessStatusCode )
106
107
{
108
+ if ( dateOverride == null && responseContent . Contains ( "InvalidSignatureException" ) )
109
+ {
110
+ var parsedTime = responseContent . Substring ( responseContent . LastIndexOf ( '(' ) + 1 , amzDate . Length ) ;
111
+ return await GenerateDataKey ( credentials , httpClient , DateTime . ParseExact ( parsedTime , amzDateFormat , System . Globalization . CultureInfo . InvariantCulture ) . ToUniversalTime ( ) )
112
+ . ConfigureAwait ( false ) ;
113
+ }
107
114
throw new Exception ( $ "Failed to generate data key: { responseContent } ") ;
108
115
}
109
116
0 commit comments