in common/kms_client.cc [156:206]
absl::StatusOr<kms_v1::AsymmetricSignResponse> KmsClient::AsymmetricSign(
kms_v1::AsymmetricSignRequest& request) const {
grpc::ClientContext ctx;
AddContextSettings(&ctx, "name", request.name());
bool use_data = false;
if (!request.data().empty()) {
use_data = true;
request.mutable_data_crc32c()->set_value(ComputeCRC32C(request.data()));
} else {
absl::StatusOr<std::string> digest_string =
GetDigestString(request.digest());
if (!digest_string.ok()) {
absl::Status status = digest_string.status();
return DecorateStatus(status);
}
request.mutable_digest_crc32c()->set_value(ComputeCRC32C(*digest_string));
}
kms_v1::AsymmetricSignResponse response;
absl::Status rpc_result =
ToStatus(kms_stub_->AsymmetricSign(&ctx, request, &response));
if (!rpc_result.ok()) {
return DecorateStatus(rpc_result);
}
if (!CRC32CMatches(response.signature(),
response.signature_crc32c().value())) {
rpc_result = absl::InternalError(absl::StrFormat(
"at %s: the response crc32c did not match the expected checksum value",
SOURCE_LOCATION.ToString()));
return DecorateStatus(rpc_result);
}
if (use_data && !response.verified_data_crc32c()) {
rpc_result = absl::InternalError(
absl::StrFormat("at %s: the server did not verify the checksum values "
"provided in the request",
SOURCE_LOCATION.ToString()));
return DecorateStatus(rpc_result);
}
if (!use_data && !response.verified_digest_crc32c()) {
rpc_result = absl::InternalError(
absl::StrFormat("at %s: the server did not verify the checksum values "
"provided in the request",
SOURCE_LOCATION.ToString()));
return DecorateStatus(rpc_result);
}
return response;
}