aws.h
1 // Copyright 2020, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 
5 #pragma once
6 
7 #include <boost/asio/ssl.hpp>
8 
9 #include <boost/beast/core/multi_buffer.hpp>
10 #include <boost/beast/http/message.hpp>
11 #include <boost/fiber/mutex.hpp>
12 
13 #include "absl/strings/string_view.h"
14 #include "util/status.h"
15 
16 namespace util {
17 
18 class AWS {
19  public:
20  AWS(const std::string& region_id, const std::string& service)
21  : region_id_(region_id), service_(service) {
22  }
23 
24  Status Init();
25 
26  // TODO: we should remove domain argument in favor to subdomain (bucket).
27  // and build the whole domain it from service and region
28  // for example, "<bucket>.s3.eu-west-1.amazonaws.com"
29  // See: https://docs.aws.amazon.com/general/latest/gr/s3.html
30  //
31  void Sign(absl::string_view domain, absl::string_view body_hash256,
32  ::boost::beast::http::header<true, ::boost::beast::http::fields>* header) const;
33 
34  void SignEmpty(absl::string_view domain,
35  ::boost::beast::http::header<true, ::boost::beast::http::fields>* header) const {
36  return Sign(domain, absl::string_view{kHashEmpty, 64}, header);
37  }
38 
39  static ::boost::asio::ssl::context CheckedSslContext();
40 
41  private:
42 
43  static const char kHashEmpty[];
44 
45  std::string AuthHeader(absl::string_view method, absl::string_view headers,
46  absl::string_view target, absl::string_view content_sha256,
47  absl::string_view amz_date) const;
48 
49  std::string region_id_, service_, secret_, access_key_;
50 
51  mutable ::boost::fibers::mutex mu_;
52  mutable std::string sign_key_;
53 
54  std::string credential_scope_;
55  char date_str_[32];
56 };
57 
58 namespace detail {
59 
60 void Sha256String(absl::string_view str, char out[65]);
61 void Sha256String(const ::boost::beast::multi_buffer& mb, char out[65]);
62 
63 } // namespace detail
64 
65 } // namespace util
Definition: aws.h:18