16 #include <openssl/x509_vfy.h> 20 #include <QSslCertificate> 32 qWarning() <<
"PaymentRequestPlus::parse: Error parsing payment request";
43 qWarning() <<
"PaymentRequestPlus::parse: Error parsing payment details";
69 const EVP_MD* digestAlgorithm = NULL;
71 digestAlgorithm = EVP_sha256();
74 digestAlgorithm = EVP_sha1();
77 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: pki_type == none";
81 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: unknown pki_type " << QString::fromStdString(
paymentRequest.
pki_type());
87 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: error parsing pki_data";
91 std::vector<X509*> certs;
92 const QDateTime currentTime = QDateTime::currentDateTime();
95 QSslCertificate qCert(certData, QSsl::Der);
96 if (currentTime < qCert.effectiveDate() || currentTime > qCert.expiryDate()) {
97 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: certificate expired or not yet active: " << qCert;
100 #if QT_VERSION >= 0x050000 101 if (qCert.isBlacklisted()) {
102 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: certificate blacklisted: " << qCert;
106 const unsigned char *
data = (
const unsigned char *)certChain.
certificate(i).data();
109 certs.push_back(cert);
112 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: empty certificate chain";
118 STACK_OF(X509) *chain = sk_X509_new_null();
119 for (
int i = certs.size() - 1; i > 0; i--) {
120 sk_X509_push(chain, certs[i]);
122 X509 *signing_cert = certs[0];
126 X509_STORE_CTX *store_ctx = X509_STORE_CTX_new();
128 qWarning() <<
"PaymentRequestPlus::getMerchant: Payment request: error creating X509_STORE_CTX";
132 char *website = NULL;
136 if (!X509_STORE_CTX_init(store_ctx, certStore, signing_cert, chain))
138 int error = X509_STORE_CTX_get_error(store_ctx);
143 int result = X509_verify_cert(store_ctx);
145 int error = X509_STORE_CTX_get_error(store_ctx);
151 qDebug() <<
"PaymentRequestPlus::getMerchant: Allowing self signed root certificate, because -allowselfsignedrootcertificates is true.";
154 X509_NAME *certname = X509_get_subject_name(signing_cert);
159 std::string data_to_verify;
160 rcopy.SerializeToString(&data_to_verify);
162 #if OPENSSL_VERSION_NUMBER >= 0x10100000L 163 EVP_MD_CTX *
ctx = EVP_MD_CTX_new();
171 EVP_PKEY *pubkey = X509_get_pubkey(signing_cert);
173 EVP_MD_CTX_init(
ctx);
174 if (!EVP_VerifyInit_ex(
ctx, digestAlgorithm, NULL) ||
175 !EVP_VerifyUpdate(
ctx, data_to_verify.data(), data_to_verify.size()) ||
180 #if OPENSSL_VERSION_NUMBER >= 0x10100000L 181 EVP_MD_CTX_free(
ctx);
185 int textlen = X509_NAME_get_text_by_NID(certname, NID_commonName, NULL, 0);
186 website =
new char[textlen + 1];
187 if (X509_NAME_get_text_by_NID(certname, NID_commonName, website, textlen + 1) == textlen && textlen > 0) {
197 qWarning() <<
"PaymentRequestPlus::getMerchant: SSL error: " <<
err.what();
202 X509_STORE_CTX_free(store_ctx);
203 for (
unsigned int i = 0; i < certs.size(); i++)
211 QList<std::pair<CScript,CAmount> >
result;
const ::std::string & pki_data() const
SSLVerifyError(std::string err)
const ::std::string & serialized_payment_details() const
int certificate_size() const
const ::payments::Output & outputs(int index) const
bool parse(const QByteArray &data)
bool IsInitialized() const
bool IsInitialized() const
static const bool DEFAULT_SELFSIGNED_ROOTCERTS
const ::std::string & signature() const
const ::std::string & script() const
void set_signature(const ::std::string &value)
bool SerializeToString(std::string *output) const
bool GetBoolArg(const std::string &strArg, bool fDefault)
bool getMerchant(X509_STORE *certStore, QString &merchant) const
static secp256k1_context * ctx
static bool error(const char *format)
inline ::google::protobuf::uint64 amount() const
const ::std::string & certificate(int index) const
const ::std::string & pki_type() const
payments::PaymentRequest paymentRequest
QList< std::pair< CScript, CAmount > > getPayTo() const
payments::PaymentDetails details
inline ::google::protobuf::uint32 payment_details_version() const