aboutsummaryrefslogtreecommitdiff
path: root/cc/util
diff options
context:
space:
mode:
authorwiktorg <wiktorg@google.com>2022-03-31 02:41:52 -0700
committerCopybara-Service <copybara-worker@google.com>2022-03-31 02:42:35 -0700
commit68bb5c9d6a050cbbdca24baeb4edb25897e30bd1 (patch)
tree9eabbfe7d25961de0a84a7ea55d2ce1ff8a6c0f3 /cc/util
parent8b8492fbf7fdf6d0881da59a534be4de92e92fe2 (diff)
downloadtink-68bb5c9d6a050cbbdca24baeb4edb25897e30bd1.tar.gz
Add utility to create SecretProto from SecretData
PiperOrigin-RevId: 438516329
Diffstat (limited to 'cc/util')
-rw-r--r--cc/util/BUILD.bazel2
-rw-r--r--cc/util/CMakeLists.txt2
-rw-r--r--cc/util/secret_proto.h10
-rw-r--r--cc/util/secret_proto_test.cc11
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