diff --git a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.NetStandard.csproj b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.NetStandard.csproj index abf7a8c04827..1194450a69d1 100644 --- a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.NetStandard.csproj +++ b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.NetStandard.csproj @@ -33,7 +33,7 @@ - + diff --git a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.nuspec b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.nuspec index ab245a1f60a4..384a021c8a3e 100644 --- a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.nuspec +++ b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AWSSDK.Extensions.CloudFront.Signers.nuspec @@ -3,7 +3,7 @@ AWSSDK.Extensions.CloudFront.Signers AWSSDK - Extensions for AWS CloudFront - 4.0.0.0 + 4.0.0.1 Amazon Web Services This package contains extension methods for creating signed URLs for Amazon CloudFront distributions and for creating signed cookies for Amazon CloudFront distributions using canned or custom policies. en-US @@ -30,7 +30,6 @@ - diff --git a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontCookieSigner.cs b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontCookieSigner.cs index 2673a9b186f9..3c209d653e24 100644 --- a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontCookieSigner.cs +++ b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontCookieSigner.cs @@ -15,15 +15,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Security.Cryptography; using System.Text; -using Amazon.CloudFront.Model; -using Amazon.Runtime; using Amazon.Util; -using System.Globalization; - namespace Amazon.CloudFront { /// @@ -159,12 +154,11 @@ public static CookiesForCannedPolicy GetCookiesForCannedPolicy(string resourceUr cookies.Expires = new KeyValuePair( ExpiresKey, epochSeconds); - RSAParameters rsaParameters = AmazonCloudFrontUrlSigner.ConvertPEMToRSAParameters(privateKey); string cannedPolicy = "{\"Statement\":[{\"Resource\":\"" + resourceUrlOrPath + "\",\"Condition\":{\"DateLessThan\":{\"AWS:EpochTime\":" + epochSeconds + "}}}]}"; byte[] signatureBytes = AmazonCloudFrontUrlSigner.SignWithSha1RSA( - UTF8Encoding.UTF8.GetBytes(cannedPolicy), rsaParameters); + UTF8Encoding.UTF8.GetBytes(cannedPolicy), privateKey); string urlSafeSignature = AmazonCloudFrontUrlSigner.MakeBytesUrlSafe(signatureBytes); cookies.Signature = new KeyValuePair(SignatureKey, urlSafeSignature); @@ -252,9 +246,8 @@ public static CookiesForCustomPolicy GetCookiesForCustomPolicy(string resourceUr var base64EncodedPolicy = AmazonCloudFrontUrlSigner.MakeStringUrlSafe(policy); cookies.Policy = new KeyValuePair(PolicyKey, base64EncodedPolicy); - RSAParameters rsaParameters = AmazonCloudFrontUrlSigner.ConvertPEMToRSAParameters(privateKey); byte[] signatureBytes = AmazonCloudFrontUrlSigner.SignWithSha1RSA( - UTF8Encoding.UTF8.GetBytes(policy), rsaParameters); + Encoding.UTF8.GetBytes(policy), privateKey); string urlSafeSignature = AmazonCloudFrontUrlSigner.MakeBytesUrlSafe(signatureBytes); cookies.Signature = new KeyValuePair(SignatureKey, urlSafeSignature); diff --git a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontUrlSigner.cs b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontUrlSigner.cs index 89c6eb8491df..cd0d4d970110 100644 --- a/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontUrlSigner.cs +++ b/extensions/src/AWSSDK.Extensions.CloudFront.Signers/AmazonCloudFrontUrlSigner.cs @@ -12,19 +12,19 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ + using System; -using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Text; -using Amazon.CloudFront.Model; using Amazon.Runtime; using Amazon.Util; +#if !NET using Org.BouncyCastle.OpenSsl; -using System.Globalization; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; +#endif #pragma warning disable 1591 @@ -266,8 +266,7 @@ public static string SignUrl(string resourceUrlOrPath, string keyPairId, FileInf /// A signed URL that will permit access to distribution and S3 objects as specified in the policy document. public static string SignUrl(string resourceUrlOrPath, string keyPairId, TextReader privateKey, string policy) { - RSAParameters rsaParameters = ConvertPEMToRSAParameters(privateKey); - byte[] signatureBytes = SignWithSha1RSA(UTF8Encoding.UTF8.GetBytes(policy), rsaParameters); + byte[] signatureBytes = SignWithSha1RSA(Encoding.UTF8.GetBytes(policy), privateKey); string urlSafePolicy = MakeStringUrlSafe(policy); string urlSafeSignature = MakeBytesUrlSafe(signatureBytes); @@ -330,11 +329,10 @@ public static String SignUrlCanned(string resourceUrlOrPath, DateTime expiresOn) { string epochSeconds = AWSSDKUtils.ConvertToUnixEpochSecondsString(expiresOn); - RSAParameters rsaParameters = ConvertPEMToRSAParameters(privateKey); string cannedPolicy = "{\"Statement\":[{\"Resource\":\"" + resourceUrlOrPath + "\",\"Condition\":{\"DateLessThan\":{\"AWS:EpochTime\":" + epochSeconds + "}}}]}"; - byte[] signatureBytes = SignWithSha1RSA(UTF8Encoding.UTF8.GetBytes(cannedPolicy), rsaParameters); + byte[] signatureBytes = SignWithSha1RSA(Encoding.UTF8.GetBytes(cannedPolicy), privateKey); string urlSafeSignature = MakeBytesUrlSafe(signatureBytes); @@ -503,20 +501,23 @@ private static string GenerateResourcePath(Protocol protocol, /// Signs the data given with the private key given, using the SHA1withRSA /// algorithm provided by bouncy castle. /// - internal static byte[] SignWithSha1RSA(byte[] dataToSign, RSAParameters rsaParameters) + internal static byte[] SignWithSha1RSA(byte[] dataToSign, TextReader privateKey) { - using (SHA1 cryptoSHA1 = GetSHA1Provider()) + using (SHA1 cryptoSHA1 = SHA1.Create()) + using (RSA rsa = RSA.Create()) { - var providerRSA = RSA.Create(); - providerRSA.ImportParameters(rsaParameters); + ImportRSAFromPem(rsa, privateKey); byte[] hashedData = cryptoSHA1.ComputeHash(dataToSign); - return GetRSAPKCS1SignatureFromSHA1(hashedData, providerRSA); + return GetRSAPKCS1SignatureFromSHA1(hashedData, rsa); } } - internal static RSAParameters ConvertPEMToRSAParameters(TextReader privateKeyReader) + private static void ImportRSAFromPem(RSA rsa, TextReader privateKeyReader) { +#if NET + rsa.ImportFromPem(privateKeyReader.ReadToEnd()); +#else RSAParameters rsaParams; try { @@ -543,15 +544,7 @@ internal static RSAParameters ConvertPEMToRSAParameters(TextReader privateKeyRea { throw new AmazonClientException("Invalid RSA Private Key", e); } - return rsaParams; - } - - private static SHA1 GetSHA1Provider() - { -#if NETSTANDARD - return SHA1.Create(); -#else - return new SHA1CryptoServiceProvider(); + rsa.ImportParameters(rsaParams); #endif } @@ -567,4 +560,4 @@ private static byte[] GetRSAPKCS1SignatureFromSHA1(byte[] hashedData, RSA provid #endif } } -} \ No newline at end of file +} diff --git a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.NetStandard.csproj b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.NetStandard.csproj index 515589ad9ef6..71ad3d3254fc 100644 --- a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.NetStandard.csproj +++ b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.NetStandard.csproj @@ -32,7 +32,7 @@ - + diff --git a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.nuspec b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.nuspec index 2ee88c188142..6c839dc29968 100644 --- a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.nuspec +++ b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/AWSSDK.Extensions.EC2.DecryptPassword.nuspec @@ -3,7 +3,7 @@ AWSSDK.Extensions.EC2.DecryptPassword AWSSDK - Extensions for AWS EC2 - 4.0.0.0 + 4.0.0.1 Amazon Web Services Extensions for the AWS EC2 to get the decrypted password for an EC2 instance. en-US @@ -30,7 +30,6 @@ - diff --git a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/GetPasswordDataResponseExtensions.cs b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/GetPasswordDataResponseExtensions.cs index cf661b47aa0e..ae6aa81f2927 100644 --- a/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/GetPasswordDataResponseExtensions.cs +++ b/extensions/src/AWSSDK.Extensions.EC2.DecryptPassword/GetPasswordDataResponseExtensions.cs @@ -12,21 +12,19 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ + using System; -using System.Collections.Generic; -using System.Xml.Serialization; +using System.Security.Cryptography; using System.Text; - -using Amazon.EC2; +#if !NET using Amazon.Runtime; using System.IO; -using System.Security.Cryptography; -using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; -using System.Runtime.CompilerServices; -using System.Diagnostics; +using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; +#endif + namespace Amazon.EC2.Model { /// @@ -43,6 +41,10 @@ public static class GetPasswordDataResponseExtensions /// The decrypted password public static string GetDecryptedPassword(this GetPasswordDataResponse getPasswordDataResponse, string rsaPrivateKey) { + RSA rsa = RSA.Create(); +#if NET + rsa.ImportFromPem(rsaPrivateKey.AsSpan().Trim()); +#else RSAParameters rsaParams; try { @@ -69,12 +71,11 @@ public static string GetDecryptedPassword(this GetPasswordDataResponse getPasswo { throw new AmazonEC2Exception("Invalid RSA Private Key", e); } - - RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(rsaParams); +#endif byte[] encryptedBytes = Convert.FromBase64String(getPasswordDataResponse.PasswordData); - var decryptedBytes = rsa.Decrypt(encryptedBytes, false); + var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.Pkcs1); string decrypted = Encoding.UTF8.GetString(decryptedBytes); return decrypted; diff --git a/extensions/test/CloudFront.SignersTests/CloudFront.Signers.Tests.NetStandard.csproj b/extensions/test/CloudFront.SignersTests/CloudFront.Signers.Tests.NetStandard.csproj index c8a9b0746541..419e75868d09 100644 --- a/extensions/test/CloudFront.SignersTests/CloudFront.Signers.Tests.NetStandard.csproj +++ b/extensions/test/CloudFront.SignersTests/CloudFront.Signers.Tests.NetStandard.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1;net8.0 CloudFront.SignersTests @@ -13,7 +13,6 @@ false - diff --git a/extensions/test/EC2.DecryptPasswordTests/EC2.DecryptPassword.NetStandard.csproj b/extensions/test/EC2.DecryptPasswordTests/EC2.DecryptPassword.NetStandard.csproj index e4ea2a0cec74..bd9d515b13b2 100644 --- a/extensions/test/EC2.DecryptPasswordTests/EC2.DecryptPassword.NetStandard.csproj +++ b/extensions/test/EC2.DecryptPasswordTests/EC2.DecryptPassword.NetStandard.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1;net8.0 EC2.DecryptPasswordTests @@ -14,7 +14,6 @@ true -