//
// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "gatekeeper_responder.h"

#include <android-base/logging.h>
#include <gatekeeper/gatekeeper_messages.h>

namespace cuttlefish {

GatekeeperResponder::GatekeeperResponder(
    cuttlefish::GatekeeperChannel& channel, gatekeeper::GateKeeper& gatekeeper)
    : channel_(channel), gatekeeper_(gatekeeper) {
}

bool GatekeeperResponder::ProcessMessage() {
  auto request = channel_.ReceiveMessage();
  if (!request) {
    LOG(ERROR) << "Could not receive message";
    return false;
  }
  const uint8_t* buffer = request->payload;
  const uint8_t* buffer_end = request->payload + request->payload_size;
  switch(request->cmd) {
    using namespace gatekeeper;
    case ENROLL: {
      EnrollRequest enroll_request;
      auto rc = enroll_request.Deserialize(buffer, buffer_end);
      if (rc != ERROR_NONE) {
        LOG(ERROR) << "Failed to deserialize Enroll Request";
        return false;
      }
      EnrollResponse response;
      gatekeeper_.Enroll(enroll_request, &response);
      return channel_.SendResponse(ENROLL, response);
    }
    case VERIFY: {
      VerifyRequest verify_request;
      auto rc = verify_request.Deserialize(buffer, buffer_end);
      if (rc != ERROR_NONE) {
        LOG(ERROR) << "Failed to deserialize Verify Request";
        return false;
      }
      VerifyResponse response;
      gatekeeper_.Verify(verify_request, &response);
      return channel_.SendResponse(VERIFY, response);
    }
    default:
      LOG(ERROR) << "Unrecognized message id " << request->cmd;
      return false;
  }
}

}  // namespace cuttlefish
