SergeyRT, выбор программного или аппаратного хеширования задается параметрами механизма подписи или хеширования.
Пример программного хеширования:
static CK_BYTE parametersGostR3411_2012_256[] = { 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
static CK_MECHANISM gostR3410_2012_256SigVerMech_WithHash = {CKM_GOSTR3410_WITH_GOSTR3411_12_256, parametersGostR3411_2012_256, sizeof(parametersGostR3411_2012_256)};
Аппаратное хеширование:
static CK_MECHANISM gostR3410_2012_256SigVerMech = {CKM_GOSTR3410_WITH_GOSTR3411_12_256, NULL_PTR,0)};
Полный пример можно увидеть, запустив пример в SDK по пути в архиве: sdk\pkcs11\samples\Standard\SignGOST34.10-2012-512WithHash.
Чтобы включить программное хеширование нужно раскомментировать соответствующие механизмы (строки 431- 448) (и закомментировать аппаратное) в файле \sdk\pkcs11\samples\include\Common.h
Спасибо, что указали на неточность в документации.