diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index b4fc40a80b..4a02f80f9e 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1368,13 +1368,13 @@ namespace OpenSim.Framework } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string AESEncrypt(string secret, string plainText) + public static string AESEncrypt(ReadOnlySpan secret, ReadOnlySpan plainText) { return AESEncryptString(secret, plainText, string.Empty); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string AESEncryptTo(string secret, string plainText, string ivString) + public static string AESEncryptTo(ReadOnlySpan secret, ReadOnlySpan plainText, ReadOnlySpan ivString) { return AESEncryptString(secret, plainText, ivString); } @@ -1388,15 +1388,15 @@ namespace OpenSim.Framework /// ID... /// A string composed by the Initialization Vector bytes and the /// encrypted text bytes converted to lower case HexString and separated by " : " - private static string AESEncryptString(string secret, string plainText, string ivString = null) + private static string AESEncryptString(ReadOnlySpan secret, ReadOnlySpan plainText, ReadOnlySpan ivString) { - if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(plainText)) + if(secret.Length == 0 || plainText.Length == 0) return string.Empty; - byte[] iv = string.IsNullOrEmpty(ivString) ? + byte[] iv = ivString.Length == 0 ? MD5.Create().ComputeHash(UUID.Random().GetBytes()) : - MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(ivString)); - byte[] aesKey = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(secret)); + MD5.Create().ComputeHash(Utils.StringToBytesNoTerm(ivString)); + byte[] aesKey = SHA256.Create().ComputeHash(Utils.StringToBytesNoTerm(secret)); byte[] encryptedText; using (Aes aes = Aes.Create()) @@ -1419,13 +1419,13 @@ namespace OpenSim.Framework } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string AESDecrypt(string secret, string encryptedText) + public static ReadOnlySpan AESDecrypt(ReadOnlySpan secret, ReadOnlySpan encryptedText) { - return AESDecryptString(secret, encryptedText, string.Empty); + return AESDecryptString(secret, encryptedText, new ReadOnlySpan()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string AESDecryptFrom(string secret, string encryptedText, string ivString) + public static ReadOnlySpan AESDecryptFrom(ReadOnlySpan secret, ReadOnlySpan encryptedText, ReadOnlySpan ivString) { return AESDecryptString(secret, encryptedText, ivString); } @@ -1440,31 +1440,30 @@ namespace OpenSim.Framework /// if used in the encription. eg; an avatarID, a SecureSessionID, an object or /// script ID... /// The decrypted string. - private static string AESDecryptString(string secret, string encryptedText, string ivString = null) + private static ReadOnlySpan AESDecryptString(ReadOnlySpan secret, ReadOnlySpan encryptedText, ReadOnlySpan ivString) { - if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(encryptedText)) + if(secret.Length == 0 || encryptedText.Length == 0) return string.Empty; - string[] encodedParts = encryptedText.Split(":"); - if(encodedParts.Length < 2 || encodedParts[1].Length == 0) + int sep = encryptedText.IndexOf(':'); + if(sep < 0) return string.Empty; byte[] iv; byte[] buffer; try { - iv = string.IsNullOrEmpty(ivString) ? - Convert.FromHexString(encodedParts[0]) : - MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(ivString)); - - buffer = Convert.FromHexString(encodedParts[1]); + iv = ivString.Length == 0 ? + Convert.FromHexString(encryptedText[..sep]): + MD5.Create().ComputeHash(Utils.StringToBytesNoTerm(ivString)); + buffer = Convert.FromHexString(encryptedText[(sep + 1)..]); } catch { return string.Empty; } - byte[] aesKey = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(secret)); + byte[] aesKey = SHA256.Create().ComputeHash(Utils.StringToBytesNoTerm(secret)); using Aes aes = Aes.Create(); aes.Key = aesKey; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 28cc41a61e..5536f82fdd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -6380,13 +6380,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(plainText)) return LSL_String.Empty; - string ret = Util.AESEncrypt(secret, plainText); - if(string.IsNullOrEmpty(ret)) + ReadOnlySpan ret = Util.AESEncrypt(secret.AsSpan(), plainText.AsSpan()); + if(ret.Length == 0) { OSSLShoutError("osAESEncrypt: Failed to encrypt!"); return LSL_String.Empty; } - return ret; + return ret.ToString(); } public LSL_String osAESDecrypt(string secret, string encryptedText) @@ -6394,13 +6394,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(encryptedText)) return LSL_String.Empty; - string ret = Util.AESDecrypt(secret, encryptedText); - if(string.IsNullOrEmpty(ret)) + ReadOnlySpan ret = Util.AESDecrypt(secret.AsSpan(), encryptedText.AsSpan()); + if(ret.Length == 0) { OSSLShoutError("osAESDecrypt: Failed to Decrypt!"); return LSL_String.Empty; } - return ret; + return ret.ToString(); } public LSL_String osAESEncryptTo(string secret, string plainText, string ivString) @@ -6408,13 +6408,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(plainText) || string.IsNullOrEmpty(ivString)) return LSL_String.Empty; - string ret = Util.AESEncryptTo(secret, plainText, ivString); - if(string.IsNullOrEmpty(ret)) + ReadOnlySpan ret = Util.AESEncryptTo(secret.AsSpan(), plainText.AsSpan(), ivString.AsSpan()); + if (ret.Length == 0) { OSSLShoutError("osAESEncryptTo: Failed to encrypt!"); return LSL_String.Empty; } - return ret; + return ret.ToString(); } public LSL_String osAESDecryptFrom(string secret, string encryptedText, string ivString) @@ -6422,13 +6422,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(encryptedText) || string.IsNullOrEmpty(ivString)) return LSL_String.Empty; - string ret = Util.AESDecryptFrom(secret, encryptedText, ivString); - if(string.IsNullOrEmpty(ret)) + ReadOnlySpan ret = Util.AESDecryptFrom(secret.AsSpan(), encryptedText.AsSpan(), ivString.AsSpan()); + if (ret.Length == 0) { OSSLShoutError("osAESDecryptFrom: Failed to decrypt!"); return LSL_String.Empty; } - return ret; + return ret.ToString(); } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 9228162796..307117638b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -2256,6 +2256,11 @@ namespace OpenSim.Region.ScriptEngine.Shared m_string = s; } + public LSLString(ReadOnlySpan s) + { + m_string = s.ToString(); + } + public LSLString(double d) { string s = String.Format(Culture.FormatProvider, "{0:0.000000}", d); @@ -2301,6 +2306,11 @@ namespace OpenSim.Region.ScriptEngine.Shared return new LSLString(s); } + static public implicit operator LSLString(ReadOnlySpan s) + { + return new LSLString(s); + } + public static string ToString(LSLString s) { return s.m_string; @@ -2353,10 +2363,7 @@ namespace OpenSim.Region.ScriptEngine.Shared static public explicit operator LSLString(bool b) { - if (b) - return new LSLString("1"); - else - return new LSLString("0"); + return new LSLString( b ? "1" : "0"); } public static implicit operator Vector3(LSLString s) @@ -2379,6 +2386,11 @@ namespace OpenSim.Region.ScriptEngine.Shared return new list(new object[] { s }); } + public static implicit operator ReadOnlySpan(LSLString s) + { + return s.m_string.AsSpan(); + } + #endregion #region Overriders