blob: 50ef7296efacae7e9750a187843486dc00ff1f7a [file] [log] [blame]
Steven Valdez0b710a32020-02-14 10:34:53 -05001/* Copyright (c) 2020, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
Steven Valdez538a1242019-12-16 12:12:31 -050015#include <stdio.h>
16#include <string.h>
17#include <time.h>
18
19#include <algorithm>
20#include <limits>
21#include <string>
22#include <tuple>
23#include <utility>
24#include <vector>
25
Steven Valdez0b710a32020-02-14 10:34:53 -050026#include <gtest/gtest.h>
27
Steven Valdez538a1242019-12-16 12:12:31 -050028#include <openssl/bytestring.h>
29#include <openssl/curve25519.h>
30#include <openssl/evp.h>
31#include <openssl/mem.h>
32#include <openssl/rand.h>
Steven Valdez0b710a32020-02-14 10:34:53 -050033#include <openssl/trust_token.h>
34
David Benjaminaa764c42020-04-29 12:39:10 -040035#include "../ec_extra/internal.h"
36#include "../fipsmodule/ec/internal.h"
Steven Valdez538a1242019-12-16 12:12:31 -050037#include "../internal.h"
David Benjaminaa764c42020-04-29 12:39:10 -040038#include "../test/test_util.h"
Steven Valdez538a1242019-12-16 12:12:31 -050039#include "internal.h"
40
41
42BSSL_NAMESPACE_BEGIN
43
44namespace {
Steven Valdez0b710a32020-02-14 10:34:53 -050045
David Benjaminaa764c42020-04-29 12:39:10 -040046TEST(TrustTokenTest, KeyGenExp0) {
Steven Valdez0b710a32020-02-14 10:34:53 -050047 uint8_t priv_key[TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE];
48 uint8_t pub_key[TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE];
49 size_t priv_key_len, pub_key_len;
50 ASSERT_TRUE(TRUST_TOKEN_generate_key(
David Benjamin239634d2020-04-29 11:17:51 -040051 TRUST_TOKEN_experiment_v0(), priv_key, &priv_key_len,
52 TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE, pub_key, &pub_key_len,
53 TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001));
Steven Valdez0b710a32020-02-14 10:34:53 -050054 ASSERT_EQ(400u, priv_key_len);
55 ASSERT_EQ(409u, pub_key_len);
56}
Steven Valdez538a1242019-12-16 12:12:31 -050057
David Benjaminaa764c42020-04-29 12:39:10 -040058TEST(TrustTokenTest, KeyGenExp1) {
59 uint8_t priv_key[TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE];
60 uint8_t pub_key[TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE];
61 size_t priv_key_len, pub_key_len;
62 ASSERT_TRUE(TRUST_TOKEN_generate_key(
63 TRUST_TOKEN_experiment_v1(), priv_key, &priv_key_len,
64 TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE, pub_key, &pub_key_len,
65 TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001));
66 ASSERT_EQ(292u, priv_key_len);
67 ASSERT_EQ(301u, pub_key_len);
68}
69
70// Test that H in |TRUST_TOKEN_experiment_v1| was computed correctly.
71TEST(TrustTokenTest, HExp1) {
72 const EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1);
73 ASSERT_TRUE(group);
74
75 const uint8_t kHGen[] = "generator";
76 const uint8_t kHLabel[] = "PMBTokens Experiment V1 HashH";
77
78 EC_RAW_POINT expected_h;
79 ASSERT_TRUE(ec_hash_to_curve_p384_xmd_sha512_sswu_draft07(
80 group, &expected_h, kHLabel, sizeof(kHLabel), kHGen, sizeof(kHGen)));
81 uint8_t expected_bytes[1 + 2 * EC_MAX_BYTES];
82 size_t expected_len =
83 ec_point_to_bytes(group, &expected_h, POINT_CONVERSION_UNCOMPRESSED,
84 expected_bytes, sizeof(expected_bytes));
85
86 uint8_t h[97];
87 ASSERT_TRUE(pmbtoken_exp1_get_h_for_testing(h));
88 EXPECT_EQ(Bytes(h), Bytes(expected_bytes, expected_len));
89}
90
91static std::vector<const TRUST_TOKEN_METHOD *> AllMethods() {
92 return {TRUST_TOKEN_experiment_v0(), TRUST_TOKEN_experiment_v1()};
93}
94
95class TrustTokenProtocolTestBase : public ::testing::Test {
Steven Valdez538a1242019-12-16 12:12:31 -050096 public:
David Benjaminaa764c42020-04-29 12:39:10 -040097 explicit TrustTokenProtocolTestBase(const TRUST_TOKEN_METHOD *method)
98 : method_(method) {}
99
Steven Valdez538a1242019-12-16 12:12:31 -0500100 // KeyID returns the key ID associated with key index |i|.
101 static uint32_t KeyID(size_t i) {
102 // Use a different value from the indices to that we do not mix them up.
103 return 7 + i;
104 }
105
David Benjaminaa764c42020-04-29 12:39:10 -0400106 const TRUST_TOKEN_METHOD *method() { return method_; }
David Benjamin239634d2020-04-29 11:17:51 -0400107
Steven Valdez538a1242019-12-16 12:12:31 -0500108 protected:
109 void SetupContexts() {
David Benjamin239634d2020-04-29 11:17:51 -0400110 client.reset(TRUST_TOKEN_CLIENT_new(method(), client_max_batchsize));
Steven Valdez538a1242019-12-16 12:12:31 -0500111 ASSERT_TRUE(client);
David Benjamin239634d2020-04-29 11:17:51 -0400112 issuer.reset(TRUST_TOKEN_ISSUER_new(method(), issuer_max_batchsize));
Steven Valdez538a1242019-12-16 12:12:31 -0500113 ASSERT_TRUE(issuer);
114
115 for (size_t i = 0; i < 3; i++) {
116 uint8_t priv_key[TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE];
117 uint8_t pub_key[TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE];
118 size_t priv_key_len, pub_key_len, key_index;
119 ASSERT_TRUE(TRUST_TOKEN_generate_key(
David Benjamin239634d2020-04-29 11:17:51 -0400120 method(), priv_key, &priv_key_len, TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE,
121 pub_key, &pub_key_len, TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, KeyID(i)));
Steven Valdez538a1242019-12-16 12:12:31 -0500122 ASSERT_TRUE(TRUST_TOKEN_CLIENT_add_key(client.get(), &key_index, pub_key,
123 pub_key_len));
124 ASSERT_EQ(i, key_index);
125 ASSERT_TRUE(
126 TRUST_TOKEN_ISSUER_add_key(issuer.get(), priv_key, priv_key_len));
127 }
128
129 uint8_t public_key[32], private_key[64];
130 ED25519_keypair(public_key, private_key);
131 bssl::UniquePtr<EVP_PKEY> priv(EVP_PKEY_new_raw_private_key(
132 EVP_PKEY_ED25519, nullptr, private_key, 32));
133 ASSERT_TRUE(priv);
134 bssl::UniquePtr<EVP_PKEY> pub(
135 EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, nullptr, public_key, 32));
136 ASSERT_TRUE(pub);
137
138 TRUST_TOKEN_CLIENT_set_srr_key(client.get(), pub.get());
139 TRUST_TOKEN_ISSUER_set_srr_key(issuer.get(), priv.get());
140 RAND_bytes(metadata_key, sizeof(metadata_key));
141 ASSERT_TRUE(TRUST_TOKEN_ISSUER_set_metadata_key(issuer.get(), metadata_key,
142 sizeof(metadata_key)));
143 }
144
David Benjaminaa764c42020-04-29 12:39:10 -0400145 const TRUST_TOKEN_METHOD *method_;
Steven Valdez538a1242019-12-16 12:12:31 -0500146 uint16_t client_max_batchsize = 10;
147 uint16_t issuer_max_batchsize = 10;
148 bssl::UniquePtr<TRUST_TOKEN_CLIENT> client;
149 bssl::UniquePtr<TRUST_TOKEN_ISSUER> issuer;
150 uint8_t metadata_key[32];
151};
152
David Benjaminaa764c42020-04-29 12:39:10 -0400153class TrustTokenProtocolTest
154 : public TrustTokenProtocolTestBase,
155 public testing::WithParamInterface<const TRUST_TOKEN_METHOD *> {
156 public:
157 TrustTokenProtocolTest() : TrustTokenProtocolTestBase(GetParam()) {}
158};
159
160INSTANTIATE_TEST_SUITE_P(TrustTokenAllProtocolTest, TrustTokenProtocolTest,
161 testing::ValuesIn(AllMethods()));
162
163TEST_P(TrustTokenProtocolTest, InvalidToken) {
Steven Valdez538a1242019-12-16 12:12:31 -0500164 ASSERT_NO_FATAL_FAILURE(SetupContexts());
165
166 uint8_t *issue_msg = NULL, *issue_resp = NULL;
167 size_t msg_len, resp_len;
168
169 size_t key_index;
David Benjamin17078f22020-04-28 17:50:13 -0400170 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500171 ASSERT_TRUE(
172 TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, &msg_len, 1));
173 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
174 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
175 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
176 /*public_metadata=*/KeyID(0), /*private_metadata=*/1,
177 /*max_issuance=*/10));
178 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
179 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
180 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
181 resp_len));
182 ASSERT_TRUE(tokens);
183
184 for (TRUST_TOKEN *token : tokens.get()) {
185 // Corrupt the token.
186 token->data[0] ^= 0x42;
187
188 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
189 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption(
190 client.get(), &redeem_msg, &msg_len, token, NULL, 0, 0));
191 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
192 TRUST_TOKEN *rtoken;
193 uint8_t *client_data;
194 size_t client_data_len;
195 uint64_t redemption_time;
196 ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem(
197 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
198 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
199 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
200 }
201}
202
David Benjaminaa764c42020-04-29 12:39:10 -0400203TEST_P(TrustTokenProtocolTest, TruncatedIssuanceRequest) {
Steven Valdez538a1242019-12-16 12:12:31 -0500204 ASSERT_NO_FATAL_FAILURE(SetupContexts());
205
206 uint8_t *issue_msg = NULL, *issue_resp = NULL;
207 size_t msg_len, resp_len;
208 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
209 &msg_len, 10));
210 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
211 msg_len = 10;
David Benjamin17078f22020-04-28 17:50:13 -0400212 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500213 ASSERT_FALSE(TRUST_TOKEN_ISSUER_issue(
214 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
215 /*public_metadata=*/KeyID(0), /*private_metadata=*/0,
216 /*max_issuance=*/10));
217 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
218}
219
David Benjaminaa764c42020-04-29 12:39:10 -0400220TEST_P(TrustTokenProtocolTest, TruncatedIssuanceResponse) {
Steven Valdez538a1242019-12-16 12:12:31 -0500221 ASSERT_NO_FATAL_FAILURE(SetupContexts());
222
223 uint8_t *issue_msg = NULL, *issue_resp = NULL;
224 size_t msg_len, resp_len;
225 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
226 &msg_len, 10));
227 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400228 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500229 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
230 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
231 /*public_metadata=*/KeyID(0), /*private_metadata=*/0,
232 /*max_issuance=*/10));
233 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
234 resp_len = 10;
235 size_t key_index;
236 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
237 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
238 resp_len));
239 ASSERT_FALSE(tokens);
240}
241
David Benjaminaa764c42020-04-29 12:39:10 -0400242TEST_P(TrustTokenProtocolTest, ExtraDataIssuanceResponse) {
David Benjamincbe128b2020-04-21 23:05:27 -0400243 ASSERT_NO_FATAL_FAILURE(SetupContexts());
244
245 uint8_t *request = NULL, *response = NULL;
246 size_t request_len, response_len;
247 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &request,
248 &request_len, 10));
249 bssl::UniquePtr<uint8_t> free_request(request);
David Benjamin17078f22020-04-28 17:50:13 -0400250 size_t tokens_issued;
David Benjamincbe128b2020-04-21 23:05:27 -0400251 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(issuer.get(), &response, &response_len,
252 &tokens_issued, request, request_len,
253 /*public_metadata=*/KeyID(0),
254 /*private_metadata=*/0,
255 /*max_issuance=*/10));
256 bssl::UniquePtr<uint8_t> free_response(response);
257 std::vector<uint8_t> response2(response, response + response_len);
258 response2.push_back(0);
259 size_t key_index;
260 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
261 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index,
262 response2.data(), response2.size()));
263 ASSERT_FALSE(tokens);
264}
265
David Benjaminaa764c42020-04-29 12:39:10 -0400266TEST_P(TrustTokenProtocolTest, TruncatedRedemptionRequest) {
Steven Valdez538a1242019-12-16 12:12:31 -0500267 ASSERT_NO_FATAL_FAILURE(SetupContexts());
268
269 uint8_t *issue_msg = NULL, *issue_resp = NULL;
270 size_t msg_len, resp_len;
271 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
272 &msg_len, 10));
273 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400274 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500275 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
276 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
277 /*public_metadata=*/KeyID(0), /*private_metadata=*/0,
278 /*max_issuance=*/10));
279 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
280 size_t key_index;
281 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
282 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
283 resp_len));
284 ASSERT_TRUE(tokens);
285
286 for (TRUST_TOKEN *token : tokens.get()) {
Steven Valdez8f3019e2020-04-17 09:36:06 -0400287 const uint8_t kClientData[] = "\x70TEST CLIENT DATA";
Steven Valdez538a1242019-12-16 12:12:31 -0500288 uint64_t kRedemptionTime = 13374242;
289
290 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
291 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption(
292 client.get(), &redeem_msg, &msg_len, token, kClientData,
293 sizeof(kClientData) - 1, kRedemptionTime));
294 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
295 msg_len = 10;
296
297 TRUST_TOKEN *rtoken;
298 uint8_t *client_data;
299 size_t client_data_len;
300 uint64_t redemption_time;
301 ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem(
302 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
303 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
304 }
305}
306
David Benjaminaa764c42020-04-29 12:39:10 -0400307TEST_P(TrustTokenProtocolTest, TruncatedRedemptionResponse) {
Steven Valdez538a1242019-12-16 12:12:31 -0500308 ASSERT_NO_FATAL_FAILURE(SetupContexts());
309
310 uint8_t *issue_msg = NULL, *issue_resp = NULL;
311 size_t msg_len, resp_len;
312 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
313 &msg_len, 10));
314 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400315 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500316 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
317 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
318 /*public_metadata=*/KeyID(0), /*private_metadata=*/0,
319 /*max_issuance=*/10));
320 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
321 size_t key_index;
322 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
323 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
324 resp_len));
325 ASSERT_TRUE(tokens);
326
327 for (TRUST_TOKEN *token : tokens.get()) {
Steven Valdez8f3019e2020-04-17 09:36:06 -0400328 const uint8_t kClientData[] = "\x70TEST CLIENT DATA";
Steven Valdez538a1242019-12-16 12:12:31 -0500329 uint64_t kRedemptionTime = 13374242;
330
331 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
332 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption(
333 client.get(), &redeem_msg, &msg_len, token, kClientData,
334 sizeof(kClientData) - 1, kRedemptionTime));
335 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
336 TRUST_TOKEN *rtoken;
337 uint8_t *client_data;
338 size_t client_data_len;
339 uint64_t redemption_time;
340 ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem(
341 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
342 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
343 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
344 bssl::UniquePtr<uint8_t> free_client_data(client_data);
345 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
346
347 ASSERT_EQ(redemption_time, kRedemptionTime);
348 ASSERT_TRUE(sizeof(kClientData) - 1 == client_data_len);
349 ASSERT_EQ(OPENSSL_memcmp(kClientData, client_data, client_data_len), 0);
350 resp_len = 10;
351
352 uint8_t *srr = NULL, *sig = NULL;
353 size_t srr_len, sig_len;
354 ASSERT_FALSE(TRUST_TOKEN_CLIENT_finish_redemption(
355 client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp, resp_len));
356 bssl::UniquePtr<uint8_t> free_srr(srr);
357 bssl::UniquePtr<uint8_t> free_sig(sig);
358 }
359}
360
David Benjaminaa764c42020-04-29 12:39:10 -0400361TEST_P(TrustTokenProtocolTest, IssuedWithBadKeyID) {
David Benjamin239634d2020-04-29 11:17:51 -0400362 client.reset(TRUST_TOKEN_CLIENT_new(method(), client_max_batchsize));
Steven Valdez538a1242019-12-16 12:12:31 -0500363 ASSERT_TRUE(client);
David Benjamin239634d2020-04-29 11:17:51 -0400364 issuer.reset(TRUST_TOKEN_ISSUER_new(method(), issuer_max_batchsize));
Steven Valdez538a1242019-12-16 12:12:31 -0500365 ASSERT_TRUE(issuer);
366
367 // We configure the client and the issuer with different key IDs and test
368 // that the client notices.
369 const uint32_t kClientKeyID = 0;
370 const uint32_t kIssuerKeyID = 42;
371
372 uint8_t priv_key[TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE];
373 uint8_t pub_key[TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE];
374 size_t priv_key_len, pub_key_len, key_index;
375 ASSERT_TRUE(TRUST_TOKEN_generate_key(
David Benjamin239634d2020-04-29 11:17:51 -0400376 method(), priv_key, &priv_key_len, TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE,
377 pub_key, &pub_key_len, TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, kClientKeyID));
Steven Valdez538a1242019-12-16 12:12:31 -0500378 ASSERT_TRUE(TRUST_TOKEN_CLIENT_add_key(client.get(), &key_index, pub_key,
379 pub_key_len));
380 ASSERT_EQ(0UL, key_index);
381
382 ASSERT_TRUE(TRUST_TOKEN_generate_key(
David Benjamin239634d2020-04-29 11:17:51 -0400383 method(), priv_key, &priv_key_len, TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE,
384 pub_key, &pub_key_len, TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, kIssuerKeyID));
Steven Valdez538a1242019-12-16 12:12:31 -0500385 ASSERT_TRUE(TRUST_TOKEN_ISSUER_add_key(issuer.get(), priv_key, priv_key_len));
386
387
388 uint8_t public_key[32], private_key[64];
389 ED25519_keypair(public_key, private_key);
390 bssl::UniquePtr<EVP_PKEY> priv(
391 EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, nullptr, private_key, 32));
392 ASSERT_TRUE(priv);
393 bssl::UniquePtr<EVP_PKEY> pub(
394 EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, nullptr, public_key, 32));
395 ASSERT_TRUE(pub);
396
397 TRUST_TOKEN_CLIENT_set_srr_key(client.get(), pub.get());
398 TRUST_TOKEN_ISSUER_set_srr_key(issuer.get(), priv.get());
399 RAND_bytes(metadata_key, sizeof(metadata_key));
400 ASSERT_TRUE(TRUST_TOKEN_ISSUER_set_metadata_key(issuer.get(), metadata_key,
401 sizeof(metadata_key)));
402
403
404 uint8_t *issue_msg = NULL, *issue_resp = NULL;
405 size_t msg_len, resp_len;
406 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
407 &msg_len, 10));
408 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400409 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500410 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
411 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
412 /*public_metadata=*/42, /*private_metadata=*/0, /*max_issuance=*/10));
413 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
414 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
415 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
416 resp_len));
417 ASSERT_FALSE(tokens);
418}
419
420class TrustTokenMetadataTest
David Benjaminaa764c42020-04-29 12:39:10 -0400421 : public TrustTokenProtocolTestBase,
422 public testing::WithParamInterface<
423 std::tuple<const TRUST_TOKEN_METHOD *, int, bool>> {
424 public:
425 TrustTokenMetadataTest()
426 : TrustTokenProtocolTestBase(std::get<0>(GetParam())) {}
427
428 int public_metadata() { return std::get<1>(GetParam()); }
429 bool private_metadata() { return std::get<2>(GetParam()); }
430};
Steven Valdez538a1242019-12-16 12:12:31 -0500431
432TEST_P(TrustTokenMetadataTest, SetAndGetMetadata) {
433 ASSERT_NO_FATAL_FAILURE(SetupContexts());
434
435 uint8_t *issue_msg = NULL, *issue_resp = NULL;
436 size_t msg_len, resp_len;
437 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
438 &msg_len, 10));
439 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400440 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500441 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
442 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
David Benjaminaa764c42020-04-29 12:39:10 -0400443 public_metadata(), private_metadata(), /*max_issuance=*/1));
Steven Valdez538a1242019-12-16 12:12:31 -0500444 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
445 size_t key_index;
446 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
447 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
448 resp_len));
449 ASSERT_TRUE(tokens);
450
451 for (TRUST_TOKEN *token : tokens.get()) {
Steven Valdez8f3019e2020-04-17 09:36:06 -0400452 const uint8_t kClientData[] = "\x70TEST CLIENT DATA";
Steven Valdez538a1242019-12-16 12:12:31 -0500453 uint64_t kRedemptionTime = 13374242;
454
455 const uint8_t kExpectedSRR[] =
Steven Valdez8f3019e2020-04-17 09:36:06 -0400456 "\xa3\x68\x6d\x65\x74\x61\x64\x61\x74\x61\xa2\x66\x70\x75\x62\x6c\x69"
457 "\x63\x00\x67\x70\x72\x69\x76\x61\x74\x65\x00\x6b\x63\x6c\x69\x65\x6e"
458 "\x74\x2d\x64\x61\x74\x61\x70\x54\x45\x53\x54\x20\x43\x4c\x49\x45\x4e"
459 "\x54\x20\x44\x41\x54\x41\x70\x65\x78\x70\x69\x72\x79\x2d\x74\x69\x6d"
460 "\x65\x73\x74\x61\x6d\x70\x1a\x00\xcc\x15\x7a";
Steven Valdez538a1242019-12-16 12:12:31 -0500461
462 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
463 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption(
464 client.get(), &redeem_msg, &msg_len, token, kClientData,
465 sizeof(kClientData) - 1, kRedemptionTime));
466 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
467 TRUST_TOKEN *rtoken;
468 uint8_t *client_data;
469 size_t client_data_len;
470 uint64_t redemption_time;
471 ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem(
472 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
473 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
474 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
475 bssl::UniquePtr<uint8_t> free_client_data(client_data);
476 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
477
478 ASSERT_EQ(redemption_time, kRedemptionTime);
479 ASSERT_TRUE(sizeof(kClientData) - 1 == client_data_len);
480 ASSERT_EQ(OPENSSL_memcmp(kClientData, client_data, client_data_len), 0);
481
482 uint8_t *srr = NULL, *sig = NULL;
483 size_t srr_len, sig_len;
484 ASSERT_TRUE(TRUST_TOKEN_CLIENT_finish_redemption(
485 client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp, resp_len));
486 bssl::UniquePtr<uint8_t> free_srr(srr);
487 bssl::UniquePtr<uint8_t> free_sig(sig);
488
David Benjaminaa764c42020-04-29 12:39:10 -0400489 uint8_t decode_private_metadata;
Steven Valdez538a1242019-12-16 12:12:31 -0500490 ASSERT_TRUE(TRUST_TOKEN_decode_private_metadata(
David Benjaminaa764c42020-04-29 12:39:10 -0400491 method(), &decode_private_metadata, metadata_key, sizeof(metadata_key),
David Benjamin239634d2020-04-29 11:17:51 -0400492 kClientData, sizeof(kClientData) - 1, srr[27]));
David Benjaminaa764c42020-04-29 12:39:10 -0400493 ASSERT_EQ(srr[18], public_metadata());
494 ASSERT_EQ(decode_private_metadata, private_metadata());
Steven Valdez538a1242019-12-16 12:12:31 -0500495
496 // Clear out the metadata bits.
Steven Valdez8f3019e2020-04-17 09:36:06 -0400497 srr[18] = 0;
498 srr[27] = 0;
Steven Valdez538a1242019-12-16 12:12:31 -0500499
500 ASSERT_TRUE(sizeof(kExpectedSRR) - 1 == srr_len);
501 ASSERT_EQ(OPENSSL_memcmp(kExpectedSRR, srr, srr_len), 0);
502 }
503}
504
505TEST_P(TrustTokenMetadataTest, TooManyRequests) {
506 issuer_max_batchsize = 1;
507 ASSERT_NO_FATAL_FAILURE(SetupContexts());
508
509 uint8_t *issue_msg = NULL, *issue_resp = NULL;
510 size_t msg_len, resp_len;
511 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
512 &msg_len, 10));
513 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400514 size_t tokens_issued;
Steven Valdez538a1242019-12-16 12:12:31 -0500515 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
516 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
David Benjaminaa764c42020-04-29 12:39:10 -0400517 public_metadata(), private_metadata(), /*max_issuance=*/1));
Steven Valdez538a1242019-12-16 12:12:31 -0500518 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
519 ASSERT_EQ(tokens_issued, issuer_max_batchsize);
520 size_t key_index;
521 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
522 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
523 resp_len));
524 ASSERT_TRUE(tokens);
525 ASSERT_EQ(sk_TRUST_TOKEN_num(tokens.get()), 1UL);
526}
527
Steven Valdez78987bb2020-04-09 14:57:31 -0400528
529TEST_P(TrustTokenMetadataTest, TruncatedProof) {
530 ASSERT_NO_FATAL_FAILURE(SetupContexts());
531
532 uint8_t *issue_msg = NULL, *issue_resp = NULL;
533 size_t msg_len, resp_len;
534 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
535 &msg_len, 10));
536 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400537 size_t tokens_issued;
Steven Valdez78987bb2020-04-09 14:57:31 -0400538 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
539 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
David Benjaminaa764c42020-04-29 12:39:10 -0400540 public_metadata(), private_metadata(), /*max_issuance=*/1));
Steven Valdez78987bb2020-04-09 14:57:31 -0400541 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
542
543 CBS real_response;
544 CBS_init(&real_response, issue_resp, resp_len);
545 uint16_t count;
546 uint32_t public_metadata;
547 bssl::ScopedCBB bad_response;
548 ASSERT_TRUE(CBB_init(bad_response.get(), 0));
549 ASSERT_TRUE(CBS_get_u16(&real_response, &count));
550 ASSERT_TRUE(CBB_add_u16(bad_response.get(), count));
551 ASSERT_TRUE(CBS_get_u32(&real_response, &public_metadata));
552 ASSERT_TRUE(CBB_add_u32(bad_response.get(), public_metadata));
553
554 for (size_t i = 0; i < count; i++) {
555 uint8_t s[PMBTOKEN_NONCE_SIZE];
556 CBS tmp;
557 ASSERT_TRUE(CBS_copy_bytes(&real_response, s, PMBTOKEN_NONCE_SIZE));
558 ASSERT_TRUE(CBB_add_bytes(bad_response.get(), s, PMBTOKEN_NONCE_SIZE));
559 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
560 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp)));
561 ASSERT_TRUE(
562 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp)));
563 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
564 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp)));
565 ASSERT_TRUE(
566 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp)));
567 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
568 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp) - 2));
569 ASSERT_TRUE(
570 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp) - 2));
571 }
572
573 uint8_t *bad_buf;
574 size_t bad_len;
575 ASSERT_TRUE(CBB_finish(bad_response.get(), &bad_buf, &bad_len));
576 bssl::UniquePtr<uint8_t> free_bad(bad_buf);
577
578 size_t key_index;
579 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
David Benjaminaa764c42020-04-29 12:39:10 -0400580 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, bad_buf,
581 bad_len));
Steven Valdez78987bb2020-04-09 14:57:31 -0400582 ASSERT_FALSE(tokens);
583}
584
585TEST_P(TrustTokenMetadataTest, ExcessDataProof) {
586 ASSERT_NO_FATAL_FAILURE(SetupContexts());
587
588 uint8_t *issue_msg = NULL, *issue_resp = NULL;
589 size_t msg_len, resp_len;
590 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
591 &msg_len, 10));
592 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
David Benjamin17078f22020-04-28 17:50:13 -0400593 size_t tokens_issued;
Steven Valdez78987bb2020-04-09 14:57:31 -0400594 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
595 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
David Benjaminaa764c42020-04-29 12:39:10 -0400596 public_metadata(), private_metadata(), /*max_issuance=*/1));
Steven Valdez78987bb2020-04-09 14:57:31 -0400597 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
598
599 CBS real_response;
600 CBS_init(&real_response, issue_resp, resp_len);
601 uint16_t count;
602 uint32_t public_metadata;
603 bssl::ScopedCBB bad_response;
604 ASSERT_TRUE(CBB_init(bad_response.get(), 0));
605 ASSERT_TRUE(CBS_get_u16(&real_response, &count));
606 ASSERT_TRUE(CBB_add_u16(bad_response.get(), count));
607 ASSERT_TRUE(CBS_get_u32(&real_response, &public_metadata));
608 ASSERT_TRUE(CBB_add_u32(bad_response.get(), public_metadata));
609
610 for (size_t i = 0; i < count; i++) {
611 uint8_t s[PMBTOKEN_NONCE_SIZE];
612 CBS tmp;
613 ASSERT_TRUE(CBS_copy_bytes(&real_response, s, PMBTOKEN_NONCE_SIZE));
614 ASSERT_TRUE(CBB_add_bytes(bad_response.get(), s, PMBTOKEN_NONCE_SIZE));
615 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
616 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp)));
617 ASSERT_TRUE(
618 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp)));
619 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
620 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp)));
621 ASSERT_TRUE(
622 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp)));
623 ASSERT_TRUE(CBS_get_u16_length_prefixed(&real_response, &tmp));
624 ASSERT_TRUE(CBB_add_u16(bad_response.get(), CBS_len(&tmp) + 2));
625 ASSERT_TRUE(
626 CBB_add_bytes(bad_response.get(), CBS_data(&tmp), CBS_len(&tmp)));
627 ASSERT_TRUE(CBB_add_u16(bad_response.get(), 42));
628 }
629
630 uint8_t *bad_buf;
631 size_t bad_len;
632 ASSERT_TRUE(CBB_finish(bad_response.get(), &bad_buf, &bad_len));
633 bssl::UniquePtr<uint8_t> free_bad(bad_buf);
634
635 size_t key_index;
636 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
637 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, bad_buf,
638 bad_len));
639 ASSERT_FALSE(tokens);
640}
641
Steven Valdez538a1242019-12-16 12:12:31 -0500642INSTANTIATE_TEST_SUITE_P(
643 TrustTokenAllMetadataTest, TrustTokenMetadataTest,
David Benjaminaa764c42020-04-29 12:39:10 -0400644 testing::Combine(testing::ValuesIn(AllMethods()),
645 testing::Values(TrustTokenProtocolTest::KeyID(0),
Steven Valdez538a1242019-12-16 12:12:31 -0500646 TrustTokenProtocolTest::KeyID(1),
647 TrustTokenProtocolTest::KeyID(2)),
648 testing::Bool()));
649
Steven Valdez78987bb2020-04-09 14:57:31 -0400650class TrustTokenBadKeyTest
David Benjaminaa764c42020-04-29 12:39:10 -0400651 : public TrustTokenProtocolTestBase,
652 public testing::WithParamInterface<
653 std::tuple<const TRUST_TOKEN_METHOD *, bool, int>> {
654 public:
655 TrustTokenBadKeyTest()
656 : TrustTokenProtocolTestBase(std::get<0>(GetParam())) {}
657
658 bool private_metadata() { return std::get<1>(GetParam()); }
659 int corrupted_key() { return std::get<2>(GetParam()); }
660};
Steven Valdez78987bb2020-04-09 14:57:31 -0400661
662TEST_P(TrustTokenBadKeyTest, BadKey) {
663 ASSERT_NO_FATAL_FAILURE(SetupContexts());
664
665 uint8_t *issue_msg = NULL, *issue_resp = NULL;
666 size_t msg_len, resp_len;
667 ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg,
668 &msg_len, 10));
669 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
670
671 struct trust_token_issuer_key_st *key = &issuer->keys[0];
David Benjamin090ee962020-04-28 17:08:37 -0400672 EC_SCALAR *scalars[] = {&key->key.x0, &key->key.y0, &key->key.x1,
673 &key->key.y1, &key->key.xs, &key->key.ys};
Steven Valdez78987bb2020-04-09 14:57:31 -0400674
675 // Corrupt private key scalar.
David Benjaminaa764c42020-04-29 12:39:10 -0400676 scalars[corrupted_key()]->bytes[0] ^= 42;
Steven Valdez78987bb2020-04-09 14:57:31 -0400677
David Benjamin17078f22020-04-28 17:50:13 -0400678 size_t tokens_issued;
Steven Valdez78987bb2020-04-09 14:57:31 -0400679 ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
680 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
David Benjaminaa764c42020-04-29 12:39:10 -0400681 /*public_metadata=*/7, private_metadata(), /*max_issuance=*/1));
Steven Valdez78987bb2020-04-09 14:57:31 -0400682 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
683 size_t key_index;
684 bssl::UniquePtr<STACK_OF(TRUST_TOKEN)> tokens(
685 TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp,
686 resp_len));
687
688 // If the unused private key is corrupted, then the DLEQ proof should succeed.
David Benjaminaa764c42020-04-29 12:39:10 -0400689 if ((corrupted_key() / 2 == 0 && private_metadata() == true) ||
690 (corrupted_key() / 2 == 1 && private_metadata() == false)) {
Steven Valdez78987bb2020-04-09 14:57:31 -0400691 ASSERT_TRUE(tokens);
692 } else {
693 ASSERT_FALSE(tokens);
694 }
695}
696
David Benjaminaa764c42020-04-29 12:39:10 -0400697INSTANTIATE_TEST_SUITE_P(TrustTokenAllBadKeyTest, TrustTokenBadKeyTest,
698 testing::Combine(testing::ValuesIn(AllMethods()),
699 testing::Bool(),
700 testing::Values(0, 1, 2, 3, 4, 5)));
Steven Valdez78987bb2020-04-09 14:57:31 -0400701
Steven Valdez538a1242019-12-16 12:12:31 -0500702} // namespace
703BSSL_NAMESPACE_END