diff --git a/cpp/src/parquet/encryption/crypto_factory.cc b/cpp/src/parquet/encryption/crypto_factory.cc index 549eeecb1f1a..5c46f6b4925a 100644 --- a/cpp/src/parquet/encryption/crypto_factory.cc +++ b/cpp/src/parquet/encryption/crypto_factory.cc @@ -230,6 +230,15 @@ CryptoFactory::GetExternalFileEncryptionProperties( external_properties_builder.encrypted_columns(encrypted_columns); } + if (!external_encryption_config.app_context.empty()) { + external_properties_builder.app_context(external_encryption_config.app_context); + } + + if (!external_encryption_config.connection_config.empty()) { + external_properties_builder.connection_config(ConvertConnectionConfig( + external_encryption_config.connection_config)); + } + if (key_material_store != nullptr) { key_material_store->SaveMaterial(); } diff --git a/cpp/src/parquet/encryption/crypto_factory_test.cc b/cpp/src/parquet/encryption/crypto_factory_test.cc index 856de7cf4f0b..3f75e49c2bfe 100644 --- a/cpp/src/parquet/encryption/crypto_factory_test.cc +++ b/cpp/src/parquet/encryption/crypto_factory_test.cc @@ -122,6 +122,11 @@ TEST_F(CryptoFactoryTest, ExternalEncryptionConfig) { per_column_encryption["col2"] = attributes_2; config.per_column_encryption = per_column_encryption; + config.app_context = + "{\"user_id\": \"abc123\", \"location\": {\"lat\": 9.7489, \"lon\": -83.7534}}"; + config.connection_config = { + {ParquetCipher::EXTERNAL_DBPA_V1, {{"file_path", "path/to/file"}}} + }; auto properties = crypto_factory_.GetExternalFileEncryptionProperties(kms_config_, config); EXPECT_EQ("kf", properties->footer_key()); @@ -152,6 +157,18 @@ TEST_F(CryptoFactoryTest, ExternalEncryptionConfig) { EXPECT_FALSE(column_properties_3->is_encrypted_with_footer_key()); EXPECT_THAT(column_properties_3->key_metadata(), HasSubstr("kc3")); EXPECT_FALSE(column_properties_3->parquet_cipher().has_value()); + + EXPECT_FALSE(properties->app_context().empty()); + EXPECT_FALSE(properties->connection_config().empty()); + EXPECT_EQ(properties->app_context(), config.app_context); + EXPECT_NE(properties->connection_config().find(ParquetCipher::EXTERNAL_DBPA_V1), + properties->connection_config().end()); + EXPECT_EQ(properties->connection_config().find(ParquetCipher::AES_GCM_CTR_V1), + properties->connection_config().end()); + EXPECT_NE(properties->connection_config().at(ParquetCipher::EXTERNAL_DBPA_V1).find("file_path"), + properties->connection_config().at(ParquetCipher::EXTERNAL_DBPA_V1).end()); + EXPECT_EQ(properties->connection_config().at(ParquetCipher::EXTERNAL_DBPA_V1).at("file_path"), + "path/to/file"); } TEST_F(CryptoFactoryTest, ColumnRepeatedInMapsThrowsException) {