/* Copyright 2016 The Roughtime Authors.
 *
 * 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 "simple_server.h"

#include <google/protobuf/stubs/logging.h>
#include <openssl/curve25519.h>

#include "server.h"

namespace roughtime {

SimpleServer::SimpleServer(std::unique_ptr<Identity> identity,
                           std::unique_ptr<TimeSource> time_source, int fd)
    : fd_(fd), server_(std::move(identity), std::move(time_source)) {}

bool SimpleServer::ProcessBatch() {
  UdpProcessor::Stats stats;
  return udp_processor_.ProcessBatch(fd_, &server_, &stats);
}

void SimpleServer::RunUntilError() {
  UdpProcessor::Stats stats;
  while (udp_processor_.ProcessBatch(fd_, &server_, &stats)) {
  }
}

// static
std::unique_ptr<Identity> SimpleServer::MakeIdentity(
    const uint8_t root_private_key[ED25519_PRIVATE_KEY_LEN], uint64_t mint,
    uint64_t maxt) {
  GOOGLE_CHECK(mint <= maxt);
  uint8_t delegated_private_key[ED25519_PRIVATE_KEY_LEN];
  uint8_t delegated_public_key[ED25519_PUBLIC_KEY_LEN];
  ED25519_keypair(delegated_public_key, delegated_private_key);

  auto identity = std::unique_ptr<Identity>(new Identity());
  CreateCertificate(identity->certificate, root_private_key, mint, maxt,
                    delegated_public_key);
  memcpy(identity->private_key, delegated_private_key,
         sizeof(delegated_private_key));
  return identity;
}

}  // namespace roughtime
