// Copyright 2020 The Chromium OS 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 "hwsec-test-utils/fake_pca_agent/pca_enroll_v2.h"

#include <memory>
#include <string>
#include <vector>

#include <base/optional.h>
#include <base/strings/string_number_conversions.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace hwsec_test_utils {

namespace {
// A real challenge response from a developer-mode device.
constexpr char kEnrollRequestInHex[] =
    "0A91091280022F683B1488572D3DD5D8452D0B2E85EAED13D3D6704F9C689810E1E4966A3A"
    "C455424BCC2B96D4BF4BD8FBF363432899B8663B34B1B075867FBEB347BFB2835A569CFB8E"
    "7856EB4420EB1B5D5CF9A50005C68339BD366E6E2CF7069140CC37B828A77EAA1C955008D2"
    "9AA0072D91161AD6AAA9C36CF08A84CDA988C89E011315855AA3D45B2919CAA42489F67538"
    "5206CC38349B4ACC28447278176B4EC0BCB581A40B3A7F7880F317DFB4F199C9C62B9B3AE3"
    "7E530BDA52E9118CF634B59FC74A82B16D66B4189CD89108A5CC3C5591BD55AF7B77BD8DAE"
    "BAD49EE860FD11A11ACA69A5AA67EB58D8AADD9D304BB37E16E7710436E9AFFA50C4098497"
    "9456D31A10C5311C4A4CBCBCCC3FA6E3E655712CBC2240ACA34C0115ABE55DEEA3F0F2CFC6"
    "CD9B5B341E4CE2D452E186A6ED9DB2CF3A9830E9C82820CFC27F1314CBC36472E209852C48"
    "7D3361B9417F27825ECAF185392AB0064D98B35A7382B2372AC70B329C99DDCE854886AFDA"
    "A0BBBF4F846A9559DC3933B1409C3028376E8604E9D0C35274DC5483F0AEA0EFC1A171559F"
    "FF9B8FABF98C651629BAC24C157D9073647269B5A9737F8F40E59C326F89E1E2CBBA7BC07B"
    "59003BFD90D6808E017447A67423E3CB15CF7C0F3D6849FF9422B8244072D7493B506909DB"
    "573EAFA46EAD5DA0630242814DCA7032FBA08C8B8D879718B0586E467FCD2E157FEBB8DC24"
    "A313B19320E1CEF1BAFF8B28A07F14DC04B3091832BF057628CE09478B4EC19A51AD825F70"
    "F4659DBB4BF6B73E1710E5D203C94D3192B6CB0D5707C1CE275333057A0EB0DC3FBA4612A4"
    "0346D7961A30BCEAA80E9A04E30F130728021E5E45BC5BA453C9EC3423CDE1634E4774FF8C"
    "B410F9F71D06A98A3263D7DEA815E008BE417AC874FC1B30F0EE5A1B1A6457070331E0E007"
    "AD472F621AC7317B59CD73B1677C35E70A2FB11EB9E246EB99C8B20C4F570078A6F8A68F48"
    "15A4DDF3DD398EB705DAB069FA1586FBB4F8D4D9C1AEF4CF511C7288061804EE83556D6E75"
    "BEFCED9498657080336B4BDF3F82A138515465343347754DA31975938A32E75B02973EA51B"
    "ED4BA56BFB2950CF8A812BB48D6D661B1947550FE56838B7A35E2AB7E84A3A97A87C8CF09D"
    "5A84E70AB1A7934A8154060A3CB34FEDACA5B8A6E46F584BF67C39E42331BB919E5653F51D"
    "52C6EC57388D829A616796705417E489B2EB037D78F30EC5D379FF85F6A1AD87771127B7C2"
    "449826BCB23F82B74438A75AFA7923052F50C3857F7054E843143916A3E7825FD3D56F4E01"
    "B524723617FE0FBDB165C6E54927D814E3989CBAC1C9433580193E6A93D99ABB16EBC6BC78"
    "093C10DE080140647F182FE2DD9A2E16E556631F75ACE1E0EC9844ABCDF663A9F2CFB3279A"
    "58AC2501B7FBF6BE906408016D3D2021FFD47020FB1C5CB50D91C88B1C2CCB874D0557CD80"
    "E31C74AF54C2F0032CF6C29D1E20D6643BE280C045E4D9F8DEF8DED56790C0411C8BED92DB"
    "184EF09AAB9E2DB7F901C9BA103108DB2E92549CA87EFEC922DDE74C5FA5DBC59A8E2E8087"
    "B69088373412AA1BE61897D9A757EAA35D895B281628DFAF285534F08B4273DA1C5A831957"
    "07E6F9BDCF296A78BAB0206D19BF178CAC1732054361456E6312580023000B000504720000"
    "00100018000B000300100020A93378E6A089B7211C8FBC62E33B3A566D0BDAB6544174FAB6"
    "E389E582FE791300205CD6CD8DE23829D1F381A5B911F37F7DEA42026AA530185F8AA342B9"
    "9A23FAD01ADE010A47304502210098F97D25A48732A8840D5F8C03BB81D8C322330E65B98E"
    "C10C6FECA1AA195553022062967D53F1EB7192406A42B32820ADB1E8CE3C4D25DC967CFB68"
    "DF377B0563441271FF54434780180022000B1EAEE68EAF1FF2E8A225B90D5505C1FFB8D550"
    "55C72FFC3310A147EC101B9E200000026C684FBC42F45A80805DCEBFF9EAC7010FFB0F289B"
    "1D64EA00000001000B0301000000203E48626DA845338A6560801F8EF5E2338BF8DFCF8596"
    "AD107E228ADD67FC142A1A2023E14DD9BB51A50E16911F7E11DF1E1AAF0B17134DC739C565"
    "3607A1EC8DD37A22F1010A483046022100D48A0C61983BA688E759A71BD1EDA90F6C3D9C94"
    "6084C43AB9F2D2F36F4E5B7902210084258D17E6AE5515D83D0DC81BCD2D3E331CA8D23BFF"
    "7B5FF83E58F69EF8F4DC1271FF54434780180022000B1EAEE68EAF1FF2E8A225B90D5505C1"
    "FFB8D55055C72FFC3310A147EC101B9E200000026C684FBC42F51680805DCEBFF9EAC7010F"
    "FB0F289B1D64EA00000001000B030200000020D73110549FD101849611D96BE29B2C3A3CB7"
    "D511255E02547FE34989F5BCE8A91A20239E7396CAF5F0A15F73B05DA4E563FB00994A2362"
    "0BD36E3E09C3DC15A41A612210534F52414B41205445535420313836392A20F2526B31A6C6"
    "12D67D0BD0A950E5E2AA7AD0C88453E2CA5CCA68171E8A09DF5730023A910C128002147D15"
    "D584C7B0E13DCC37B22ECA178AF874394218047ABC7560971F2A383C6A8B9A40EA3E50DC30"
    "5AEA1152479F10B08A6E15A27D4E40B42EF67576C7D57CFE9A989C6F3F951FFEF53EA288AF"
    "6F00ECA3E73E7F23E62DE8731D8E8142FF722F36C62D775E16C495169101866E2931CC047F"
    "695B62F45B65D39406CC066794D9257843D30193C60240DB47B6E62FC5E8FCB9CAEAB3C771"
    "8781DC7A6E67C95F3236C59C9D056D6E5C08F911A77B490D7B1685D6913FA274B0DA817192"
    "DB8493E1B5C1CF11DA2FEDE897A18F1D827477A08A6FAF9AED6982C3B0F8F76404F2A7F380"
    "F96FFED48607F6D1CE05569F0D7A7B82E53BF5A220DE42013289C12B38C97E1A10C17DA2A2"
    "BEC08BF0CBE2231C4B32C1A0224051A8E8FBA907D354C01FF41CF02A76F24156E070C0DC27"
    "F3BDAD3A4727A1AD360E0C4E7F1E7CBBE2F1782966AA3D09F40586E16469E62ACDB98D8D87"
    "EFD054E02AB009B2871B7EC53100C0963200C1970976BB98E00B2B1DD34BCFA93D4E296292"
    "13A2E5B267566168FD3B294C489192319DE80FA7096B7C5F4CE846F7573E6452EC2D2E7DC2"
    "F7E92393B951644AC21D12B683A5A37F2DD5BCDA92B07EC40A000AAEDF4BC1E2A6EFF67A06"
    "DACE9CD5886EAAAA1DED1EC841A9898450EE7381A373DDDCAD3D0A3CC708E94B363CE8E1A0"
    "668B4376BF20DD08956E0EA0E650A9C3DAE60A308B251E075FB21E4DE4BA1FA5DFB5A431CF"
    "87F18A531A349DECAB58A84A9F9FC2F39FB034ED29111E6A4AC9E27120CD8CA792281D564C"
    "926D11B0596E9A7B2D030E14E65742096857C94699298D44A7F23C94DF1E145758E963D02E"
    "B3ADC32217A6C5FBED82449ACD3391097D097353E4C837A766C8A3CFBDCD1E155983936DEC"
    "FCF6CA4D86D4C2FE8ABE2C5908D8F5D34353348173AEB6EDB7524F1A3BE35718E3D3EE07FB"
    "3777BF4A45086C935F87AB8F479D6BA51365E9D76319C68C6F5602BA4F9D95F22A0706C305"
    "8A13C558D7603FAAF5089830E72893FCFB2CD35D680EF9742F6F023CFF5B9F68738FD583CC"
    "67E055D5F30213119FBAAEEB45278DD0AB1776BA2113448FEB8E797314B5BFA0EBD7959A05"
    "015DD18CBD2A3559E7312764A0E22A82E9F5EFACED52EE61024AB5EC3AC708E493885022EA"
    "D0191B8DFEAB5633AA7620B1194EC970CD4A13F81A1A1BEC26ED46887D020BFDC6A95E0A50"
    "37027EE096170927A262985A68F46E2F9A337AD7A828CF9FD3B054B42D76B885F0E8D31280"
    "698B263E9ECB1103A2569D8F45E7CC0BE6A26AB0747B08C64033E501D812296314E3A5B118"
    "9BBB5B442B260990D46C808C70FCDCF9D9DA4517741B88346FB79554378BE5556F9C6BBB24"
    "19F638AD2CEE51B944ACF40B59618DAD3624DF82EA45FCDAC51B722BC1B490A490C503583A"
    "EFB28435FD80944EB1B6592ABB452FD55B04C4DD89FDBBF92BC509337B50F18E406C4F1E54"
    "1E77DAD0389982E9916DFE0AD4FBE0BD3D2E0A774B99BC003E0DBFF8454AB565E3D54A62FC"
    "921FF9324BE4829B362BE5BA3231DF0482112BE4EDA8B2953A81425A78E142C08EAF7978DF"
    "C595B696AFEDDB4EC85A1607952258E5255F79FE173898FF5658562634C1E75317DB91D055"
    "784134018FE69DF9A7A6CC84EDCA6B485990415A8E48CD04ACA0C20E9993A5B7E2472AA9C1"
    "AF94325B5999D9F267F9EA1FC18B003D97F56C1AB9DF3684C72AAA619A641BF72E0C2117E3"
    "407CD1930E3E707CB93FDFA10E34A68282224B868157BE0C7560A381BEC6BB09ED38ADC924"
    "009B6B7FF3A90F637D5E58EEDC4941B9D4F393490A2B4ABB7E95FA380734581BB546C9E442"
    "B837975B687C1C01F15FFD4530DA36CFFDCE85BD76C486B9B909E212428452311BB91675FA"
    "54FD5EAE933F6CFE21F0B1C82B0318A7457F6D04B317874464C3422BE7B5874BCF1DDB1818"
    "1B173FC4BCC2503E0DF0703CB9D233240D31EEFAB06DC7C6A271E30DA90833A841AD1C979C"
    "C624437F1FEE83CD4F88811B3C2E8318652FEB5E6D00E2D482563D4C082BC02B3A3823DD8E"
    "FD4F0337165B51FE03CF3D98DB7D77D895A2A55A154D0D5658D363B90806C0622757B4B1AB"
    "B3535718216D4B56068A52E160C5F4A79ECD2A9E6466A209CC21D4A2AC7B80BA606A2ABE41"
    "486256E0211C0926E63167B011C904EE48BEAD3CDD4ACD32054361456E63";

}  // namespace

class PcaEnrollV2Test : public testing::Test {
 public:
  PcaEnrollV2Test() {
    SetupEnrollRequestToVerify();
    pca_enroll_ = std::make_unique<fake_pca_agent::PcaEnrollV2>(request_);
  }
  ~PcaEnrollV2Test() override = default;

 protected:
  attestation::AttestationEnrollmentRequest request_;
  std::unique_ptr<fake_pca_agent::PcaEnrollV2> pca_enroll_;

  void SetupEnrollRequestToVerify() {
    std::vector<uint8_t> output;
    ASSERT_TRUE(base::HexStringToBytes(kEnrollRequestInHex, &output));
    ASSERT_TRUE(
        request_.ParseFromString(std::string(output.begin(), output.end())));
  }
};

TEST_F(PcaEnrollV2Test, Enroll) {
  EXPECT_TRUE(pca_enroll_->Preprocess());
  EXPECT_TRUE(pca_enroll_->Verify());
  EXPECT_TRUE(pca_enroll_->Generate());
}

}  // namespace hwsec_test_utils
