blob: a551d07923de0fe86cbdd9df47a141d188170012 [file] [log] [blame]
// 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.
// To run this binary from this directory use:
// bazel run -c opt :rsa_bssa_public_metadata_privacy_pass_server_demo
// --cxxopt='-std=c++17'
#include <iostream>
#include <ostream>
#include <string>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/escaping.h"
#include "anonymous_tokens/cpp/crypto/crypto_utils.h"
#include "anonymous_tokens/cpp/privacy_pass/token_encodings.h"
#include "anonymous_tokens/cpp/testing/utils.h"
#include <openssl/base.h>
absl::Status RunDemo() {
// Construct RSA private key with a strong rsa modulus.
auto [_, test_rsa_private_key] =
anonymous_tokens::GetStrongTestRsaKeyPair2048();
absl::StatusOr<bssl::UniquePtr<RSA>> rsa_private_key =
anonymous_tokens::CreatePrivateKeyRSA(
test_rsa_private_key.n, test_rsa_private_key.e,
test_rsa_private_key.d, test_rsa_private_key.p,
test_rsa_private_key.q, test_rsa_private_key.dp,
test_rsa_private_key.dq, test_rsa_private_key.crt);
if (!rsa_private_key.ok()) {
return rsa_private_key.status();
}
// Wait for token request.
std::cout << "Waiting for Token Type DA7A, Extended Token Request (in "
"hexadecimal string format):"
<< std::endl;
std::string extended_token_request_hex_str;
std::string extended_token_request_str;
std::cin >> extended_token_request_hex_str;
extended_token_request_str =
absl::HexStringToBytes(extended_token_request_hex_str);
absl::StatusOr<anonymous_tokens::ExtendedTokenRequest>
extended_token_request =
anonymous_tokens::UnmarshalExtendedTokenRequest(
extended_token_request_str);
if (!extended_token_request.ok()) {
return extended_token_request.status();
}
// Sign token request.
absl::StatusOr<std::string> encoded_extensions =
anonymous_tokens::EncodeExtensions(
(*extended_token_request).extensions);
if (!encoded_extensions.ok()) {
return encoded_extensions.status();
}
absl::StatusOr<std::string> signature =
anonymous_tokens::TestSignWithPublicMetadata(
(*extended_token_request).request.blinded_token_request,
/*public_metadata=*/*encoded_extensions, *rsa_private_key.value(),
/*use_rsa_public_exponent=*/false);
if (!signature.ok()) {
return signature.status();
}
std::cout
<< "Token Type DA7A, Token Response (in hexadecimal string format):\n"
<< absl::BytesToHexString(signature.value()) << std::endl;
return absl::OkStatus();
}
int main(int argc, char** argv) {
absl::Status status = RunDemo();
if (!status.ok()) {
std::cout << status << std::endl;
return -1;
} else {
std::cout << "Server demo ran successfully!" << std::endl;
}
return 0;
}