| # 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. |
| |
| # cython: language_level = 3 |
| |
| """Dataset support for Parquet encryption.""" |
| |
| from pyarrow.includes.libarrow_dataset_parquet cimport * |
| from pyarrow._parquet_encryption cimport * |
| from pyarrow._dataset_parquet cimport ParquetFragmentScanOptions, ParquetFileWriteOptions |
| |
| |
| cdef class ParquetEncryptionConfig(_Weakrefable): |
| """ |
| Core configuration class encapsulating parameters for high-level encryption |
| within the Parquet framework. |
| |
| The ParquetEncryptionConfig class serves as a bridge for passing encryption-related |
| parameters to the appropriate components within the Parquet library. It maintains references |
| to objects that define the encryption strategy, Key Management Service (KMS) configuration, |
| and specific encryption configurations for Parquet data. |
| |
| Parameters |
| ---------- |
| crypto_factory : pyarrow.parquet.encryption.CryptoFactory |
| Shared pointer to a `CryptoFactory` object. The `CryptoFactory` is responsible for |
| creating cryptographic components, such as encryptors and decryptors. |
| kms_connection_config : pyarrow.parquet.encryption.KmsConnectionConfig |
| Shared pointer to a `KmsConnectionConfig` object. This object holds the configuration |
| parameters necessary for connecting to a Key Management Service (KMS). |
| encryption_config : pyarrow.parquet.encryption.EncryptionConfiguration |
| Shared pointer to an `EncryptionConfiguration` object. This object defines specific |
| encryption settings for Parquet data, including the keys assigned to different columns. |
| |
| Raises |
| ------ |
| ValueError |
| Raised if `encryption_config` is None. |
| """ |
| cdef: |
| shared_ptr[CParquetEncryptionConfig] c_config |
| |
| # Avoid mistakenly creating attributes |
| __slots__ = () |
| |
| def __cinit__(self, CryptoFactory crypto_factory, KmsConnectionConfig kms_connection_config, |
| EncryptionConfiguration encryption_config): |
| |
| cdef shared_ptr[CEncryptionConfiguration] c_encryption_config |
| |
| if crypto_factory is None: |
| raise ValueError("crypto_factory cannot be None") |
| |
| if kms_connection_config is None: |
| raise ValueError("kms_connection_config cannot be None") |
| |
| if encryption_config is None: |
| raise ValueError("encryption_config cannot be None") |
| |
| self.c_config.reset(new CParquetEncryptionConfig()) |
| |
| c_encryption_config = pyarrow_unwrap_encryptionconfig( |
| encryption_config) |
| |
| self.c_config.get().crypto_factory = pyarrow_unwrap_cryptofactory(crypto_factory) |
| self.c_config.get().kms_connection_config = pyarrow_unwrap_kmsconnectionconfig( |
| kms_connection_config) |
| self.c_config.get().encryption_config = c_encryption_config |
| |
| @staticmethod |
| cdef wrap(shared_ptr[CParquetEncryptionConfig] c_config): |
| cdef ParquetEncryptionConfig python_config = ParquetEncryptionConfig.__new__(ParquetEncryptionConfig) |
| python_config.c_config = c_config |
| return python_config |
| |
| cdef shared_ptr[CParquetEncryptionConfig] unwrap(self): |
| return self.c_config |
| |
| |
| cdef class ParquetDecryptionConfig(_Weakrefable): |
| """ |
| Core configuration class encapsulating parameters for high-level decryption |
| within the Parquet framework. |
| |
| ParquetDecryptionConfig is designed to pass decryption-related parameters to |
| the appropriate decryption components within the Parquet library. It holds references to |
| objects that define the decryption strategy, Key Management Service (KMS) configuration, |
| and specific decryption configurations for reading encrypted Parquet data. |
| |
| Parameters |
| ---------- |
| crypto_factory : pyarrow.parquet.encryption.CryptoFactory |
| Shared pointer to a `CryptoFactory` object, pivotal in creating cryptographic |
| components for the decryption process. |
| kms_connection_config : pyarrow.parquet.encryption.KmsConnectionConfig |
| Shared pointer to a `KmsConnectionConfig` object, containing parameters necessary |
| for connecting to a Key Management Service (KMS) during decryption. |
| decryption_config : pyarrow.parquet.encryption.DecryptionConfiguration |
| Shared pointer to a `DecryptionConfiguration` object, specifying decryption settings |
| for reading encrypted Parquet data. |
| |
| Raises |
| ------ |
| ValueError |
| Raised if `decryption_config` is None. |
| """ |
| |
| cdef: |
| shared_ptr[CParquetDecryptionConfig] c_config |
| |
| # Avoid mistakingly creating attributes |
| __slots__ = () |
| |
| def __cinit__(self, CryptoFactory crypto_factory, KmsConnectionConfig kms_connection_config, |
| DecryptionConfiguration decryption_config): |
| |
| cdef shared_ptr[CDecryptionConfiguration] c_decryption_config |
| |
| if decryption_config is None: |
| raise ValueError( |
| "decryption_config cannot be None") |
| |
| self.c_config.reset(new CParquetDecryptionConfig()) |
| |
| c_decryption_config = pyarrow_unwrap_decryptionconfig( |
| decryption_config) |
| |
| self.c_config.get().crypto_factory = pyarrow_unwrap_cryptofactory(crypto_factory) |
| self.c_config.get().kms_connection_config = pyarrow_unwrap_kmsconnectionconfig( |
| kms_connection_config) |
| self.c_config.get().decryption_config = c_decryption_config |
| |
| @staticmethod |
| cdef wrap(shared_ptr[CParquetDecryptionConfig] c_config): |
| cdef ParquetDecryptionConfig python_config = ParquetDecryptionConfig.__new__(ParquetDecryptionConfig) |
| python_config.c_config = c_config |
| return python_config |
| |
| cdef shared_ptr[CParquetDecryptionConfig] unwrap(self): |
| return self.c_config |
| |
| |
| def set_encryption_config( |
| ParquetFileWriteOptions opts not None, |
| ParquetEncryptionConfig config not None |
| ): |
| cdef shared_ptr[CParquetEncryptionConfig] c_config = config.unwrap() |
| opts.parquet_options.parquet_encryption_config = c_config |
| |
| |
| def set_decryption_properties( |
| ParquetFragmentScanOptions opts not None, |
| FileDecryptionProperties config not None |
| ): |
| cdef CReaderProperties* reader_props = opts.reader_properties() |
| reader_props.file_decryption_properties(config.unwrap()) |
| |
| |
| def set_decryption_config( |
| ParquetFragmentScanOptions opts not None, |
| ParquetDecryptionConfig config not None |
| ): |
| cdef shared_ptr[CParquetDecryptionConfig] c_config = config.unwrap() |
| opts.parquet_options.parquet_decryption_config = c_config |