26 #include <gtest/gtest.h>
36 #include "../ec_extra/internal.h"
37 #include "../fipsmodule/ec/internal.h"
38 #include "../internal.h"
39 #include "../test/test_util.h"
47 TEST(TrustTokenTest, KeyGenExp1) {
50 size_t priv_key_len, pub_key_len;
59 TEST(TrustTokenTest, KeyGenExp2VOPRF) {
62 size_t priv_key_len, pub_key_len;
71 TEST(TrustTokenTest, KeyGenExp2PMB) {
74 size_t priv_key_len, pub_key_len;
84 TEST(TrustTokenTest, HExp1) {
88 const uint8_t kHGen[] =
"generator";
89 const uint8_t kHLabel[] =
"PMBTokens Experiment V1 HashH";
94 group, &expected_h->raw, kHLabel,
sizeof(kHLabel), kHGen,
sizeof(kHGen)));
98 expected_bytes,
sizeof(expected_bytes),
nullptr);
110 const uint8_t kHGen[] =
"generator";
111 const uint8_t kHLabel[] =
"PMBTokens Experiment V2 HashH";
116 group, &expected_h->raw, kHLabel,
sizeof(kHLabel), kHGen,
sizeof(kHGen)));
118 size_t expected_len =
120 expected_bytes,
sizeof(expected_bytes),
nullptr);
127 static std::vector<const TRUST_TOKEN_METHOD *>
AllMethods() {
138 : method_(method_arg) {}
155 for (
size_t i = 0;
i <
method()->max_keys;
i++) {
158 size_t priv_key_len, pub_key_len, key_index;
174 bssl::UniquePtr<EVP_PKEY> pub(
180 RAND_bytes(metadata_key,
sizeof(metadata_key));
182 sizeof(metadata_key)));
188 bssl::UniquePtr<TRUST_TOKEN_CLIENT>
client;
189 bssl::UniquePtr<TRUST_TOKEN_ISSUER>
issuer;
206 uint8_t *issue_msg = NULL, *issue_resp = NULL;
207 size_t msg_len, resp_len;
210 size_t tokens_issued;
213 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
215 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
218 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
226 token->data[0] ^= 0x42;
228 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
230 client.get(), &redeem_msg, &msg_len, token, NULL, 0, 0));
231 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
234 size_t client_data_len;
237 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
238 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
239 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
246 uint8_t *issue_msg = NULL, *issue_resp = NULL;
247 size_t msg_len, resp_len;
250 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
252 size_t tokens_issued;
254 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
257 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
263 uint8_t *issue_msg = NULL, *issue_resp = NULL;
264 size_t msg_len, resp_len;
267 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
268 size_t tokens_issued;
270 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
273 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
289 bssl::UniquePtr<uint8_t> free_request(
request);
290 size_t tokens_issued;
292 &tokens_issued,
request, request_len,
296 bssl::UniquePtr<uint8_t> free_response(
response);
298 response2.push_back(0);
302 response2.data(), response2.size()));
309 uint8_t *issue_msg = NULL, *issue_resp = NULL;
310 size_t msg_len, resp_len;
313 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
314 size_t tokens_issued;
316 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
319 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
327 const uint8_t kClientData[] =
"\x70TEST CLIENT DATA";
330 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
332 client.get(), &redeem_msg, &msg_len, token, kClientData,
333 sizeof(kClientData) - 1, kRedemptionTime));
334 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
339 size_t client_data_len;
342 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
343 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
350 uint8_t *issue_msg = NULL, *issue_resp = NULL;
351 size_t msg_len, resp_len;
354 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
355 size_t tokens_issued;
357 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
360 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
368 const uint8_t kClientData[] =
"\x70TEST CLIENT DATA";
371 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
373 client.get(), &redeem_msg, &msg_len, token, kClientData,
374 sizeof(kClientData) - 1, kRedemptionTime));
375 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
378 size_t client_data_len;
381 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
382 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
383 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
384 bssl::UniquePtr<uint8_t> free_client_data(client_data);
385 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
387 ASSERT_EQ(redemption_time, kRedemptionTime);
389 Bytes(client_data, client_data_len));
394 uint8_t *srr = NULL, *sig = NULL;
395 size_t srr_len, sig_len;
396 bool expect_failure = !
method()->has_srr;
398 client.get(), &srr, &srr_len, &sig, &sig_len,
399 redeem_resp, resp_len));
400 bssl::UniquePtr<uint8_t> free_srr(srr);
401 bssl::UniquePtr<uint8_t> free_sig(sig);
418 size_t priv_key_len, pub_key_len, key_index;
434 bssl::UniquePtr<EVP_PKEY> priv(
437 bssl::UniquePtr<EVP_PKEY> pub(
443 RAND_bytes(metadata_key,
sizeof(metadata_key));
445 sizeof(metadata_key)));
448 uint8_t *issue_msg = NULL, *issue_resp = NULL;
449 size_t msg_len, resp_len;
452 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
453 size_t tokens_issued;
455 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
457 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
467 std::tuple<const TRUST_TOKEN_METHOD *, int, bool>> {
479 uint8_t *issue_msg = NULL, *issue_resp = NULL;
480 size_t msg_len, resp_len;
483 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
484 size_t tokens_issued;
486 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
487 public_metadata(), private_metadata(), 1);
488 if (!
method()->has_private_metadata && private_metadata()) {
493 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
501 const uint8_t kClientData[] =
"\x70TEST CLIENT DATA";
504 const uint8_t kExpectedSRRV1[] =
505 "\xa4\x68\x6d\x65\x74\x61\x64\x61\x74\x61\xa2\x66\x70\x75\x62\x6c\x69"
506 "\x63\x00\x67\x70\x72\x69\x76\x61\x74\x65\x00\x6a\x74\x6f\x6b\x65\x6e"
507 "\x2d\x68\x61\x73\x68\x58\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
508 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
509 "\x00\x00\x00\x00\x00\x6b\x63\x6c\x69\x65\x6e\x74\x2d\x64\x61\x74\x61"
510 "\x70\x54\x45\x53\x54\x20\x43\x4c\x49\x45\x4e\x54\x20\x44\x41\x54\x41"
511 "\x70\x65\x78\x70\x69\x72\x79\x2d\x74\x69\x6d\x65\x73\x74\x61\x6d\x70"
512 "\x1a\x00\xcc\x15\x7a";
514 const uint8_t kExpectedSRRV2[] =
515 "\xa4\x68\x6d\x65\x74\x61\x64\x61\x74\x61\xa2\x66\x70\x75\x62\x6c\x69"
516 "\x63\x00\x67\x70\x72\x69\x76\x61\x74\x65\x00\x6a\x74\x6f\x6b\x65\x6e"
517 "\x2d\x68\x61\x73\x68\x58\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
518 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
519 "\x00\x00\x00\x00\x00\x6b\x63\x6c\x69\x65\x6e\x74\x2d\x64\x61\x74\x61"
520 "\x70\x54\x45\x53\x54\x20\x43\x4c\x49\x45\x4e\x54\x20\x44\x41\x54\x41"
521 "\x70\x65\x78\x70\x69\x72\x79\x2d\x74\x69\x6d\x65\x73\x74\x61\x6d\x70"
524 const uint8_t *expected_srr = kExpectedSRRV1;
525 size_t expected_srr_len =
sizeof(kExpectedSRRV1) - 1;
527 expected_srr = kExpectedSRRV2;
528 expected_srr_len =
sizeof(kExpectedSRRV2) - 1;
531 uint8_t *redeem_msg = NULL, *redeem_resp = NULL;
533 client.get(), &redeem_msg, &msg_len, token, kClientData,
534 sizeof(kClientData) - 1, kRedemptionTime));
535 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
538 size_t client_data_len;
541 issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data,
542 &client_data_len, &redemption_time, redeem_msg, msg_len, 600));
543 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
544 bssl::UniquePtr<uint8_t> free_client_data(client_data);
545 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
547 ASSERT_EQ(redemption_time, kRedemptionTime);
549 Bytes(client_data, client_data_len));
551 uint8_t *srr = NULL, *sig = NULL;
552 size_t srr_len, sig_len;
554 client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp, resp_len));
555 bssl::UniquePtr<uint8_t> free_srr(srr);
556 bssl::UniquePtr<uint8_t> free_sig(sig);
562 const char kSRRHeader[] =
"body=:";
563 ASSERT_LT(
sizeof(kSRRHeader) - 1 + b64_len, srr_len);
566 Bytes(srr,
sizeof(kSRRHeader) - 1));
571 int(expected_srr_len),
574 srr_len = expected_srr_len;
578 const uint8_t kTokenHashDSTLabel[] =
"TrustTokenV0 TokenHash";
582 SHA256_Update(&sha_ctx, kTokenHashDSTLabel,
sizeof(kTokenHashDSTLabel));
589 uint8_t decode_private_metadata;
591 method(), &decode_private_metadata, metadata_key,
592 sizeof(metadata_key), token_hash,
sizeof(token_hash), srr[27]));
594 ASSERT_EQ(decode_private_metadata, private_metadata());
604 Bytes(srr, srr_len));
611 uint8_t *issue_msg = NULL, *issue_resp = NULL;
612 size_t msg_len, resp_len;
615 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
616 size_t tokens_issued;
618 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
619 public_metadata(), private_metadata(), 1);
620 if (!
method()->has_private_metadata && private_metadata()) {
625 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
631 EXPECT_EQ(1
u, sk_TRUST_TOKEN_num(tokens.get()));
634 const uint8_t kClientData[] =
"\x70TEST CLIENT DATA";
639 client.get(), &redeem_msg, &msg_len, token, kClientData,
640 sizeof(kClientData) - 1, kRedemptionTime));
641 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
646 size_t client_data_len;
648 issuer.get(), &public_value, &private_value, &rtoken,
649 &client_data, &client_data_len, redeem_msg, msg_len));
650 bssl::UniquePtr<uint8_t> free_client_data(client_data);
651 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
654 Bytes(client_data, client_data_len));
656 ASSERT_EQ(private_value, private_metadata());
661 if (!
method()->has_private_metadata && private_metadata()) {
665 issuer_max_batchsize = 1;
668 uint8_t *issue_msg = NULL, *issue_resp = NULL;
669 size_t msg_len, resp_len;
672 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
673 size_t tokens_issued;
675 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
676 public_metadata(), private_metadata(), 1));
677 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
678 ASSERT_EQ(tokens_issued, issuer_max_batchsize);
684 ASSERT_EQ(sk_TRUST_TOKEN_num(tokens.get()), 1UL);
689 if (!
method()->has_private_metadata && private_metadata()) {
695 uint8_t *issue_msg = NULL, *issue_resp = NULL;
696 size_t msg_len, resp_len;
699 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
700 size_t tokens_issued;
702 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
703 public_metadata(), private_metadata(), 1));
704 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
707 CBS_init(&real_response, issue_resp, resp_len);
710 bssl::ScopedCBB bad_response;
718 size_t token_length =
726 for (
size_t i = 0;
i <
count;
i++) {
742 bssl::UniquePtr<uint8_t> free_bad(bad_buf);
752 if (!
method()->has_private_metadata && private_metadata()) {
758 uint8_t *issue_msg = NULL, *issue_resp = NULL;
759 size_t msg_len, resp_len;
762 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
763 size_t tokens_issued;
765 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
766 public_metadata(), private_metadata(), 1));
767 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
770 CBS_init(&real_response, issue_resp, resp_len);
773 bssl::ScopedCBB bad_response;
781 size_t token_length =
789 for (
size_t i = 0;
i <
count;
i++) {
806 bssl::UniquePtr<uint8_t> free_bad(bad_buf);
816 TrustTokenAllMetadataTest, TrustTokenMetadataTest,
819 TrustTokenProtocolTest::KeyID(1),
820 TrustTokenProtocolTest::KeyID(2)),
826 std::tuple<const TRUST_TOKEN_METHOD *, bool, int>> {
839 if (!
method()->has_private_metadata &&
840 (private_metadata() || corrupted_key() != 4)) {
846 uint8_t *issue_msg = NULL, *issue_resp = NULL;
847 size_t msg_len, resp_len;
850 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
854 &
key->key.y1, &
key->key.xs, &
key->key.ys};
857 scalars[corrupted_key()]->
bytes[0] ^= 42;
859 size_t tokens_issued;
861 issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len,
862 7, private_metadata(), 1));
863 bssl::UniquePtr<uint8_t> free_msg(issue_resp);
870 if ((corrupted_key() / 2 == 0 && private_metadata() ==
true) ||
871 (corrupted_key() / 2 == 1 && private_metadata() ==
false)) {