Я кодирую оболочку для OpenSSL для C#, и на самом деле все работает для меня сейчас, но у меня проблема с одним методом. (Я знаю о OpenSSL.Net, он просто не работает, поскольку мне это нужно, и у него много методов).Использование SHA256 метода библиотеки OpenSSL в C#
OpenSSL 1.0.1 имеет SHA256, который я бы хотел использовать. Метод сам по себе в OpenSSL коде Lib C:
unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md)
{
SHA256_CTX c;
static unsigned char m[SHA256_DIGEST_LENGTH];
if (md == NULL)
md = m;
SHA256_Init(&c);
SHA256_Update(&c, d, n);
SHA256_Final(md, &c);
OPENSSL_cleanse(&c, sizeof(c));
return (md);
}
сама функция возвращает указатель, а в качестве параметров он должен входных данные, длину данных для хэша, и объект для хэша.
Я окружив его следующим способом:
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr SHA256(byte[] data, long len, ref byte[] result);
Я пытаюсь запустить его в следующий путь:
byte[] d = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaa");
byte[] r = new byte[32];
IntPtr x = NOpenSSL.Wrapper.SHA256(d, d.Length, ref r);
Console.WriteLine(d.Length + " " + x + " " + r.Length + " " + Encoding.ASCII.GetString(r));
И что я получаю за результат: 16 1838788744 1
. d.Length
16 OK, я получаю x как указатель OK, r.Length
становится 1 байтом, что невозможно.
Если у меня нет ref
byte[]
в методе просто просто дайте ему ничего не меняется в переменной r
.
Может ли кто-нибудь помочь мне, пожалуйста, что я делаю неправильно?
Благодарим за помощь заранее!
.NET Core 5 обертывает OpenSSL для платформ, отличных от Windows, и до сих пор является самой полной оболочкой, которую я могу придумать с помощью полномасштабных тестовых примеров. –