Следующий минимальный пример, вызываемый один раз, блокирует пользовательский интерфейс на моем Motorola G6.Что с этим не так?Keystore выполняет что-то в главном потоке где-то за кулисами?(Изменить: я подозреваю, что проблемы с оперативной памятью. После изменения размера ключа RSA на 2048, это намного лучше, хотя все еще есть небольшая пауза пользовательского интерфейса)
Observable.fromCallable(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256, new SecureRandom());
Key key = generator.generateKey();
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 100);
KeyStore.getInstance("AndroidKeyStore").load(null);
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
.setAlias("some_id")
.setKeySize(3072)
.setKeyType(KeyProperties.KEY_ALGORITHM_RSA)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.setSerialNumber(BigInteger.ONE)
.setSubject(new X500Principal("CN = Secured Preference Store, O = Some Name"))
.build();
keyGen.initialize(spec);
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey rsaPublicKey = keyPair.getPublic();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher);
cipherOutputStream.write(key.getEncoded());
cipherOutputStream.close();
return true;
}
}).subscribeOn(Schedulers.computation()).observeOn(Schedulers.computation()).subscribe();