]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: clean up rgw::auth::s3::get_v4_signing_key.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Sat, 15 Apr 2017 18:32:42 +0000 (20:32 +0200)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 7 Jun 2017 10:43:16 +0000 (12:43 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_auth_s3.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest_s3.cc

index 9566db57bcc18a1e0d7fd8de07667485915cd554..9b41b43cb8644703465f4aba1eb674443f0d741a 100644 (file)
@@ -678,28 +678,24 @@ std::string get_v4_string_to_sign(CephContext* const cct,
 }
 
 
-/* TODO(rzarzynski): switch to boost::string_ref. */
-static inline std::tuple<std::string, std::string, std::string>
-parse_cred_scope(std::string credential_scope)
+static inline std::tuple<boost::string_ref,             /* date */
+                         boost::string_ref,             /* region */
+                         boost::string_ref>             /* service */
+parse_cred_scope(boost::string_ref credential_scope)
 {
-  std::string cs_aux = credential_scope;
-
   /* date cred */
-  string date_cs = cs_aux;
-  size_t pos = date_cs.find("/");
-  date_cs = date_cs.substr(0, pos);
-  cs_aux = cs_aux.substr(pos + 1, cs_aux.length());
+  size_t pos = credential_scope.find("/");
+  const auto date_cs = credential_scope.substr(0, pos);
+  credential_scope = credential_scope.substr(pos + 1);
 
   /* region cred */
-  string region_cs = cs_aux;
-  pos = region_cs.find("/");
-  region_cs = region_cs.substr(0, pos);
-  cs_aux = cs_aux.substr(pos + 1, cs_aux.length());
+  pos = credential_scope.find("/");
+  const auto region_cs = credential_scope.substr(0, pos);
+  credential_scope = credential_scope.substr(pos + 1);
 
   /* service cred */
-  string service_cs = cs_aux;
-  pos = service_cs.find("/");
-  service_cs = service_cs.substr(0, pos);
+  pos = credential_scope.find("/");
+  const auto service_cs = credential_scope.substr(0, pos);
 
   return std::make_tuple(date_cs, region_cs, service_cs);
 }
@@ -723,46 +719,23 @@ get_v4_signing_key(CephContext* const cct,
 
   string secret_key_utf8_k(secret_k, n);
 
-  std::string date, region, service;
+  boost::string_ref date, region, service;
   std::tie(date, region, service) = parse_cred_scope(credential_scope);
 
-  /* date */
-
-  char date_k[CEPH_CRYPTO_HMACSHA256_DIGESTSIZE];
-  calc_hmac_sha256(secret_key_utf8_k.c_str(), secret_key_utf8_k.size(),
-      date.c_str(), date.size(), date_k);
-
-  char aux[CEPH_CRYPTO_HMACSHA256_DIGESTSIZE * 2 + 1];
-  buf_to_hex((unsigned char *) date_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, aux);
-
-  ldout(cct, 10) << "date_k        = " << string(aux) << dendl;
-
-  /* region */
-
-  char region_k[CEPH_CRYPTO_HMACSHA256_DIGESTSIZE];
-  calc_hmac_sha256(date_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, region.c_str(), region.size(), region_k);
-
-  buf_to_hex((unsigned char *) region_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, aux);
-
-  ldout(cct, 10) << "region_k      = " << string(aux) << dendl;
-
-  /* service */
-
-  char service_k[CEPH_CRYPTO_HMACSHA256_DIGESTSIZE];
-  calc_hmac_sha256(region_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, service.c_str(), service.size(), service_k);
-
-  buf_to_hex((unsigned char *) service_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, aux);
-
-  ldout(cct, 10) << "service_k     = " << string(aux) << dendl;
+  const auto date_k = calc_hmac_sha256(secret_key_utf8_k.c_str(),
+                                       secret_key_utf8_k.size(),
+                                       date.data(), date.size());
+  const auto region_k = calc_hmac_sha256(date_k, region);
+  const auto service_k = calc_hmac_sha256(region_k, service);
 
   /* aws4_request */
-  std::array<unsigned char, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE> signing_key = \
-    calc_hmac_sha256(service_k, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE,
-                     "aws4_request", 12);
-
-  buf_to_hex(signing_key.data(), CEPH_CRYPTO_HMACSHA256_DIGESTSIZE, aux);
+  const auto signing_key = calc_hmac_sha256(service_k,
+                                            boost::string_ref("aws4_request"));
 
-  ldout(cct, 10) << "signing_k     = " << string(aux) << dendl;
+  ldout(cct, 10) << "date_k    = " << buf_to_hex(date_k).data() << dendl;
+  ldout(cct, 10) << "region_k  = " << buf_to_hex(region_k).data() << dendl;
+  ldout(cct, 10) << "service_k = " << buf_to_hex(service_k).data() << dendl;
+  ldout(cct, 10) << "signing_k = " << buf_to_hex(signing_key).data() << dendl;
 
   return signing_key;
 }
index 6bce961986a8976fffefa00dbda45752cdefdffc..978967777bcebd913950609646d238230bf595cb 100644 (file)
@@ -2251,10 +2251,10 @@ template<size_t KeyLenN>
 static inline std::array<unsigned char,
                          CEPH_CRYPTO_HMACSHA256_DIGESTSIZE>
 calc_hmac_sha256(const std::array<unsigned char, KeyLenN>& key,
-                 const char *msg, const int msg_len) {
+                 const boost::string_ref& msg) {
   std::array<unsigned char, CEPH_CRYPTO_HMACSHA256_DIGESTSIZE> dest;
   calc_hmac_sha256(reinterpret_cast<const char*>(key.data()), key.size(),
-                   msg, msg_len,
+                   msg.data(), msg.size(),
                    reinterpret_cast<char*>(dest.data()));
   return dest;
 }
index ee43dc858fc25a4ad90d67107da605a7ea2d65ad..28e15c0a7ba3e3248fdb28ea7fec08ffec1a8f59 100644 (file)
@@ -1216,8 +1216,7 @@ int RGWPutObj_ObjStore_S3::validate_aws4_single_chunk(char *chunk_str,
 
   /* new chunk signature */
   const auto sighex = buf_to_hex(calc_hmac_sha256(s->aws4_auth->signing_key,
-                                                  string_to_sign.c_str(),
-                                                  string_to_sign.size()));
+                                                  string_to_sign));
   /* FIXME(rzarzynski): std::string here is really unnecessary. */
   std::string new_chunk_signature = std::string(sighex.data(), sighex.size());