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.