kdbx_rs/binary/
errors.rs

1use super::header;
2use super::header_fields;
3use crate::crypto;
4use crate::stream::random::InnerStreamError;
5use thiserror::Error;
6
7#[derive(Error, Debug)]
8/// Errors encountered loading a database prior to decryption
9pub enum OpenError {
10    /// Keepass database magic number missing
11    #[error("Unsupported file type - not a keepass database")]
12    NonKeepassFormat,
13    /// Second header magic number is not that for kdbx (possibly kdb)
14    #[error("Unsupported file type - not kdbx")]
15    UnsupportedFileFormat,
16    /// The KDBX version is not v3 or v4
17    #[error("Unsupported kdbx version {0}")]
18    UnsupportedMajorVersion(u16),
19    /// There was some error parsing the unencrypted database header
20    #[error("Error reading database header - {0}")]
21    InvalidHeader(#[from] HeaderError),
22    /// Error encountered reading database
23    #[error("IO error reading file - {0}")]
24    Io(#[from] std::io::Error),
25}
26
27#[derive(Debug, Error)]
28/// Errors encountered unlocking a encrypted database
29pub enum UnlockError {
30    /// The HMAC signature check failed. This indicates an invalid password or corrupt DB
31    #[error("Header HMAC validation failed - wrong password or corrupt database")]
32    HmacInvalid,
33    /// The start bytes check failed. This indicates an invalid password or corrupt DB
34    #[error("Header start validation failed - wrong password or corrupt database")]
35    StartBytesInvalid,
36    /// There was some error generating the keys, likely incorrect or unsupported KDF options
37    #[error("Key generation failed - {0}")]
38    KeyGen(#[from] crypto::KeyGenerationError),
39    /// Error encountered decrypting the database content
40    #[error("Decryption failed - {0}")]
41    Decrypt(#[from] std::io::Error),
42    /// The inner header is invalid
43    #[error("Inner header invalid - {0}")]
44    InvalidInnerHeader(#[from] HeaderError),
45    /// The inner stream is invalid
46    #[error("Cannot create inner stream to read protected values - {0}")]
47    InnerStream(#[from] InnerStreamError),
48    /// The inner header is invalid
49    #[error("Corrupt database. XML data is invald - {0}")]
50    InvalidXml(#[from] crate::errors::XmlReadError),
51}
52
53#[derive(Debug, Error)]
54/// Errors uncountering validating the database header
55pub enum HeaderError {
56    /// The reader failed before the header was entirely read
57    #[error("Error reading database header - {0}")]
58    Io(#[from] std::io::Error),
59    /// A supported field had an unexpected format
60    #[error("Incompatible database - Malformed field of type {0:?}: {1}")]
61    MalformedField(header::OuterHeaderId, String),
62    /// A required field is missing in the unencrypted header
63    #[error("Incompatible database - Missing required field of type {0:?}")]
64    MissingRequiredField(header::OuterHeaderId),
65    /// A required field is missing in the encrypted header
66    #[error("Incompatible database - Missing required inner field of type {0:?}")]
67    MissingRequiredInnerField(header::InnerHeaderId),
68    /// A parameter for the KDF algorithm is missing
69    #[error("Incompatible database - Missing paramater {0:?} for KDF {1:?}")]
70    MissingKdfParam(String, header_fields::KdfAlgorithm),
71    /// Validating the header against the unencrypted sha256 hash failed
72    #[error("Corrupt database - Header Checksum failed")]
73    ChecksumFailed,
74    /// The database cipher is not supported by this library.
75    #[error("Incompatible database - Unknown cipher {0:?}")]
76    UnknownCipher(uuid::Uuid),
77}
78
79#[derive(Debug, Error)]
80/// Errors encountered writing a database
81pub enum WriteError {
82    /// The reader failed before the header was entirely read
83    #[error("Error reading database header - {0}")]
84    Io(#[from] std::io::Error),
85    /// The database could not be serialized to XML
86    #[error("Error serializing database to XML - {0}")]
87    XmlWrite(#[from] crate::xml::serialize::Error),
88    /// The database could not be written to as `set_key()` has not been called.
89    #[error("No key to write database with")]
90    MissingKeys,
91    /// The inner stream is invalid
92    #[error("Cannot create inner stream to write protected values - {0}")]
93    InnerStream(#[from] InnerStreamError),
94}