use of com.keepassdroid.database.security.ProtectedBinary 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;
}
use of com.keepassdroid.database.security.ProtectedBinary in project KeePassDX by Kunzisoft.
the class ImporterV4 method ReadProtectedBinary.
private ProtectedBinary ReadProtectedBinary(XmlPullParser xpp) throws XmlPullParserException, IOException {
String ref = xpp.getAttributeValue(null, AttrRef);
if (ref != null) {
// Consume end tag
xpp.next();
int id = Integer.parseInt(ref);
return db.binPool.get(id);
}
boolean compressed = false;
String comp = xpp.getAttributeValue(null, AttrCompressed);
if (comp != null) {
compressed = comp.equalsIgnoreCase(ValTrue);
}
byte[] buf = ProcessNode(xpp);
if (buf != null)
return new ProtectedBinary(true, buf);
String base64 = ReadString(xpp);
if (base64.length() == 0)
return ProtectedBinary.EMPTY;
byte[] data = Base64Coder.decode(base64);
if (compressed) {
data = MemUtil.decompress(data);
}
return new ProtectedBinary(false, data);
}
use of com.keepassdroid.database.security.ProtectedBinary in project KeePassDX by Kunzisoft.
the class PwDbInnerHeaderOutputV4 method output.
public void output() throws IOException {
los.write(PwDbInnerHeaderV4Fields.InnerRandomStreamID);
los.writeInt(4);
los.writeInt(header.innerRandomStream.id);
int streamKeySize = header.innerRandomStreamKey.length;
los.write(PwDbInnerHeaderV4Fields.InnerRandomstreamKey);
los.writeInt(streamKeySize);
los.write(header.innerRandomStreamKey);
for (ProtectedBinary bin : db.binPool.binaries()) {
byte flag = KdbxBinaryFlags.None;
if (bin.isProtected()) {
flag |= KdbxBinaryFlags.Protected;
}
byte[] binData = bin.getData();
los.write(PwDbInnerHeaderV4Fields.Binary);
los.writeInt(bin.length() + 1);
los.write(flag);
los.write(binData);
Arrays.fill(binData, (byte) 0);
}
los.write(PwDbInnerHeaderV4Fields.EndOfHeader);
los.writeInt(0);
}
use of com.keepassdroid.database.security.ProtectedBinary in project KeePassDX by Kunzisoft.
the class ImporterV4 method ReadInnerHeader.
private boolean ReadInnerHeader(LEDataInputStream lis, PwDbHeaderV4 header) throws IOException {
byte fieldId = (byte) lis.read();
int size = lis.readInt();
if (size < 0)
throw new IOException("Corrupted file");
byte[] data = new byte[0];
if (size > 0) {
data = lis.readBytes(size);
}
boolean result = true;
switch(fieldId) {
case PwDbHeaderV4.PwDbInnerHeaderV4Fields.EndOfHeader:
result = false;
break;
case PwDbHeaderV4.PwDbInnerHeaderV4Fields.InnerRandomStreamID:
header.setRandomStreamID(data);
break;
case PwDbHeaderV4.PwDbInnerHeaderV4Fields.InnerRandomstreamKey:
header.innerRandomStreamKey = data;
break;
case PwDbHeaderV4.PwDbInnerHeaderV4Fields.Binary:
if (data.length < 1)
throw new IOException("Invalid binary format");
byte flag = data[0];
boolean prot = (flag & PwDbHeaderV4.KdbxBinaryFlags.Protected) != PwDbHeaderV4.KdbxBinaryFlags.None;
byte[] bin = new byte[data.length - 1];
System.arraycopy(data, 1, bin, 0, data.length - 1);
ProtectedBinary pb = new ProtectedBinary(prot, bin);
db.binPool.poolAdd(pb);
if (prot) {
Arrays.fill(data, (byte) 0);
}
break;
default:
assert (false);
break;
}
return result;
}
use of com.keepassdroid.database.security.ProtectedBinary in project KeePassDX by Kunzisoft.
the class PwEntryTestV4 method testAssign.
public void testAssign() {
PwEntryV4 entry = new PwEntryV4();
entry.setAdditional("test223");
entry.setAutoType(new AutoType());
entry.getAutoType().defaultSequence = "1324";
entry.getAutoType().enabled = true;
entry.getAutoType().obfuscationOptions = 123412432109L;
entry.getAutoType().put("key", "value");
entry.setBackgroupColor("blue");
entry.putProtectedBinary("key1", new ProtectedBinary(false, new byte[] { 0, 1 }));
entry.setCustomIcon(new PwIconCustom(UUID.randomUUID(), new byte[0]));
entry.setForegroundColor("red");
entry.addToHistory(new PwEntryV4());
entry.setIcon(new PwIconStandard(5));
entry.setOverrideURL("override");
entry.setParent(new PwGroupV4());
entry.addField("key2", new ProtectedString(false, "value2"));
entry.setUrl("http://localhost");
entry.setUUID(UUID.randomUUID());
PwEntryV4 target = new PwEntryV4();
target.assign(entry);
/* This test is not so useful now that I am not implementing value equality for Entries
assertTrue("Entries do not match.", entry.equals(target));
*/
}
Aggregations