private void ParseAuthorizationHeader() { string logMessage = ""; if (String.IsNullOrEmpty(Authorization)) { return; } string exceptionMsg = "Invalid authorization header format: " + Authorization; try { #region Retrieve-Outer-Values // [encryption] [values] string[] valsOuter = Authorization.Split(new[] { ' ' }, 2); if (valsOuter == null || valsOuter.Length < 2) { throw new ArgumentException(exceptionMsg); } logMessage += _Header + "Authorization header : " + Authorization + Environment.NewLine; logMessage += _Header + "Outer header values :" + Environment.NewLine; for (int i = 0; i < valsOuter.Length; i++) { logMessage += " " + i + ": " + valsOuter[i].Trim() + Environment.NewLine; } #endregion if (valsOuter[0].Equals("AWS")) { #region Signature-V2 // see https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader // Authorization: AWS AWSAccessKeyId:Signature string[] valsInner = valsOuter[1].Split(':'); logMessage += _Header + "Inner header values" + Environment.NewLine; for (int i = 0; i < valsInner.Length; i++) { logMessage += " " + i + ": " + valsInner[i].Trim() + Environment.NewLine; } if (valsInner.Length != 2) { throw new ArgumentException(exceptionMsg); } SignatureVersion = S3SignatureVersion.Version2; AccessKey = valsInner[0].Trim(); Signature = valsInner[1].Trim(); logMessage += _Header + "Signature version : " + SignatureVersion.ToString() + Environment.NewLine + _Header + "Access key : " + AccessKey + Environment.NewLine + _Header + "Signature : " + Signature; return; #endregion } else if (valsOuter[0].Equals("AWS4-HMAC-SHA256")) { #region Signature-V4 // see https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html // // AWS4-HMAC-SHA256 Credential=access/20190418/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;user-agent;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length, Signature=66946e06895806f4e32d32217c1a02313b9d9235b759f3a690742c8f9971daa0 // // valsOuter[0] AWS4-HMAC-SHA256 // valsOuter[1] everything else... SignatureVersion = S3SignatureVersion.Version4; string[] keyValuePairs = valsOuter[1].Split(','); List <string> keyValuePairsTrimmed = new List <string>(); logMessage += _Header + "Inner header values" + Environment.NewLine; for (int i = 0; i < keyValuePairs.Length; i++) { string currKey = keyValuePairs[i]; if (String.IsNullOrEmpty(currKey)) { continue; } currKey = currKey.Trim(); keyValuePairsTrimmed.Add(currKey); logMessage += i + ": " + keyValuePairs[i].Trim() + Environment.NewLine; } foreach (string currKey in keyValuePairsTrimmed) { if (currKey.StartsWith("Credential=")) { #region Credentials string credentialString = currKey.Replace("Credential=", "").Trim(); string[] credentialVals = credentialString.Split('/'); if (credentialVals.Length < 5) { throw new ArgumentException(exceptionMsg); } AccessKey = credentialVals[0].Trim(); Region = credentialVals[2].Trim(); #endregion } else if (currKey.StartsWith("SignedHeaders=")) { #region Signed-Headers string signedHeadersString = currKey.Replace("SignedHeaders=", "").Trim(); string[] signedHeaderVals = signedHeadersString.Split(';'); if (signedHeaderVals != null && signedHeaderVals.Length > 0) { foreach (string currSignedHeader in signedHeaderVals) { SignedHeaders.Add(currSignedHeader.Trim()); } SignedHeaders.Sort(); } #endregion } else if (currKey.StartsWith("Signature=")) { #region Signature Signature = currKey.Replace("Signature=", "").Trim(); #endregion } else if (currKey.StartsWith("Expires=")) { #region Expires Expires = currKey.Replace("Expires=", "").Trim(); #endregion } } logMessage += _Header + "Signature version : " + SignatureVersion.ToString() + Environment.NewLine + _Header + "Access key : " + AccessKey + Environment.NewLine + _Header + "Region : " + Region + Environment.NewLine + _Header + "Signature : " + Signature; return; #endregion } else { throw new ArgumentException(exceptionMsg + Authorization); } } finally { _Logger?.Invoke(logMessage); } }
private void FormExternalSignature_Load(object sender, EventArgs e) { txtSignature.Text = Signature; txtSignatureVersion.Text = SignatureVersion.ToString(); txtSoftwareCertNumber.Text = SoftwareCertificateNumber.ToString(); }