1 /*############################################################################
2 # Copyright 2017 Intel Corporation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 ############################################################################*/
16
17 /*!
18 * \file
19 * \brief Member credentials storage helper API unit tests.
20 */
21 #include <cstring>
22
23 #include "epid/common-testhelper/epid_gtest-testhelper.h"
24 #include "gtest/gtest.h"
25
26 #include "epid/common-testhelper/epid2params_wrapper-testhelper.h"
27 #include "epid/common-testhelper/errors-testhelper.h"
28 #include "epid/common-testhelper/prng-testhelper.h"
29 #include "epid/member/tpm2/unittests/tpm2-testhelper.h"
30 #include "epid/member/unittests/member-testhelper.h"
31
32 extern "C" {
33 #include "epid/member/src/storage.h"
34 #include "epid/member/tpm2/nv.h"
35 }
36
37 namespace {
38
TEST_F(EpidMemberTest,NvWriteMembershipCredentialFailsGivenNullPointer)39 TEST_F(EpidMemberTest, NvWriteMembershipCredentialFailsGivenNullPointer) {
40 Prng my_prng;
41 Epid2ParamsObj epid2params;
42 Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
43
44 uint32_t nv_index = 0x01c10100;
45 GroupPubKey const pub_key = this->kGroupPublicKey;
46 // PrivKey can be trimed to MembershipCredential
47 MembershipCredential const credential =
48 *(MembershipCredential*)&this->kMemberPrivateKey;
49
50 EXPECT_EQ(kEpidBadArgErr, EpidNvWriteMembershipCredential(
51 nullptr, &pub_key, &credential, nv_index));
52 EXPECT_EQ(kEpidBadArgErr, EpidNvWriteMembershipCredential(
53 tpm, nullptr, &credential, nv_index));
54 EXPECT_EQ(kEpidBadArgErr,
55 EpidNvWriteMembershipCredential(tpm, &pub_key, nullptr, nv_index));
56 // cleanup nv_index for next test
57 Tpm2NvUndefineSpace(tpm, nv_index);
58 }
59
TEST_F(EpidMemberTest,NvReadMembershipCredentialFailsGivenNoCredentials)60 TEST_F(EpidMemberTest, NvReadMembershipCredentialFailsGivenNoCredentials) {
61 Prng my_prng;
62 Epid2ParamsObj epid2params;
63 Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
64
65 uint32_t nv_index = 0x01c10101;
66 GroupPubKey pub_key = this->kGroupPublicKey;
67 // PrivKey can be trimed to MembershipCredential
68 MembershipCredential credential =
69 *(MembershipCredential*)&this->kMemberPrivateKey;
70
71 EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
72 tpm, nv_index, &pub_key, &credential));
73 }
74
TEST_F(EpidMemberTest,NvReadMembershipCredentialFailsGivenNullPointer)75 TEST_F(EpidMemberTest, NvReadMembershipCredentialFailsGivenNullPointer) {
76 Prng my_prng;
77 Epid2ParamsObj epid2params;
78 Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
79
80 uint32_t nv_index = 0x01c10100;
81 GroupPubKey pub_key = this->kGroupPublicKey;
82 // PrivKey can be trimed to MembershipCredential
83 MembershipCredential credential =
84 *(MembershipCredential*)&this->kMemberPrivateKey;
85
86 // write credentials
87 EXPECT_EQ(kEpidNoErr, EpidNvWriteMembershipCredential(tpm, &pub_key,
88 &credential, nv_index));
89
90 EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
91 nullptr, nv_index, &pub_key, &credential));
92 EXPECT_EQ(kEpidBadArgErr, EpidNvReadMembershipCredential(
93 tpm, nv_index, nullptr, &credential));
94 EXPECT_EQ(kEpidBadArgErr,
95 EpidNvReadMembershipCredential(tpm, nv_index, &pub_key, nullptr));
96 // cleanup nv_index for next test
97 Tpm2NvUndefineSpace(tpm, nv_index);
98 }
99
TEST_F(EpidMemberTest,WrittenMembershipCredentialCanBeRead)100 TEST_F(EpidMemberTest, WrittenMembershipCredentialCanBeRead) {
101 Prng my_prng;
102 Epid2ParamsObj epid2params;
103 Tpm2CtxObj tpm(&Prng::Generate, &my_prng, nullptr, epid2params);
104
105 uint32_t nv_index = 0x01c10100;
106 GroupPubKey pub_key = this->kGroupPublicKey;
107 // PrivKey can be trimed to MembershipCredential
108 MembershipCredential credential_expected =
109 *(MembershipCredential*)&this->kMemberPrivateKey;
110 MembershipCredential credential;
111
112 // write credentials
113 EXPECT_EQ(kEpidNoErr, EpidNvWriteMembershipCredential(
114 tpm, &pub_key, &credential_expected, nv_index));
115
116 // read credentials
117 EXPECT_EQ(kEpidNoErr, EpidNvReadMembershipCredential(tpm, nv_index, &pub_key,
118 &credential));
119
120 EXPECT_EQ(this->kGroupPublicKey, pub_key);
121 EXPECT_EQ(credential_expected, credential);
122 // cleanup nv_index for next test
123 Tpm2NvUndefineSpace(tpm, nv_index);
124 }
125
126 } // namespace
127