Skip to content

Commit

Permalink
remove boost dep, add noexcept annotation
Browse files Browse the repository at this point in the history
  • Loading branch information
bradclawsie committed Aug 20, 2014
1 parent 9450a3e commit f817b9a
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 30 deletions.
41 changes: 26 additions & 15 deletions awsv4.cpp
Expand Up @@ -2,8 +2,19 @@

namespace AWSV4 {

const std::string join(const std::vector<std::string>& ss,const std::string delim) noexcept {
std::stringstream sstream;
const auto l = ss.size() - 1;
std::vector<int>::size_type i;
for (i = 0; i < l; i++) {
sstream << ss.at(i) << delim;
}
sstream << ss.back();
return sstream.str();
}

// http://stackoverflow.com/questions/2262386/generate-sha256-with-openssl-and-c
void sha256(const std::string str, unsigned char outputBuffer[SHA256_DIGEST_LENGTH]) {
void sha256(const std::string str, unsigned char outputBuffer[SHA256_DIGEST_LENGTH]) noexcept {
char *c_string = new char [str.length()+1];
std::strcpy(c_string, str.c_str());
unsigned char hash[SHA256_DIGEST_LENGTH];
Expand All @@ -16,7 +27,7 @@ namespace AWSV4 {
}
}

const std::string sha256_base16(const std::string str) {
const std::string sha256_base16(const std::string str) noexcept {
unsigned char hashOut[SHA256_DIGEST_LENGTH];
AWSV4::sha256(str,hashOut);
char outputBuffer[65];
Expand All @@ -34,15 +45,15 @@ namespace AWSV4 {
// uri should be normalize()'d before calling here, as this takes a const ref param and we don't
// want to normalize repeatedly. the return value is not a uri specifically, but a uri fragment,
// as such the return value should not be used to initialize a uri object
const std::string canonicalize_uri(const Poco::URI& uri) {
const std::string canonicalize_uri(const Poco::URI& uri) noexcept {
const auto p = uri.getPath();
if (p.empty()) return "/";
std::string encoded_path;
Poco::URI::encode(uri.getPath(),"",encoded_path);
return encoded_path;
}

const std::string canonicalize_query(const Poco::URI& uri) {
const std::string canonicalize_query(const Poco::URI& uri) noexcept {
const std::string query_delim{"&"};
const auto q = uri.getQuery();
if (q.empty()) return "";
Expand All @@ -54,12 +65,12 @@ namespace AWSV4 {
parts.push_back(encoded_arg);
}
std::sort(parts.begin(),parts.end());
return boost::algorithm::join(parts,query_delim);
return join(parts,query_delim);
}

// create a map of the "canonicalized" headers
// will return empty map on malformed input.
const std::map<std::string,std::string> canonicalize_headers(const std::vector<std::string>& headers) {
const std::map<std::string,std::string> canonicalize_headers(const std::vector<std::string>& headers) noexcept {
const std::string header_delim{":"};
std::map<std::string,std::string> header_key2val;
for (const auto& h:headers) {
Expand All @@ -83,7 +94,7 @@ namespace AWSV4 {
}

// get a string representation of header:value lines
const std::string map_headers_string(const std::map<std::string,std::string>& header_key2val) {
const std::string map_headers_string(const std::map<std::string,std::string>& header_key2val) noexcept {
const std::string pair_delim{":"};
std::string h;
for (const auto& kv:header_key2val) {
Expand All @@ -93,21 +104,21 @@ namespace AWSV4 {
}

// get a string representation of the header names
const std::string map_signed_headers(const std::map<std::string,std::string>& header_key2val) {
const std::string map_signed_headers(const std::map<std::string,std::string>& header_key2val) noexcept {
const std::string signed_headers_delim{";"};
std::vector<std::string> ks;
for (const auto& kv:header_key2val) {
ks.push_back(kv.first);
}
return boost::algorithm::join(ks,signed_headers_delim);
return join(ks,signed_headers_delim);
}

const std::string canonicalize_request(const std::string& http_request_method,
const std::string& canonical_uri,
const std::string& canonical_query_string,
const std::string& canonical_headers,
const std::string& signed_headers,
const std::string& payload) {
const std::string& payload) noexcept {
return http_request_method + ENDL +
canonical_uri + ENDL +
canonical_query_string + ENDL +
Expand All @@ -123,7 +134,7 @@ namespace AWSV4 {
const std::string string_to_sign(const std::string& algorithm,
const std::time_t& request_date,
const std::string& credential_scope,
const std::string& hashed_canonical_request) {
const std::string& hashed_canonical_request) noexcept {
return algorithm + ENDL +
ISO8601_date(request_date) + ENDL +
credential_scope + ENDL +
Expand All @@ -132,20 +143,20 @@ namespace AWSV4 {

const std::string credential_scope(const std::time_t& request_date,
const std::string region,
const std::string service) {
const std::string service) noexcept {
const std::string s{"/"};
return utc_yyyymmdd(request_date) + s + region + s + service + s + AWS4_REQUEST;
}

// time_t -> 20131222T043039Z
const std::string ISO8601_date(const std::time_t& t) {
const std::string ISO8601_date(const std::time_t& t) noexcept {
char buf[sizeof "20111008T070709Z"];
std::strftime(buf, sizeof buf, "%Y%m%dT%H%M%SZ", std::gmtime(&t));
return std::string{buf};
}

// time_t -> 20131222
const std::string utc_yyyymmdd(const std::time_t& t) {
const std::string utc_yyyymmdd(const std::time_t& t) noexcept {
char buf[sizeof "20111008"];
std::strftime(buf, sizeof buf, "%Y%m%d", std::gmtime(&t));
return std::string{buf};
Expand All @@ -159,7 +170,7 @@ namespace AWSV4 {
const std::string secret,
const std::string region,
const std::string service,
const std::string string_to_sign) {
const std::string string_to_sign) noexcept {

const std::string k1{AWS4 + secret};
char *c_k1 = new char [k1.length()+1];
Expand Down
29 changes: 14 additions & 15 deletions awsv4.hpp
Expand Up @@ -9,8 +9,7 @@
#include <map>
#include <ctime>
#include <iostream>

#include <boost/algorithm/string/join.hpp>
#include <sstream>

#include "Poco/URI.h"
#include "Poco/StringTokenizer.h"
Expand All @@ -25,45 +24,45 @@ namespace AWSV4 {
const std::string AWS4{"AWS4"};
const std::string AWS4_REQUEST{"aws4_request"};

void sha256(const std::string str, unsigned char outputBuffer[SHA256_DIGEST_LENGTH]);
void sha256(const std::string str, unsigned char outputBuffer[SHA256_DIGEST_LENGTH]) noexcept;

const std::string sha256_base16(const std::string);
const std::string sha256_base16(const std::string) noexcept;

const std::string canonicalize_uri(const Poco::URI& uri);
const std::string canonicalize_uri(const Poco::URI& uri) noexcept;

const std::string canonicalize_query(const Poco::URI& uri);
const std::string canonicalize_query(const Poco::URI& uri) noexcept;

const std::map<std::string,std::string> canonicalize_headers(const std::vector<std::string>& headers);
const std::map<std::string,std::string> canonicalize_headers(const std::vector<std::string>& headers) noexcept;

const std::string map_headers_string(const std::map<std::string,std::string>& header_key2val);
const std::string map_headers_string(const std::map<std::string,std::string>& header_key2val) noexcept;

const std::string map_signed_headers(const std::map<std::string,std::string>& header_key2val);
const std::string map_signed_headers(const std::map<std::string,std::string>& header_key2val) noexcept;

const std::string canonicalize_request(const std::string& http_request_method,
const std::string& canonical_uri,
const std::string& canonical_query_string,
const std::string& canonical_headers,
const std::string& signed_headers,
const std::string& payload);
const std::string& payload) noexcept;

const std::string string_to_sign(const std::string& algorithm,
const std::time_t& request_date,
const std::string& credential_scope,
const std::string& hashed_canonical_request);
const std::string& hashed_canonical_request) noexcept;

const std::string ISO8601_date(const std::time_t& t);
const std::string ISO8601_date(const std::time_t& t) noexcept;

const std::string utc_yyyymmdd(const std::time_t& t);
const std::string utc_yyyymmdd(const std::time_t& t) noexcept;

const std::string credential_scope(const std::time_t& t,
const std::string region,
const std::string service);
const std::string service) noexcept;

const std::string calculate_signature(const std::time_t& request_date,
const std::string secret,
const std::string region,
const std::string service,
const std::string string_to_sign);
const std::string string_to_sign) noexcept;

}

Expand Down

0 comments on commit f817b9a

Please sign in to comment.