void VolumeHeader::EncryptNew (const BufferPtr &newHeaderBuffer, const ConstBufferPtr &newSalt, const ConstBufferPtr &newHeaderKey, shared_ptr <Pkcs5Kdf> newPkcs5Kdf) { if (newHeaderBuffer.Size() != HeaderSize || newSalt.Size() != SaltSize) throw ParameterIncorrect (SRC_POS); shared_ptr <EncryptionMode> mode = EA->GetMode()->GetNew(); shared_ptr <EncryptionAlgorithm> ea = EA->GetNew(); if (typeid (*mode) == typeid (EncryptionModeXTS)) { mode->SetKey (newHeaderKey.GetRange (EA->GetKeySize(), EA->GetKeySize())); ea->SetKey (newHeaderKey.GetRange (0, ea->GetKeySize())); } else { mode->SetKey (newHeaderKey.GetRange (0, mode->GetKeySize())); ea->SetKey (newHeaderKey.GetRange (LegacyEncryptionModeKeyAreaSize, ea->GetKeySize())); } ea->SetMode (mode); newHeaderBuffer.CopyFrom (newSalt); BufferPtr headerData = newHeaderBuffer.GetRange (EncryptedHeaderDataOffset, EncryptedHeaderDataSize); Serialize (headerData); ea->Encrypt (headerData); if (newPkcs5Kdf) Pkcs5 = newPkcs5Kdf; }
void EncryptionTestDialog::EncryptOrDecrypt (bool encrypt) { try { bool xts = XtsModeCheckBox->IsChecked(); shared_ptr <EncryptionAlgorithm> ea = GetSelectedEncryptionAlgorithm(); Buffer key; GetTextCtrlData (KeyTextCtrl, key); if (key.Size() != ea->GetKeySize()) throw_err (LangString["TEST_KEY_SIZE"]); ea->SetKey (key); Buffer data; GetTextCtrlData (encrypt ? PlainTextTextCtrl : CipherTextTextCtrl, data); if (data.Size() != ea->GetMaxBlockSize()) throw_err (LangString[encrypt ? "TEST_PLAINTEXT_SIZE" : "TEST_CIPHERTEXT_SIZE"]); if (xts) { Buffer secondaryKey; GetTextCtrlData (SecondaryKeyTextCtrl, secondaryKey); if (secondaryKey.Size() != ea->GetKeySize()) throw_err (LangString["TEST_INCORRECT_SECONDARY_KEY_SIZE"]); uint64 dataUnitNumber; size_t blockNumber; try { dataUnitNumber = StringConverter::ToUInt64 (wstring (DataUnitNumberTextCtrl->GetValue())); } catch (...) { DataUnitNumberTextCtrl->SetFocus(); throw StringConversionFailed (SRC_POS); } try { blockNumber = StringConverter::ToUInt32 (wstring (BlockNumberTextCtrl->GetValue())); if (blockNumber > 31) { blockNumber = 31; BlockNumberTextCtrl->SetValue (L"31"); } } catch (...) { BlockNumberTextCtrl->SetFocus(); throw StringConversionFailed (SRC_POS); } shared_ptr <EncryptionMode> xts (new EncryptionModeXTS); xts->SetKey (secondaryKey); ea->SetMode (xts); Buffer sector (ENCRYPTION_DATA_UNIT_SIZE); BufferPtr block = sector.GetRange (blockNumber * ea->GetMaxBlockSize(), ea->GetMaxBlockSize()); block.CopyFrom (data); if (encrypt) ea->EncryptSectors (sector, dataUnitNumber, 1, sector.Size()); else ea->DecryptSectors (sector, dataUnitNumber, 1, sector.Size()); data.CopyFrom (block); } else { if (encrypt) ea->GetCiphers().front()->EncryptBlock (data); else ea->GetCiphers().front()->DecryptBlock (data); } SetTextCtrlData (encrypt ? CipherTextTextCtrl : PlainTextTextCtrl, data); } catch (exception &e) { Gui->ShowError (e); } }
static int fuse_service_read (const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { try { if (!FuseService::CheckAccessRights()) return -EACCES; if (strcmp (path, FuseService::GetVolumeImagePath()) == 0) { try { // Test for read beyond the end of the volume if ((uint64) offset + size > FuseService::GetVolumeSize()) size = FuseService::GetVolumeSize() - offset; size_t sectorSize = FuseService::GetVolumeSectorSize(); if (size % sectorSize != 0 || offset % sectorSize != 0) { // Support for non-sector-aligned read operations is required by some loop device tools // which may analyze the volume image before attaching it as a device uint64 alignedOffset = offset - (offset % sectorSize); uint64 alignedSize = size + (offset % sectorSize); if (alignedSize % sectorSize != 0) alignedSize += sectorSize - (alignedSize % sectorSize); SecureBuffer alignedBuffer (alignedSize); FuseService::ReadVolumeSectors (alignedBuffer, alignedOffset); BufferPtr ((byte *) buf, size).CopyFrom (alignedBuffer.GetRange (offset % sectorSize, size)); } else { FuseService::ReadVolumeSectors (BufferPtr ((byte *) buf, size), offset); } } catch (MissingVolumeData) { return 0; } return size; } if (strcmp (path, FuseService::GetControlPath()) == 0) { shared_ptr <Buffer> infoBuf = FuseService::GetVolumeInfo(); BufferPtr outBuf ((byte *)buf, size); if (offset >= (off_t) infoBuf->Size()) return 0; if (offset + size > infoBuf->Size()) size = infoBuf->Size () - offset; outBuf.CopyFrom (infoBuf->GetRange (offset, size)); return size; } } catch (...) { return FuseService::ExceptionToErrorCode(); } return -ENOENT; }