Поток вычислений RxJava + интерфейс блокировки Android Keystore? - PullRequest
0 голосов
/ 06 декабря 2018

Следующий минимальный пример, вызываемый один раз, блокирует пользовательский интерфейс на моем 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();
...