Ошибка импорта открытого ключа RSA с помощью BCryptImportKeyPair
Я пытаюсь использовать Microsoft CNG для проверки подписи в Delphi 2007. Я застрял при импорте открытого ключа с помощью BCryptImportKeyPair.
Я всегда получаю ошибку STATUS_INVALID_PARAMETER.
Код выглядит так:
var
i: Smallint;
LResult: NTSTATUS;
LRSA: BCRYPT_ALG_HANDLE;
LKey: BCRYPT_KEY_HANDLE;
LRsaKeyBlob: ^BCRYPT_RSAKEY_BLOB;
LKeyInput: Pointer;
LKeyCurrent: PByte;
LKeySize: DWORD;
begin
LRSA := 0;
LKey := 0;
LKeySize := SizeOf(BCRYPT_RSAKEY_BLOB) + 259; // 3 Bytes Exponent + 256 Bytes Modulus
LKeyInput := GetMemory(LKeySize);
try
ZeroMemory(LKeyInput, LKeySize);
LRsaKeyBlob := LKeyInput;
LRsaKeyBlob.Magic := BCRYPT_RSAPUBLIC_MAGIC;
LRsaKeyBlob.BitLength := 2048;
LRsaKeyBlob.cbPublicExp := 3;
LRsaKeyBlob.cbModulus := 256;
LRsaKeyBlob.cbPrime1 := 0;
LRsaKeyBlob.cbPrime2 := 15;
LKeyCurrent := PByte(LKeyInput);
Inc(LKeyCurrent, SizeOf(BCRYPT_RSAKEY_BLOB));
for i := 0 to 2 do
begin
LKeyCurrent^ := CExponent[i];
Inc(LKeyCurrent);
end;
for i := 0 to 255 do
begin
LKeyCurrent^ := CModulus[i];
Inc(LKeyCurrent);
end;
LResult := BCryptOpenAlgorithmProvider(LRSA, BCRYPT_RSA_ALGORITHM, nil, 0);
if not BCRYPT_SUCCESS(LResult) then Exit;
LResult := BCryptImportKeyPair(LRSA, nil, BCRYPT_RSAPUBLIC_BLOB, LKey, PUCHAR(LKeyInput), LKeySize, 0);
if not BCRYPT_SUCCESS(LResult) then Exit;
ShowMessage('Yeah!');
finally
FreeMem(LKeyInput);
end;
end;
Я сгенерировал пару Public/Private-Key в другом приложении (node.js-Backend).
Проблема, я думаю, в том, что модуль может быть неправильным. Я сохранил открытый ключ как PEM-файл и преобразовал его в XML. (Для этого использовал онлайн-сервис) Этот XML-файл прекрасно работает с C#-Test-Application. Затем я преобразовал Base64 Modulus- и Exponent-Strings в HEX-значения и добавил их в качестве констант в мое Delphi-App.