1use super::header;
2use super::header_fields;
3use crate::crypto;
4use crate::stream::random::InnerStreamError;
5use thiserror::Error;
6
7#[derive(Error, Debug)]
8pub enum OpenError {
10 #[error("Unsupported file type - not a keepass database")]
12 NonKeepassFormat,
13 #[error("Unsupported file type - not kdbx")]
15 UnsupportedFileFormat,
16 #[error("Unsupported kdbx version {0}")]
18 UnsupportedMajorVersion(u16),
19 #[error("Error reading database header - {0}")]
21 InvalidHeader(#[from] HeaderError),
22 #[error("IO error reading file - {0}")]
24 Io(#[from] std::io::Error),
25}
26
27#[derive(Debug, Error)]
28pub enum UnlockError {
30 #[error("Header HMAC validation failed - wrong password or corrupt database")]
32 HmacInvalid,
33 #[error("Header start validation failed - wrong password or corrupt database")]
35 StartBytesInvalid,
36 #[error("Key generation failed - {0}")]
38 KeyGen(#[from] crypto::KeyGenerationError),
39 #[error("Decryption failed - {0}")]
41 Decrypt(#[from] std::io::Error),
42 #[error("Inner header invalid - {0}")]
44 InvalidInnerHeader(#[from] HeaderError),
45 #[error("Cannot create inner stream to read protected values - {0}")]
47 InnerStream(#[from] InnerStreamError),
48 #[error("Corrupt database. XML data is invald - {0}")]
50 InvalidXml(#[from] crate::errors::XmlReadError),
51}
52
53#[derive(Debug, Error)]
54pub enum HeaderError {
56 #[error("Error reading database header - {0}")]
58 Io(#[from] std::io::Error),
59 #[error("Incompatible database - Malformed field of type {0:?}: {1}")]
61 MalformedField(header::OuterHeaderId, String),
62 #[error("Incompatible database - Missing required field of type {0:?}")]
64 MissingRequiredField(header::OuterHeaderId),
65 #[error("Incompatible database - Missing required inner field of type {0:?}")]
67 MissingRequiredInnerField(header::InnerHeaderId),
68 #[error("Incompatible database - Missing paramater {0:?} for KDF {1:?}")]
70 MissingKdfParam(String, header_fields::KdfAlgorithm),
71 #[error("Corrupt database - Header Checksum failed")]
73 ChecksumFailed,
74 #[error("Incompatible database - Unknown cipher {0:?}")]
76 UnknownCipher(uuid::Uuid),
77}
78
79#[derive(Debug, Error)]
80pub enum WriteError {
82 #[error("Error reading database header - {0}")]
84 Io(#[from] std::io::Error),
85 #[error("Error serializing database to XML - {0}")]
87 XmlWrite(#[from] crate::xml::serialize::Error),
88 #[error("No key to write database with")]
90 MissingKeys,
91 #[error("Cannot create inner stream to write protected values - {0}")]
93 InnerStream(#[from] InnerStreamError),
94}