// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/webcrypto/generate_key_result.h"

#include "base/logging.h"

namespace webcrypto {

GenerateKeyResult::GenerateKeyResult() : type_(TYPE_NULL) {
}

GenerateKeyResult::Type GenerateKeyResult::type() const {
  return type_;
}

const blink::WebCryptoKey& GenerateKeyResult::secret_key() const {
  DCHECK_EQ(TYPE_SECRET_KEY, type_);
  return secret_key_;
}

const blink::WebCryptoKey& GenerateKeyResult::public_key() const {
  DCHECK_EQ(TYPE_PUBLIC_PRIVATE_KEY_PAIR, type_);
  return public_key_;
}

const blink::WebCryptoKey& GenerateKeyResult::private_key() const {
  DCHECK_EQ(TYPE_PUBLIC_PRIVATE_KEY_PAIR, type_);
  return private_key_;
}

void GenerateKeyResult::AssignSecretKey(const blink::WebCryptoKey& key) {
  type_ = TYPE_SECRET_KEY;
  secret_key_ = key;
}

void GenerateKeyResult::AssignKeyPair(const blink::WebCryptoKey& public_key,
                                      const blink::WebCryptoKey& private_key) {
  type_ = TYPE_PUBLIC_PRIVATE_KEY_PAIR;
  public_key_ = public_key;
  private_key_ = private_key;
}

void GenerateKeyResult::Complete(blink::WebCryptoResult* out) const {
  switch (type_) {
    case TYPE_NULL:
      NOTREACHED();
      break;
    case TYPE_SECRET_KEY:
      out->CompleteWithKey(secret_key());
      break;
    case TYPE_PUBLIC_PRIVATE_KEY_PAIR:
      out->CompleteWithKeyPair(public_key(), private_key());
      break;
  }
}

}  // namespace webcrypto
