Почему реакция-native-rsa-native расшифровка иногда срабатывает? - PullRequest
1 голос
/ 05 апреля 2020

Я пишу чат-приложение с сквозным шифрованием и потратил как минимум один день на эту проблему. Я использую native-rsa реакции-нативного и у меня возникла проблема с расшифровкой сообщений, которую я не могу найти нигде в документации.

При загрузке экрана используется вызов useEffect, и это вызывает функцию, которая регистрирует обратный вызов для события child_added на правильном дочернем элементе Firebase. Обратный вызов, в свою очередь, запускает функцию, которая расшифровывает сообщения, полученные из Firebase.

Существует два разных способа выполнения этого обратного вызова согласно документации Firebase. Один из способов - при загрузке страницы, когда обратный вызов запускается один раз для каждого существующего дочернего элемента в выбранном месте дерева Firebase. Затем функция запускается один раз каждый раз, когда появляется новый дочерний элемент.

Что делает эту проблему настолько запутанной, так это то, что расшифровщик дает сбой только в первом случае. Когда экран загружается, начальные запуски функции (с передачей всех правильных данных) вызывают RSAKeychain.decrypt (text, keyTag); бросить исключение IllegalBlockSizeException без предоставления другого сообщения. Я понимаю, что такого рода проблемы не должны быть применимы к шифрованию RSA.

Мой код выглядит следующим образом. Сначала в функциональном компоненте используется useEffect, что приводит к тому, что Fire.get запускается один раз:

const ConvoScreen = ({route, navigation}) => {

  const { recipientId, title } = route.params;

  useEffect(() => {
    Fire.get(recipientId, message => {
      return setMessages((previous) => (GiftedChat.append(previous, message)))
    });
    return () => {
      Fire.off(recipientId);
    }
  }, []);

...

Затем в Fire.get добавляется прослушиватель события 'child_added':

  get = (fromId, callback) => {
    this.getConvo(fromId).on('child_added', async (snapshot) => {
      const callbackWith = await this.parse(snapshot);
      callback(callbackWith);
    });
  };

Это событие запускает функцию анализа. Блок catch здесь - это то, что достигается ТОЛЬКО для начальных триггеров child_added, которые выполняются для существующих потомков в дереве:

  parse = async message => {
    try {
      const {key: _id} = message;
      const {user, timestamp, text, signature} = message.val();
      const createdAt = new Date(timestamp);

      // IllegalBlockSizeException thrown from native code on this line
      // But only on the initial triggers of 'child_added' and not subsequent triggers
      const decryptedText = await RSAKeychain.decrypt(text, keyTag);

      return {
        _id,
        createdAt,
        text: decryptedText,
        user
      };

    } catch (err) {
      console.log("PARSE ERROR ENCOUNTERED!");
      console.log(err.message);
      // The message is always "Error not specified."
    }
  };

Когда точно такие же данные передаются в переменную snapshot, расшифровка работает , Любая помощь или даже предложения для расследования будет принята с благодарностью. Я исчерпал свои способности.

Редактировать: Мне удалось получить некоторую информацию о трассировке стека:

 LOG  javax.crypto.IllegalBlockSizeException
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:519)
        at javax.crypto.Cipher.doFinal(Cipher.java:1741)
        at com.RNRSA.RSA.decrypt(RSA.java:148)
        at com.RNRSA.RSA.decrypt(RSA.java:156)
        at com.RNRSA.RNRSAKeychainModule$5.run(RNRSAKeychainModule.java:128)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
Caused by: android.security.KeyStoreException: Unknown error
        at android.security.KeyStore.getKeyStoreException(KeyStore.java:697)
        at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
        ... 8 more
...