90 if (
len != 0 &&
ret->data == NULL) {
108 uint8_t *out_priv_key,
size_t *out_priv_key_len,
109 size_t max_priv_key_len,
uint8_t *out_pub_key,
110 size_t *out_pub_key_len,
size_t max_pub_key_len,
114 CBB priv_cbb, pub_cbb;
125 if (!
method->generate_key(&priv_cbb, &pub_cbb)) {
129 if (!
CBB_finish(&priv_cbb, NULL, out_priv_key_len) ||
130 !
CBB_finish(&pub_cbb, NULL, out_pub_key_len)) {
144 size_t max_batchsize) {
145 if (max_batchsize > 0xffff) {
174 ctx->num_keys >=
ctx->method->max_keys) {
196 if (!
ctx->method->has_srr) {
206 size_t *out_len,
size_t count) {
221 if (pretokens == NULL) {
231 ctx->pretokens = pretokens;
256 size_t key_index = 0;
258 for (
size_t i = 0;
i <
ctx->num_keys;
i++) {
271 if (
count > sk_TRUST_TOKEN_PRETOKEN_num(
ctx->pretokens)) {
278 if (tokens == NULL) {
289 ctx->pretokens = NULL;
316 uint8_t **out_rr,
size_t *out_rr_len,
317 uint8_t **out_sig,
size_t *out_sig_len,
322 if (!
ctx->method->has_srr) {
340 if (
ctx->srr_key == NULL) {
357 uint8_t *srr_buf = NULL, *sig_buf = NULL;
358 size_t srr_len, sig_len;
359 if (!
CBS_stow(&srr, &srr_buf, &srr_len) ||
360 !
CBS_stow(&sig, &sig_buf, &sig_len)) {
368 *out_rr_len = srr_len;
370 *out_sig_len = sig_len;
375 size_t max_batchsize) {
376 if (max_batchsize > 0xffff) {
405 ctx->num_keys >=
ctx->method->max_keys) {
439 ctx->metadata_key_len = 0;
441 if (
ctx->metadata_key == NULL) {
445 ctx->metadata_key_len =
len;
451 for (
size_t i = 0;
i <
ctx->num_keys;
i++) {
453 return &
ctx->keys[
i];
460 size_t *out_len,
size_t *out_tokens_issued,
463 size_t max_issuance) {
464 if (max_issuance >
ctx->max_batchsize) {
465 max_issuance =
ctx->max_batchsize;
470 if (
key == NULL || private_metadata > 1 ||
471 (!
ctx->method->has_private_metadata && private_metadata != 0)) {
484 size_t num_to_issue = num_requested;
485 if (num_to_issue > max_issuance) {
486 num_to_issue = max_issuance;
498 if (!
ctx->method->sign(&
key->key, &
response, &
in, num_requested, num_to_issue,
513 *out_tokens_issued = num_to_issue;
526 size_t *out_client_data_len,
528 CBS request_cbs, token_cbs;
548 !
ctx->method->read(&
key->key, nonce, &private_metadata,
556 (
ctx->method->has_srr && !
CBS_skip(&request_cbs, 8)) ||
562 uint8_t *client_data_buf = NULL;
563 size_t client_data_len = 0;
564 if (!
CBS_stow(&client_data, &client_data_buf, &client_data_len)) {
574 *out_public = public_metadata;
575 *out_private = private_metadata;
577 *out_client_data = client_data_buf;
578 *out_client_data_len = client_data_len;
596 if (
value <= 0xffff) {
599 if (
value <= 0xffffffff) {
602 if (
value <= 0xffffffffffffffff) {
633 size_t client_data_len) {
640 return metadata_obfuscator[0] >> 7;
646 size_t *out_client_data_len,
650 CBS request_cbs, token_cbs;
660 CBS token_copy = token_cbs;
672 !
ctx->method->read(&
key->key, nonce, &private_metadata,
680 uint8_t *srr_buf = NULL, *sig_buf = NULL, *client_data_buf = NULL;
681 size_t srr_len = 0, sig_len = 0, client_data_len = 0;
693 (
ctx->method->has_srr && !
CBS_get_u64(&request_cbs, &redemption_time))) {
698 const uint8_t kTokenHashDSTLabel[] =
"TrustTokenV0 TokenHash";
702 SHA256_Update(&sha_ctx, kTokenHashDSTLabel,
sizeof(kTokenHashDSTLabel));
707 ctx->metadata_key,
ctx->metadata_key_len, token_hash,
sizeof(token_hash));
721 if (
ctx->method->has_srr) {
722 expiry_time = redemption_time + lifetime;
725 static const char kClientDataLabel[] =
"client-data";
726 static const char kExpiryTimestampLabel[] =
"expiry-timestamp";
727 static const char kMetadataLabel[] =
"metadata";
728 static const char kPrivateLabel[] =
"private";
729 static const char kPublicLabel[] =
"public";
730 static const char kTokenHashLabel[] =
"token-hash";
734 assert(strlen(kMetadataLabel) < strlen(kTokenHashLabel));
735 assert(strlen(kTokenHashLabel) < strlen(kClientDataLabel));
736 assert(strlen(kClientDataLabel) < strlen(kExpiryTimestampLabel));
737 assert(strlen(kPublicLabel) < strlen(kPrivateLabel));
739 size_t map_entries = 4;
743 !
add_cbor_text(&srr, kMetadataLabel, strlen(kMetadataLabel)) ||
747 !
add_cbor_text(&srr, kPrivateLabel, strlen(kPrivateLabel)) ||
748 !
add_cbor_int(&srr, private_metadata ^ metadata_obfuscator) ||
749 !
add_cbor_text(&srr, kTokenHashLabel, strlen(kTokenHashLabel)) ||
751 !
add_cbor_text(&srr, kClientDataLabel, strlen(kClientDataLabel)) ||
754 strlen(kExpiryTimestampLabel)) ||
769 if (!
ctx->method->has_srr) {
770 static const char kSRRHeader[] =
"body=:";
771 static const char kSRRSplit[] =
":, signature=:";
772 static const char kSRREnd[] =
":";
774 size_t srr_b64_len, sig_b64_len;
788 strlen(kSRRHeader)) ||
792 strlen(kSRRSplit)) ||
819 if (!
CBS_stow(&client_data, &client_data_buf, &client_data_len) ||
831 *out_client_data = client_data_buf;
832 *out_client_data_len = client_data_len;
833 *out_redemption_time = redemption_time;
851 size_t key_len,
const uint8_t *nonce,
856 *out_value = encrypted_bit ^ metadata_obfuscator;