Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2009(UTC) Сообщений: 12 Откуда: кемерово
|
Помогите пожалуйста Я пока новичок, поэтому если можно то по подробнее... Как получить список OIDов улучшенного ключа сертификата??? Дошел до следующего: Код:
var
s:string;
f: file;
encCert: PByte;
encCertLen: DWORD;
context: PCCertContext;
size: PDWORD;
usage: PCertEnhKeyUsage;
begin
AssignFile(f, 'temp.cer');
reset(f, 1);
encCertLen := FileSize(f);
GetMem(encCert, encCertLen);
BlockRead(f, encCert^, encCertLen);
CloseFile(f);
context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
if context <> nil then
begin
CertGetEnhancedKeyUsage(context, 0, usage, size);
end;
CertFreeCertificateContext(context);
FreeMem(encCert, encCertLen);
Как вытащить данные(список OID) из "usage"? желательно в строковую переменную.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
CERT_ENHKEY_USAGE - это структура, содержащая массив OID в виде строк rgpszUsageIdentifier размером cUsageIdentifier. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2009(UTC) Сообщений: 12 Откуда: кемерово
|
Я это понимаю. Не могу с указателями и с размерностью разобраться... На C попроще как-то, но вот delphi... а нужен код на нем...
вообщем в теории я понимаю что вначале нужно выделить место под usage затем CertGetEnhancedKeyUsage(context, 0, usage, size); а уже после доставать данные из usage но у меня даже не получается обратиться к rgpszUsageIdentifier как к массиву может я не правильно объявляю переменные? мастера delphi помогите... на C примеров куча, а на delphi ни одного...
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.11.2009(UTC) Сообщений: 7
|
Смотрим описание структуры в мсдне typedef struct _CTL_USAGE { DWORD cUsageIdentifier; LPSTR *rgpszUsageIdentifier; }CTL_USAGE, *PCTL_USAGE, CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE;
Второй параметр указатель на массив укзателей char* или в дельфи PChar Если не хочется заморачиваться с указателями можно написать так
type PCharArr = ^TCharArr; TCharArr = array[0..0] of PChar;
парметр LPSTR *rgpszUsageIdentifier в дельфи есть типа PCharArr, только, чтобы хорошо работало, надо убрать при сборке флаг на проверку выхода за границы
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2009(UTC) Сообщений: 12 Откуда: кемерово
|
Большое спасибо за ответ, но у меня так и не получается... Думаю уже близок, дошел до нижеследующего. Уверен, что написал чёпопало, но может Вам так легче объяснить мне будет Код:
procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
f: file;
encCert: PByte;
encCertLen: DWORD;
context: PCCertContext;
size: PDWORD;
usage: PCertEnhKeyUsage;
begin
AssignFile(f, 'temp.cer');
reset(f, 1);
encCertLen := FileSize(f);
GetMem(encCert, encCertLen);
BlockRead(f, encCert^, encCertLen);
CloseFile(f);
context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
if context <> nil then
begin
try
CertGetEnhancedKeyUsage(context, 0, usage, size);
showmessage(PCharArr(usage.rgpszUsageIdentifier)[0]);
finally
FreeMem(usage);
end;
end;
CertFreeCertificateContext(context);
FreeMem(encCert, encCertLen);
end;
вываливается в ошибку...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Правильно. CertGetEnhancedKeyUsage надо вызвать 2 раза - сначала для определения размера структуры, которая будет возвращена, затем уже собственно для получения самой структуры.
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2009(UTC) Сообщений: 12 Откуда: кемерово
|
Честное слово пытался так сделать, вот так: Код:
procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
f: file;
encCert: PByte;
encCertLen: DWORD;
context: PCCertContext;
size: PDWORD;
usage: PCertEnhKeyUsage;
begin
AssignFile(f, 'temp.cer');
reset(f, 1);
encCertLen := FileSize(f);
GetMem(encCert, encCertLen);
BlockRead(f, encCert^, encCertLen);
CloseFile(f);
context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
if context <> nil then
begin
try
CertGetEnhancedKeyUsage(context, 0, nil, size);
GetMem(usage,DWORD(size));
CertGetEnhancedKeyUsage(context, 0, usage, size);
showmessage(PCharArr(usage.rgpszUsageIdentifier)[0]);
finally
FreeMem(usage);
end;
end;
CertFreeCertificateContext(context);
FreeMem(encCert, encCertLen);
end;
и всё равно валится в ошибку... Может кто-нибудь сжалиться и выложит рабочий код... сил уже нет...по моему всё перепробовал...
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2008(UTC) Сообщений: 15
|
Странно, почему Вы не проверяете usage.cUsageIdentifier перед обращением к usage.rgpszUsageIdentifier. Может там и нет элементов вовсе. "If the cUsageIdentifier member is zero, the certificate might be valid for all uses or the certificate might have no valid uses. The return from a call to GetLastError can be used to determine whether the certificate is good for all uses or for none. If GetLastError returns CRYPT_E_NOT_FOUND, the certificate is good for all uses. If it returns zero, the certificate has no valid uses." Отредактировано пользователем 7 декабря 2009 г. 12:12:56(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2009(UTC) Сообщений: 12 Откуда: кемерово
|
Огромное всем спасибо!!! получилось!!! надо было изначально адрес переменной size брать (@size) Код:
procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
i: Integer;
f: file;
encCert: PByte;
encCertLen: DWORD;
context: PCCertContext;
size: PDWORD;
usage: PCertEnhKeyUsage;
begin
AssignFile(f, 'temp.cer');
reset(f, 1);
encCertLen := FileSize(f);
GetMem(encCert, encCertLen);
BlockRead(f, encCert^, encCertLen);
CloseFile(f);
context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
if context <> nil then
begin
try
CertGetEnhancedKeyUsage(context, 0, nil, @size);
GetMem(usage,DWORD(size));
CertGetEnhancedKeyUsage(context, 0, usage, @size);
for i:=0 to usage.cUsageIdentifier-1 do
begin
showmessage(PCharArr(usage.rgpszUsageIdentifier)[i]);
end;
finally
FreeMem(usage);
end;
end;
CertFreeCertificateContext(context);
FreeMem(encCert, encCertLen);
end;
Отредактировано пользователем 8 декабря 2009 г. 21:00:02(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close