Всем привет!
Пытаюсь зашифровать данные функцией CNG-API BCryptEncrypt() из библиотеки bcrypt.dll. Алгоритм шифрования нужен AES-256 в режиме GCM (счётчик Галуа). Вроде всё делаю согласно докам MSDN, но на этапе непосредственно вызова функции получаю ошибку "INVALID_PARAMETER = C000000d".
Как известно, AES-256/GCM это шифрование с аутентификацией, поэтому нужна структура "BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO" - видимо у меня проблемы с её оформлением. В то-же время обычное шифрование без Auth (например DES), функции хеширования данных и прочие работают нормально.
Перепробовал уже все варианты с этой структурой, но постоянно получаю одну и ту-же ошибку. Может кто-нибудь сталкивался в своей практике с реализацией AES-256/GCM на чистом API и знает, как можно справиться с ним? Заранее благодарю за любые советы. Вот ключевой фрагмент моего кода на ассме:
Пытаюсь зашифровать данные функцией CNG-API BCryptEncrypt() из библиотеки bcrypt.dll. Алгоритм шифрования нужен AES-256 в режиме GCM (счётчик Галуа). Вроде всё делаю согласно докам MSDN, но на этапе непосредственно вызова функции получаю ошибку "INVALID_PARAMETER = C000000d".
Как известно, AES-256/GCM это шифрование с аутентификацией, поэтому нужна структура "BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO" - видимо у меня проблемы с её оформлением. В то-же время обычное шифрование без Auth (например DES), функции хеширования данных и прочие работают нормально.
Перепробовал уже все варианты с этой структурой, но постоянно получаю одну и ту-же ошибку. Может кто-нибудь сталкивался в своей практике с реализацией AES-256/GCM на чистом API и знает, как можно справиться с ним? Заранее благодарю за любые советы. Вот ключевой фрагмент моего кода на ассме:
01 | ; //------ секция данных |
02 | .data |
03 | pcbResult dd 0 |
04 | ivRandom rb 12 ; // буфер под вектор инициализации (IV) |
05 | keyRandom rb 32 ; // буфер под ключ AES-256/GCM |
06 | tagBuff rb 16 ; // сюда вернётся тег-аутентификации (МАС) |
07 | |
08 | authData db 'Prodigy12345' ,0 ; // 12-байт данные аутентификации |
09 | |
10 | align 16 |
11 | authInfo BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO ; // структура заполнения |
12 | |
13 | buff db 0 ; // буфер под данные для шифрования |
14 | |
15 | ; //------ секция кода |
16 | .code |
17 | start: |
18 | |
19 | ; // здесь получаем дескриптор поставщика AES-256/GCM, |
20 | ; // и дальше сбрасываем в буферы рандомные IV и ключ: |
21 | |
22 | invoke BCryptGenRandom,0,ivRandom,12,BCRYPT_USE_SYSTEM_PREFERRED_RNG |
23 | invoke BCryptGenRandom,0,keyRandom,32,BCRYPT_USE_SYSTEM_PREFERRED_RNG |
24 | |
25 | ; // получить в переменную "aesKeyHndl" дескриптор симметричного ключа шифрования AES: |
26 | |
27 | invoke BCryptGenerateSymmetricKey,[aesAlgHndl],aesKeyHndl,0,0,keyRandom,32,0 |
28 | |
29 | ; // заполняем структуру "BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO": |
30 | |
31 | mov [authInfo.pbNonce],ivRandom |
32 | mov [authInfo.cbNonce],12 |
33 | mov [authInfo.pbAuthData],authData |
34 | mov [authInfo.cbAuthData],12 |
35 | mov [authInfo.pbTag],tagBuff |
36 | mov [authInfo.cbTag],16 |
37 | |
38 | ; // первый вызов, чтобы получить размер шифруемых данных: |
39 | |
40 | invoke BCryptEncrypt,[aesKeyHndl],buff,[passLen],authInfo,0,0,\ |
41 | 0,0,pcbResult,0 |
42 | |
43 | ; // второй вызов - попытка зашифровать данные: |
44 | |
45 | invoke BCryptEncrypt,[aesKeyHndl],buff,[passLen],authInfo,0,0,\ |
46 | buff,[pcbResult],pcbResult,0 |
47 | |
48 | ; // здесь получаю ошибку "STATUS_INVALID_PARAMETER = C000000d" |