Remove Anonymous Tokens export from BlindSignAuth and update QUICHE copybara to allow BlindSignAuth-in-Chrome to use the standalone Anonymous Tokens Git repo.

PiperOrigin-RevId: 569492201
diff --git a/build/source_list.bzl b/build/source_list.bzl
index c9c0224..964887a 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1586,21 +1586,6 @@
     "quic/qbone/qbone_stream_test.cc",
 ]
 blind_sign_auth_hdrs = [
-    "blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h",
-    "blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h",
-    "blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h",
-    "blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h",
-    "blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h",
-    "blind_sign_auth/anonymous_tokens/cpp/testing/utils.h",
     "blind_sign_auth/blind_sign_auth.h",
     "blind_sign_auth/blind_sign_auth_interface.h",
     "blind_sign_auth/blind_sign_auth_protos.h",
@@ -1611,33 +1596,16 @@
     "blind_sign_auth/test_tools/mock_blind_sign_http_interface.h",
 ]
 blind_sign_auth_srcs = [
-    "blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc",
     "blind_sign_auth/blind_sign_auth.cc",
     "blind_sign_auth/cached_blind_sign_auth.cc",
 ]
 blind_sign_auth_tests_hdrs = [
 ]
 blind_sign_auth_tests_srcs = [
-    "blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc",
-    "blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc",
     "blind_sign_auth/blind_sign_auth_test.cc",
     "blind_sign_auth/cached_blind_sign_auth_test.cc",
 ]
 protobuf_blind_sign_auth = [
-    "blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto",
     "blind_sign_auth/proto/any.proto",
     "blind_sign_auth/proto/attestation.proto",
     "blind_sign_auth/proto/auth_and_sign.proto",
diff --git a/build/source_list.gni b/build/source_list.gni
index e70f003..e02373f 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1590,21 +1590,6 @@
     "src/quiche/quic/qbone/qbone_stream_test.cc",
 ]
 blind_sign_auth_hdrs = [
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h",
     "src/quiche/blind_sign_auth/blind_sign_auth.h",
     "src/quiche/blind_sign_auth/blind_sign_auth_interface.h",
     "src/quiche/blind_sign_auth/blind_sign_auth_protos.h",
@@ -1615,15 +1600,6 @@
     "src/quiche/blind_sign_auth/test_tools/mock_blind_sign_http_interface.h",
 ]
 blind_sign_auth_srcs = [
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc",
     "src/quiche/blind_sign_auth/blind_sign_auth.cc",
     "src/quiche/blind_sign_auth/cached_blind_sign_auth.cc",
 ]
@@ -1631,18 +1607,10 @@
 
 ]
 blind_sign_auth_tests_srcs = [
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc",
-    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc",
     "src/quiche/blind_sign_auth/blind_sign_auth_test.cc",
     "src/quiche/blind_sign_auth/cached_blind_sign_auth_test.cc",
 ]
 protobuf_blind_sign_auth = [
-    "src/quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto",
     "src/quiche/blind_sign_auth/proto/any.proto",
     "src/quiche/blind_sign_auth/proto/attestation.proto",
     "src/quiche/blind_sign_auth/proto/auth_and_sign.proto",
diff --git a/build/source_list.json b/build/source_list.json
index 07bf1a6..4db9bc0 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1589,21 +1589,6 @@
     "quiche/quic/qbone/qbone_stream_test.cc"
   ],
   "blind_sign_auth_hdrs": [
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h",
     "quiche/blind_sign_auth/blind_sign_auth.h",
     "quiche/blind_sign_auth/blind_sign_auth_interface.h",
     "quiche/blind_sign_auth/blind_sign_auth_protos.h",
@@ -1614,15 +1599,6 @@
     "quiche/blind_sign_auth/test_tools/mock_blind_sign_http_interface.h"
   ],
   "blind_sign_auth_srcs": [
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc",
     "quiche/blind_sign_auth/blind_sign_auth.cc",
     "quiche/blind_sign_auth/cached_blind_sign_auth.cc"
   ],
@@ -1630,18 +1606,10 @@
 
   ],
   "blind_sign_auth_tests_srcs": [
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc",
-    "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc",
     "quiche/blind_sign_auth/blind_sign_auth_test.cc",
     "quiche/blind_sign_auth/cached_blind_sign_auth_test.cc"
   ],
   "protobuf_blind_sign_auth": [
-    "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto",
     "quiche/blind_sign_auth/proto/any.proto",
     "quiche/blind_sign_auth/proto/attestation.proto",
     "quiche/blind_sign_auth/proto/auth_and_sign.proto",
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc
deleted file mode 100644
index d1f7de1..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc
+++ /dev/null
@@ -1,295 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h"
-
-#include <cstddef>
-#include <memory>
-#include <optional>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "absl/container/flat_hash_set.h"
-#include "absl/status/status.h"
-#include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-namespace {
-
-absl::Status ValidityChecksForClientCreation(
-    const RSABlindSignaturePublicKey& public_key) {
-  // Basic validity checks.
-  if (!ParseUseCase(public_key.use_case()).ok()) {
-    return absl::InvalidArgumentError("Invalid use case for public key.");
-  } else if (public_key.key_version() <= 0) {
-    return absl::InvalidArgumentError(
-        "Key version cannot be zero or negative.");
-  } else if (public_key.key_size() < 256) {
-    return absl::InvalidArgumentError(
-        "Key modulus size cannot be less than 256 bytes.");
-  } else if (public_key.mask_gen_function() == AT_TEST_MGF ||
-             public_key.mask_gen_function() == AT_MGF_UNDEFINED) {
-    return absl::InvalidArgumentError("Unknown or unacceptable mgf1 hash.");
-  } else if (public_key.sig_hash_type() == AT_TEST_HASH_TYPE ||
-             public_key.sig_hash_type() == AT_HASH_TYPE_UNDEFINED) {
-    return absl::InvalidArgumentError(
-        "Unknown or unacceptable signature hash.");
-  } else if (public_key.salt_length() <= 0) {
-    return absl::InvalidArgumentError(
-        "Non-positive salt length is not allowed.");
-  }
-
-  switch (public_key.message_mask_type()) {
-    case AT_MESSAGE_MASK_CONCAT:
-      if (public_key.message_mask_size() < 32) {
-        return absl::InvalidArgumentError(
-            "Message mask concat type must have a size of at least 32 bytes.");
-      }
-      break;
-    case AT_MESSAGE_MASK_NO_MASK:
-      if (public_key.message_mask_size() != 0) {
-        return absl::InvalidArgumentError(
-            "Message mask no mask type must be set to size 0 bytes.");
-      }
-      break;
-    default:
-      return absl::InvalidArgumentError(
-          "Message mask type must be defined and supported.");
-  }
-
-  RSAPublicKey rsa_public_key;
-  if (!rsa_public_key.ParseFromString(public_key.serialized_public_key())) {
-    return absl::InvalidArgumentError("Public key is malformed.");
-  }
-  if (rsa_public_key.n().size() != static_cast<size_t>(public_key.key_size())) {
-    return absl::InvalidArgumentError(
-        "Public key size does not match key size.");
-  }
-  return absl::OkStatus();
-}
-
-absl::Status CheckPublicKeyValidity(
-    const RSABlindSignaturePublicKey& public_key) {
-  absl::Time time_now = absl::Now();
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      absl::Time start_time,
-      TimeFromProto(public_key.key_validity_start_time()));
-  if (start_time > time_now) {
-    return absl::FailedPreconditionError("Key is not valid yet.");
-  }
-  if (public_key.has_expiration_time()) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(absl::Time expiration_time,
-                                 TimeFromProto(public_key.expiration_time()));
-    if (expiration_time <= time_now) {
-      return absl::FailedPreconditionError("Key is already expired.");
-    }
-  }
-  return absl::OkStatus();
-}
-
-}  // namespace
-
-AnonymousTokensRsaBssaClient::AnonymousTokensRsaBssaClient(
-    const RSABlindSignaturePublicKey& public_key)
-    : public_key_(public_key) {}
-
-absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>>
-AnonymousTokensRsaBssaClient::Create(
-    const RSABlindSignaturePublicKey& public_key) {
-  ANON_TOKENS_RETURN_IF_ERROR(ValidityChecksForClientCreation(public_key));
-  return absl::WrapUnique(new AnonymousTokensRsaBssaClient(public_key));
-}
-
-// TODO(b/261866075): Offer an API to simply return bytes of blinded requests.
-absl::StatusOr<AnonymousTokensSignRequest>
-AnonymousTokensRsaBssaClient::CreateRequest(
-    const std::vector<PlaintextMessageWithPublicMetadata>& inputs) {
-  if (inputs.empty()) {
-    return absl::InvalidArgumentError("Cannot create an empty request.");
-  } else if (!blinding_info_map_.empty()) {
-    return absl::FailedPreconditionError(
-        "Blind signature request already created.");
-  }
-
-  ANON_TOKENS_RETURN_IF_ERROR(CheckPublicKeyValidity(public_key_));
-  RSAPublicKey rsa_public_key_proto;
-  if (!rsa_public_key_proto.ParseFromString(
-          public_key_.serialized_public_key())) {
-    return absl::InvalidArgumentError("Public key is malformed.");
-  }
-
-  AnonymousTokensSignRequest request;
-  for (const PlaintextMessageWithPublicMetadata& input : inputs) {
-    // Generate nonce and masked message. For more details, see
-    // https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-    ANON_TOKENS_ASSIGN_OR_RETURN(std::string mask, GenerateMask(public_key_));
-    std::string masked_message =
-        MaskMessageConcat(mask, input.plaintext_message());
-
-    std::optional<std::string> public_metadata = std::nullopt;
-    if (public_key_.public_metadata_support()) {
-      // Empty public metadata is a valid value.
-      public_metadata = input.public_metadata();
-    }
-    const bool use_rsa_public_exponent = false;
-    // Owned by BoringSSL.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        const EVP_MD* sig_hash,
-        ProtoHashTypeToEVPDigest(public_key_.sig_hash_type()));
-    // Owned by BoringSSL.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        const EVP_MD* mgf1_hash,
-        ProtoMaskGenFunctionToEVPDigest(public_key_.mask_gen_function()));
-    // Generate RSA blinder.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        auto rsa_bssa_blinder,
-        RsaBlinder::New(rsa_public_key_proto.n(), rsa_public_key_proto.e(),
-                        sig_hash, mgf1_hash, public_key_.salt_length(),
-                        use_rsa_public_exponent, public_metadata));
-    ANON_TOKENS_ASSIGN_OR_RETURN(const std::string blinded_message,
-                                 rsa_bssa_blinder->Blind(masked_message));
-
-    // Store randomness needed to unblind.
-    BlindingInfo blinding_info = {
-        input,
-        mask,
-        std::move(rsa_bssa_blinder),
-    };
-
-    // Create the blinded token.
-    AnonymousTokensSignRequest_BlindedToken* blinded_token =
-        request.add_blinded_tokens();
-    blinded_token->set_use_case(public_key_.use_case());
-    blinded_token->set_key_version(public_key_.key_version());
-    blinded_token->set_serialized_token(blinded_message);
-    blinded_token->set_public_metadata(input.public_metadata());
-    blinded_token->set_do_not_use_rsa_public_exponent(!use_rsa_public_exponent);
-    blinding_info_map_[blinded_message] = std::move(blinding_info);
-  }
-
-  return request;
-}
-
-absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-AnonymousTokensRsaBssaClient::ProcessResponse(
-    const AnonymousTokensSignResponse& response) {
-  if (blinding_info_map_.empty()) {
-    return absl::FailedPreconditionError(
-        "A valid Blind signature request was not created before calling "
-        "RetrieveAnonymousTokensFromSignResponse.");
-  } else if (response.anonymous_tokens().empty()) {
-    return absl::InvalidArgumentError("Cannot process an empty response.");
-  } else if (static_cast<size_t>(response.anonymous_tokens().size()) !=
-             blinding_info_map_.size()) {
-    return absl::InvalidArgumentError(
-        "Response is missing some requested tokens.");
-  }
-
-  // Vector to accumulate output tokens.
-  std::vector<RSABlindSignatureTokenWithInput> tokens;
-
-  // Temporary set structure to check for duplicate responses.
-  absl::flat_hash_set<absl::string_view> blinded_messages;
-
-  // Loop over all the anonymous tokens in the response.
-  for (const AnonymousTokensSignResponse_AnonymousToken& anonymous_token :
-       response.anonymous_tokens()) {
-    // Basic validity checks on the response.
-    if (anonymous_token.use_case() != public_key_.use_case()) {
-      return absl::InvalidArgumentError("Use case does not match public key.");
-    } else if (anonymous_token.key_version() != public_key_.key_version()) {
-      return absl::InvalidArgumentError(
-          "Key version does not match public key.");
-    } else if (anonymous_token.serialized_blinded_message().empty()) {
-      return absl::InvalidArgumentError(
-          "Blinded message that was sent in request cannot be empty in "
-          "response.");
-    } else if (anonymous_token.serialized_token().empty()) {
-      return absl::InvalidArgumentError(
-          "Blinded anonymous token (serialized_token) in response cannot be "
-          "empty.");
-    }
-
-    // Check for duplicate in responses.
-    if (!blinded_messages.insert(anonymous_token.serialized_blinded_message())
-             .second) {
-      return absl::InvalidArgumentError(
-          "Blinded message was repeated in the response.");
-    }
-
-    // Retrieve blinding info associated with blind response.
-    auto it =
-        blinding_info_map_.find(anonymous_token.serialized_blinded_message());
-    if (it == blinding_info_map_.end()) {
-      return absl::InvalidArgumentError(
-          "Response has some tokens for some blinded messages that were not "
-          "requested.");
-    }
-    const BlindingInfo& blinding_info = it->second;
-
-    if (blinding_info.input.public_metadata() !=
-        anonymous_token.public_metadata()) {
-      return absl::InvalidArgumentError(
-          "Response public metadata does not match input.");
-    } else if (public_key_.public_metadata_support() &&
-               !anonymous_token.do_not_use_rsa_public_exponent()) {
-      // Bool do_not_use_rsa_public_exponent does not matter for the non-public
-      // metadata version.
-      return absl::InvalidArgumentError(
-          "Setting do_not_use_rsa_public_exponent to false is no longer "
-          "supported.");
-    }
-
-    // Unblind the blinded anonymous token to obtain the final anonymous token
-    // (signature).
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        const std::string final_anonymous_token,
-        blinding_info.rsa_blinder->Unblind(anonymous_token.serialized_token()));
-
-    // Verify the signature for correctness.
-    ANON_TOKENS_RETURN_IF_ERROR(blinding_info.rsa_blinder->Verify(
-        final_anonymous_token,
-        MaskMessageConcat(blinding_info.mask,
-                          blinding_info.input.plaintext_message())));
-
-    // Construct the final signature proto.
-    RSABlindSignatureTokenWithInput final_token_proto;
-    *final_token_proto.mutable_token()->mutable_token() = final_anonymous_token;
-    *final_token_proto.mutable_token()->mutable_message_mask() =
-        blinding_info.mask;
-    *final_token_proto.mutable_input() = blinding_info.input;
-
-    tokens.push_back(final_token_proto);
-  }
-
-  return tokens;
-}
-
-absl::Status AnonymousTokensRsaBssaClient::Verify(
-    const RSABlindSignaturePublicKey& /*public_key*/,
-    const RSABlindSignatureToken& /*token*/,
-    const PlaintextMessageWithPublicMetadata& /*input*/) {
-  return absl::UnimplementedError("Verify not implemented yet.");
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h
deleted file mode 100644
index e760182..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CLIENT_ANONYMOUS_TOKENS_RSA_BSSA_CLIENT_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CLIENT_ANONYMOUS_TOKENS_RSA_BSSA_CLIENT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "absl/container/flat_hash_map.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "absl/types/optional.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// This class generates AnonymousTokens RSA blind signatures,
-// (https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/)
-// blind message signing request and processes the response.
-//
-// Each execution of the Anonymous Tokens RSA blind signatures protocol requires
-// a new instance of the AnonymousTokensRsaBssaClient.
-//
-// This class is not thread-safe.
-class QUICHE_EXPORT AnonymousTokensRsaBssaClient {
- public:
-  // AnonymousTokensRsaBssaClient is neither copyable nor copy assignable.
-  AnonymousTokensRsaBssaClient(const AnonymousTokensRsaBssaClient&) = delete;
-  AnonymousTokensRsaBssaClient& operator=(const AnonymousTokensRsaBssaClient&) =
-      delete;
-
-  // Create client with the specified public key which can be used to send a
-  // sign request and process a response.
-  //
-  // This method is to be used to create a client as its constructor is private.
-  // It takes as input RSABlindSignaturePublicKey which contains the public key
-  // and relevant parameters.
-  static absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> Create(
-      const RSABlindSignaturePublicKey& public_key);
-
-  // Class method that creates the signature requests by taking a vector where
-  // each element in the vector is the plaintext message along with its
-  // respective public metadata (if the metadata exists).
-  //
-  // The library will also fail if the key has expired.
-  //
-  // It only puts the blinded version of the messages in the request.
-  absl::StatusOr<AnonymousTokensSignRequest> CreateRequest(
-      const std::vector<PlaintextMessageWithPublicMetadata>& inputs);
-
-  // Class method that processes the signature response from the server.
-  //
-  // It outputs a vector of a protos where each element contains an input
-  // plaintext message and associated public metadata (if it exists) along with
-  // its final (unblinded) anonymous token resulting from the RSA blind
-  // signatures protocol.
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>> ProcessResponse(
-      const AnonymousTokensSignResponse& response);
-
-  // Method to verify whether an anonymous token is valid or not.
-  //
-  // Returns OK on a valid token and non-OK otherwise.
-  absl::Status Verify(const RSABlindSignaturePublicKey& public_key,
-                      const RSABlindSignatureToken& token,
-                      const PlaintextMessageWithPublicMetadata& input);
-
- private:
-  struct BlindingInfo {
-    PlaintextMessageWithPublicMetadata input;
-    std::string mask;
-    std::unique_ptr<RsaBlinder> rsa_blinder;
-  };
-
-  explicit AnonymousTokensRsaBssaClient(
-      const RSABlindSignaturePublicKey& public_key);
-
-  const RSABlindSignaturePublicKey public_key_;
-  absl::flat_hash_map<std::string, BlindingInfo> blinding_info_map_;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CLIENT_ANONYMOUS_TOKENS_RSA_BSSA_CLIENT_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc
deleted file mode 100644
index 95caa30..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc
+++ /dev/null
@@ -1,609 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h"
-
-#include <memory>
-#include <string>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-using ::testing::SizeIs;
-
-// Returns a fixed public private key pair by calling GetStrongRsaKeys4096().
-absl::StatusOr<std::pair<RSABlindSignaturePublicKey, RSAPrivateKey>>
-CreateClientTestKey(absl::string_view use_case = "TEST_USE_CASE",
-                    int key_version = 1,
-                    MessageMaskType mask_type = AT_MESSAGE_MASK_CONCAT,
-                    int message_mask_size = 32,
-                    bool enable_public_metadata = false) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto key_pair, GetStrongRsaKeys4096());
-  RSABlindSignaturePublicKey public_key;
-  public_key.set_use_case(std::string(use_case));
-  public_key.set_key_version(key_version);
-  public_key.set_serialized_public_key(key_pair.first.SerializeAsString());
-  absl::Time start_time = absl::Now() - absl::Minutes(100);
-  ANON_TOKENS_ASSIGN_OR_RETURN(*public_key.mutable_key_validity_start_time(),
-                               TimeToProto(start_time));
-  public_key.set_sig_hash_type(AT_HASH_TYPE_SHA384);
-  public_key.set_mask_gen_function(AT_MGF_SHA384);
-  public_key.set_salt_length(kSaltLengthInBytes48);
-  public_key.set_key_size(kRsaModulusSizeInBytes512);
-  public_key.set_message_mask_type(mask_type);
-  public_key.set_message_mask_size(message_mask_size);
-  public_key.set_public_metadata_support(enable_public_metadata);
-
-  return std::make_pair(std::move(public_key), std::move(key_pair.second));
-}
-
-// Creates the input consisting on plaintext messages and public metadata that
-// can be passed to the AnonymousTokensRsaBssaClient.
-absl::StatusOr<std::vector<PlaintextMessageWithPublicMetadata>> CreateInput(
-    absl::Span<const std::string> messages,
-    absl::Span<const std::string> public_metadata = {}) {
-  // Check input parameter sizes.
-  if (!public_metadata.empty() && messages.size() != public_metadata.size()) {
-    return absl::InvalidArgumentError(
-        "Input vectors should be of the same size.");
-  }
-
-  std::vector<PlaintextMessageWithPublicMetadata> anonymmous_tokens_input_proto;
-  anonymmous_tokens_input_proto.reserve(messages.size());
-  for (int i = 0; i < messages.size(); ++i) {
-    PlaintextMessageWithPublicMetadata input_message_and_metadata;
-    input_message_and_metadata.set_plaintext_message(messages[i]);
-    if (!public_metadata.empty()) {
-      input_message_and_metadata.set_public_metadata(public_metadata[i]);
-    }
-    anonymmous_tokens_input_proto.push_back(input_message_and_metadata);
-  }
-  return anonymmous_tokens_input_proto;
-}
-
-// Creates the server response for anonymous tokens request by using
-// RsaBlindSigner.
-absl::StatusOr<AnonymousTokensSignResponse> CreateResponse(
-    const AnonymousTokensSignRequest& request, const RSAPrivateKey& private_key,
-    bool enable_public_metadata = false) {
-  AnonymousTokensSignResponse response;
-  const bool use_rsa_public_exponent = false;
-  for (const auto& request_token : request.blinded_tokens()) {
-    auto* response_token = response.add_anonymous_tokens();
-    response_token->set_use_case(request_token.use_case());
-    response_token->set_key_version(request_token.key_version());
-    response_token->set_public_metadata(request_token.public_metadata());
-    response_token->set_serialized_blinded_message(
-        request_token.serialized_token());
-    response_token->set_do_not_use_rsa_public_exponent(
-        !use_rsa_public_exponent);
-    std::optional<std::string> public_metadata = std::nullopt;
-    if (enable_public_metadata) {
-      public_metadata = request_token.public_metadata();
-    }
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        std::unique_ptr<RsaBlindSigner> blind_signer,
-        RsaBlindSigner::New(private_key, use_rsa_public_exponent,
-                            public_metadata));
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        *response_token->mutable_serialized_token(),
-        blind_signer->Sign(request_token.serialized_token()));
-  }
-  return response;
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest, Success) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto rsa_key, CreateClientTestKey());
-  EXPECT_TRUE(AnonymousTokensRsaBssaClient::Create(rsa_key.first).ok());
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest, InvalidUseCase) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto rsa_key,
-                                   CreateClientTestKey("INVALID_USE_CASE"));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(client.status().message(),
-              testing::HasSubstr("Invalid use case for public key"));
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest, NotAUseCase) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto rsa_key,
-                                   CreateClientTestKey("NOT_A_USE_CASE"));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(client.status().message(),
-              testing::HasSubstr("Invalid use case for public key"));
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest, InvalidKeyVersion) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto rsa_key,
-                                   CreateClientTestKey("TEST_USE_CASE", 0));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(client.status().message(),
-              testing::HasSubstr("Key version cannot be zero or negative"));
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest, InvalidMessageMaskType) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto rsa_key,
-      CreateClientTestKey("TEST_USE_CASE", 1, AT_MESSAGE_MASK_TYPE_UNDEFINED));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(client.status().message(),
-              testing::HasSubstr("Message mask type must be defined"));
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest,
-     MessageMaskConcatInvalidMessageMaskSize) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto rsa_key,
-      CreateClientTestKey("TEST_USE_CASE", 1, AT_MESSAGE_MASK_CONCAT, 0));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(
-      client.status().message(),
-      testing::HasSubstr(
-          "Message mask concat type must have a size of at least 32 bytes"));
-}
-
-TEST(CreateAnonymousTokensRsaBssaClientTest,
-     MessageMaskNoMaskInvalidMessageMaskSize) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto rsa_key,
-      CreateClientTestKey("TEST_USE_CASE", 1, AT_MESSAGE_MASK_NO_MASK, 32));
-  absl::StatusOr<std::unique_ptr<AnonymousTokensRsaBssaClient>> client =
-      AnonymousTokensRsaBssaClient::Create(rsa_key.first);
-  EXPECT_EQ(client.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(client.status().message(),
-              testing::HasSubstr(
-                  "Message mask no mask type must be set to size 0 bytes."));
-}
-
-class AnonymousTokensRsaBssaClientTest : public testing::Test {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::tie(public_key_, private_key_),
-                                     CreateClientTestKey());
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        client_, AnonymousTokensRsaBssaClient::Create(public_key_));
-  }
-
-  RSAPrivateKey private_key_;
-  RSABlindSignaturePublicKey public_key_;
-  std::unique_ptr<AnonymousTokensRsaBssaClient> client_;
-};
-
-TEST_F(AnonymousTokensRsaBssaClientTest, SuccessOneMessage) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key_));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(1));
-  EXPECT_TRUE(client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, SuccessMultipleMessages) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key_));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(4));
-  EXPECT_TRUE(client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, SuccessMultipleMessagesNoMessageMask) {
-  RSABlindSignaturePublicKey public_key;
-  RSAPrivateKey private_key;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::tie(public_key, private_key),
-      CreateClientTestKey("TEST_USE_CASE", /*key_version=*/1,
-                          AT_MESSAGE_MASK_NO_MASK, /*message_mask_size=*/0));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> client,
-      AnonymousTokensRsaBssaClient::Create(public_key));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key));
-  ASSERT_EQ(response.anonymous_tokens().size(), 4);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<RSABlindSignatureTokenWithInput> finalized_tokens_with_inputs,
-      client->ProcessResponse(response));
-
-  for (const RSABlindSignatureTokenWithInput& token_with_input :
-       finalized_tokens_with_inputs) {
-    EXPECT_TRUE(token_with_input.token().message_mask().empty());
-  }
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, EnsureRandomTokens) {
-  std::string message = "test_same_message";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({message, message}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<RSABlindSignatureTokenWithInput> tokens,
-      client_->ProcessResponse(response));
-  ASSERT_EQ(tokens.size(), 2);
-  for (const RSABlindSignatureTokenWithInput& token : tokens) {
-    EXPECT_EQ(token.input().plaintext_message(), message);
-  }
-  EXPECT_NE(tokens[0].token().message_mask(), tokens[1].token().message_mask());
-  EXPECT_NE(tokens[0].token().token(), tokens[1].token().token());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, EmptyInput) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({}));
-  absl::StatusOr<AnonymousTokensSignRequest> request =
-      client_->CreateRequest(input_messages);
-  EXPECT_EQ(request.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(request.status().message(),
-              testing::HasSubstr("Cannot create an empty request"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, NotYetValidKey) {
-  RSABlindSignaturePublicKey not_valid_key = public_key_;
-  absl::Time start_time = absl::Now() + absl::Minutes(100);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      *not_valid_key.mutable_key_validity_start_time(),
-      TimeToProto(start_time));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> client,
-      AnonymousTokensRsaBssaClient::Create(not_valid_key));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  absl::StatusOr<AnonymousTokensSignRequest> request =
-      client->CreateRequest(input_messages);
-  EXPECT_EQ(request.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(request.status().message(),
-              testing::HasSubstr("Key is not valid yet"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ExpiredKey) {
-  RSABlindSignaturePublicKey expired_key = public_key_;
-  absl::Time end_time = absl::Now() - absl::Seconds(1);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(*expired_key.mutable_expiration_time(),
-                                   TimeToProto(end_time));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> client,
-      AnonymousTokensRsaBssaClient::Create(expired_key));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  absl::StatusOr<AnonymousTokensSignRequest> request =
-      client->CreateRequest(input_messages);
-  EXPECT_EQ(request.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(request.status().message(),
-              testing::HasSubstr("Key is already expired"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, CreateRequestTwice) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  EXPECT_TRUE(client_->CreateRequest(input_messages).ok());
-  absl::StatusOr<AnonymousTokensSignRequest> request =
-      client_->CreateRequest(input_messages);
-  EXPECT_EQ(request.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(request.status().message(),
-              testing::HasSubstr("Blind signature request already created"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ProcessResponseWithoutCreateRequest) {
-  AnonymousTokensSignResponse response;
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(
-      processed_response.status().message(),
-      testing::HasSubstr("A valid Blind signature request was not created"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ProcessEmptyResponse) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  AnonymousTokensSignResponse response;
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(processed_response.status().message(),
-              testing::HasSubstr("Cannot process an empty response"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ProcessResponseWithBadUseCase) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key_));
-  response.mutable_anonymous_tokens(0)->set_use_case("TEST_USE_CASE_2");
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(processed_response.status().message(),
-              testing::HasSubstr("Use case does not match public key"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ProcessResponseWithBadKeyVersion) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response,
-                                   CreateResponse(request, private_key_));
-  response.mutable_anonymous_tokens(0)->set_key_version(2);
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(processed_response.status().message(),
-              testing::HasSubstr("Key version does not match public key"));
-}
-
-TEST_F(AnonymousTokensRsaBssaClientTest, ProcessResponseFromDifferentClient) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> client2,
-      AnonymousTokensRsaBssaClient::Create(public_key_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request1,
-                                   client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignRequest request2,
-                                   client2->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response1,
-                                   CreateResponse(request1, private_key_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensSignResponse response2,
-                                   CreateResponse(request2, private_key_));
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response2 = client_->ProcessResponse(response2);
-  EXPECT_EQ(processed_response2.status().code(),
-            absl::StatusCode::kInvalidArgument);
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response1 = client2->ProcessResponse(response1);
-  EXPECT_EQ(processed_response1.status().code(),
-            absl::StatusCode::kInvalidArgument);
-}
-
-class AnonymousTokensRsaBssaClientWithPublicMetadataTest
-    : public testing::Test {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        std::tie(public_key_, private_key_),
-        CreateClientTestKey("TEST_USE_CASE", /*key_version=*/1,
-                            AT_MESSAGE_MASK_CONCAT,
-                            kRsaMessageMaskSizeInBytes32,
-                            /*enable_public_metadata=*/true));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        public_metadata_client_,
-        AnonymousTokensRsaBssaClient::Create(public_key_));
-  }
-
-  RSAPrivateKey private_key_;
-  RSABlindSignaturePublicKey public_key_;
-  std::unique_ptr<AnonymousTokensRsaBssaClient> public_metadata_client_;
-};
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       SuccessOneMessageWithPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}, {"md1"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(1));
-  EXPECT_TRUE(public_metadata_client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       FailureWithEmptyPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}, {"md1"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/false));
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = public_metadata_client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       FailureWithWrongPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}, {"md1"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  request.mutable_blinded_tokens(0)->set_public_metadata(
-      "wrong_public_metadata");
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response = public_metadata_client_->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       FailureWithPublicMetadataSupportOff) {
-  // Create a client with public metadata support disabled.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto key_pair, CreateClientTestKey());
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> non_public_metadata_client,
-      AnonymousTokensRsaBssaClient::Create(key_pair.first));
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message"}, {"md1"}));
-  // Use client_ that does not support public metadata.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      non_public_metadata_client->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  absl::StatusOr<std::vector<RSABlindSignatureTokenWithInput>>
-      processed_response =
-          non_public_metadata_client->ProcessResponse(response);
-  EXPECT_EQ(processed_response.status().code(),
-            absl::StatusCode::kInvalidArgument);
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       SuccessMultipleMessagesWithDistinctPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"},
-                  {"md1", "md2", "md3", "md4"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(4));
-  EXPECT_TRUE(public_metadata_client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       SuccessMultipleMessagesWithRepeatedPublicMetadata) {
-  // Create input with repeated public metadata
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"},
-                  {"md1", "md2", "md2", "md1"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(4));
-  EXPECT_TRUE(public_metadata_client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       SuccessMultipleMessagesWithEmptyStringPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"},
-                  {"md1", "", "", "md4"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client_->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key_, /*enable_public_metadata=*/true));
-  EXPECT_THAT(response.anonymous_tokens(), SizeIs(4));
-  EXPECT_TRUE(public_metadata_client_->ProcessResponse(response).ok());
-}
-
-TEST_F(AnonymousTokensRsaBssaClientWithPublicMetadataTest,
-       SuccessMultipleMessagesNoMessageMask) {
-  RSABlindSignaturePublicKey public_key;
-  RSAPrivateKey private_key;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::tie(public_key, private_key),
-      CreateClientTestKey("TEST_USE_CASE", /*key_version=*/1,
-                          AT_MESSAGE_MASK_NO_MASK, /*message_mask_size=*/0,
-                          /*enable_public_metadata=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<AnonymousTokensRsaBssaClient> public_metadata_client,
-      AnonymousTokensRsaBssaClient::Create(public_key));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<PlaintextMessageWithPublicMetadata> input_messages,
-      CreateInput({"message1", "msg2", "anotherMessage", "one_more_message"},
-                  {"md1", "md2", "md3", "md4"}));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignRequest request,
-      public_metadata_client->CreateRequest(input_messages));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      AnonymousTokensSignResponse response,
-      CreateResponse(request, private_key, /*enable_public_metadata=*/true));
-  ASSERT_EQ(response.anonymous_tokens().size(), 4);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::vector<RSABlindSignatureTokenWithInput> finalized_tokens_with_inputs,
-      public_metadata_client->ProcessResponse(response));
-
-  for (const RSABlindSignatureTokenWithInput& token_with_input :
-       finalized_tokens_with_inputs) {
-    EXPECT_TRUE(token_with_input.token().message_mask().empty());
-  }
-}
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc
deleted file mode 100644
index eef32d3..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-
-#include <cstdint>
-#include <string>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-#include "openssl/digest.h"
-#include "openssl/rand.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-absl::StatusOr<std::string> GenerateMask(
-    const RSABlindSignaturePublicKey& public_key) {
-  std::string mask;
-  if (public_key.message_mask_type() == AT_MESSAGE_MASK_CONCAT &&
-      public_key.message_mask_size() >= kRsaMessageMaskSizeInBytes32) {
-    mask = std::string(public_key.message_mask_size(), '\0');
-    RAND_bytes(reinterpret_cast<uint8_t*>(mask.data()), mask.size());
-  } else if (public_key.message_mask_type() == AT_MESSAGE_MASK_NO_MASK &&
-             public_key.message_mask_size() == 0) {
-    return "";
-  } else {
-    return absl::InvalidArgumentError(
-        "Unsupported message mask type Or invalid message mask size "
-        "requested.");
-  }
-  return mask;
-}
-
-absl::StatusOr<const EVP_MD*> ProtoHashTypeToEVPDigest(
-    const HashType hash_type) {
-  switch (hash_type) {
-    case AT_HASH_TYPE_SHA256:
-      return EVP_sha256();
-    case AT_HASH_TYPE_SHA384:
-      return EVP_sha384();
-    case AT_HASH_TYPE_UNDEFINED:
-    default:
-      return absl::InvalidArgumentError("Unknown hash type.");
-  }
-}
-
-absl::StatusOr<const EVP_MD*> ProtoMaskGenFunctionToEVPDigest(
-    const MaskGenFunction mgf) {
-  switch (mgf) {
-    case AT_MGF_SHA256:
-      return EVP_sha256();
-    case AT_MGF_SHA384:
-      return EVP_sha384();
-    case AT_MGF_UNDEFINED:
-    default:
-      return absl::InvalidArgumentError(
-          "Unknown hash type for mask generation hash function.");
-  }
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> AnonymousTokensRSAPrivateKeyToRSA(
-    const RSAPrivateKey& private_key) {
-  return CreatePrivateKeyRSA(private_key.n(), private_key.e(), private_key.d(),
-                             private_key.p(), private_key.q(), private_key.dp(),
-                             private_key.dq(), private_key.crt());
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> AnonymousTokensRSAPublicKeyToRSA(
-    const RSAPublicKey& public_key) {
-  return CreatePublicKeyRSA(public_key.n(), public_key.e());
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h
deleted file mode 100644
index 2ef4c06..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_ANONYMOUS_TOKENS_PB_OPENSSL_CONVERTERS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_ANONYMOUS_TOKENS_PB_OPENSSL_CONVERTERS_H_
-
-#include <string>
-
-#include "absl/status/statusor.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// Generate a message mask. For more details, see
-// https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-absl::StatusOr<std::string> QUICHE_EXPORT GenerateMask(
-    const RSABlindSignaturePublicKey& public_key);
-
-// Converts the AnonymousTokens proto hash type to the equivalent EVP digest.
-absl::StatusOr<const EVP_MD*> QUICHE_EXPORT
-ProtoHashTypeToEVPDigest(HashType hash_type);
-
-// Converts the AnonymousTokens proto hash type for mask generation function to
-// the equivalent EVP digest.
-absl::StatusOr<const EVP_MD*> QUICHE_EXPORT
-ProtoMaskGenFunctionToEVPDigest(MaskGenFunction mgf);
-
-// Converts AnonymousTokens::RSAPrivateKey to bssl::UniquePtr<RSA> without
-// public metadata augmentation.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-AnonymousTokensRSAPrivateKeyToRSA(const RSAPrivateKey& private_key);
-
-// Converts AnonymousTokens::RSAPublicKey to bssl::UniquePtr<RSA> without
-// public metadata augmentation.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-AnonymousTokensRSAPublicKeyToRSA(const RSAPublicKey& public_key);
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_ANONYMOUS_TOKENS_PB_OPENSSL_CONVERTERS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc
deleted file mode 100644
index 5010373..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-
-#include <string>
-#include <utility>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-#include "openssl/bn.h"
-#include "openssl/digest.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-TEST(AnonymousTokensPbOpensslConvertersTests, GenerateMaskTestInvalidType) {
-  RSABlindSignaturePublicKey public_key;
-  public_key.set_message_mask_type(AT_MESSAGE_MASK_TYPE_UNDEFINED);
-  public_key.set_message_mask_size(kRsaMessageMaskSizeInBytes32);
-  absl::StatusOr<std::string> mask_32_bytes = GenerateMask(public_key);
-  EXPECT_EQ(mask_32_bytes.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(mask_32_bytes.status().message(),
-              ::testing::HasSubstr("Unsupported message mask type"));
-}
-
-TEST(AnonymousTokensPbOpensslConvertersTests, GenerateMaskTestInvalidLength) {
-  RSABlindSignaturePublicKey public_key;
-  // Mask meant to be concatenated is less than 32 bytes.
-  public_key.set_message_mask_type(AT_MESSAGE_MASK_CONCAT);
-  public_key.set_message_mask_size(kRsaMessageMaskSizeInBytes32 - 1);
-  absl::StatusOr<std::string> mask_32_bytes = GenerateMask(public_key);
-  // Mask type set to no mask but mask length requested is greater than 0.
-  public_key.set_message_mask_type(AT_MESSAGE_MASK_NO_MASK);
-  public_key.set_message_mask_size(kRsaMessageMaskSizeInBytes32);
-  absl::StatusOr<std::string> mask_0_bytes = GenerateMask(public_key);
-
-  EXPECT_EQ(mask_32_bytes.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_EQ(mask_0_bytes.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(mask_32_bytes.status().message(),
-              ::testing::HasSubstr("invalid message mask size"));
-  EXPECT_THAT(mask_0_bytes.status().message(),
-              ::testing::HasSubstr("invalid message mask size"));
-}
-
-TEST(AnonymousTokensPbOpensslConvertersTests, GenerateMaskTestSuccess) {
-  RSABlindSignaturePublicKey public_key;
-  public_key.set_message_mask_type(AT_MESSAGE_MASK_CONCAT);
-  public_key.set_message_mask_size(kRsaMessageMaskSizeInBytes32);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string mask_32_bytes,
-                                   GenerateMask(public_key));
-  // Longer mask.
-  public_key.set_message_mask_size(kRsaMessageMaskSizeInBytes32 * 2);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string mask_64_bytes,
-                                   GenerateMask(public_key));
-
-  // No mask.
-  public_key.set_message_mask_type(AT_MESSAGE_MASK_NO_MASK);
-  public_key.set_message_mask_size(0);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string mask_0_bytes,
-                                   GenerateMask(public_key));
-
-  EXPECT_FALSE(mask_32_bytes.empty());
-  EXPECT_FALSE(mask_64_bytes.empty());
-  EXPECT_TRUE(mask_0_bytes.empty());
-  EXPECT_EQ(mask_32_bytes.size(), kRsaMessageMaskSizeInBytes32);
-  EXPECT_EQ(mask_64_bytes.size(), kRsaMessageMaskSizeInBytes32 * 2);
-  EXPECT_EQ(mask_0_bytes.size(), 0);
-}
-
-TEST(AnonymousTokensPbOpensslConvertersTests,
-     HashTypeConverterTestInvalidType) {
-  absl::StatusOr<const EVP_MD *> evp =
-      ProtoHashTypeToEVPDigest(AT_HASH_TYPE_UNDEFINED);
-  EXPECT_EQ(evp.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(evp.status().message(),
-              ::testing::HasSubstr("Unknown hash type"));
-}
-
-TEST(AnonymousTokensPbOpensslConvertersTests, HashTypeConverterTestSuccess) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const EVP_MD *evp_256, ProtoHashTypeToEVPDigest(AT_HASH_TYPE_SHA256));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const EVP_MD *evp_384, ProtoHashTypeToEVPDigest(AT_HASH_TYPE_SHA384));
-  EXPECT_EQ(evp_256, EVP_sha256());
-  EXPECT_EQ(evp_384, EVP_sha384());
-}
-
-TEST(AnonymousTokensPbOpensslConvertersStrongTests,
-     MaskGenFunctionConverterStrongTestInvalidType) {
-  absl::StatusOr<const EVP_MD *> evp =
-      ProtoMaskGenFunctionToEVPDigest(AT_MGF_UNDEFINED);
-  EXPECT_EQ(evp.status().code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(evp.status().message(),
-              ::testing::HasSubstr(
-                  "Unknown hash type for mask generation hash function"));
-}
-
-TEST(AnonymousTokensPbOpensslConvertersTests,
-     MaskGenFunctionConverterTestSuccess) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const EVP_MD *evp_256, ProtoMaskGenFunctionToEVPDigest(AT_MGF_SHA256));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const EVP_MD *evp_384, ProtoMaskGenFunctionToEVPDigest(AT_MGF_SHA384));
-  EXPECT_EQ(evp_256, EVP_sha256());
-  EXPECT_EQ(evp_384, EVP_sha384());
-}
-
-using CreateTestKeyPairFunction =
-    absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>();
-
-class AnonymousTokensRsaKeyPairConverterTest
-    : public testing::TestWithParam<CreateTestKeyPairFunction *> {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto keys_pair, (*GetParam())());
-    public_key_ = std::move(keys_pair.first);
-    private_key_ = std::move(keys_pair.second);
-
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_modulus_,
-                                     StringToBignum(private_key_.n()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_e_, StringToBignum(private_key_.e()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_d_, StringToBignum(private_key_.d()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_p_, StringToBignum(private_key_.p()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_q_, StringToBignum(private_key_.q()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_dp_,
-                                     StringToBignum(private_key_.dp()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_dq_,
-                                     StringToBignum(private_key_.dq()));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_crt_,
-                                     StringToBignum(private_key_.crt()));
-  }
-
-  bssl::UniquePtr<BIGNUM> rsa_modulus_;
-  bssl::UniquePtr<BIGNUM> rsa_e_;
-  bssl::UniquePtr<BIGNUM> rsa_d_;
-  bssl::UniquePtr<BIGNUM> rsa_p_;
-  bssl::UniquePtr<BIGNUM> rsa_q_;
-  bssl::UniquePtr<BIGNUM> rsa_dp_;
-  bssl::UniquePtr<BIGNUM> rsa_dq_;
-  bssl::UniquePtr<BIGNUM> rsa_crt_;
-
-  RSAPublicKey public_key_;
-  RSAPrivateKey private_key_;
-};
-
-TEST_P(AnonymousTokensRsaKeyPairConverterTest, PublicKeyTest) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<RSA> rsa_public_key,
-      AnonymousTokensRSAPublicKeyToRSA(public_key_));
-
-  EXPECT_EQ(BN_cmp(RSA_get0_n(rsa_public_key.get()), rsa_modulus_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_e(rsa_public_key.get()), rsa_e_.get()), 0);
-}
-
-TEST_P(AnonymousTokensRsaKeyPairConverterTest, PrivateKeyTest) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<RSA> rsa_private_key,
-      AnonymousTokensRSAPrivateKeyToRSA(private_key_));
-
-  EXPECT_EQ(BN_cmp(RSA_get0_n(rsa_private_key.get()), rsa_modulus_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_e(rsa_private_key.get()), rsa_e_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_d(rsa_private_key.get()), rsa_d_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_p(rsa_private_key.get()), rsa_p_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_q(rsa_private_key.get()), rsa_q_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_dmp1(rsa_private_key.get()), rsa_dp_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_dmq1(rsa_private_key.get()), rsa_dq_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_iqmp(rsa_private_key.get()), rsa_crt_.get()), 0);
-}
-
-INSTANTIATE_TEST_SUITE_P(AnonymousTokensRsaKeyPairConverterTest,
-                         AnonymousTokensRsaKeyPairConverterTest,
-                         testing::Values(&GetStrongRsaKeys2048,
-                                         &GetAnotherStrongRsaKeys2048,
-                                         &GetStrongRsaKeys3072,
-                                         &GetStrongRsaKeys4096));
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc
deleted file mode 100644
index ba507b1..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc
+++ /dev/null
@@ -1,548 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/strings/escaping.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "openssl/base.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-struct IetfNewPublicExponentWithPublicMetadataTestVector {
-  std::string rsa_modulus;
-  std::string e;
-  std::string public_metadata;
-  std::string new_e;
-};
-
-TEST(AnonymousTokensCryptoUtilsTest, BignumToStringAndBack) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(BnCtxPtr ctx, GetAndStartBigNumCtx());
-
-  // Create a new BIGNUM using the context and set it
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> bn_1, NewBigNum());
-  ASSERT_EQ(BN_set_u64(bn_1.get(), 0x124435435), 1);
-  EXPECT_NE(bn_1, nullptr);
-  EXPECT_EQ(BN_is_zero(bn_1.get()), 0);
-  EXPECT_EQ(BN_is_one(bn_1.get()), 0);
-
-  // Convert bn_1 to string from BIGNUM
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const std::string converted_str,
-      BignumToString(*bn_1, BN_num_bytes(bn_1.get())));
-  // Convert the string version of bn_1 back to BIGNUM
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> bn_2,
-                                   StringToBignum(converted_str));
-  // Check whether the conversion back worked
-  EXPECT_EQ(BN_cmp(bn_1.get(), bn_2.get()), 0);
-}
-
-TEST(AnonymousTokensCryptoUtilsTest, PowerOfTwoAndRsaSqrtTwo) {
-  // Compute 2^(10-1/2).
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> sqrt2,
-                                   GetRsaSqrtTwo(10));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> small_pow2,
-                                   ComputePowerOfTwo(9));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> large_pow2,
-                                   ComputePowerOfTwo(10));
-  EXPECT_GT(BN_cmp(sqrt2.get(), small_pow2.get()), 0);
-  EXPECT_LT(BN_cmp(sqrt2.get(), large_pow2.get()), 0);
-}
-
-TEST(AnonymousTokensCryptoUtilsTest, ComputeHashAcceptsNullStringView) {
-  absl::StatusOr<std::string> null_hash =
-      ComputeHash(absl::string_view(nullptr, 0), *EVP_sha512());
-  absl::StatusOr<std::string> empty_hash = ComputeHash("", *EVP_sha512());
-  std::string str;
-  absl::StatusOr<std::string> empty_str_hash = ComputeHash(str, *EVP_sha512());
-
-  ASSERT_TRUE(null_hash.ok());
-  ASSERT_TRUE(empty_hash.ok());
-  ASSERT_TRUE(empty_str_hash.ok());
-
-  EXPECT_EQ(*null_hash, *empty_hash);
-  EXPECT_EQ(*null_hash, *empty_str_hash);
-}
-
-TEST(AnonymousTokensCryptoUtilsTest, ComputeCarmichaelLcm) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(BnCtxPtr ctx, GetAndStartBigNumCtx());
-
-  // Suppose that N = 1019 * 1187.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> phi_p, NewBigNum());
-  ASSERT_TRUE(BN_set_word(phi_p.get(), 1019 - 1));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> phi_q, NewBigNum());
-  ASSERT_TRUE(BN_set_word(phi_q.get(), 1187 - 1));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> expected_lcm,
-                                   NewBigNum());
-  ASSERT_TRUE(BN_set_word(expected_lcm.get(), (1019 - 1) * (1187 - 1) / 2));
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> lcm,
-                                   ComputeCarmichaelLcm(*phi_p, *phi_q, *ctx));
-  EXPECT_EQ(BN_cmp(lcm.get(), expected_lcm.get()), 0);
-}
-
-struct ComputeHashTestParam {
-  const EVP_MD* hasher;
-  absl::string_view input_hex;
-  absl::string_view expected_digest_hex;
-};
-
-using ComputeHashTest = testing::TestWithParam<ComputeHashTestParam>;
-
-// Returns the test parameters for ComputeHashTestParam from NIST's
-// samples.
-std::vector<ComputeHashTestParam> GetComputeHashTestParams() {
-  std::vector<ComputeHashTestParam> params;
-  params.push_back({
-      EVP_sha256(),
-      "af397a8b8dd73ab702ce8e53aa9f",
-      "d189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c",
-  });
-  params.push_back({
-      EVP_sha256(),
-      "59eb45bbbeb054b0b97334d53580ce03f699",
-      "32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288",
-  });
-  params.push_back({
-      EVP_sha512(),
-      "16b17074d3e3d97557f9ed77d920b4b1bff4e845b345a922",
-      "6884134582a760046433abcbd53db8ff1a89995862f305b887020f6da6c7b903a314721e"
-      "972bf438483f452a8b09596298a576c903c91df4a414c7bd20fd1d07",
-  });
-  params.push_back({
-      EVP_sha512(),
-      "7651ab491b8fa86f969d42977d09df5f8bee3e5899180b52c968b0db057a6f02a886ad61"
-      "7a84915a",
-      "f35e50e2e02b8781345f8ceb2198f068ba103476f715cfb487a452882c9f0de0c720b2a0"
-      "88a39d06a8a6b64ce4d6470dfeadc4f65ae06672c057e29f14c4daf9",
-  });
-  return params;
-}
-
-TEST_P(ComputeHashTest, ComputesHash) {
-  const ComputeHashTestParam& params = GetParam();
-  ASSERT_NE(params.hasher, nullptr);
-  std::string data = absl::HexStringToBytes(params.input_hex);
-  std::string expected_digest =
-      absl::HexStringToBytes(params.expected_digest_hex);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto computed_hash,
-                                   ComputeHash(data, *params.hasher));
-  EXPECT_EQ(computed_hash, expected_digest);
-}
-
-INSTANTIATE_TEST_SUITE_P(ComputeHashTests, ComputeHashTest,
-                         testing::ValuesIn(GetComputeHashTestParams()));
-
-TEST(PublicMetadataCryptoUtilsInternalTest, PublicMetadataHashWithHKDF) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(BnCtxPtr ctx, GetAndStartBigNumCtx());
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> max_value,
-                                   NewBigNum());
-  ASSERT_TRUE(BN_set_word(max_value.get(), 4294967295));
-  const auto [public_key, _] = GetStrongTestRsaKeyPair2048();
-  std::string input1 = "ro1";
-  std::string input2 = "ro2";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> output1,
-      internal::PublicMetadataHashWithHKDF(input1, public_key.n,
-                                           1 + input1.size()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> another_output1,
-      internal::PublicMetadataHashWithHKDF(input1, public_key.n,
-                                           1 + input1.size()));
-  EXPECT_EQ(BN_cmp(output1.get(), another_output1.get()), 0);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> output2,
-      internal::PublicMetadataHashWithHKDF(input2, public_key.n,
-                                           1 + input2.size()));
-  EXPECT_NE(BN_cmp(output1.get(), output2.get()), 0);
-
-  EXPECT_LE(BN_cmp(output1.get(), max_value.get()), 0);
-  EXPECT_LE(BN_cmp(output2.get(), max_value.get()), 0);
-}
-
-TEST(PublicMetadataCryptoUtilsTest, PublicExponentHashDifferentModulus) {
-  const auto public_key_1 = std::get<0>(GetStrongTestRsaKeyPair2048());
-  const auto public_key_2 = std::get<0>(GetAnotherStrongTestRsaKeyPair2048());
-  std::string metadata = "md";
-  // Check that same metadata and different modulus result in different
-  // hashes.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> rsa_modulus_1,
-                                   StringToBignum(public_key_1.n));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> exp1,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_1.get(), metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto rsa_modulus_2,
-                                   StringToBignum(public_key_2.n));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> exp2,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_2.get(), metadata));
-  EXPECT_NE(BN_cmp(exp1.get(), exp2.get()), 0);
-}
-
-std::vector<IetfNewPublicExponentWithPublicMetadataTestVector>
-GetIetfNewPublicExponentWithPublicMetadataTestVectors(
-    bool use_rsa_public_exponent) {
-  std::vector<IetfNewPublicExponentWithPublicMetadataTestVector> test_vectors;
-
-  std::string modulus = absl::HexStringToBytes(
-      "d6930820f71fe517bf3259d14d40209b02a5c0d3d61991c731dd7da39f8d69821552e231"
-      "8d6c9ad897e603887a476ea3162c1205da9ac96f02edf31df049bd55f142134c17d4382a"
-      "0e78e275345f165fbe8e49cdca6cf5c726c599dd39e09e75e0f330a33121e73976e4facb"
-      "a9cfa001c28b7c96f8134f9981db6750b43a41710f51da4240fe03106c12acb1e7bb53d7"
-      "5ec7256da3fddd0718b89c365410fce61bc7c99b115fb4c3c318081fa7e1b65a37774e8e"
-      "50c96e8ce2b2cc6b3b367982366a2bf9924c4bafdb3ff5e722258ab705c76d43e5f1f121"
-      "b984814e98ea2b2b8725cd9bc905c0bc3d75c2a8db70a7153213c39ae371b2b5dc1dafcb"
-      "19d6fae9");
-  std::string e = absl::HexStringToBytes("010001");
-
-  if (use_rsa_public_exponent) {
-    // Test vector 1
-    test_vectors.push_back(
-        {.rsa_modulus = modulus,
-         .e = e,
-         .public_metadata = absl::HexStringToBytes("6d65746164617461"),
-         .new_e = absl::HexStringToBytes(
-             "30584b72f5cb557085106232f051d039e23358feee9204cf30ea567620e90d79e"
-             "4a7a81388b1f390e18ea5240a1d8cc296ce1325128b445c48aa5a3b34fa07c324"
-             "bf17bc7f1b3efebaff81d7e032948f1477493bc183d2f8d94c947c984c6f07575"
-             "27615bf2a2f0ef0db5ad80ce99905beed0440b47fa5cb9a2334fea40ad88e6ef"
-             "1")});
-
-    // Test vector 2
-    test_vectors.push_back(
-        {.rsa_modulus = modulus,
-         .e = e,
-         .public_metadata = "",
-         .new_e = absl::HexStringToBytes(
-             "2ed5a8d2592a11bbeef728bb39018ef5c3cf343507dd77dd156d5eec7f06f0473"
-             "2e4be944c5d2443d244c59e52c9fa5e8de40f55ffd0e70fbe9093d3f7be2aafd7"
-             "7c14b263b71c1c6b3ca2b9629842a902128fee4878392a950906fae35d6194e0d"
-             "2548e58bbc20f841188ca2fceb20b2b1b45448da5c7d1c73fb6e83fa58867397"
-             "b")});
-  } else {
-    // Test vector 1
-    test_vectors.push_back(
-        {.rsa_modulus = modulus,
-         .e = e,
-         .public_metadata = absl::HexStringToBytes("6d65746164617461"),
-         .new_e = absl::HexStringToBytes(
-             "30581b1adab07ac00a5057e2986f37caaa68ae963ffbc4d36c16ea5f3689d6f00"
-             "db79a5bee56053adc53c8d0414d4b754b58c7cc4abef99d4f0d0b2e29cbddf746"
-             "c7d0f4ae2690d82a2757b088820c0d086a40d180b2524687060d768ad5e431732"
-             "102f4bc3572d97e01dcd6301368f255faae4606399f91fa913a6d699d6ef1")});
-
-    // Test vector 2
-    test_vectors.push_back(
-        {.rsa_modulus = modulus,
-         .e = e,
-         .public_metadata = "",
-         .new_e = absl::HexStringToBytes(
-             "2ed579fcdf2d328ebc686c52ccaec247018832acd530a2ac72c0ec2b92db5d6bd"
-             "578e91b6341c1021142b45b9e6e5bf031f3dd62226ec4a0f9ef99e45dd9ccd60a"
-             "a60a0c59aac271a8caf9ee68a9d9ff281367dae09d588d3c7bca7f18de48b6981"
-             "bbc729c4925c65e4b2a7f054facbb7e5fc6e4c6c10110c62ef0b94eec397b")});
-  }
-  return test_vectors;
-}
-
-TEST(PublicMetadataCryptoUtilsTest,
-     IetfNewPublicExponentWithPublicMetadataTests) {
-  const auto test_vectors =
-      GetIetfNewPublicExponentWithPublicMetadataTestVectors(
-          /*use_rsa_public_exponent=*/true);
-  for (const IetfNewPublicExponentWithPublicMetadataTestVector& test_vector :
-       test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> rsa_modulus,
-                                     StringToBignum(test_vector.rsa_modulus));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> rsa_e,
-                                     StringToBignum(test_vector.e));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> expected_new_e,
-                                     StringToBignum(test_vector.new_e));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        bssl::UniquePtr<BIGNUM> modified_e,
-        ComputeExponentWithPublicMetadataAndPublicExponent(
-            *rsa_modulus.get(), *rsa_e.get(), test_vector.public_metadata));
-
-    EXPECT_EQ(BN_cmp(modified_e.get(), expected_new_e.get()), 0);
-  }
-}
-
-TEST(PublicMetadataCryptoUtilsTest,
-     IetfNewPublicExponentWithPublicMetadataNoPublicExponentTests) {
-  const auto test_vectors =
-      GetIetfNewPublicExponentWithPublicMetadataTestVectors(
-          /*use_rsa_public_exponent=*/false);
-  for (const IetfNewPublicExponentWithPublicMetadataTestVector& test_vector :
-       test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> rsa_modulus,
-                                     StringToBignum(test_vector.rsa_modulus));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> expected_new_e,
-                                     StringToBignum(test_vector.new_e));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        bssl::UniquePtr<BIGNUM> modified_e,
-        ComputeExponentWithPublicMetadata(*rsa_modulus.get(),
-                                          test_vector.public_metadata));
-
-    EXPECT_EQ(BN_cmp(modified_e.get(), expected_new_e.get()), 0);
-  }
-}
-
-// copybara:strip_begin(internal comment)
-// The input public key and the expected DER encoding are taken from the
-// following Goa test:
-// http://google3/privacy/net/boq/common/tokens/token_types_test.go;l=21;rcl=528885322
-// copybara:strip_end
-TEST(AnonymousTokensCryptoUtilsTest, RsaPssDerEncoding) {
-  std::string rsa_modulus = absl::HexStringToBytes(
-      "b259758bb02bc75b68b17612c9bf68c5fa05958a334c61e167bc20bcc75757c126e892"
-      "10b9df3989072cf6260e6883c7cd4af4d31dde9915b69b301fbef962de8c71bd2db5ec62"
-      "5da259712f86a8dc3d241e9688c82391b7bf1ebc358311f55c26be910b76f61fea408ed6"
-      "92f1a9578a622c82c0fcf6f69ef3670e38bfc90f63da4f3bbbd088c8ae7a3c5a55e66f64"
-      "74d562d32cce7b7edd7cf0149ca0e96cb6525e81fbba815a8f12748e34e5135f572b2e17"
-      "b7ba430081597e6fb9033c005884d5935118c60d75b010f6fece7ecdcc1cb7d58d138969"
-      "3d43377f4f3de949cb1e4105e792b96d7f04b0cd262ac33cffc5a890d267425e61c19e93"
-      "63550f2285");
-  // A hex string of 3 bytes in length is passed.
-  std::string e_not_padded = absl::HexStringToBytes("010001");
-  // A hex string of 4 bytes in length is passed.
-  std::string e_padded = absl::HexStringToBytes("00010001");
-
-  // Convert both padded and not padded rsa public keys to rsa structs.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<RSA> rsa_e_not_padded,
-      CreatePublicKeyRSA(rsa_modulus, e_not_padded));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<RSA> rsa_e_padded,
-                                   CreatePublicKeyRSA(rsa_modulus, e_padded));
-  // Encode both padded and not padded rsa structs to DER.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string result_e_not_padded,
-      RsaSsaPssPublicKeyToDerEncoding(rsa_e_not_padded.get()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string result_e_padded,
-      RsaSsaPssPublicKeyToDerEncoding(rsa_e_padded.get()));
-
-  std::string expected_der_encoding = absl::HexStringToBytes(
-      "30820152303d06092a864886f70d01010a3030a00d300b0609608648016503040202a11a"
-      "301806092a864886f70d010108300b0609608648016503040202a2030201300382010f00"
-      "3082010a0282010100b259758bb02bc75b68b17612c9bf68c5fa05958a334c61e167bc20"
-      "bcc75757c126e89210b9df3989072cf6260e6883c7cd4af4d31dde9915b69b301fbef962"
-      "de8c71bd2db5ec625da259712f86a8dc3d241e9688c82391b7bf1ebc358311f55c26be91"
-      "0b76f61fea408ed692f1a9578a622c82c0fcf6f69ef3670e38bfc90f63da4f3bbbd088c8"
-      "ae7a3c5a55e66f6474d562d32cce7b7edd7cf0149ca0e96cb6525e81fbba815a8f12748e"
-      "34e5135f572b2e17b7ba430081597e6fb9033c005884d5935118c60d75b010f6fece7ecd"
-      "cc1cb7d58d1389693d43377f4f3de949cb1e4105e792b96d7f04b0cd262ac33cffc5a890"
-      "d267425e61c19e9363550f22850203010001");
-
-  EXPECT_EQ(result_e_not_padded, expected_der_encoding);
-  EXPECT_EQ(result_e_padded, expected_der_encoding);
-}
-
-// The public key used in this test is taken from the test vectors found here:
-// https://www.ietf.org/archive/id/draft-ietf-privacypass-protocol-10.html#name-issuance-protocol-2-blind-rs
-TEST(AnonymousTokensCryptoUtilsTest, IetfPrivacyPassBlindRsaPublicKeyToDer) {
-  std::string rsa_modulus = absl::HexStringToBytes(
-      "cb1aed6b6a95f5b1ce013a4cfcab25b94b2e64a23034e4250a7eab43c0df3a8c12993af1"
-      "2b111908d4b471bec31d4b6c9ad9cdda90612a2ee903523e6de5a224d6b02f09e5c374d0"
-      "cfe01d8f529c500a78a2f67908fa682b5a2b430c81eaf1af72d7b5e794fc98a313927687"
-      "9757ce453b526ef9bf6ceb99979b8423b90f4461a22af37aab0cf5733f7597abe44d31c7"
-      "32db68a181c6cbbe607d8c0e52e0655fd9996dc584eca0be87afbcd78a337d17b1dba9e8"
-      "28bbd81e291317144e7ff89f55619709b096cbb9ea474cead264c2073fe49740c01f00e1"
-      "09106066983d21e5f83f086e2e823c879cd43cef700d2a352a9babd612d03cad02db134b"
-      "7e225a5f");
-  std::string e = absl::HexStringToBytes("010001");
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<RSA> rsa,
-                                   CreatePublicKeyRSA(rsa_modulus, e));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string result,
-                                   RsaSsaPssPublicKeyToDerEncoding(rsa.get()));
-
-  std::string expected_der_encoding = absl::HexStringToBytes(
-      "30820152303d06092a864886f70d01010a3030a00d300b0609608648016503040202a11a"
-      "301806092a864886f70d010108300b0609608648016503040202a2030201300382010f00"
-      "3082010a0282010100cb1aed6b6a95f5b1ce013a4cfcab25b94b2e64a23034e4250a7eab"
-      "43c0df3a8c12993af12b111908d4b471bec31d4b6c9ad9cdda90612a2ee903523e6de5a2"
-      "24d6b02f09e5c374d0cfe01d8f529c500a78a2f67908fa682b5a2b430c81eaf1af72d7b5"
-      "e794fc98a3139276879757ce453b526ef9bf6ceb99979b8423b90f4461a22af37aab0cf5"
-      "733f7597abe44d31c732db68a181c6cbbe607d8c0e52e0655fd9996dc584eca0be87afbc"
-      "d78a337d17b1dba9e828bbd81e291317144e7ff89f55619709b096cbb9ea474cead264c2"
-      "073fe49740c01f00e109106066983d21e5f83f086e2e823c879cd43cef700d2a352a9bab"
-      "d612d03cad02db134b7e225a5f0203010001");
-
-  EXPECT_EQ(result, expected_der_encoding);
-}
-
-using CreateTestKeyPairFunction = std::pair<
-    anonymous_tokens::TestRsaPublicKey, anonymous_tokens::TestRsaPrivateKey>();
-
-class CryptoUtilsTest
-    : public testing::TestWithParam<CreateTestKeyPairFunction*> {
- protected:
-  void SetUp() override {
-    const auto [_, private_key] = (*GetParam())();
-    private_key_ = private_key;
-
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_modulus_,
-                                     StringToBignum(private_key_.n));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_e_, StringToBignum(private_key_.e));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_p_, StringToBignum(private_key_.p));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(rsa_q_, StringToBignum(private_key_.q));
-  }
-
-  TestRsaPrivateKey private_key_;
-
-  bssl::UniquePtr<BIGNUM> rsa_modulus_;
-  bssl::UniquePtr<BIGNUM> rsa_e_;
-  bssl::UniquePtr<BIGNUM> rsa_p_;
-  bssl::UniquePtr<BIGNUM> rsa_q_;
-};
-
-TEST_P(CryptoUtilsTest, PublicExponentCoprime) {
-  std::string metadata = "md";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> exp,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_.get(), metadata));
-  int rsa_mod_size_bits = BN_num_bits(rsa_modulus_.get());
-  // Check that exponent is odd.
-  EXPECT_EQ(BN_is_odd(exp.get()), 1);
-  // Check that exponent is small enough.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> sqrt2,
-                                   GetRsaSqrtTwo(rsa_mod_size_bits / 2));
-  EXPECT_LT(BN_cmp(exp.get(), sqrt2.get()), 0);
-  EXPECT_LT(BN_cmp(exp.get(), rsa_p_.get()), 0);
-  EXPECT_LT(BN_cmp(exp.get(), rsa_q_.get()), 0);
-}
-
-TEST_P(CryptoUtilsTest, PublicExponentHash) {
-  std::string metadata1 = "md1";
-  std::string metadata2 = "md2";
-  // Check that hash is deterministic.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> exp1,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_.get(), metadata1));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> another_exp1,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_.get(), metadata1));
-  EXPECT_EQ(BN_cmp(exp1.get(), another_exp1.get()), 0);
-  // Check that hashes are distinct for different metadata.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> exp2,
-      ComputeExponentWithPublicMetadata(*rsa_modulus_.get(), metadata2));
-  EXPECT_NE(BN_cmp(exp1.get(), exp2.get()), 0);
-}
-
-TEST_P(CryptoUtilsTest, FinalExponentCoprime) {
-  std::string metadata = "md";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> final_exponent,
-      ComputeExponentWithPublicMetadataAndPublicExponent(
-          *rsa_modulus_.get(), *rsa_e_.get(), metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(BnCtxPtr ctx, GetAndStartBigNumCtx());
-
-  // Check that exponent is odd.
-  EXPECT_EQ(BN_is_odd(final_exponent.get()), 1);
-  // Check that exponent is co-prime to factors of the rsa modulus.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> gcd_p_fe,
-                                   NewBigNum());
-  ASSERT_EQ(
-      BN_gcd(gcd_p_fe.get(), rsa_p_.get(), final_exponent.get(), ctx.get()), 1);
-  EXPECT_EQ(BN_cmp(gcd_p_fe.get(), BN_value_one()), 0);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<BIGNUM> gcd_q_fe,
-                                   NewBigNum());
-  ASSERT_EQ(
-      BN_gcd(gcd_q_fe.get(), rsa_q_.get(), final_exponent.get(), ctx.get()), 1);
-  EXPECT_EQ(BN_cmp(gcd_q_fe.get(), BN_value_one()), 0);
-}
-
-TEST_P(CryptoUtilsTest, DeterministicModificationOfPublicExponentWithMetadata) {
-  std::string metadata = "md";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> public_exp_1,
-      ComputeExponentWithPublicMetadataAndPublicExponent(
-          *rsa_modulus_.get(), *rsa_e_.get(), metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> public_exp_2,
-      ComputeExponentWithPublicMetadataAndPublicExponent(
-          *rsa_modulus_.get(), *rsa_e_.get(), metadata));
-
-  EXPECT_EQ(BN_cmp(public_exp_1.get(), public_exp_2.get()), 0);
-}
-
-TEST_P(CryptoUtilsTest, DifferentPublicExponentWithDifferentPublicMetadata) {
-  std::string metadata_1 = "md1";
-  std::string metadata_2 = "md2";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> public_exp_1,
-      ComputeExponentWithPublicMetadataAndPublicExponent(
-          *rsa_modulus_.get(), *rsa_e_.get(), metadata_1));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> public_exp_2,
-      ComputeExponentWithPublicMetadataAndPublicExponent(
-          *rsa_modulus_.get(), *rsa_e_.get(), metadata_2));
-  // Check that exponent is different in all keys
-  EXPECT_NE(BN_cmp(public_exp_1.get(), public_exp_2.get()), 0);
-  EXPECT_NE(BN_cmp(public_exp_1.get(), rsa_e_.get()), 0);
-  EXPECT_NE(BN_cmp(public_exp_2.get(), rsa_e_.get()), 0);
-}
-
-TEST_P(CryptoUtilsTest, ModifiedPublicExponentWithEmptyPublicMetadata) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      bssl::UniquePtr<BIGNUM> new_public_exp,
-      ComputeExponentWithPublicMetadataAndPublicExponent(*rsa_modulus_.get(),
-                                                         *rsa_e_.get(), ""));
-
-  EXPECT_NE(BN_cmp(new_public_exp.get(), rsa_e_.get()), 0);
-}
-
-TEST_P(CryptoUtilsTest, CreateRsaPublicKeyWithPublicMetadataSuccessfully) {
-  std::string metadata = "md";
-  // Key derived using the public exponent, modulus and public metadata.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<RSA> rsa_public_key,
-                                   CreatePublicKeyRSAWithPublicMetadata(
-                                       private_key_.n, private_key_.e, metadata,
-                                       /*use_rsa_public_exponent=*/true));
-  // Key derived using only the modulus and public metadata.
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(bssl::UniquePtr<RSA> rsa_public_key_2,
-                                   CreatePublicKeyRSAWithPublicMetadata(
-                                       private_key_.n, private_key_.e, metadata,
-                                       /*use_rsa_public_exponent=*/false));
-
-  EXPECT_EQ(BN_cmp(RSA_get0_n(rsa_public_key.get()), rsa_modulus_.get()), 0);
-  EXPECT_EQ(BN_cmp(RSA_get0_n(rsa_public_key_2.get()), rsa_modulus_.get()), 0);
-
-  EXPECT_NE(BN_cmp(RSA_get0_e(rsa_public_key.get()), rsa_e_.get()), 0);
-  EXPECT_NE(BN_cmp(RSA_get0_e(rsa_public_key_2.get()), rsa_e_.get()), 0);
-  EXPECT_NE(BN_cmp(RSA_get0_e(rsa_public_key.get()),
-                   RSA_get0_e(rsa_public_key_2.get())),
-            0);
-}
-
-INSTANTIATE_TEST_SUITE_P(CryptoUtilsTest, CryptoUtilsTest,
-                         testing::Values(&GetStrongTestRsaKeyPair2048,
-                                         &GetAnotherStrongTestRsaKeyPair2048,
-                                         &GetStrongTestRsaKeyPair3072,
-                                         &GetStrongTestRsaKeyPair4096));
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h
deleted file mode 100644
index 3c3e5db..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLIND_SIGNER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLIND_SIGNER_H_
-
-#include <string>
-
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-class BlindSigner {
- public:
-  virtual absl::StatusOr<std::string> Sign(
-      absl::string_view blinded_data) const = 0;
-
-  virtual ~BlindSigner() = default;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLIND_SIGNER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h
deleted file mode 100644
index fd29ad7..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLINDER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLINDER_H_
-
-#include <string>
-
-#include "absl/status/statusor.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-class Blinder {
- public:
-  enum class BlinderState { kCreated = 0, kBlinded, kUnblinded };
-  virtual absl::StatusOr<std::string> Blind(absl::string_view message) = 0;
-
-  virtual absl::StatusOr<std::string> Unblind(
-      absl::string_view blind_signature) = 0;
-
-  virtual ~Blinder() = default;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_BLINDER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h
deleted file mode 100644
index d020d5b..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CONSTANTS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CONSTANTS_H_
-
-#include <cstdint>
-
-#include "absl/strings/string_view.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// Returned integer on successful execution of BoringSSL methods
-constexpr int kBsslSuccess = 1;
-
-// RSA modulus size, 4096 bits
-//
-// Our recommended size.
-constexpr int kRsaModulusSizeInBits4096 = 4096;
-
-// RSA modulus size, 512 bytes
-constexpr int kRsaModulusSizeInBytes512 = 512;
-
-// RSA modulus size, 2048 bits
-//
-// Recommended size for RSA Blind Signatures without Public Metadata.
-//
-// https://www.ietf.org/archive/id/draft-ietf-privacypass-protocol-08.html#name-token-type-blind-rsa-2048-b.
-constexpr int kRsaModulusSizeInBits2048 = 2048;
-
-// RSA modulus size, 256 bytes
-constexpr int kRsaModulusSizeInBytes256 = 256;
-
-// Salt length, 48 bytes
-//
-// Recommended size. The convention is to use hLen, the length of the output of
-// the hash function in bytes. A salt length of zero will result in a
-// deterministic signature value.
-//
-// https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-constexpr int kSaltLengthInBytes48 = 48;
-
-// Length of message mask, 32 bytes.
-//
-// https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-constexpr int kRsaMessageMaskSizeInBytes32 = 32;
-
-// Info used in HKDF for Public Metadata Hash.
-constexpr absl::string_view kHkdfPublicMetadataInfo = "PBRSA";
-
-constexpr int kHkdfPublicMetadataInfoSizeInBytes = 5;
-
-// Object identifier for Rivest, Shamir, Adleman (RSA) Signature Scheme with
-// Appendix - Probabilistic Signature Scheme (RSASSA-PSS) defined here:
-// https://oidref.com/1.2.840.113549.1.1.10
-constexpr char kRsaSsaPssOid[] = "1.2.840.113549.1.1.10";
-
-// Object identifier for SHA384 defined here:
-// https://oidref.com/2.16.840.1.101.3.4.2.2
-constexpr char kSha384Oid[] = "2.16.840.1.101.3.4.2.2";
-
-// Object identifier for RSA algorithm that uses the Mask Generator Function 1
-// (MGF1) defined here:
-// https://oidref.com/1.2.840.113549.1.1.8
-constexpr char kRsaSsaPssMgf1Oid[] = "1.2.840.113549.1.1.8";
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CONSTANTS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc
deleted file mode 100644
index 3ed32a2..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.cc
+++ /dev/null
@@ -1,618 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <cstdint>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "openssl/bytestring.h"
-#include "openssl/err.h"
-#include "openssl/hkdf.h"
-#include "openssl/mem.h"
-#include "openssl/rand.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-namespace internal {
-
-// Approximation of sqrt(2) taken from
-// //depot/google3/third_party/openssl/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c;l=997
-constexpr uint32_t kBoringSSLRSASqrtTwo[] = {
-    0x4d7c60a5, 0xe633e3e1, 0x5fcf8f7b, 0xca3ea33b, 0xc246785e, 0x92957023,
-    0xf9acce41, 0x797f2805, 0xfdfe170f, 0xd3b1f780, 0xd24f4a76, 0x3facb882,
-    0x18838a2e, 0xaff5f3b2, 0xc1fcbdde, 0xa2f7dc33, 0xdea06241, 0xf7aa81c2,
-    0xf6a1be3f, 0xca221307, 0x332a5e9f, 0x7bda1ebf, 0x0104dc01, 0xfe32352f,
-    0xb8cf341b, 0x6f8236c7, 0x4264dabc, 0xd528b651, 0xf4d3a02c, 0xebc93e0c,
-    0x81394ab6, 0xd8fd0efd, 0xeaa4a089, 0x9040ca4a, 0xf52f120f, 0x836e582e,
-    0xcb2a6343, 0x31f3c84d, 0xc6d5a8a3, 0x8bb7e9dc, 0x460abc72, 0x2f7c4e33,
-    0xcab1bc91, 0x1688458a, 0x53059c60, 0x11bc337b, 0xd2202e87, 0x42af1f4e,
-    0x78048736, 0x3dfa2768, 0x0f74a85e, 0x439c7b4a, 0xa8b1fe6f, 0xdc83db39,
-    0x4afc8304, 0x3ab8a2c3, 0xed17ac85, 0x83339915, 0x1d6f60ba, 0x893ba84c,
-    0x597d89b3, 0x754abe9f, 0xb504f333, 0xf9de6484,
-};
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> PublicMetadataHashWithHKDF(
-    absl::string_view public_metadata, absl::string_view rsa_modulus_str,
-    size_t out_len_bytes) {
-  const EVP_MD* evp_md_sha_384 = EVP_sha384();
-  // Prepend "key" to input.
-  std::string modified_input = absl::StrCat("key", public_metadata);
-  std::vector<uint8_t> input_buffer(modified_input.begin(),
-                                    modified_input.end());
-  // Append 0x00 to input.
-  input_buffer.push_back(0x00);
-  std::string out_e;
-  // We set the out_e size beyond out_len_bytes so that out_e bytes are
-  // indifferentiable from truly random bytes even after truncations.
-  //
-  // Expanding to 16 more bytes is sufficient.
-  // https://cfrg.github.io/draft-irtf-cfrg-hash-to-curve/draft-irtf-cfrg-hash-to-curve.html#name-hashing-to-a-finite-field
-  const size_t hkdf_output_size = out_len_bytes + 16;
-  out_e.resize(hkdf_output_size);
-  // The modulus is used as salt to ensure different outputs for same metadata
-  // and different modulus.
-  if (HKDF(reinterpret_cast<uint8_t*>(out_e.data()), hkdf_output_size,
-           evp_md_sha_384, input_buffer.data(), input_buffer.size(),
-           reinterpret_cast<const uint8_t*>(rsa_modulus_str.data()),
-           rsa_modulus_str.size(),
-           reinterpret_cast<const uint8_t*>(kHkdfPublicMetadataInfo.data()),
-           kHkdfPublicMetadataInfoSizeInBytes) != kBsslSuccess) {
-    return absl::InternalError("HKDF failed in public_metadata_crypto_utils");
-  }
-  // Truncate out_e to out_len_bytes
-  out_e.resize(out_len_bytes);
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> out,
-                               StringToBignum(out_e));
-  return out;
-}
-
-}  // namespace internal
-
-namespace {
-
-// Marshals an RSA public key in the DER format.
-absl::StatusOr<std::string> MarshalRsaPublicKey(const RSA* rsa) {
-  uint8_t* rsa_public_key_bytes;
-  size_t rsa_public_key_bytes_len = 0;
-  if (!RSA_public_key_to_bytes(&rsa_public_key_bytes, &rsa_public_key_bytes_len,
-                               rsa)) {
-    return absl::InvalidArgumentError(absl::StrCat(
-        "Failed to marshall rsa public key to a DER encoded RSAPublicKey "
-        "structure (RFC 8017): ",
-        GetSslErrors()));
-  }
-  std::string rsa_public_key_str(reinterpret_cast<char*>(rsa_public_key_bytes),
-                                 rsa_public_key_bytes_len);
-  OPENSSL_free(rsa_public_key_bytes);
-  return rsa_public_key_str;
-}
-
-}  // namespace
-
-absl::StatusOr<BnCtxPtr> GetAndStartBigNumCtx() {
-  // Create context to be used in intermediate computation.
-  BnCtxPtr bn_ctx = BnCtxPtr(BN_CTX_new());
-  if (!bn_ctx.get()) {
-    return absl::InternalError("Error generating bignum context.");
-  }
-  BN_CTX_start(bn_ctx.get());
-
-  return bn_ctx;
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> NewBigNum() {
-  bssl::UniquePtr<BIGNUM> bn(BN_new());
-  if (!bn.get()) {
-    return absl::InternalError("Error generating bignum.");
-  }
-  return bn;
-}
-
-absl::StatusOr<std::string> BignumToString(const BIGNUM& big_num,
-                                           const size_t output_len) {
-  std::vector<uint8_t> serialization(output_len);
-  if (BN_bn2bin_padded(serialization.data(), serialization.size(), &big_num) !=
-      kBsslSuccess) {
-    return absl::InternalError(
-        absl::StrCat("Function BN_bn2bin_padded failed: ", GetSslErrors()));
-  }
-  return std::string(std::make_move_iterator(serialization.begin()),
-                     std::make_move_iterator(serialization.end()));
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> StringToBignum(
-    const absl::string_view input_str) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> output, NewBigNum());
-  if (!BN_bin2bn(reinterpret_cast<const uint8_t*>(input_str.data()),
-                 input_str.size(), output.get())) {
-    return absl::InternalError(
-        absl::StrCat("Function BN_bin2bn failed: ", GetSslErrors()));
-  }
-  if (!output.get()) {
-    return absl::InternalError("Function BN_bin2bn failed.");
-  }
-  return output;
-}
-
-std::string GetSslErrors() {
-  std::string ret;
-  ERR_print_errors_cb(
-      [](const char* str, size_t len, void* ctx) -> int {
-        static_cast<std::string*>(ctx)->append(str, len);
-        return 1;
-      },
-      &ret);
-  return ret;
-}
-
-std::string MaskMessageConcat(absl::string_view mask,
-                              absl::string_view message) {
-  return absl::StrCat(mask, message);
-}
-
-std::string EncodeMessagePublicMetadata(absl::string_view message,
-                                        absl::string_view public_metadata) {
-  // Prepend encoding of "msg" followed by 4 bytes representing public metadata
-  // length.
-  std::string tag = "msg";
-  std::vector<uint8_t> buffer(tag.begin(), tag.end());
-  buffer.push_back((public_metadata.size() >> 24) & 0xFF);
-  buffer.push_back((public_metadata.size() >> 16) & 0xFF);
-  buffer.push_back((public_metadata.size() >> 8) & 0xFF);
-  buffer.push_back((public_metadata.size() >> 0) & 0xFF);
-
-  // Finally append public metadata and then the message to the output.
-  std::string encoding(buffer.begin(), buffer.end());
-  return absl::StrCat(encoding, public_metadata, message);
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> GetRsaSqrtTwo(int x) {
-  // Compute hard-coded sqrt(2).
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> sqrt2, NewBigNum());
-  // TODO(b/277606961): simplify RsaSqrtTwo initialization logic
-  const int sqrt2_size = sizeof(internal::kBoringSSLRSASqrtTwo) /
-                         sizeof(*internal::kBoringSSLRSASqrtTwo);
-  for (int i = sqrt2_size - 2; i >= 0; i = i - 2) {
-    // Add the uint32_t values as words directly and shift.
-    // 'i' is the "hi" value of a uint64_t, and 'i+1' is the "lo" value.
-    if (BN_add_word(sqrt2.get(), internal::kBoringSSLRSASqrtTwo[i]) != 1) {
-      return absl::InternalError(absl::StrCat(
-          "Cannot add word to compute RSA sqrt(2): ", GetSslErrors()));
-    }
-    if (BN_lshift(sqrt2.get(), sqrt2.get(), 32) != 1) {
-      return absl::InternalError(absl::StrCat(
-          "Cannot shift to compute RSA sqrt(2): ", GetSslErrors()));
-    }
-    if (BN_add_word(sqrt2.get(), internal::kBoringSSLRSASqrtTwo[i + 1]) != 1) {
-      return absl::InternalError(absl::StrCat(
-          "Cannot add word to compute RSA sqrt(2): ", GetSslErrors()));
-    }
-    if (i > 0) {
-      if (BN_lshift(sqrt2.get(), sqrt2.get(), 32) != 1) {
-        return absl::InternalError(absl::StrCat(
-            "Cannot shift to compute RSA sqrt(2): ", GetSslErrors()));
-      }
-    }
-  }
-
-  // Check that hard-coded result is correct length.
-  int sqrt2_bits = 32 * sqrt2_size;
-  if (BN_num_bits(sqrt2.get()) != sqrt2_bits) {
-    return absl::InternalError("RSA sqrt(2) is not correct length.");
-  }
-
-  // Either shift left or right depending on value x.
-  if (sqrt2_bits > x) {
-    if (BN_rshift(sqrt2.get(), sqrt2.get(), sqrt2_bits - x) != 1) {
-      return absl::InternalError(
-          absl::StrCat("Cannot rshift to compute 2^(x-1/2): ", GetSslErrors()));
-    }
-  } else {
-    // Round up and be pessimistic about minimium factors.
-    if (BN_add_word(sqrt2.get(), 1) != 1 ||
-        BN_lshift(sqrt2.get(), sqrt2.get(), x - sqrt2_bits) != 1) {
-      return absl::InternalError(absl::StrCat(
-          "Cannot add/lshift to compute 2^(x-1/2): ", GetSslErrors()));
-    }
-  }
-
-  // Check that 2^(x - 1/2) is correct length.
-  if (BN_num_bits(sqrt2.get()) != x) {
-    return absl::InternalError(
-        "2^(x-1/2) is not correct length after shifting.");
-  }
-
-  return std::move(sqrt2);
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> ComputePowerOfTwo(int x) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> ret, NewBigNum());
-  if (BN_set_bit(ret.get(), x) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to set bit to compute 2^x: ", GetSslErrors()));
-  }
-  if (!BN_is_pow2(ret.get()) || !BN_is_bit_set(ret.get(), x)) {
-    return absl::InternalError(absl::StrCat("Unable to compute 2^", x, "."));
-  }
-  return ret;
-}
-
-absl::StatusOr<std::string> ComputeHash(absl::string_view input,
-                                        const EVP_MD& hasher) {
-  std::string digest;
-  digest.resize(EVP_MAX_MD_SIZE);
-
-  uint32_t digest_length = 0;
-  if (EVP_Digest(input.data(), input.length(),
-                 reinterpret_cast<uint8_t*>(&digest[0]), &digest_length,
-                 &hasher, /*impl=*/nullptr) != 1) {
-    return absl::InternalError(absl::StrCat(
-        "Openssl internal error computing hash: ", GetSslErrors()));
-  }
-  digest.resize(digest_length);
-  return digest;
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> CreatePrivateKeyRSA(
-    const absl::string_view rsa_modulus,
-    const absl::string_view public_exponent,
-    const absl::string_view private_exponent, const absl::string_view p,
-    const absl::string_view q, const absl::string_view dp,
-    const absl::string_view dq, const absl::string_view crt) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> n_bn,
-                               StringToBignum(rsa_modulus));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> e_bn,
-                               StringToBignum(public_exponent));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> d_bn,
-                               StringToBignum(private_exponent));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> p_bn, StringToBignum(p));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> q_bn, StringToBignum(q));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> dp_bn,
-                               StringToBignum(dp));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> dq_bn,
-                               StringToBignum(dq));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> crt_bn,
-                               StringToBignum(crt));
-
-  bssl::UniquePtr<RSA> rsa_private_key(
-      RSA_new_private_key(n_bn.get(), e_bn.get(), d_bn.get(), p_bn.get(),
-                          q_bn.get(), dp_bn.get(), dq_bn.get(), crt_bn.get()));
-  if (!rsa_private_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new_private_key failed: ", GetSslErrors()));
-  }
-  return rsa_private_key;
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> CreatePublicKeyRSA(
-    const absl::string_view rsa_modulus,
-    const absl::string_view public_exponent) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> n_bn,
-                               StringToBignum(rsa_modulus));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> e_bn,
-                               StringToBignum(public_exponent));
-  // Convert to OpenSSL RSA.
-  bssl::UniquePtr<RSA> rsa_public_key(
-      RSA_new_public_key(n_bn.get(), e_bn.get()));
-  if (!rsa_public_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new_public_key failed: ", GetSslErrors()));
-  }
-  return rsa_public_key;
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> CreatePublicKeyRSAWithPublicMetadata(
-    const BIGNUM& rsa_modulus, const BIGNUM& public_exponent,
-    absl::string_view public_metadata, const bool use_rsa_public_exponent) {
-  bssl::UniquePtr<BIGNUM> derived_rsa_e;
-  if (use_rsa_public_exponent) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        derived_rsa_e, ComputeExponentWithPublicMetadataAndPublicExponent(
-                           rsa_modulus, public_exponent, public_metadata));
-  } else {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        derived_rsa_e,
-        ComputeExponentWithPublicMetadata(rsa_modulus, public_metadata));
-  }
-  bssl::UniquePtr<RSA> rsa_public_key = bssl::UniquePtr<RSA>(
-      RSA_new_public_key_large_e(&rsa_modulus, derived_rsa_e.get()));
-  if (!rsa_public_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new_public_key_large_e failed: ", GetSslErrors()));
-  }
-  return rsa_public_key;
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> CreatePublicKeyRSAWithPublicMetadata(
-    const absl::string_view rsa_modulus,
-    const absl::string_view public_exponent,
-    const absl::string_view public_metadata,
-    const bool use_rsa_public_exponent) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_n,
-                               StringToBignum(rsa_modulus));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_e,
-                               StringToBignum(public_exponent));
-  return CreatePublicKeyRSAWithPublicMetadata(
-      *rsa_n.get(), *rsa_e.get(), public_metadata, use_rsa_public_exponent);
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> ComputeCarmichaelLcm(
-    const BIGNUM& phi_p, const BIGNUM& phi_q, BN_CTX& bn_ctx) {
-  // To compute lcm(phi(p), phi(q)), we first compute phi(n) =
-  // (p-1)(q-1). As n is assumed to be a safe RSA modulus (signing_key is
-  // assumed to be part of a strong rsa key pair), phi(n) = (p-1)(q-1) =
-  // (2 phi(p))(2 phi(q)) = 4 * phi(p) * phi(q) where phi(p) and phi(q) are also
-  // primes. So we get the lcm by outputting phi(n) >> 1 = 2 * phi(p) * phi(q).
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_n, NewBigNum());
-  if (BN_mul(phi_n.get(), &phi_p, &phi_q, &bn_ctx) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(n): ", GetSslErrors()));
-  }
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> lcm, NewBigNum());
-  if (BN_rshift1(lcm.get(), phi_n.get()) != 1) {
-    return absl::InternalError(absl::StrCat(
-        "Could not compute LCM(phi(p), phi(q)): ", GetSslErrors()));
-  }
-  return lcm;
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> ComputeExponentWithPublicMetadata(
-    const BIGNUM& n, absl::string_view public_metadata) {
-  // Check modulus length.
-  if (BN_num_bits(&n) % 2 == 1) {
-    return absl::InvalidArgumentError(
-        "Strong RSA modulus should be even length.");
-  }
-  int modulus_bytes = BN_num_bytes(&n);
-  // The integer modulus_bytes is expected to be a power of 2.
-  int prime_bytes = modulus_bytes / 2;
-
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string rsa_modulus_str,
-                               BignumToString(n, modulus_bytes));
-
-  // Get HKDF output of length prime_bytes.
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      bssl::UniquePtr<BIGNUM> exponent,
-      internal::PublicMetadataHashWithHKDF(public_metadata, rsa_modulus_str,
-                                           prime_bytes));
-
-  // We need to generate random odd exponents < 2^(primes_bits - 2) where
-  // prime_bits = prime_bytes * 8. This will guarantee that the resulting
-  // exponent is coprime to phi(N) = 4p'q' as 2^(prime_bits - 2) < p', q' <
-  // 2^(prime_bits - 1).
-  //
-  // To do this, we can truncate the HKDF output (exponent) which is prime_bits
-  // long, to prime_bits - 2, by clearing its top two bits. We then set the
-  // least significant bit to 1. This way the final exponent will be less than
-  // 2^(primes_bits - 2) and will always be odd.
-  if (BN_clear_bit(exponent.get(), (prime_bytes * 8) - 1) != kBsslSuccess ||
-      BN_clear_bit(exponent.get(), (prime_bytes * 8) - 2) != kBsslSuccess ||
-      BN_set_bit(exponent.get(), 0) != kBsslSuccess) {
-    return absl::InvalidArgumentError(absl::StrCat(
-        "Could not clear the two most significant bits and set the least "
-        "significant bit to zero: ",
-        GetSslErrors()));
-  }
-  // Check that exponent is small enough to ensure it is coprime to phi(n).
-  if (BN_num_bits(exponent.get()) >= (8 * prime_bytes - 1)) {
-    return absl::InternalError("Generated exponent is too large.");
-  }
-
-  return exponent;
-}
-
-absl::StatusOr<bssl::UniquePtr<BIGNUM>>
-ComputeExponentWithPublicMetadataAndPublicExponent(
-    const BIGNUM& n, const BIGNUM& e, absl::string_view public_metadata) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      bssl::UniquePtr<BIGNUM> md_exp,
-      ComputeExponentWithPublicMetadata(n, public_metadata));
-  ANON_TOKENS_ASSIGN_OR_RETURN(BnCtxPtr bn_ctx, GetAndStartBigNumCtx());
-  // new_e=e*md_exp
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_e, NewBigNum());
-  if (BN_mul(new_e.get(), md_exp.get(), &e, bn_ctx.get()) != kBsslSuccess) {
-    return absl::InternalError(
-        absl::StrCat("Unable to multiply e with md_exp: ", GetSslErrors()));
-  }
-  return new_e;
-}
-
-absl::Status RsaBlindSignatureVerify(const int salt_length,
-                                     const EVP_MD* sig_hash,
-                                     const EVP_MD* mgf1_hash,
-                                     const absl::string_view signature,
-                                     const absl::string_view message,
-                                     RSA* rsa_public_key) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string message_digest,
-                               ComputeHash(message, *sig_hash));
-  const int hash_size = EVP_MD_size(sig_hash);
-  // Make sure the size of the digest is correct.
-  if (message_digest.size() != hash_size) {
-    return absl::InvalidArgumentError(
-        absl::StrCat("Size of the digest doesn't match the one "
-                     "of the hashing algorithm; expected ",
-                     hash_size, " got ", message_digest.size()));
-  }
-  // Make sure the size of the signature is correct.
-  const int rsa_modulus_size = BN_num_bytes(RSA_get0_n(rsa_public_key));
-  if (signature.size() != rsa_modulus_size) {
-    return absl::InvalidArgumentError(
-        "Signature size not equal to modulus size.");
-  }
-
-  std::string recovered_message_digest(rsa_modulus_size, 0);
-  int recovered_message_digest_size = RSA_public_decrypt(
-      /*flen=*/signature.size(),
-      /*from=*/reinterpret_cast<const uint8_t*>(signature.data()),
-      /*to=*/
-      reinterpret_cast<uint8_t*>(recovered_message_digest.data()),
-      /*rsa=*/rsa_public_key,
-      /*padding=*/RSA_NO_PADDING);
-  if (recovered_message_digest_size != rsa_modulus_size) {
-    return absl::InvalidArgumentError(
-        absl::StrCat("Invalid signature size (likely an incorrect key is "
-                     "used); expected ",
-                     rsa_modulus_size, " got ", recovered_message_digest_size,
-                     ": ", GetSslErrors()));
-  }
-  if (RSA_verify_PKCS1_PSS_mgf1(
-          rsa_public_key, reinterpret_cast<const uint8_t*>(&message_digest[0]),
-          sig_hash, mgf1_hash,
-          reinterpret_cast<const uint8_t*>(recovered_message_digest.data()),
-          salt_length) != kBsslSuccess) {
-    return absl::InvalidArgumentError(
-        absl::StrCat("PSS padding verification failed: ", GetSslErrors()));
-  }
-  return absl::OkStatus();
-}
-
-absl::StatusOr<std::string> RsaSsaPssPublicKeyToDerEncoding(const RSA* rsa) {
-  if (rsa == NULL) {
-    return absl::InvalidArgumentError("Public Key rsa is null.");
-  }
-  // Create DER encoded RSA public key string.
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string rsa_public_key_str,
-                               MarshalRsaPublicKey(rsa));
-  // Main CRYPTO ByteBuilder object cbb which will be passed to CBB_finish to
-  // finalize and output the DER encoding of the RsaSsaPssPublicKey.
-  bssl::ScopedCBB cbb;
-  // initial_capacity only serves as a hint.
-  if (!CBB_init(cbb.get(), /*initial_capacity=*/2 * RSA_size(rsa))) {
-    return absl::InternalError("CBB_init() failed.");
-  }
-
-  // Temporary CBB objects to write ASN1 sequences and object identifiers into.
-  CBB outer_seq, inner_seq, param_seq, sha384_seq, mgf1_seq, mgf1_sha384_seq;
-  CBB param0_tag, param1_tag, param2_tag;
-  CBB rsassa_pss_oid, sha384_oid, mgf1_oid, mgf1_sha384_oid;
-  CBB public_key_bit_str_cbb;
-  // RsaSsaPssPublicKey ASN.1 structure example:
-  //
-  //  SEQUENCE {                                               # outer_seq
-  //    SEQUENCE {                                             # inner_seq
-  //      OBJECT_IDENTIFIER{1.2.840.113549.1.1.10}             # rsassa_pss_oid
-  //      SEQUENCE {                                           # param_seq
-  //        [0] {                                              # param0_tag
-  //              {                                            # sha384_seq
-  //                OBJECT_IDENTIFIER{2.16.840.1.101.3.4.2.2}  # sha384_oid
-  //              }
-  //            }
-  //        [1] {                                              # param1_tag
-  //              {                                            # mgf1_seq
-  //                OBJECT_IDENTIFIER{1.2.840.113549.1.1.8}    # mgf1_oid
-  //                {                                          # mgf1_sha384_seq
-  //                  OBJECT_IDENTIFIER{2.16.840.1.101.3.4.2.2}# mgf1_sha384_oid
-  //                }
-  //              }
-  //            }
-  //        [2] {                                              # param2_tag
-  //              INTEGER { 48 }                               # salt length
-  //            }
-  //      }
-  //    }
-  //    BIT STRING {                                    # public_key_bit_str_cbb
-  //      0                                             # unused bits
-  //      der_encoded_rsa_public_key_structure
-  //    }
-  //  }
-  //
-  // Start with the outer sequence.
-  if (!CBB_add_asn1(cbb.get(), &outer_seq, CBS_ASN1_SEQUENCE) ||
-      // The outer sequence consists of two parts; the inner sequence and the
-      // encoded rsa public key.
-      //
-      // Add the inner sequence to the outer sequence.
-      !CBB_add_asn1(&outer_seq, &inner_seq, CBS_ASN1_SEQUENCE) ||
-      // Add object identifier for RSASSA-PSS algorithm to the inner sequence.
-      !CBB_add_asn1(&inner_seq, &rsassa_pss_oid, CBS_ASN1_OBJECT) ||
-      !CBB_add_asn1_oid_from_text(&rsassa_pss_oid, kRsaSsaPssOid,
-                                  strlen(kRsaSsaPssOid)) ||
-      // Add a parameter sequence to the inner sequence.
-      !CBB_add_asn1(&inner_seq, &param_seq, CBS_ASN1_SEQUENCE) ||
-      // SHA384 hash function algorithm identifier will be parameter 0 in the
-      // parameter sequence.
-      !CBB_add_asn1(&param_seq, &param0_tag,
-                    CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) ||
-      !CBB_add_asn1(&param0_tag, &sha384_seq, CBS_ASN1_SEQUENCE) ||
-      // Add SHA384 object identifier to finish the SHA384 algorithm identifier
-      // and parameter 0.
-      !CBB_add_asn1(&sha384_seq, &sha384_oid, CBS_ASN1_OBJECT) ||
-      !CBB_add_asn1_oid_from_text(&sha384_oid, kSha384Oid,
-                                  strlen(kSha384Oid)) ||
-      // mgf1-SHA384 algorithm identifier as parameter 1 to the parameter
-      // sequence.
-      !CBB_add_asn1(&param_seq, &param1_tag,
-                    CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1) ||
-      !CBB_add_asn1(&param1_tag, &mgf1_seq, CBS_ASN1_SEQUENCE) ||
-      // Add mgf1 object identifier to the mgf1-SHA384 algorithm identifier.
-      !CBB_add_asn1(&mgf1_seq, &mgf1_oid, CBS_ASN1_OBJECT) ||
-      !CBB_add_asn1_oid_from_text(&mgf1_oid, kRsaSsaPssMgf1Oid,
-                                  strlen(kRsaSsaPssMgf1Oid)) ||
-      // Add SHA384 algorithm identifier to the mgf1-SHA384 algorithm
-      // identifier.
-      !CBB_add_asn1(&mgf1_seq, &mgf1_sha384_seq, CBS_ASN1_SEQUENCE) ||
-      // Add SHA384 object identifier to finish SHA384 algorithm identifier,
-      // mgf1-SHA384 algorithm identifier and parameter 1.
-      !CBB_add_asn1(&mgf1_sha384_seq, &mgf1_sha384_oid, CBS_ASN1_OBJECT) ||
-      !CBB_add_asn1_oid_from_text(&mgf1_sha384_oid, kSha384Oid,
-                                  strlen(kSha384Oid)) ||
-      // Add salt length as parameter 2 to the parameter sequence to finish the
-      // parameter sequence and the inner sequence.
-      !CBB_add_asn1(&param_seq, &param2_tag,
-                    CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2) ||
-      !CBB_add_asn1_int64(&param2_tag, kSaltLengthInBytes48) ||
-      // Add public key to the outer sequence as an ASN1 bitstring.
-      !CBB_add_asn1(&outer_seq, &public_key_bit_str_cbb, CBS_ASN1_BITSTRING) ||
-      !CBB_add_u8(&public_key_bit_str_cbb, 0 /* no unused bits */) ||
-      !CBB_add_bytes(
-          &public_key_bit_str_cbb,
-          reinterpret_cast<const uint8_t*>(rsa_public_key_str.data()),
-          rsa_public_key_str.size())) {
-    return absl::InvalidArgumentError(
-        "Failed to set the crypto byte builder object.");
-  }
-  // Finish creating the DER-encoding of RsaSsaPssPublicKey.
-  uint8_t* rsa_ssa_pss_public_key_der;
-  size_t rsa_ssa_pss_public_key_der_len;
-  if (!CBB_finish(cbb.get(), &rsa_ssa_pss_public_key_der,
-                  &rsa_ssa_pss_public_key_der_len)) {
-    return absl::InternalError("CBB_finish() failed.");
-  }
-  std::string rsa_ssa_pss_public_key_der_str(
-      reinterpret_cast<const char*>(rsa_ssa_pss_public_key_der),
-      rsa_ssa_pss_public_key_der_len);
-  // Free memory.
-  OPENSSL_free(rsa_ssa_pss_public_key_der);
-  // Return the DER encoding as string.
-  return rsa_ssa_pss_public_key_der_str;
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h
deleted file mode 100644
index 80bbdcc..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CRYPTO_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CRYPTO_UTILS_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <optional>
-#include <string>
-
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "openssl/base.h"
-#include "openssl/bn.h"
-#include "openssl/evp.h"
-#include "openssl/rsa.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// Internal functions only exposed for testing.
-namespace internal {
-
-// Outputs a public metadata `hash` using HKDF with the public metadata as
-// input and the rsa modulus as salt. The expected output hash size is passed as
-// out_len_bytes.
-//
-// Implementation follows the steps listed in
-// https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/
-//
-// This method internally calls HKDF with output size of more than
-// out_len_bytes and later truncates the output to out_len_bytes. This is done
-// so that the output is indifferentiable from truly random bytes.
-// https://cfrg.github.io/draft-irtf-cfrg-hash-to-curve/draft-irtf-cfrg-hash-to-curve.html#name-hashing-to-a-finite-field
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT
-PublicMetadataHashWithHKDF(absl::string_view public_metadata,
-                           absl::string_view rsa_modulus_str,
-                           size_t out_len_bytes);
-
-}  // namespace internal
-
-// Deletes a BN_CTX.
-class BnCtxDeleter {
- public:
-  void operator()(BN_CTX* ctx) { BN_CTX_free(ctx); }
-};
-typedef std::unique_ptr<BN_CTX, BnCtxDeleter> BnCtxPtr;
-
-// Deletes a BN_MONT_CTX.
-class BnMontCtxDeleter {
- public:
-  void operator()(BN_MONT_CTX* mont_ctx) { BN_MONT_CTX_free(mont_ctx); }
-};
-typedef std::unique_ptr<BN_MONT_CTX, BnMontCtxDeleter> BnMontCtxPtr;
-
-// Deletes an EVP_MD_CTX.
-class EvpMdCtxDeleter {
- public:
-  void operator()(EVP_MD_CTX* ctx) { EVP_MD_CTX_destroy(ctx); }
-};
-typedef std::unique_ptr<EVP_MD_CTX, EvpMdCtxDeleter> EvpMdCtxPtr;
-
-// Creates and starts a BIGNUM context.
-absl::StatusOr<BnCtxPtr> QUICHE_EXPORT GetAndStartBigNumCtx();
-
-// Creates a new BIGNUM.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT NewBigNum();
-
-// Converts a BIGNUM to string.
-absl::StatusOr<std::string> QUICHE_EXPORT BignumToString(
-    const BIGNUM& big_num, size_t output_len);
-
-// Converts a string to BIGNUM.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT StringToBignum(
-    absl::string_view input_str);
-
-// Retrieve error messages from OpenSSL.
-std::string QUICHE_EXPORT GetSslErrors();
-
-// Mask message using protocol at
-// https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-std::string QUICHE_EXPORT MaskMessageConcat(absl::string_view mask,
-                                                  absl::string_view message);
-
-// Encode Message and Public Metadata using steps in
-// https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/
-//
-// The length of public metadata must fit in 4 bytes.
-std::string QUICHE_EXPORT EncodeMessagePublicMetadata(
-    absl::string_view message, absl::string_view public_metadata);
-
-// Compute 2^(x - 1/2).
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT GetRsaSqrtTwo(
-    int x);
-
-// Compute compute 2^x.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT ComputePowerOfTwo(
-    int x);
-
-// ComputeHash sub-routine used during blindness and verification of RSA blind
-// signatures protocol with or without public metadata.
-absl::StatusOr<std::string> QUICHE_EXPORT ComputeHash(
-    absl::string_view input, const EVP_MD& hasher);
-
-// Computes the Carmichael LCM given phi(p) and phi(q) where N = p*q is a safe
-// RSA modulus.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT
-ComputeCarmichaelLcm(const BIGNUM& phi_p, const BIGNUM& phi_q, BN_CTX& bn_ctx);
-
-// Create bssl::UniquePtr<RSA> representing a RSA private key.
-//
-// Note that this method should not be used to create a key with public exponent
-// greater than 2^32.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-CreatePrivateKeyRSA(absl::string_view rsa_modulus,
-                    absl::string_view public_exponent,
-                    absl::string_view private_exponent, absl::string_view p,
-                    absl::string_view q, absl::string_view dp,
-                    absl::string_view dq, absl::string_view crt);
-
-// Create bssl::UniquePtr<RSA> representing a RSA public key.
-//
-// Note that this method should not be used to create a key with public exponent
-// greater than 2^32.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-CreatePublicKeyRSA(absl::string_view rsa_modulus,
-                   absl::string_view public_exponent);
-
-// Create bssl::UniquePtr<RSA> representing a RSA public key derived using
-// public metadata.
-//
-// If the boolean "use_rsa_public_exponent" is set to false, the public exponent
-// is not used in any computations.
-//
-// Setting "use_rsa_public_exponent" to true is deprecated.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-CreatePublicKeyRSAWithPublicMetadata(const BIGNUM& rsa_modulus,
-                                     const BIGNUM& public_exponent,
-                                     absl::string_view public_metadata,
-                                     bool use_rsa_public_exponent);
-
-// Create bssl::UniquePtr<RSA> representing a RSA public key derived using
-// public metadata.
-//
-// If the boolean "use_rsa_public_exponent" is set to false, the public exponent
-// is not used in any computations.
-//
-// Setting "use_rsa_public_exponent" to true is deprecated.
-absl::StatusOr<bssl::UniquePtr<RSA>> QUICHE_EXPORT
-CreatePublicKeyRSAWithPublicMetadata(absl::string_view rsa_modulus,
-                                     absl::string_view public_exponent,
-                                     absl::string_view public_metadata,
-                                     bool use_rsa_public_exponent);
-
-// Compute exponent using only the public metadata and RSA modulus n. Assumes
-// that n is a safe modulus i.e. it produces a strong RSA key pair. If not, the
-// exponent may be invalid.
-//
-// Empty public metadata is considered to be a valid value for public_metadata
-// and will output a valid exponent.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT
-ComputeExponentWithPublicMetadata(const BIGNUM& n,
-                                  absl::string_view public_metadata);
-
-// Computes exponent by multiplying the public exponent e with the
-// exponent derived from public metadata and RSA modulus n. Assumes that n is a
-// safe modulus i.e. it produces a strong RSA key pair. If not, the exponent may
-// be invalid.
-//
-// Empty public metadata is considered to be a valid value for public_metadata
-// and will output an exponent different than `e` as well.
-//
-// This function is now deprecated.
-absl::StatusOr<bssl::UniquePtr<BIGNUM>> QUICHE_EXPORT
-ComputeExponentWithPublicMetadataAndPublicExponent(
-    const BIGNUM& n, const BIGNUM& e, absl::string_view public_metadata);
-
-// Helper method that implements RSA PSS Blind Signatures verification protocol
-// for both the standard scheme as well as the public metadata version.
-//
-// For the public metadata version,
-//
-// 1) `rsa_public_key' must contain a public exponent derived using the public
-// metadata.
-//
-// 2) The `message' must be an encoding of an original input message
-// and the public metadata e.g. by using EncodeMessagePublicMetadata method in
-// this file. The caller should make sure that its original input message is a
-// random message. In case it is not, it should be concatenated with a random
-// string.
-absl::Status QUICHE_EXPORT RsaBlindSignatureVerify(
-    int salt_length, const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-    absl::string_view signature, absl::string_view message,
-    RSA* rsa_public_key);
-
-// This method outputs a DER encoding of RSASSA-PSS (RSA Signature Scheme with
-// Appendix - Probabilistic Signature Scheme) Public Key as described here
-// https://datatracker.ietf.org/doc/html/rfc3447.html using the object
-// identifier(s) here: https://oidref.com/1.2.840.113549.1.1.10  and using a
-// fixed salt length of 48 bytes, SHA384 as the signature's hash function as
-// well as the hash function that the signature's mask generating function is
-// based on. A publicly availble equivalent function is available in Goa here:
-// https://github.com/cloudflare/pat-go/blob/11579ba5b0b9b77d3e8e3d5247a98811227ac82e/x509util.go#L56
-//
-// copybara:strip_begin(internal comment)
-// This method serves as a C++ version for the following Goa method:
-// http://google3/privacy/net/boq/common/tokens/token_types.go;l=85;rcl=515461856
-// copybara:strip_end
-absl::StatusOr<std::string> QUICHE_EXPORT RsaSsaPssPublicKeyToDerEncoding(
-    const RSA* rsa);
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_CRYPTO_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc
deleted file mode 100644
index 71294fd..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h"
-
-#include <cstddef>
-#include <cstdint>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "absl/memory/memory.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-absl::StatusOr<bssl::UniquePtr<RSA>> CreatePrivateKeyWithPublicMetadata(
-    const absl::string_view rsa_modulus_str,
-    const absl::string_view rsa_public_exponent_str,
-    const absl::string_view rsa_p_str, const absl::string_view rsa_q_str,
-    const absl::string_view rsa_crt_str,
-    const absl::string_view public_metadata,
-    const bool use_rsa_public_exponent) {
-  // Convert RSA modulus n (=p*q) to BIGNUM.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_modulus,
-                               StringToBignum(rsa_modulus_str));
-  // Convert public exponent e to BIGNUM.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> old_e,
-                               StringToBignum(rsa_public_exponent_str));
-
-  // Compute new public exponent based on public metadata.
-  bssl::UniquePtr<BIGNUM> derived_rsa_e;
-  if (use_rsa_public_exponent) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        derived_rsa_e, ComputeExponentWithPublicMetadataAndPublicExponent(
-                           *rsa_modulus, *old_e, public_metadata));
-  } else {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        derived_rsa_e,
-        ComputeExponentWithPublicMetadata(*rsa_modulus, public_metadata));
-  }
-
-  // Convert p & q to BIGNUM.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_p,
-                               StringToBignum(rsa_p_str));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_q,
-                               StringToBignum(rsa_q_str));
-
-  // Compute phi(p) = p-1 and phi(q) = q-1.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_p, NewBigNum());
-  if (BN_sub(phi_p.get(), rsa_p.get(), BN_value_one()) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(p): ", GetSslErrors()));
-  }
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_q, NewBigNum());
-  if (BN_sub(phi_q.get(), rsa_q.get(), BN_value_one()) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(q): ", GetSslErrors()));
-  }
-
-  bssl::UniquePtr<BN_CTX> bn_ctx(BN_CTX_new());
-  if (!bn_ctx) {
-    return absl::InternalError("BN_CTX_new failed.");
-  }
-  // Compute lcm(phi(p), phi(q)).
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> lcm,
-                               ComputeCarmichaelLcm(*phi_p, *phi_q, *bn_ctx));
-
-  // Compute the new private exponent derived_rsa_d.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> derived_rsa_d,
-                               NewBigNum());
-  if (!BN_mod_inverse(derived_rsa_d.get(), derived_rsa_e.get(), lcm.get(),
-                      bn_ctx.get())) {
-    return absl::InternalError(
-        absl::StrCat("Could not compute private exponent d: ", GetSslErrors()));
-  }
-
-  // Compute new_dpm1 = derived_rsa_d mod p-1.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_dpm1, NewBigNum());
-  BN_mod(new_dpm1.get(), derived_rsa_d.get(), phi_p.get(), bn_ctx.get());
-  // Compute new_dqm1 = derived_rsa_d mod q-1.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_dqm1, NewBigNum());
-  BN_mod(new_dqm1.get(), derived_rsa_d.get(), phi_q.get(), bn_ctx.get());
-  // Convert crt to BIGNUM.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_crt,
-                               StringToBignum(rsa_crt_str));
-
-  // Create private key derived from given key and public metadata.
-  bssl::UniquePtr<RSA> derived_private_key(RSA_new_private_key_large_e(
-      rsa_modulus.get(), derived_rsa_e.get(), derived_rsa_d.get(), rsa_p.get(),
-      rsa_q.get(), new_dpm1.get(), new_dqm1.get(), rsa_crt.get()));
-  if (!derived_private_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new_private_key_large_e failed: ", GetSslErrors()));
-  }
-
-  return derived_private_key;
-}
-
-}  // namespace
-
-RsaBlindSigner::RsaBlindSigner(std::optional<absl::string_view> public_metadata,
-                               bssl::UniquePtr<RSA> rsa_private_key)
-    : public_metadata_(public_metadata),
-      rsa_private_key_(std::move(rsa_private_key)) {}
-
-absl::StatusOr<std::unique_ptr<RsaBlindSigner>> RsaBlindSigner::New(
-    const RSAPrivateKey& signing_key, const bool use_rsa_public_exponent,
-    std::optional<absl::string_view> public_metadata) {
-  bssl::UniquePtr<RSA> rsa_private_key;
-  if (!public_metadata.has_value()) {
-    // The RSA modulus and exponent are checked as part of the conversion to
-    // bssl::UniquePtr<RSA>.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        rsa_private_key, AnonymousTokensRSAPrivateKeyToRSA(signing_key));
-  } else {
-    // If public metadata is passed, RsaBlindSigner will compute a new private
-    // exponent using the public metadata.
-    //
-    // Empty string is a valid public metadata value.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        rsa_private_key,
-        CreatePrivateKeyWithPublicMetadata(
-            signing_key.n(), signing_key.e(), signing_key.p(), signing_key.q(),
-            signing_key.crt(), *public_metadata, use_rsa_public_exponent));
-  }
-  return absl::WrapUnique(
-      new RsaBlindSigner(public_metadata, std::move(rsa_private_key)));
-}
-
-absl::StatusOr<std::string> RsaBlindSigner::Sign(
-    const absl::string_view blinded_data) const {
-  if (blinded_data.empty() || blinded_data.data() == nullptr) {
-    return absl::InvalidArgumentError("blinded_data string is empty.");
-  }
-
-  int mod_size = RSA_size(rsa_private_key_.get());
-  if (blinded_data.size() != mod_size) {
-    return absl::InternalError(absl::StrCat(
-        "Expected blind data size = ", mod_size,
-        " actual blind data size = ", blinded_data.size(), " bytes."));
-  }
-
-  std::string signature(mod_size, 0);
-  // Compute a raw RSA signature.
-  size_t out_len;
-  if (RSA_sign_raw(
-          /*rsa=*/rsa_private_key_.get(), /*out_len=*/&out_len,
-          /*out=*/reinterpret_cast<uint8_t*>(&signature[0]),
-          /*max_out=*/mod_size,
-          /*in=*/reinterpret_cast<const uint8_t*>(&blinded_data[0]),
-          /*in_len=*/mod_size,
-          /*padding=*/RSA_NO_PADDING) != kBsslSuccess) {
-    return absl::InternalError(
-        "RSA_sign_raw failed when called from RsaBlindSigner::Sign");
-  }
-  if (out_len != mod_size || out_len != signature.size()) {
-    return absl::InternalError(absl::StrCat(
-        "Expected value of out_len and signature.size() = ", mod_size,
-        " bytes, actual value of out_len and signature.size() = ", out_len,
-        " and ", signature.size(), " bytes."));
-  }
-  return signature;
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h
deleted file mode 100644
index cc31ac5..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLIND_SIGNER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLIND_SIGNER_H_
-
-#include <memory>
-#include <string>
-
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blind_signer.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// The RSA SSA (Signature Schemes with Appendix) using PSS (Probabilistic
-// Signature Scheme) encoding is defined at
-// https://tools.ietf.org/html/rfc8017#section-8.1). This implementation uses
-// Boring SSL for the underlying cryptographic operations.
-class QUICHE_EXPORT RsaBlindSigner : public BlindSigner {
- public:
-  ~RsaBlindSigner() override = default;
-  RsaBlindSigner(const RsaBlindSigner&) = delete;
-  RsaBlindSigner& operator=(const RsaBlindSigner&) = delete;
-
-  // Passing of public_metadata is optional. If it is set to any value including
-  // an empty string, RsaBlindSigner will assume that partially blind RSA
-  // signature protocol is being executed.
-  //
-  // If public metadata is passed and the boolean "use_rsa_public_exponent" is
-  // set to false, the public exponent in the signing_key is not used in any
-  // computations in the protocol.
-  //
-  // Setting "use_rsa_public_exponent" to true is deprecated. All new users
-  // should set it to false.
-  static absl::StatusOr<std::unique_ptr<RsaBlindSigner>> New(
-      const RSAPrivateKey& signing_key, bool use_rsa_public_exponent,
-      std::optional<absl::string_view> public_metadata = std::nullopt);
-
-  // Computes the signature for 'blinded_data'.
-  absl::StatusOr<std::string> Sign(
-      absl::string_view blinded_data) const override;
-
- private:
-  // Use New to construct.
-  RsaBlindSigner(std::optional<absl::string_view> public_metadata,
-                 bssl::UniquePtr<RSA> rsa_private_key);
-
-  const std::optional<std::string> public_metadata_;
-
-  // In case public metadata is passed to RsaBlindSigner::New, rsa_private_key_
-  // will be initialized using RSA_new_private_key_large_e method.
-  const bssl::UniquePtr<RSA> rsa_private_key_;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLIND_SIGNER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc
deleted file mode 100644
index 4294467..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer.h"
-
-#include <memory>
-#include <random>
-#include <string>
-#include <utility>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/digest.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-using CreateTestKeyPairFunction =
-    absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>();
-
-class RsaBlindSignerTest
-    : public ::testing::TestWithParam<CreateTestKeyPairFunction *> {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto keys_pair, (*GetParam())());
-    public_key_ = std::move(keys_pair.first);
-    private_key_ = std::move(keys_pair.second);
-    generator_.seed(0);
-    // NOTE: using recommended RsaSsaPssParams
-    sig_hash_ = EVP_sha384();
-    mgf1_hash_ = EVP_sha384();
-    salt_length_ = kSaltLengthInBytes48;
-  }
-
-  RSAPrivateKey private_key_;
-  RSAPublicKey public_key_;
-  std::mt19937_64 generator_;
-  const EVP_MD *sig_hash_;   // Owned by BoringSSL.
-  const EVP_MD *mgf1_hash_;  // Owned by BoringSSL.
-  int salt_length_;
-  std::uniform_int_distribution<int> distr_u8_ =
-      std::uniform_int_distribution<int>{0, 255};
-};
-
-// This test only tests whether the implemented signer 'signs' properly. The
-// outline of method calls in this test should not be assumed a secure signature
-// scheme (and used in other places) as the security has not been
-// proven/analyzed.
-//
-// Test for the standard signer does not take public metadata as a parameter
-// which means public metadata is set to std::nullopt.
-TEST_P(RsaBlindSignerTest, StandardSignerWorks) {
-  absl::string_view message = "Hello World!";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(message, public_key_, sig_hash_, mgf1_hash_,
-                            salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string potentially_insecure_signature,
-                                   signer->Sign(encoded_message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             /*use_rsa_public_exponent=*/true));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-TEST_P(RsaBlindSignerTest, SignerFails) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, /*use_rsa_public_exponent=*/true));
-  absl::string_view message = "Hello World!";
-
-  absl::StatusOr<std::string> signature = signer->Sign(message);
-  EXPECT_EQ(signature.status().code(), absl::StatusCode::kInternal);
-  EXPECT_THAT(signature.status().message(),
-              ::testing::HasSubstr("Expected blind data size"));
-
-  int sig_size = public_key_.n().size();
-  std::string message2 = RandomString(sig_size, &distr_u8_, &generator_);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string insecure_sig,
-                                   signer->Sign(message2));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             /*use_rsa_public_exponent=*/true));
-  absl::Status verification_result = verifier->Verify(insecure_sig, message2);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-INSTANTIATE_TEST_SUITE_P(RsaBlindSignerTest, RsaBlindSignerTest,
-                         ::testing::Values(&GetStrongRsaKeys2048,
-                                           &GetAnotherStrongRsaKeys2048,
-                                           &GetStrongRsaKeys3072,
-                                           &GetStrongRsaKeys4096));
-
-using RsaBlindSignerPublicMetadataTestParams =
-    std::tuple<absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>,
-               /*use_rsa_public_exponent*/ bool>;
-
-class RsaBlindSignerTestWithPublicMetadata
-    : public ::testing::TestWithParam<RsaBlindSignerPublicMetadataTestParams> {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto keys_pair, std::get<0>(GetParam()));
-    use_rsa_public_exponent_ = std::get<1>(GetParam());
-    public_key_ = std::move(keys_pair.first);
-    private_key_ = std::move(keys_pair.second);
-    // NOTE: using recommended RsaSsaPssParams
-    sig_hash_ = EVP_sha384();
-    mgf1_hash_ = EVP_sha384();
-    salt_length_ = kSaltLengthInBytes48;
-  }
-
-  RSAPrivateKey private_key_;
-  RSAPublicKey public_key_;
-  const EVP_MD *sig_hash_;   // Owned by BoringSSL.
-  const EVP_MD *mgf1_hash_;  // Owned by BoringSSL.
-  int salt_length_;
-  bool use_rsa_public_exponent_;
-};
-
-// This test only tests whether the implemented signer 'signs' properly under
-// some public metadata. The outline of method calls in this test should not
-// be assumed a secure signature scheme (and used in other places) as the
-// security has not been proven/analyzed.
-TEST_P(RsaBlindSignerTestWithPublicMetadata, SignerWorksWithPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, use_rsa_public_exponent_,
-                          public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string potentially_insecure_signature,
-                                   signer->Sign(encoded_message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-TEST_P(RsaBlindSignerTestWithPublicMetadata,
-       SignerWorksWithEmptyPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view empty_public_metadata = "";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, empty_public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, use_rsa_public_exponent_,
-                          empty_public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string potentially_insecure_signature,
-                                   signer->Sign(encoded_message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, empty_public_metadata));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-TEST_P(RsaBlindSignerTestWithPublicMetadata,
-       SignatureFailstoVerifyWithWrongPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  absl::string_view public_metadata_2 = "pubmd2";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, use_rsa_public_exponent_,
-                          public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string potentially_insecure_signature,
-                                   signer->Sign(encoded_message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata_2));
-  absl::Status verification_result =
-      verifier->Verify(potentially_insecure_signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaBlindSignerTestWithPublicMetadata,
-       SignatureFailsToVerifyWithNoPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  absl::string_view public_metadata_2 = "";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlindSigner> signer,
-      RsaBlindSigner::New(private_key_, use_rsa_public_exponent_,
-                          public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string potentially_insecure_signature,
-                                   signer->Sign(encoded_message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata_2));
-  absl::Status verification_result =
-      verifier->Verify(potentially_insecure_signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    RsaBlindSignerTestWithPublicMetadata, RsaBlindSignerTestWithPublicMetadata,
-    ::testing::Combine(
-        ::testing::Values(GetStrongRsaKeys2048(), GetAnotherStrongRsaKeys2048(),
-                          GetStrongRsaKeys3072(), GetStrongRsaKeys4096()),
-        /*use_rsa_public_exponent*/ ::testing::Values(true, false)));
-
-// TODO(b/275956922): Consolidate all tests that use IETF test vectors into one
-// E2E test.
-//
-// The following tests use IETF test vectors for RSA blind signatures with
-// public metadata. The vectors includes tests for public metadata set to an
-// empty string as well as a non-empty value.
-TEST(IetfRsaBlindSignerTest,
-     IetfRsaBlindSignaturesWithPublicMetadataTestVectorsSuccess) {
-  auto test_vectors = GetIetfRsaBlindSignatureWithPublicMetadataTestVectors();
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto test_key,
-      GetIetfRsaBlindSignatureWithPublicMetadataTestKeys());
-  for (const auto &test_vector : test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        std::unique_ptr<RsaBlindSigner> signer,
-        RsaBlindSigner::New(test_key.second, /*use_rsa_public_exponent=*/true,
-                            test_vector.public_metadata));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blind_signature,
-                                     signer->Sign(test_vector.blinded_message));
-    EXPECT_EQ(blind_signature, test_vector.blinded_signature);
-  }
-}
-
-TEST(IetfRsaBlindSignerTest,
-     IetfPartiallyBlindRsaSignaturesNoPublicExponentTestVectorsSuccess) {
-  auto test_vectors =
-      GetIetfPartiallyBlindRSASignatureNoPublicExponentTestVectors();
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto test_key,
-      GetIetfRsaBlindSignatureWithPublicMetadataTestKeys());
-  for (const auto &test_vector : test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        std::unique_ptr<RsaBlindSigner> signer,
-        RsaBlindSigner::New(test_key.second, /*use_rsa_public_exponent=*/false,
-                            test_vector.public_metadata));
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blind_signature,
-                                     signer->Sign(test_vector.blinded_message));
-    EXPECT_EQ(blind_signature, test_vector.blinded_signature);
-  }
-}
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc
deleted file mode 100644
index 752bcb9..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "openssl/digest.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-absl::StatusOr<std::unique_ptr<RsaBlinder>> RsaBlinder::New(
-    absl::string_view rsa_modulus, absl::string_view rsa_public_exponent,
-    const EVP_MD* signature_hash_function, const EVP_MD* mgf1_hash_function,
-    int salt_length, const bool use_rsa_public_exponent,
-    std::optional<absl::string_view> public_metadata) {
-  bssl::UniquePtr<RSA> rsa_public_key;
-
-  if (!public_metadata.has_value()) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        rsa_public_key, CreatePublicKeyRSA(rsa_modulus, rsa_public_exponent));
-  } else {
-    // If public metadata is passed, RsaBlinder will compute a new public
-    // exponent using the public metadata.
-    //
-    // Empty string is a valid public metadata value.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        rsa_public_key, CreatePublicKeyRSAWithPublicMetadata(
-                            rsa_modulus, rsa_public_exponent, *public_metadata,
-                            use_rsa_public_exponent));
-  }
-
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> r, NewBigNum());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> r_inv_mont, NewBigNum());
-
-  // Limit r between [2, n) so that an r of 1 never happens. An r of 1 doesn't
-  // blind.
-  if (BN_rand_range_ex(r.get(), 2, RSA_get0_n(rsa_public_key.get())) !=
-      kBsslSuccess) {
-    return absl::InternalError(
-        "BN_rand_range_ex failed when called from RsaBlinder::New.");
-  }
-
-  bssl::UniquePtr<BN_CTX> bn_ctx(BN_CTX_new());
-  if (!bn_ctx) {
-    return absl::InternalError("BN_CTX_new failed.");
-  }
-
-  bssl::UniquePtr<BN_MONT_CTX> bn_mont_ctx(BN_MONT_CTX_new_for_modulus(
-      RSA_get0_n(rsa_public_key.get()), bn_ctx.get()));
-  if (!bn_mont_ctx) {
-    return absl::InternalError("BN_MONT_CTX_new_for_modulus failed.");
-  }
-
-  // We wish to compute r^-1 in the Montgomery domain, or r^-1 R mod n. This is
-  // can be done with BN_mod_inverse_blinded followed by BN_to_montgomery, but
-  // it is equivalent and slightly more efficient to first compute r R^-1 mod n
-  // with BN_from_montgomery, and then inverting that to give r^-1 R mod n.
-  int is_r_not_invertible = 0;
-  if (BN_from_montgomery(r_inv_mont.get(), r.get(), bn_mont_ctx.get(),
-                         bn_ctx.get()) != kBsslSuccess ||
-      BN_mod_inverse_blinded(r_inv_mont.get(), &is_r_not_invertible,
-                             r_inv_mont.get(), bn_mont_ctx.get(),
-                             bn_ctx.get()) != kBsslSuccess) {
-    return absl::InternalError(
-        absl::StrCat("BN_mod_inverse failed when called from RsaBlinder::New, "
-                     "is_r_not_invertible = ",
-                     is_r_not_invertible));
-  }
-
-  return absl::WrapUnique(new RsaBlinder(
-      salt_length, public_metadata, signature_hash_function, mgf1_hash_function,
-      std::move(rsa_public_key), std::move(r), std::move(r_inv_mont),
-      std::move(bn_mont_ctx)));
-}
-
-RsaBlinder::RsaBlinder(int salt_length,
-                       std::optional<absl::string_view> public_metadata,
-                       const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-                       bssl::UniquePtr<RSA> rsa_public_key,
-                       bssl::UniquePtr<BIGNUM> r,
-                       bssl::UniquePtr<BIGNUM> r_inv_mont,
-                       bssl::UniquePtr<BN_MONT_CTX> mont_n)
-    : salt_length_(salt_length),
-      public_metadata_(public_metadata),
-      sig_hash_(sig_hash),
-      mgf1_hash_(mgf1_hash),
-      rsa_public_key_(std::move(rsa_public_key)),
-      r_(std::move(r)),
-      r_inv_mont_(std::move(r_inv_mont)),
-      mont_n_(std::move(mont_n)),
-      blinder_state_(RsaBlinder::BlinderState::kCreated) {}
-
-absl::StatusOr<std::string> RsaBlinder::Blind(const absl::string_view message) {
-  // Check that the blinder state was kCreated
-  if (blinder_state_ != RsaBlinder::BlinderState::kCreated) {
-    return absl::FailedPreconditionError(
-        "RsaBlinder is in wrong state to blind message.");
-  }
-  std::string augmented_message(message);
-  if (public_metadata_.has_value()) {
-    augmented_message = EncodeMessagePublicMetadata(message, *public_metadata_);
-  }
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string digest_str,
-                               ComputeHash(augmented_message, *sig_hash_));
-  std::vector<uint8_t> digest(digest_str.begin(), digest_str.end());
-
-  // Construct the PSS padded message, using the same workflow as BoringSSL's
-  // RSA_sign_pss_mgf1 for processing the message (but not signing the message):
-  // google3/third_party/openssl/boringssl/src/crypto/fipsmodule/rsa/rsa.c?l=557
-  if (digest.size() != EVP_MD_size(sig_hash_)) {
-    return absl::InternalError("Invalid input message length.");
-  }
-
-  // Allocate for padded length
-  const int padded_len = BN_num_bytes(RSA_get0_n(rsa_public_key_.get()));
-  std::vector<uint8_t> padded(padded_len);
-
-  // The |md| and |mgf1_md| arguments identify the hash used to calculate
-  // |digest| and the MGF1 hash, respectively. If |mgf1_md| is NULL, |md| is
-  // used. |salt_len| specifies the expected salt length in bytes. If |salt_len|
-  // is -1, then the salt length is the same as the hash length. If -2, then the
-  // salt length is maximal given the size of |rsa|. If unsure, use -1.
-  if (RSA_padding_add_PKCS1_PSS_mgf1(
-          /*rsa=*/rsa_public_key_.get(), /*EM=*/padded.data(),
-          /*mHash=*/digest.data(), /*Hash=*/sig_hash_, /*mgf1Hash=*/mgf1_hash_,
-          /*sLen=*/salt_length_) != kBsslSuccess) {
-    return absl::InternalError(
-        "RSA_padding_add_PKCS1_PSS_mgf1 failed when called from "
-        "RsaBlinder::Blind");
-  }
-
-  bssl::UniquePtr<BN_CTX> bn_ctx(BN_CTX_new());
-  if (!bn_ctx) {
-    return absl::InternalError("BN_CTX_new failed.");
-  }
-
-  std::string encoded_message(padded.begin(), padded.end());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> encoded_message_bn,
-                               StringToBignum(encoded_message));
-
-  // Take `r^e mod n`. This is an equivalent operation to RSA_encrypt, without
-  // extra encode/decode trips.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rE, NewBigNum());
-  if (BN_mod_exp_mont(rE.get(), r_.get(), RSA_get0_e(rsa_public_key_.get()),
-                      RSA_get0_n(rsa_public_key_.get()), bn_ctx.get(),
-                      mont_n_.get()) != kBsslSuccess) {
-    return absl::InternalError(
-        "BN_mod_exp_mont failed when called from RsaBlinder::Blind.");
-  }
-
-  // Do `encoded_message*r^e mod n`.
-  //
-  // To avoid leaking side channels, we use Montgomery reduction. This would be
-  // FromMontgomery(ModMulMontgomery(ToMontgomery(m), ToMontgomery(r^e))).
-  // However, this is equivalent to ModMulMontgomery(m, ToMontgomery(r^e)).
-  // Each BN_mod_mul_montgomery removes a factor of R, so by having only one
-  // input in the Montgomery domain, we save a To/FromMontgomery pair.
-  //
-  // Internally, BN_mod_exp_mont actually computes r^e in the Montgomery domain
-  // and converts it out, but there is no public API for this, so we perform an
-  // extra conversion.
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> multiplication_res,
-                               NewBigNum());
-  if (BN_to_montgomery(multiplication_res.get(), rE.get(), mont_n_.get(),
-                       bn_ctx.get()) != kBsslSuccess ||
-      BN_mod_mul_montgomery(multiplication_res.get(), encoded_message_bn.get(),
-                            multiplication_res.get(), mont_n_.get(),
-                            bn_ctx.get()) != kBsslSuccess) {
-    return absl::InternalError(
-        "BN_mod_mul failed when called from RsaBlinder::Blind.");
-  }
-
-  absl::StatusOr<std::string> blinded_msg =
-      BignumToString(*multiplication_res, padded_len);
-
-  // Update RsaBlinder state to kBlinded
-  blinder_state_ = RsaBlinder::BlinderState::kBlinded;
-
-  return blinded_msg;
-}
-
-// Unblinds `blind_signature`.
-absl::StatusOr<std::string> RsaBlinder::Unblind(
-    const absl::string_view blind_signature) {
-  if (blinder_state_ != RsaBlinder::BlinderState::kBlinded) {
-    return absl::FailedPreconditionError(
-        "RsaBlinder is in wrong state to unblind signature.");
-  }
-  const int mod_size = BN_num_bytes(RSA_get0_n(rsa_public_key_.get()));
-  // Parse the signed_blinded_data as BIGNUM.
-  if (blind_signature.size() != mod_size) {
-    return absl::InternalError(absl::StrCat(
-        "Expected blind signature size = ", mod_size,
-        " actual blind signature size = ", blind_signature.size(), " bytes."));
-  }
-
-  bssl::UniquePtr<BN_CTX> bn_ctx(BN_CTX_new());
-  if (!bn_ctx) {
-    return absl::InternalError("BN_CTX_new failed.");
-  }
-
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> signed_big_num,
-                               StringToBignum(blind_signature));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> unblinded_sig_big,
-                               NewBigNum());
-  // Do `signed_message*r^-1 mod n`.
-  //
-  // To avoid leaking side channels, we use Montgomery reduction. This would be
-  // FromMontgomery(ModMulMontgomery(ToMontgomery(m), ToMontgomery(r^-1))).
-  // However, this is equivalent to ModMulMontgomery(m, ToMontgomery(r^-1)).
-  // Each BN_mod_mul_montgomery removes a factor of R, so by having only one
-  // input in the Montgomery domain, we save a To/FromMontgomery pair.
-  if (BN_mod_mul_montgomery(unblinded_sig_big.get(), signed_big_num.get(),
-                            r_inv_mont_.get(), mont_n_.get(),
-                            bn_ctx.get()) != kBsslSuccess) {
-    return absl::InternalError(
-        "BN_mod_mul failed when called from RsaBlinder::Unblind.");
-  }
-  absl::StatusOr<std::string> unblinded_signed_message =
-      BignumToString(*unblinded_sig_big, /*output_len=*/mod_size);
-  blinder_state_ = RsaBlinder::BlinderState::kUnblinded;
-  return unblinded_signed_message;
-}
-
-absl::Status RsaBlinder::Verify(absl::string_view signature,
-                                absl::string_view message) {
-  std::string augmented_message(message);
-  if (public_metadata_.has_value()) {
-    augmented_message = EncodeMessagePublicMetadata(message, *public_metadata_);
-  }
-  return RsaBlindSignatureVerify(salt_length_, sig_hash_, mgf1_hash_, signature,
-                                 augmented_message, rsa_public_key_.get());
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h
deleted file mode 100644
index a71f0b2..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLINDER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLINDER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <optional>
-#include <string>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/blinder.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// RsaBlinder `blinds` input messages, and then unblinds them after they are
-// signed.
-class QUICHE_EXPORT RsaBlinder : public Blinder {
- public:
-  // Passing of public_metadata is optional. If it is set to any value including
-  // an empty string, RsaBlinder will assume that partially blind RSA signature
-  // protocol is being executed.
-  //
-  // If public metadata is passed and the boolean "use_rsa_public_exponent" is
-  // set to false, the rsa_public_exponent is not used in any computations in
-  // the protocol.
-  //
-  // Setting "use_rsa_public_exponent" to true is deprecated. All new users
-  // should set it to false.
-  static absl::StatusOr<std::unique_ptr<RsaBlinder>> New(
-      absl::string_view rsa_modulus, absl::string_view rsa_public_exponent,
-      const EVP_MD* signature_hash_function, const EVP_MD* mgf1_hash_function,
-      int salt_length, bool use_rsa_public_exponent,
-      std::optional<absl::string_view> public_metadata = std::nullopt);
-
-  // Blind `message` using n and e derived from an RSA public key and the public
-  // metadata if applicable.
-  //
-  // Before blinding, the `message` will first be hashed and then encoded with
-  // the EMSA-PSS operation.
-  absl::StatusOr<std::string> Blind(absl::string_view message) override;
-
-  // Unblinds `blind_signature`.
-  //
-  // Callers should run Verify on the returned signature before using it /
-  // passing it on.
-  absl::StatusOr<std::string> Unblind(
-      absl::string_view blind_signature) override;
-
-  // Verifies an `unblinded` signature against the same `message' that was
-  // passed to Blind.
-  absl::Status Verify(absl::string_view signature, absl::string_view message);
-
- private:
-  // Use `New` to construct
-  RsaBlinder(int salt_length, std::optional<absl::string_view> public_metadata,
-             const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-             bssl::UniquePtr<RSA> rsa_public_key, bssl::UniquePtr<BIGNUM> r,
-             bssl::UniquePtr<BIGNUM> r_inv_mont,
-             bssl::UniquePtr<BN_MONT_CTX> mont_n);
-
-  const int salt_length_;
-  std::optional<std::string> public_metadata_;
-  const EVP_MD* sig_hash_;   // Owned by BoringSSL.
-  const EVP_MD* mgf1_hash_;  // Owned by BoringSSL.
-
-  // If public metadata was passed to RsaBlinder::New, rsa_public_key_ will
-  // will be initialized using RSA_new_public_key_large_e method.
-  const bssl::UniquePtr<RSA> rsa_public_key_;
-
-  const bssl::UniquePtr<BIGNUM> r_;
-  // r^-1 mod n in the Montgomery domain
-  const bssl::UniquePtr<BIGNUM> r_inv_mont_;
-  const bssl::UniquePtr<BN_MONT_CTX> mont_n_;
-
-  BlinderState blinder_state_;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_BLINDER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc
deleted file mode 100644
index 5723caf..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder.h"
-
-#include <memory>
-#include <string>
-#include <tuple>
-#include <utility>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "openssl/base.h"
-#include "openssl/digest.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-// TODO(b/275965524): Figure out a way to test RsaBlinder class with IETF test
-// vectors in rsa_blinder_test.cc.
-
-struct RsaBlinderTestParameters {
-  TestRsaPublicKey public_key;
-  TestRsaPrivateKey private_key;
-  const EVP_MD* sig_hash;
-  const EVP_MD* mgf1_hash;
-  int salt_length;
-};
-
-RsaBlinderTestParameters CreateDefaultTestKeyParameters() {
-  const auto [public_key, private_key] = GetStrongTestRsaKeyPair4096();
-  return {public_key, private_key, EVP_sha384(), EVP_sha384(),
-          kSaltLengthInBytes48};
-}
-
-RsaBlinderTestParameters CreateShorterTestKeyParameters() {
-  const auto [public_key, private_key] = GetStrongTestRsaKeyPair3072();
-  return {public_key, private_key, EVP_sha384(), EVP_sha384(),
-          kSaltLengthInBytes48};
-}
-
-RsaBlinderTestParameters CreateShortestTestKeyParameters() {
-  const auto [public_key, private_key] = GetStrongTestRsaKeyPair2048();
-  return {public_key, private_key, EVP_sha384(), EVP_sha384(),
-          kSaltLengthInBytes48};
-}
-
-RsaBlinderTestParameters CreateSHA256TestKeyParameters() {
-  const auto [public_key, private_key] = GetStrongTestRsaKeyPair4096();
-  return {public_key, private_key, EVP_sha256(), EVP_sha256(), 32};
-}
-
-RsaBlinderTestParameters CreateLongerSaltTestKeyParameters() {
-  const auto [public_key, private_key] = GetStrongTestRsaKeyPair4096();
-  return {public_key, private_key, EVP_sha384(), EVP_sha384(), 64};
-}
-
-class RsaBlinderTest : public testing::TestWithParam<RsaBlinderTestParameters> {
- protected:
-  void SetUp() override {
-    rsa_blinder_test_params_ = GetParam();
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        rsa_key_,
-        CreatePrivateKeyRSA(rsa_blinder_test_params_.private_key.n,
-                            rsa_blinder_test_params_.private_key.e,
-                            rsa_blinder_test_params_.private_key.d,
-                            rsa_blinder_test_params_.private_key.p,
-                            rsa_blinder_test_params_.private_key.q,
-                            rsa_blinder_test_params_.private_key.dp,
-                            rsa_blinder_test_params_.private_key.dq,
-                            rsa_blinder_test_params_.private_key.crt));
-  }
-
-  RsaBlinderTestParameters rsa_blinder_test_params_;
-  bssl::UniquePtr<RSA> rsa_key_;
-};
-
-TEST_P(RsaBlinderTest, BlindSignUnblindEnd2EndTest) {
-  const absl::string_view message = "Hello World!";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_signature,
-                                   TestSign(blinded_message, rsa_key_.get()));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-
-  EXPECT_TRUE(blinder->Verify(signature, message).ok());
-}
-
-TEST_P(RsaBlinderTest, DoubleBlindingFailure) {
-  const absl::string_view message = "Hello World2!";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_message,
-                                   blinder->Blind(message));
-  // Blind the blinded_message
-  absl::StatusOr<std::string> result = blinder->Blind(blinded_message);
-  EXPECT_EQ(result.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(result.status().message(), testing::HasSubstr("wrong state"));
-  // Blind a new message
-  const absl::string_view new_message = "Hello World3!";
-  result = blinder->Blind(new_message);
-  EXPECT_EQ(result.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(result.status().message(), testing::HasSubstr("wrong state"));
-}
-
-TEST_P(RsaBlinderTest, DoubleUnblindingFailure) {
-  const absl::string_view message = "Hello World2!";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_message,
-                                   blinder->Blind(message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_signature,
-                                   TestSign(blinded_message, rsa_key_.get()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  // Unblind the unblinded signature
-  absl::StatusOr<std::string> result = blinder->Unblind(signature);
-  EXPECT_EQ(result.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(result.status().message(), testing::HasSubstr("wrong state"));
-  // Unblind the blinded_signature again
-  result = blinder->Unblind(signature);
-  EXPECT_EQ(result.status().code(), absl::StatusCode::kFailedPrecondition);
-  EXPECT_THAT(result.status().message(), testing::HasSubstr("wrong state"));
-}
-
-TEST_P(RsaBlinderTest, InvalidSignature) {
-  const absl::string_view message = "Hello World2!";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_message,
-                                   blinder->Blind(message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_signature,
-                                   TestSign(blinded_message, rsa_key_.get()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_TRUE(blinder->Verify(signature, message).ok());
-
-  // Invalidate the signature by replacing the last 10 characters by 10 '0's
-  for (int i = 0; i < 10; i++) {
-    signature.pop_back();
-  }
-  for (int i = 0; i < 10; i++) {
-    signature.push_back('0');
-  }
-
-  absl::Status result = blinder->Verify(signature, message);
-  EXPECT_EQ(result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(result.message(), testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaBlinderTest, InvalidVerificationKey) {
-  const absl::string_view message = "Hello World4!";
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_message,
-                                   blinder->Blind(message));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const std::string blinded_signature,
-                                   TestSign(blinded_message, rsa_key_.get()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-
-  const auto [bad_key, _] = GetAnotherStrongTestRsaKeyPair2048();
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> bad_blinder,
-      RsaBlinder::New(bad_key.n, bad_key.e, rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      /*use_rsa_public_exponent=*/true));
-  EXPECT_THAT(bad_blinder->Verify(signature, message).code(),
-              absl::StatusCode::kInvalidArgument);
-}
-
-INSTANTIATE_TEST_SUITE_P(RsaBlinderTest, RsaBlinderTest,
-                         testing::Values(CreateDefaultTestKeyParameters(),
-                                         CreateShorterTestKeyParameters(),
-                                         CreateShortestTestKeyParameters(),
-                                         CreateSHA256TestKeyParameters(),
-                                         CreateLongerSaltTestKeyParameters()));
-
-using RsaBlinderPublicMetadataTestParams =
-    std::tuple<std::pair<TestRsaPublicKey, TestRsaPrivateKey>,
-               /*use_rsa_public_exponent*/ bool>;
-
-class RsaBlinderWithPublicMetadataTest
-    : public testing::TestWithParam<RsaBlinderPublicMetadataTestParams> {
- protected:
-  void SetUp() override {
-    std::pair<TestRsaPublicKey, TestRsaPrivateKey> key_pair;
-    std::tie(key_pair, use_rsa_public_exponent_) = GetParam();
-    const auto [public_key, private_key] = key_pair;
-    rsa_blinder_test_params_ = {public_key, private_key, EVP_sha384(),
-                                EVP_sha384(), kSaltLengthInBytes48};
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        rsa_key_,
-        CreatePrivateKeyRSA(rsa_blinder_test_params_.private_key.n,
-                            rsa_blinder_test_params_.private_key.e,
-                            rsa_blinder_test_params_.private_key.d,
-                            rsa_blinder_test_params_.private_key.p,
-                            rsa_blinder_test_params_.private_key.q,
-                            rsa_blinder_test_params_.private_key.dp,
-                            rsa_blinder_test_params_.private_key.dq,
-                            rsa_blinder_test_params_.private_key.crt));
-  }
-
-  RsaBlinderTestParameters rsa_blinder_test_params_;
-  bssl::UniquePtr<RSA> rsa_key_;
-  bool use_rsa_public_exponent_;
-};
-
-TEST_P(RsaBlinderWithPublicMetadataTest,
-       BlindSignUnblindWithPublicMetadataEnd2EndTest) {
-  const absl::string_view message = "Hello World!";
-  const absl::string_view public_metadata = "pubmd!";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      use_rsa_public_exponent_, public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string blinded_signature,
-      TestSignWithPublicMetadata(blinded_message, public_metadata, *rsa_key_,
-                                 use_rsa_public_exponent_));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-
-  EXPECT_TRUE(blinder->Verify(signature, message).ok());
-}
-
-TEST_P(RsaBlinderWithPublicMetadataTest,
-       BlindSignUnblindWithEmptyPublicMetadataEnd2EndTest) {
-  const absl::string_view message = "Hello World!";
-  const absl::string_view empty_public_metadata = "";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      use_rsa_public_exponent_, empty_public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string blinded_signature,
-      TestSignWithPublicMetadata(blinded_message, empty_public_metadata,
-                                 *rsa_key_, use_rsa_public_exponent_));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-
-  EXPECT_TRUE(blinder->Verify(signature, message).ok());
-}
-
-TEST_P(RsaBlinderWithPublicMetadataTest, WrongPublicMetadata) {
-  const absl::string_view message = "Hello World!";
-  const absl::string_view public_metadata = "pubmd!";
-  const absl::string_view public_metadata_2 = "pubmd2";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      use_rsa_public_exponent_, public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string blinded_signature,
-      TestSignWithPublicMetadata(blinded_message, public_metadata_2, *rsa_key_,
-                                 use_rsa_public_exponent_));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-  absl::Status verification_result = blinder->Verify(signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaBlinderWithPublicMetadataTest, NoPublicMetadataForSigning) {
-  const absl::string_view message = "Hello World!";
-  const absl::string_view public_metadata = "pubmd!";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(rsa_blinder_test_params_.public_key.n,
-                      rsa_blinder_test_params_.public_key.e,
-                      rsa_blinder_test_params_.sig_hash,
-                      rsa_blinder_test_params_.mgf1_hash,
-                      rsa_blinder_test_params_.salt_length,
-                      use_rsa_public_exponent_, public_metadata));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_signature,
-                                   TestSign(blinded_message, rsa_key_.get()));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-  absl::Status verification_result = blinder->Verify(signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaBlinderWithPublicMetadataTest, NoPublicMetadataInBlinding) {
-  const absl::string_view message = "Hello World!";
-  const absl::string_view public_metadata = "pubmd!";
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::unique_ptr<RsaBlinder> blinder,
-      RsaBlinder::New(
-          rsa_blinder_test_params_.public_key.n,
-          rsa_blinder_test_params_.public_key.e,
-          rsa_blinder_test_params_.sig_hash, rsa_blinder_test_params_.mgf1_hash,
-          rsa_blinder_test_params_.salt_length, use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string blinded_message,
-                                   blinder->Blind(message));
-  EXPECT_NE(blinded_message, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string blinded_signature,
-      TestSignWithPublicMetadata(blinded_message, public_metadata, *rsa_key_,
-                                 use_rsa_public_exponent_));
-  EXPECT_NE(blinded_signature, blinded_message);
-  EXPECT_NE(blinded_signature, message);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(std::string signature,
-                                   blinder->Unblind(blinded_signature));
-  EXPECT_NE(signature, blinded_signature);
-  EXPECT_NE(signature, blinded_message);
-  EXPECT_NE(signature, message);
-  absl::Status verification_result = blinder->Verify(signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              ::testing::HasSubstr("verification failed"));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    RsaBlinderWithPublicMetadataTest, RsaBlinderWithPublicMetadataTest,
-    testing::Combine(testing::Values(GetStrongTestRsaKeyPair2048(),
-                                     GetAnotherStrongTestRsaKeyPair2048(),
-                                     GetStrongTestRsaKeyPair3072(),
-                                     GetStrongTestRsaKeyPair4096()),
-                     /*use_rsa_public_exponent*/ testing::Values(true, false)));
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc
deleted file mode 100644
index 5a890cc..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "absl/memory/memory.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/bn.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-absl::StatusOr<std::unique_ptr<RsaSsaPssVerifier>> RsaSsaPssVerifier::New(
-    const int salt_length, const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-    const RSAPublicKey& public_key, const bool use_rsa_public_exponent,
-    std::optional<absl::string_view> public_metadata) {
-  bssl::UniquePtr<RSA> rsa_public_key;
-
-  if (!public_metadata.has_value()) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(rsa_public_key,
-                                 AnonymousTokensRSAPublicKeyToRSA(public_key));
-  } else {
-    // If public metadata is passed, RsaSsaPssVerifier will compute a new public
-    // exponent using the public metadata.
-    //
-    // Empty string is a valid public metadata value.
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        rsa_public_key, CreatePublicKeyRSAWithPublicMetadata(
-                            public_key.n(), public_key.e(), *public_metadata,
-                            use_rsa_public_exponent));
-  }
-
-  return absl::WrapUnique(new RsaSsaPssVerifier(salt_length, public_metadata,
-                                                sig_hash, mgf1_hash,
-                                                std::move(rsa_public_key)));
-}
-
-RsaSsaPssVerifier::RsaSsaPssVerifier(
-    int salt_length, std::optional<absl::string_view> public_metadata,
-    const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-    bssl::UniquePtr<RSA> rsa_public_key)
-    : salt_length_(salt_length),
-      public_metadata_(public_metadata),
-      sig_hash_(sig_hash),
-      mgf1_hash_(mgf1_hash),
-      rsa_public_key_(std::move(rsa_public_key)) {}
-
-absl::Status RsaSsaPssVerifier::Verify(absl::string_view unblind_token,
-                                       absl::string_view message) {
-  std::string augmented_message(message);
-  if (public_metadata_.has_value()) {
-    augmented_message = EncodeMessagePublicMetadata(message, *public_metadata_);
-  }
-  return RsaBlindSignatureVerify(salt_length_, sig_hash_, mgf1_hash_,
-                                 unblind_token, augmented_message,
-                                 rsa_public_key_.get());
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h
deleted file mode 100644
index 9026ba0..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_SSA_PSS_VERIFIER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_SSA_PSS_VERIFIER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <optional>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// RsaSsaPssVerifier is able to verify an unblinded token (signature) against an
-// inputted message using a public key and other input parameters.
-class QUICHE_EXPORT RsaSsaPssVerifier : public Verifier {
- public:
-  // Passing of public_metadata is optional. If it is set to any value including
-  // an empty string, RsaSsaPssVerifier will assume that partially blind RSA
-  // signature protocol is being executed.
-  //
-  // If public metadata is passed and the boolean "use_rsa_public_exponent" is
-  // set to false, the public exponent in the public_key is not used in any
-  // computations in the protocol.
-  //
-  // Setting "use_rsa_public_exponent" to true is deprecated. All new users
-  // should set it to false.
-  static absl::StatusOr<std::unique_ptr<RsaSsaPssVerifier>> New(
-      int salt_length, const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-      const RSAPublicKey& public_key, bool use_rsa_public_exponent,
-      std::optional<absl::string_view> public_metadata = std::nullopt);
-
-  // Verifies the signature.
-  //
-  // Returns OkStatus() on successful verification. Otherwise returns an error.
-  absl::Status Verify(absl::string_view unblind_token,
-                      absl::string_view message) override;
-
- private:
-  // Use `New` to construct
-  RsaSsaPssVerifier(int salt_length,
-                    std::optional<absl::string_view> public_metadata,
-                    const EVP_MD* sig_hash, const EVP_MD* mgf1_hash,
-                    bssl::UniquePtr<RSA> rsa_public_key);
-
-  const int salt_length_;
-  std::optional<std::string> public_metadata_;
-  const EVP_MD* const sig_hash_;   // Owned by BoringSSL.
-  const EVP_MD* const mgf1_hash_;  // Owned by BoringSSL.
-
-  // If public metadata is passed to RsaSsaPssVerifier::New, rsa_public_key_
-  // will be initialized using RSA_new_public_key_large_e method.
-  const bssl::UniquePtr<RSA> rsa_public_key_;
-};
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_RSA_SSA_PSS_VERIFIER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc
deleted file mode 100644
index 3542627..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-// TODO(b/259581423): Add tests incorporating blinder and signer.
-// TODO(b/275956922): Consolidate all tests that use IETF test vectors into one
-// E2E test.
-TEST(RsaSsaPssVerifier, SuccessfulVerification) {
-  const IetfStandardRsaBlindSignatureTestVector test_vec =
-      GetIetfStandardRsaBlindSignatureTestVector();
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const auto test_keys,
-                                   GetIetfStandardRsaBlindSignatureTestKeys());
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto verifier,
-      RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash, test_keys.first,
-                             /*use_rsa_public_exponent=*/true));
-  EXPECT_TRUE(verifier->Verify(test_vec.signature, test_vec.message).ok());
-}
-
-TEST(RsaSsaPssVerifier, InvalidSignature) {
-  const IetfStandardRsaBlindSignatureTestVector test_vec =
-      GetIetfStandardRsaBlindSignatureTestVector();
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const auto test_keys,
-                                   GetIetfStandardRsaBlindSignatureTestKeys());
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto verifier,
-      RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash, test_keys.first,
-                             /*use_rsa_public_exponent=*/true));
-  // corrupt signature
-  std::string wrong_sig = test_vec.signature;
-  wrong_sig.replace(10, 1, "x");
-
-  absl::Status verification_result =
-      verifier->Verify(wrong_sig, test_vec.message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              testing::HasSubstr("verification failed"));
-}
-
-TEST(RsaSsaPssVerifier, InvalidVerificationKey) {
-  const IetfStandardRsaBlindSignatureTestVector test_vec =
-      GetIetfStandardRsaBlindSignatureTestVector();
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  // wrong key
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto new_keys_pair, GetStandardRsaKeyPair());
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto verifier,
-      RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash,
-                             new_keys_pair.first,
-                             /*use_rsa_public_exponent=*/true));
-
-  absl::Status verification_result =
-      verifier->Verify(test_vec.signature, test_vec.message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              testing::HasSubstr("verification failed"));
-}
-
-TEST(RsaSsaPssVerifierTestWithPublicMetadata,
-     EmptyMessageStandardVerificationSuccess) {
-  absl::string_view message = "";
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(const auto test_key,
-                                   GetStandardRsaKeyPair());
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto private_key, AnonymousTokensRSAPrivateKeyToRSA(test_key.second));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(message, test_key.first, sig_hash, mgf1_hash,
-                            salt_length));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSign(encoded_message, private_key.get()));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash, test_key.first,
-                             /*use_rsa_public_exponent=*/true));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-// TODO(b/275956922): Consolidate all tests that use IETF test vectors into one
-// E2E test.
-TEST(RsaSsaPssVerifierTestWithPublicMetadata,
-     IetfRsaBlindSignaturesWithPublicMetadataTestVectorsSuccess) {
-  auto test_vectors = GetIetfRsaBlindSignatureWithPublicMetadataTestVectors();
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto test_key,
-      GetIetfRsaBlindSignatureWithPublicMetadataTestKeys());
-  for (const auto &test_vector : test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        auto verifier,
-        RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash, test_key.first,
-                               /*use_rsa_public_exponent=*/true,
-                               test_vector.public_metadata));
-    EXPECT_TRUE(verifier
-                    ->Verify(test_vector.signature,
-                             MaskMessageConcat(test_vector.message_mask,
-                                               test_vector.message))
-                    .ok());
-  }
-}
-
-TEST(RsaSsaPssVerifierTestWithPublicMetadata,
-     IetfRsaBlindSignaturesWithPublicMetadataNoPublicExponentSuccess) {
-  auto test_vectors =
-      GetIetfPartiallyBlindRSASignatureNoPublicExponentTestVectors();
-  const EVP_MD *sig_hash = EVP_sha384();   // Owned by BoringSSL
-  const EVP_MD *mgf1_hash = EVP_sha384();  // Owned by BoringSSL
-  const int salt_length = kSaltLengthInBytes48;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      const auto test_key,
-      GetIetfRsaBlindSignatureWithPublicMetadataTestKeys());
-  for (const auto &test_vector : test_vectors) {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        auto verifier,
-        RsaSsaPssVerifier::New(salt_length, sig_hash, mgf1_hash, test_key.first,
-                               /*use_rsa_public_exponent=*/false,
-                               test_vector.public_metadata));
-    EXPECT_TRUE(
-        verifier->Verify(test_vector.signature, test_vector.message).ok());
-  }
-}
-
-using RsaSsaPssVerifierPublicMetadataTestParams =
-    std::tuple<absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>,
-               /*use_rsa_public_exponent*/ bool>;
-
-class RsaSsaPssVerifierTestWithPublicMetadata
-    : public ::testing::TestWithParam<
-          RsaSsaPssVerifierPublicMetadataTestParams> {
- protected:
-  void SetUp() override {
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(auto keys_pair, std::get<0>(GetParam()));
-    use_rsa_public_exponent_ = std::get<1>(GetParam());
-    public_key_ = std::move(keys_pair.first);
-    ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-        private_key_, AnonymousTokensRSAPrivateKeyToRSA(keys_pair.second));
-    // NOTE: using recommended RsaSsaPssParams
-    sig_hash_ = EVP_sha384();
-    mgf1_hash_ = EVP_sha384();
-    salt_length_ = kSaltLengthInBytes48;
-  }
-
-  RSAPublicKey public_key_;
-  bssl::UniquePtr<RSA> private_key_;
-  const EVP_MD *sig_hash_;   // Owned by BoringSSL.
-  const EVP_MD *mgf1_hash_;  // Owned by BoringSSL.
-  int salt_length_;
-  bool use_rsa_public_exponent_;
-};
-
-// This test only tests whether the implemented verfier 'verifies' properly
-// under some public metadata. The outline of method calls in this test should
-// not be assumed a secure signature scheme (and used in other places) as the
-// security has not been proven/analyzed.
-TEST_P(RsaSsaPssVerifierTestWithPublicMetadata,
-       VerifierWorksWithPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSignWithPublicMetadata(encoded_message, public_metadata,
-                                 *private_key_, use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-TEST_P(RsaSsaPssVerifierTestWithPublicMetadata,
-       VerifierFailsToVerifyWithWrongPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  absl::string_view public_metadata_2 = "pubmd2";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSignWithPublicMetadata(encoded_message, public_metadata,
-                                 *private_key_, use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata_2));
-  absl::Status verification_result =
-      verifier->Verify(potentially_insecure_signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaSsaPssVerifierTestWithPublicMetadata,
-       VerifierFailsToVerifyWithEmptyPublicMetadata) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  absl::string_view empty_public_metadata = "";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSignWithPublicMetadata(encoded_message, public_metadata,
-                                 *private_key_, use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, empty_public_metadata));
-  absl::Status verification_result =
-      verifier->Verify(potentially_insecure_signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaSsaPssVerifierTestWithPublicMetadata,
-       VerifierFailsToVerifyWithoutPublicMetadataSupport) {
-  absl::string_view message = "Hello World!";
-  absl::string_view public_metadata = "pubmd!";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSignWithPublicMetadata(encoded_message, public_metadata,
-                                 *private_key_, use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_));
-  absl::Status verification_result =
-      verifier->Verify(potentially_insecure_signature, message);
-  EXPECT_EQ(verification_result.code(), absl::StatusCode::kInvalidArgument);
-  EXPECT_THAT(verification_result.message(),
-              testing::HasSubstr("verification failed"));
-}
-
-TEST_P(RsaSsaPssVerifierTestWithPublicMetadata,
-       EmptyMessageEmptyPublicMetadataVerificationSuccess) {
-  absl::string_view message = "";
-  absl::string_view public_metadata = "";
-  std::string augmented_message =
-      EncodeMessagePublicMetadata(message, public_metadata);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string encoded_message,
-      EncodeMessageForTests(augmented_message, public_key_, sig_hash_,
-                            mgf1_hash_, salt_length_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      std::string potentially_insecure_signature,
-      TestSignWithPublicMetadata(encoded_message, public_metadata,
-                                 *private_key_.get(),
-                                 use_rsa_public_exponent_));
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      auto verifier,
-      RsaSsaPssVerifier::New(salt_length_, sig_hash_, mgf1_hash_, public_key_,
-                             use_rsa_public_exponent_, public_metadata));
-  EXPECT_TRUE(verifier->Verify(potentially_insecure_signature, message).ok());
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    RsaSsaPssVerifierTestWithPublicMetadata,
-    RsaSsaPssVerifierTestWithPublicMetadata,
-    ::testing::Combine(
-        ::testing::Values(GetStrongRsaKeys2048(), GetAnotherStrongRsaKeys2048(),
-                          GetStrongRsaKeys3072(), GetStrongRsaKeys4096()),
-        /*use_rsa_public_exponent*/ ::testing::Values(true, false)));
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h
deleted file mode 100644
index 14e3d2f..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/verifier.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_VERIFIER_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_VERIFIER_H_
-
-#include "absl/status/status.h"
-#include "absl/strings/string_view.h"
-
-class Verifier {
- public:
-  virtual absl::Status Verify(absl::string_view signature,
-                              absl::string_view message) = 0;
-
-  virtual ~Verifier() = default;
-};
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_CRYPTO_VERIFIER_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc
deleted file mode 100644
index f311d3c..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h"
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "absl/time/time.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-absl::StatusOr<AnonymousTokensUseCase> ParseUseCase(
-    absl::string_view use_case) {
-  AnonymousTokensUseCase parsed_use_case;
-  if (!AnonymousTokensUseCase_Parse(std::string(use_case), &parsed_use_case) ||
-      parsed_use_case == ANONYMOUS_TOKENS_USE_CASE_UNDEFINED) {
-    return absl::InvalidArgumentError(
-        "Invalid / undefined use case cannot be parsed.");
-  }
-  return parsed_use_case;
-}
-
-absl::StatusOr<absl::Time> TimeFromProto(
-    const private_membership::anonymous_tokens::Timestamp& proto) {
-  const auto sec = proto.seconds();
-  const auto ns = proto.nanos();
-  // sec must be [0001-01-01T00:00:00Z, 9999-12-31T23:59:59.999999999Z]
-  if (sec < -62135596800 || sec > 253402300799) {
-    return absl::InvalidArgumentError(absl::StrCat("seconds=", sec));
-  }
-  if (ns < 0 || ns > 999999999) {
-    return absl::InvalidArgumentError(absl::StrCat("nanos=", ns));
-  }
-  return absl::FromUnixSeconds(proto.seconds()) +
-         absl::Nanoseconds(proto.nanos());
-}
-
-absl::StatusOr<private_membership::anonymous_tokens::Timestamp> TimeToProto(absl::Time time) {
-  private_membership::anonymous_tokens::Timestamp proto;
-  const int64_t seconds = absl::ToUnixSeconds(time);
-  proto.set_seconds(seconds);
-  proto.set_nanos((time - absl::FromUnixSeconds(seconds)) /
-                  absl::Nanoseconds(1));
-  // seconds must be [0001-01-01T00:00:00Z, 9999-12-31T23:59:59.999999999Z]
-  if (seconds < -62135596800 || seconds > 253402300799) {
-    return absl::InvalidArgumentError(absl::StrCat("seconds=", seconds));
-  }
-  const int64_t ns = proto.nanos();
-  if (ns < 0 || ns > 999999999) {
-    return absl::InvalidArgumentError(absl::StrCat("nanos=", ns));
-  }
-  return proto;
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h
deleted file mode 100644
index f510516..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_PROTO_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_PROTO_UTILS_H_
-
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "quiche/common/platform/api/quiche_export.h"
-// copybara:strip_begin(internal comment)
-// The QUICHE_EXPORT annotation is necessary for some classes and functions
-// to link correctly on Windows. Please do not remove them!
-// copybara:strip_end
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// Returns AnonymousTokensUseCase parsed from a string_view.
-absl::StatusOr<AnonymousTokensUseCase> QUICHE_EXPORT ParseUseCase(
-    absl::string_view use_case);
-
-// Takes in private_membership::anonymous_tokens::Timestamp and converts it to absl::Time.
-//
-// Timestamp is defined here:
-// https://developers.google.com/protocol-buffers/docs/reference/private_membership.anonymous_tokens#timestamp
-absl::StatusOr<absl::Time> QUICHE_EXPORT TimeFromProto(
-    const private_membership::anonymous_tokens::Timestamp& proto);
-
-// Takes in absl::Time and converts it to private_membership::anonymous_tokens::Timestamp.
-//
-// Timestamp is defined here:
-// https://developers.google.com/protocol-buffers/docs/reference/private_membership.anonymous_tokens#timestamp
-absl::StatusOr<private_membership::anonymous_tokens::Timestamp> QUICHE_EXPORT TimeToProto(
-    absl::Time time);
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_PROTO_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc
deleted file mode 100644
index 5018734..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h"
-
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/common/test_tools/quiche_test_utils.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-namespace {
-
-TEST(ProtoUtilsTest, EmptyUseCase) {
-  EXPECT_THAT(ParseUseCase("").status().code(),
-              absl::StatusCode::kInvalidArgument);
-}
-
-TEST(ProtoUtilsTest, InvalidUseCase) {
-  EXPECT_THAT(ParseUseCase("NOT_A_USE_CASE").status().code(),
-              absl::StatusCode::kInvalidArgument);
-}
-
-TEST(ProtoUtilsTest, UndefinedUseCase) {
-  EXPECT_THAT(
-      ParseUseCase("ANONYMOUS_TOKENS_USE_CASE_UNDEFINED").status().code(),
-      absl::StatusCode::kInvalidArgument);
-}
-
-TEST(ProtoUtilsTest, ValidUseCase) {
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(AnonymousTokensUseCase use_case,
-                                   ParseUseCase("TEST_USE_CASE"));
-  EXPECT_EQ(use_case, AnonymousTokensUseCase::TEST_USE_CASE);
-}
-
-TEST(ProtoUtilsTest, TimeFromProtoGood) {
-  private_membership::anonymous_tokens::Timestamp timestamp;
-  timestamp.set_seconds(1234567890);
-  timestamp.set_nanos(12345);
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(absl::Time time, TimeFromProto(timestamp));
-  ASSERT_EQ(time, absl::FromUnixNanos(1234567890000012345));
-}
-
-TEST(ProtoUtilsTest, TimeFromProtoBad) {
-  private_membership::anonymous_tokens::Timestamp proto;
-  proto.set_nanos(-1);
-  EXPECT_THAT(TimeFromProto(proto).status().code(),
-              absl::StatusCode::kInvalidArgument);
-
-  proto.set_nanos(0);
-  proto.set_seconds(253402300800);
-  EXPECT_THAT(TimeFromProto(proto).status().code(),
-              absl::StatusCode::kInvalidArgument);
-}
-
-TEST(ProtoUtilsTest, TimeToProtoGood) {
-  private_membership::anonymous_tokens::Timestamp proto;
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      proto, TimeToProto(absl::FromUnixSeconds(1596762373)));
-  EXPECT_EQ(proto.seconds(), 1596762373);
-  EXPECT_EQ(proto.nanos(), 0);
-
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN(
-      proto, TimeToProto(absl::FromUnixMillis(1596762373123L)));
-  EXPECT_EQ(proto.seconds(), 1596762373);
-  EXPECT_EQ(proto.nanos(), 123000000);
-}
-
-TEST(ProtoUtilsTest, TimeToProtoBad) {
-  absl::StatusOr<private_membership::anonymous_tokens::Timestamp> proto;
-  proto = TimeToProto(absl::FromUnixSeconds(253402300800));
-  EXPECT_THAT(proto.status().code(), absl::StatusCode::kInvalidArgument);
-}
-
-}  // namespace
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h
deleted file mode 100644
index bcdddf6..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
-
-#include "absl/base/optimization.h"
-#include "absl/status/status.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-#define _ANON_TOKENS_STATUS_MACROS_CONCAT_NAME(x, y) \
-  _ANON_TOKENS_STATUS_MACROS_CONCAT_IMPL(x, y)
-#define _ANON_TOKENS_STATUS_MACROS_CONCAT_IMPL(x, y) x##y
-
-#define ANON_TOKENS_ASSIGN_OR_RETURN(lhs, rexpr)                             \
-  _ANON_TOKENS_ASSIGN_OR_RETURN_IMPL(                                        \
-      _ANON_TOKENS_STATUS_MACROS_CONCAT_NAME(_status_or_val, __LINE__), lhs, \
-      rexpr)
-
-#define _ANON_TOKENS_ASSIGN_OR_RETURN_IMPL(statusor, lhs, rexpr) \
-  auto statusor = (rexpr);                                       \
-  if (ABSL_PREDICT_FALSE(!statusor.ok())) {                      \
-    return statusor.status();                                    \
-  }                                                              \
-  lhs = *std::move(statusor)
-
-#define ANON_TOKENS_RETURN_IF_ERROR(expr)                  \
-  do {                                                     \
-    auto _status = (expr);                                 \
-    if (ABSL_PREDICT_FALSE(!_status.ok())) return _status; \
-  } while (0)
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc
deleted file mode 100644
index 0f1daf7..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-
-#include <cstdint>
-#include <fstream>
-#include <ios>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-#include "openssl/bn.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-namespace {
-
-absl::StatusOr<std::string> ReadFileToString(absl::string_view path) {
-  std::ifstream file(std::string(path), std::ios::binary);
-  if (!file.is_open()) {
-    return absl::InternalError("Reading file failed.");
-  }
-  std::ostringstream ss(std::ios::binary);
-  ss << file.rdbuf();
-  return ss.str();
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> ParseRsaKeysFromFile(
-    absl::string_view path) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string binary_proto,
-                               ReadFileToString(path));
-  RSAPrivateKey private_key;
-  if (!private_key.ParseFromString(binary_proto)) {
-    return absl::InternalError("Parsing binary proto failed.");
-  }
-  RSAPublicKey public_key;
-  public_key.set_n(private_key.n());
-  public_key.set_e(private_key.e());
-  return std::make_pair(std::move(public_key), std::move(private_key));
-}
-
-absl::StatusOr<bssl::UniquePtr<RSA>> GenerateRSAKey(int modulus_bit_size,
-                                                    const BIGNUM& e) {
-  bssl::UniquePtr<RSA> rsa(RSA_new());
-  if (!rsa.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new failed: ", GetSslErrors()));
-  }
-  if (RSA_generate_key_ex(rsa.get(), modulus_bit_size, &e,
-                          /*cb=*/nullptr) != kBsslSuccess) {
-    return absl::InternalError(
-        absl::StrCat("Error generating private key: ", GetSslErrors()));
-  }
-  return rsa;
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> PopulateTestVectorKeys(
-    const std::string& n, const std::string& e, const std::string& d,
-    const std::string& p, const std::string& q) {
-  RSAPublicKey public_key;
-  RSAPrivateKey private_key;
-
-  public_key.set_n(n);
-  public_key.set_e(e);
-
-  private_key.set_n(n);
-  private_key.set_e(e);
-  private_key.set_d(d);
-  private_key.set_p(p);
-  private_key.set_q(q);
-
-  // Computing CRT parameters
-  ANON_TOKENS_ASSIGN_OR_RETURN(BnCtxPtr bn_ctx, GetAndStartBigNumCtx());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> dp_bn, NewBigNum());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> dq_bn, NewBigNum());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> crt_bn, NewBigNum());
-
-  // p - 1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> pm1, StringToBignum(p));
-  BN_sub_word(pm1.get(), 1);
-  // q - 1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> qm1, StringToBignum(q));
-  BN_sub_word(qm1.get(), 1);
-  // d mod p-1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> d_bn, StringToBignum(d));
-  BN_mod(dp_bn.get(), d_bn.get(), pm1.get(), bn_ctx.get());
-  // d mod q-1
-  BN_mod(dq_bn.get(), d_bn.get(), qm1.get(), bn_ctx.get());
-  // crt q^(-1) mod p
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> q_bn, StringToBignum(q));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> p_bn, StringToBignum(p));
-  BN_mod_inverse(crt_bn.get(), q_bn.get(), p_bn.get(), bn_ctx.get());
-
-  // Populating crt params in private key
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      std::string dp_str, BignumToString(*dp_bn, BN_num_bytes(dp_bn.get())));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      std::string dq_str, BignumToString(*dq_bn, BN_num_bytes(dq_bn.get())));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      std::string crt_str, BignumToString(*crt_bn, BN_num_bytes(crt_bn.get())));
-  private_key.set_dp(dp_str);
-  private_key.set_dq(dq_str);
-  private_key.set_crt(crt_str);
-
-  return std::make_pair(std::move(public_key), std::move(private_key));
-}
-
-}  // namespace
-
-absl::StatusOr<std::pair<bssl::UniquePtr<RSA>, RSABlindSignaturePublicKey>>
-CreateTestKey(int key_size, HashType sig_hash, MaskGenFunction mfg1_hash,
-              int salt_length, MessageMaskType message_mask_type,
-              int message_mask_size) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_f4, NewBigNum());
-  BN_set_u64(rsa_f4.get(), RSA_F4);
-
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<RSA> rsa_key,
-                               GenerateRSAKey(key_size * 8, *rsa_f4));
-
-  RSAPublicKey rsa_public_key;
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_public_key.mutable_n(),
-      BignumToString(*RSA_get0_n(rsa_key.get()), key_size));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_public_key.mutable_e(),
-      BignumToString(*RSA_get0_e(rsa_key.get()), key_size));
-
-  RSABlindSignaturePublicKey public_key;
-  public_key.set_serialized_public_key(rsa_public_key.SerializeAsString());
-  public_key.set_sig_hash_type(sig_hash);
-  public_key.set_mask_gen_function(mfg1_hash);
-  public_key.set_salt_length(salt_length);
-  public_key.set_key_size(key_size);
-  public_key.set_message_mask_type(message_mask_type);
-  public_key.set_message_mask_size(message_mask_size);
-
-  return std::make_pair(std::move(rsa_key), std::move(public_key));
-}
-
-absl::StatusOr<std::string> EncodeMessageForTests(absl::string_view message,
-                                                  RSAPublicKey public_key,
-                                                  const EVP_MD* sig_hasher,
-                                                  const EVP_MD* mgf1_hasher,
-                                                  int32_t salt_length) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_modulus,
-                               StringToBignum(public_key.n()));
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> e,
-                               StringToBignum(public_key.e()));
-  // Convert to OpenSSL RSA.
-  bssl::UniquePtr<RSA> rsa_public_key(RSA_new());
-  if (!rsa_public_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new failed: ", GetSslErrors()));
-  } else if (RSA_set0_key(rsa_public_key.get(), rsa_modulus.release(),
-                          e.release(), nullptr) != kBsslSuccess) {
-    return absl::InternalError(
-        absl::StrCat("RSA_set0_key failed: ", GetSslErrors()));
-  }
-
-  const int padded_len = RSA_size(rsa_public_key.get());
-  std::vector<uint8_t> padded(padded_len);
-  ANON_TOKENS_ASSIGN_OR_RETURN(std::string digest,
-                               ComputeHash(message, *sig_hasher));
-  if (RSA_padding_add_PKCS1_PSS_mgf1(
-          /*rsa=*/rsa_public_key.get(), /*EM=*/padded.data(),
-          /*mHash=*/reinterpret_cast<uint8_t*>(&digest[0]), /*Hash=*/sig_hasher,
-          /*mgf1Hash=*/mgf1_hasher,
-          /*sLen=*/salt_length) != kBsslSuccess) {
-    return absl::InternalError(
-        "RSA_padding_add_PKCS1_PSS_mgf1 failed when called from "
-        "testing_utils");
-  }
-  std::string encoded_message(padded.begin(), padded.end());
-  return encoded_message;
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStandardRsaKeyPair(
-    int modulus_size_in_bytes) {
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> rsa_f4, NewBigNum());
-  BN_set_u64(rsa_f4.get(), RSA_F4);
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      bssl::UniquePtr<RSA> rsa_key,
-      GenerateRSAKey(modulus_size_in_bytes * 8, *rsa_f4));
-
-  RSAPublicKey rsa_public_key;
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_public_key.mutable_n(),
-      BignumToString(*RSA_get0_n(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_public_key.mutable_e(),
-      BignumToString(*RSA_get0_e(rsa_key.get()), modulus_size_in_bytes));
-
-  RSAPrivateKey rsa_private_key;
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_n(),
-      BignumToString(*RSA_get0_n(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_e(),
-      BignumToString(*RSA_get0_e(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_d(),
-      BignumToString(*RSA_get0_d(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_p(),
-      BignumToString(*RSA_get0_p(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_q(),
-      BignumToString(*RSA_get0_q(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_dp(),
-      BignumToString(*RSA_get0_dmp1(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_dq(),
-      BignumToString(*RSA_get0_dmq1(rsa_key.get()), modulus_size_in_bytes));
-  ANON_TOKENS_ASSIGN_OR_RETURN(
-      *rsa_private_key.mutable_crt(),
-      BignumToString(*RSA_get0_iqmp(rsa_key.get()), modulus_size_in_bytes));
-
-  return std::make_pair(std::move(rsa_public_key), std::move(rsa_private_key));
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys2048() {
-  std::string path = absl::StrCat(::anonymous_tokens::GetTestdataPath(),
-                                  "/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb");
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto key_pair, ParseRsaKeysFromFile(path));
-  return std::make_pair(std::move(key_pair.first), std::move(key_pair.second));
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetAnotherStrongRsaKeys2048() {
-  std::string path = absl::StrCat(::anonymous_tokens::GetTestdataPath(),
-                                  "/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb");
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto key_pair, ParseRsaKeysFromFile(path));
-  return std::make_pair(std::move(key_pair.first), std::move(key_pair.second));
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys3072() {
-  std::string path = absl::StrCat(::anonymous_tokens::GetTestdataPath(),
-                                  "/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb");
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto key_pair, ParseRsaKeysFromFile(path));
-  return std::make_pair(std::move(key_pair.first), std::move(key_pair.second));
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys4096() {
-  std::string path = absl::StrCat(::anonymous_tokens::GetTestdataPath(),
-                                  "/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb");
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto key_pair, ParseRsaKeysFromFile(path));
-  return std::make_pair(std::move(key_pair.first), std::move(key_pair.second));
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetIetfStandardRsaBlindSignatureTestKeys() {
-  IetfStandardRsaBlindSignatureTestVector test_vector =
-      GetIetfStandardRsaBlindSignatureTestVector();
-  return PopulateTestVectorKeys(test_vector.n, test_vector.e, test_vector.d,
-                                test_vector.p, test_vector.q);
-}
-
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetIetfRsaBlindSignatureWithPublicMetadataTestKeys() {
-  auto test_vectors = GetIetfRsaBlindSignatureWithPublicMetadataTestVectors();
-  return PopulateTestVectorKeys(test_vectors[0].n, test_vectors[0].e,
-                                test_vectors[0].d, test_vectors[0].p,
-                                test_vectors[0].q);
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h
deleted file mode 100644
index 1c4c193..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_PROTO_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_PROTO_UTILS_H_
-
-#include <cstdint>
-#include <string>
-#include <utility>
-
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"
-#include "openssl/base.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-// Creates a pair containing a standard RSA Private key and an Anonymous Tokens
-// RSABlindSignaturePublicKey using RSA_F4 (65537) as the public exponent and
-// other input parameters.
-//
-// The standard key pair produced by this method should only be used to test
-// standard RSA Blind Signatures. For testing RSA Blind Signatures with Public
-// Metadata please use RSA keys with strong RSA moduli.
-absl::StatusOr<std::pair<bssl::UniquePtr<RSA>, RSABlindSignaturePublicKey>>
-CreateTestKey(int key_size = 512, HashType sig_hash = AT_HASH_TYPE_SHA384,
-              MaskGenFunction mfg1_hash = AT_MGF_SHA384, int salt_length = 48,
-              MessageMaskType message_mask_type = AT_MESSAGE_MASK_CONCAT,
-              int message_mask_size = kRsaMessageMaskSizeInBytes32);
-
-// Prepares message for signing by computing its hash and then applying the PSS
-// padding to the result by executing RSA_padding_add_PKCS1_PSS_mgf1 from the
-// openssl library, using the input parameters.
-//
-// This is a test function and it skips the message blinding part.
-absl::StatusOr<std::string> EncodeMessageForTests(absl::string_view message,
-                                                  RSAPublicKey public_key,
-                                                  const EVP_MD* sig_hasher,
-                                                  const EVP_MD* mgf1_hasher,
-                                                  int32_t salt_length);
-
-// This method returns a newly generated RSA key pair, setting the public
-// exponent to be the standard RSA_F4 (65537) and the default modulus size to
-// 512 bytes.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStandardRsaKeyPair(
-    int modulus_size_in_bytes = kRsaModulusSizeInBytes512);
-
-// Method returns fixed 2048-bit strong RSA modulus for testing.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys2048();
-
-// Method returns another fixed 2048-bit strong RSA modulus for testing.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetAnotherStrongRsaKeys2048();
-
-// Method returns fixed 3072-bit strong RSA modulus for testing.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys3072();
-
-// Method returns fixed 4096-bit strong RSA modulus for testing.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>> GetStrongRsaKeys4096();
-
-// This method returns a RSA key pair as described in the IETF test example
-// above.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetIetfStandardRsaBlindSignatureTestKeys();
-
-// This method returns a RSA key pair as described in the IETF test with Public
-// Metadata example. It can be used for all test vectors returned by
-// GetIetfRsaBlindSignatureWithPublicMetadataTestVectors.
-absl::StatusOr<std::pair<RSAPublicKey, RSAPrivateKey>>
-GetIetfRsaBlindSignatureWithPublicMetadataTestKeys();
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_PROTO_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h
deleted file mode 100644
index b9ad465..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/testdata_utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_TESTDATA_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_TESTDATA_UTILS_H_
-
-#include <string>
-
-#include "quiche/common/platform/api/quiche_test.h"
-
-namespace anonymous_tokens {
-
-// Note: This function is defined in a separate header so that other projects
-// that use this library can easily provide their own implementation if the test
-// data path is different.
-inline std::string GetTestdataPath() {
-  return quiche::test::QuicheGetCommonSourcePath();
-}
-
-}  // namespace anonymous_tokens
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_TESTDATA_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc b/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc
deleted file mode 100644
index 572f717..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc
+++ /dev/null
@@ -1,1047 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
-
-#include <cstddef>
-#include <cstdint>
-#include <random>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/escaping.h"
-#include "absl/strings/str_cat.h"
-#include "absl/strings/string_view.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/constants.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/crypto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/status_utils.h"
-#include "quiche/common/platform/api/quiche_file_utils.h"
-#include "quiche/common/platform/api/quiche_test.h"
-#include "openssl/base.h"
-#include "openssl/bn.h"
-#include "openssl/rsa.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-absl::StatusOr<std::string> TestSign(const absl::string_view blinded_data,
-                                     RSA* rsa_key) {
-  if (blinded_data.empty()) {
-    return absl::InvalidArgumentError("blinded_data string is empty.");
-  }
-  const size_t mod_size = RSA_size(rsa_key);
-  if (blinded_data.size() != mod_size) {
-    return absl::InternalError(absl::StrCat(
-        "Expected blind data size = ", mod_size,
-        " actual blind data size = ", blinded_data.size(), " bytes."));
-  }
-  // Compute a raw RSA signature.
-  std::string signature(mod_size, 0);
-  size_t out_len;
-  if (RSA_sign_raw(/*rsa=*/rsa_key, /*out_len=*/&out_len,
-                   /*out=*/reinterpret_cast<uint8_t*>(&signature[0]),
-                   /*max_out=*/mod_size,
-                   /*in=*/reinterpret_cast<const uint8_t*>(&blinded_data[0]),
-                   /*in_len=*/mod_size,
-                   /*padding=*/RSA_NO_PADDING) != kBsslSuccess) {
-    return absl::InternalError(
-        "RSA_sign_raw failed when called from RsaBlindSigner::Sign");
-  }
-  if (out_len != mod_size || out_len != signature.size()) {
-    return absl::InternalError(absl::StrCat(
-        "Expected value of out_len and signature.size() = ", mod_size,
-        " bytes, actual value of out_len and signature.size() = ", out_len,
-        " and ", signature.size(), " bytes."));
-  }
-  return signature;
-}
-
-absl::StatusOr<std::string> TestSignWithPublicMetadata(
-    const absl::string_view blinded_data, absl::string_view public_metadata,
-    const RSA& rsa_key, const bool use_rsa_public_exponent) {
-  if (blinded_data.empty()) {
-    return absl::InvalidArgumentError("blinded_data string is empty.");
-  } else if (blinded_data.size() != RSA_size(&rsa_key)) {
-    return absl::InternalError(absl::StrCat(
-        "Expected blind data size = ", RSA_size(&rsa_key),
-        " actual blind data size = ", blinded_data.size(), " bytes."));
-  }
-  // Compute new public exponent using the public metadata.
-  bssl::UniquePtr<BIGNUM> new_e;
-  if (use_rsa_public_exponent) {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        new_e,
-        ComputeExponentWithPublicMetadataAndPublicExponent(
-            *RSA_get0_n(&rsa_key), *RSA_get0_e(&rsa_key), public_metadata));
-  } else {
-    ANON_TOKENS_ASSIGN_OR_RETURN(
-        new_e, ComputeExponentWithPublicMetadata(*RSA_get0_n(&rsa_key),
-                                                 public_metadata));
-  }
-
-  // Compute phi(p) = p-1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_p, NewBigNum());
-  if (BN_sub(phi_p.get(), RSA_get0_p(&rsa_key), BN_value_one()) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(p): ", GetSslErrors()));
-  }
-  // Compute phi(q) = q-1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_q, NewBigNum());
-  if (BN_sub(phi_q.get(), RSA_get0_q(&rsa_key), BN_value_one()) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(q): ", GetSslErrors()));
-  }
-  // Compute phi(n) = phi(p)*phi(q)
-  ANON_TOKENS_ASSIGN_OR_RETURN(auto ctx, GetAndStartBigNumCtx());
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> phi_n, NewBigNum());
-  if (BN_mul(phi_n.get(), phi_p.get(), phi_q.get(), ctx.get()) != 1) {
-    return absl::InternalError(
-        absl::StrCat("Unable to compute phi(n): ", GetSslErrors()));
-  }
-  // Compute lcm(phi(p), phi(q)).
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> lcm, NewBigNum());
-  if (BN_rshift1(lcm.get(), phi_n.get()) != 1) {
-    return absl::InternalError(absl::StrCat(
-        "Could not compute LCM(phi(p), phi(q)): ", GetSslErrors()));
-  }
-
-  // Compute the new private exponent new_d
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_d, NewBigNum());
-  if (!BN_mod_inverse(new_d.get(), new_e.get(), lcm.get(), ctx.get())) {
-    return absl::InternalError(
-        absl::StrCat("Could not compute private exponent d: ", GetSslErrors()));
-  }
-
-  // Compute new_dpm1 = new_d mod p-1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_dpm1, NewBigNum());
-  BN_mod(new_dpm1.get(), new_d.get(), phi_p.get(), ctx.get());
-  // Compute new_dqm1 = new_d mod q-1
-  ANON_TOKENS_ASSIGN_OR_RETURN(bssl::UniquePtr<BIGNUM> new_dqm1, NewBigNum());
-  BN_mod(new_dqm1.get(), new_d.get(), phi_q.get(), ctx.get());
-
-  bssl::UniquePtr<RSA> derived_private_key(RSA_new_private_key_large_e(
-      RSA_get0_n(&rsa_key), new_e.get(), new_d.get(), RSA_get0_p(&rsa_key),
-      RSA_get0_q(&rsa_key), new_dpm1.get(), new_dqm1.get(),
-      RSA_get0_iqmp(&rsa_key)));
-  if (!derived_private_key.get()) {
-    return absl::InternalError(
-        absl::StrCat("RSA_new_private_key_large_e failed: ", GetSslErrors()));
-  }
-
-  return TestSign(blinded_data, derived_private_key.get());
-}
-
-IetfStandardRsaBlindSignatureTestVector
-GetIetfStandardRsaBlindSignatureTestVector() {
-  IetfStandardRsaBlindSignatureTestVector test_vector = {
-      // n
-      absl::HexStringToBytes(
-          "aec4d69addc70b990ea66a5e70603b6fee27aafebd08f2d94cbe1250c556e047a9"
-          "28d635c3f45ee9b66d1bc628a03bac9b7c3f416fe20dabea8f3d7b4bbf7f963be3"
-          "35d2328d67e6c13ee4a8f955e05a3283720d3e1f139c38e43e0338ad058a9495c5"
-          "3377fc35be64d208f89b4aa721bf7f7d3fef837be2a80e0f8adf0bcd1eec5bb040"
-          "443a2b2792fdca522a7472aed74f31a1ebe1eebc1f408660a0543dfe2a850f106a"
-          "617ec6685573702eaaa21a5640a5dcaf9b74e397fa3af18a2f1b7c03ba91a63361"
-          "58de420d63188ee143866ee415735d155b7c2d854d795b7bc236cffd71542df342"
-          "34221a0413e142d8c61355cc44d45bda94204974557ac2704cd8b593f035a5724b"
-          "1adf442e78c542cd4414fce6f1298182fb6d8e53cef1adfd2e90e1e4deec52999b"
-          "dc6c29144e8d52a125232c8c6d75c706ea3cc06841c7bda33568c63a6c03817f72"
-          "2b50fcf898237d788a4400869e44d90a3020923dc646388abcc914315215fcd1ba"
-          "e11b1c751fd52443aac8f601087d8d42737c18a3fa11ecd4131ecae017ae0a14ac"
-          "fc4ef85b83c19fed33cfd1cd629da2c4c09e222b398e18d822f77bb378dea3cb36"
-          "0b605e5aa58b20edc29d000a66bd177c682a17e7eb12a63ef7c2e4183e0d898f3d"
-          "6bf567ba8ae84f84f1d23bf8b8e261c3729e2fa6d07b832e07cddd1d14f55325c6"
-          "f924267957121902dc19b3b32948bdead5"),
-      // e
-      absl::HexStringToBytes("010001"),
-      // d
-      absl::HexStringToBytes(
-          "0d43242aefe1fb2c13fbc66e20b678c4336d20b1808c558b6e62ad16a287077180b1"
-          "77e1f01b12f9c6cd6c52630257ccef26a45135a990928773f3bd2fc01a313f1dac97"
-          "a51cec71cb1fd7efc7adffdeb05f1fb04812c924ed7f4a8269925dad88bd7dcfbc4e"
-          "f01020ebfc60cb3e04c54f981fdbd273e69a8a58b8ceb7c2d83fbcbd6f784d052201"
-          "b88a9848186f2a45c0d2826870733e6fd9aa46983e0a6e82e35ca20a439c5ee7b502"
-          "a9062e1066493bdadf8b49eb30d9558ed85abc7afb29b3c9bc644199654a4676681a"
-          "f4babcea4e6f71fe4565c9c1b85d9985b84ec1abf1a820a9bbebee0df1398aae2c85"
-          "ab580a9f13e7743afd3108eb32100b870648fa6bc17e8abac4d3c99246b1f0ea9f7f"
-          "93a5dd5458c56d9f3f81ff2216b3c3680a13591673c43194d8e6fc93fc1e37ce2986"
-          "bd628ac48088bc723d8fbe293861ca7a9f4a73e9fa63b1b6d0074f5dea2a624c5249"
-          "ff3ad811b6255b299d6bc5451ba7477f19c5a0db690c3e6476398b1483d10314afd3"
-          "8bbaf6e2fbdbcd62c3ca9797a420ca6034ec0a83360a3ee2adf4b9d4ba29731d131b"
-          "099a38d6a23cc463db754603211260e99d19affc902c915d7854554aabf608e3ac52"
-          "c19b8aa26ae042249b17b2d29669b5c859103ee53ef9bdc73ba3c6b537d5c34b6d8f"
-          "034671d7f3a8a6966cc4543df223565343154140fd7391c7e7be03e241f4ecfeb877"
-          "a051"),
-      // p
-      absl::HexStringToBytes(
-          "e1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc75673488930559c1"
-          "20fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca7d8c"
-          "30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e41b0"
-          "4c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf108602"
-          "be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048b457"
-          "d73419213063c60ee7b0d81820165864fef93523c9635c22210956e53a8d96322493"
-          "ffc58d845368e2416e078e5bcb5d2fd68ae6acfa54f9627c42e84a9d3f2774017e32"
-          "ebca06308a12ecc290c7cd1156dcccfb2311"),
-      // q
-      absl::HexStringToBytes(
-          "c601a9caea66dc3835827b539db9df6f6f5ae77244692780cd334a006ab353c80642"
-          "6b60718c05245650821d39445d3ab591ed10a7339f15d83fe13f6a3dfb20b9452c6a"
-          "9b42eaa62a68c970df3cadb2139f804ad8223d56108dfde30ba7d367e9b0a7a80c4f"
-          "dba2fd9dde6661fc73fc2947569d2029f2870fc02d8325acf28c9afa19ecf962daa7"
-          "916e21afad09eb62fe9f1cf91b77dc879b7974b490d3ebd2e95426057f35d0a3c9f4"
-          "5f79ac727ab81a519a8b9285932d9b2e5ccd347e59f3f32ad9ca359115e7da008ab7"
-          "406707bd0e8e185a5ed8758b5ba266e8828f8d863ae133846304a2936ad7bc7c9803"
-          "879d2fc4a28e69291d73dbd799f8bc238385"),
-      // message
-      absl::HexStringToBytes("8f3dc6fb8c4a02f4d6352edf0907822c1210a"
-                             "9b32f9bdda4c45a698c80023aa6b5"
-                             "9f8cfec5fdbb36331372ebefedae7d"),
-      // salt
-      absl::HexStringToBytes("051722b35f458781397c3a671a7d3bd3096503940e4c4f1aa"
-                             "a269d60300ce449555cd7340100df9d46944c5356825abf"),
-      // inv
-      absl::HexStringToBytes(
-          "80682c48982407b489d53d1261b19ec8627d02b8cda5336750b8cee332ae260de57b"
-          "02d72609c1e0e9f28e2040fc65b6f02d56dbd6aa9af8fde656f70495dfb723ba0117"
-          "3d4707a12fddac628ca29f3e32340bd8f7ddb557cf819f6b01e445ad96f874ba2355"
-          "84ee71f6581f62d4f43bf03f910f6510deb85e8ef06c7f09d9794a008be7ff2529f0"
-          "ebb69decef646387dc767b74939265fec0223aa6d84d2a8a1cc912d5ca25b4e144ab"
-          "8f6ba054b54910176d5737a2cff011da431bd5f2a0d2d66b9e70b39f4b050e45c0d9"
-          "c16f02deda9ddf2d00f3e4b01037d7029cd49c2d46a8e1fc2c0c17520af1f4b5e25b"
-          "a396afc4cd60c494a4c426448b35b49635b337cfb08e7c22a39b256dd032c00addda"
-          "fb51a627f99a0e1704170ac1f1912e49d9db10ec04c19c58f420212973e0cb329524"
-          "223a6aa56c7937c5dffdb5d966b6cd4cbc26f3201dd25c80960a1a111b32947bb789"
-          "73d269fac7f5186530930ed19f68507540eed9e1bab8b00f00d8ca09b3f099aae461"
-          "80e04e3584bd7ca054df18a1504b89d1d1675d0966c4ae1407be325cdf623cf13ff1"
-          "3e4a28b594d59e3eadbadf6136eee7a59d6a444c9eb4e2198e8a974f27a39eb63af2"
-          "c9af3870488b8adaad444674f512133ad80b9220e09158521614f1faadfe8505ef57"
-          "b7df6813048603f0dd04f4280177a11380fbfc861dbcbd7418d62155248dad5fdec0"
-          "991f"),
-      // encoded_message
-      absl::HexStringToBytes(
-          "6e0c464d9c2f9fbc147b43570fc4f238e0d0b38870b3addcf7a4217df912ccef17a7"
-          "f629aa850f63a063925f312d61d6437be954b45025e8282f9c0b1131bc8ff19a8a92"
-          "8d859b37113db1064f92a27f64761c181c1e1f9b251ae5a2f8a4047573b67a270584"
-          "e089beadcb13e7c82337797119712e9b849ff56e04385d144d3ca9d8d92bf78adb20"
-          "b5bbeb3685f17038ec6afade3ef354429c51c687b45a7018ee3a6966b3af15c9ba8f"
-          "40e6461ba0a17ef5a799672ad882bab02b518f9da7c1a962945c2e9b0f02f29b31b9"
-          "cdf3e633f9d9d2a22e96e1de28e25241ca7dd04147112f578973403e0f4fd8086596"
-          "5475d22294f065e17a1c4a201de93bd14223e6b1b999fd548f2f759f52db71964528"
-          "b6f15b9c2d7811f2a0a35d534b8216301c47f4f04f412cae142b48c4cdff78bc54df"
-          "690fd43142d750c671dd8e2e938e6a440b2f825b6dbb3e19f1d7a3c0150428a47948"
-          "037c322365b7fe6fe57ac88d8f80889e9ff38177bad8c8d8d98db42908b389cb5969"
-          "2a58ce275aa15acb032ca951b3e0a3404b7f33f655b7c7d83a2f8d1b6bbff49d5fce"
-          "df2e030e80881aa436db27a5c0dea13f32e7d460dbf01240c2320c2bb5b3225b1714"
-          "5c72d61d47c8f84d1e19417ebd8ce3638a82d395cc6f7050b6209d9283dc7b93fecc"
-          "04f3f9e7f566829ac41568ef799480c733c09759aa9734e2013d7640dc6151018ea9"
-          "02bc"),
-      // blinded_message
-      absl::HexStringToBytes(
-          "10c166c6a711e81c46f45b18e5873cc4f494f003180dd7f115585d871a2893025965"
-          "4fe28a54dab319cc5011204c8373b50a57b0fdc7a678bd74c523259dfe4fd5ea9f52"
-          "f170e19dfa332930ad1609fc8a00902d725cfe50685c95e5b2968c9a2828a21207fc"
-          "f393d15f849769e2af34ac4259d91dfd98c3a707c509e1af55647efaa31290ddf48e"
-          "0133b798562af5eabd327270ac2fb6c594734ce339a14ea4fe1b9a2f81c0bc230ca5"
-          "23bda17ff42a377266bc2778a274c0ae5ec5a8cbbe364fcf0d2403f7ee178d77ff28"
-          "b67a20c7ceec009182dbcaa9bc99b51ebbf13b7d542be337172c6474f2cd3561219f"
-          "e0dfa3fb207cff89632091ab841cf38d8aa88af6891539f263adb8eac6402c41b6eb"
-          "d72984e43666e537f5f5fe27b2b5aa114957e9a580730308a5f5a9c63a1eb599f093"
-          "ab401d0c6003a451931b6d124180305705845060ebba6b0036154fcef3e5e9f9e4b8"
-          "7e8f084542fd1dd67e7782a5585150181c01eb6d90cb95883837384a5b91dbb606f2"
-          "66059ecc51b5acbaa280e45cfd2eec8cc1cdb1b7211c8e14805ba683f9b78824b2eb"
-          "005bc8a7d7179a36c152cb87c8219e5569bba911bb32a1b923ca83de0e03fb10fba7"
-          "5d85c55907dda5a2606bf918b056c3808ba496a4d95532212040a5f44f37e1097f26"
-          "dc27b98a51837daa78f23e532156296b64352669c94a8a855acf30533d8e0594ace7"
-          "c442"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "364f6a40dbfbc3bbb257943337eeff791a0f290898a6791283bba581d9eac90a6376"
-          "a837241f5f73a78a5c6746e1306ba3adab6067c32ff69115734ce014d354e2f259d4"
-          "cbfb890244fd451a497fe6ecf9aa90d19a2d441162f7eaa7ce3fc4e89fd4e76b7ae5"
-          "85be2a2c0fd6fb246b8ac8d58bcb585634e30c9168a434786fe5e0b74bfe8187b47a"
-          "c091aa571ffea0a864cb906d0e28c77a00e8cd8f6aba4317a8cc7bf32ce566bd1ef8"
-          "0c64de041728abe087bee6cadd0b7062bde5ceef308a23bd1ccc154fd0c3a26110df"
-          "6193464fc0d24ee189aea8979d722170ba945fdcce9b1b4b63349980f3a92dc2e541"
-          "8c54d38a862916926b3f9ca270a8cf40dfb9772bfbdd9a3e0e0892369c18249211ba"
-          "857f35963d0e05d8da98f1aa0c6bba58f47487b8f663e395091275f82941830b050b"
-          "260e4767ce2fa903e75ff8970c98bfb3a08d6db91ab1746c86420ee2e909bf681cac"
-          "173697135983c3594b2def673736220452fde4ddec867d40ff42dd3da36c84e3e525"
-          "08b891a00f50b4f62d112edb3b6b6cc3dbd546ba10f36b03f06c0d82aeec3b25e127"
-          "af545fac28e1613a0517a6095ad18a98ab79f68801e05c175e15bae21f821e80c80a"
-          "b4fdec6fb34ca315e194502b8f3dcf7892b511aee45060e3994cd15e003861bc7220"
-          "a2babd7b40eda03382548a34a7110f9b1779bf3ef6011361611e6bc5c0dc851e1509"
-          "de1a"),
-      // signature
-      absl::HexStringToBytes(
-          "6fef8bf9bc182cd8cf7ce45c7dcf0e6f3e518ae48f06f3c670c649ac737a8b8119"
-          "a34d51641785be151a697ed7825fdfece82865123445eab03eb4bb91cecf4d6951"
-          "738495f8481151b62de869658573df4e50a95c17c31b52e154ae26a04067d5ecdc"
-          "1592c287550bb982a5bb9c30fd53a768cee6baabb3d483e9f1e2da954c7f4cf492"
-          "fe3944d2fe456c1ecaf0840369e33fb4010e6b44bb1d721840513524d8e9a3519f"
-          "40d1b81ae34fb7a31ee6b7ed641cb16c2ac999004c2191de0201457523f5a4700d"
-          "d649267d9286f5c1d193f1454c9f868a57816bf5ff76c838a2eeb616a3fc9976f6"
-          "5d4371deecfbab29362caebdff69c635fe5a2113da4d4d8c24f0b16a0584fa05e8"
-          "0e607c5d9a2f765f1f069f8d4da21f27c2a3b5c984b4ab24899bef46c6d9323df4"
-          "862fe51ce300fca40fb539c3bb7fe2dcc9409e425f2d3b95e70e9c49c5feb6ecc9"
-          "d43442c33d50003ee936845892fb8be475647da9a080f5bc7f8a716590b3745c22"
-          "09fe05b17992830ce15f32c7b22cde755c8a2fe50bd814a0434130b807dc1b7218"
-          "d4e85342d70695a5d7f29306f25623ad1e8aa08ef71b54b8ee447b5f64e73d09bd"
-          "d6c3b7ca224058d7c67cc7551e9241688ada12d859cb7646fbd3ed8b34312f3b49"
-          "d69802f0eaa11bc4211c2f7a29cd5c01ed01a39001c5856fab36228f5ee2f2e111"
-          "0811872fe7c865c42ed59029c706195d52"),
-  };
-  return test_vector;
-}
-
-std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector>
-GetIetfRsaBlindSignatureWithPublicMetadataTestVectors() {
-  std::string n = absl::HexStringToBytes(
-      "d6930820f71fe517bf3259d14d40209b02a5c0d3d61991c731dd7da39f8d69821552"
-      "e2318d6c9ad897e603887a476ea3162c1205da9ac96f02edf31df049bd55f142134c"
-      "17d4382a0e78e275345f165fbe8e49cdca6cf5c726c599dd39e09e75e0f330a33121"
-      "e73976e4facba9cfa001c28b7c96f8134f9981db6750b43a41710f51da4240fe0310"
-      "6c12acb1e7bb53d75ec7256da3fddd0718b89c365410fce61bc7c99b115fb4c3c318"
-      "081fa7e1b65a37774e8e50c96e8ce2b2cc6b3b367982366a2bf9924c4bafdb3ff5e7"
-      "22258ab705c76d43e5f1f121b984814e98ea2b2b8725cd9bc905c0bc3d75c2a8db70"
-      "a7153213c39ae371b2b5dc1dafcb19d6fae9");
-  std::string e = absl::HexStringToBytes("010001");
-  std::string d = absl::HexStringToBytes(
-      "4e21356983722aa1adedb084a483401c1127b781aac89eab103e1cfc52215494981d"
-      "18dd8028566d9d499469c25476358de23821c78a6ae43005e26b394e3051b5ca206a"
-      "a9968d68cae23b5affd9cbb4cb16d64ac7754b3cdba241b72ad6ddfc000facdb0f0d"
-      "d03abd4efcfee1730748fcc47b7621182ef8af2eeb7c985349f62ce96ab373d2689b"
-      "aeaea0e28ea7d45f2d605451920ca4ea1f0c08b0f1f6711eaa4b7cca66d58a6b916f"
-      "9985480f90aca97210685ac7b12d2ec3e30a1c7b97b65a18d38a93189258aa346bf2"
-      "bc572cd7e7359605c20221b8909d599ed9d38164c9c4abf396f897b9993c1e805e57"
-      "4d704649985b600fa0ced8e5427071d7049d");
-  std::string p = absl::HexStringToBytes(
-      "dcd90af1be463632c0d5ea555256a20605af3db667475e190e3af12a34a3324c46a3"
-      "094062c59fb4b249e0ee6afba8bee14e0276d126c99f4784b23009bf6168ff628ac1"
-      "486e5ae8e23ce4d362889de4df63109cbd90ef93db5ae64372bfe1c55f832766f21e"
-      "94ea3322eb2182f10a891546536ba907ad74b8d72469bea396f3");
-  std::string q = absl::HexStringToBytes(
-      "f8ba5c89bd068f57234a3cf54a1c89d5b4cd0194f2633ca7c60b91a795a56fa8c868"
-      "6c0e37b1c4498b851e3420d08bea29f71d195cfbd3671c6ddc49cf4c1db5b478231e"
-      "a9d91377ffa98fe95685fca20ba4623212b2f2def4da5b281ed0100b651f6db32112"
-      "e4017d831c0da668768afa7141d45bbc279f1e0f8735d74395b3");
-
-  std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector> test_vectors;
-  // test_vector 1.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      absl::HexStringToBytes("68656c6c6f20776f726c64"),
-      // public_metadata
-      absl::HexStringToBytes("6d65746164617461"),
-      // message_mask
-      absl::HexStringToBytes(
-          "64b5c5d2b2ca672690df59bab774a389606d85d56f92a18a57c42eb4cb164d43"),
-      // blinded_message
-      absl::HexStringToBytes(
-          "1b9e1057dd2d05a17ad2feba5f87a4083cc825fe06fc70f0b782062ea0043fa65ec8"
-          "096ce5d403cfa2aa3b11195b2a655d694386058f6266450715a936b5764f42977c0a"
-          "0933ff3054d456624734fd2c019def792f00d30b3ac2f27859ea56d835f80564a3ba"
-          "59f3c876dc926b2a785378ca83f177f7b378513b36a074e7db59448fd4007b54c647"
-          "91a33b61721ab3b5476165193af30f25164d480684d045a8d0782a53dd73774563e8"
-          "d29e48b175534f696763abaab49fa03a055ec9246c5e398a5563cc88d02eb57d725d"
-          "3fc9231ae5139aa7fcb9941060b0bf0192b8c81944fa0c54568b0ab4ea9c4c4c9829"
-          "d6dbcbf8b48006b322ee51d784ac93e4bf13"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "7ef75d9887f29f2232602acab43263afaea70313a0c90374388df5a7a7440d2584c4"
-          "b4e5b886accc065bf4824b4b22370ddde7fea99d4cd67f8ed2e4a6a2b7b5869e8d4d"
-          "0c52318320c5bf7b9f02bb132af7365c471e799edd111ca9441934c7db76c164b051"
-          "5afc5607b8ceb584f5b1d2177d5180e57218265c07aec9ebde982f3961e7ddaa432e"
-          "47297884da8f4512fe3dc9ab820121262e6a73850920299999c293b017cd800c6ec9"
-          "94f76b6ace35ff4232f9502e6a52262e19c03de7cc27d95ccbf4c381d698fcfe1f20"
-          "0209814e04ae2d6279883015bbf36cabf3e2350be1e175020ee9f4bb861ba409b467"
-          "e23d08027a699ac36b2e5ab988390f3c0ee9"),
-      // signature
-      absl::HexStringToBytes(
-          "abd6813bb4bbe3bc8dc9f8978655b22305e5481b35c5bdc4869b60e2d5cc74b84356"
-          "416abaaca0ca8602cd061248587f0d492fee3534b19a3fe089de18e4df9f3a6ad289"
-          "afb5323d7934487b8fafd25943766072bab873fa9cd69ce7328a57344c2c529fe969"
-          "83ca701483ca353a98a1a9610391b7d32b13e14e8ef87d04c0f56a724800655636cf"
-          "ff280d35d6b468f68f09f56e1b3acdb46bc6634b7a1eab5c25766cec3b5d97c37bbc"
-          "a302286c17ff557bcf1a4a0e342ea9b2713ab7f935c8174377bace2e5926b3983407"
-          "9761d9121f5df1fad47a51b03eab3d84d050c99cf1f68718101735267cca3213c0a4"
-          "6c0537887ffe92ca05371e26d587313cc3f4"),
-  });
-
-  // test_vector 2.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      absl::HexStringToBytes("68656c6c6f20776f726c64"),
-      // public_metadata
-      "",
-      // message_mask
-      absl::HexStringToBytes(
-          "ebb56541b9a1758028033cfb085a4ffe048f072c6c82a71ce21d40842b5c0a89"),
-      // blinded_message
-      absl::HexStringToBytes(
-          "d1fc97f30efbf116fadd9895130cdd55f939211f7db19ce9a85287227a02b33fb698"
-          "b52399f81be0e1f598482000202ec89968085753eae1810f14676b514e08238c8aa7"
-          "9d8b999af54e9f4282c6220d4d760716e48e5413f3228cc59ce10b8252916640de7b"
-          "9b5c7dc9c2bff9f53b4fb5eb4a5f8bab49af3fd1b955d34312073d15030e7fdb44bd"
-          "b23460d1c5662597f9947092def7fff955a5f3e63419ae9858c6405f9609b63c4331"
-          "e0cf90d24c196bee554f2b78e0d8f6da3d4308c8d4ae9fbe18a8bb7fa4fc3b9cacd4"
-          "263e5bd6e12ed891cfdfba8b50d0f37d7a9abe065238367907c685ed2c224924caf5"
-          "d8fe41f5db898b09a0501d318d9f65d88cb8"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "400c1bcdfa56624f15d04f6954908b5605dbeff4cd56f384d7531669970290d70652"
-          "9d44cde4c972a1399635525a2859ef1d914b4130068ed407cfda3bd9d1259790a30f"
-          "6d8c07d190aa98bf21ae9581e5d61801565d96e9eec134335958b3d0b905739e2fd9"
-          "f39074da08f869089fe34de2d218062afa16170c1505c67b65af4dcc2f1aeccd4827"
-          "5c3dacf96116557b7f8c7044d84e296a0501c511ba1e6201703e1dd834bf47a96e1a"
-          "c4ec9b935233ed751239bd4b514b031522cd51615c1555e520312ed1fa43f55d4abe"
-          "b222ee48b4746c79006966590004714039bac7fd18cdd54761924d91a4648e871458"
-          "937061ef6549dd12d76e37ed417634d88914"),
-      // signature
-      absl::HexStringToBytes(
-          "4062960edb71cc071e7d101db4f595aae4a98e0bfe6843aca3e5f48c9dfb46d505e8"
-          "c19806ffa07f040313d44d0996ef9f69a86fa5946cb818a32627fe2df2a0e8035028"
-          "8ae4fedfbee4193554cc1433d9d27639db8b4635265504d87dca7054c85e0c882d32"
-          "887534405e6cc4e7eb4b174383e5ce4eebbfffb217f353102f6d1a0461ef89238de3"
-          "1b0a0c134dfac0d2a8c533c807ccdd557c6510637596a490d5258b77410421be4076"
-          "ecdf2d7e9044327e36e349751f3239681bba10fe633f1b246f5a9f694706316898c9"
-          "00af2294f47267f2e9ad1e61c7f56bf643280258875d29f3745dfdb74b9bbcd5fe3d"
-          "ea62d9be85e2c6f5aed68bc79f8b4a27b3de"),
-  });
-
-  // test_vector 3.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      "",
-      // public_metadata
-      absl::HexStringToBytes("6d65746164617461"),
-      // message_mask
-      absl::HexStringToBytes(
-          "f2a4ed7c5aa338430c7026d7d92017f994ca1c8b123b236dae8666b1899059d0"),
-      // blinded_message
-      absl::HexStringToBytes(
-          "7756a1f89fa33cfc083567e02fd865d07d6e5cd4943f030a2f94b5c23f3fe79c83c4"
-          "9c594247d02885e2cd161638cff60803184c9e802a659d76a1c53340972e62e728cc"
-          "70cf684ef03ce2d05cefc729e6eee2ae46afa17b6b27a64f91e4c46cc12adc58d9cb"
-          "61a4306dac732c9789199cfe8bd28359d1911678e9709bc159dae34ac7aa59fd0c95"
-          "962c9f4904bf04aaba8a7e774735bd03be4a02fb0864a53354a2e2f3502506318a5b"
-          "03961366005c7b120f0e6b87b44bc15658c3e8985d69f6adea38c24fe5e7b4bafa1a"
-          "d6dc7d729281c26dffc88bd34fcc5a5f9df9b9781f99ea47472ba8bd679aaada5952"
-          "5b978ebc8a3ea2161de84b7398e4878b751b"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "2a13f73e4e255a9d5bc6f76cf48dfbf189581c2b170600fd3ab1a3def14884621323"
-          "9b9d0a981537541cb4f481a602aeebca9ef28c9fcdc63d15d4296f85d864f799edf0"
-          "8e9045180571ce1f1d3beff293b18aae9d8845068cc0d9a05b822295042dc56a1a2b"
-          "604c51aa65fd89e6d163fe1eac63cf603774797b7936a8b7494d43fa37039d3777b8"
-          "e57cf0d95227ab29d0bd9c01b3eae9dde5fca7141919bd83a17f9b1a3b401507f3e3"
-          "a8e8a2c8eb6c5c1921a781000fee65b6dd851d53c89cba2c3375f0900001c0485594"
-          "9b7fa499f2a78089a6f0c9b4d36fdfcac2d846076736c5eaedaf0ae70860633e51b0"
-          "de21d96c8b43c600afa2e4cc64cd66d77a8f"),
-      // signature
-      absl::HexStringToBytes(
-          "67985949f4e7c91edd5647223170d2a9b6611a191ca48ceadb6c568828b4c415b627"
-          "0b037cd8a68b5bca1992eb769aaef04549422889c8b156b9378c50e8a31c07dc1fe0"
-          "a80d25b870fadbcc1435197f0a31723740f3084ecb4e762c623546f6bd7d072aa565"
-          "bc2105b954244a2b03946c7d4093ba1216ec6bb65b8ca8d2f3f3c43468e80b257c54"
-          "a2c2ea15f640a08183a00488c7772b10df87232ee7879bee93d17e194d6b703aeceb"
-          "348c1b02ec7ce202086b6494f96a0f2d800f12e855f9c33dcd3abf6bd8044efd69d4"
-          "594a974d6297365479fe6c11f6ecc5ea333031c57deb6e14509777963a25cdf8db62"
-          "d6c8c68aa038555e4e3ae4411b28e43c8f57"),
-  });
-
-  // test_vector 4.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      "",
-      // public_metadata
-      "",
-      // message_mask
-      absl::HexStringToBytes(
-          "ba3ea4b1e475eebe11d4bfe3a48521d3ba8cd62f3baed9ec29fbbf7ff0478bc0"),
-      // blinded_message
-      absl::HexStringToBytes(
-          "99d725c5613ff87d16464b0375b0976bf4d47319d6946e85f0d0c2ca79eb02a4c0c2"
-          "82642e090a910b80fee288f0b3b6777e517b757fc6c96ea44ac570216c8fcd868e15"
-          "da4b389b0c70898c5a2ed25c1d13451e4d407fe1301c231b4dc76826b1d4cc5e64b0"
-          "e28fb9c71f928ba48c87e308d851dd07fb5a7e0aa5d0dce61d1348afb4233355374e"
-          "5898f63adbd5ba215332d3329786fb7c30ef04c181b267562828d8cf1295f2ef4a05"
-          "ef1e03ed8fee65efb7725d8c8ae476f61a35987e40efc481bcb4b89cb363addfb2ad"
-          "acf690aff5425107d29b2a75b4665d49f255c5caa856cdc0c5667de93dbf3f500db8"
-          "fcce246a70a159526729d82c34df69c926a8"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "a9678acee80b528a836e4784f0690fdddce147e5d4ac506e9ec51c11b16ee2fd5a32"
-          "e382a3c3d276a681bb638b63040388d53894afab79249e159835cd6bd65849e5d139"
-          "7666f03d1351aaec3eae8d3e7cba3135e7ec4e7b478ef84d79d81039693adc6b130b"
-          "0771e3d6f0879723a20b7f72b476fe6fef6f21e00b9e3763a364ed918180f939c351"
-          "0bb5f46b35c06a00e51f049ade9e47a8e1c3d5689bd5a43df20b73d70dcacfeed9fa"
-          "23cabfbe750779997da6bc7269d08b2620acaa3daa0d9e9d4b87ef841ebcc06a4c0a"
-          "f13f1d13f0808f512c50898586b4fc76d2b32858a7ddf715a095b7989d8df50654e3"
-          "e05120a83cec275709cf79571d8f46af2b8e"),
-      // signature
-      absl::HexStringToBytes(
-          "ba57951810dbea7652209eb73e3b8edafc56ca7061475a048751cbfb995aeb4ccda2"
-          "e9eb309698b7c61012accc4c0414adeeb4b89cd29ba2b49b1cc661d5e7f30caee7a1"
-          "2ab36d6b52b5e4d487dbff98eb2d27d552ecd09ca022352c9480ae27e10c3a49a1fd"
-          "4912699cc01fba9dbbfd18d1adcec76ca4bc44100ea67b9f1e00748d80255a03371a"
-          "7b8f2c160cf632499cea48f99a6c2322978bd29107d0dffdd2e4934bb7dc81c90dd6"
-          "3ae744fd8e57bff5e83f98014ca502b6ace876b455d1e3673525ba01687dce998406"
-          "e89100f55316147ad510e854a064d99835554de8949d3662708d5f1e43bca473c14a"
-          "8b1729846c6092f18fc0e08520e9309a32de"),
-  });
-  return test_vectors;
-}
-
-std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector>
-GetIetfPartiallyBlindRSASignatureNoPublicExponentTestVectors() {
-  std::string n = absl::HexStringToBytes(
-      "d6930820f71fe517bf3259d14d40209b02a5c0d3d61991c731dd7da39f8d69821552"
-      "e2318d6c9ad897e603887a476ea3162c1205da9ac96f02edf31df049bd55f142134c"
-      "17d4382a0e78e275345f165fbe8e49cdca6cf5c726c599dd39e09e75e0f330a33121"
-      "e73976e4facba9cfa001c28b7c96f8134f9981db6750b43a41710f51da4240fe0310"
-      "6c12acb1e7bb53d75ec7256da3fddd0718b89c365410fce61bc7c99b115fb4c3c318"
-      "081fa7e1b65a37774e8e50c96e8ce2b2cc6b3b367982366a2bf9924c4bafdb3ff5e7"
-      "22258ab705c76d43e5f1f121b984814e98ea2b2b8725cd9bc905c0bc3d75c2a8db70"
-      "a7153213c39ae371b2b5dc1dafcb19d6fae9");
-  std::string e = absl::HexStringToBytes("010001");
-  std::string d = absl::HexStringToBytes(
-      "4e21356983722aa1adedb084a483401c1127b781aac89eab103e1cfc52215494981d"
-      "18dd8028566d9d499469c25476358de23821c78a6ae43005e26b394e3051b5ca206a"
-      "a9968d68cae23b5affd9cbb4cb16d64ac7754b3cdba241b72ad6ddfc000facdb0f0d"
-      "d03abd4efcfee1730748fcc47b7621182ef8af2eeb7c985349f62ce96ab373d2689b"
-      "aeaea0e28ea7d45f2d605451920ca4ea1f0c08b0f1f6711eaa4b7cca66d58a6b916f"
-      "9985480f90aca97210685ac7b12d2ec3e30a1c7b97b65a18d38a93189258aa346bf2"
-      "bc572cd7e7359605c20221b8909d599ed9d38164c9c4abf396f897b9993c1e805e57"
-      "4d704649985b600fa0ced8e5427071d7049d");
-  std::string p = absl::HexStringToBytes(
-      "dcd90af1be463632c0d5ea555256a20605af3db667475e190e3af12a34a3324c46a3"
-      "094062c59fb4b249e0ee6afba8bee14e0276d126c99f4784b23009bf6168ff628ac1"
-      "486e5ae8e23ce4d362889de4df63109cbd90ef93db5ae64372bfe1c55f832766f21e"
-      "94ea3322eb2182f10a891546536ba907ad74b8d72469bea396f3");
-  std::string q = absl::HexStringToBytes(
-      "f8ba5c89bd068f57234a3cf54a1c89d5b4cd0194f2633ca7c60b91a795a56fa8c868"
-      "6c0e37b1c4498b851e3420d08bea29f71d195cfbd3671c6ddc49cf4c1db5b478231e"
-      "a9d91377ffa98fe95685fca20ba4623212b2f2def4da5b281ed0100b651f6db32112"
-      "e4017d831c0da668768afa7141d45bbc279f1e0f8735d74395b3");
-
-  std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector> test_vectors;
-  // test_vector 1.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      absl::HexStringToBytes("68656c6c6f20776f726c64"),
-      // public_metadata
-      absl::HexStringToBytes("6d65746164617461"),
-      // message_mask
-      "",
-      // blinded_message
-      absl::HexStringToBytes(
-          "cfd613e27b8eb15ee0b1df0e1bdda7809a61a29e9b6e9f3ec7c345353437638e8559"
-          "3a7309467e36396b0515686fe87330b312b6f89df26dc1cc88dd222186ca0bfd4ffa"
-          "0fd16a9749175f3255425eb299e1807b76235befa57b28f50db02f5df76cf2f8bcb5"
-          "5c3e2d39d8c4b9a0439e71c5362f35f3db768a5865b864fdf979bc48d4a29ae9e7c2"
-          "ea259dc557503e2938b9c3080974bd86ad8b0daaf1d103c31549dcf767798079f888"
-          "33b579424ed5b3d700162136459dc29733256f18ceb74ccf0bc542db8829ca5e0346"
-          "ad3fe36654715a3686ceb69f73540efd20530a59062c13880827607c68d00993b47a"
-          "d6ba017b95dfc52e567c4bf65135072b12a4"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "ca7d4fd21085de92b514fbe423c5745680cace6ddfa864a9bd97d29f3454d5d475c6"
-          "c1c7d45f5da2b7b6c3b3bc68978bb83929317da25f491fee86ef7e051e7195f35586"
-          "79b18d6cd3788ac989a3960429ad0b7086945e8c4d38a1b3b52a3903381d9b1bf9f3"
-          "d48f75d9bb7a808d37c7ecebfd2fea5e89df59d4014a1a149d5faecfe287a3e9557e"
-          "f153299d49a4918a6dbdef3e086eeb264c0c3621bcd73367195ae9b14e67597eaa9e"
-          "3796616e30e264dc8c86897ae8a6336ed2cd93416c589a058211688cf35edbd22d16"
-          "e31c28ff4a5c20f1627d09a71c71af372edc18d2d7a6e39df9365fe58a34605fa1d9"
-          "dc53efd5a262de849fb083429e20586e210e"),
-      // signature
-      absl::HexStringToBytes(
-          "cdc6243cd9092a8db6175b346912f3cc55e0cf3e842b4582802358dddf6f61decc37"
-          "b7a9ded0a108e0c857c12a8541985a6efad3d17f7f6cce3b5ee20016e5c36c7d552c"
-          "8e8ff6b5f3f7b4ed60d62eaec7fc11e4077d7e67fc6618ee092e2005964b8cf394e3"
-          "e409f331dca20683f5a631b91cae0e5e2aa89eeef4504d24b45127abdb3a79f9c71d"
-          "2f95e4d16c9db0e7571a7f524d2f64438dfb32001c00965ff7a7429ce7d26136a36e"
-          "be14644559d3cefc477859dcd6908053907b325a34aaf654b376fade40df4016ecb3"
-          "f5e1c89fe3ec500a04dfe5c8a56cad5b086047d2f963ca73848e74cf24bb8bf1720c"
-          "c9de4c78c64449e8af3e7cddb0dab1821998"),
-  });
-
-  // test_vector 2.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      absl::HexStringToBytes("68656c6c6f20776f726c64"),
-      // public_metadata
-      "",
-      // message_mask
-      "",
-      // blinded_message
-      absl::HexStringToBytes(
-          "5e6568cd0bf7ea71ad91e0a9708abb5e97661c41812eb994b672f10aa8983151113a"
-          "eaabcf1306fa5a493e3dbdd58fc8bdb61aac934fae832676bcab7abacdcc1b9c1f2a"
-          "f3586ae009042293b6945fee0aeffb2d2b8a24f82614b8be39bab71a535f6d65f163"
-          "1e927dbd471b0753e7a63a201c7ecd26e7fbbb5e21e02f865b64e20731004c395b0e"
-          "059a92fffa4c636ac4c00db9aa086b5dd1a3dd101bb04970b12ca3f4936f246e32d3"
-          "94f328cea2510554060e8d291acdbee04b8bc91e967241ba45f3509d63ded5f9b358"
-          "f4216f37a885e563b7baa93a717ca7cdbe10e398d14bb2d5a1376b4a5f83226ce2c5"
-          "75087bc28d743caeff9c1b11cc8bd02f5f14"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "72c4e0f4f677aa1dbb686e23b5944b3afdc7f824711a1f7486d1ed6fa20aad255a14"
-          "12885aee04c64359964e694a713da2a1684325c1c31401cac1ea39a9e454675b55f7"
-          "43ff144ac605d0ed254b12d9bdd43b0e8a17c0d4711239732e45e4166261d0b16d2f"
-          "29403c5f2584a29b225daa7530ba15fc9af15ed2ce8fcb126ad0b0758fd522fbf99a"
-          "83e4cfe0539aa264d06a1633deee0053f45fc8a944f1468a0c0c449155139779a323"
-          "0c8fa41a81858418151fa195f57ea645699f550d3cb37c549542d436071d1af74e62"
-          "9f938fa4717ca9def382fc35089e4caec9e5d740c38ecb2aa88c90176d2f322866ac"
-          "fd50e2b92313161e81327f889aca0c94bcb8"),
-      // signature
-      absl::HexStringToBytes(
-          "a7ace477c1f416a40e93ddf8a454f9c626b33c5a20067d81bdfef7b88bc15de2b046"
-          "24478b2134b4b23d91285d72ca4eb9c6c911cd7be2437f4e3b24426bce1a1cb52e2c"
-          "8a4d13f7fd5c9b0f943b92b8bbcba805b847a0ea549dbc249f2e812bf03dd6b2588c"
-          "8af22bf8b6bba56ffd8d2872b2f0ebd42ac8bd8339e5e63806199deec3cf392c078f"
-          "66e72d9be817787d4832c45c1f192465d87f6f6c333ce1e8c5641c7069280443d222"
-          "7f6f28ff2045acdc368f2f94c38a3c909591a27c93e1778630aeeeb623805f37c575"
-          "213091f096be14ffa739ee55b3f264450210a4b2e61a9b12141ca36dd45e3b81116f"
-          "c286e469b707864b017634b8a409ae99c9f1"),
-  });
-
-  // test_vector 3.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      "",
-      // public_metadata
-      absl::HexStringToBytes("6d65746164617461"),
-      // message_mask
-      "",
-      // blinded_message
-      absl::HexStringToBytes(
-          "92d5456738e0cfe0fa770b51e6a72d633d7cec3a945459f1db96dbc500a5d1bca34a"
-          "839059579759301c098231b102fb1e114bf9f892f42f902a336f4a3585b23efa906d"
-          "fcb94213f4d3b39951551cedecbf51efa213ad030cf821ee3fa46a57d67429f838ff"
-          "728f47111f7f1b22000a979c0f56cc581396935780d76173410d2a8a5688cd596229"
-          "03008fe50af1fcc5e7cf96affad7e60fbed67996c7a377effa0f08d9273cd33536b2"
-          "625c9575d10636cc964636a1500f4fcb22aabbef77fe415cbc7245c1032d34bd480e"
-          "e338f55be0a79c0076d9cf9c94c0db3003a33b23c62dbd1a85f2b15db5d153b318cc"
-          "a53c6d68e1e63bafa39c9a43be72f36d2569"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "a76a1c53566a9781de04d87e8c3a0bc902b47819e7b900580654215b0a710cb563b0"
-          "85b5e9fff150791f759da03a139dfc9159c21410f1e3d345b8c5dcca35211772900f"
-          "85c5eec065987cbdbf303e9651196223263a713e4135d6b20bfa8fb8212341665647"
-          "a9a7e07a831ccbf9e62d9366ec9ac0bbe96228e6fbb848f8f6f474cce68e3556dc88"
-          "2847e9e61b5b5e02bbfd6152aeca74e8782a54ffe6552d63fb837738a05044b38f7e"
-          "908c4989b202bd858695c61e12cf9d47ef276a17917e39f942871defd9747541957b"
-          "1e2f8950da43c9a05ba4835bded23c24cf64edfee10dd0c70b071427cfcbb8b5eb22"
-          "5daf149a6b4d42bebcc536380a9d753a8b1e"),
-      // signature
-      absl::HexStringToBytes(
-          "02bc0f2728e2b8cd1c1b9873d4b7f5a62017430398165a6f8964842eaa19c1de2922"
-          "07b74dc25ee0aa90493216d3fbf8e1b2947fd64335277b34767f987c482c69262967"
-          "c8a8aaf180a4006f456c804cdc7b92d956a351ad89703cc76f69ed45f24d68e1ae03"
-          "61479e0f6faf10c3b1582de2dcd2af432d57c0c89c8efb1cf3ac5f991fe9c4f0ad24"
-          "473939b053674a2582518b4bd57da109f4f37bc91a2f806e82bb2b80d486d0694e66"
-          "3992c9517c946607b978f557bbb769d4cd836d693c77da480cd89b916e5e4190f317"
-          "711d9c7e64528a314a14bf0b9256f4c60e9ddb550583c21755ab882bdfdf22dc8402"
-          "49389b1e0a2189f58e19b41c5f313cddce29"),
-  });
-
-  // test_vector 4.
-  test_vectors.push_back({
-      n,
-      e,
-      d,
-      p,
-      q,
-      // message
-      "",
-      // public_metadata
-      "",
-      // message_mask
-      "",
-      // blinded_message
-      absl::HexStringToBytes(
-          "ba562cba0e69070dc50384456391defa410d36fa853fd235902ff5d015d688a44def"
-          "6b6a7e71a69bff8ee510f5a9aa44e9afddd3e766f2423b3fc783fd1a9ab618586110"
-          "987c1b3ddce62d25cae500aa92a6b886cb609829d06e67fbf28fbbf3ee7d5cc12548"
-          "1dd002b908097732e0df06f288cc6eb54565f8153d480085b56ab6cb5801b482d12f"
-          "50558eb3cb0eb7a4ff8fcc54d4d7fcc2f8913a401ae1d1303ead7964f2746e4804e2"
-          "848bba87f53cf1412afedc82d9c383dd095e0eb6f90cc74bc4bb5ea7529ded9cde2d"
-          "489575d549b884379abe6d7b71969e6a9c09f1963d2719eefccd5f2a407845961ccc"
-          "1fa580a93c72902b2499d96f89e6c53fc888"),
-      // blinded_signature
-      absl::HexStringToBytes(
-          "280c5934022fd17f7f810d4f7adf1d29ced47d098834411d672163cc793bcaad239d"
-          "07c4c45048a682995950ce84703064cd8c16d6f2579f7a65b66c274faccc6c73c9d2"
-          "99dcf35c96338c9b81af2f93554a78528551e04be931c8502ee6a21ef65d1fa3cd04"
-          "9a993e261f85c841b75857d6bf02dd4532e14702f8f5e1261f7543535cdf9379243b"
-          "5b8ca5cd69d2576276a6c25b78ab7c69d2b0c568eb57cf1731983016dece5b59e753"
-          "01ca1a148154f2592c8406fee83a434f7b3192649c5be06000866ff40bf09b558c7a"
-          "f4bbb9a79d5d13151e7b6e602e30c4ab70bbbce9c098c386e51b98aefab67b8efc03"
-          "f048210a785fd538ee6b75ecd484c1340d91"),
-      // signature
-      absl::HexStringToBytes(
-          "b7d45ec4db11f9b74a6b33806e486f7ee5f87c4fa7c57d08caf0ca6d3ba55e66bf07"
-          "69c84b9187b9a86e49ba0cb58348f01156ac5bc2e9570fe0a8c33d0ad049a965aeb2"
-          "a8d8a3cbb30f89a3da6732a9bb3d9415141be4e9052f49d422301a9cfce49947db7d"
-          "52a1c620b7106ae43afbcb7cb29b9c215e0c2b4cf8d62db67224dd3de9f448f7b660"
-          "7977c608595d29380b591a2bff2dff57ea2c77e9cdf69c1821ff183a7626d45bbe11"
-          "97767ac577715473d18571790b1cf59ee35e64362c826246ae83923d749117b7ec1b"
-          "4478ee15f990dc200745a45f175d23c8a13d2dbe58b1f9d10db71917708b19eeeab2"
-          "30fe6026c249342216ee785d9422c3a8dc89"),
-  });
-  return test_vectors;
-}
-
-std::string RandomString(int n, std::uniform_int_distribution<int>* distr_u8,
-                         std::mt19937_64* generator) {
-  std::string rand(n, 0);
-  for (int i = 0; i < n; ++i) {
-    rand[i] = static_cast<uint8_t>((*distr_u8)(*generator));
-  }
-  return rand;
-}
-
-std::pair<anonymous_tokens::TestRsaPublicKey,
-          anonymous_tokens::TestRsaPrivateKey>
-GetStrongTestRsaKeyPair2048() {
-  anonymous_tokens::TestRsaPublicKey public_key = {
-      /*n=*/
-      absl::HexStringToBytes(
-          "b31928fd04c205d364cab9f7a5620dd8db9992dfaa41c1d29b11df91204ddc0d28a5"
-          "869cfc4c8ee2fca229c487b0f529c7d782303d4f5b9d85019031b159e4a7ad7d172c"
-          "cd73915f10550a7f19d63bfe438d6801a226dedc054bee2958c599cfd8513ed26ae2"
-          "9a5521f6ab7ae4991404b6888d60a76eadec189492a988e4c941d3ffd8feb7bdf715"
-          "ec0ceaf53707d83e3cc743ec3b7d88d5dc46b615a63d4fee9a0a391546069b811e29"
-          "095d5a1319fbb70248c35711a46d3c16f1444be285aeddb33256ca775562e755ac94"
-          "49bfec12cdd099c8dac96b3469764c474a88bc7e1dd19db68e9275606a8142861655"
-          "4a918a951bde14ee093dbdbdbbd0892486f9"),
-      /*e=*/absl::HexStringToBytes("010001")};
-  anonymous_tokens::TestRsaPrivateKey private_key = {
-      public_key.n, public_key.e,
-      /*d=*/
-      absl::HexStringToBytes(
-          "1bcda61d5165c57dc1c1ef08d0f5ddec727aeee026103b44b4aa1ba8edf8e8566a9e"
-          "f7bcdb360f609193a3244d645d4af529319ec785d0552dd6c649d09c81f0bdf0136e"
-          "f31e23cd3c3dd7794fcb8058c2a7eb2385c6bf062d14528ebca7406f91c75b17535c"
-          "8654fd06cc2c31dcc9ccc9817d6129dcf6c71631ca6ae3439132921a9c18111b4b11"
-          "b421868feac7c9ed6c73c437a24dbc5b364790cf4e7ac1573e72bab1b1e456b55e2e"
-          "a0a673986f2305c50122ba924db6d281a5e3efc6c03d0fdc690d4d8e4fb5f45a1c4c"
-          "e5c4595fde5563e8be01170e6e7ef6396bd8d435a14028748d4ef182fbffcc4aa1b9"
-          "9f86a6155cd26da9bb218a1e3b2cdce38e19"),
-      /*p=*/
-      absl::HexStringToBytes(
-          "edec7eb7cca858e3fc1c0f4eef5f4574216c96614d3bdee1830930a0036f85f277eb"
-          "6ff33a757fcf6323325b1967eae0f802dffd2a79c2c222f17c6378bc8d08e3d6ba97"
-          "5e13c62e5b93e2bb561fb1587dfeb14b20cf5cce9f4518b8eb052c8e48c0b891dd94"
-          "fa2fef904d45ffe00f7a1a8e77c3c34e337612eba4b40a16078f"),
-      /*q=*/
-      absl::HexStringToBytes(
-          "c0b4895d14c4e4aca5eee0bf0e58b0da5a210a2793ca06ba8f6b8a6b70202cabc545"
-          "c220922f02ca849f4ee79313e3fbdfdbdb85367b307f8fe663e108d3bdac4399836e"
-          "225f1956c3d112167f24db0e429a71d2ad191465f3b99cd3370bfd7b3e8d1a5e5e78"
-          "8dcfab21ddb00f1aaa73d7cb62f0228449a51d032c9f636b04f7"),
-      /*dp=*/
-      absl::HexStringToBytes(
-          "2707b7d5f105e0e72d9170d573213ee48923261c3a2e4b26d5772979e6766213dfa6"
-          "48cc2ed7ddaaa8c9ba560579eda710287094386697137fe5fb90d9da9c8c4bcc0afa"
-          "0fddd0920445e358f60ce6ebec675eb04366a103e84ece7a6f5b7eeeac72a9148cb4"
-          "06c2dc5ae0c24df274b78429c0ede5592bc9ffda963f4eb44473"),
-      /*dq=*/
-      absl::HexStringToBytes(
-          "22c0ac41201cbe0cb0c41abdf9ed5ebf921f81404ff3d030d6ea9304fb2ca241bc0a"
-          "ef8e862e7a3761a1854e5804ef499e3e7d215208f75f19e977bbbea6c8ff0715e950"
-          "f45be82af09784c68fd96ab3f0a8ffbbf9c19b1f23cc268f24cf41c07730653ffd93"
-          "8a27987a3c0ba33db0ddc15e0992baf6d67d33753e17e48b0953"),
-      /*crt=*/
-      absl::HexStringToBytes(
-          "29402f48481599b7e44c7ab9f0cfc673266dfd9ff0e2d7f9f40b6b1d8061808eb631"
-          "935fd5c1e536dd99266d79c04842b121adf361e8c7a8bc04fdb7c5ad053a8b9117cf"
-          "2068142e117bdda6d2a5a01ff8f0ba28d42287612c35e5ff267a20b5da454205cdf6"
-          "d24d22d4968511c16b0f1a1e55865d0b5ace0beaae0ba3bbd68e")};
-  return std::make_pair(public_key, private_key);
-}
-
-std::pair<anonymous_tokens::TestRsaPublicKey,
-          anonymous_tokens::TestRsaPrivateKey>
-GetAnotherStrongTestRsaKeyPair2048() {
-  anonymous_tokens::TestRsaPublicKey public_key = {
-      /*n=*/
-      absl::HexStringToBytes(
-          "cfe2049a15de49dd75e828eb8f5321b44f3d4169f53f9b58b37f1aba52f87ea749b8"
-          "30284857eab7f0ea3bac6b866e5f485be31cea03a7ff2c0ba7cfdbe6f070fc49e37e"
-          "28f2afe90b61e12a877febb1d4ba6fc0932df332afe51e8fa702a762b944a3f80a5f"
-          "ea2612cc75c59400e00df62ba4be83cc50198c39b6ac4bc6a5b4f6edaf0bdeac025d"
-          "6dd03d9f0f7c2127cf3c046a7e4e7cc7bc33f246f52408df49b29696d994e190076a"
-          "78142cd353c4d5fe38d9708466e49131efa416d35218cde5c380d548599b8ce39a9e"
-          "fcfe04df6aa317e122ac981346dbde6af84544d8f04e1c19749e6a8fb1efff4b3c3d"
-          "c3d7d2c95eefc1acd2dd80b5ff585eabfb09"),
-      /*e=*/absl::HexStringToBytes("010001")};
-  anonymous_tokens::TestRsaPrivateKey private_key = {
-      public_key.n, public_key.e,
-      /*d=*/
-      absl::HexStringToBytes(
-          "1176a1bf55fdf603922f9e1c67ce6a82ecb32f271910ae5aadbd8c3fc1cf99483163"
-          "b53bf513d9a679291c393851333d72e53137911b1c864dab6efe01b1ad5a387f768a"
-          "7723280ef24357388ce87ca2d4459334c0c877e936a88f402f1e0474c12e987db255"
-          "6b64a668a1ae26e849ea325769400def607d3cefee3e1c218472ffea639163dd7e80"
-          "2b20e35b3d0cd7c11229cde6ad4d73cb097c1b348f5586585d2727ff62789385665d"
-          "11b16eceffd85582b58a858ca356d7011bb5e4777bf3b67fef77cc528c56a147d6d7"
-          "229398bb7bb057139a9b9e7d33e5ac6f302c538b4c81901ef28adb6c530cd549d61e"
-          "c78e9402fb0deaab176027fda9b0801403e7"),
-      /*p=*/
-      absl::HexStringToBytes(
-          "fda22fbc727c67fa8b5c72c54bf5136a564de2f46697f1953f751da1cc5bde428f5a"
-          "5f7007c775a14ab25d1b6996b374bfc1df6665b8e9d2914754ad1a3cebd8bf6da17e"
-          "9ea0a98d289e609681fd295500d0803522696662a1564eb6d4f1422db8d8da48826d"
-          "f937cd19176e41889481d1309086aee3968c2692dd893f59288b"),
-      /*q=*/
-      absl::HexStringToBytes(
-          "d1d28de5df823cea723f6979d73d44d86c202328cd4914abffd7b2e11245c075d4e5"
-          "01dca7b90249bdb273fe6f78dbc4fdf0229dcb333b9fc24ec6ffd02fcda1a8fa788e"
-          "3b49f0376be5ce222ccdf92e17e651a5a53507d9687f62835b08825f53f7e3d760e9"
-          "8e83533e71721b10cd8832dc1c471875655d66cb19e58bb0493b"),
-      /*dp=*/
-      absl::HexStringToBytes(
-          "8d8e547827a9795ae326e0c36ec64464c7f04667c34eb03d6d224f3c7b5316b42d4f"
-          "f20e13b965d4745d220be79d7d60fe9914b710b4e8836623da85962c44313f7dcf71"
-          "5cd52c6c252c6799f8c8b3a5c68397da8fef257e8caf1fd578f981c704f0babb5758"
-          "4b8cb2427bca447716f3712e5aab60b692d27bc0e235f48e2d4b"),
-      /*dq=*/
-      absl::HexStringToBytes(
-          "72c12850379ca03a4cffb76d26b5e0a849028e982b26340319eadb6f533208dfa8ef"
-          "12c49e8a85e0d4b9fbcc8524e1756cb8e005d2f393417de0dddf5cfa380999445b98"
-          "d67e4abdd4ea1b81ff652b49f55247074442aba7510a92536aff4d665ba330de43a7"
-          "9904e40b3bba7f69022fe23915d220635c6be7e35ea7776d93af"),
-      /*crt=*/
-      absl::HexStringToBytes(
-          "6b7f1d159c6be9a9c4d6d4171f6e90b3c9d40abee51b891f538a653c06da423ece64"
-          "7713a6192babbdc8580cfa941f4cc88952f982fe197fd2fcd29d0b6b01960361419a"
-          "74182cc94acaac94ad88b000677bba8f97f4ba362019a0fe1ffeb64691ca17039ebd"
-          "6ad5fec8269090d2163b54ca25f4840f46f0395fdfec83cac4eb")};
-  return std::make_pair(public_key, private_key);
-}
-
-std::pair<anonymous_tokens::TestRsaPublicKey,
-          anonymous_tokens::TestRsaPrivateKey>
-GetStrongTestRsaKeyPair3072() {
-  anonymous_tokens::TestRsaPublicKey public_key = {
-      /*n=*/
-      absl::HexStringToBytes(
-          "bd8be57544c2b43220d80b377fa22d69226e968b9f04e321e7c9e82ec4a4849386d2"
-          "c4377cf2b8ec93145fbebb6f4508266169e4a83b37671f28285fe91c75a4b721804e"
-          "71a7eaea97d42cd3055e4e46e78ed10898472f92c61d981d1df20d55f89e0558eb95"
-          "a13f5f8ae04aa2cbfbf99c4599702b1498ab337fe36396a39a073c5d5dbedf557e6d"
-          "245f807c28a4c2f44197ae256190d9a410392ede4fdf9d337fc201bb26447fabc442"
-          "b19c79c531e12922a90bada53615b12e9a54ecb033f9a22be859984e296d632c9eb2"
-          "87825bb4bfb7f3d16c4f2ba30b2ca5a04512e62c993351c7039a64d865ba49eb960b"
-          "176dbe7c4853db37911f7bae782732441e428992422754ca3d78a20e9cedbafa8ec2"
-          "460403997c381772be64b72133c1585b0d1fe5e96a3f7e2388228826989766da37f9"
-          "949d1040230cb78f88005e5e92796a285b3acdd90733ed4a111d35f4632eda15dc66"
-          "9e595380331acab1e98cf872126dac05c2d7a7beff889ff39ea60cf7ac69f62bd35e"
-          "6c2ff193c9037d0f500d"),
-      /*e=*/absl::HexStringToBytes("010001")};
-  anonymous_tokens::TestRsaPrivateKey private_key = {
-      public_key.n, public_key.e,
-      /*d=*/
-      absl::HexStringToBytes(
-          "2de57b093b3e1e1de94006ef48537fc56e55f2d41a0c37e754d5da07c10bc92263ca"
-          "134310594197df4156b1bb7704f3253fff4123cf3aea186c43e27d72abb5d7b61ff8"
-          "5ea2f74a18bb82a31230b4a98c96535d4e6a2645d6fd0181436801fca837b339c5c9"
-          "b482c0e2c2ceafbecee3b108555008ce72ed398a25084f488c1a666e812d9fac76f1"
-          "7c96376958fa144ecab72caed68219811580932db78f80e420725cb2f16032bde7c6"
-          "f274de3376917bc16dc76b238f060fa226329c214a642417795cc3efa5337b1b89d6"
-          "b14ac31e681c2e2a8962c086feaf590eb54769d05d5eaa2b96113ab27fd8ecca8e5a"
-          "c717604af7c9e2572f05859d22b5658ba76206ca3f5a8c780bc664f5448927348427"
-          "ac08e5713ebe160d2a4968093fad401547669487775baf5c5605cff96e8170e5cde4"
-          "eab215ee05d3a8a3416426573f2026157aaea1b8626102e969cb7fdfa67d4585d497"
-          "0dd708308a6bd7f1cad1bc916ae3e8be82f2a9444a43cd171ad636f62b5c5b76d970"
-          "9c39ae36f03ec6bbceed"),
-      /*p=*/
-      absl::HexStringToBytes(
-          "e9ca59fe1ddb5c5050192692145220e04623867aff99f70a0224c11144c167dc79f2"
-          "1df61b64c378c82940b78dd5608ff07a00bb83261e6f328ddea1f53a40a7b9a6bc97"
-          "02e05afd1717456416f26b199cdb704d0d5b555deaf4d1d6e738b86db8096fc57c4d"
-          "3c8cd3b510a6d5fa90c05135aec2dc161fd9e38771b7f4d26ff0e8a1d0ec0dd4d832"
-          "128df1adbdf33125f723717efe947c65539ddeadc95e8960b79f0c77ec8761c38bce"
-          "d50a76f145176c0b5dace6b7e3aa0b2ba16646357ec3"),
-      /*q=*/
-      absl::HexStringToBytes(
-          "cf8d8e9c9102b69b76e28aa06431c177320e8ae147db85432507d51a68c587ac5481"
-          "97cc73666ae65ba4de3c5a974a4344f1f804969431537ff31e3f23f3cc50f90d69b4"
-          "f994b41040aef3072b2cf2679094860924a6404b7196386463a074a6fd1b0b4bfcbc"
-          "ab82f81549f44a65ff33a6ce5788fc1a7710759ca59c2040c21f1c97d66ee0f110c4"
-          "f37da1c07508b0e60ea1878ea6133ddf8ba4b29fc1761e5b43b7830ab87768058eec"
-          "47c22a3ff8bbde4f6b10849b78daa6a072c30f7aa8ef"),
-      /*dp=*/
-      absl::HexStringToBytes(
-          "65203e25094d257527f0791a9ee79788eb4dda91c1961ba19ca3c14f72ea25bedc90"
-          "ba1d066463990f1ba8febcbf1b71a7975e51bdbcf3552e0ce7cc2e82f00c9ce55e96"
-          "038c804f1179e36e13eef01cb818c34ed1043cbccf30eec38268aa7deb2949cba6a4"
-          "d218284b1dd4cca20192ee8dc5f64bb4d63a2d8d1cc77182c520f3bf6adb70702cc4"
-          "1bfa821ba11a5c9c0b76ad553d51852d5f29de7455b22ac2472ae8fdc6b618b7b8f5"
-          "d2792051e48ce9135185c496ae4793655fff19477279"),
-      /*dq=*/
-      absl::HexStringToBytes(
-          "1d4340102301d6ed245ddc5db0c2b31c331a89ca296f71e27d9e15159c1ffd78f691"
-          "2eedcc776c2afe50c8648a013a9f31614c2e996c5b68026a2ca18a581d3e6d5ecec0"
-          "8d4fc1f368ab41e888d5d5777492fc32ddcff2d0b03b15c851a395ced570b2af0bfb"
-          "2dd35156ef0e5a4ef72439286e7f09cc516d28a7e55195da8b84076c00f7b10f4be5"
-          "f8ce85b7b4c87ce872b7a37d213d25441754293b0cf3b263fbb02bf19f0076d211cc"
-          "8e7179b37b464199c0e69b4bb04663a7cb8664f04e51"),
-      /*crt=*/
-      absl::HexStringToBytes(
-          "b5b84f7c4868e4de55d37efe7ada9865b0cc73b4b08e111cb8502b39210b17d81a54"
-          "2ea793b970d03557c30b5243e066c7ff46e3abfcf3972a9a6199927d05f64fefb7ef"
-          "bb336d716599e7cf507e87f274541ef5216235fdedfba524879fecedf4455a60071a"
-          "f52d36a0df37b3f4c64b75e564fbdaadc36356e2382efd783ab4e82f4f708fb1addd"
-          "288658dfd4afc14c427e2699d8ed178fb343ebef2afd343d0f3aeb30a96dcac9f6a1"
-          "36d54347a42e318daf23d1d57b1cd964bd665a3f2a67")};
-  return std::make_pair(public_key, private_key);
-}
-
-std::pair<anonymous_tokens::TestRsaPublicKey,
-          anonymous_tokens::TestRsaPrivateKey>
-GetStrongTestRsaKeyPair4096() {
-  anonymous_tokens::TestRsaPublicKey public_key = {
-      /*n=*/
-      absl::HexStringToBytes(
-          "cd7d928f252a882c2ba68c1705970f61b7f63c5e907ea5f34e650e3c35edd7467873"
-          "4d626fca38a1230c52147cb8b16e2db9adbfe7ce4647ef2eb49b4ade458c80ef0e29"
-          "ac4109233d0f512643106fb2e42308fbc2db13c1db24c672a3bfc32acfb429ae5104"
-          "507f2b342473a9aa5eab8a9c24d7fe08fb59bea4049d14fea781484591460e5eef62"
-          "bd67d3c28aa8e360c50b936998565ca12fbc647d32c446f3f326fe0a36388bfb3ed7"
-          "a4c1e8c900a299c88bdaf6dc9ebb032f810f682ddfc2d5fa46e8fa28b8bdfa32131f"
-          "259615f85bde8a4eb8258ccbda83e62cf12795c0cae1498c2b435e27c31b9ef8a1ef"
-          "bf9552bc6f929a76d9d3a997bfe6fe11c155a571446decdb5032b80482d0bcb8ab0a"
-          "23ab82451049a1af692764b69187620005a9d3b5d530d38bfc41938066f505a6e248"
-          "4795ce70a69e5df5a551b5179ff1ed3a34eceb09834317de137d9c2d6b35c745c67b"
-          "05a1412fc0f616581a051f41bf14c48dcc8b558f92cdee22f5d0f4a75c232e4acf45"
-          "d3d2491a2eda3d7ed40fcef81058b8b3b019ef7492453dd3220d5a1ee706abcf4da4"
-          "4a572376eee594dca796f8be05ba104ea08881e68c09132622f233574bd0c3f9dfaa"
-          "9ae7c6579b90312851aeec02b2678c5e530cc8fbc30e389799df92a2898c34208367"
-          "63e199488adc8e5464ff4a67debf35ac2011d4723c3cf1ea1326ce555f80611b2094"
-          "4a31"),
-      /*e=*/absl::HexStringToBytes("010001")};
-  anonymous_tokens::TestRsaPrivateKey private_key = {
-      public_key.n, public_key.e,
-      /*d=*/
-      absl::HexStringToBytes(
-          "1d618f83851a64370094c322058c18486e0fb88902db00ea5d72a88ae66117ef3d08"
-          "ab6f603187504edd139d5749e720ac4c08b2503817a77064fab0db8f155da60fc834"
-          "202b7a5d7dfd032ad7daf145a045fc22573590c91e86cf131423b689980218159302"
-          "ed6989695eaee4faf5a74c5dd00ccc0747bd08bb95e749d9b164944b521eb4ae5147"
-          "0a72de7dc9eaa4fc30a05b96f50fa015f1e7db6c65465828c842f27ece4ade84f172"
-          "cedd64e5dc7fe3421ff1126bf00c2843f20d9c6536c1ba6b9b18f3afbfde75f813f0"
-          "d7a47286bcc8007989ede0884339a9bf124a0928f4392b156e18274dc3215f65086e"
-          "69b3b58d38dcbad6348605912b80a12233c4c418ab6cedeb313207c2567e0754a9f0"
-          "b4ac5365cfbc699ccc3a967a668e9ee9c272c4dfac1a7024bd98ccb7e6de98fe5a3a"
-          "43fcb01e0d354ca7b31c266253a35f7ee1109c59f2523bd03fa6d8c6f03c5b347fc5"
-          "97c3d0011a0d984105b74a2a406a7ab815657da88c8ee56d78925409df32f8698a75"
-          "af8fb2b3576b5676c1ffc8026421b73e72698b3d10695f369874fa681df1b4f1e781"
-          "55ff7238b23a1f1b73541fd4a60831a5d78c6a8b2b86d9a5d24f36c9437f5b8e5e52"
-          "2d078c9f23c6bbd24e0b261b575b4d31b3d05434afb3b45442f981d33954d0b43380"
-          "8aa0cacaba9530f3f6083dd059a0ad36ade853997c575a0036a691851f34c391be7e"
-          "6f43"),
-      /*p=*/
-      absl::HexStringToBytes(
-          "e6503c05c40a5db99f52ae1ae7ae3a313802821e2d93a431f71c21206e7cf683603d"
-          "e565b0788038841f761025f4f50b090a2a828240460d5eba1fc49cec36d93cb7ee2a"
-          "bda6dadeda381b83c3e6f18c1ddea7651a7fe87ee65ce089817baa7998c6db994132"
-          "850d6b47f9afbf6c6fbf7d813173d2d2f904892288dc603f4b11c96d67228b0591f4"
-          "9311f227f81cad39161039028b009155a703ea581d3f10b4b668e59d07f0ca90bc26"
-          "970b854ac17abdd86789ee0d61db5942226f498099076ce05aaa72a52cf6006216a8"
-          "f7d1afbd64e9449b068c65faeec6cdb3b02a2d0f9320d85d963067c38093ad6a3483"
-          "a3db7e5964ba29634540de9ed60b8e1423ab"),
-      /*q=*/
-      absl::HexStringToBytes(
-          "e4689c2d46a1e63dc955942bc34a948b50cc1047cd61b67aec389f7315aac62d9d24"
-          "971525a1d925a93d4da005280298587b3559aba6c2329c63baaa37ab7fabb88c349a"
-          "d34f7cfd3a57d5c4dc2c9a623fdb5724af0e808a00ec3a02d503b02905fa8dbb97d4"
-          "7d588dd9dab46cc03709f54fff79d0c5941372faa9f9b6ff7524b4cb1740b6af34ce"
-          "d5c39b47ce4902387dffffdb7ab6c38a54e55d42b47359cef31e1d993abdaf15fab9"
-          "17a15db3a558660ad5fe3bcd298c2625481bc61b3aecfc960c6c7d732c560fcd99cf"
-          "1d6d56da6c0ed876b2b957d0c2d7e86a1cd57a08380f526f18e4d3ca9000271cbf8e"
-          "87f66e4f908834df312c6a6d62b9137c6d93"),
-      /*dp=*/
-      absl::HexStringToBytes(
-          "8d017a7e1d342b85c5e19ceea401ab670edf9a4257ad18cdee78ae5f68c5e13735e9"
-          "2f553ee1c7bed24560c72a35fb00b29c22c29c74356f621b99ef8a13a4d103b7a87d"
-          "4a77a970df3192c6ed5dab6d19ac83d8068d610eb08314859b5cd756730eeccbbb7a"
-          "eeb2f487b07ac53be27ede9c0666df20838d1f58a16a2b131526e2a7b489158c677b"
-          "d1bf1eff118c9d11624cb45ab637b6c335e9d3c3f6c3f1ba72236ed0e157aeed4604"
-          "6a5d8751e97af85851abc4af34c652b386d993aac40623c6883beaccede5fefe0ed9"
-          "8c4038d43fc0015cd87984c64902365658f8b975dba23455b7ea12dd430f2710eaed"
-          "dd9838970a705f7e839bdfb06763d3acc8d9"),
-      /*dq=*/
-      absl::HexStringToBytes(
-          "469418a658ec103449715b4ec692d621d27eac0d33e69cb79124d20882ca796080ed"
-          "5c8e1949d0cab5680f0382746190e7ce72a6d9c6b6bd62dbe24354de769dfe71bc93"
-          "96f639fe19b828832331d926c0eaab1bd7c8186a0c6cf2640ba48f1bae104519918a"
-          "048d878fa8e815aeb3932d2d6219272cd65bc82cb2b74a17d7ffd6a9e6ee8544d081"
-          "9546534635f5136d9769b28b04795324fca4bf53ac64f47c615d8df1da57e0b15eff"
-          "30d1191e38da7ef59c386a0c34696d241a0b130539091fe7d1c0f866cd6d6e86ae9f"
-          "744d64082c59ce03a7a863fd4b27e2565fc08b6bdcbec74f33170a66ce666daf9175"
-          "9e87c4806b7ddb3098864c00aeffd7889c67"),
-      /*crt=*/
-      absl::HexStringToBytes(
-          "a4e8c9443c2619b6c92c9dd9941422274431e80503dc8a143ce8d97cde3e331fca29"
-          "e1de60ea50f7520d19192e39d0e106b37e20cc3a084afab1ab09c3205e1d7e59050a"
-          "b76101ea7bf014dcccc7f948ff5fb14ddd83ee804de5c659672142b4b7e661e0be8e"
-          "95eddee3b815f1f26741639fd04e5015153375ee1dfaa87ebf5b4340948538d3bfa1"
-          "b4cdc7e81b68c7c0c85879bd5026ea66735e4c3b56294f6c63ac1ba0709edeefc252"
-          "c90723039f1fe227086a2b57299d7f7bcd1f09b82985c7710bb43d342167142629a2"
-          "3094981f3908d0a1be38a5e3f823fad1ef96aa643fb5811cbafe8b134725075d4b66"
-          "4409de70b2571ea6ef53a44615db16b7bda5")};
-  return std::make_pair(public_key, private_key);
-}
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
diff --git a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h b/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h
deleted file mode 100644
index 777e071..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_UTILS_H_
-#define THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_UTILS_H_
-
-#include <random>
-#include <string>
-#include <utility>
-
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "openssl/base.h"
-
-namespace private_membership {
-namespace anonymous_tokens {
-
-struct TestRsaPublicKey {
-  std::string n;
-  std::string e;
-};
-
-struct TestRsaPrivateKey {
-  std::string n;
-  std::string e;
-  std::string d;
-  std::string p;
-  std::string q;
-  std::string dp;
-  std::string dq;
-  std::string crt;
-};
-
-struct IetfStandardRsaBlindSignatureTestVector {
-  std::string n;
-  std::string e;
-  std::string d;
-  std::string p;
-  std::string q;
-  std::string message;
-  std::string salt;
-  std::string inv;
-  std::string encoded_message;
-  std::string blinded_message;
-  std::string blinded_signature;
-  std::string signature;
-};
-
-struct IetfRsaBlindSignatureWithPublicMetadataTestVector {
-  std::string n;
-  std::string e;
-  std::string d;
-  std::string p;
-  std::string q;
-  std::string message;
-  std::string public_metadata;
-  std::string message_mask;
-  std::string blinded_message;
-  std::string blinded_signature;
-  std::string signature;
-};
-
-// TestSign can be removed once rsa_blind_signer is moved to
-// anonympous_tokens/public/cpp/crypto
-absl::StatusOr<std::string> TestSign(absl::string_view blinded_data,
-                                     RSA* rsa_key);
-
-// TestSignWithPublicMetadata can be removed once rsa_blind_signer is moved to
-// anonympous_tokens/public/cpp/crypto
-absl::StatusOr<std::string> TestSignWithPublicMetadata(
-    absl::string_view blinded_data, absl::string_view public_metadata,
-    const RSA& rsa_key, bool use_rsa_public_exponent);
-
-// Returns the IETF test example from
-// https://datatracker.ietf.org/doc/draft-irtf-cfrg-rsa-blind-signatures/
-IetfStandardRsaBlindSignatureTestVector
-GetIetfStandardRsaBlindSignatureTestVector();
-
-// Returns the IETF test with Public Metadata examples from
-// https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/
-//
-// Note that all test vectors use the same RSA key pair.
-std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector>
-GetIetfRsaBlindSignatureWithPublicMetadataTestVectors();
-
-// Returns the IETF test with Public Metadata examples that disregard the RSA
-// public exponent during partially blind RSA signatures protocol execution.
-//
-// Note that all test vectors use the same RSA key pair.
-std::vector<IetfRsaBlindSignatureWithPublicMetadataTestVector>
-GetIetfPartiallyBlindRSASignatureNoPublicExponentTestVectors();
-
-// Method returns fixed 2048-bit strong RSA modulus based key pair for testing.
-std::pair<TestRsaPublicKey, TestRsaPrivateKey> GetStrongTestRsaKeyPair2048();
-
-// Method returns another fixed 2048-bit strong RSA modulus based key pair for
-// testing.
-std::pair<TestRsaPublicKey, TestRsaPrivateKey>
-GetAnotherStrongTestRsaKeyPair2048();
-
-// Method returns fixed 3072-bit strong RSA modulus based key pair for testing.
-std::pair<TestRsaPublicKey, TestRsaPrivateKey> GetStrongTestRsaKeyPair3072();
-
-// Method returns fixed 4096-bit strong RSA modulus based key pair for testing.
-std::pair<TestRsaPublicKey, TestRsaPrivateKey> GetStrongTestRsaKeyPair4096();
-
-// Outputs a random string of n characters.
-std::string RandomString(int n, std::uniform_int_distribution<int>* distr_u8,
-                         std::mt19937_64* generator);
-
-#define ANON_TOKENS_ASSERT_OK_AND_ASSIGN(lhs, rexpr)                       \
-  ANON_TOKENS_ASSERT_OK_AND_ASSIGN_IMPL_(                                  \
-      ANON_TOKENS_STATUS_TESTING_IMPL_CONCAT_(_status_or_value, __LINE__), \
-      lhs, rexpr)
-
-#define ANON_TOKENS_ASSERT_OK_AND_ASSIGN_IMPL_(statusor, lhs, rexpr) \
-  auto statusor = (rexpr);                                           \
-  ASSERT_THAT(statusor.ok(), ::testing::Eq(true));                   \
-  lhs = std::move(statusor).value()
-
-#define ANON_TOKENS_STATUS_TESTING_IMPL_CONCAT_INNER_(x, y) x##y
-#define ANON_TOKENS_STATUS_TESTING_IMPL_CONCAT_(x, y) \
-  ANON_TOKENS_STATUS_TESTING_IMPL_CONCAT_INNER_(x, y)
-
-}  // namespace anonymous_tokens
-}  // namespace private_membership
-
-#endif  // THIRD_PARTY_ANONYMOUS_TOKENS_CPP_TESTING_UTILS_H_
diff --git a/quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto b/quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto
deleted file mode 100644
index 1f50fc0..0000000
--- a/quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package private_membership.anonymous_tokens;
-
-message Timestamp {
- int64 seconds = 1;
- int32 nanos = 2;
-}
-
-// Different use cases for the Anonymous Tokens service.
-// Next ID: 10
-enum AnonymousTokensUseCase {
-  // Test use cases here.
-  ANONYMOUS_TOKENS_USE_CASE_UNDEFINED = 0;
-  TEST_USE_CASE = 1;
-  TEST_USE_CASE_2 = 2;
-  TEST_USE_CASE_3 = 4;
-  TEST_USE_CASE_4 = 5;
-  TEST_USE_CASE_5 = 6;
-  TEST_USE_CASE_6 = 9;
-
-  PROVABLY_PRIVATE_NETWORK = 3;
-  CHROME_IP_BLINDING = 7;
-  NOCTOGRAM_PPISSUER = 8;
-}
-
-// An enum describing different types of available hash functions.
-enum HashType {
-  AT_HASH_TYPE_UNDEFINED = 0;
-  AT_TEST_HASH_TYPE = 1;
-  AT_HASH_TYPE_SHA256 = 2;
-  AT_HASH_TYPE_SHA384 = 3;
-  // Add more hash types if necessary.
-}
-
-// An enum describing different types of hash functions that can be used by the
-// mask generation function.
-enum MaskGenFunction {
-  AT_MGF_UNDEFINED = 0;
-  AT_TEST_MGF = 1;
-  AT_MGF_SHA256 = 2;
-  AT_MGF_SHA384 = 3;
-  // Add more hash types if necessary.
-}
-
-// An enum describing different types of message masking.
-enum MessageMaskType {
-  AT_MESSAGE_MASK_TYPE_UNDEFINED = 0;
-  AT_MESSAGE_MASK_XOR = 1;
-  AT_MESSAGE_MASK_CONCAT = 2;
-  AT_MESSAGE_MASK_NO_MASK = 3;
-}
-
-//  Proto representation for RSA private key.
-message RSAPrivateKey {
-  // Modulus.
-  bytes n = 1;
-  // Public exponent.
-  bytes e = 2;
-  // Private exponent.
-  bytes d = 3;
-  // The prime factor p of n.
-  bytes p = 4;
-  // The prime factor q of n.
-  bytes q = 5;
-  // d mod (p - 1).
-  bytes dp = 6;
-  // d mod (q - 1).
-  bytes dq = 7;
-  // Chinese Remainder Theorem coefficient q^(-1) mod p.
-  bytes crt = 8;
-}
-
-// Proto representation for RSA public key.
-message RSAPublicKey {
-  // Modulus.
-  bytes n = 1;
-  // Public exponent.
-  bytes e = 2;
-}
-
-// Next ID: 13
-message RSABlindSignaturePublicKey {
-  // Use case associated with this public key.
-  bytes use_case = 9;
-
-  // Version number of public key.
-  int64 key_version = 1;
-
-  // Serialization of the public key.
-  bytes serialized_public_key = 2;
-
-  // Timestamp of expiration.
-  //
-  // Note that we will not return keys whose expiration times are in the past.
-  private_membership.anonymous_tokens.Timestamp expiration_time = 3;
-
-  // Key becomes valid at key_validity_start_time.
-  private_membership.anonymous_tokens.Timestamp key_validity_start_time = 8;
-
-  // Hash function used in computing hash of the signing message
-  // (see https://tools.ietf.org/html/rfc8017#section-9.1.1)
-  HashType sig_hash_type = 4;
-
-  // Hash function used in MGF1 (a mask generation function based on a
-  // hash function) (see https://tools.ietf.org/html/rfc8017#appendix-B.2.1).
-  MaskGenFunction mask_gen_function = 5;
-
-  // Length in bytes of the salt (see
-  // https://tools.ietf.org/html/rfc8017#section-9.1.1)
-  int64 salt_length = 6;
-
-  // Key size: bytes of RSA key.
-  int64 key_size = 7;
-
-  // Type of masking of message (see https://eprint.iacr.org/2022/895.pdf).
-  MessageMaskType message_mask_type = 10;
-
-  // Length of message mask in bytes.
-  int64 message_mask_size = 11;
-
-  // Conveys whether public metadata support is enabled and RSA blind signatures
-  // with public metadata protocol should be used. If false, standard RSA blind
-  // signatures are used and all public metadata inputs are ignored.
-  bool public_metadata_support = 12;
-}
-
-message AnonymousTokensPublicKeysGetRequest {
-  // Use case associated with this request.
-  //
-  // Returns an error if the token type does not support public key verification
-  // for the requested use_case.
-  bytes use_case = 1;
-
-  // Key version associated with this request.
-  //
-  // Returns an error if the token type does not support public key verification
-  // for the requested use_case and key_version combination.
-  //
-  // If unset, all valid possibilities for the key are returned.
-  int64 key_version = 2;
-
-  // Public key that becomes valid at or before this requested time and not
-  // after. More explicitly, we need the requested key to be valid at the
-  // requested key_validity_start_time.
-  //
-  // If unset it will be set to current time.
-  private_membership.anonymous_tokens.Timestamp key_validity_start_time = 3
-      ;
-
-  // Public key that is definitely not valid after this particular time. If
-  // unset / null, only keys that are indefinitely valid are returned.
-  //
-  // Note: It is possible that the key becomes invalid before this time. But the
-  // key should not be valid after this time.
-  private_membership.anonymous_tokens.Timestamp key_validity_end_time = 4
-      ;
-}
-
-message AnonymousTokensPublicKeysGetResponse {
-  // List of currently valid RSA public keys.
-  repeated RSABlindSignaturePublicKey rsa_public_keys = 1;
-}
-
-message AnonymousTokensSignRequest {
-  // Next ID: 6
-  message BlindedToken {
-    // Use case associated with this request.
-    bytes use_case = 1;
-
-    // Version of key used to sign and generate the token.
-    int64 key_version = 2;
-
-    // Public metadata to be tied to the `blinded message` (serialized_token).
-    //
-    // The length of public metadata must fit in 4 bytes.
-    bytes public_metadata = 4;
-
-    // This value is disregarded for standard blind RSA signatures.
-    //
-    // For the public metadata protocol, if this value is set to false, the
-    // final public exponent is derived by using the RSA public exponent, the
-    // RSA modulus and the public metadata. If this value is set to true, only
-    // the RSA modulus and the public metadata will be used.
-    bool do_not_use_rsa_public_exponent = 5;
-
-    // Serialization of the token.
-    bytes serialized_token = 3;
-  }
-
-  // Token(s) that have been blinded by the user, not yet signed
-  repeated BlindedToken blinded_tokens = 1;
-}
-
-message AnonymousTokensSignResponse {
-  //  Next ID: 7
-  message AnonymousToken {
-    // Use case associated with this anonymous token.
-    bytes use_case = 1;
-
-    // Version of key used to sign and generate the token.
-    int64 key_version = 2;
-
-    // Public metadata tied to the input (serialized_blinded_message) and the
-    // `blinded` signature (serialized_token).
-    //
-    // The length of public metadata must fit in 4 bytes.
-    bytes public_metadata = 4;
-
-    // This value is disregarded for standard blind RSA signatures.
-    //
-    // For the public metadata protocol, if this value is set to false, the
-    // final public exponent is derived by using the RSA public exponent, the
-    // RSA modulus and the public metadata. If this value is set to true, only
-    // the RSA modulus and the public metadata will be used.
-    bool do_not_use_rsa_public_exponent = 6;
-
-    // The serialized_token in BlindedToken in the AnonymousTokensSignRequest.
-    bytes serialized_blinded_message = 5;
-
-    // Serialization of the signed token. This will have to be `unblinded` by
-    // the user before it can be used / redeemed.
-    bytes serialized_token = 3;
-  }
-
-  // Returned anonymous token(s)
-  repeated AnonymousToken anonymous_tokens = 1;
-}
-
-message AnonymousTokensRedemptionRequest {
-  // Next ID: 7
-  message AnonymousTokenToRedeem {
-    // Use case associated with this anonymous token that needs to be redeemed.
-    bytes use_case = 1;
-
-    // Version of key associated with this anonymous token that needs to be
-    // redeemed.
-    int64 key_version = 2;
-
-    // Public metadata to be used for redeeming the signature
-    // (serialized_unblinded_token).
-    //
-    // The length of public metadata must fit in 4 bytes.
-    bytes public_metadata = 4;
-
-    // Serialization of the unblinded anonymous token that needs to be redeemed.
-    bytes serialized_unblinded_token = 3;
-
-    // Plaintext input message to verify the signature for.
-    bytes plaintext_message = 5;
-
-    // Nonce used to mask plaintext message before cryptographic verification.
-    bytes message_mask = 6;
-  }
-
-  // One or more anonymous tokens to redeem.
-  repeated AnonymousTokenToRedeem anonymous_tokens_to_redeem = 1;
-}
-
-message AnonymousTokensRedemptionResponse {
-  // Next ID: 9
-  message AnonymousTokenRedemptionResult {
-    // Use case associated with this redeemed anonymous token.
-    bytes use_case = 3;
-
-    // Version of key associated with this redeemed anonymous token.
-    int64 key_version = 4;
-
-    // Public metadata used for verifying the signature
-    // (serialized_unblinded_token).
-    //
-    // The length of public metadata must fit in 4 bytes.
-    bytes public_metadata = 5;
-
-    // Serialization of this redeemed unblinded anonymous token.
-    bytes serialized_unblinded_token = 6;
-
-    // Unblinded input message that the signature was verified against.
-    bytes plaintext_message = 7;
-
-    // Nonce used to mask plaintext message before cryptographic verification.
-    bytes message_mask = 8;
-
-    // Returns true if and only if the anonymous token was redeemed
-    // successfully i.e. token was cryptographically verified, all relevant
-    // state in the server was updated successfully and the token was not
-    // redeemed already.
-    //
-    bool verified = 1;
-
-    // Returns true if and only if the anonymous token has already been
-    // redeemed.
-    bool double_spent = 2;
-  }
-
-  // Redemption response for requested anonymous tokens.
-  repeated AnonymousTokenRedemptionResult anonymous_token_redemption_results =
-      1;
-}
-
-// Plaintext message with public metadata.
-message PlaintextMessageWithPublicMetadata {
-  // Message to be signed.
-  bytes plaintext_message = 1;
-
-  // Public metadata to be tied to the signature.
-  bytes public_metadata = 2;
-}
-
-// Proto representing a token created during the blind signing protocol.
-message RSABlindSignatureToken {
-  // Resulting token from the blind signing protocol.
-  bytes token = 1;
-
-  // Nonce used to mask messages.
-  bytes message_mask = 2;
-}
-
-// Proto representing a token along with the input.
-message RSABlindSignatureTokenWithInput {
-  // Input consisting of plaintext message and public metadata.
-  PlaintextMessageWithPublicMetadata input = 1;
-
-  // Resulting token after blind signing protocol.
-  RSABlindSignatureToken token = 2;
-}
-
-// Proto representing redemption result along with the token and the token
-// input.
-message RSABlindSignatureRedemptionResult {
-  // Proto representing a token along with the input.
-  RSABlindSignatureTokenWithInput token_with_input = 1;
-
-  // This is set to true if and only if the anonymous token was redeemed
-  // successfully i.e. token was cryptographically verified, all relevant
-  // state in the redemption server was updated successfully and the token was
-  // not redeemed already.
-  bool redeemed = 2;
-
-  // True if and only if the token was redeemed before.
-  bool double_spent = 3;
-}
diff --git a/quiche/blind_sign_auth/blind_sign_auth.cc b/quiche/blind_sign_auth/blind_sign_auth.cc
index d321074..0c8ea53 100644
--- a/quiche/blind_sign_auth/blind_sign_auth.cc
+++ b/quiche/blind_sign_auth/blind_sign_auth.cc
@@ -16,7 +16,7 @@
 #include "absl/strings/escaping.h"
 #include "absl/strings/str_cat.h"
 #include "absl/types/span.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils.h"
+#include "anonymous_tokens/cpp/shared/proto_utils.h"
 #include "quiche/blind_sign_auth/blind_sign_auth_protos.h"
 #include "quiche/blind_sign_auth/blind_sign_http_response.h"
 #include "quiche/common/platform/api/quiche_logging.h"
@@ -83,7 +83,7 @@
     return;
   }
   absl::StatusOr<absl::Time> public_metadata_expiry_time =
-      private_membership::anonymous_tokens::TimeFromProto(
+      anonymous_tokens::TimeFromProto(
           initial_data_response.public_metadata_info()
               .public_metadata()
               .expiration());
@@ -95,7 +95,7 @@
 
   // Create RSA BSSA client.
   auto bssa_client =
-      private_membership::anonymous_tokens::AnonymousTokensRsaBssaClient::
+      anonymous_tokens::AnonymousTokensRsaBssaClient::
           Create(initial_data_response.at_public_metadata_public_key());
   if (!bssa_client.ok()) {
     QUICHE_LOG(WARNING) << "Failed to create AT BSSA client: "
@@ -107,12 +107,12 @@
   // Create plaintext tokens.
   // Client blinds plaintext tokens (random 32-byte strings) in CreateRequest.
   std::vector<
-      private_membership::anonymous_tokens::PlaintextMessageWithPublicMetadata>
+      anonymous_tokens::PlaintextMessageWithPublicMetadata>
       plaintext_tokens;
   QuicheRandom* random = QuicheRandom::GetInstance();
   for (int i = 0; i < num_tokens; i++) {
     // Create random 32-byte string prefixed with "blind:".
-    private_membership::anonymous_tokens::PlaintextMessageWithPublicMetadata
+    anonymous_tokens::PlaintextMessageWithPublicMetadata
         plaintext_message;
     std::string rand_bytes(32, '\0');
     random->RandBytes(rand_bytes.data(), rand_bytes.size());
@@ -136,7 +136,7 @@
   }
 
   absl::StatusOr<
-      private_membership::anonymous_tokens::AnonymousTokensSignRequest>
+      anonymous_tokens::AnonymousTokensSignRequest>
       at_sign_request = bssa_client.value()->CreateRequest(plaintext_tokens);
   if (!at_sign_request.ok()) {
     QUICHE_LOG(WARNING) << "Failed to create AT Sign Request: "
@@ -175,10 +175,10 @@
 void BlindSignAuth::AuthAndSignCallback(
     privacy::ppn::PublicMetadataInfo public_metadata_info,
     absl::Time public_key_expiry_time,
-    private_membership::anonymous_tokens::AnonymousTokensSignRequest
+    anonymous_tokens::AnonymousTokensSignRequest
         at_sign_request,
     std::unique_ptr<
-        private_membership::anonymous_tokens::AnonymousTokensRsaBssaClient>
+        anonymous_tokens::AnonymousTokensRsaBssaClient>
         bssa_client,
     SignedTokenCallback callback,
     absl::StatusOr<BlindSignHttpResponse> response) {
@@ -206,7 +206,7 @@
   }
 
   // Create vector of unblinded anonymous tokens.
-  private_membership::anonymous_tokens::AnonymousTokensSignResponse
+  anonymous_tokens::AnonymousTokensSignResponse
       at_sign_response;
 
   if (sign_response.blinded_token_signature_size() !=
@@ -228,7 +228,7 @@
           absl::InternalError("Failed to unescape blinded token signature"));
       return;
     }
-    private_membership::anonymous_tokens::AnonymousTokensSignResponse::
+    anonymous_tokens::AnonymousTokensSignResponse::
         AnonymousToken anon_token_proto;
     *anon_token_proto.mutable_use_case() =
         at_sign_request.blinded_tokens(i).use_case();
@@ -271,7 +271,7 @@
         signed_tokens->at(i).token().token();
     spend_token_data.set_signing_key_version(
         at_sign_response.anonymous_tokens(i).key_version());
-    auto use_case = private_membership::anonymous_tokens::ParseUseCase(
+    auto use_case = anonymous_tokens::ParseUseCase(
         at_sign_response.anonymous_tokens(i).use_case());
     if (!use_case.ok()) {
       QUICHE_LOG(WARNING) << "Failed to parse use case: " << use_case.status();
diff --git a/quiche/blind_sign_auth/blind_sign_auth.h b/quiche/blind_sign_auth/blind_sign_auth.h
index 87fbfeb..d678afd 100644
--- a/quiche/blind_sign_auth/blind_sign_auth.h
+++ b/quiche/blind_sign_auth/blind_sign_auth.h
@@ -11,7 +11,7 @@
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h"
+#include "anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h"
 #include "quiche/blind_sign_auth/blind_sign_auth_interface.h"
 #include "quiche/blind_sign_auth/blind_sign_auth_protos.h"
 #include "quiche/blind_sign_auth/blind_sign_http_interface.h"
@@ -44,10 +44,10 @@
   void AuthAndSignCallback(
       privacy::ppn::PublicMetadataInfo public_metadata_info,
       absl::Time public_key_expiry_time,
-      private_membership::anonymous_tokens::AnonymousTokensSignRequest
+      anonymous_tokens::AnonymousTokensSignRequest
           at_sign_request,
       std::unique_ptr<
-          private_membership::anonymous_tokens::AnonymousTokensRsaBssaClient>
+          anonymous_tokens::AnonymousTokensRsaBssaClient>
           bssa_client,
       SignedTokenCallback callback,
       absl::StatusOr<BlindSignHttpResponse> response);
diff --git a/quiche/blind_sign_auth/blind_sign_auth_protos.h b/quiche/blind_sign_auth/blind_sign_auth_protos.h
index 15e3b9a..b77dbe6 100644
--- a/quiche/blind_sign_auth/blind_sign_auth_protos.h
+++ b/quiche/blind_sign_auth/blind_sign_auth_protos.h
@@ -1,13 +1,13 @@
 #ifndef QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_PROTOS_H_
 #define QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_PROTOS_H_
 
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"  // IWYU pragma: export
+#include "anonymous_tokens/proto/anonymous_tokens.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/auth_and_sign.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/blind_sign_auth_options.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/get_initial_data.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/key_services.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/public_metadata.pb.h"  // IWYU pragma: export
 #include "quiche/blind_sign_auth/proto/spend_token_data.pb.h"  // IWYU pragma: export
-#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"  // IWYU pragma: export
+#include "anonymous_tokens/proto/anonymous_tokens.pb.h"  // IWYU pragma: export
 
 #endif  // QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_PROTOS_H_
diff --git a/quiche/blind_sign_auth/blind_sign_auth_test.cc b/quiche/blind_sign_auth/blind_sign_auth_test.cc
index 872d54e..c2e33cd 100644
--- a/quiche/blind_sign_auth/blind_sign_auth_test.cc
+++ b/quiche/blind_sign_auth/blind_sign_auth_test.cc
@@ -13,8 +13,8 @@
 #include "absl/strings/escaping.h"
 #include "absl/strings/string_view.h"
 #include "absl/time/time.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h"
-#include "quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h"
+#include "anonymous_tokens/cpp/testing/proto_utils.h"
+#include "anonymous_tokens/cpp/testing/utils.h"
 #include "openssl/base.h"
 #include "quiche/blind_sign_auth/blind_sign_auth_protos.h"
 #include "quiche/blind_sign_auth/blind_sign_http_interface.h"
@@ -39,7 +39,7 @@
  protected:
   void SetUp() override {
     // Create public key.
-    auto keypair = private_membership::anonymous_tokens::CreateTestKey();
+    auto keypair = anonymous_tokens::CreateTestKey();
     if (!keypair.ok()) {
       return;
     }
@@ -55,7 +55,7 @@
 
     // Create fake public key response.
     privacy::ppn::GetInitialDataResponse fake_get_initial_data_response;
-    private_membership::anonymous_tokens::RSABlindSignaturePublicKey public_key;
+    anonymous_tokens::RSABlindSignaturePublicKey public_key;
     ASSERT_TRUE(
         public_key.ParseFromString(keypair_.second.SerializeAsString()));
     *fake_get_initial_data_response.mutable_at_public_metadata_public_key() =
@@ -64,7 +64,7 @@
     // Create public metadata info.
     privacy::ppn::PublicMetadata::Location location;
     location.set_country("US");
-    private_membership::anonymous_tokens::Timestamp expiration;
+    anonymous_tokens::Timestamp expiration;
     expiration.set_seconds(absl::ToUnixSeconds(absl::Now() + absl::Hours(1)));
     privacy::ppn::PublicMetadata public_metadata;
     *public_metadata.mutable_exit_location() = location;
@@ -113,7 +113,7 @@
       std::string decoded_blinded_token;
       ASSERT_TRUE(absl::Base64Unescape(request_token, &decoded_blinded_token));
       absl::StatusOr<std::string> serialized_token =
-          private_membership::anonymous_tokens::TestSign(decoded_blinded_token,
+          anonymous_tokens::TestSign(decoded_blinded_token,
                                                          keypair_.first.get());
       QUICHE_EXPECT_OK(serialized_token);
       response.add_blinded_token_signature(
@@ -135,7 +135,7 @@
       EXPECT_EQ(spend_token_data.signing_key_version(),
                 keypair_.second.key_version());
       EXPECT_NE(spend_token_data.use_case(),
-                private_membership::anonymous_tokens::AnonymousTokensUseCase::
+                anonymous_tokens::AnonymousTokensUseCase::
                     ANONYMOUS_TOKENS_USE_CASE_UNDEFINED);
       EXPECT_NE(spend_token_data.message_mask(), "");
     }
@@ -144,7 +144,7 @@
   MockBlindSignHttpInterface mock_http_interface_;
   std::unique_ptr<BlindSignAuth> blind_sign_auth_;
   std::pair<bssl::UniquePtr<RSA>,
-            private_membership::anonymous_tokens::RSABlindSignaturePublicKey>
+            anonymous_tokens::RSABlindSignaturePublicKey>
       keypair_;
   privacy::ppn::PublicMetadataInfo public_metadata_info_;
   privacy::ppn::AuthAndSignResponse sign_response_;
diff --git a/quiche/blind_sign_auth/proto/attestation.proto b/quiche/blind_sign_auth/proto/attestation.proto
index 8e658e9..cb3843d 100644
--- a/quiche/blind_sign_auth/proto/attestation.proto
+++ b/quiche/blind_sign_auth/proto/attestation.proto
@@ -29,7 +29,7 @@
   // ECDSA(
   //   SHA256(
   //     <random bytes of length [64, 128]>.<expiry time in ms>)).
-  bytes nonce = 1 ;
+  bytes nonce = 1;
 
   // Nonce signature.
   bytes sig = 2;
@@ -41,8 +41,8 @@
 message ValidateDeviceRequest {
   // Attestation data that is returned by the client.
   oneof attestation_data {
-    AndroidAttestationData android_attestation_data = 1 [deprecated = true];
-    IosAttestationData ios_attestation_data = 2 [deprecated = true];
+    AndroidAttestationData android_attestation_data = 1;
+    IosAttestationData ios_attestation_data = 2;
   }
   AttestationData attestation = 3;
 
@@ -87,16 +87,13 @@
 }
 
 message PrepareAttestationData {
-  bytes attestation_nonce = 2 [
-
-    json_name = "attestation_nonce"
-  ];
+  bytes attestation_nonce = 2;
 }
 
 message AndroidAttestationData {
   // Play IntegrityToken returned by Play Integrity API is detailed in
   // https://developer.android.com/google/play/integrity/verdict.
-  string attestation_token = 1 ;
+  string attestation_token = 1;
 
   // X509 Certificate chain generated by Android Keystore used for
   // Hardware-Backed Key Attestation.
@@ -106,7 +103,7 @@
 message IosAttestationData {
   // AppAttest attestation token.
   // Encoded in CBOR format.
-  bytes attestation_token = 1 ;
+  bytes attestation_token = 1;
 }
 
 message AttestationData {
diff --git a/quiche/blind_sign_auth/proto/auth_and_sign.proto b/quiche/blind_sign_auth/proto/auth_and_sign.proto
index 27c3dde..36ac812 100644
--- a/quiche/blind_sign_auth/proto/auth_and_sign.proto
+++ b/quiche/blind_sign_auth/proto/auth_and_sign.proto
@@ -27,24 +27,23 @@
 
   // A 'bearer' oauth token to be validated.
   // https://datatracker.ietf.org/doc/html/rfc6750#section-6.1.1
-  string oauth_token = 1 ;
+  string oauth_token = 1;
 
   // A string uniquely identifying the strategy this client should be
   // authenticated with.
-  string service_type = 2 ;
+  string service_type = 2;
 
   // A set of blinded tokens to be signed by zinc. b64 encoded.
-  repeated string blinded_token = 4
-      ;
+  repeated string blinded_token = 4;
 
   // A sha256 of the public key PEM used in generated `blinded_token`. This
   // Ensures the signer signs with the matching key. Only required if key_type
   // is ZINC_KEY_TYPE.
-  string public_key_hash = 5 ;
+  string public_key_hash = 5;
 
   oneof attestation_data {
-    AndroidAttestationData android_attestation_data = 6 [deprecated = true];
-    IosAttestationData ios_attestation_data = 7 [deprecated = true];
+    AndroidAttestationData android_attestation_data = 6;
+    IosAttestationData ios_attestation_data = 7;
   }
   privacy.ppn.AttestationData attestation = 8;
 
@@ -72,25 +71,15 @@
 
   // A set of signatures corresponding by index to `blinded_token` in the
   // request. b64 encoded.
-  repeated string blinded_token_signature = 4 [
-
-    json_name = "blinded_token_signature"
-  ];
+  repeated string blinded_token_signature = 4;
 
   // The marconi server hostname bridge-proxy used to set up tunnel.
-  string copper_controller_hostname = 5 [
-
-    json_name = "copper_controller_hostname"
-  ];
+  string copper_controller_hostname = 5;
 
   // The base64 encoding of override_region token and signature for white listed
   // users in the format of "${Region}.${timestamp}.${signature}".
-  string region_token_and_signature = 6 [
-
-    json_name = "region_token_and_signature"
-  ];
+  string region_token_and_signature = 6;
 
   // The APN type bridge-proxy use to deside which APN to use for connecting.
-  string apn_type = 7
-      [ json_name = "apn_type"];
+  string apn_type = 7;
 }
diff --git a/quiche/blind_sign_auth/proto/get_initial_data.proto b/quiche/blind_sign_auth/proto/get_initial_data.proto
index 6b98745..987eceb 100644
--- a/quiche/blind_sign_auth/proto/get_initial_data.proto
+++ b/quiche/blind_sign_auth/proto/get_initial_data.proto
@@ -18,18 +18,18 @@
 
 import "quiche/blind_sign_auth/proto/attestation.proto";
 import "quiche/blind_sign_auth/proto/public_metadata.proto";
-import "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto";
+import "anonymous_tokens/proto/anonymous_tokens.proto";
 
 option java_multiple_files = true;
 
 // Request data needed to prepare for AuthAndSign.
 message GetInitialDataRequest {
   // Whether the client wants to use attestation as part of authentication.
-  bool use_attestation = 1 ;
+  bool use_attestation = 1;
 
   // A string uniquely identifying the strategy this client should be
   // authenticated with.
-  string service_type = 2 ;
+  string service_type = 2;
 
   enum LocationGranularity {
     UNKNOWN = 0;
@@ -38,11 +38,10 @@
     CITY_GEOS = 2;
   }
   // The user selected granularity of exit IP location.
-  LocationGranularity location_granularity = 3
-      ;
+  LocationGranularity location_granularity = 3;
 
   // Indicates what validation rules the client uses for public metadata.
-  int64 validation_version = 4 ;
+  int64 validation_version = 4;
 }
 
 // Contains data needed to perform blind signing and prepare for calling
@@ -50,7 +49,7 @@
 message GetInitialDataResponse {
   reserved 4;
 
-  private_membership.anonymous_tokens.RSABlindSignaturePublicKey
+  anonymous_tokens.RSABlindSignaturePublicKey
       at_public_metadata_public_key = 1;
 
   // Version will match the validation version in the request.
@@ -63,8 +62,7 @@
   // Data needed to support the privacy pass specification.
   message PrivacyPassData {
     bytes token_key_id = 1;
-    bytes public_metadata_extensions = 2
-        ;
+    bytes public_metadata_extensions = 2;
   }
   PrivacyPassData privacy_pass_data = 5;
 }
diff --git a/quiche/blind_sign_auth/proto/public_metadata.proto b/quiche/blind_sign_auth/proto/public_metadata.proto
index f9f37d4..78258bb 100644
--- a/quiche/blind_sign_auth/proto/public_metadata.proto
+++ b/quiche/blind_sign_auth/proto/public_metadata.proto
@@ -16,7 +16,7 @@
 
 package privacy.ppn;
 
-import "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto";
+import "anonymous_tokens/proto/anonymous_tokens.proto";
 
 option java_multiple_files = true;
 
@@ -41,7 +41,7 @@
   string service_type = 2;
 
   // When the token and metadata expire.
-  private_membership.anonymous_tokens.Timestamp expiration = 3;
+  anonymous_tokens.Timestamp expiration = 3;
 
   // Indicates the debug context of this payload.
   enum DebugMode {
diff --git a/quiche/blind_sign_auth/proto/spend_token_data.proto b/quiche/blind_sign_auth/proto/spend_token_data.proto
index 0fbca27..90b490d 100644
--- a/quiche/blind_sign_auth/proto/spend_token_data.proto
+++ b/quiche/blind_sign_auth/proto/spend_token_data.proto
@@ -17,7 +17,7 @@
 package privacy.ppn;
 
 import "quiche/blind_sign_auth/proto/public_metadata.proto";
-import "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto";
+import "anonymous_tokens/proto/anonymous_tokens.proto";
 
 message SpendTokenData {
   // Public metadata associated with the token being spent.
@@ -32,7 +32,7 @@
   int64 signing_key_version = 4;
   // A use case identifying the caller. Should be a fixed, hardcoded value to
   // prevent cross-spending tokens.
-  private_membership.anonymous_tokens.AnonymousTokensUseCase use_case = 5;
+  anonymous_tokens.AnonymousTokensUseCase use_case = 5;
   // Nonce used to mask plaintext message before cryptographic verification.
   bytes message_mask = 6;
   // General public metadata. Use deserializer to inspect. Only set one of this
diff --git a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb b/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb
deleted file mode 100644
index c54070b..0000000
--- a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb
+++ /dev/null
Binary files differ
diff --git a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb b/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb
deleted file mode 100644
index 50faa96..0000000
--- a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb
+++ /dev/null
Binary files differ
diff --git a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb b/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb
deleted file mode 100644
index 3e4bae9..0000000
--- a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb
+++ /dev/null
Binary files differ
diff --git a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb b/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb
deleted file mode 100644
index f322a9b..0000000
--- a/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb
+++ /dev/null
Binary files differ