13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License.
63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at
73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and
143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License.
153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
16d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
17d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn#include <memory>
18d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn#include <string>
196222defa52eb13c0d90673f642f2647f7753478bDarren Krahn#include <vector>
20d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
216222defa52eb13c0d90673f642f2647f7753478bDarren Krahn#include <base/logging.h>
226222defa52eb13c0d90673f642f2647f7753478bDarren Krahn#include <base/strings/string_number_conversions.h>
23d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn#include <gmock/gmock.h>
24d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn#include <gtest/gtest.h>
25d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
26745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/crypto_utility_impl.h"
27745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/mock_tpm_utility.h"
28d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
29d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahnusing testing::_;
30d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahnusing testing::NiceMock;
31d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahnusing testing::Return;
32d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
336222defa52eb13c0d90673f642f2647f7753478bDarren Krahnnamespace {
346222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
356222defa52eb13c0d90673f642f2647f7753478bDarren Krahnconst char kValidPublicKeyHex[] =
366222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "3082010A0282010100"
376222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "961037BC12D2A298BEBF06B2D5F8C9B64B832A2237F8CF27D5F96407A6041A4D"
386222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "AD383CB5F88E625F412E8ACD5E9D69DF0F4FA81FCE7955829A38366CBBA5A2B1"
396222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "CE3B48C14B59E9F094B51F0A39155874C8DE18A0C299EBF7A88114F806BE4F25"
406222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "3C29A509B10E4B19E31675AFE3B2DA77077D94F43D8CE61C205781ED04D183B4"
416222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "C349F61B1956C64B5398A3A98FAFF17D1B3D9120C832763EDFC8F4137F6EFBEF"
426222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "46D8F6DE03BD00E49DEF987C10BDD5B6F8758B6A855C23C982DDA14D8F0F2B74"
436222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "E6DEFA7EEE5A6FC717EB0FF103CB8049F693A2C8A5039EF1F5C025DC44BD8435"
446222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "E8D8375DADE00E0C0F5C196E04B8483CC98B1D5B03DCD7E0048B2AB343FFC11F"
456222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "0203"
466222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    "010001";
476222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
486222defa52eb13c0d90673f642f2647f7753478bDarren Krahnstd::string HexDecode(const std::string hex) {
496222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::vector<uint8_t> output;
506222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  CHECK(base::HexStringToBytes(hex, &output));
516222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  return std::string(reinterpret_cast<char*>(output.data()), output.size());
526222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
536222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
546222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}  // namespace
556222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
56d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahnnamespace attestation {
57d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
58d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahnclass CryptoUtilityImplTest : public testing::Test {
59d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn public:
60d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  ~CryptoUtilityImplTest() override = default;
61d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  void SetUp() override {
62d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn    crypto_utility_.reset(new CryptoUtilityImpl(&mock_tpm_utility_));
63d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  }
64d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
65d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn protected:
66d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  NiceMock<MockTpmUtility> mock_tpm_utility_;
67d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::unique_ptr<CryptoUtilityImpl> crypto_utility_;
68d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn};
69d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
70d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, GetRandomSuccess) {
71d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string random1;
72d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRandom(20, &random1));
73d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string random2;
74d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRandom(20, &random2));
75d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_NE(random1, random2);
76d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
77d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
78d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, GetRandomIntOverflow) {
79d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  size_t num_bytes = -1;
80d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string buffer;
81d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->GetRandom(num_bytes, &buffer));
82d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
83d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
84d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, PairwiseSealedEncryption) {
85d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key;
86d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string sealed_key;
87d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->CreateSealedKey(&key, &sealed_key));
88d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string data("test");
89d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string encrypted_data;
904dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(
914dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      crypto_utility_->EncryptData(data, key, sealed_key, &encrypted_data));
92d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  key.clear();
93d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  sealed_key.clear();
94d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  data.clear();
95d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->UnsealKey(encrypted_data, &key, &sealed_key));
96d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->DecryptData(encrypted_data, key, &data));
97d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_EQ("test", data);
98d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
99d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
100d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, SealFailure) {
101d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_CALL(mock_tpm_utility_, SealToPCR0(_, _))
102d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn      .WillRepeatedly(Return(false));
103d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key;
104d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string sealed_key;
105d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->CreateSealedKey(&key, &sealed_key));
106d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
107d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
108d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, EncryptNoData) {
109d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(32, 0);
110d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
111d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->EncryptData(std::string(), key, key, &output));
112d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
113d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
114d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, EncryptInvalidKey) {
115d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(12, 0);
116d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
117d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->EncryptData(std::string(), key, key, &output));
118d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
119d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
120d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, UnsealInvalidData) {
121d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
122d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->UnsealKey("invalid", &output, &output));
123d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
124d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
125d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, UnsealError) {
1264dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_utility_, Unseal(_, _)).WillRepeatedly(Return(false));
127d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(32, 0);
128d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string data;
129d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_TRUE(crypto_utility_->EncryptData("data", key, key, &data));
130d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
131d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->UnsealKey(data, &output, &output));
132d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
133d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
134d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, DecryptInvalidKey) {
135d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(12, 0);
136d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
137d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->DecryptData(std::string(), key, &output));
138d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
139d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
140d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, DecryptInvalidData) {
141d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(32, 0);
142d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
143d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->DecryptData("invalid", key, &output));
144d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
145d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
146d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren KrahnTEST_F(CryptoUtilityImplTest, DecryptInvalidData2) {
147d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string key(32, 0);
148d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string output;
149d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EncryptedData proto;
150d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  std::string input;
151d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  proto.SerializeToString(&input);
152d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn  EXPECT_FALSE(crypto_utility_->DecryptData(input, key, &output));
153d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}
154d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn
1556222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(CryptoUtilityImplTest, GetRSASubjectPublicKeyInfo) {
1566222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
1576222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::string output;
1586222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key, &output));
1596222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1606222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
1616222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(CryptoUtilityImplTest, GetRSASubjectPublicKeyInfoBadInput) {
1626222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::string public_key = "bad_public_key";
1636222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::string output;
1644dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_FALSE(
1654dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      crypto_utility_->GetRSASubjectPublicKeyInfo(public_key, &output));
1666222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1676222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
1682e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(CryptoUtilityImplTest, GetRSASubjectPublicKeyInfoPairWise) {
1692e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
1702e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::string output;
1712e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key, &output));
1722e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::string public_key2;
1732e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRSAPublicKey(output, &public_key2));
1742e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ(public_key, public_key2);
1752e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
1762e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
1772e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(CryptoUtilityImplTest, EncryptIdentityCredential) {
1782e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
1792e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::string public_key_info;
1802e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key,
1812e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn                                                          &public_key_info));
1822e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EncryptedIdentityCredential output;
1834dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(crypto_utility_->EncryptIdentityCredential(
1844dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "credential", public_key_info, "aik", &output));
1852e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(output.has_asym_ca_contents());
1862e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(output.has_sym_ca_attestation());
1872e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
1882e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
1892e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(CryptoUtilityImplTest, EncryptIdentityCredentialBadEK) {
1902e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EncryptedIdentityCredential output;
1914dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_FALSE(crypto_utility_->EncryptIdentityCredential(
1924dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "credential", "bad_ek", "aik", &output));
1932e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
1942e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
195bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(CryptoUtilityImplTest, EncryptForUnbind) {
196bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
197bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string public_key_info;
198bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key,
199bc0c74963418442991072b2c87baec839eec9c20Darren Krahn                                                          &public_key_info));
200bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string output;
2014dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(
2024dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      crypto_utility_->EncryptForUnbind(public_key_info, "input", &output));
203bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_FALSE(output.empty());
204bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
205bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
206bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(CryptoUtilityImplTest, EncryptForUnbindBadKey) {
207bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string output;
208bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_FALSE(crypto_utility_->EncryptForUnbind("bad_key", "input", &output));
209bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
210bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
211bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(CryptoUtilityImplTest, EncryptForUnbindLargeInput) {
212bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
213bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string public_key_info;
214bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key,
215bc0c74963418442991072b2c87baec839eec9c20Darren Krahn                                                          &public_key_info));
216bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string input(1000, 'A');
217bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  std::string output;
2184dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_FALSE(
2194dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      crypto_utility_->EncryptForUnbind(public_key_info, input, &output));
220bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
221bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
222ccf90703bb6989e659b12a6494e84fdb921008edDarren KrahnTEST_F(CryptoUtilityImplTest, VerifySignatureBadSignature) {
223ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  std::string public_key = HexDecode(kValidPublicKeyHex);
224ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  std::string public_key_info;
225ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_TRUE(crypto_utility_->GetRSASubjectPublicKeyInfo(public_key,
226ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn                                                          &public_key_info));
227ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  std::string output;
2284dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_FALSE(
2294dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      crypto_utility_->VerifySignature(public_key_info, "input", "signature"));
230ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn}
231ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
232ccf90703bb6989e659b12a6494e84fdb921008edDarren KrahnTEST_F(CryptoUtilityImplTest, VerifySignatureBadKey) {
233ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_FALSE(crypto_utility_->VerifySignature("bad_key", "input", ""));
234ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn}
235ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
236d569cf62b11f74b7ca2ff2db53414927f7e2d66aDarren Krahn}  // namespace attestation
237