Skip to content

Commit 320a91b

Browse files
committed
Port QSslCertificate to openssl 1.1
Change-Id: Ic87c295e401af567db9775f7aa42c5e115b1c215
1 parent 3c6a7a9 commit 320a91b

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

src/network/ssl/qsslcertificate_openssl.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ bool QSslCertificate::operator==(const QSslCertificate &other) const
6464
uint qHash(const QSslCertificate &key, uint seed) Q_DECL_NOTHROW
6565
{
6666
if (X509 * const x509 = key.d->x509) {
67-
(void)q_X509_cmp(x509, x509); // populate x509->sha1_hash
68-
// (if someone knows a better way...)
69-
return qHashBits(x509->sha1_hash, SHA_DIGEST_LENGTH, seed);
67+
unsigned int len;
68+
unsigned char md[EVP_MAX_MD_SIZE];
69+
const EVP_MD *sha1 = q_EVP_sha1();
70+
71+
q_X509_digest(x509, sha1, md, &len);
72+
return qHashBits(md, len, seed);
7073
} else {
7174
return seed;
7275
}
@@ -89,8 +92,7 @@ QByteArray QSslCertificate::version() const
8992
{
9093
QMutexLocker lock(QMutexPool::globalInstanceGet(d.data()));
9194
if (d->versionString.isEmpty() && d->x509)
92-
d->versionString =
93-
QByteArray::number(qlonglong(q_ASN1_INTEGER_get(d->x509->cert_info->version)) + 1);
95+
d->versionString = QByteArray::number(qlonglong(q_X509_get_version(d->x509)) + 1);
9496

9597
return d->versionString;
9698
}
@@ -99,7 +101,7 @@ QByteArray QSslCertificate::serialNumber() const
99101
{
100102
QMutexLocker lock(QMutexPool::globalInstanceGet(d.data()));
101103
if (d->serialNumberString.isEmpty() && d->x509) {
102-
ASN1_INTEGER *serialNumber = d->x509->cert_info->serialNumber;
104+
ASN1_INTEGER *serialNumber = q_X509_get_serialNumber(d->x509);
103105
QByteArray hexString;
104106
hexString.reserve(serialNumber->length * 3);
105107
for (int a = 0; a < serialNumber->length; ++a) {
@@ -235,25 +237,26 @@ QSslKey QSslCertificate::publicKey() const
235237
QSslKey key;
236238

237239
key.d->type = QSsl::PublicKey;
238-
X509_PUBKEY *xkey = d->x509->cert_info->key;
239-
EVP_PKEY *pkey = q_X509_PUBKEY_get(xkey);
240+
EVP_PKEY *pkey = q_X509_get_pubkey(d->x509);
240241
Q_ASSERT(pkey);
241242

242-
if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_RSA) {
243+
int keyType = q_EVP_PKEY_type(q_EVP_PKEY_base_id(pkey));
244+
245+
if (keyType == EVP_PKEY_RSA) {
243246
key.d->rsa = q_EVP_PKEY_get1_RSA(pkey);
244247
key.d->algorithm = QSsl::Rsa;
245248
key.d->isNull = false;
246-
} else if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_DSA) {
249+
} else if (keyType == EVP_PKEY_DSA) {
247250
key.d->dsa = q_EVP_PKEY_get1_DSA(pkey);
248251
key.d->algorithm = QSsl::Dsa;
249252
key.d->isNull = false;
250253
#ifndef OPENSSL_NO_EC
251-
} else if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_EC) {
254+
} else if (keyType == EVP_PKEY_EC) {
252255
key.d->ec = q_EVP_PKEY_get1_EC_KEY(pkey);
253256
key.d->algorithm = QSsl::Ec;
254257
key.d->isNull = false;
255258
#endif
256-
} else if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_DH) {
259+
} else if (keyType == EVP_PKEY_DH) {
257260
// DH unsupported
258261
} else {
259262
// error?

src/network/ssl/qsslsocket_openssl_symbols.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ DEFINEFUNC3(int, EVP_CipherFinal, EVP_CIPHER_CTX *ctx, ctx, unsigned char *out,
179179
DEFINEFUNC(const EVP_CIPHER *, EVP_des_cbc, DUMMYARG, DUMMYARG, return 0, return)
180180
DEFINEFUNC(const EVP_CIPHER *, EVP_des_ede3_cbc, DUMMYARG, DUMMYARG, return 0, return)
181181
DEFINEFUNC(const EVP_CIPHER *, EVP_rc2_cbc, DUMMYARG, DUMMYARG, return 0, return)
182+
DEFINEFUNC(const EVP_MD *, EVP_sha1, DUMMYARG, DUMMYARG, return 0, return)
182183
DEFINEFUNC3(int, EVP_PKEY_assign, EVP_PKEY *a, a, int b, b, char *c, c, return -1, return)
183184
DEFINEFUNC2(int, EVP_PKEY_set1_RSA, EVP_PKEY *a, a, RSA *b, b, return -1, return)
184185
DEFINEFUNC2(int, EVP_PKEY_set1_DSA, EVP_PKEY *a, a, DSA *b, b, return -1, return)
@@ -193,6 +194,7 @@ DEFINEFUNC(EC_KEY *, EVP_PKEY_get1_EC_KEY, EVP_PKEY *a, a, return 0, return)
193194
#endif
194195
DEFINEFUNC(EVP_PKEY *, EVP_PKEY_new, DUMMYARG, DUMMYARG, return 0, return)
195196
DEFINEFUNC(int, EVP_PKEY_type, int a, a, return NID_undef, return)
197+
DEFINEFUNC(int, EVP_PKEY_base_id, EVP_PKEY *a, a, return NID_undef, return)
196198
DEFINEFUNC2(int, i2d_X509, X509 *a, a, unsigned char **b, b, return -1, return)
197199
DEFINEFUNC(const char *, OBJ_nid2sn, int a, a, return 0, return)
198200
DEFINEFUNC(const char *, OBJ_nid2ln, int a, a, return 0, return)
@@ -357,6 +359,7 @@ DEFINEFUNC2(int, X509_cmp, X509 *a, a, X509 *b, b, return -1, return)
357359
DEFINEFUNC(X509 *, X509_dup, X509 *a, a, return 0, return)
358360
#endif
359361
DEFINEFUNC2(void, X509_print, BIO *a, a, X509 *b, b, return, DUMMYARG);
362+
DEFINEFUNC4(int, X509_digest, const X509 *x509, x509, const EVP_MD *type, type, unsigned char *md, md, unsigned int *len, len, return -1, return)
360363
DEFINEFUNC(ASN1_OBJECT *, X509_EXTENSION_get_object, X509_EXTENSION *a, a, return 0, return)
361364
DEFINEFUNC(void, X509_free, X509 *a, a, return, DUMMYARG)
362365
DEFINEFUNC2(X509_EXTENSION *, X509_get_ext, X509 *a, a, int b, b, return 0, return)
@@ -376,6 +379,9 @@ DEFINEFUNC2(int, ASN1_STRING_print, BIO *a, a, ASN1_STRING *b, b, return 0, retu
376379
DEFINEFUNC2(int, X509_check_issued, X509 *a, a, X509 *b, b, return -1, return)
377380
DEFINEFUNC(X509_NAME *, X509_get_issuer_name, X509 *a, a, return 0, return)
378381
DEFINEFUNC(X509_NAME *, X509_get_subject_name, X509 *a, a, return 0, return)
382+
DEFINEFUNC(long, X509_get_version, X509 *a, a, return -1, return)
383+
DEFINEFUNC(ASN1_INTEGER *, X509_get_serialNumber, X509 *a, a, return 0, return)
384+
DEFINEFUNC(EVP_PKEY *, X509_get_pubkey, X509 *a, a, return 0, return)
379385
DEFINEFUNC(int, X509_verify_cert, X509_STORE_CTX *a, a, return -1, return)
380386
DEFINEFUNC(int, X509_NAME_entry_count, X509_NAME *a, a, return 0, return)
381387
DEFINEFUNC2(X509_NAME_ENTRY *, X509_NAME_get_entry, X509_NAME *a, a, int b, b, return 0, return)
@@ -812,6 +818,7 @@ bool q_resolveOpenSslSymbols()
812818
RESOLVEFUNC(EVP_des_cbc)
813819
RESOLVEFUNC(EVP_des_ede3_cbc)
814820
RESOLVEFUNC(EVP_rc2_cbc)
821+
RESOLVEFUNC(EVP_sha1)
815822
RESOLVEFUNC(EVP_PKEY_assign)
816823
RESOLVEFUNC(EVP_PKEY_set1_RSA)
817824
RESOLVEFUNC(EVP_PKEY_set1_DSA)
@@ -826,6 +833,7 @@ bool q_resolveOpenSslSymbols()
826833
#endif
827834
RESOLVEFUNC(EVP_PKEY_new)
828835
RESOLVEFUNC(EVP_PKEY_type)
836+
RESOLVEFUNC(EVP_PKEY_base_id)
829837
RESOLVEFUNC(OBJ_nid2sn)
830838
RESOLVEFUNC(OBJ_nid2ln)
831839
RESOLVEFUNC(OBJ_sn2nid)
@@ -979,6 +987,9 @@ bool q_resolveOpenSslSymbols()
979987
RESOLVEFUNC(X509_check_issued)
980988
RESOLVEFUNC(X509_get_issuer_name)
981989
RESOLVEFUNC(X509_get_subject_name)
990+
RESOLVEFUNC(X509_get_version)
991+
RESOLVEFUNC(X509_get_serialNumber)
992+
RESOLVEFUNC(X509_get_pubkey)
982993
RESOLVEFUNC(X509_verify_cert)
983994
RESOLVEFUNC(d2i_X509)
984995
RESOLVEFUNC(i2d_X509)

src/network/ssl/qsslsocket_openssl_symbols_p.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ int q_EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
267267
const EVP_CIPHER *q_EVP_des_cbc();
268268
const EVP_CIPHER *q_EVP_des_ede3_cbc();
269269
const EVP_CIPHER *q_EVP_rc2_cbc();
270+
const EVP_MD *q_EVP_sha1();
270271
int q_EVP_PKEY_assign(EVP_PKEY *a, int b, char *c);
271272
Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_RSA(EVP_PKEY *a, RSA *b);
272273
int q_EVP_PKEY_set1_DSA(EVP_PKEY *a, DSA *b);
@@ -279,6 +280,7 @@ DSA *q_EVP_PKEY_get1_DSA(EVP_PKEY *a);
279280
#ifndef OPENSSL_NO_EC
280281
EC_KEY *q_EVP_PKEY_get1_EC_KEY(EVP_PKEY *a);
281282
#endif
283+
int q_EVP_PKEY_base_id(EVP_PKEY *a);
282284
int q_EVP_PKEY_type(int a);
283285
Q_AUTOTEST_EXPORT EVP_PKEY *q_EVP_PKEY_new();
284286
int q_i2d_X509(X509 *a, unsigned char **b);
@@ -450,6 +452,7 @@ void *q_ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x);
450452
X509 *q_X509_dup(X509 *a);
451453
#endif
452454
void q_X509_print(BIO *a, X509*b);
455+
int q_X509_digest(const X509 *x509, const EVP_MD *type, unsigned char *md, unsigned int *len);
453456
ASN1_OBJECT *q_X509_EXTENSION_get_object(X509_EXTENSION *a);
454457
void q_X509_free(X509 *a);
455458
X509_EXTENSION *q_X509_get_ext(X509 *a, int b);
@@ -469,6 +472,9 @@ int q_ASN1_STRING_print(BIO *a, ASN1_STRING *b);
469472
int q_X509_check_issued(X509 *a, X509 *b);
470473
X509_NAME *q_X509_get_issuer_name(X509 *a);
471474
X509_NAME *q_X509_get_subject_name(X509 *a);
475+
long q_X509_get_version(X509 *a);
476+
ASN1_INTEGER *q_X509_get_serialNumber(X509 *a);
477+
EVP_PKEY *q_X509_get_pubkey(X509 *a);
472478
int q_X509_verify_cert(X509_STORE_CTX *ctx);
473479
int q_X509_NAME_entry_count(X509_NAME *a);
474480
X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b);

0 commit comments

Comments
 (0)