Работа с электронной подписью

Формирование электронной подписи

Для формирования электронной подписи используется метод JCSDevice.createSignatureFromHash. При помощи этого метода можно создавать два вида подписи:

  • присоединенную подпись (подпись присоединяется к подписанным данным);
  • отсоединенную подпись (подпись формируется в отдельном файле).

За выбор вида подписи отвечает аргумент attachedSignature.

Пример подключения к смарт-карте в разделе Подключение к NFC смарт-карте.

Пример создания присоединенной подписи

// PIN-код пользователя
String userPIN = "1234567890";

// Данные для подписи
byte[] data = new byte[]{ 1, 2, 3 };

// Сертификат для подписи
JCSCertificate certificate = JCSStorage.shared().certificates().get(0);

// Вычислить хэш данных
byte[] hash;
try {
   hash = JCSUtils.digest(certificate.getHashAlgorithm(), data);
}
catch(Exception e) {
   // Ошибка вычисления хэша
   return;
}


// Подключиться к смарт-карте
openDevice(device -> {
   try {
      // Сформировать электронную подпись
      byte[] signature = device.createSignatureFromHash(userPIN, null, hash, certificate, true, data);
   }
   catch(Exception e) {
      // Ошибка создания подписи
   }
   finally {
      // Закрыть подключение к смарт-карте
      device.close();
   }
});

Пример создания отсоединенной подписи

// PIN-код пользователя
String userPIN = "1234567890";

// Данные для подписи
byte[] data = new byte[]{ 1, 2, 3 };

// Сертификат для подписи
JCSCertificate certificate = JCSStorage.shared().certificates().get(0);

// Вычислить хэш данных
byte[] hash;
try {
   hash = JCSUtils.digest(certificate.getHashAlgorithm(), data);
}
catch(Exception e) {
   // Ошибка вычисления хэша
   return;
}


// Подключиться к смарт-карте
openDevice(device -> {
   try {
      // Сформировать электронную подпись
      byte[] signature = device.createSignatureFromHash(userPIN, null, hash, certificate, false, null);
   }
   catch(Exception e) {
      // Ошибка создания подписи
   }
   finally {
      // Закрыть подключение к смарт-карте
      device.close();
   }
});

Проверка электронной подписи

Для проверки электронной подписи используется метод JCSUtils.verifySignature. При помощи этого метода можно осуществлять проверку:

  • присоединенной подписи (подписываемые данные включены в подпись);
  • отсоединенной подписи (подписываемые данные не включены в подпись).
Если используется отсоединенная подпись, необходимо передать проверяемые данные в аргументе data.
Если используется присоединенная подпись:
  • если в аргументе data передаются данные - они будут использоваться для проверки;
  • если в аргументе data передается null - для проверки будут использоваться данные из подписи.

Пример проверки присоединенной подписи

// Подпись
byte[] signature = new byte[]{ /* Массив байт с подписью в формате PKCS#7 */ };

try {
   // Проверить электронную подпись
   boolean valid = JCSUtils.verifySignature(signature, null);
}
catch(Exception e) {
   // Ошибка проверки подписи
}

Пример проверки отсоединенной подписи

// Данные для проверки
byte[] data = new byte[]{ /* Массив байт с данными */ };

// Подпись
byte[] signature = new byte[]{ /* Массив байт с подписью в формате PKCS#7 */ };

try {
   // Проверить электронную подпись
   boolean valid = JCSUtils.verifySignature(signature, data);
}
catch(Exception e) {
   // Ошибка проверки подписи
}