diff options
Diffstat (limited to 'src/Volume/Cipher.cpp')
-rw-r--r-- | src/Volume/Cipher.cpp | 107 |
1 files changed, 58 insertions, 49 deletions
diff --git a/src/Volume/Cipher.cpp b/src/Volume/Cipher.cpp index 40507a2d..d0fb7bd5 100644 --- a/src/Volume/Cipher.cpp +++ b/src/Volume/Cipher.cpp @@ -16,13 +16,11 @@ #include "Crypto/SerpentFast.h" #include "Crypto/Twofish.h" #include "Crypto/Camellia.h" -#include "Crypto/GostCipher.h" #include "Crypto/kuznyechik.h" #ifdef TC_AES_HW_CPU # include "Crypto/Aes_hw_cpu.h" #endif -#include "Crypto/cpu.h" extern "C" int IsAesHwCpuSupported () { @@ -32,7 +30,7 @@ extern "C" int IsAesHwCpuSupported () if (!stateValid) { - state = g_hasAESNI ? true : false; + state = HasAESNI() ? true : false; stateValid = true; } return state && VeraCrypt::Cipher::IsHwSupportEnabled(); @@ -96,12 +94,12 @@ namespace VeraCrypt CipherList l; l.push_back (shared_ptr <Cipher> (new CipherAES ())); + #ifndef WOLFCRYPT_BACKEND l.push_back (shared_ptr <Cipher> (new CipherSerpent ())); l.push_back (shared_ptr <Cipher> (new CipherTwofish ())); l.push_back (shared_ptr <Cipher> (new CipherCamellia ())); - l.push_back (shared_ptr <Cipher> (new CipherGost89 ())); l.push_back (shared_ptr <Cipher> (new CipherKuznyechik ())); - + #endif return l; } @@ -118,6 +116,37 @@ namespace VeraCrypt Initialized = true; } + #ifdef WOLFCRYPT_BACKEND + void Cipher::SetKeyXTS (const ConstBufferPtr &key) + { + if (key.Size() != GetKeySize ()) + throw ParameterIncorrect (SRC_POS); + + if (!Initialized) + ScheduledKey.Allocate (GetScheduledKeySize ()); + + SetCipherKeyXTS (key); + Key.CopyFrom (key); + Initialized = true; + } + + void Cipher::EncryptBlockXTS (byte *data, uint64 length, uint64 startDataUnitNo) const + { + if (!Initialized) + throw NotInitialized (SRC_POS); + + EncryptXTS (data, length, startDataUnitNo); + } + + void Cipher::DecryptBlockXTS (byte *data, uint64 length, uint64 startDataUnitNo) const + { + if (!Initialized) + throw NotInitialized (SRC_POS); + + DecryptXTS (data, length, startDataUnitNo); + } + #endif + #define TC_EXCEPTION(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE) #undef TC_EXCEPTION_NODECL #define TC_EXCEPTION_NODECL(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE) @@ -189,6 +218,26 @@ namespace VeraCrypt #endif Cipher::EncryptBlocks (data, blockCount); } + #ifdef WOLFCRYPT_BACKEND + void CipherAES::EncryptXTS (byte *data, uint64 length, uint64 startDataUnitNo) const + { + xts_encrypt (data, data, length, startDataUnitNo, (aes_encrypt_ctx *) ScheduledKey.Ptr()); + } + + void CipherAES::DecryptXTS (byte *data, uint64 length, uint64 startDataUnitNo) const + { + xts_decrypt (data, data, length, startDataUnitNo, (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx))); + } + + void CipherAES::SetCipherKeyXTS (const byte *key) + { + if (xts_encrypt_key256 (key, (aes_encrypt_ctx *) ScheduledKey.Ptr()) != EXIT_SUCCESS) + throw CipherInitError (SRC_POS); + + if (xts_decrypt_key256 (key, (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx))) != EXIT_SUCCESS) + throw CipherInitError (SRC_POS); + } + #endif size_t CipherAES::GetScheduledKeySize () const { @@ -203,7 +252,7 @@ namespace VeraCrypt if (!stateValid) { - state = g_hasAESNI ? true : false; + state = HasAESNI() ? true : false; stateValid = true; } return state && HwSupportEnabled; @@ -221,6 +270,7 @@ namespace VeraCrypt throw CipherInitError (SRC_POS); } + #ifndef WOLFCRYPT_BACKEND // Serpent void CipherSerpent::Decrypt (byte *data) const { @@ -400,48 +450,6 @@ namespace VeraCrypt #endif } - // GOST89 - void CipherGost89::Decrypt (byte *data) const - { - gost_decrypt (data, data, (gost_kds *) ScheduledKey.Ptr(), 1); - } - - void CipherGost89::Encrypt (byte *data) const - { - gost_encrypt (data, data, (gost_kds *) ScheduledKey.Ptr(), 1); - } - - size_t CipherGost89::GetScheduledKeySize () const - { - return GOST_KS; - } - - void CipherGost89::SetCipherKey (const byte *key) - { - gost_set_key (key, (gost_kds *) ScheduledKey.Ptr(), 1); - } - - // GOST89 with static SBOX - void CipherGost89StaticSBOX::Decrypt (byte *data) const - { - gost_decrypt (data, data, (gost_kds *) ScheduledKey.Ptr(), 1); - } - - void CipherGost89StaticSBOX::Encrypt (byte *data) const - { - gost_encrypt (data, data, (gost_kds *) ScheduledKey.Ptr(), 1); - } - - size_t CipherGost89StaticSBOX::GetScheduledKeySize () const - { - return GOST_KS; - } - - void CipherGost89StaticSBOX::SetCipherKey (const byte *key) - { - gost_set_key (key, (gost_kds *) ScheduledKey.Ptr(), 0); - } - // Kuznyechik void CipherKuznyechik::Decrypt (byte *data) const { @@ -510,5 +518,6 @@ namespace VeraCrypt return false; #endif } - bool Cipher::HwSupportEnabled = true; + #endif + bool Cipher::HwSupportEnabled = true; } |