Atom Лента - Форум КриптоПро - Тема:Проверка пина в SILENT режиме - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:ProverkapinavSILENTrezhime-10:1Copyright 2024 Форум КриптоПро2024-03-29T04:24:42Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.rufenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwfenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев Андрейfenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев Андрейfenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев Андрейfenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев Андрейfenwhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=33756&name=fenwYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid124521:1Проверка пина в SILENT режиме<table class="content postContainer_Alt" width="100%"><tr><td>Вы правы, спасибо, взлетело</td></tr></table>2021-04-28T13:35:35+03:002021-04-28T13:35:35+03:00fenw<table class="content postContainer_Alt" width="100%"><tr><td>Вы правы, спасибо, взлетело</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124513:1Проверка пина в SILENT режиме<table class="content postContainer" width="100%"><tr><td>Вы слишком увлекаетесь copy-paste-ом. CryptSetProvParam(PP_KEYEXCHANGE_PIN) принимает строку.</td></tr></table>2021-04-28T10:26:32+03:002021-04-28T10:26:32+03:00Русев Андрей<table class="content postContainer" width="100%"><tr><td>Вы слишком увлекаетесь copy-paste-ом. CryptSetProvParam(PP_KEYEXCHANGE_PIN) принимает строку.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124506:1Проверка пина в SILENT режиме<table class="content postContainer_Alt" width="100%"><tr><td>Сделал, добавил после pfx импорта<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
return nil;
}else {
NSLog(@"[%@] Found private key. %lu", NSStringFromSelector(_cmd),hCryptProv);
}
CRYPT_PIN_PARAM pinParam;
pinParam.type = CRYPT_PIN_PASSWD;
pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)&pinParam, NULL)) {
fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
CleanUp();
[self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON];
return nil;
}else{
fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
}
</code></pre>
</div></div><br />Ошибок нет<br /><br />При подписании делаю <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else {
NSLog(@"[%@] Found private key %lu", NSStringFromSelector(_cmd),hCryptProv);
}
CRYPT_PIN_PARAM pinParam;
pinParam.type = CRYPT_PIN_PASSWD;
pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
if(!CryptSetProvParam(hCryptProv,PP_KEYEXCHANGE_PIN,(BYTE *)&pinParam, NULL)) {
retValue = CSP_GetLastError();
fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else{
retValue = CSP_GetLastError();
fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
}
</code></pre>
</div></div><br />И получаю 0x8010006b <br />Не помогло :(<br />Может есть еще идеи?</td></tr></table>2021-04-27T18:25:50+03:002021-04-27T18:25:50+03:00fenw<table class="content postContainer_Alt" width="100%"><tr><td>Сделал, добавил после pfx импорта<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
return nil;
}else {
NSLog(@"[%@] Found private key. %lu", NSStringFromSelector(_cmd),hCryptProv);
}
CRYPT_PIN_PARAM pinParam;
pinParam.type = CRYPT_PIN_PASSWD;
pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)&pinParam, NULL)) {
fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
CleanUp();
[self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON];
return nil;
}else{
fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError());
}
</code></pre>
</div></div><br />Ошибок нет<br /><br />При подписании делаю <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else {
NSLog(@"[%@] Found private key %lu", NSStringFromSelector(_cmd),hCryptProv);
}
CRYPT_PIN_PARAM pinParam;
pinParam.type = CRYPT_PIN_PASSWD;
pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding];
if(!CryptSetProvParam(hCryptProv,PP_KEYEXCHANGE_PIN,(BYTE *)&pinParam, NULL)) {
retValue = CSP_GetLastError();
fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else{
retValue = CSP_GetLastError();
fprintf (stderr, " ############ Last error after pin 0x%08x \n",retValue);
}
</code></pre>
</div></div><br />И получаю 0x8010006b <br />Не помогло :(<br />Может есть еще идеи?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124498:1Проверка пина в SILENT режиме<table class="content postContainer" width="100%"><tr><td>Да, примерно так. П.1 надо делать прямо в hCertStore, который вернул PFXImportCertStore.</td></tr></table>2021-04-27T12:05:46+03:002021-04-27T12:05:46+03:00Русев Андрей<table class="content postContainer" width="100%"><tr><td>Да, примерно так. П.1 надо делать прямо в hCertStore, который вернул PFXImportCertStore.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124477:1Проверка пина в SILENT режиме<table class="content postContainer_Alt" width="100%"><tr><td>Если в <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT))) {
</code></pre>
</div></div><br />Передать неверный пароль, то импорт упадет с ошибокой<br />Не спорю и скорей всего контейнер остается без пароля после импорта, но не могу понять как мне его установить:<br />1) найти сертификат?<br />2) сделать CryptAcquireCertificatePrivateKey с передачей туда сертификата и hCryptProv на инициализацию<br />3) сделать if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)<br />Так?</td></tr></table>2021-04-26T15:09:29+03:002021-04-26T15:09:29+03:00fenw<table class="content postContainer_Alt" width="100%"><tr><td>Если в <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT))) {
</code></pre>
</div></div><br />Передать неверный пароль, то импорт упадет с ошибокой<br />Не спорю и скорей всего контейнер остается без пароля после импорта, но не могу понять как мне его установить:<br />1) найти сертификат?<br />2) сделать CryptAcquireCertificatePrivateKey с передачей туда сертификата и hCryptProv на инициализацию<br />3) сделать if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)<br />Так?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124465:1Проверка пина в SILENT режиме<table class="content postContainer" width="100%"><tr><td>Всё же я ставлю на то, что у вас ошибка в п.1 и вы не устанавливаете (задаёте/меняете) пароль на контейнер - пароль остаётся пустой. Надо использовать PP_CHANGE_PIN.</td></tr></table>2021-04-26T12:30:08+03:002021-04-26T12:30:08+03:00Русев Андрей<table class="content postContainer" width="100%"><tr><td>Всё же я ставлю на то, что у вас ошибка в п.1 и вы не устанавливаете (задаёте/меняете) пароль на контейнер - пароль остаётся пустой. Надо использовать PP_CHANGE_PIN.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124464:1Проверка пина в SILENT режиме<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте, не совсем все так:<br /><br />1) я хочу в silent режиме импортировать сертификат, это получается, пароль устанавливаю<br />2) далее я хочу при подписи проверить пин к сертификату, который вводит пользователь и использую CryptSetParam<br />3) в случае п.1 CryptSetParam всегда возвращает ошибку неверного пина<br />4) если в п 1 импортировать не в silent режиме, то п3 отработает как нужно<br /><br />Вопрос - как сделать 1 и 2 пункт, чтобы не было ошибки неверного пина</td></tr></table>2021-04-26T12:15:42+03:002021-04-26T12:15:42+03:00fenw<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте, не совсем все так:<br /><br />1) я хочу в silent режиме импортировать сертификат, это получается, пароль устанавливаю<br />2) далее я хочу при подписи проверить пин к сертификату, который вводит пользователь и использую CryptSetParam<br />3) в случае п.1 CryptSetParam всегда возвращает ошибку неверного пина<br />4) если в п 1 импортировать не в silent режиме, то п3 отработает как нужно<br /><br />Вопрос - как сделать 1 и 2 пункт, чтобы не было ошибки неверного пина</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124460:1Проверка пина в SILENT режиме<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br />Если я правильно вас понял, вы хотите импортировать без окон (silent), но при этом хотите иметь непустой пароль на импортированный контейнер. CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) для уже созданного контейнера не задаёт (меняет), а предъявляет пароль. Для смены пароля надо использовать PP_CHANGE_PIN:<br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/csp_trunk/html/group___pro_c_s_p_connection_1gde6124401071395347460fbd602e042a.html" title="http://cpdn.cryptopro.ru/content/csp_trunk/html/group___pro_c_s_p_connection_1gde6124401071395347460fbd602e042a.html">http://cpdn.cryptopro.ru...95347460fbd602e042a.html</a><br />Почему без silent на неверный пароль CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) не возвращает ошибку? В этом была особенность КриптоПро CSP 4.0 и более старых версий: они принимали во внимание переданный pin, но проверка его значения откладывалась до момента использования ключа (подписи, например), поэтому при самом предъявлении pin-а ошибка никогда не возвращалась (даже если он неверный). В КриптоПро CSP 5.0 мы стали проверять значение pin-а прямо на CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN), так что теперь при неверном pin-е здесь будет возвращаться ошибка.<br /><br />Обращу ваше внимание на то, что при PFXImportCertStore(CRYPT_SILENT) подавляется не только окно ввода пароля, но и окно выбора носителя, на который будет импортирован контейнер. Это, как правило, означает, что импорт будет на носитель REGISTRY на Windows и HDIMAGE на Unix.</td></tr></table>2021-04-26T11:25:06+03:002021-04-26T11:25:06+03:00Русев Андрей<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br />Если я правильно вас понял, вы хотите импортировать без окон (silent), но при этом хотите иметь непустой пароль на импортированный контейнер. CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) для уже созданного контейнера не задаёт (меняет), а предъявляет пароль. Для смены пароля надо использовать PP_CHANGE_PIN:<br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/csp_trunk/html/group___pro_c_s_p_connection_1gde6124401071395347460fbd602e042a.html" title="http://cpdn.cryptopro.ru/content/csp_trunk/html/group___pro_c_s_p_connection_1gde6124401071395347460fbd602e042a.html">http://cpdn.cryptopro.ru...95347460fbd602e042a.html</a><br />Почему без silent на неверный пароль CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN) не возвращает ошибку? В этом была особенность КриптоПро CSP 4.0 и более старых версий: они принимали во внимание переданный pin, но проверка его значения откладывалась до момента использования ключа (подписи, например), поэтому при самом предъявлении pin-а ошибка никогда не возвращалась (даже если он неверный). В КриптоПро CSP 5.0 мы стали проверять значение pin-а прямо на CryptSetProvParam(PP_KEYEXCHANGE_PIN/PP_SIGNATURE_PIN), так что теперь при неверном pin-е здесь будет возвращаться ошибка.<br /><br />Обращу ваше внимание на то, что при PFXImportCertStore(CRYPT_SILENT) подавляется не только окно ввода пароля, но и окно выбора носителя, на который будет импортирован контейнер. Это, как правило, означает, что импорт будет на носитель REGISTRY на Windows и HDIMAGE на Unix.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid124437:1Проверка пина в SILENT режиме<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день!<br /><br />Импортирую сертификат:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT)))
</code></pre>
</div></div><br />Все отлично проходит<br /><br />При подписи хотелось бы проверять пароль пользователя:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else {
NSLog(@"[%@] MY cert store opened. %lu", NSStringFromSelector(_cmd),hCryptProv);
}
if(!CryptSetProvParam(hCryptProv,PP_SIGNATURE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)) {
retValue = CSP_GetLastError();
fprintf (stderr, "Last error before acquire 0x%08x \n",retValue);
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else{
retValue = CSP_GetLastError();
fprintf (stderr, "Last error after pin 0x%08x \n",retValue);
}
</code></pre>
</div></div><br /><br />Но CryptSetProvParam всегда при правильном и неправильно пароле возвращает 0x8010006B<br />Если сделать импорт сертификата без CRYPT_SILENT<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE)))
</code></pre>
</div></div><br /><br />то пароль вводится и у меня и в окно КриптоПро, но проверка CryptSetProvParam отрабатывает корректно - если пароль передан неправильный появляется окно КриптоПро при подписании и спрашивает пароль еще раз, если пароль передан правильный - ничего не появляется<br /><br />Как сделать так, чтобы при SILENT импорте корректно отрабатывал CryptSetProvParam?</td></tr></table>2021-04-23T19:27:51+03:002021-04-23T19:27:51+03:00fenw<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день!<br /><br />Импортирую сертификат:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE|CRYPT_SILENT)))
</code></pre>
</div></div><br />Все отлично проходит<br /><br />При подписи хотелось бы проверять пароль пользователя:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) {
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else {
NSLog(@"[%@] MY cert store opened. %lu", NSStringFromSelector(_cmd),hCryptProv);
}
if(!CryptSetProvParam(hCryptProv,PP_SIGNATURE_PIN,(BYTE *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL)) {
retValue = CSP_GetLastError();
fprintf (stderr, "Last error before acquire 0x%08x \n",retValue);
CleanUp();
BYTE *pbSignedMessageBlob=new BYTE[0];
return [NSData dataWithBytes: pbSignedMessageBlob length: 0 ];
}else{
retValue = CSP_GetLastError();
fprintf (stderr, "Last error after pin 0x%08x \n",retValue);
}
</code></pre>
</div></div><br /><br />Но CryptSetProvParam всегда при правильном и неправильно пароле возвращает 0x8010006B<br />Если сделать импорт сертификата без CRYPT_SILENT<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-cpp">
if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:password], CRYPT_EXPORTABLE)))
</code></pre>
</div></div><br /><br />то пароль вводится и у меня и в окно КриптоПро, но проверка CryptSetProvParam отрабатывает корректно - если пароль передан неправильный появляется окно КриптоПро при подписании и спрашивает пароль еще раз, если пароль передан правильный - ничего не появляется<br /><br />Как сделать так, чтобы при SILENT импорте корректно отрабатывал CryptSetProvParam?</td></tr></table>