2015-10-07 3 views
2

Я кодирую оболочку для 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 байтом, что невозможно.

Если у меня нет refbyte[] в методе просто просто дайте ему ничего не меняется в переменной r.

Может ли кто-нибудь помочь мне, пожалуйста, что я делаю неправильно?

Благодарим за помощь заранее!

+0

.NET Core 5 обертывает OpenSSL для платформ, отличных от Windows, и до сих пор является самой полной оболочкой, которую я могу придумать с помощью полномасштабных тестовых примеров. –

ответ

0

После некоторого открытия источника OpenSSL C и экспериментов с указателями C# и маршалингом оказалось, что метод SHA256 не помещает хеш результата в переменную md, но возвращает указатель на хэш. (Сначала я думал, что это указатель на SHA256-структуры, но это фактическая хэш.)

Рабочая C# код выглядит следующим образом:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
public extern static IntPtr SHA256(byte[] data, long len, byte[] result); 

-

byte[] data = Encoding.ASCII.GetBytes("some_data_to_hash"); 

IntPtr r = NOpenSSL.Wrapper.SHA256(data, data.Length, null); 
byte[] output = new byte[32]; 
Marshal.Copy(r, output, 0, output.Length); 

// output contains now the 32 bytes of the hashed data 

Поскольку мы не используют третью переменную метода SHA256 (вместо этого мы просто переходим null) ref необходимо удалить с DllImport.

(Примечание: https://www.openssl.org/docs/manmaster/crypto/sha.html говорит: Если мД является NULL, то дайджест помещаются в статическом массиве. Примечание:. Установка мкра на NULL не поточно)

Использование SHA512 точно такие же только мы необходимо заменить имя метода в обоих местах в коде и изменить байт output [] length от 32 до 64.

Смежные вопросы