Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline ikozlov  
#1 Оставлено : 29 июня 2012 г. 15:49:33(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Добрый день!
Хочу подписать документ из C# используя алгоритм GOST3411. Возможности КриптоПро .NET использовать нет.

Код:
[DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CertOpenStore(
    IntPtr lpszStoreProvider,
    Int32 dwMsgAndCertEncodingType,
    IntPtr hCryptProv,
    Int32 dwFlags,
    String pvPara
);

[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_HASH_BLOB
{
	public Byte[] pbData;
	public Int32 cbData;
}
 
[DllImport("crypt32.dll", SetLastError = true)]
static extern IntPtr CertFindCertificateInStore(
    IntPtr hCertStore,
    uint dwCertEncodingType, 
    uint dwFindFlags, 
    uint dwFindType,
    ref CRYPT_HASH_BLOB chb,
    IntPtr pPrevCertCntxt
);
 
Int32 CERT_STORE_PROV_SYSTEM = 10;
Int32 CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16);
IntPtr hStoreHandle = CertOpenStore((IntPtr)CERT_STORE_PROV_SYSTEM, 0, IntPtr.Zero, CERT_SYSTEM_STORE_CURRENT_USER, "My");
 
if (hStoreHandle != IntPtr.Zero) {
    uint PKCS_7_ASN_ENCODING = 0x00010000;
    uint X509_ASN_ENCODING = 0x00000001;
    uint MY_ENCODING_TYPE = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
    CRYPT_HASH_BLOB chb = new CRYPT_HASH_BLOB();
    chb.pbData = certHash;
    chb.cbData = certHash.Length;
    pCertContext = CertFindCertificateInStore(hStoreHandle, MY_ENCODING_TYPE, 0, 65536, ref chb, IntPtr.Zero);
}


pCertContext - возвращает постоянно "0". Тот же код, но из под C++ работает отлично. Заранее спасибо!
Offline Андрей Писарев  
#2 Оставлено : 29 июня 2012 г. 16:00:56(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
65536 = ?


CERT_FIND_HASH = 0x00010000;

Отредактировано пользователем 29 июня 2012 г. 16:04:08(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#3 Оставлено : 29 июня 2012 г. 16:03:04(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
65536 = ?


std::cout << CERT_FIND_HASH << std::endl;
CERT_FIND_HASH в C++ возвращает 65536;

В C++ вызов данной функции выглядит вот так
Код:
	CRYPT_HASH_BLOB chb;
	chb.pbData = hashData;
	chb.cbData = hashDataLength;

    pContext = CertFindCertificateInStore(hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_HASH, &chb, NULL);
Offline ikozlov  
#4 Оставлено : 29 июня 2012 г. 16:09:31(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
65536 = ?

CERT_FIND_HASH = 0x00010000;


Код:
const uint CERT_FIND_HASH = 0x00010000;
pCertContext = CertFindCertificateInStore(hStoreHandle, MY_ENCODING_TYPE, 0, CERT_FIND_HASH, ref chb, pCtx);


pCertContext вернул "0". Может дело в струтуре?

Код:
                CRYPT_HASH_BLOB chb = new CRYPT_HASH_BLOB();
                chb.pbData = certHash;
                chb.cbData = certHash.Length;
Offline Андрей Писарев  
#5 Оставлено : 29 июня 2012 г. 16:14:57(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
byte[] certHash - ?
и правильно заполняется?


certHash.Length = ... ?

Отредактировано пользователем 29 июня 2012 г. 16:22:11(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#6 Оставлено : 29 июня 2012 г. 16:27:50(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
byte[] certHash - ?
и правильно заполняется?


certHash.Length = ... ?


X509Certificate2 cert = ...;
byte[] certHash = cert.GetCertHash();

chb.cbData: 20
chb.pbData: ?*?Ѕ??%?U?8??{?
Offline Андрей Писарев  
#7 Оставлено : 29 июня 2012 г. 16:36:26(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
...................................

[DllImport("cryptui.dll", SetLastError = true)]
public static extern bool CryptUIDlgViewCertificate(
ref PCCRYPTUI_VIEWCERTIFICATE_STRUCT pCertViewInfo,
ref bool pfPropertiesChanged);


[StructLayout(LayoutKind.Sequential)]
public struct PCCRYPTUI_VIEWCERTIFICATE_STRUCT
{
public uint dwSize; //required
public IntPtr hwndParent;
public uint dwFlags;
public String szTitle;
public IntPtr pCertContext; //required
public IntPtr rgszPurposes;
uint cPurposes;
IntPtr hWVTStateData;
bool fpCryptProviderDataTrustedUsage;
uint idxSigner;
uint idxCert;
bool fCounterSigner;
uint idxCounterSigner;
uint cStores;
IntPtr rghStores;
uint cPropSheetPages;
IntPtr rgPropSheetPages;
public uint nStartPage; //required
}

....................................................................................



IntPtr pCertContext =
CertFindCertificateInStore(hStoreHandle, MY_ENCODING_TYPE, 0, FIND_HASH , ref chb, IntPtr.Zero);

if (pCertContext != IntPtr.Zero)
{
PCCRYPTUI_VIEWCERTIFICATE_STRUCT vcstruct = new PCCRYPTUI_VIEWCERTIFICATE_STRUCT();
vcstruct.dwSize = (uint)Marshal.SizeOf(vcstruct);
vcstruct.pCertContext = pCertContext;
vcstruct.szTitle = "Мой сертификат";
vcstruct.nStartPage = 0;
bool propschanged = false;
Form1.CryptUIDlgViewCertificate(ref vcstruct, ref propschanged); //show the cert

}
.....

Отредактировано пользователем 29 июня 2012 г. 16:58:21(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#8 Оставлено : 29 июня 2012 г. 17:03:33(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

проблема как раз в том что в IF я не могу попасть из за того что сертификат не находится и pCertContext = IntPtr.Zero.

При этом, как я писал выше - я написал то же самое на C++ и передаю абсолютно тот же байт массив в DLL которую написал - там сертификат находится.
Offline Андрей Писарев  
#9 Оставлено : 29 июня 2012 г. 17:13:02(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_HASH_BLOB
{
public int cbData;
public IntPtr pbData;
}

CRYPT_HASH_BLOB hashb = new CRYPT_HASH_BLOB();
hashb.pbData = Marshal.AllocHGlobal(sha1hash.Length);
Marshal.Copy(sha1hash, 0, hashb.pbData, sha1hash.Length);
hashb.cbData = sha1hash.Length;

Отредактировано пользователем 29 июня 2012 г. 17:13:54(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#10 Оставлено : 29 июня 2012 г. 17:21:58(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
[DllImport("crypt32.dll", SetLastError = true)]
public static extern IntPtr CertFindCertificateInStore(
IntPtr pCertStore,
uint dwCertEncodingType,
uint dwFindFlags,
uint dwFindType,
ref CRYPT_HASH_BLOB phash,
IntPtr pPrevCertCntxt);

[DllImport("crypt32.dll", SetLastError = true)]
public static extern IntPtr CertFindCertificateInStore(
IntPtr hCertStore,
uint dwCertEncodingType,
uint dwFindFlags,
uint dwFindType,
IntPtr pvFindPara,
IntPtr pPrevCertCntxt);


....

[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_HASH_BLOB
{
public int cbData;
public IntPtr pbData;
}


....


byte[] sha1hash = cert.GetCertHash();

CRYPT_HASH_BLOB hashb = new CRYPT_HASH_BLOB();
hashb.pbData = Marshal.AllocHGlobal(sha1hash.Length);
Marshal.Copy(sha1hash, 0, hashb.pbData, sha1hash.Length);
hashb.cbData = sha1hash.Length;


const uint CERT_FIND_HASH = 0x00010000;

IntPtr pCertContext = CertFindCertificateInStore(
hStoreHandle,
MY_ENCODING_TYPE,
0,
CERT_FIND_HASH,
ref hashb,
IntPtr.Zero);





if (pCertContext != IntPtr.Zero)
{
PCCRYPTUI_VIEWCERTIFICATE_STRUCT vcstruct = new PCCRYPTUI_VIEWCERTIFICATE_STRUCT();
vcstruct.dwSize = (uint)Marshal.SizeOf(vcstruct);
vcstruct.pCertContext = pCertContext;
vcstruct.szTitle = "Мой сертификат";
vcstruct.nStartPage = 0;
bool propschanged = false;
Form1.CryptUIDlgViewCertificate(ref vcstruct, ref propschanged);

}


Anxious




Отредактировано пользователем 29 июня 2012 г. 17:27:48(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.