// Copyright 2018 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.

#ifndef CHROMEOS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_
#define CHROMEOS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_

#include <string>
#include <vector>

#include "base/component_export.h"

namespace chromeos {

// This class contains information about a challenge-response key for user
// authentication. This includes information about the public key of the
// cryptographic key to be challenged, as well as the signature algorithms
// supported for the challenge.
class COMPONENT_EXPORT(CHROMEOS_LOGIN_AUTH) ChallengeResponseKey {
 public:
  // Cryptographic signature algorithm type for challenge requests.
  enum class SignatureAlgorithm {
    kRsassaPkcs1V15Sha1,
    kRsassaPkcs1V15Sha256,
    kRsassaPkcs1V15Sha384,
    kRsassaPkcs1V15Sha512,
  };

  ChallengeResponseKey();
  ChallengeResponseKey(const ChallengeResponseKey& other);
  ~ChallengeResponseKey();

  bool operator==(const ChallengeResponseKey& other) const;
  bool operator!=(const ChallengeResponseKey& other) const;

  // Getter and setter for the DER-encoded blob of the X.509 Subject Public Key
  // Info.
  const std::string& public_key_spki_der() const {
    return public_key_spki_der_;
  }
  void set_public_key_spki_der(const std::string& public_key_spki_der) {
    public_key_spki_der_ = public_key_spki_der;
  }

  // Getter and setter for the list of supported signature algorithms, in the
  // order of preference (starting from the most preferred). Absence of this
  // field denotes that the key cannot be used for signing.
  const std::vector<SignatureAlgorithm>& signature_algorithms() const {
    return signature_algorithms_;
  }
  void set_signature_algorithms(
      const std::vector<SignatureAlgorithm>& signature_algorithms) {
    signature_algorithms_ = signature_algorithms;
  }

 private:
  std::string public_key_spki_der_;
  std::vector<SignatureAlgorithm> signature_algorithms_;
};

}  // namespace chromeos

#endif  // CHROMEOS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_
