docs: public byte[] decrypt(byte[] encryptedInput) throws CryptoException, IncompatibleDeviceException {
          try {
              SecretKey key = new SecretKeySpec(getAESKey(), ALGORITHM_AES);
              Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
              String encodedIV = storage.retrieveString(KEY_IV_ALIAS);
              if (TextUtils.isEmpty(encodedIV)) {
                  //AES key was JUST generated. If anything existed before, should be encrypted again first.
                  throw new CryptoException("The encryption keys changed recently. You need to re-encrypt something first.", null);
              }
              byte[] iv = Base64.decode(encodedIV, Base64.DEFAULT);
              cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
              return cipher.doFinal(encryptedInput);
          } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException e) {
              /*
               * This exceptions are safe to be ignored:
               *
               * - NoSuchPaddingException:
               *      Thrown if NOPADDING is not available. Was introduced in API 1.
               * - NoSuchAlgorithmException:
               *      Thrown if the transformation is null, empty or invalid, or if no security provider
               *      implements it. Was introduced in API 1.
               * - InvalidKeyException:
               *      Thrown if the given key is inappropriate for initializing this cipher.
               * - InvalidAlgorithmParameterException:
               *      If the IV parameter is null.
               *
               * Read more in https://developer.android.com/reference/javax/crypto/Cipher
               */
              Log.e(TAG, "Error while decrypting the input.", e);
              throw new IncompatibleDeviceException(e);
          } catch (BadPaddingException | IllegalBlockSizeException e) {
              /*
               * Any of this exceptions mean the encrypted input is somehow corrupted and cannot be recovered.
               * - BadPaddingException:
               *      Thrown if the input doesn't contain the proper padding bytes. In this case, if the input contains padding.
               * - IllegalBlockSizeException:
               *      Thrown only on encrypt mode.
               */
              throw new CryptoException("The AES encrypted input is corrupted and cannot be recovered. Please discard it.", e);
          }
      }