diff options
author | wiktorg <wiktorg@google.com> | 2022-03-31 02:41:52 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-03-31 02:42:35 -0700 |
commit | 68bb5c9d6a050cbbdca24baeb4edb25897e30bd1 (patch) | |
tree | 9eabbfe7d25961de0a84a7ea55d2ce1ff8a6c0f3 /cc/util | |
parent | 8b8492fbf7fdf6d0881da59a534be4de92e92fe2 (diff) | |
download | tink-68bb5c9d6a050cbbdca24baeb4edb25897e30bd1.tar.gz |
Add utility to create SecretProto from SecretData
PiperOrigin-RevId: 438516329
Diffstat (limited to 'cc/util')
-rw-r--r-- | cc/util/BUILD.bazel | 2 | ||||
-rw-r--r-- | cc/util/CMakeLists.txt | 2 | ||||
-rw-r--r-- | cc/util/secret_proto.h | 10 | ||||
-rw-r--r-- | cc/util/secret_proto_test.cc | 11 |
4 files changed, 25 insertions, 0 deletions
diff --git a/cc/util/BUILD.bazel b/cc/util/BUILD.bazel index efe423091..74f94d9aa 100644 --- a/cc/util/BUILD.bazel +++ b/cc/util/BUILD.bazel @@ -52,6 +52,8 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":secret_data", + ":status", + ":statusor", "@com_google_absl//absl/memory", "@com_google_protobuf//:protobuf_lite", ], diff --git a/cc/util/CMakeLists.txt b/cc/util/CMakeLists.txt index f5be7b0d4..7dee990ef 100644 --- a/cc/util/CMakeLists.txt +++ b/cc/util/CMakeLists.txt @@ -432,6 +432,8 @@ tink_cc_library( secret_proto.h DEPS tink::util::secret_data + tink::util::status + tink::util::statusor protobuf::libprotobuf absl::memory ) diff --git a/cc/util/secret_proto.h b/cc/util/secret_proto.h index f59497e33..dad8f79ad 100644 --- a/cc/util/secret_proto.h +++ b/cc/util/secret_proto.h @@ -23,6 +23,8 @@ #include "google/protobuf/arena.h" #include "absl/memory/memory.h" #include "tink/util/secret_data.h" +#include "tink/util/status.h" +#include "tink/util/statusor.h" namespace crypto { namespace tink { @@ -51,6 +53,14 @@ inline google::protobuf::ArenaOptions SecretArenaOptions() { template <typename T> class SecretProto { public: + static StatusOr<SecretProto<T>> ParseFromSecretData(const SecretData& data) { + SecretProto<T> proto; + if (!proto->ParseFromArray(data.data(), data.size())) { + return Status(absl::StatusCode::kInternal, "Could not parse proto"); + } + return proto; + } + SecretProto() {} SecretProto(const SecretProto& other) { *value_ = *other.value_; } diff --git a/cc/util/secret_proto_test.cc b/cc/util/secret_proto_test.cc index 842b27742..5a84950b9 100644 --- a/cc/util/secret_proto_test.cc +++ b/cc/util/secret_proto_test.cc @@ -130,6 +130,17 @@ TYPED_TEST(SecretProtoTest, MoveAssignment) { EXPECT_TRUE(MessageDifferencer::Equals(*t, proto)); } +TYPED_TEST(SecretProtoTest, FromSecretData) { + TypeParam proto = CreateProto<TypeParam>(); + SecretData data; + data.resize(proto.ByteSizeLong()); + ASSERT_TRUE(proto.SerializeToArray(data.data(), data.size())); + StatusOr<SecretProto<TypeParam>> secret_proto = + SecretProto<TypeParam>::ParseFromSecretData(data); + ASSERT_TRUE(secret_proto.ok()) << secret_proto.status(); + EXPECT_TRUE(MessageDifferencer::Equals(**secret_proto, proto)); +} + } // namespace } // namespace util } // namespace tink |