diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 050f826c99..aca0edf77e 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1230,12 +1230,12 @@ namespace OpenSim.Framework return (char)(b > 9 ? b + 0x37 : b + '0'); } - public static string bytesToHexString(byte[] bytes, bool lowerCaps) + public static string bytesToHexString(Span bytes, bool lowerCaps) { if (bytes == null || bytes.Length == 0) return string.Empty; - char[] chars = new char[2 * bytes.Length]; + Span chars = stackalloc char[2 * bytes.Length]; if (lowerCaps) { for (int i = 0, j = 0; i < bytes.Length; ++i) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 81be18b4cb..75be16f284 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -52,6 +52,7 @@ using System.Diagnostics; using System.Drawing; using System.Globalization; using System.Reflection; +using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -8228,6 +8229,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return Util.SHA1Hash(src, Encoding.UTF8).ToLower(); } + public LSL_String llSHA256String(LSL_String input) + { + // Create a SHA256 + using SHA256 sha256Hash = SHA256.Create(); + + // ComputeHash - returns byte array + Span bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input)).AsSpan(); + return Util.bytesToHexString(bytes, true); + } + protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, byte profileshape, byte pathcurve) { float tempFloat; // Use in float expressions below to avoid byte cast precision issues. diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 8213f5f9dc..ce8351d869 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2623,7 +2623,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api using (SHA256 sha256Hash = SHA256.Create()) { // ComputeHash - returns byte array - byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); + Span bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input)).AsSpan(); return Util.bytesToHexString(bytes, true); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index d0514faf3b..70324cae8e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -274,6 +274,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llMapDestination(string simname, LSL_Vector pos, LSL_Vector look_at); LSL_String llMD5String(string src, int nonce); LSL_String llSHA1String(string src); + LSL_String llSHA256String(LSL_String src); void llMessageLinked(int linknum, int num, string str, string id); void llMinEventDelay(double delay); void llModifyLand(int action, int brush); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 66dac051bd..3b650605b0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -1157,6 +1157,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llSHA1String(src); } + public LSL_String llSHA256String(LSL_String src) + { + return m_LSL_Functions.llSHA256String(src); + } + public void llMessageLinked(int linknum, int num, string str, string id) { m_LSL_Functions.llMessageLinked(linknum, num, str, id);