]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async, v2: switch the pre-auth mechanism to HMAC-SHA256.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 9 Mar 2019 14:01:21 +0000 (15:01 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 13 Mar 2019 00:23:09 +0000 (01:23 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/auth/Crypto.h
src/msg/async/ProtocolV2.cc
src/msg/async/frames_v2.h

index 46323348bf579a00f96b7fcca00c7c0cfe3e6477..c3ace5c8aff5a67074a08b9f26217653d32ef623 100644 (file)
@@ -119,6 +119,8 @@ public:
   const bufferptr& get_secret() { return secret; }
   const bufferptr& get_secret() const { return secret; }
 
+  bool empty() const { return ckh.get() == nullptr; }
+
   void encode_base64(string& s) const {
     bufferlist bl;
     encode(bl);
index 3880c59867269d4f281720ea2375534a1ae0dbbb..b4c5e76985d00590ea5a02f7b127a8b6b5c03303 100644 (file)
@@ -94,6 +94,7 @@ ProtocolV2::ProtocolV2(AsyncConnection *connection)
       bannerExchangeCallback(nullptr),
       next_tag(static_cast<Tag>(0)),
       keepalive(false) {
+  ceph::crypto::init(cct);
 }
 
 ProtocolV2::~ProtocolV2() {
@@ -1779,8 +1780,9 @@ CtPtr ProtocolV2::handle_auth_done(ceph::bufferlist &payload)
 
   state = AUTH_CONNECTING_SIGN;
 
-  // FIXME, WIP: crc32 is just scaffolding
-  auto sig_frame = AuthSignatureFrame::Encode(pre_auth.rxbuf.crc32c(-1));
+  const auto sig = auth_meta->session_key.empty() ? sha256_digest_t() :
+    auth_meta->session_key.hmac_sha256(cct, pre_auth.rxbuf);
+  auto sig_frame = AuthSignatureFrame::Encode(sig);
   pre_auth.enabled = false;
   pre_auth.rxbuf.clear();
   return WRITE(sig_frame, "auth signature", read_frame);
@@ -2188,8 +2190,9 @@ CtPtr ProtocolV2::finish_auth()
   session_stream_handlers = \
     ceph::crypto::onwire::rxtx_t::create_handler_pair(cct, *auth_meta, true);
 
-  // FIXME, WIP: crc32 is just scaffolding
-  auto sig_frame = AuthSignatureFrame::Encode(pre_auth.rxbuf.crc32c(-1));
+  const auto sig = auth_meta->session_key.empty() ? sha256_digest_t() :
+    auth_meta->session_key.hmac_sha256(cct, pre_auth.rxbuf);
+  auto sig_frame = AuthSignatureFrame::Encode(sig);
   pre_auth.enabled = false;
   pre_auth.rxbuf.clear();
   return WRITE(sig_frame, "auth signature", read_frame);
@@ -2223,7 +2226,8 @@ CtPtr ProtocolV2::handle_auth_signature(ceph::bufferlist &payload)
 
   auto sig_frame = AuthSignatureFrame::Decode(payload);
 
-  const auto actual_tx_sig = pre_auth.txbuf.crc32c(-1);
+  const auto actual_tx_sig = auth_meta->session_key.empty() ?
+    sha256_digest_t() : auth_meta->session_key.hmac_sha256(cct, pre_auth.txbuf);
   if (sig_frame.signature() != actual_tx_sig) {
     ldout(cct, 2) << __func__ << " pre-auth signature mismatch"
                   << " actual_tx_sig=" << actual_tx_sig
index f58358f8993cd593f118ab072189f77d74550e81..9975b74aa9fcac1dd739224fd3326f19fd4b5aa2 100644 (file)
@@ -474,13 +474,12 @@ protected:
 
 struct AuthSignatureFrame
     : public ControlFrame<AuthSignatureFrame,
-                          // FIXME: using crc32 as scaffolding
-                          uint32_t> {
+                          sha256_digest_t> {
   static const Tag tag = Tag::AUTH_SIGNATURE;
   using ControlFrame::Encode;
   using ControlFrame::Decode;
 
-  inline uint32_t &signature() { return get_val<0>(); }
+  inline sha256_digest_t &signature() { return get_val<0>(); }
 
 protected:
   using ControlFrame::ControlFrame;