Крипто-Про CSP |
//-------------------------------------------------------------------- // Пример кода, использующего CryptAcquireContext. #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hCryptProv; HCRYPTKEY hKey; BYTE pbData[1000]; // 1000 будет использоваться для наибольшего // по длине имени ключевого контейнера. DWORD cbData; //-------------------------------------------------------------------- // Получение дескриптора криптопровайдера. if(CryptAcquireContext( &hCryptProv, NULL, NULL, 75, 0)) { printf("CryptAcquireContext succeeded.\n"); } else { if (GetLastError() == 0x80090016 ) { printf(" The default key container does not exist.\n"); printf(" Create a default container and generate keys \n"); printf(" Using the code in \n"); printf(" Example C Program: Creating a Key Container and Generating Keys \n"); printf(" Before running this program. \n"); exit(0); } else { HandleError("A genral error runing CryptAcquireContext."); } } //-------------------------------------------------------------------- // Чтение имени CSP. cbData = 1000; if(CryptGetProvParam( hCryptProv, PP_NAME, pbData, &cbData, 0)) { printf("CryptGetProvParam succeeded.\n"); printf("Provider name: %s\n", pbData); } else { HandleError("Error reading CSP name. \n"); } //-------------------------------------------------------------------- // Чтение имени ключевого контейнера. cbData = 1000; if(CryptGetProvParam( hCryptProv, PP_CONTAINER, pbData, &cbData, 0)) { printf("CryptGetProvParam succeeded. \n"); printf("Key Container name: %s\n", pbData); } else { HandleError("Error reading key container name. \n"); } //-------------------------------------------------------------------- // Выполнение криптографических операций. //... //-------------------------------------------------------------------- // Увеличение счетчика ссылок на криптопровайдер. Когда счетчик ссылок на // криптопровайдер становится больше 1, CryptReleaseContext уменьшает // счетчик ссылок, но не освобождает криптопровайдер. if(CryptContextAddRef( hCryptProv, NULL, 0)) { printf("CryptcontextAddRef succeeded. \n"); } else { HandleError("Error during CryptContextAddRef!\n"); } //-------------------------------------------------------------------- // Счетчик ссылок на hCryptProv сейчас больше 1. Первый вызов // функции CryptReleaseContext не освободит дескриптор криптопровайдера. //-------------------------------------------------------------------- // Однократное освобождение контекста. if (CryptReleaseContext(hCryptProv, 0)) { printf("The first call to CryptReleaseContext succeeded. \n"); } else { HandleError("Error during CryptReleaseContext! #1 \n"); } //-------------------------------------------------------------------- // Повторное освобождение дескриптора криптопровайдера. if (CryptReleaseContext(hCryptProv, 0)) { printf("The second call to CryptReleaseContext succeeded. \n"); } else { HandleError("Error during CryptReleaseContext #2 !\n"); } //-------------------------------------------------------------------- // Получение дескриптора криптопровайдера и // создание ключевого контейнера с именем "KC1". if(CryptAcquireContext( &hCryptProv, "KC1", NULL, 75, CRYPT_NEWKEYSET)) { printf("CryptAcquireContext succeeded. \n"); printf("New key set created. \n"); } else { HandleError("Error during CryptAcquireContext for a new key\ \ncontainer. A container with this name probably \ \nalready exists. \n"); } //-------------------------------------------------------------------- // begin Особенность КриптоПро CSP // Особенностью КриптоПро CSP является то, что криптопровайдер // физически не создает (записывает) контейнер, если в нем // нет закрытых ключей. Поэтому необходимо создать ключ. if(CryptGenKey( hCryptProv, AT_SIGNATURE, 0, &hKey)) { printf("Created a signature key pair.\n"); } else { HandleError("Error occurred creating a signature key.\n"); } CryptDestroyKey( hKey ); // end Особенность КриптоПро CSP //-------------------------------------------------------------------- // Выполнение криптографических операций. // ... //-------------------------------------------------------------------- // Освобождение дескриптора криптопровайдера и ключевого контейнера KC1. if(CryptReleaseContext(hCryptProv, 0)) { printf("CryptReleaseContext succeeded. \n"); } else { HandleError("Error during CryptReleaseContext!\n"); } //-------------------------------------------------------------------- // Получение дескриптора криптопровайдера, используя новый ключевой контейнер. // Замечание: Этот ключевой контейнер будет пустым до тех пор, пока ключи // не будут явно созданы с помощью функции CryptGenKey. if(CryptAcquireContext( &hCryptProv, "KC1", NULL, 75, 0)) { printf("Acquired the key set just created. \n"); } else { HandleError("Error during CryptAcquireContext!\n"); } //-------------------------------------------------------------------- // Выполнение криптографических операций. // ... //-------------------------------------------------------------------- // Освобождение дескриптора криптопровайдера. if(CryptReleaseContext( hCryptProv, 0)) { printf("CryptReleaseContext succeeded. \n"); } else { HandleError("Error during CryptReleaseContext!\n"); } //-------------------------------------------------------------------- // Для повторного испоьзования этого примера необходимо удалить созданный // ключей контейнер с именем "КС1". Контейнер можно удалить при помощи // контрольной панели КриптоПро CSP или следующим образом: if(CryptAcquireContext( &hCryptProv, "KC1", NULL, 75, CRYPT_DELETEKEYSET)) { printf("CryptAcquireContext succeeded. \n"); } else { HandleError("Error during CryptAcquireContext!\n"); } } // Конец main
Windows 2000/XP/2003: Необходимо Windows 2000 SP4 или
старше с Internet Explorer 6.0 или старше.
Windows NT/95/98/ME: CSP 3.0 не поддерживает (см. КриптоПро CSP
2.0 ).
Solaris: 9 Update 4 или выше.
FreeBSD: FreeBSD 5.2 или выше
Linux: RedHat 7.3, RedHad 9.0.
Ядро Windows NT: не поддерживает.
Что Вы
думаете по поводу данной статьи? |
Закажите CD c Крипто-Про CSP |