Статус: Участник
Группы: Участники
Зарегистрирован: 05.08.2021(UTC) Сообщений: 16 Откуда: Воронеж Сказал(а) «Спасибо»: 1 раз
|
Да панель управление установлена и токен видится, но возникла сложность с его использованием для подписи файла. Просматриваю доступные хранилища Рутекен и их содержимое. Код: //получение списка доступных хранилищ и их содержимое
private void getAllAlias() {
JCSP prov = new JCSP();
String resultText = "";
//выводим список всех хранилищ (датее интересуют только рутокен)
String allContent = String.valueOf(prov.getServices());
String[] strings = allContent.split(",");
for (int i = 0; i < strings.length; i++) {
if(strings[i].contains("KeyStore")){
Log.d("821", strings[i]);
resultText = resultText + "\n" + strings[i];
}
}
//получаем список алиасов контейнеров Rutoken (и HDIMAGE)
try {
resultText = resultText + "\n";
String[] stores = new String [] {
"Aktiv Rutoken ECP NFC 2",
"Aktiv Rutoken ECP NFC 1",
"Aktiv Rutoken ECP BT 1",
"Aktiv Rutoken ECP BT 2",
"Aktiv Rutoken ECP 2",
"Aktiv Rutoken ECP 1",
"HDIMAGE",
};
for (int i = 0; i < stores.length; i++) {
try {
resultText = resultText + "\n" + stores[i];
KeyStore keyStore = KeyStore.getInstance(stores[i], JCSP.PROVIDER_NAME);
Log.d("812", String.valueOf(keyStore));
keyStore.load(null, null);
//keyStore.getProvider();
//обьектов внутри
int size = keyStore.size();
resultText = resultText + "\n" + "size " + size;
//алиасы
for (Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements(); ) {
resultText = resultText + "\n" + (aliases.nextElement());
}
// закончили с текущим хранилищем
resultText = resultText + "\n" + " end " + stores[i];
}catch (Exception e1){
Log.d("812", e1.getMessage());
resultText = resultText + "\n" + e1.getMessage();
}
}
}catch (Exception e){
Log.d("812", e.getMessage());
resultText = resultText + "\n" + e.getMessage();
}
// выводим текст наэкран
text.setText(resultText);
}
Получаю, что имеется хранилище "Aktiv Rutoken ECP 1" с одним обьектом "Kab00" что соответствует истине. Но когда далее хочу подписать данные initMySign(1) (пока хранилище и алиас на живую в код без диалогов выбора): Код:
private void initMySign(int useItem) {
String alias ;
String store ;
if(useItem == 1 ){
// подключенный рутоен
alias = "Kab00";
store = "Aktiv Rutoken ECP 1";
}else {
// созданный в приложении контейнер
alias = "Test81";
store = "HDIMAGE";
}
String text = "тестовый текст";
ContainerAdapter adapter = new ContainerAdapter(this, alias, true);
adapter.setProviderType(ProviderType.currentProviderType());
MySignData mySing = new MySignData (this, store, adapter, text);
try {
mySing.getResult(new FinalListener() {
@Override
public void onComplete() {
Log.d("812", " onComplete ");
h.post(new Runnable() {
@Override
public void run() {
Toast toast = Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_SHORT);
toast.show();
}
});
}
});
} catch (Exception e) {
Log.d("812", e.getMessage());
}
}
public class MySignData extends SignData {
public Context context;
public String store;
public String data;
protected MySignData(Context _context, String _store, ContainerAdapter _adapter, String _data) {
super(_adapter, false);
context = _context;
store = _store;
data = _data;
}
private class SignThread extends ThreadExecuted {
@Override
protected void executeOne() throws Exception {
sign();
}
}
@Override
public void getResult(FinalListener listener) throws Exception {
SignThread thread = new SignThread();
thread.addFinalListener(listener);
getThreadResult(thread);
}
public byte[] sign() throws Exception {
//Указываем хранилище
KeyStoreType.init(context);
KeyStoreType.saveCurrentType(store);
//Тип контейнера.
String keyStoreType = KeyStoreType.currentType();
//Загрузка ключа и сертификата.
load(askPinInDialog, keyStoreType,
containerAdapter.getClientAlias(),
containerAdapter.getClientPassword());
Log.d("812", " log sign ");
Log.d("812", String.valueOf(askPinInDialog));
Log.d("812", String.valueOf(keyStoreType));
Log.d("812", String.valueOf(containerAdapter.getClientAlias()));
Log.d("812", " /log sign ");
if (getPrivateKey() == null) {
return null;
}
//Инициализация подписи
Signature sn = Signature.getInstance(
algorithmSelector.getSignatureAlgorithmName(),
JCSP.PROVIDER_NAME);
sn.initSign(getPrivateKey());
sn.update(data.getBytes());
// Формируем подпись.
byte[] sign = sn.sign();
return sign;
}
}
То onComplete() не отрабатывает - подписать данные не удается. При этом если если запстить initMySign(0) - и использовать alias = "Test81"; store = "HDIMAGE"; (контейнер Test81 ранее был успешно создан приложении) то onComplete() отрабатывает. Не могли бы вы подсказать в чем собственно ошибка. Отредактировано пользователем 11 августа 2021 г. 14:28:49(UTC)
| Причина: Не указана
|