From 2ec2dbed67f8d4af562953f8199856e4ed181523 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Mon, 24 Nov 2014 11:01:17 +0100 Subject: QSslEllipticCurve: add fromLongName Since the conversion to a long name was already there, also support creation from a long name. Change-Id: Iad712db7447fb0a0a18f600b7db54da5b5b87154 Reviewed-by: Marc Mutz --- src/network/ssl/qsslellipticcurve.cpp | 13 +++++++++++++ src/network/ssl/qsslellipticcurve.h | 1 + src/network/ssl/qsslellipticcurve_dummy.cpp | 6 ++++++ src/network/ssl/qsslellipticcurve_openssl.cpp | 20 ++++++++++++++++++++ src/network/ssl/qsslsocket_openssl_symbols.cpp | 2 ++ src/network/ssl/qsslsocket_openssl_symbols_p.h | 1 + 6 files changed, 43 insertions(+) (limited to 'src/network') diff --git a/src/network/ssl/qsslellipticcurve.cpp b/src/network/ssl/qsslellipticcurve.cpp index 7e122557df..d70975591d 100644 --- a/src/network/ssl/qsslellipticcurve.cpp +++ b/src/network/ssl/qsslellipticcurve.cpp @@ -92,6 +92,19 @@ QT_BEGIN_NAMESPACE \sa shortName() */ +/*! + \fn QSslEllipticCurve QSslEllipticCurve::fromLongName(const QString &name) + + Returns an QSslEllipticCurve instance representing the named curve \a name. + The \a name is a long name for the curve, whose exact spelling depends on the + SSL implementation. + + If the given \a name is not supported, returns an invalid QSslEllipticCurve instance. + + \note The OpenSSL implementation of this function treats the name case-sensitively. + + \sa longName() +*/ /*! \fn QString QSslEllipticCurve::shortName() const diff --git a/src/network/ssl/qsslellipticcurve.h b/src/network/ssl/qsslellipticcurve.h index 6d2a764d87..70bc3cb8cb 100644 --- a/src/network/ssl/qsslellipticcurve.h +++ b/src/network/ssl/qsslellipticcurve.h @@ -63,6 +63,7 @@ public: } Q_NETWORK_EXPORT static QSslEllipticCurve fromShortName(const QString &name); + Q_NETWORK_EXPORT static QSslEllipticCurve fromLongName(const QString &name); Q_NETWORK_EXPORT QString shortName() const Q_REQUIRED_RESULT; Q_NETWORK_EXPORT QString longName() const Q_REQUIRED_RESULT; diff --git a/src/network/ssl/qsslellipticcurve_dummy.cpp b/src/network/ssl/qsslellipticcurve_dummy.cpp index 64ac1514ab..1c76b56132 100644 --- a/src/network/ssl/qsslellipticcurve_dummy.cpp +++ b/src/network/ssl/qsslellipticcurve_dummy.cpp @@ -59,6 +59,12 @@ QSslEllipticCurve QSslEllipticCurve::fromShortName(const QString &name) return QSslEllipticCurve(); } +QSslEllipticCurve QSslEllipticCurve::fromLongName(const QString &name) +{ + Q_UNUSED(name); + return QSslEllipticCurve(); +} + bool QSslEllipticCurve::isTlsNamedCurve() const { return false; diff --git a/src/network/ssl/qsslellipticcurve_openssl.cpp b/src/network/ssl/qsslellipticcurve_openssl.cpp index d8d1307b2e..e8f6cfee9e 100644 --- a/src/network/ssl/qsslellipticcurve_openssl.cpp +++ b/src/network/ssl/qsslellipticcurve_openssl.cpp @@ -103,6 +103,26 @@ QSslEllipticCurve QSslEllipticCurve::fromShortName(const QString &name) return result; } +QSslEllipticCurve QSslEllipticCurve::fromLongName(const QString &name) +{ + if (name.isEmpty()) + return QSslEllipticCurve(); + + QSslSocketPrivate::ensureInitialized(); + + QSslEllipticCurve result; + +#ifndef OPENSSL_NO_EC + const QByteArray curveNameLatin1 = name.toLatin1(); + + int nid = q_OBJ_ln2nid(curveNameLatin1.data()); + result.id = nid; +#endif + + return result; +} + + // The brainpool curve NIDs (RFC 7027) have been introduced in OpenSSL 1.0.2, // redefine them here to make Qt compile with previous versions of OpenSSL // (yet correctly recognize them as TLS named curves). diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index ef87e77a3e..a2f8c7f592 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -179,6 +179,7 @@ DEFINEFUNC2(int, i2d_X509, X509 *a, a, unsigned char **b, b, return -1, return) DEFINEFUNC(const char *, OBJ_nid2sn, int a, a, return 0, return) DEFINEFUNC(const char *, OBJ_nid2ln, int a, a, return 0, return) DEFINEFUNC(int, OBJ_sn2nid, const char *s, s, return 0, return) +DEFINEFUNC(int, OBJ_ln2nid, const char *s, s, return 0, return) DEFINEFUNC3(int, i2t_ASN1_OBJECT, char *a, a, int b, b, ASN1_OBJECT *c, c, return -1, return) DEFINEFUNC4(int, OBJ_obj2txt, char *a, a, int b, b, ASN1_OBJECT *c, c, int d, d, return -1, return) @@ -774,6 +775,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(OBJ_nid2sn) RESOLVEFUNC(OBJ_nid2ln) RESOLVEFUNC(OBJ_sn2nid) + RESOLVEFUNC(OBJ_ln2nid) RESOLVEFUNC(i2t_ASN1_OBJECT) RESOLVEFUNC(OBJ_obj2txt) RESOLVEFUNC(OBJ_obj2nid) diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h index 04cfd83de5..f2cc8a87fc 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols_p.h +++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h @@ -259,6 +259,7 @@ int q_i2d_X509(X509 *a, unsigned char **b); const char *q_OBJ_nid2sn(int a); const char *q_OBJ_nid2ln(int a); int q_OBJ_sn2nid(const char *s); +int q_OBJ_ln2nid(const char *s); int q_i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *obj); int q_OBJ_obj2txt(char *buf, int buf_len, ASN1_OBJECT *obj, int no_name); int q_OBJ_obj2nid(const ASN1_OBJECT *a); -- cgit v1.2.3