Search in sources :

Example 1 with InvalidDBException

use of com.keepassdroid.database.exception.InvalidDBException in project KeePassDX by Kunzisoft.

the class Database method passUrisAsInputStreams.

private void passUrisAsInputStreams(Context ctx, Uri uri, String password, Uri keyfile, UpdateStatus status, boolean debug, long roundsFix) throws IOException, FileNotFoundException, InvalidDBException {
    InputStream is, kfIs;
    try {
        is = UriUtil.getUriInputStream(ctx, uri);
    } catch (Exception e) {
        Log.e("KPD", "Database::LoadData", e);
        throw ContentFileNotFoundException.getInstance(uri);
    }
    try {
        kfIs = UriUtil.getUriInputStream(ctx, keyfile);
    } catch (Exception e) {
        Log.e("KPD", "Database::LoadData", e);
        throw ContentFileNotFoundException.getInstance(keyfile);
    }
    LoadData(ctx, is, password, kfIs, status, debug, roundsFix);
}
Also used : BufferedInputStream(java.io.BufferedInputStream) InputStream(java.io.InputStream) InvalidDBException(com.keepassdroid.database.exception.InvalidDBException) PwDbOutputException(com.keepassdroid.database.exception.PwDbOutputException) InvalidPasswordException(com.keepassdroid.database.exception.InvalidPasswordException) ContentFileNotFoundException(com.keepassdroid.database.exception.ContentFileNotFoundException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) SyncFailedException(java.io.SyncFailedException)

Example 2 with InvalidDBException

use of com.keepassdroid.database.exception.InvalidDBException in project KeePassDX by Kunzisoft.

the class Database method LoadData.

public void LoadData(Context ctx, Uri uri, String password, Uri keyfile, UpdateStatus status, boolean debug) throws IOException, FileNotFoundException, InvalidDBException {
    mUri = uri;
    readOnly = false;
    if (uri.getScheme().equals("file")) {
        File file = new File(uri.getPath());
        readOnly = !file.canWrite();
    }
    try {
        passUrisAsInputStreams(ctx, uri, password, keyfile, status, debug, 0);
    } catch (InvalidPasswordException e) {
        // Retry with rounds fix
        try {
            passUrisAsInputStreams(ctx, uri, password, keyfile, status, debug, getFixRounds(ctx));
        } catch (Exception e2) {
            // Rethrow original exception
            throw e;
        }
    }
}
Also used : InvalidPasswordException(com.keepassdroid.database.exception.InvalidPasswordException) File(java.io.File) InvalidDBException(com.keepassdroid.database.exception.InvalidDBException) PwDbOutputException(com.keepassdroid.database.exception.PwDbOutputException) InvalidPasswordException(com.keepassdroid.database.exception.InvalidPasswordException) ContentFileNotFoundException(com.keepassdroid.database.exception.ContentFileNotFoundException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) SyncFailedException(java.io.SyncFailedException)

Example 3 with InvalidDBException

use of com.keepassdroid.database.exception.InvalidDBException in project KeePassDX by Kunzisoft.

the class ImporterV4 method ReadXmlElement.

private KdbContext ReadXmlElement(KdbContext ctx, XmlPullParser xpp) throws XmlPullParserException, IOException, InvalidDBException {
    String name = xpp.getName();
    switch(ctx) {
        case Null:
            if (name.equalsIgnoreCase(ElemDocNode)) {
                return SwitchContext(ctx, KdbContext.KeePassFile, xpp);
            } else
                ReadUnknown(xpp);
            break;
        case KeePassFile:
            if (name.equalsIgnoreCase(ElemMeta)) {
                return SwitchContext(ctx, KdbContext.Meta, xpp);
            } else if (name.equalsIgnoreCase(ElemRoot)) {
                return SwitchContext(ctx, KdbContext.Root, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case Meta:
            if (name.equalsIgnoreCase(ElemGenerator)) {
                // Ignore
                ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemHeaderHash)) {
                String encodedHash = ReadString(xpp);
                if (!EmptyUtils.isNullOrEmpty(encodedHash) && (hashOfHeader != null)) {
                    byte[] hash = Base64Coder.decode(encodedHash);
                    if (!Arrays.equals(hash, hashOfHeader)) {
                        throw new InvalidDBException();
                    }
                }
            } else if (name.equalsIgnoreCase(ElemSettingsChanged)) {
                db.settingsChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemDbName)) {
                db.name = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemDbNameChanged)) {
                db.nameChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemDbDesc)) {
                db.description = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemDbDescChanged)) {
                db.descriptionChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemDbDefaultUser)) {
                db.defaultUserName = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemDbDefaultUserChanged)) {
                db.defaultUserNameChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemDbColor)) {
                // TODO: Add support to interpret the color if we want to allow changing the database color
                db.color = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemDbMntncHistoryDays)) {
                db.maintenanceHistoryDays = ReadUInt(xpp, DEFAULT_HISTORY_DAYS);
            } else if (name.equalsIgnoreCase(ElemDbKeyChanged)) {
                db.keyLastChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemDbKeyChangeRec)) {
                db.keyChangeRecDays = ReadLong(xpp, -1);
            } else if (name.equalsIgnoreCase(ElemDbKeyChangeForce)) {
                db.keyChangeForceDays = ReadLong(xpp, -1);
            } else if (name.equalsIgnoreCase(ElemDbKeyChangeForceOnce)) {
                db.keyChangeForceOnce = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemMemoryProt)) {
                return SwitchContext(ctx, KdbContext.MemoryProtection, xpp);
            } else if (name.equalsIgnoreCase(ElemCustomIcons)) {
                return SwitchContext(ctx, KdbContext.CustomIcons, xpp);
            } else if (name.equalsIgnoreCase(ElemRecycleBinEnabled)) {
                db.recycleBinEnabled = ReadBool(xpp, true);
            } else if (name.equalsIgnoreCase(ElemRecycleBinUuid)) {
                db.recycleBinUUID = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemRecycleBinChanged)) {
                db.recycleBinChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemEntryTemplatesGroup)) {
                db.entryTemplatesGroup = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemEntryTemplatesGroupChanged)) {
                db.entryTemplatesGroupChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemHistoryMaxItems)) {
                db.historyMaxItems = ReadInt(xpp, -1);
            } else if (name.equalsIgnoreCase(ElemHistoryMaxSize)) {
                db.historyMaxSize = ReadLong(xpp, -1);
            } else if (name.equalsIgnoreCase(ElemEntryTemplatesGroupChanged)) {
                db.entryTemplatesGroupChanged = ReadTime(xpp);
            } else if (name.equalsIgnoreCase(ElemLastSelectedGroup)) {
                db.lastSelectedGroup = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemLastTopVisibleGroup)) {
                db.lastTopVisibleGroup = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemBinaries)) {
                return SwitchContext(ctx, KdbContext.Binaries, xpp);
            } else if (name.equalsIgnoreCase(ElemCustomData)) {
                return SwitchContext(ctx, KdbContext.CustomData, xpp);
            }
            break;
        case MemoryProtection:
            if (name.equalsIgnoreCase(ElemProtTitle)) {
                db.memoryProtection.protectTitle = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemProtUserName)) {
                db.memoryProtection.protectUserName = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemProtPassword)) {
                db.memoryProtection.protectPassword = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemProtURL)) {
                db.memoryProtection.protectUrl = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemProtNotes)) {
                db.memoryProtection.protectNotes = ReadBool(xpp, false);
            } else if (name.equalsIgnoreCase(ElemProtAutoHide)) {
                db.memoryProtection.autoEnableVisualHiding = ReadBool(xpp, false);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case CustomIcons:
            if (name.equalsIgnoreCase(ElemCustomIconItem)) {
                return SwitchContext(ctx, KdbContext.CustomIcon, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case CustomIcon:
            if (name.equalsIgnoreCase(ElemCustomIconItemID)) {
                customIconID = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemCustomIconItemData)) {
                String strData = ReadString(xpp);
                if (strData != null && strData.length() > 0) {
                    customIconData = Base64Coder.decode(strData);
                } else {
                    assert (false);
                }
            } else {
                ReadUnknown(xpp);
            }
            break;
        case Binaries:
            if (name.equalsIgnoreCase(ElemBinary)) {
                String key = xpp.getAttributeValue(null, AttrId);
                if (key != null) {
                    ProtectedBinary pbData = ReadProtectedBinary(xpp);
                    int id = Integer.parseInt(key);
                    db.binPool.put(id, pbData);
                } else {
                    ReadUnknown(xpp);
                }
            } else {
                ReadUnknown(xpp);
            }
            break;
        case CustomData:
            if (name.equalsIgnoreCase(ElemStringDictExItem)) {
                return SwitchContext(ctx, KdbContext.CustomDataItem, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case CustomDataItem:
            if (name.equalsIgnoreCase(ElemKey)) {
                customDataKey = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemValue)) {
                customDataValue = ReadString(xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case Root:
            if (name.equalsIgnoreCase(ElemGroup)) {
                assert (ctxGroups.size() == 0);
                if (ctxGroups.size() != 0)
                    throw new IOException("Group list should be empty.");
                db.rootGroup = new PwGroupV4();
                ctxGroups.push((PwGroupV4) db.rootGroup);
                ctxGroup = ctxGroups.peek();
                return SwitchContext(ctx, KdbContext.Group, xpp);
            } else if (name.equalsIgnoreCase(ElemDeletedObjects)) {
                return SwitchContext(ctx, KdbContext.RootDeletedObjects, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case Group:
            if (name.equalsIgnoreCase(ElemUuid)) {
                ctxGroup.setUUID(ReadUuid(xpp));
            } else if (name.equalsIgnoreCase(ElemName)) {
                ctxGroup.setName(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemNotes)) {
                ctxGroup.setNotes(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemIcon)) {
                ctxGroup.setIcon(db.iconFactory.getIcon((int) ReadUInt(xpp, 0)));
            } else if (name.equalsIgnoreCase(ElemCustomIconID)) {
                ctxGroup.setCustomIcon(db.iconFactory.getIcon(ReadUuid(xpp)));
            } else if (name.equalsIgnoreCase(ElemTimes)) {
                return SwitchContext(ctx, KdbContext.GroupTimes, xpp);
            } else if (name.equalsIgnoreCase(ElemIsExpanded)) {
                ctxGroup.setExpanded(ReadBool(xpp, true));
            } else if (name.equalsIgnoreCase(ElemGroupDefaultAutoTypeSeq)) {
                ctxGroup.setDefaultAutoTypeSequence(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemEnableAutoType)) {
                ctxGroup.setEnableAutoType(StringToBoolean(ReadString(xpp)));
            } else if (name.equalsIgnoreCase(ElemEnableSearching)) {
                ctxGroup.setEnableSearching(StringToBoolean(ReadString(xpp)));
            } else if (name.equalsIgnoreCase(ElemLastTopVisibleEntry)) {
                ctxGroup.setLastTopVisibleEntry(ReadUuid(xpp));
            } else if (name.equalsIgnoreCase(ElemCustomData)) {
                return SwitchContext(ctx, KdbContext.GroupCustomData, xpp);
            } else if (name.equalsIgnoreCase(ElemGroup)) {
                ctxGroup = new PwGroupV4();
                ctxGroups.peek().AddGroup(ctxGroup);
                ctxGroups.push(ctxGroup);
                return SwitchContext(ctx, KdbContext.Group, xpp);
            } else if (name.equalsIgnoreCase(ElemEntry)) {
                ctxEntry = new PwEntryV4();
                ctxGroup.AddEntry(ctxEntry);
                entryInHistory = false;
                return SwitchContext(ctx, KdbContext.Entry, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case GroupCustomData:
            if (name.equalsIgnoreCase(ElemStringDictExItem)) {
                return SwitchContext(ctx, KdbContext.GroupCustomDataItem, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case GroupCustomDataItem:
            if (name.equalsIgnoreCase(ElemKey)) {
                groupCustomDataKey = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemValue)) {
                groupCustomDataValue = ReadString(xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case Entry:
            if (name.equalsIgnoreCase(ElemUuid)) {
                ctxEntry.setUUID(ReadUuid(xpp));
            } else if (name.equalsIgnoreCase(ElemIcon)) {
                ctxEntry.setIcon(db.iconFactory.getIcon((int) ReadUInt(xpp, 0)));
            } else if (name.equalsIgnoreCase(ElemCustomIconID)) {
                ctxEntry.setCustomIcon(db.iconFactory.getIcon(ReadUuid(xpp)));
            } else if (name.equalsIgnoreCase(ElemFgColor)) {
                ctxEntry.setForegroundColor(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemBgColor)) {
                ctxEntry.setBackgroupColor(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemOverrideUrl)) {
                ctxEntry.setOverrideURL(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemTags)) {
                ctxEntry.setTags(ReadString(xpp));
            } else if (name.equalsIgnoreCase(ElemTimes)) {
                return SwitchContext(ctx, KdbContext.EntryTimes, xpp);
            } else if (name.equalsIgnoreCase(ElemString)) {
                return SwitchContext(ctx, KdbContext.EntryString, xpp);
            } else if (name.equalsIgnoreCase(ElemBinary)) {
                return SwitchContext(ctx, KdbContext.EntryBinary, xpp);
            } else if (name.equalsIgnoreCase(ElemAutoType)) {
                return SwitchContext(ctx, KdbContext.EntryAutoType, xpp);
            } else if (name.equalsIgnoreCase(ElemCustomData)) {
                return SwitchContext(ctx, KdbContext.EntryCustomData, xpp);
            } else if (name.equalsIgnoreCase(ElemHistory)) {
                assert (!entryInHistory);
                if (!entryInHistory) {
                    ctxHistoryBase = ctxEntry;
                    return SwitchContext(ctx, KdbContext.EntryHistory, xpp);
                } else {
                    ReadUnknown(xpp);
                }
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryCustomData:
            if (name.equalsIgnoreCase(ElemStringDictExItem)) {
                return SwitchContext(ctx, KdbContext.EntryCustomDataItem, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryCustomDataItem:
            if (name.equalsIgnoreCase(ElemKey)) {
                entryCustomDataKey = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemValue)) {
                entryCustomDataValue = ReadString(xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case GroupTimes:
        case EntryTimes:
            ITimeLogger tl;
            if (ctx == KdbContext.GroupTimes) {
                tl = ctxGroup;
            } else {
                tl = ctxEntry;
            }
            if (name.equalsIgnoreCase(ElemLastModTime)) {
                tl.setLastModificationTime(ReadPwTime(xpp));
            } else if (name.equalsIgnoreCase(ElemCreationTime)) {
                tl.setCreationTime(ReadPwTime(xpp));
            } else if (name.equalsIgnoreCase(ElemLastAccessTime)) {
                tl.setLastAccessTime(ReadPwTime(xpp));
            } else if (name.equalsIgnoreCase(ElemExpiryTime)) {
                tl.setExpiryTime(ReadPwTime(xpp));
            } else if (name.equalsIgnoreCase(ElemExpires)) {
                tl.setExpires(ReadBool(xpp, false));
            } else if (name.equalsIgnoreCase(ElemUsageCount)) {
                tl.setUsageCount(ReadULong(xpp, 0));
            } else if (name.equalsIgnoreCase(ElemLocationChanged)) {
                tl.setLocationChanged(ReadPwTime(xpp));
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryString:
            if (name.equalsIgnoreCase(ElemKey)) {
                ctxStringName = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemValue)) {
                ctxStringValue = ReadProtectedString(xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryBinary:
            if (name.equalsIgnoreCase(ElemKey)) {
                ctxBinaryName = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemValue)) {
                ctxBinaryValue = ReadProtectedBinary(xpp);
            }
            break;
        case EntryAutoType:
            if (name.equalsIgnoreCase(ElemAutoTypeEnabled)) {
                ctxEntry.getAutoType().enabled = ReadBool(xpp, true);
            } else if (name.equalsIgnoreCase(ElemAutoTypeObfuscation)) {
                ctxEntry.getAutoType().obfuscationOptions = ReadUInt(xpp, 0);
            } else if (name.equalsIgnoreCase(ElemAutoTypeDefaultSeq)) {
                ctxEntry.getAutoType().defaultSequence = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemAutoTypeItem)) {
                return SwitchContext(ctx, KdbContext.EntryAutoTypeItem, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryAutoTypeItem:
            if (name.equalsIgnoreCase(ElemWindow)) {
                ctxATName = ReadString(xpp);
            } else if (name.equalsIgnoreCase(ElemKeystrokeSequence)) {
                ctxATSeq = ReadString(xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case EntryHistory:
            if (name.equalsIgnoreCase(ElemEntry)) {
                ctxEntry = new PwEntryV4();
                ctxHistoryBase.addToHistory(ctxEntry);
                entryInHistory = true;
                return SwitchContext(ctx, KdbContext.Entry, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case RootDeletedObjects:
            if (name.equalsIgnoreCase(ElemDeletedObject)) {
                ctxDeletedObject = new PwDeletedObject();
                db.deletedObjects.add(ctxDeletedObject);
                return SwitchContext(ctx, KdbContext.DeletedObject, xpp);
            } else {
                ReadUnknown(xpp);
            }
            break;
        case DeletedObject:
            if (name.equalsIgnoreCase(ElemUuid)) {
                ctxDeletedObject.uuid = ReadUuid(xpp);
            } else if (name.equalsIgnoreCase(ElemDeletionTime)) {
                ctxDeletedObject.setDeletionTime(ReadTime(xpp));
            } else {
                ReadUnknown(xpp);
            }
            break;
        default:
            ReadUnknown(xpp);
            break;
    }
    return ctx;
}
Also used : InvalidDBException(com.keepassdroid.database.exception.InvalidDBException) PwEntryV4(com.keepassdroid.database.PwEntryV4) PwDeletedObject(com.keepassdroid.database.PwDeletedObject) PwGroupV4(com.keepassdroid.database.PwGroupV4) ITimeLogger(com.keepassdroid.database.ITimeLogger) ProtectedBinary(com.keepassdroid.database.security.ProtectedBinary) ProtectedString(com.keepassdroid.database.security.ProtectedString) IOException(java.io.IOException)

Example 4 with InvalidDBException

use of com.keepassdroid.database.exception.InvalidDBException in project KeePassDX by Kunzisoft.

the class ImporterV4 method openDatabase.

@Override
public PwDatabaseV4 openDatabase(InputStream inStream, String password, InputStream keyInputStream, UpdateStatus status, long roundsFix) throws IOException, InvalidDBException {
    db = createDB();
    PwDbHeaderV4 header = new PwDbHeaderV4(db);
    db.binPool.clear();
    PwDbHeaderV4.HeaderAndHash hh = header.loadFromFile(inStream);
    version = header.version;
    hashOfHeader = hh.hash;
    pbHeader = hh.header;
    db.setMasterKey(password, keyInputStream);
    db.makeFinalKey(header.masterSeed, db.kdfParameters, roundsFix);
    CipherEngine engine;
    Cipher cipher;
    try {
        engine = CipherFactory.getInstance(db.dataCipher);
        db.dataEngine = engine;
        cipher = engine.getCipher(Cipher.DECRYPT_MODE, db.finalKey, header.encryptionIV);
    } catch (NoSuchAlgorithmException e) {
        throw new IOException("Invalid algorithm.");
    } catch (NoSuchPaddingException e) {
        throw new IOException("Invalid algorithm.");
    } catch (InvalidKeyException e) {
        throw new IOException("Invalid algorithm.");
    } catch (InvalidAlgorithmParameterException e) {
        throw new IOException("Invalid algorithm.");
    }
    InputStream isPlain;
    if (version < PwDbHeaderV4.FILE_VERSION_32_4) {
        InputStream decrypted = AttachCipherStream(inStream, cipher);
        LEDataInputStream dataDecrypted = new LEDataInputStream(decrypted);
        byte[] storedStartBytes = null;
        try {
            storedStartBytes = dataDecrypted.readBytes(32);
            if (storedStartBytes == null || storedStartBytes.length != 32) {
                throw new InvalidPasswordException();
            }
        } catch (IOException e) {
            throw new InvalidPasswordException();
        }
        if (!Arrays.equals(storedStartBytes, header.streamStartBytes)) {
            throw new InvalidPasswordException();
        }
        isPlain = new HashedBlockInputStream(dataDecrypted);
    } else {
        // KDBX 4
        LEDataInputStream isData = new LEDataInputStream(inStream);
        byte[] storedHash = isData.readBytes(32);
        if (!Arrays.equals(storedHash, hashOfHeader)) {
            throw new InvalidDBException();
        }
        byte[] hmacKey = db.hmacKey;
        byte[] headerHmac = PwDbHeaderV4.computeHeaderHmac(pbHeader, hmacKey);
        byte[] storedHmac = isData.readBytes(32);
        if (storedHmac == null || storedHmac.length != 32) {
            throw new InvalidDBException();
        }
        // Mac doesn't match
        if (!Arrays.equals(headerHmac, storedHmac)) {
            throw new InvalidDBException();
        }
        HmacBlockInputStream hmIs = new HmacBlockInputStream(isData, true, hmacKey);
        isPlain = AttachCipherStream(hmIs, cipher);
    }
    InputStream isXml;
    if (db.compressionAlgorithm == PwCompressionAlgorithm.Gzip) {
        isXml = new GZIPInputStream(isPlain);
    } else {
        isXml = isPlain;
    }
    if (version >= header.FILE_VERSION_32_4) {
        LoadInnerHeader(isXml, header);
    }
    if (header.innerRandomStreamKey == null) {
        assert (false);
        throw new IOException("Invalid stream key.");
    }
    randomStream = PwStreamCipherFactory.getInstance(header.innerRandomStream, header.innerRandomStreamKey);
    if (randomStream == null) {
        throw new ArcFourException();
    }
    ReadXmlStreamed(isXml);
    return db;
}
Also used : InvalidDBException(com.keepassdroid.database.exception.InvalidDBException) InvalidAlgorithmParameterException(java.security.InvalidAlgorithmParameterException) GZIPInputStream(java.util.zip.GZIPInputStream) HashedBlockInputStream(com.keepassdroid.stream.HashedBlockInputStream) LEDataInputStream(com.keepassdroid.stream.LEDataInputStream) BetterCipherInputStream(com.keepassdroid.stream.BetterCipherInputStream) HmacBlockInputStream(com.keepassdroid.stream.HmacBlockInputStream) InputStream(java.io.InputStream) NoSuchPaddingException(javax.crypto.NoSuchPaddingException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) IOException(java.io.IOException) InvalidKeyException(java.security.InvalidKeyException) LEDataInputStream(com.keepassdroid.stream.LEDataInputStream) ArcFourException(com.keepassdroid.database.exception.ArcFourException) GZIPInputStream(java.util.zip.GZIPInputStream) HmacBlockInputStream(com.keepassdroid.stream.HmacBlockInputStream) PwDbHeaderV4(com.keepassdroid.database.PwDbHeaderV4) CipherEngine(com.keepassdroid.crypto.engine.CipherEngine) InvalidPasswordException(com.keepassdroid.database.exception.InvalidPasswordException) StreamCipher(org.spongycastle.crypto.StreamCipher) Cipher(javax.crypto.Cipher) HashedBlockInputStream(com.keepassdroid.stream.HashedBlockInputStream)

Aggregations

InvalidDBException (com.keepassdroid.database.exception.InvalidDBException)4 IOException (java.io.IOException)4 InvalidPasswordException (com.keepassdroid.database.exception.InvalidPasswordException)3 ContentFileNotFoundException (com.keepassdroid.database.exception.ContentFileNotFoundException)2 PwDbOutputException (com.keepassdroid.database.exception.PwDbOutputException)2 FileNotFoundException (java.io.FileNotFoundException)2 InputStream (java.io.InputStream)2 SyncFailedException (java.io.SyncFailedException)2 CipherEngine (com.keepassdroid.crypto.engine.CipherEngine)1 ITimeLogger (com.keepassdroid.database.ITimeLogger)1 PwDbHeaderV4 (com.keepassdroid.database.PwDbHeaderV4)1 PwDeletedObject (com.keepassdroid.database.PwDeletedObject)1 PwEntryV4 (com.keepassdroid.database.PwEntryV4)1 PwGroupV4 (com.keepassdroid.database.PwGroupV4)1 ArcFourException (com.keepassdroid.database.exception.ArcFourException)1 ProtectedBinary (com.keepassdroid.database.security.ProtectedBinary)1 ProtectedString (com.keepassdroid.database.security.ProtectedString)1 BetterCipherInputStream (com.keepassdroid.stream.BetterCipherInputStream)1 HashedBlockInputStream (com.keepassdroid.stream.HashedBlockInputStream)1 HmacBlockInputStream (com.keepassdroid.stream.HmacBlockInputStream)1