Ejemplo n.º 1
0
/**
 * 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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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();
}
Ejemplo n.º 4
0
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;
}