// Copyright 2016 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 "net/ssl/ssl_platform_key_util.h"

#include "base/memory/ref_counted.h"
#include "net/cert/x509_certificate.h"
#include "net/ssl/ssl_private_key.h"
#include "net/test/cert_test_util.h"
#include "net/test/test_data_directory.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/ecdsa.h"
#include "third_party/boringssl/src/include/openssl/evp.h"

namespace net {

namespace {

bool GetClientCertInfoFromFile(const char* filename,
                               int* out_type,
                               size_t* out_max_length) {
  scoped_refptr<X509Certificate> cert =
      ImportCertFromFile(GetTestCertsDirectory(), filename);
  if (!cert) {
    ADD_FAILURE() << "Could not read " << filename;
    return false;
  }

  return GetClientCertInfo(cert.get(), out_type, out_max_length);
}

size_t BitsToBytes(size_t bits) {
  return (bits + 7) / 8;
}

}  // namespace

TEST(SSLPlatformKeyUtil, GetClientCertInfo) {
  int type;
  size_t max_length;

  ASSERT_TRUE(GetClientCertInfoFromFile("client_1.pem", &type, &max_length));
  EXPECT_EQ(EVP_PKEY_RSA, type);
  EXPECT_EQ(2048u / 8u, max_length);

  ASSERT_TRUE(GetClientCertInfoFromFile("client_4.pem", &type, &max_length));
  EXPECT_EQ(EVP_PKEY_EC, type);
  EXPECT_EQ(ECDSA_SIG_max_len(BitsToBytes(256)), max_length);

  ASSERT_TRUE(GetClientCertInfoFromFile("client_5.pem", &type, &max_length));
  EXPECT_EQ(EVP_PKEY_EC, type);
  EXPECT_EQ(ECDSA_SIG_max_len(BitsToBytes(384)), max_length);

  ASSERT_TRUE(GetClientCertInfoFromFile("client_6.pem", &type, &max_length));
  EXPECT_EQ(EVP_PKEY_EC, type);
  EXPECT_EQ(ECDSA_SIG_max_len(BitsToBytes(521)), max_length);
}

}  // namespace net
