Making changes to RSA
BSSA client so that it can process NO_MASK message mask type.
Currently none of our use case configs are set to NO_MASK but we will change a use case currently in dogfood to NO_MASK after informing the relevant teams.
PiperOrigin-RevId: 559453271
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
index 3738654..e40c669 100644
--- 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
@@ -56,11 +56,24 @@
} else if (public_key.salt_length() <= 0) {
return absl::InvalidArgumentError(
"Non-positive salt length is not allowed.");
- } else if (public_key.message_mask_type() == AT_MESSAGE_MASK_TYPE_UNDEFINED ||
- public_key.message_mask_type() == AT_MESSAGE_MASK_XOR) {
- return absl::InvalidArgumentError("Message mask type must be defined.");
- } else if (public_key.message_mask_size() <= 0) {
- return absl::InvalidArgumentError("Message mask size must be positive.");
+ }
+
+ 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;
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
index 5602cba..2db0d02 100644
--- 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
@@ -16,11 +16,14 @@
#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"
@@ -162,15 +165,31 @@
testing::HasSubstr("Message mask type must be defined"));
}
-TEST(CreateAnonymousTokensRsaBssaClientTest, InvalidMessageMaskSize) {
+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 size must be positive"));
+ testing::HasSubstr(
+ "Message mask no mask type must be set to size 0 bytes."));
}
class AnonymousTokensRsaBssaClientTest : public testing::Test {
@@ -211,6 +230,34 @@
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(), SizeIs(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(
@@ -521,6 +568,39 @@
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(), SizeIs(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