Guardant API (SDK 7 Update6) для Delphi - проверка цифровой подписи
Вопрос по Guardant API (SDK 7 Update6) для Delphi
Имеются 2 локальных USB-ключа Guardant Code, отличающиеся друг от друга только ключами ECC160 (у т.е. у них разные и открытый и закрытый ключ ECC160 для алгоритма цифровой подписки).
Я пытаюсь выполнить аппаратное (с помощью USB-ключа и закрытого ключа шифрования) подписывание строки цифровой подписью и последующую программную проверку этой подписи с помощью открытого (Public) ключа:
1) инициализируем данную копию GrdAPI
2) создаем защищенный контейнер Grd и получаю его хэндл для использования в мультипоточном режиме
GrdCreateHandle(nil, GrdCHM_MultiThread, nil);
3) запоминаем известные нам коды доступа (публичный и чтения) в защищенном контейнере GuardantHandle
4) задаем режим поиска ключа по номеру программы, серийному номеру, номеру версии и битовой маске
5) ищем самый первый подходящий ключ GrdFind(hGrd, GrdF_First, @dwID, @GrdFindInfo);
6) в цикле
6.1) выполняем подключение к ключу GrdLogin(hGrd, $FFFFFFFF, GrdLM_PerStation);
6.2) подписываем некую строку с помощью ECC160 аппаратного USB-ключа GrdSign
6.3) проверяем цифровую подпись для этой строки (с помощью программного алгоритма на ПК) VerifyECC160Sign(DataForSign, ECCSign)
6.4) если подпись не совпадает, то
6.4.1) отключаемся от ключа GrdLogout(hGrd, 0);
6.4.2) ищем следующий ключ GrdFind(hGrd, GrdF_Next, @dwID, @GrdFindInfo) – при этом получаемое содержимое dwID и структуры GrdFindInfo отличаются от тех, которые были получено на предыдущем вызове GrdFind;
6.4.3) повторяем цикл
(естественно, после вызова каждой функции API проводится проверка ошибок).
Так вот если к ПК подключен всего один ключ – все работает как ожидается.
Если ключа два, но только один из них «правильный» (т.е. с нужным ECC160) – то если «правильный» ключ обнаруживается первым (т.е. при GrdF_First) - все нормально, однако если он обнаруживается вторым (т.е. при GrdF_Next) – то для него при проверке подписи всегда будет ошибка 67 = Invalid digital sign.
Все выглядит так, что как будто после вызова GrdLogout, последующий вызов GrdLogin подключает не к тому ключу, который был найден GrdFind.