xref: /aosp_15_r20/external/tink/cc/proto_keyset_format.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2022 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang //     http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ///////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang 
17*e7b1675dSTing-Kang Chang #include "tink/proto_keyset_format.h"
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <ios>
20*e7b1675dSTing-Kang Chang #include <iostream>
21*e7b1675dSTing-Kang Chang #include <memory>
22*e7b1675dSTing-Kang Chang #include <ostream>
23*e7b1675dSTing-Kang Chang #include <sstream>
24*e7b1675dSTing-Kang Chang #include <string>
25*e7b1675dSTing-Kang Chang #include <utility>
26*e7b1675dSTing-Kang Chang 
27*e7b1675dSTing-Kang Chang #include "tink/binary_keyset_reader.h"
28*e7b1675dSTing-Kang Chang #include "tink/binary_keyset_writer.h"
29*e7b1675dSTing-Kang Chang #include "tink/cleartext_keyset_handle.h"
30*e7b1675dSTing-Kang Chang #include "tink/util/secret_data.h"
31*e7b1675dSTing-Kang Chang 
32*e7b1675dSTing-Kang Chang namespace crypto {
33*e7b1675dSTing-Kang Chang namespace tink {
34*e7b1675dSTing-Kang Chang 
ParseKeysetFromProtoKeysetFormat(absl::string_view serialized_keyset,SecretKeyAccessToken token)35*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<KeysetHandle> ParseKeysetFromProtoKeysetFormat(
36*e7b1675dSTing-Kang Chang     absl::string_view serialized_keyset, SecretKeyAccessToken token) {
37*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::KeysetReader>>
38*e7b1675dSTing-Kang Chang       keyset_reader = BinaryKeysetReader::New(serialized_keyset);
39*e7b1675dSTing-Kang Chang   if (!keyset_reader.ok()) {
40*e7b1675dSTing-Kang Chang     return keyset_reader.status();
41*e7b1675dSTing-Kang Chang   }
42*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>> result =
43*e7b1675dSTing-Kang Chang     CleartextKeysetHandle::Read(std::move(*keyset_reader));
44*e7b1675dSTing-Kang Chang   if (!result.ok()) {
45*e7b1675dSTing-Kang Chang     return result.status();
46*e7b1675dSTing-Kang Chang   }
47*e7b1675dSTing-Kang Chang   return std::move(**result);
48*e7b1675dSTing-Kang Chang }
49*e7b1675dSTing-Kang Chang 
50*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<util::SecretData>
SerializeKeysetToProtoKeysetFormat(const KeysetHandle & keyset_handle,SecretKeyAccessToken token)51*e7b1675dSTing-Kang Chang SerializeKeysetToProtoKeysetFormat(const KeysetHandle& keyset_handle,
52*e7b1675dSTing-Kang Chang                                    SecretKeyAccessToken token) {
53*e7b1675dSTing-Kang Chang   std::stringbuf string_buf(std::ios_base::out);
54*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::unique_ptr<BinaryKeysetWriter>>
55*e7b1675dSTing-Kang Chang       keyset_writer = BinaryKeysetWriter::New(
56*e7b1675dSTing-Kang Chang           std::make_unique<std::ostream>(&string_buf));
57*e7b1675dSTing-Kang Chang   if (!keyset_writer.ok()) {
58*e7b1675dSTing-Kang Chang     return keyset_writer.status();
59*e7b1675dSTing-Kang Chang   }
60*e7b1675dSTing-Kang Chang   crypto::tink::util::Status status =
61*e7b1675dSTing-Kang Chang       CleartextKeysetHandle::Write(keyset_writer->get(), keyset_handle);
62*e7b1675dSTing-Kang Chang   if (!status.ok()) {
63*e7b1675dSTing-Kang Chang     return status;
64*e7b1675dSTing-Kang Chang   }
65*e7b1675dSTing-Kang Chang   // TODO(tholenst): directly write into a secret data.
66*e7b1675dSTing-Kang Chang   return util::SecretDataFromStringView(string_buf.str());
67*e7b1675dSTing-Kang Chang }
68*e7b1675dSTing-Kang Chang 
69*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<KeysetHandle>
ParseKeysetWithoutSecretFromProtoKeysetFormat(absl::string_view serialized_keyset)70*e7b1675dSTing-Kang Chang ParseKeysetWithoutSecretFromProtoKeysetFormat(
71*e7b1675dSTing-Kang Chang     absl::string_view serialized_keyset) {
72*e7b1675dSTing-Kang Chang   std::string keyset_copy = std::string(serialized_keyset);
73*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>> result =
74*e7b1675dSTing-Kang Chang     KeysetHandle::ReadNoSecret(keyset_copy);
75*e7b1675dSTing-Kang Chang   if (!result.ok()) {
76*e7b1675dSTing-Kang Chang     return result.status();
77*e7b1675dSTing-Kang Chang   }
78*e7b1675dSTing-Kang Chang   return std::move(**result);
79*e7b1675dSTing-Kang Chang }
80*e7b1675dSTing-Kang Chang 
81*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<std::string>
SerializeKeysetWithoutSecretToProtoKeysetFormat(const KeysetHandle & keyset_handle)82*e7b1675dSTing-Kang Chang SerializeKeysetWithoutSecretToProtoKeysetFormat(
83*e7b1675dSTing-Kang Chang     const KeysetHandle& keyset_handle) {
84*e7b1675dSTing-Kang Chang   std::stringbuf string_buf(std::ios_base::out);
85*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::unique_ptr<BinaryKeysetWriter>>
86*e7b1675dSTing-Kang Chang       keyset_writer = BinaryKeysetWriter::New(
87*e7b1675dSTing-Kang Chang           std::make_unique<std::ostream>(&string_buf));
88*e7b1675dSTing-Kang Chang   if (!keyset_writer.ok()) {
89*e7b1675dSTing-Kang Chang     return keyset_writer.status();
90*e7b1675dSTing-Kang Chang   }
91*e7b1675dSTing-Kang Chang   crypto::tink::util::Status status =
92*e7b1675dSTing-Kang Chang       keyset_handle.WriteNoSecret(keyset_writer->get());
93*e7b1675dSTing-Kang Chang   if (!status.ok()) {
94*e7b1675dSTing-Kang Chang     return status;
95*e7b1675dSTing-Kang Chang   }
96*e7b1675dSTing-Kang Chang   return string_buf.str();
97*e7b1675dSTing-Kang Chang }
98*e7b1675dSTing-Kang Chang 
99*e7b1675dSTing-Kang Chang }  // namespace tink
100*e7b1675dSTing-Kang Chang }  // namespace crypto
101*e7b1675dSTing-Kang Chang 
102