QString OAuthPrivate::buildAuthHeader(const QString & method, const QString & url, const Params & data, const QString & verifier)
{
    QMap<QString, QString> params;

    params.insert("oauth_consumer_key", consumerKey.toAscii());
    params.insert("oauth_nonce", Helper::identifier(42));
    params.insert("oauth_signature_method", "HMAC-SHA1");
    params.insert("oauth_timestamp", QString("%1").arg(Helper::timestamp()));
    params.insert("oauth_version", "1.0");

    if(!verifier.isEmpty())
        params.insert("oauth_verifier", verifier);

    if(!oauthToken.isEmpty())
        params.insert("oauth_token", oauthToken.toAscii());

    params.unite(data);

    QString authStr;
    Params::const_iterator i = params.constBegin();

    params.insert("oauth_signature", signature(signingKey(consumerSecret, oauthTokenSecret), baseString(method, url, paramsString(params))));

    while (i != params.constEnd()){
        authStr += QUrl::toPercentEncoding(i.key()) + "=\"" + QUrl::toPercentEncoding(i.value()) + "\", ";
        ++i;
    }

    return authStr.mid(0, authStr.length() - 2);
}
bool PaymentCode::Sign(
    const uint32_t nym,
    const Credential& credential,
    proto::Signature& sig,
    const OTPasswordData* pPWData) const
{
    if (!pubkey_) {
        otErr << __FUNCTION__ << ": Payment code not instantiated.\n";
        return false;
    }

    serializedAsymmetricKey privatekey =
        App::Me().Crypto().BIP32().GetPaymentCode(nym);

    if (!privatekey) {
        otErr << __FUNCTION__ << ": Failed to derive private key for"
              << " payment code.\n";
        return false;
    }

    OTData existingKeyData, compareKeyData;
    serializedAsymmetricKey compareKey =
    App::Me().Crypto().BIP32().PrivateToPublic(*privatekey);
    compareKey->clear_path();

    std::dynamic_pointer_cast<AsymmetricKeySecp256k1>
        (pubkey_)->GetKey(existingKeyData);
    compareKeyData.Assign(compareKey->key().c_str(), compareKey->key().size());

    if (!(existingKeyData == compareKeyData)) {
        otErr << __FUNCTION__ << ": Private key is not valid for this"
        << " payment code.\n";
        return false;
    }
    std::unique_ptr<OTAsymmetricKey>
        signingKey(OTAsymmetricKey::KeyFactory(*privatekey));

        serializedCredential serialized = credential.asSerialized(
            Credential::AS_PUBLIC,
            Credential::WITHOUT_SIGNATURES);

    bool goodSig = signingKey->Sign(
        proto::ProtoAsData<proto::Credential>(*serialized),
        sig,
        pPWData,
        nullptr,
        ID(),
        proto::SIGROLE_NYMIDSOURCE);

    return goodSig;
}