mirror of
https://github.com/bolucat/Archive.git
synced 2025-10-05 16:18:04 +08:00
113 lines
4.4 KiB
C#
Executable File
113 lines
4.4 KiB
C#
Executable File
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using NLog;
|
|
using Shadowsocks.Controller;
|
|
using Shadowsocks.Properties;
|
|
using Shadowsocks.Util;
|
|
|
|
namespace Shadowsocks.Encryption
|
|
{
|
|
public static class Sodium
|
|
{
|
|
private static Logger logger = LogManager.GetCurrentClassLogger();
|
|
|
|
private const string DLLNAME = "libsscrypto.dll";
|
|
|
|
private static bool _initialized = false;
|
|
private static readonly object _initLock = new object();
|
|
|
|
public static bool AES256GCMAvailable { get; private set; } = false;
|
|
|
|
static Sodium()
|
|
{
|
|
string dllPath = Utils.GetTempPath(DLLNAME);
|
|
try
|
|
{
|
|
FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll);
|
|
}
|
|
catch (IOException)
|
|
{
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
logger.LogUsefulException(e);
|
|
}
|
|
LoadLibrary(dllPath);
|
|
|
|
lock (_initLock)
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
if (sodium_init() == -1)
|
|
{
|
|
throw new System.Exception("Failed to initialize sodium");
|
|
}
|
|
else /* 1 means already initialized; 0 means success */
|
|
{
|
|
_initialized = true;
|
|
}
|
|
|
|
AES256GCMAvailable = crypto_aead_aes256gcm_is_available() == 1;
|
|
logger.Debug($"sodium: AES256GCMAvailable is {AES256GCMAvailable}");
|
|
}
|
|
}
|
|
}
|
|
|
|
[DllImport("Kernel32.dll")]
|
|
private static extern IntPtr LoadLibrary(string path);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
private static extern int sodium_init();
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
private static extern int crypto_aead_aes256gcm_is_available();
|
|
|
|
#region AEAD
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int sodium_increment(byte[] n, int nlen);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_chacha20poly1305_ietf_encrypt(byte[] c, ref ulong clen_p, byte[] m,
|
|
ulong mlen, byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_chacha20poly1305_ietf_decrypt(byte[] m, ref ulong mlen_p,
|
|
byte[] nsec, byte[] c, ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_xchacha20poly1305_ietf_encrypt(byte[] c, ref ulong clen_p, byte[] m, ulong mlen,
|
|
byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_xchacha20poly1305_ietf_decrypt(byte[] m, ref ulong mlen_p, byte[] nsec, byte[] c,
|
|
ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_aes256gcm_encrypt(byte[] c, ref ulong clen_p, byte[] m, ulong mlen,
|
|
byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_aead_aes256gcm_decrypt(byte[] m, ref ulong mlen_p, byte[] nsec, byte[] c,
|
|
ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k);
|
|
|
|
#endregion
|
|
|
|
#region Stream
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_stream_salsa20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic,
|
|
byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic,
|
|
byte[] k);
|
|
|
|
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int crypto_stream_chacha20_ietf_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, uint ic,
|
|
byte[] k);
|
|
|
|
#endregion
|
|
}
|
|
} |