diff options
Diffstat (limited to 'src/crypto/SymmetricCipher.cpp')
-rw-r--r-- | src/crypto/SymmetricCipher.cpp | 77 |
1 files changed, 63 insertions, 14 deletions
diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp index 98d481969..1ba42a537 100644 --- a/src/crypto/SymmetricCipher.cpp +++ b/src/crypto/SymmetricCipher.cpp @@ -20,10 +20,10 @@ #include "config-keepassx.h" #include "crypto/SymmetricCipherGcrypt.h" -SymmetricCipher::SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction) +SymmetricCipher::SymmetricCipher(Algorithm algo, Mode mode, Direction direction) : m_backend(createBackend(algo, mode, direction)) , m_initialized(false) + , m_algo(algo) { } @@ -54,13 +54,14 @@ bool SymmetricCipher::isInitalized() const return m_initialized; } -SymmetricCipherBackend* SymmetricCipher::createBackend(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction) +SymmetricCipherBackend* SymmetricCipher::createBackend(Algorithm algo, Mode mode, Direction direction) { switch (algo) { - case SymmetricCipher::Aes256: - case SymmetricCipher::Twofish: - case SymmetricCipher::Salsa20: + case Aes128: + case Aes256: + case Twofish: + case Salsa20: + case ChaCha20: return new SymmetricCipherGcrypt(algo, mode, direction); default: @@ -74,6 +75,11 @@ bool SymmetricCipher::reset() return m_backend->reset(); } +int SymmetricCipher::keySize() const +{ + return m_backend->keySize(); +} + int SymmetricCipher::blockSize() const { return m_backend->blockSize(); @@ -87,19 +93,62 @@ QString SymmetricCipher::errorString() const SymmetricCipher::Algorithm SymmetricCipher::cipherToAlgorithm(Uuid cipher) { if (cipher == KeePass2::CIPHER_AES) { - return SymmetricCipher::Aes256; - } - else { - return SymmetricCipher::Twofish; + return Aes256; + } else if (cipher == KeePass2::CIPHER_CHACHA20) { + return ChaCha20; + } else if (cipher == KeePass2::CIPHER_TWOFISH) { + return Twofish; } + + qWarning("SymmetricCipher::cipherToAlgorithm: invalid Uuid %s", cipher.toByteArray().toHex().data()); + return InvalidAlgorithm; } -Uuid SymmetricCipher::algorithmToCipher(SymmetricCipher::Algorithm algo) +Uuid SymmetricCipher::algorithmToCipher(Algorithm algo) { switch (algo) { - case SymmetricCipher::Aes256: + case Aes256: return KeePass2::CIPHER_AES; - default: + case ChaCha20: + return KeePass2::CIPHER_CHACHA20; + case Twofish: return KeePass2::CIPHER_TWOFISH; + default: + qWarning("SymmetricCipher::algorithmToCipher: invalid algorithm %d", algo); + return Uuid(); + } +} + +int SymmetricCipher::algorithmIvSize(Algorithm algo) +{ + switch (algo) { + case ChaCha20: + return 12; + case Aes256: + return 16; + case Twofish: + return 16; + default: + qWarning("SymmetricCipher::algorithmIvSize: invalid algorithm %d", algo); + return -1; } } + +SymmetricCipher::Mode SymmetricCipher::algorithmMode(Algorithm algo) +{ + switch (algo) { + case ChaCha20: + return Stream; + case Aes256: + case Twofish: + return Cbc; + default: + qWarning("SymmetricCipher::algorithmMode: invalid algorithm %d", algo); + return InvalidMode; + } +} + +SymmetricCipher::Algorithm SymmetricCipher::algorithm() const +{ + return m_algo; +} |