/** * Encrypts and writes DB content to the given array. * In case of error emits a dbSaveError with error code and returns false. */ bool PwDatabaseV3::save(QByteArray& outData) { QString saveErrorMessage = tr("Cannot save database", "An error message"); outData.clear(); // pack up the groups&entries setPhaseProgressBounds(SAVE_PROGRESS_PACK_DATA); QByteArray contentData; int groupCount, entryCount; ErrorCode err = writeContent(contentData, groupCount, entryCount); if (err != SUCCESS) { emit dbSaveError(saveErrorMessage, err); return false; } // now update the header (hash and counts) header.setGroupCount(groupCount); header.setEntryCount(entryCount); LOG("Saving %d groups and %d entries", groupCount, entryCount); QByteArray contentHash; CryptoManager* cm = CryptoManager::instance(); if (cm->sha256(contentData, contentHash) != SB_SUCCESS) { emit dbSaveError(saveErrorMessage, CONTENT_HASHING_ERROR); return false; } header.setContentHash(contentHash); // update encryption seeds and transform the keys header.randomizeInitialVectors(); setPhaseProgressBounds(SAVE_PROGRESS_KEY_TRANSFORM); PwDatabase::ErrorCode dbErr = transformKey(header.getMasterSeed(), header.getTransformSeed(), header.getTransformRounds(), combinedKey, masterKey); if (dbErr != PwDatabase::SUCCESS) { LOG("transformKey error while saving: %d", dbErr); emit dbSaveError(saveErrorMessage, dbErr); return false; } // write the header QDataStream outStream(&outData, QIODevice::WriteOnly); outStream.setByteOrder(QDataStream::LittleEndian); header.write(outStream); // encrypt the content setPhaseProgressBounds(SAVE_PROGRESS_ENCRYPTION); QByteArray encryptedContentData; err = encryptContent(contentData, encryptedContentData); Util::safeClear(contentData); if (err != SUCCESS) { LOG("encryptContent error while saving: %d", err); emit dbSaveError(saveErrorMessage, err); return false; } outData.append(encryptedContentData); return true; }
bool PwDatabaseV3::readDatabase(const QByteArray& dbBytes) { QDataStream stream (dbBytes); stream.setByteOrder(QDataStream::LittleEndian); PwHeaderV3::ErrorCode headerErrCode = header.read(stream); if (headerErrCode != PwHeaderV3::SUCCESS) { LOG("%s: %d", PwHeaderV3::getErrorMessage(headerErrCode).toUtf8().constData(), headerErrCode); emit dbLoadError(PwHeaderV3::getErrorMessage(headerErrCode), headerErrCode); return false; } /* Calculate the encryption key */ setPhaseProgressBounds(UNLOCK_PROGRESS_KEY_TRANSFORM); PwDatabase::ErrorCode dbErr = transformKey(header.getMasterSeed(), header.getTransformSeed(), header.getTransformRounds(), combinedKey, masterKey); if (dbErr != PwDatabase::SUCCESS) { LOG("Cannot decrypt database - transformKey: %d", dbErr); emit dbLoadError(tr("Cannot decrypt database", "A generic error message"), dbErr); return false; } /* Decrypt data */ setPhaseProgressBounds(UNLOCK_PROGRESS_DECRYPTION); int dataSize = dbBytes.size() - header.HEADER_SIZE; // DB header not needed for decryption QByteArray dbBytesWithoutHeader = dbBytes.right(dataSize); QByteArray decryptedData(dataSize, 0); ErrorCode err = decryptData(dbBytesWithoutHeader, decryptedData); Util::safeClear(dbBytesWithoutHeader); if (err != SUCCESS) { if (err == DECRYPTED_PADDING_ERROR || err == DECRYPTED_CHECKSUM_MISMATCH) { LOG("Cannot decrypt database - decryptData: %d", err); emit invalidPasswordOrKey(); } else { // err == CANNOT_DECRYPT_DB // err == CONTENT_HASHING_ERROR // err == something else LOG("Cannot decrypt database - decryptData: %d", err); emit dbLoadError(tr("Cannot decrypt database", "An error message"), err); } return false; } /* Reading and parsing data*/ setPhaseProgressBounds(UNLOCK_PROGRESS_PARSE_DATA); QDataStream decryptedDataStream(decryptedData); decryptedDataStream.setByteOrder(QDataStream::LittleEndian); err = readContent(decryptedDataStream); Util::safeClear(decryptedData); if (err != SUCCESS) { emit dbLoadError(tr("Cannot parse database", "An error message. Parsing refers to the analysis/understanding of file content (do not confuse with reading it)."), err); return false; } return true; }
void DSTransformKeysCommand::redo() { /* The view is going to get MANY update() calls since every knob change will trigger a computeNodeRange() in DopeSheetView We explicitly disable update on the dopesheet view and re-enable it afterwards. */ DopeSheetView* view = _model->getDopesheetView(); view->setUpdatesEnabled(false); std::list<KnobHolderPtr> differentKnobs; for (TransformKeys::iterator it = _keys.begin(); it != _keys.end(); ++it) { KnobHolderPtr holder = it->first->getInternalKnob()->getHolder(); if (holder) { if ( std::find(differentKnobs.begin(), differentKnobs.end(), holder) == differentKnobs.end() ) { differentKnobs.push_back(holder); holder->beginChanges(); } } } if (!_firstRedoCalled) { for (TransformKeys::iterator it = _keys.begin(); it != _keys.end(); ++it) { it->second.oldCurve.reset( new Curve( *it->first->getInternalKnob()->getCurve( ViewIdx(0), it->first->getDimension() ) ) ); } for (TransformKeys::iterator it = _keys.begin(); it != _keys.end(); ++it) { for (DSKeyPtrList::iterator it2 = it->second.keys.begin(); it2 != it->second.keys.end(); ++it2) { transformKey(*it2); } } for (TransformKeys::iterator it = _keys.begin(); it != _keys.end(); ++it) { it->second.newCurve.reset( new Curve( *it->first->getInternalKnob()->getCurve( ViewIdx(0), it->first->getDimension() ) ) ); } _firstRedoCalled = true; } else { for (TransformKeys::iterator it = _keys.begin(); it != _keys.end(); ++it) { it->first->getInternalKnob()->cloneCurve(ViewIdx(0), it->first->getDimension(), *it->second.newCurve); } } for (std::list<KnobHolderPtr>::iterator it = differentKnobs.begin(); it != differentKnobs.end(); ++it) { (*it)->endChanges(); } view->setUpdatesEnabled(true); _model->refreshSelectionBboxAndRedrawView(); }
PS2KeyboardManager::Report PS2KeyboardManager::read() { if (ps2_keyboard_->available() > 0) processKey(transformKey(ps2_keyboard_->read())); // See page 62-63 in HID11_1.pdf for more details. Report report; report.modifiers |= isKeyPressed(PS2Keyboard::KC_LSHFT) ? M_LSHFT : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_LCTRL) ? M_LCTRL : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_LALT) ? M_LALT : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_LGUI) ? M_LGUI : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_RSHFT) ? M_RSHFT : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_RCTRL) ? M_RCTRL : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_RALT) ? M_RALT : 0; report.modifiers |= isKeyPressed(PS2Keyboard::KC_RGUI) ? M_RGUI : 0; collectKeysDown(&report); return report; }