20 #include "awssignaturev2.h"
21 #include "awssignaturev2_p.h"
23 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
24 #include "qmessageauthenticationcode.h"
26 #include <QMessageAuthenticationCode>
30 #include <QNetworkRequest>
54 Q_ASSERT((hashAlgorithm == QCryptographicHash::Sha1) || (hashAlgorithm == QCryptographicHash::Sha256));
56 d->hashAlgorithm = hashAlgorithm;
60 QNetworkRequest &request,
const QByteArray &data)
const
66 d->adornRequest(request, credentials);
69 const QByteArray stringToSign = d->canonicalRequest(operation, request.url());
70 const QString signature = QString::fromUtf8(QUrl::toPercentEncoding(QString::fromUtf8(
71 QMessageAuthenticationCode::hash(stringToSign, credentials.
secretKey().toUtf8(),
72 d->hashAlgorithm).toBase64())));
75 QUrl url = request.url();
76 url.setQuery(url.query() + QLatin1String(
"&Signature=") + signature);
136 QUrl url = request.url();
137 QUrlQuery query(url);
139 setQueryItem(query, QLatin1String(
"SignatureVersion"), QLatin1String(
"2"));
142 QString::fromUtf8(QUrl::toPercentEncoding(
143 QDateTime::currentDateTimeUtc().toString(QLatin1String(
"yyyy-MM-ddThh:mm:ssZ"))
148 if (query != QUrlQuery(url)) {
149 qDebug() << Q_FUNC_INFO << url;
151 qDebug() << Q_FUNC_INFO << url;
185 const QUrl &url)
const
187 return httpMethod(operation).toUtf8() +
'\n' +
188 url.host().toUtf8() +
'\n' +
213 case QCryptographicHash::Sha1:
return "HmacSHA1";
214 case QCryptographicHash::Sha256:
return "HmacSHA256";
216 Q_ASSERT_X(
false, Q_FUNC_INFO,
"invalid algorithm");
217 return "invalid-algorithm";
bool setQueryItem(QUrlQuery &query, const QString &key, const QString &value, const bool warnOnNonIdenticalDuplicate=true) const
Set a query item, checking for existing values first.
virtual void sign(const AwsAbstractCredentials &credentials, const QNetworkAccessManager::Operation operation, QNetworkRequest &request, const QByteArray &data=QByteArray()) const
Sign an AWS request.
Implements AWS Signature Version 2.
Private implementation for AwsAbstractSignature.
QByteArray canonicalQuery(const QUrlQuery &query) const
Create an AWS Signature canonical query.
virtual QString secretKey() const =0
AWS secret access key for this credentials object.
QByteArray canonicalRequest(const QNetworkAccessManager::Operation operation, const QUrl &url) const
Create an AWS V2 Signature canonical request.
Interface class for providing AWS credentials.
QCryptographicHash::Algorithm hashAlgorithm
Hash algorithm to use when signing.
Private implementation for AwsSignatureV2.
AwsSignatureV2(const QCryptographicHash::Algorithm hashAlgorithm=QCryptographicHash::Sha256)
Constructs a new AwsSignatureV2 object.
virtual QString accessKeyId() const =0
AWS access key ID for this credentials object.
virtual int version() const
AWS Signature version implemented by this class.
void adornRequest(QNetworkRequest &request, const AwsAbstractCredentials &credentials) const
Add AWS Signature Version 2 adornments to an AWS request.
QString httpMethod(const QNetworkAccessManager::Operation operation) const
Create an AWS Signature request method string.
Interface class for providing AWS signatures.
QByteArray signatureMethod(const QCryptographicHash::Algorithm algorithm) const
Create an AWS V2 Signature method designation.
AwsSignatureV2Private(AwsSignatureV2 *const q)
Constructs a new AwsSignatureV2Private object.
QString canonicalPath(const QUrl &url) const
Create an AWS Signature canonical path.