1*e7b1675dSTing-Kang Chang // Copyright 2021 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ////////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang
17*e7b1675dSTing-Kang Chang #include "tink/jwt/verified_jwt.h"
18*e7b1675dSTing-Kang Chang
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang #include <string>
21*e7b1675dSTing-Kang Chang #include <utility>
22*e7b1675dSTing-Kang Chang #include <vector>
23*e7b1675dSTing-Kang Chang
24*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
25*e7b1675dSTing-Kang Chang #include "absl/status/status.h"
26*e7b1675dSTing-Kang Chang #include "absl/strings/escaping.h"
27*e7b1675dSTing-Kang Chang #include "tink/jwt/internal/jwt_mac_impl.h"
28*e7b1675dSTing-Kang Chang #include "tink/jwt/internal/jwt_mac_internal.h"
29*e7b1675dSTing-Kang Chang #include "tink/jwt/jwt_mac.h"
30*e7b1675dSTing-Kang Chang #include "tink/jwt/jwt_validator.h"
31*e7b1675dSTing-Kang Chang #include "tink/jwt/raw_jwt.h"
32*e7b1675dSTing-Kang Chang #include "tink/subtle/hmac_boringssl.h"
33*e7b1675dSTing-Kang Chang #include "tink/util/constants.h"
34*e7b1675dSTing-Kang Chang #include "tink/util/enums.h"
35*e7b1675dSTing-Kang Chang #include "tink/util/errors.h"
36*e7b1675dSTing-Kang Chang #include "tink/util/protobuf_helper.h"
37*e7b1675dSTing-Kang Chang #include "tink/util/secret_data.h"
38*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
39*e7b1675dSTing-Kang Chang #include "tink/util/test_util.h"
40*e7b1675dSTing-Kang Chang
41*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
42*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOkAndHolds;
43*e7b1675dSTing-Kang Chang
44*e7b1675dSTing-Kang Chang namespace crypto {
45*e7b1675dSTing-Kang Chang namespace tink {
46*e7b1675dSTing-Kang Chang
47*e7b1675dSTing-Kang Chang namespace {
48*e7b1675dSTing-Kang Chang
CreateVerifiedJwt(const RawJwt & raw_jwt)49*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> CreateVerifiedJwt(const RawJwt& raw_jwt) {
50*e7b1675dSTing-Kang Chang // Creating a VerifiedJwt is a bit complicated since it can only be created
51*e7b1675dSTing-Kang Chang // JWT primitives.
52*e7b1675dSTing-Kang Chang std::string key_value;
53*e7b1675dSTing-Kang Chang if (!absl::WebSafeBase64Unescape(
54*e7b1675dSTing-Kang Chang "AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1"
55*e7b1675dSTing-Kang Chang "qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow",
56*e7b1675dSTing-Kang Chang &key_value)) {
57*e7b1675dSTing-Kang Chang return util::Status(absl::StatusCode::kInvalidArgument,
58*e7b1675dSTing-Kang Chang "failed to parse key");
59*e7b1675dSTing-Kang Chang }
60*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<std::unique_ptr<Mac>> mac =
61*e7b1675dSTing-Kang Chang subtle::HmacBoringSsl::New(
62*e7b1675dSTing-Kang Chang util::Enums::ProtoToSubtle(google::crypto::tink::HashType::SHA256),
63*e7b1675dSTing-Kang Chang 32, util::SecretDataFromStringView(key_value));
64*e7b1675dSTing-Kang Chang if (!mac.ok()) {
65*e7b1675dSTing-Kang Chang return mac.status();
66*e7b1675dSTing-Kang Chang }
67*e7b1675dSTing-Kang Chang std::unique_ptr<jwt_internal::JwtMacInternal> jwt_mac =
68*e7b1675dSTing-Kang Chang absl::make_unique<jwt_internal::JwtMacImpl>(std::move(*mac), "HS256",
69*e7b1675dSTing-Kang Chang absl::nullopt);
70*e7b1675dSTing-Kang Chang
71*e7b1675dSTing-Kang Chang util::StatusOr<std::string> compact =
72*e7b1675dSTing-Kang Chang jwt_mac->ComputeMacAndEncodeWithKid(raw_jwt, "kid-123");
73*e7b1675dSTing-Kang Chang if (!compact.ok()) {
74*e7b1675dSTing-Kang Chang return compact.status();
75*e7b1675dSTing-Kang Chang }
76*e7b1675dSTing-Kang Chang JwtValidatorBuilder validator_builder = JwtValidatorBuilder()
77*e7b1675dSTing-Kang Chang .IgnoreTypeHeader()
78*e7b1675dSTing-Kang Chang .IgnoreIssuer()
79*e7b1675dSTing-Kang Chang .IgnoreAudiences()
80*e7b1675dSTing-Kang Chang .AllowMissingExpiration();
81*e7b1675dSTing-Kang Chang util::StatusOr<absl::Time> issued_at = raw_jwt.GetIssuedAt();
82*e7b1675dSTing-Kang Chang if (issued_at.ok()) {
83*e7b1675dSTing-Kang Chang validator_builder.SetFixedNow(*issued_at);
84*e7b1675dSTing-Kang Chang }
85*e7b1675dSTing-Kang Chang util::StatusOr<JwtValidator> validator = validator_builder.Build();
86*e7b1675dSTing-Kang Chang if (!validator.ok()) {
87*e7b1675dSTing-Kang Chang return validator.status();
88*e7b1675dSTing-Kang Chang }
89*e7b1675dSTing-Kang Chang return jwt_mac->VerifyMacAndDecodeWithKid(*compact, *validator, "kid-123");
90*e7b1675dSTing-Kang Chang }
91*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,GetTypeIssuerSubjectJwtIdOK)92*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, GetTypeIssuerSubjectJwtIdOK) {
93*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt = RawJwtBuilder()
94*e7b1675dSTing-Kang Chang .SetTypeHeader("typeHeader")
95*e7b1675dSTing-Kang Chang .SetIssuer("issuer")
96*e7b1675dSTing-Kang Chang .SetSubject("subject")
97*e7b1675dSTing-Kang Chang .SetJwtId("jwt_id")
98*e7b1675dSTing-Kang Chang .WithoutExpiration()
99*e7b1675dSTing-Kang Chang .Build();
100*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
101*e7b1675dSTing-Kang Chang util::StatusOr<crypto::tink::VerifiedJwt> jwt =
102*e7b1675dSTing-Kang Chang CreateVerifiedJwt(*raw_jwt);
103*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
104*e7b1675dSTing-Kang Chang
105*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasTypeHeader());
106*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetTypeHeader(), IsOkAndHolds("typeHeader"));
107*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasIssuer());
108*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetIssuer(), IsOkAndHolds("issuer"));
109*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasSubject());
110*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetSubject(), IsOkAndHolds("subject"));
111*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasJwtId());
112*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetJwtId(), IsOkAndHolds("jwt_id"));
113*e7b1675dSTing-Kang Chang }
114*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,TimestampsOK)115*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, TimestampsOK) {
116*e7b1675dSTing-Kang Chang absl::Time now = absl::Now();
117*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
118*e7b1675dSTing-Kang Chang RawJwtBuilder()
119*e7b1675dSTing-Kang Chang .SetIssuer("issuer")
120*e7b1675dSTing-Kang Chang .SetNotBefore(now - absl::Seconds(300))
121*e7b1675dSTing-Kang Chang .SetIssuedAt(now)
122*e7b1675dSTing-Kang Chang .SetExpiration(now + absl::Seconds(300))
123*e7b1675dSTing-Kang Chang .Build();
124*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
125*e7b1675dSTing-Kang Chang util::StatusOr<crypto::tink::VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
126*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
127*e7b1675dSTing-Kang Chang
128*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasNotBefore());
129*e7b1675dSTing-Kang Chang util::StatusOr<absl::Time> nbf = jwt->GetNotBefore();
130*e7b1675dSTing-Kang Chang ASSERT_THAT(nbf, IsOk());
131*e7b1675dSTing-Kang Chang EXPECT_LT(*nbf, now - absl::Seconds(299));
132*e7b1675dSTing-Kang Chang EXPECT_GT(*nbf, now - absl::Seconds(301));
133*e7b1675dSTing-Kang Chang
134*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasIssuedAt());
135*e7b1675dSTing-Kang Chang util::StatusOr<absl::Time> iat = jwt->GetIssuedAt();
136*e7b1675dSTing-Kang Chang ASSERT_THAT(iat, IsOk());
137*e7b1675dSTing-Kang Chang EXPECT_LT(*iat, now + absl::Seconds(1));
138*e7b1675dSTing-Kang Chang EXPECT_GT(*iat, now - absl::Seconds(1));
139*e7b1675dSTing-Kang Chang
140*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasExpiration());
141*e7b1675dSTing-Kang Chang util::StatusOr<absl::Time> exp = jwt->GetExpiration();
142*e7b1675dSTing-Kang Chang ASSERT_THAT(exp, IsOk());
143*e7b1675dSTing-Kang Chang EXPECT_LT(*exp, now + absl::Seconds(301));
144*e7b1675dSTing-Kang Chang EXPECT_GT(*exp, now + absl::Seconds(299));
145*e7b1675dSTing-Kang Chang }
146*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,GetAudiencesOK)147*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, GetAudiencesOK) {
148*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt = RawJwtBuilder()
149*e7b1675dSTing-Kang Chang .AddAudience("audience1")
150*e7b1675dSTing-Kang Chang .AddAudience("audience2")
151*e7b1675dSTing-Kang Chang .WithoutExpiration()
152*e7b1675dSTing-Kang Chang .Build();
153*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
154*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
155*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
156*e7b1675dSTing-Kang Chang
157*e7b1675dSTing-Kang Chang std::vector<std::string> expected = {"audience1", "audience2"};
158*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasAudiences());
159*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetAudiences(), IsOkAndHolds(expected));
160*e7b1675dSTing-Kang Chang }
161*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,GetCustomClaimOK)162*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, GetCustomClaimOK) {
163*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
164*e7b1675dSTing-Kang Chang RawJwtBuilder()
165*e7b1675dSTing-Kang Chang .WithoutExpiration()
166*e7b1675dSTing-Kang Chang .AddNullClaim("null_claim")
167*e7b1675dSTing-Kang Chang .AddBooleanClaim("boolean_claim", true)
168*e7b1675dSTing-Kang Chang .AddNumberClaim("number_claim", 123.456)
169*e7b1675dSTing-Kang Chang .AddStringClaim("string_claim", "a string")
170*e7b1675dSTing-Kang Chang .AddJsonObjectClaim("object_claim", R"({ "number": 123.456})")
171*e7b1675dSTing-Kang Chang .AddJsonArrayClaim("array_claim", R"([1, "one", 1.2, true])")
172*e7b1675dSTing-Kang Chang .Build();
173*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
174*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
175*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
176*e7b1675dSTing-Kang Chang
177*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->IsNullClaim("null_claim"));
178*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasBooleanClaim("boolean_claim"));
179*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetBooleanClaim("boolean_claim"), IsOkAndHolds(true));
180*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasNumberClaim("number_claim"));
181*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetNumberClaim("number_claim"), IsOkAndHolds(123.456));
182*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasStringClaim("string_claim"));
183*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetStringClaim("string_claim"), IsOkAndHolds("a string"));
184*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasJsonObjectClaim("object_claim"));
185*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetJsonObjectClaim("object_claim"),
186*e7b1675dSTing-Kang Chang IsOkAndHolds(R"({"number":123.456})"));
187*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt->HasJsonArrayClaim("array_claim"));
188*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetJsonArrayClaim("array_claim"),
189*e7b1675dSTing-Kang Chang IsOkAndHolds(R"([1,"one",1.2,true])"));
190*e7b1675dSTing-Kang Chang
191*e7b1675dSTing-Kang Chang std::vector<std::string> expected_claim_names = {
192*e7b1675dSTing-Kang Chang "object_claim", "number_claim", "boolean_claim",
193*e7b1675dSTing-Kang Chang "array_claim", "null_claim", "string_claim"};
194*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->CustomClaimNames(),
195*e7b1675dSTing-Kang Chang testing::UnorderedElementsAreArray(expected_claim_names));
196*e7b1675dSTing-Kang Chang }
197*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,HasCustomClaimIsFalseForWrongType)198*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, HasCustomClaimIsFalseForWrongType) {
199*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
200*e7b1675dSTing-Kang Chang RawJwtBuilder()
201*e7b1675dSTing-Kang Chang .WithoutExpiration()
202*e7b1675dSTing-Kang Chang .AddNullClaim("null_claim")
203*e7b1675dSTing-Kang Chang .AddBooleanClaim("boolean_claim", true)
204*e7b1675dSTing-Kang Chang .AddNumberClaim("number_claim", 123.456)
205*e7b1675dSTing-Kang Chang .AddStringClaim("string_claim", "a string")
206*e7b1675dSTing-Kang Chang .Build();
207*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
208*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
209*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
210*e7b1675dSTing-Kang Chang
211*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->IsNullClaim("boolean_claim"));
212*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasBooleanClaim("number_claim"));
213*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNumberClaim("string_claim"));
214*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasStringClaim("null_claim"));
215*e7b1675dSTing-Kang Chang }
216*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,HasAlwaysReturnsFalseForRegisteredClaims)217*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, HasAlwaysReturnsFalseForRegisteredClaims) {
218*e7b1675dSTing-Kang Chang absl::Time now = absl::Now();
219*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
220*e7b1675dSTing-Kang Chang RawJwtBuilder()
221*e7b1675dSTing-Kang Chang .SetIssuer("issuer")
222*e7b1675dSTing-Kang Chang .SetSubject("subject")
223*e7b1675dSTing-Kang Chang .SetJwtId("jwt_id")
224*e7b1675dSTing-Kang Chang .SetNotBefore(now - absl::Seconds(300))
225*e7b1675dSTing-Kang Chang .SetIssuedAt(now)
226*e7b1675dSTing-Kang Chang .SetExpiration(now + absl::Seconds(300))
227*e7b1675dSTing-Kang Chang .Build();
228*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
229*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
230*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
231*e7b1675dSTing-Kang Chang
232*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasStringClaim("iss"));
233*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasStringClaim("sub"));
234*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasStringClaim("jti"));
235*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNumberClaim("nbf"));
236*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNumberClaim("iat"));
237*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNumberClaim("exp"));
238*e7b1675dSTing-Kang Chang
239*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->CustomClaimNames(), testing::IsEmpty());
240*e7b1675dSTing-Kang Chang }
241*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,GetRegisteredCustomClaimNotOK)242*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, GetRegisteredCustomClaimNotOK) {
243*e7b1675dSTing-Kang Chang absl::Time now = absl::Now();
244*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
245*e7b1675dSTing-Kang Chang RawJwtBuilder()
246*e7b1675dSTing-Kang Chang .SetIssuer("issuer")
247*e7b1675dSTing-Kang Chang .SetSubject("subject")
248*e7b1675dSTing-Kang Chang .SetJwtId("jwt_id")
249*e7b1675dSTing-Kang Chang .SetNotBefore(now - absl::Seconds(300))
250*e7b1675dSTing-Kang Chang .SetIssuedAt(now)
251*e7b1675dSTing-Kang Chang .SetExpiration(now + absl::Seconds(300))
252*e7b1675dSTing-Kang Chang .Build();
253*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
254*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
255*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
256*e7b1675dSTing-Kang Chang
257*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetStringClaim("iss").ok());
258*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetStringClaim("sub").ok());
259*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetStringClaim("jti").ok());
260*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetNumberClaim("nbf").ok());
261*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetNumberClaim("iat").ok());
262*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetNumberClaim("exp").ok());
263*e7b1675dSTing-Kang Chang }
264*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,EmptyTokenHasAndIsReturnsFalse)265*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, EmptyTokenHasAndIsReturnsFalse) {
266*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
267*e7b1675dSTing-Kang Chang RawJwtBuilder().WithoutExpiration().Build();
268*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
269*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
270*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
271*e7b1675dSTing-Kang Chang
272*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasTypeHeader());
273*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasIssuer());
274*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasSubject());
275*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasAudiences());
276*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasJwtId());
277*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasExpiration());
278*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNotBefore());
279*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasIssuedAt());
280*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->IsNullClaim("null_claim"));
281*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasBooleanClaim("boolean_claim"));
282*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasNumberClaim("number_claim"));
283*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasStringClaim("string_claim"));
284*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasJsonObjectClaim("object_claim"));
285*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->HasJsonArrayClaim("array_claim"));
286*e7b1675dSTing-Kang Chang }
287*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,EmptyTokenGetReturnsNotOK)288*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, EmptyTokenGetReturnsNotOK) {
289*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
290*e7b1675dSTing-Kang Chang RawJwtBuilder().WithoutExpiration().Build();
291*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
292*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
293*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
294*e7b1675dSTing-Kang Chang
295*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetTypeHeader().ok());
296*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetIssuer().ok());
297*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetSubject().ok());
298*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetAudiences().ok());
299*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetJwtId().ok());
300*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetExpiration().ok());
301*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetNotBefore().ok());
302*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetIssuedAt().ok());
303*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->IsNullClaim("null_claim"));
304*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetBooleanClaim("boolean_claim").ok());
305*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetNumberClaim("number_claim").ok());
306*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetStringClaim("string_claim").ok());
307*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetJsonObjectClaim("object_claim").ok());
308*e7b1675dSTing-Kang Chang EXPECT_FALSE(jwt->GetJsonArrayClaim("array_claim").ok());
309*e7b1675dSTing-Kang Chang }
310*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,GetJsonPayload)311*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, GetJsonPayload) {
312*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
313*e7b1675dSTing-Kang Chang RawJwtBuilder().SetIssuer("issuer").WithoutExpiration().Build();
314*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
315*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
316*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
317*e7b1675dSTing-Kang Chang
318*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt->GetJsonPayload(), IsOkAndHolds(R"({"iss":"issuer"})"));
319*e7b1675dSTing-Kang Chang }
320*e7b1675dSTing-Kang Chang
TEST(VerifiedJwt,MoveMakesCopy)321*e7b1675dSTing-Kang Chang TEST(VerifiedJwt, MoveMakesCopy) {
322*e7b1675dSTing-Kang Chang util::StatusOr<RawJwt> raw_jwt =
323*e7b1675dSTing-Kang Chang RawJwtBuilder().SetIssuer("issuer").WithoutExpiration().Build();
324*e7b1675dSTing-Kang Chang ASSERT_THAT(raw_jwt, IsOk());
325*e7b1675dSTing-Kang Chang util::StatusOr<VerifiedJwt> jwt = CreateVerifiedJwt(*raw_jwt);
326*e7b1675dSTing-Kang Chang ASSERT_THAT(jwt, IsOk());
327*e7b1675dSTing-Kang Chang VerifiedJwt jwt1 = *jwt;
328*e7b1675dSTing-Kang Chang VerifiedJwt jwt2 = std::move(jwt1);
329*e7b1675dSTing-Kang Chang // We want that a VerifiedJwt object remains a valid object, even after
330*e7b1675dSTing-Kang Chang // std::moved has been called.
331*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt1.HasIssuer()); // NOLINT(bugprone-use-after-move)
332*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt1.GetIssuer(), IsOkAndHolds("issuer"));
333*e7b1675dSTing-Kang Chang EXPECT_TRUE(jwt2.HasIssuer());
334*e7b1675dSTing-Kang Chang EXPECT_THAT(jwt2.GetIssuer(), IsOkAndHolds("issuer"));
335*e7b1675dSTing-Kang Chang }
336*e7b1675dSTing-Kang Chang
337*e7b1675dSTing-Kang Chang } // namespace
338*e7b1675dSTing-Kang Chang
339*e7b1675dSTing-Kang Chang } // namespace tink
340*e7b1675dSTing-Kang Chang } // namespace crypto
341