Статус: Участник
Группы: Участники
Зарегистрирован: 03.03.2015(UTC) Сообщений: 14  Сказал(а) «Спасибо»: 6 раз
|
Ну и вот вопрос. Пытаюсь сделать подпись к файлу. Код использую из статьи http://citforum.oldbank....fense/defense/list6.htm.Если используется стандандартный криптопровайдер RSA_FULL,то все нормально проходит. Если же используем криптопровайдер Криптопро CSP, то валится ошибка MessageDlg('Ошибка при определении размера подписи: ' + err, mtError, [mbOK], 0);- BAD algid Код:
procedure TSigningForm.SignBtnClick(Sender: TObject);
var cont: PChar;
err: string;
hProv: HCRYPTPROV;
key: HCRYPTKEY;
alg: ALG_ID;
hash: HCRYPTHASH;
infile, outfile: file;
size: DWORD;
buf: array [0..511] of byte;
signature: PBYTE;
begin
if not FileExists(DataNameEdit.Text) then
begin
MessageDlg('Неверное имя файла!', mtError, [mbOK], 0);
exit;
end;
AssignFile(infile, DataNameEdit.Text);
if length(ContainerEdit.Text) = 0
then
begin
cont := nil;
err := 'по умолчанию';
end
else
begin
err := ContainerEdit.Text;
cont := StrAlloc(length(err) + 1);
StrPCopy(cont, err);
end;
if not CryptAcquireContext(hProv, cont, 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider', 75, 0)
then
begin
case int64(GetLastError) of
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_NOT_ENOUGH_MEMORY: err := 'ERROR_NOT_ENOUGH_MEMORY';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_KEYSET: err := 'NTE_BAD_KEYSET';
NTE_BAD_KEYSET_PARAM: err := 'NTE_BAD_KEYSET_PARAM';
NTE_BAD_PROV_TYPE: err := 'NTE_BAD_PROV_TYPE';
NTE_BAD_SIGNATURE: err := 'NTE_BAD_SIGNATURE';
NTE_EXISTS: err := 'NTE_EXISTS';
NTE_KEYSET_ENTRY_BAD: err := 'NTE_KEYSET_ENTRY_BAD';
NTE_KEYSET_NOT_DEF: err := 'NTE_KEYSET_NOT_DEF';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
NTE_PROV_DLL_NOT_FOUND: err := 'NTE_PROV_DLL_NOT_FOUND';
NTE_PROV_TYPE_ENTRY_BAD: err := 'NTE_PROV_TYPE_ENTRY_BAD';
NTE_PROV_TYPE_NO_MATCH: err := 'NTE_PROV_TYPE_NO_MATCH';
NTE_PROV_TYPE_NOT_DEF: err := 'NTE_PROV_TYPE_NOT_DEF';
NTE_PROVIDER_DLL_FAIL: err := 'NTE_PROVIDER_DLL_FAIL';
NTE_SIGNATURE_FILE_BAD: err := 'NTE_SIGNATURE_FILE_BAD';
else err := 'Unknown error';
end;
MessageDlg('Ошибка открытия контейнера: ' + err, mtError, [mbOK], 0);
exit;
end;
case HashRadioGroup.ItemIndex of
0: alg := CALG_MD5;
1: alg := CALG_SHA;
end;
if not CryptCreateHash(hProv, alg, 0, 0, hash) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_NOT_ENOUGH_MEMORY: err := 'ERROR_NOT_ENOUGH_MEMORY';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_KEY: err := 'NTE_BAD_KEY';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Ошибка создания хеш-объекта: ' + err, mtError, [mbOK], 0);
exit;
end;
SaveDialog1.Title := 'Задайте имя файла для хранения подписанных данных';
if SaveDialog1.Execute then
begin
AssignFile(outfile, SaveDialog1.FileName);
rewrite(outfile, 1);
BlockWrite(outfile, alg, 4);
reset(infile, 1);
size := FileSize(infile);
BlockWrite(outfile, size, 4);
while not eof(infile) do
begin
BlockRead(infile, buf, 512, size);
BlockWrite(outFile, buf, size);
if not CryptHashData(hash, @buf, size, 0) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_HASH_STATE: err := 'NTE_BAD_HASH_STATE';
NTE_BAD_KEY: err := 'NTE_BAD_KEY';
NTE_BAD_LEN: err := 'NTE_BAD_LEN';
NTE_BAD_UID: err := 'NTE_BAD_UID';
NTE_FAIL: err := 'NTE_FAIL';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Ошибка при хешировании: ' + err, mtError, [mbOK], 0);
break;
end;
end;
CloseFile(infile);
if not CryptSignHash(hash, AT_KEYEXCHANGE, nil, 0, nil, size) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_MORE_DATA: err := 'ERROR_MORE_DATA';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_UID: err := 'NTE_BAD_UID';
NTE_NO_KEY: err := 'NTE_NO_KEY';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Ошибка при определении размера подписи: ' + err, mtError, [mbOK], 0);
CloseFile(outfile);
exit;
end;
GetMem(signature, size);
if not CryptSignHash(hash, AT_KEYEXCHANGE, nil, 0, signature, size) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_MORE_DATA: err := 'ERROR_MORE_DATA';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_UID: err := 'NTE_BAD_UID';
NTE_NO_KEY: err := 'NTE_NO_KEY';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Ошибка при подписании хеша: ' + err, mtError, [mbOK], 0);
CloseFile(outfile);
exit;
end;
BlockWrite(outfile, size, 4);
BlockWrite(outfile, signature^, size);
CloseFile(outfile);
end;
if not CryptDestroyHash(hash) then
begin
case int64(GetLastError) of
ERROR_BUSY: err := 'ERROR_BUSY';
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_UID: err := 'NTE_BAD_UID';
else err := 'Unknown error';
end;
MessageDlg('Ошибка при уничтожения хеша: ' + err, mtError, [mbOK], 0);
end;
if not CryptReleaseContext(hProv, 0) then
begin
case int64(GetLastError) of
ERROR_BUSY: err := 'ERROR_BUSY';
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_UID: err := 'NTE_BAD_UID';
else err := 'Unknown error';
end;
MessageDlg('Не удалось освободить контекст: ' + err,
mtError, [mbOK], 0);
end;
end;
ошибка при выполнении вот этого участка - Код: if not CryptSignHash(hash, AT_KEYEXCHANGE, nil, 0, nil, size) then
Пробовал и AT_KEYSignature -ошибка таже. В чем может быть проблема?
|