thamht4190 commented on a change in pull request #8023:
URL: https://github.com/apache/arrow/pull/8023#discussion_r498153010



##########
File path: cpp/src/parquet/encryption/key_metadata.h
##########
@@ -0,0 +1,92 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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.
+
+#pragma once
+
+#include <string>
+
+#include "arrow/util/variant.h"
+
+#include "parquet/encryption/key_material.h"
+#include "parquet/exception.h"
+#include "parquet/platform.h"
+
+namespace parquet {
+namespace encryption {
+
+// Parquet encryption specification defines "key metadata" as an arbitrary 
byte array,
+// generated by file writers for each encryption key, and passed to the low 
level API for
+// storage in the file footer. The "key metadata" field is made available to 
file readers
+// to enable recovery of the key. This interface can be utilized for 
implementation
+// of any key management scheme.
+//
+// The keytools package (PARQUET-1373) implements one approach, of many 
possible, to key
+// management and to generation of the "key metadata" fields. This approach, 
based on the
+// "envelope encryption" pattern, allows integration with KMS servers. It 
keeps the actual
+// material, required to recover a key, in a "key material" object (see the 
KeyMaterial
+// class for details). This class is implemented to support version 1 of the 
parquet key
+// management tools specification.
+//
+// KeyMetadata writes (and reads) the "key metadata" field as a flat json 
object,
+// with the following fields:
+// 1. "keyMaterialType" - a String, with the type of  key material.
+// 2. "internalStorage" - a boolean. If true, means that "key material" is 
kept inside the
+// "key metadata" field. If false, "key material" is kept externally (outside 
Parquet
+// files) - in this case, "key metadata" keeps a reference to the external 
"key material".
+// 3. "keyReference" - a String, with the reference to the external "key 
material".
+// Written only if internalStorage is false.
+//
+// If internalStorage is true, "key material" is a part of "key metadata", and 
the json
+// keeps additional fields, described in the KeyMaterial class.
+class PARQUET_EXPORT KeyMetadata {
+ public:
+  static constexpr const char kKeyMaterialInternalStorageField[] = 
"internalStorage";
+  static constexpr const char kKeyReferenceField[] = "keyReference";
+
+  static KeyMetadata Parse(const std::string& key_metadata_bytes);

Review comment:
       yes, `key_metadata_bytes` is expected to be a serialized json object.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to