diff options
author | Sebastien Pouliot <sebastien@ximian.com> | 2004-05-01 21:05:11 +0400 |
---|---|---|
committer | Sebastien Pouliot <sebastien@ximian.com> | 2004-05-01 21:05:11 +0400 |
commit | 4732aebe0c9ec3d15b34ec5191a45a1c7a5a997f (patch) | |
tree | 45e7224eba23ab2a030817744d80f79d3a82d9ba | |
parent | da1d4959f6f8aeb9292cdfb154ccaa8d02b97103 (diff) |
2004-05-01 Sebastien Pouliot <sebastien@ximian.com>
* CryptoConvert.cs: Updated to latest version. Fix issue with
incomplete key pairs (#57941).
svn path=/trunk/mcs/; revision=26513
-rwxr-xr-x | mcs/mcs/ChangeLog | 5 | ||||
-rwxr-xr-x | mcs/mcs/CryptoConvert.cs | 56 |
2 files changed, 38 insertions, 23 deletions
diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog index b79788f9a3a..1554a4d4a03 100755 --- a/mcs/mcs/ChangeLog +++ b/mcs/mcs/ChangeLog @@ -1,3 +1,8 @@ +2004-05-01 Sebastien Pouliot <sebastien@ximian.com> + + * CryptoConvert.cs: Updated to latest version. Fix issue with + incomplete key pairs (#57941). + 2004-05-01 Todd Berman <tberman@sevenl.net> * driver.cs: Remove '.' from path_chars, now System.* loads properly diff --git a/mcs/mcs/CryptoConvert.cs b/mcs/mcs/CryptoConvert.cs index f333854b9e2..058fe091730 100755 --- a/mcs/mcs/CryptoConvert.cs +++ b/mcs/mcs/CryptoConvert.cs @@ -9,6 +9,7 @@ // using System; +using System.Globalization; using System.Security.Cryptography; using System.Text; @@ -19,7 +20,11 @@ namespace Mono.Security.Cryptography { #else public #endif - class CryptoConvert { + sealed class CryptoConvert { + + private CryptoConvert () + { + } static private int ToInt32LE (byte [] bytes, int offset) { @@ -46,7 +51,7 @@ namespace Mono.Security.Cryptography { for (int i=0; i < array.Length; i++) { if (array [i] != 0x00) { byte[] result = new byte [array.Length - i]; - Array.Copy (array, i, result, 0, result.Length); + Buffer.BlockCopy (array, i, result, 0, result.Length); return result; } } @@ -85,7 +90,7 @@ namespace Mono.Security.Cryptography { // DWORD public exponent RSAParameters rsap = new RSAParameters (); byte[] exp = new byte [4]; - Array.Copy (blob, offset+16, exp, 0, 4); + Buffer.BlockCopy (blob, offset+16, exp, 0, 4); Array.Reverse (exp); rsap.Exponent = Trim (exp); @@ -93,45 +98,50 @@ namespace Mono.Security.Cryptography { // BYTE modulus[rsapubkey.bitlen/8]; int byteLen = (bitLen >> 3); rsap.Modulus = new byte [byteLen]; - Array.Copy (blob, pos, rsap.Modulus, 0, byteLen); + Buffer.BlockCopy (blob, pos, rsap.Modulus, 0, byteLen); Array.Reverse (rsap.Modulus); pos += byteLen; // BYTE prime1[rsapubkey.bitlen/16]; int byteHalfLen = (byteLen >> 1); rsap.P = new byte [byteHalfLen]; - Array.Copy (blob, pos, rsap.P, 0, byteHalfLen); + Buffer.BlockCopy (blob, pos, rsap.P, 0, byteHalfLen); Array.Reverse (rsap.P); pos += byteHalfLen; // BYTE prime2[rsapubkey.bitlen/16]; rsap.Q = new byte [byteHalfLen]; - Array.Copy (blob, pos, rsap.Q, 0, byteHalfLen); + Buffer.BlockCopy (blob, pos, rsap.Q, 0, byteHalfLen); Array.Reverse (rsap.Q); pos += byteHalfLen; // BYTE exponent1[rsapubkey.bitlen/16]; rsap.DP = new byte [byteHalfLen]; - Array.Copy (blob, pos, rsap.DP, 0, byteHalfLen); + Buffer.BlockCopy (blob, pos, rsap.DP, 0, byteHalfLen); Array.Reverse (rsap.DP); pos += byteHalfLen; // BYTE exponent2[rsapubkey.bitlen/16]; rsap.DQ = new byte [byteHalfLen]; - Array.Copy (blob, pos, rsap.DQ, 0, byteHalfLen); + Buffer.BlockCopy (blob, pos, rsap.DQ, 0, byteHalfLen); Array.Reverse (rsap.DQ); pos += byteHalfLen; // BYTE coefficient[rsapubkey.bitlen/16]; rsap.InverseQ = new byte [byteHalfLen]; - Array.Copy (blob, pos, rsap.InverseQ, 0, byteHalfLen); + Buffer.BlockCopy (blob, pos, rsap.InverseQ, 0, byteHalfLen); Array.Reverse (rsap.InverseQ); pos += byteHalfLen; - // BYTE privateExponent[rsapubkey.bitlen/8]; - rsap.D = new byte [byteLen]; - Array.Copy (blob, pos, rsap.D, 0, byteLen); - Array.Reverse (rsap.D); + // ok, this is hackish but CryptoAPI support it so... + // note: only works because CRT is used by default + // http://bugzilla.ximian.com/show_bug.cgi?id=57941 + rsap.D = new byte [byteLen]; // must be allocated + if (pos + byteLen + offset <= blob.Length) { + // BYTE privateExponent[rsapubkey.bitlen/8]; + Buffer.BlockCopy (blob, pos, rsap.D, 0, byteLen); + Array.Reverse (rsap.D); + } RSA rsa = (RSA)RSA.Create (); rsa.ImportParameters (rsap); @@ -173,43 +183,43 @@ namespace Mono.Security.Cryptography { byte[] part = p.Modulus; int len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; // private key part = p.P; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; part = p.Q; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; part = p.DP; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; part = p.DQ; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; part = p.InverseQ; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; part = p.D; len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); return blob; } @@ -251,7 +261,7 @@ namespace Mono.Security.Cryptography { // BYTE modulus[rsapubkey.bitlen/8]; int byteLen = (bitLen >> 3); rsap.Modulus = new byte [byteLen]; - Array.Copy (blob, pos, rsap.Modulus, 0, byteLen); + Buffer.BlockCopy (blob, pos, rsap.Modulus, 0, byteLen); Array.Reverse (rsap.Modulus); RSA rsa = (RSA)RSA.Create (); @@ -294,7 +304,7 @@ namespace Mono.Security.Cryptography { byte[] part = p.Modulus; int len = part.Length; Array.Reverse (part, 0, len); - Array.Copy (part, 0, blob, pos, len); + Buffer.BlockCopy (part, 0, blob, pos, len); pos += len; return blob; } @@ -360,7 +370,7 @@ namespace Mono.Security.Cryptography { StringBuilder sb = new StringBuilder (input.Length * 2); foreach (byte b in input) { - sb.Append (b.ToString ("X2")); + sb.Append (b.ToString ("X2", CultureInfo.InvariantCulture)); } return sb.ToString (); } |