Подписывание параллелизма в HSM с помощью LunaProvider CKR_DATA_INVALID - PullRequest
0 голосов
/ 24 сентября 2019

Когда я одновременно пытаюсь подписать одним и тем же ключом внутри 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 * Просто, кажется, возвращает плохой подпись
...