Не получается программно поменять пароль на контейнер (точнее поменять получается, а воспроизвести этот пароль потом и получить доступ к ключам уже нет).
Все по порядку: Имеется несколько разных контейнеров с одинаковым паролем и на одном носителе (они принадлежат одному лицу). Надо программно уметь менять пароль одним разом на всех этих контейнерах.
1) Создаем ключ:
CryptAcquireContext(&hProv,"Container",NULL,PROV_GOST_2001_DH, CRYPT_NEWKEYSET);
CryptSetProvParam(hProv,PP_SIGNATURE_PIN,(BYTE *)"123",0);
CryptGenKey(hProv,AT_SIGNATURE,0,&hKey);
Все отлично, пароль 123.
2) Можем использовать ключ:
CryptAcquireContext(&hProv," \\\\.\\FAT12_A\\Container",NULL,PROV_GOST_2001_DH, CRYPT_SILENT);
CryptSetProvParam(hProv,PP_SIGNATURE_PIN,(BYTE *)"123",0);
CryptGetUserKey(hProv,AT_SIGNATURE,&hKey);
...
3) Можем поменять пароль:
static char Password[] = "12345";
CRYPT_PIN_PARAM param;
param.type = CRYPT_PIN_PASSWD;
param.dest.passwd = Password;
CryptAcquireContext(&hProv," \\\\.\\FAT12_A\\Container",NULL,PROV_GOST_2001_DH, CRYPT_SILENT);
CryptSetProvParam(hProv,PP_SIGNATURE_PIN,(BYTE *)"123",0);
CryptSetProvParam(hProv,PP_CHANGE_PIN,(BYTE *)¶m,0);
Последняя функция выполняется успешно и все: больше к контейнеру пароля не подобрать (в т.ч. через панель управления)… хотя должен был стать 12345. Последующие операции возвращают код 0x8010006B. Остается только удалить контейнер.
Причем если вместо CRYPT_PIN_PASSWD поставить CRYPT_PIN_CLEAR, пароль успешно сбросится, а если CRYPT_PIN_QUERY (не в режиме CRYPT_SILENT), то запросит пароль через UI и успешно поменяет (но этот вариант не подходит).
Видел тему:
http://www.cryptopro.ru/...t.aspx?g=posts&t=128 но она немного не про то.
Помогите, не могу понять, что я делаю не так. Кстати, а в чем существенная разница между PP_CHANGE_PIN и PP_SET_PIN ?