Приветствую Вас, Гость
Главная » Статьи » Компьютеры и Интернет [ Добавить статью ]

Методы криптографической защиты информации Windows 2
Каждая из этих функций, как и большинство других функций CryptoAPI, возвращает логическое значение, равное true, в случае успешного завершения, и false — если возникли ошибки. Код ошибки может быть получен при помощи функции GetLastError. Возможные значения кодов ошибки приведены в упоминавшейся выше документации. Например, при вызове функции CryptGetProvParam для получения версии провайдера следует учесть возможность возникновения ошибок следующим образом: if not CryptGetProvParam(hProv, PP_VERSION, (@vers), @DataLen, 0) 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'; ERROR_NO_MORE_ITEMS: err := 'ERROR_NO_MORE_ITEMS'; NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS'; NTE_BAD_TYPE: err := 'NTE_BAD_TYPE'; NTE_BAD_UID: err := 'NTE_BAD_UID'; else err := 'Unknown error'; end; MessageDlg('Error of CryptGetProvParam: ' + err, mtError, [mbOK], 0); exit end; Текст процедуры, выводящей в Memo-поле FileMemo формы информацию об установленных в системе криптопровайдерах, приведен ниже. Предполагается, что процедура вызывается при выборе соответствующего элемента в главном меню формы. Для краткости в тексте программы опущены фрагменты, выполняющие обработку ошибок. type algInfo = record algID: ALG_ID; dwBits: DWORD; dwNameLen: DWORD; szName: array[0..100] of char; end; {вспомогательная функция, преобразующая тип провайдера в строку} function ProvTypeToStr(provType: DWORD): string; begin case provType of PROV_RSA_FULL: ProvTypeToStr := 'RSA full provider'; PROV_RSA_SIG: ProvTypeToStr := 'RSA signature provider'; PROV_DSS: ProvTypeToStr := 'DSS provider'; PROV_DSS_DH: ProvTypeToStr := 'DSS and Diffie-Hellman provider'; PROV_FORTEZZA: ProvTypeToStr := 'Fortezza provider'; PROV_MS_EX: ProvTypeToStr := 'MS Ex provider'; PROV_RSA_SCHANNEL: ProvTypeToStr := 'RSA secure channel provider'; PROV_SSL: ProvTypeToStr := 'SSL provider'; else ProvTypeToStr := 'Unknown provider'; end; end; {вспомогательная функция, преобразующая тип реализации в строку} function ImpTypeToStr(it: DWORD): string; begin case it of CRYPT_IMPL_HARDWARE: ImpTypeToStr := 'аппаратный'; CRYPT_IMPL_SOFTWARE: ImpTypeToStr := 'программный'; CRYPT_IMPL_MIXED: ImpTypeToStr := 'смешанный'; CRYPT_IMPL_UNKNOWN: ImpTypeToStr := 'неизвестен'; else ImpTypeToStr := 'неверное значение'; end; end; {процедура вывода информации о криптопровайдерах} procedure TMainForm.InfoItemClick(Sender: TObject); var i: DWORD; dwProvType, cbName, DataLen: DWORD; provName: array[0..200] of char; vers: array[0..3] of byte; impType: DWORD; ai: algInfo; err: string; begin i := 0; FileMemo.Clear; while (CryptEnumProviders(i, nil, 0, {проверяем наличие еще одного} @dwProvType, nil, @cbName)) do begin if CryptEnumProviders(i, nil, 0, {получаем имя CSP} @dwProvType, @provName, @cbName) then begin FileMemo.Lines.Add('Криптопровайдер: ' + provName); FileMemo.Lines.Add('Тип: ' + IntToStr(dwProvType) + ' - ' + ProvTypeToStr(dwProvType)); if not CryptAcquireContext(@hProv, nil, provName, dwProvType, CRYPT_VERIFYCONTEXT) then begin {обработка ошибок} end; DataLen := 4; if not CryptGetProvParam(hProv, PP_VERSION, (@vers), @DataLen, 0) then begin {обработка ошибок} end; FileMemo.Lines.Add('Версия: ' + chr(vers[1] + ) + '.' + chr(vers[0] + )); if not CryptGetProvParam(hProv, PP_IMPTYPE, @impType, @DataLen, 0) then begin {обработка ошибок} end; FileMemo.Lines.Add('Тип реализации: ' + ImpTypeToStr(impType)); FileMemo.Lines.Add('Поддерживает алгоритмы:'); DataLen := sizeof(ai); if not CryptGetProvParam(hProv, PP_ENUMALGS, @ai, @DataLen, CRYPT_FIRST) then begin {обработка ошибок} end; with ai do FileMemo.Lines.Add(szName + #9 + 'длина ключа - ' + IntToStr(dwBits) + ' бит' + #9 + 'ID: ' + IntToStr(AlgID)); DataLen := sizeof(ai); while CryptGetProvParam(hProv, PP_ENUMALGS, @ai, @DataLen, 0) do begin with ai do FileMemo.Lines.Add(szName + #9 + 'длина ключа - ' + IntToStr(dwBits) + ' бит' + #9 + 'ID: ' + IntToStr(AlgID)); DataLen := sizeof(ai); end; FileMemo.Lines.Add(''); CryptReleaseContext(hProv, 0); end; inc(i); end; end;

Источник: http://www.hackzone.ru
Категория: Компьютеры и Интернет | Добавил: vitalg (31.Янв.2011)
Просмотров: 243