@@ -53,7 +53,7 @@ private static async Task<AwsCredentials> GetTemporaryCredentialsAsync(string id
5353 } ;
5454 }
5555
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 )
5757 {
5858 var client = Utils . ReconstructHttpClient ( httpClient ) ;
5959 var endpoint = $ "https://kms.{ AWS_REGION } .amazonaws.com/";
@@ -64,9 +64,10 @@ private static async Task<JToken> GenerateDataKey(AwsCredentials credentials, IT
6464
6565 client . AddHeader ( "X-Amz-Target" , "TrentService.GenerateDataKey" ) ;
6666
67- var dateTimeNow = DateTime . UtcNow ;
67+ var dateTimeNow = dateOverride ?? DateTime . UtcNow ;
6868 var dateStamp = dateTimeNow . ToString ( "yyyyMMdd" ) ;
69- var amzDate = dateTimeNow . ToString ( "yyyyMMddTHHmmssZ" ) ;
69+ var amzDateFormat = "yyyyMMddTHHmmssZ" ;
70+ var amzDate = dateTimeNow . ToString ( amzDateFormat ) ;
7071 var canonicalUri = "/" ;
7172
7273 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
104105
105106 if ( ! response . IsSuccessStatusCode )
106107 {
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+ }
107114 throw new Exception ( $ "Failed to generate data key: { responseContent } ") ;
108115 }
109116
0 commit comments