Когда я одновременно пытаюсь подписать одним и тем же ключом внутри HSM, некоторые подписи завершаются ошибкой со следующей ошибкой: com.safenetinc.luna.exception.LunaCryptokiException: функция C_Sign возвращает 0x20 (CKR_DATA_INVALID)
Только с одним потоком и одним экземпляром моего фляги у меня нет ошибки.Больше тем у меня чаще всего подписи терпят неудачу. Важный момент: если у меня есть 2 экземпляра только по одному потоку в каждом, проблема также возникает.
Я использую провайдера Luna JSP.Алгоритм SHA256 с ECDSA.
Я пробовал также с подключением токена, но тот же результат.Я проверяю свое время ожидания в crystoki.ini, сбой происходит до истечения времени ожидания.Даже с Singleton для keyStore или для privateKey у меня есть проблема.
Генератор потоков:
public static void main(String[] args) {
SpringApplication.run(DccHsmTest.class, args);
for (int i=0; i<4; i++)
{
Multithreading object = new Multithreading();
object.start();
}
}
private byte[] CHALLENGE = new byte[10000];
public void run()
{
try
{
final HsmService hsmService = new HsmService();
hsmKeyStore = hsmService.hsmKeyStore(hsmPartition, hsmPassword);
PrivateKey privateKey = (PrivateKey) hsmKeyStore.getKey(aliasToRetrieve, password);
while(sign(privateKey)){
...
}
throw new RuntimeException();
}
catch (Exception e)
{
...
}
}
private static boolean sign(PrivateKey privateKey) {
try {
Signature signature = Signature.getInstance("SHA256withECDSA", "LunaProvider");
signature.initSign(privateKey);
signature.update(CHALLENGE);
signature.sign();
return true;
}
catch(Exception e){
...
return false;
}
}
HsmService
@Service
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class HsmService {
public KeyStore hsmKeyStore(String hsmPartition, String hsmPassword) throws
KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
LunaProvider lunaProvider = new LunaProvider();
Security.addProvider(lunaProvider);
LunaSlotManager lunaSlotManager = LunaSlotManager.getInstance();
lunaSlotManager.login(hsmPartition, hsmPassword);
KeyStore keyStore = KeyStore.getInstance("Luna");
keyStore.load(null, null);
return keyStore;
}
}
Определение ошибки CKR_DATA_INVALID:
Входные данные в незашифрованном виде для криптографической операции:инвалид.
Но я всегда передаю один и тот же ввод, иногда он работает.
CKlog не предоставляет подробностей: FINISign CKR_DATA_INVALID (5811 мс){ "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
1028 * Просто, кажется, возвращает плохой подпись