add
This commit is contained in:
73
Assets/XLua/Src/SignatureLoader.cs
Executable file
73
Assets/XLua/Src/SignatureLoader.cs
Executable file
@@ -0,0 +1,73 @@
|
||||
#if !UNITY_WSA || UNITY_EDITOR
|
||||
using System.Security.Cryptography;
|
||||
#else
|
||||
using Windows.Security.Cryptography;
|
||||
using Windows.Security.Cryptography.Core;
|
||||
#endif
|
||||
using System;
|
||||
|
||||
namespace XLua
|
||||
{
|
||||
public class SignatureLoader
|
||||
{
|
||||
private LuaEnv.CustomLoader userLoader;
|
||||
#if !UNITY_WSA || UNITY_EDITOR
|
||||
RSACryptoServiceProvider rsa;
|
||||
SHA1 sha;
|
||||
#else
|
||||
AsymmetricKeyAlgorithmProvider rsa;
|
||||
CryptographicKey key;
|
||||
#endif
|
||||
|
||||
public SignatureLoader(string publicKey, LuaEnv.CustomLoader loader)
|
||||
{
|
||||
#if !UNITY_WSA || UNITY_EDITOR
|
||||
rsa = new RSACryptoServiceProvider();
|
||||
rsa.ImportCspBlob(Convert.FromBase64String(publicKey));
|
||||
sha = new SHA1CryptoServiceProvider();
|
||||
#else
|
||||
rsa = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha1);
|
||||
key = rsa.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKey), CryptographicPublicKeyBlobType.Capi1PublicKey);
|
||||
#endif
|
||||
userLoader = loader;
|
||||
}
|
||||
|
||||
|
||||
byte[] load_and_verify(ref string filepath)
|
||||
{
|
||||
byte[] data = userLoader(ref filepath);
|
||||
if (data == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (data.Length < 128)
|
||||
{
|
||||
throw new InvalidProgramException(filepath + " length less than 128!");
|
||||
}
|
||||
|
||||
byte[] sig = new byte[128];
|
||||
byte[] filecontent = new byte[data.Length - 128];
|
||||
Array.Copy(data, sig, 128);
|
||||
Array.Copy(data, 128, filecontent, 0, filecontent.Length);
|
||||
|
||||
#if !UNITY_WSA || UNITY_EDITOR
|
||||
if (!rsa.VerifyData(filecontent, sha, sig))
|
||||
{
|
||||
throw new InvalidProgramException(filepath + " has invalid signature!");
|
||||
}
|
||||
#else
|
||||
if (!CryptographicEngine.VerifySignature(key, CryptographicBuffer.CreateFromByteArray(filecontent), CryptographicBuffer.CreateFromByteArray(sig)))
|
||||
{
|
||||
throw new InvalidProgramException(filepath + " has invalid signature!");
|
||||
}
|
||||
#endif
|
||||
return filecontent;
|
||||
}
|
||||
|
||||
|
||||
public static implicit operator LuaEnv.CustomLoader(SignatureLoader signatureLoader)
|
||||
{
|
||||
return signatureLoader.load_and_verify;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user