otdf-python 0.3.5__py3-none-any.whl → 0.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. otdf_python/__init__.py +1 -2
  2. otdf_python/__main__.py +1 -2
  3. otdf_python/address_normalizer.py +8 -10
  4. otdf_python/aesgcm.py +8 -0
  5. otdf_python/assertion_config.py +21 -0
  6. otdf_python/asym_crypto.py +18 -22
  7. otdf_python/auth_headers.py +7 -6
  8. otdf_python/autoconfigure_utils.py +22 -6
  9. otdf_python/cli.py +5 -5
  10. otdf_python/collection_store.py +13 -0
  11. otdf_python/collection_store_impl.py +5 -0
  12. otdf_python/config.py +13 -0
  13. otdf_python/connect_client.py +1 -0
  14. otdf_python/constants.py +2 -0
  15. otdf_python/crypto_utils.py +4 -0
  16. otdf_python/dpop.py +3 -5
  17. otdf_python/ecc_constants.py +12 -14
  18. otdf_python/ecc_mode.py +7 -2
  19. otdf_python/ecdh.py +24 -25
  20. otdf_python/eckeypair.py +5 -0
  21. otdf_python/header.py +5 -0
  22. otdf_python/invalid_zip_exception.py +6 -2
  23. otdf_python/kas_client.py +48 -55
  24. otdf_python/kas_connect_rpc_client.py +16 -19
  25. otdf_python/kas_info.py +4 -3
  26. otdf_python/kas_key_cache.py +10 -9
  27. otdf_python/key_type.py +4 -0
  28. otdf_python/key_type_constants.py +4 -11
  29. otdf_python/manifest.py +24 -0
  30. otdf_python/nanotdf.py +34 -24
  31. otdf_python/nanotdf_ecdsa_struct.py +5 -9
  32. otdf_python/nanotdf_type.py +12 -0
  33. otdf_python/policy_binding_serializer.py +6 -4
  34. otdf_python/policy_info.py +6 -0
  35. otdf_python/policy_object.py +8 -0
  36. otdf_python/policy_stub.py +2 -0
  37. otdf_python/resource_locator.py +22 -13
  38. otdf_python/sdk.py +49 -57
  39. otdf_python/sdk_builder.py +58 -41
  40. otdf_python/sdk_exceptions.py +11 -1
  41. otdf_python/symmetric_and_payload_config.py +6 -0
  42. otdf_python/tdf.py +47 -10
  43. otdf_python/tdf_reader.py +10 -13
  44. otdf_python/tdf_writer.py +5 -0
  45. otdf_python/token_source.py +4 -3
  46. otdf_python/version.py +5 -0
  47. otdf_python/zip_reader.py +10 -2
  48. otdf_python/zip_writer.py +11 -0
  49. {otdf_python-0.3.5.dist-info → otdf_python-0.4.1.dist-info}/METADATA +19 -2
  50. {otdf_python-0.3.5.dist-info → otdf_python-0.4.1.dist-info}/RECORD +52 -52
  51. {otdf_python-0.3.5.dist-info → otdf_python-0.4.1.dist-info}/WHEEL +1 -1
  52. {otdf_python-0.3.5.dist-info → otdf_python-0.4.1.dist-info}/licenses/LICENSE +0 -0
otdf_python/tdf.py CHANGED
@@ -1,3 +1,5 @@
1
+ """TDF reader and writer functionality for OpenTDF platform."""
2
+
1
3
  import base64
2
4
  import hashlib
3
5
  import hmac
@@ -31,17 +33,23 @@ from otdf_python.tdf_writer import TDFWriter
31
33
 
32
34
  @dataclass
33
35
  class TDFReader:
36
+ """Container for TDF payload and manifest after reading."""
37
+
34
38
  payload: bytes
35
39
  manifest: Manifest
36
40
 
37
41
 
38
42
  @dataclass
39
43
  class TDFReaderConfig:
44
+ """Configuration for TDF reader operations."""
45
+
40
46
  kas_private_key: str | None = None
41
47
  attributes: list[str] | None = None
42
48
 
43
49
 
44
50
  class TDF:
51
+ """TDF reader and writer for handling TDF encryption and decryption."""
52
+
45
53
  MAX_TDF_INPUT_SIZE = 68719476736
46
54
  GCM_KEY_SIZE = 32
47
55
  GCM_IV_SIZE = 12
@@ -53,6 +61,13 @@ class TDF:
53
61
  GLOBAL_KEY_SALT = b"TDF-Session-Key"
54
62
 
55
63
  def __init__(self, services=None, maximum_size: int | None = None):
64
+ """Initialize TDF reader/writer.
65
+
66
+ Args:
67
+ services: SDK services for KAS operations
68
+ maximum_size: Maximum size allowed for TDF operations
69
+
70
+ """
56
71
  self.services = services
57
72
  self.maximum_size = maximum_size or self.MAX_TDF_INPUT_SIZE
58
73
 
@@ -74,7 +89,7 @@ class TDF:
74
89
  except Exception as e:
75
90
  raise ValueError(
76
91
  f"Failed to fetch public key for KAS {kas.url}: {e}"
77
- )
92
+ ) from e
78
93
  else:
79
94
  raise ValueError(
80
95
  "Each KAS info must have a public_key, or SDK services must be available to fetch it"
@@ -162,7 +177,7 @@ class TDF:
162
177
  return _json.dumps(policy, default=self._serialize_policy_object)
163
178
 
164
179
  def _serialize_policy_object(self, obj):
165
- """Custom TDF serializer to convert to compatible JSON format."""
180
+ """Serialize policy object to compatible JSON format."""
166
181
  from otdf_python.policy_object import AttributeObject, PolicyBody
167
182
 
168
183
  if isinstance(obj, PolicyBody):
@@ -185,9 +200,7 @@ class TDF:
185
200
  return obj.__dict__
186
201
 
187
202
  def _unwrap_key(self, key_access_objs, private_key_pem):
188
- """
189
- Unwraps the key locally using a provided private key (used for testing)
190
- """
203
+ """Unwrap the key locally using provided private key (used for testing)."""
191
204
  from .asym_crypto import AsymDecryption
192
205
 
193
206
  key = None
@@ -204,9 +217,7 @@ class TDF:
204
217
  return key
205
218
 
206
219
  def _unwrap_key_with_kas(self, key_access_objs, policy_b64) -> bytes:
207
- """
208
- Unwraps the key using the KAS service (production method)
209
- """
220
+ """Unwrap the key using the KAS service (production method)."""
210
221
  # Get KAS client from services
211
222
  if not self.services:
212
223
  raise ValueError("SDK services required for KAS operations")
@@ -281,6 +292,17 @@ class TDF:
281
292
  config: TDFConfig,
282
293
  output_stream: io.BytesIO | None = None,
283
294
  ):
295
+ """Create a TDF with the provided payload and configuration.
296
+
297
+ Args:
298
+ payload: The payload data as bytes or BinaryIO
299
+ config: TDFConfig for encryption settings
300
+ output_stream: Optional output stream, creates new BytesIO if not provided
301
+
302
+ Returns:
303
+ Tuple of (manifest, size, output_stream)
304
+
305
+ """
284
306
  if output_stream is None:
285
307
  output_stream = io.BytesIO()
286
308
  writer = TDFWriter(output_stream)
@@ -380,6 +402,16 @@ class TDF:
380
402
  def load_tdf(
381
403
  self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig
382
404
  ) -> TDFReader:
405
+ """Load and decrypt a TDF from the provided data.
406
+
407
+ Args:
408
+ tdf_data: The TDF data as bytes or BytesIO
409
+ config: TDFReaderConfig with optional private key for local unwrapping
410
+
411
+ Returns:
412
+ TDFReader containing payload and manifest
413
+
414
+ """
383
415
  # Extract manifest, unwrap payload key using KAS client
384
416
  # Handle both bytes and BinaryIO input
385
417
  tdf_bytes_io = io.BytesIO(tdf_data) if isinstance(tdf_data, bytes) else tdf_data
@@ -423,8 +455,13 @@ class TDF:
423
455
  def read_payload(
424
456
  self, tdf_bytes: bytes, config: dict, output_stream: BinaryIO
425
457
  ) -> None:
426
- """
427
- Reads and verifies TDF segments, decrypts if needed, and writes the payload to output_stream.
458
+ """Read and verify TDF segments, decrypt if needed, and write the payload.
459
+
460
+ Args:
461
+ tdf_bytes: The TDF data as bytes
462
+ config: Configuration dictionary for reading
463
+ output_stream: The output stream to write the payload to
464
+
428
465
  """
429
466
  import base64
430
467
  import zipfile
otdf_python/tdf_reader.py CHANGED
@@ -1,6 +1,4 @@
1
- """
2
- TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
3
- """
1
+ """TDFReader is responsible for reading and processing Trusted Data Format (TDF) files."""
4
2
 
5
3
  from .manifest import Manifest
6
4
  from .policy_object import PolicyObject
@@ -13,15 +11,13 @@ TDF_PAYLOAD_FILE_NAME = "0.payload"
13
11
 
14
12
 
15
13
  class TDFReader:
16
- """
17
- TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
14
+ """TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
18
15
  The class initializes with a TDF file channel, extracts the manifest and payload entries,
19
16
  and provides methods to retrieve the manifest content, read payload bytes, and read policy objects.
20
17
  """
21
18
 
22
19
  def __init__(self, tdf):
23
- """
24
- Initialize a TDFReader with a TDF file channel.
20
+ """Initialize a TDFReader with a TDF file channel.
25
21
 
26
22
  Args:
27
23
  tdf: A file-like object containing the TDF data
@@ -29,6 +25,7 @@ class TDFReader:
29
25
  Raises:
30
26
  SDKException: If there's an error reading the TDF
31
27
  ValueError: If the TDF doesn't contain a manifest or payload
28
+
32
29
  """
33
30
  try:
34
31
  self._zip_reader = ZipReader(tdf)
@@ -48,14 +45,14 @@ class TDFReader:
48
45
  raise SDKException("Error initializing TDFReader") from e
49
46
 
50
47
  def manifest(self) -> str:
51
- """
52
- Get the manifest content as a string.
48
+ """Get the manifest content as a string.
53
49
 
54
50
  Returns:
55
51
  The manifest content as a UTF-8 encoded string
56
52
 
57
53
  Raises:
58
54
  SDKException: If there's an error retrieving the manifest
55
+
59
56
  """
60
57
  try:
61
58
  manifest_data = self._zip_reader.read(self._manifest_name)
@@ -64,8 +61,7 @@ class TDFReader:
64
61
  raise SDKException("Error retrieving manifest from zip file") from e
65
62
 
66
63
  def read_payload_bytes(self, buf: bytearray) -> int:
67
- """
68
- Read bytes from the payload into a buffer.
64
+ """Read bytes from the payload into a buffer.
69
65
 
70
66
  Args:
71
67
  buf: A bytearray buffer to read into
@@ -75,6 +71,7 @@ class TDFReader:
75
71
 
76
72
  Raises:
77
73
  SDKException: If there's an error reading from the payload
74
+
78
75
  """
79
76
  try:
80
77
  # Read the entire payload
@@ -89,14 +86,14 @@ class TDFReader:
89
86
  raise SDKException("Error reading from payload in TDF") from e
90
87
 
91
88
  def read_policy_object(self) -> PolicyObject:
92
- """
93
- Read the policy object from the manifest.
89
+ """Read the policy object from the manifest.
94
90
 
95
91
  Returns:
96
92
  The PolicyObject
97
93
 
98
94
  Raises:
99
95
  SDKException: If there's an error reading the policy object
96
+
100
97
  """
101
98
  try:
102
99
  manifest_text = self.manifest()
otdf_python/tdf_writer.py CHANGED
@@ -1,13 +1,18 @@
1
+ """TDF writer for creating encrypted TDF files."""
2
+
1
3
  import io
2
4
 
3
5
  from otdf_python.zip_writer import ZipWriter
4
6
 
5
7
 
6
8
  class TDFWriter:
9
+ """TDF file writer for creating encrypted TDF packages."""
10
+
7
11
  TDF_PAYLOAD_FILE_NAME = "0.payload"
8
12
  TDF_MANIFEST_FILE_NAME = "0.manifest.json"
9
13
 
10
14
  def __init__(self, out_stream: io.BytesIO | None = None):
15
+ """Initialize TDF writer."""
11
16
  self._zip_writer = ZipWriter(out_stream)
12
17
 
13
18
  def append_manifest(self, manifest: str):
@@ -1,6 +1,4 @@
1
- """
2
- TokenSource: Handles OAuth2 token acquisition and caching.
3
- """
1
+ """TokenSource: Handles OAuth2 token acquisition and caching."""
4
2
 
5
3
  import time
6
4
 
@@ -8,7 +6,10 @@ import httpx
8
6
 
9
7
 
10
8
  class TokenSource:
9
+ """OAuth2 token source for authentication."""
10
+
11
11
  def __init__(self, token_url, client_id, client_secret):
12
+ """Initialize token source."""
12
13
  self.token_url = token_url
13
14
  self.client_id = client_id
14
15
  self.client_secret = client_secret
otdf_python/version.py CHANGED
@@ -1,9 +1,13 @@
1
+ """SDK version information."""
2
+
1
3
  import re
2
4
  from functools import total_ordering
3
5
 
4
6
 
5
7
  @total_ordering
6
8
  class Version:
9
+ """Semantic version representation."""
10
+
7
11
  SEMVER_PATTERN = re.compile(
8
12
  r"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?P<prereleaseAndMetadata>\D.*)?$"
9
13
  )
@@ -15,6 +19,7 @@ class Version:
15
19
  patch=None,
16
20
  prerelease_and_metadata: str | None = None,
17
21
  ):
22
+ """Initialize semantic version."""
18
23
  if minor is None and patch is None:
19
24
  # Parse from string
20
25
  m = self.SEMVER_PATTERN.match(semver_or_major)
otdf_python/zip_reader.py CHANGED
@@ -1,3 +1,5 @@
1
+ """ZIP file reader for TDF operations."""
2
+
1
3
  import io
2
4
  import zipfile
3
5
 
@@ -5,8 +7,13 @@ from otdf_python.invalid_zip_exception import InvalidZipException
5
7
 
6
8
 
7
9
  class ZipReader:
10
+ """ZIP file reader for reading TDF packages."""
11
+
8
12
  class Entry:
13
+ """ZIP file entry with data access."""
14
+
9
15
  def __init__(self, zipfile_obj, zipinfo):
16
+ """Initialize ZIP entry."""
10
17
  self._zipfile = zipfile_obj
11
18
  self._zipinfo = zipinfo
12
19
 
@@ -17,9 +24,10 @@ class ZipReader:
17
24
  try:
18
25
  return self._zipfile.read(self._zipinfo)
19
26
  except Exception as e:
20
- raise InvalidZipException(f"Error reading entry data: {e}")
27
+ raise InvalidZipException(f"Error reading entry data: {e}") from e
21
28
 
22
29
  def __init__(self, in_stream: io.BytesIO | bytes | None = None):
30
+ """Initialize ZIP reader."""
23
31
  try:
24
32
  if isinstance(in_stream, bytes):
25
33
  in_stream = io.BytesIO(in_stream)
@@ -29,7 +37,7 @@ class ZipReader:
29
37
  self.Entry(self.zipfile, zi) for zi in self.zipfile.infolist()
30
38
  ]
31
39
  except zipfile.BadZipFile as e:
32
- raise InvalidZipException(f"Invalid ZIP file: {e}")
40
+ raise InvalidZipException(f"Invalid ZIP file: {e}") from e
33
41
 
34
42
  def get_entries(self) -> list:
35
43
  return self.entries
otdf_python/zip_writer.py CHANGED
@@ -1,10 +1,15 @@
1
+ """ZIP file writer for TDF operations."""
2
+
1
3
  import io
2
4
  import zipfile
3
5
  import zlib
4
6
 
5
7
 
6
8
  class FileInfo:
9
+ """ZIP file metadata information."""
10
+
7
11
  def __init__(self, name: str, crc: int, size: int, offset: int):
12
+ """Initialize file info."""
8
13
  self.name = name
9
14
  self.crc = crc
10
15
  self.size = size
@@ -12,7 +17,10 @@ class FileInfo:
12
17
 
13
18
 
14
19
  class ZipWriter:
20
+ """ZIP file writer for creating TDF packages."""
21
+
15
22
  def __init__(self, out_stream: io.BytesIO | None = None):
23
+ """Initialize ZIP writer."""
16
24
  self.out_stream = out_stream or io.BytesIO()
17
25
  self.zipfile = zipfile.ZipFile(
18
26
  self.out_stream, mode="w", compression=zipfile.ZIP_STORED
@@ -45,7 +53,10 @@ class ZipWriter:
45
53
 
46
54
 
47
55
  class _TrackingWriter(io.RawIOBase):
56
+ """Internal ZIP stream writer with offset tracking."""
57
+
48
58
  def __init__(self, zip_writer: ZipWriter, name: str, offset: int):
59
+ """Initialize tracking writer."""
49
60
  self._zip_writer = zip_writer
50
61
  self._name = name
51
62
  self._offset = offset
@@ -1,11 +1,28 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: otdf-python
3
- Version: 0.3.5
3
+ Version: 0.4.1
4
4
  Summary: Unofficial OpenTDF SDK for Python
5
+ Project-URL: Homepage, https://github.com/b-long/opentdf-python-sdk
6
+ Project-URL: Repository, https://github.com/b-long/opentdf-python-sdk
7
+ Project-URL: Issues, https://github.com/b-long/opentdf-python-sdk/issues
5
8
  Author-email: b-long <b-long@users.noreply.github.com>
6
9
  License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Topic :: Security :: Cryptography
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Classifier: Typing :: Typed
7
24
  Requires-Python: >=3.10
8
- Requires-Dist: connect-python[compiler]>=0.4.2
25
+ Requires-Dist: connect-python[compiler]<0.5,>=0.4.2
9
26
  Requires-Dist: cryptography>=45.0.4
10
27
  Requires-Dist: grpcio-status>=1.74.0
11
28
  Requires-Dist: grpcio-tools>=1.74.0
@@ -1,51 +1,51 @@
1
- otdf_python/__init__.py,sha256=oTB1bue61KAwDNJ1ITtvIv7YqF3fgXtpha1WztQnvHE,542
2
- otdf_python/__main__.py,sha256=V9cmvhX9Ht2wpPOHGrw_onBogStJnuWTx9eyiezEDsQ,276
3
- otdf_python/address_normalizer.py,sha256=pv7RoG4Dwac6so7NK1zCsVZBNFCcQK3cj_4iW6FPnRw,2815
4
- otdf_python/aesgcm.py,sha256=KhMabIUYxxp1gUwdwNLiwD-SvmJPqW2PunbgeguMEh8,1666
5
- otdf_python/assertion_config.py,sha256=P2Pc1OxMk9Ln6bvp1ZI8j66Q7uoZoYB7oMB6WLG38Y8,1763
6
- otdf_python/asym_crypto.py,sha256=dwx3lUxUt3e8JA9z2lQrpsOBA3x36DN07bQbcVGZBvI,7251
7
- otdf_python/auth_headers.py,sha256=a0TQD36QKXO1G4swume2wx3Sk9zQsSWEAQJnST2DlH0,966
8
- otdf_python/autoconfigure_utils.py,sha256=NiNtbapBoIO-6kM59HRvX3Kj_Z0IRMrTkFlXjwuNfPc,3236
9
- otdf_python/cli.py,sha256=0wXan-QrKQllIlSCnXDsFAT1EQpH7gv7g6TZKIVGI8E,19883
10
- otdf_python/collection_store.py,sha256=MH1RxlevRVFj5lBS_6DN3zz5ZgOhBjD0P7AYBLBqS0o,1004
11
- otdf_python/collection_store_impl.py,sha256=g3YeSwMeXr1BNmwmFr75fv9ptPjieC36Bhct-Jf1trw,613
12
- otdf_python/config.py,sha256=uGYVByTWl7pWcKRER41ef-ay5VevIbOyUAEd6BIArVg,2185
13
- otdf_python/connect_client.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- otdf_python/constants.py,sha256=SFGjrzB1GK4CkSZgNlEUIAZMY37MelTxgc8ajXIAhoc,53
15
- otdf_python/crypto_utils.py,sha256=KsNss9EC-wHs1nCiKivDnxJSMv0uxGlWLDcCowadcV8,2837
16
- otdf_python/dpop.py,sha256=ssKXTGydJS--rBTCqX9Y8qy-c5Um4pIZPG3DZcj0rWU,2301
17
- otdf_python/ecc_constants.py,sha256=uZkYeuhSnqCLjnrINOsaQQhdCKUTKLwL0t2Cswou4BA,5892
18
- otdf_python/ecc_mode.py,sha256=8q-R_XR9WWmuzwI0gI6RQpsEzK8PD8Hi8uuDCvSsGXY,3077
19
- otdf_python/ecdh.py,sha256=D8jHIZHYeQwCGCtjd3FJLXqIXnnYeEqSRLiWoiHZm1k,10233
20
- otdf_python/eckeypair.py,sha256=4uZfdJaqSxW605FhU58Gko06mixSNoDOGBgVpP5VlSQ,2324
21
- otdf_python/header.py,sha256=0p259_GNO9aumUg0KOBZkiawKZTdFzoYVcyHaMCMVC8,7045
22
- otdf_python/invalid_zip_exception.py,sha256=YEU20hM5_yE-RWJncPZobcqj4a90RAuahB54VjAS2SU,213
23
- otdf_python/kas_client.py,sha256=NP8T6G5SWuciJbYnX0QNrGGlpMhqTYbcjED2tfiTr8U,25938
24
- otdf_python/kas_connect_rpc_client.py,sha256=LRhdFF6d8qz_BDFN4WMu0Kn-ZynvKMEWmuHYPj09A6Q,7862
25
- otdf_python/kas_info.py,sha256=STnyPo-Vu_rzVQRdQl8mUGPK8eZE2vY4oPkI-PqrZJM,687
26
- otdf_python/kas_key_cache.py,sha256=Ems2NyKC_3yh_xs8k4_n2gA3Jb-9nCeRRjIdz1LRC9I,1472
27
- otdf_python/key_type.py,sha256=cwhlh6DOFG5C8JlCxFqXYi0SJDlOLUkxceg7L8arFNk,816
28
- otdf_python/key_type_constants.py,sha256=ghridYdhFMLKDa_9Q5cplrl8DqdEgApd--20bJ-MBtA,1001
29
- otdf_python/manifest.py,sha256=Uv-Hvo9hOPLrSPTeKQpDvNeHzq7qSmJ5HYtkgGwVppE,6419
30
- otdf_python/nanotdf.py,sha256=3pQ5Lip_pExhdfj2wqm58RS1Tb7A9f7dcxGIzVXSDuQ,33828
31
- otdf_python/nanotdf_ecdsa_struct.py,sha256=nRScIJLeNcbxBBE9DlG15I7EXGTkH0ITib1ra-C1-uQ,4100
32
- otdf_python/nanotdf_type.py,sha256=40PyDd62iDwcfmS7rhUeQE2B0W6FYIeCpi5cDmMO7d4,819
33
- otdf_python/policy_binding_serializer.py,sha256=8d9MizhLTdy14ghdAvhXRBA8KzKt6Nf9kmmU9hoWhrQ,1169
34
- otdf_python/policy_info.py,sha256=HGAOkxyB1I0N8_nHpnFkJXYJaycYsetqvWFNTxwwPi0,1951
35
- otdf_python/policy_object.py,sha256=zzwHk6jhZwpiX2BWxTJ1kDl3cgFijQfQrKJP3OqI35Q,380
36
- otdf_python/policy_stub.py,sha256=BQn06Ye5MwCu9feJZFPmO_UTfhugtiQa539iBkSQwhQ,117
37
- otdf_python/resource_locator.py,sha256=vrTWtkIh82Ba4KRS6k6Pm92lQG5KazIQ18xX4VoX86Y,6050
38
- otdf_python/sdk.py,sha256=7KKsjlUXL8_rUFVKoHFW37jvzS9Pi8Cww86NPyp3Kjw,14207
39
- otdf_python/sdk_builder.py,sha256=jgswTxnAfKXDGqEOIQwEiE3S0Jh0w5HMtPxHwUFIu-U,14655
40
- otdf_python/sdk_exceptions.py,sha256=L_bYkkyF-hnEBFXfjT5C41i5lM-t8OJB5mU_1zYvfP8,479
41
- otdf_python/symmetric_and_payload_config.py,sha256=D_LArhk1gA5-tpUiaUZTTM90ZKdc3DCq1a6X8etCir8,992
42
- otdf_python/tdf.py,sha256=WYfCVn7BAEBKTVEPT0SSYuCI0S6S_TgYB3C3FbHProU,19612
43
- otdf_python/tdf_reader.py,sha256=XQ3CuIXSOVRuBMYv2YIYlyaY-tHQA85HHHqNBoXNH9o,5267
44
- otdf_python/tdf_writer.py,sha256=DVEGEl8pyBm1JK2K-9BJKmT2TqvQXokPkthAQMwgCkk,645
45
- otdf_python/token_source.py,sha256=tfHWcIpPQ3FR45DUDiKz6q_vBaHH_HNifnnIpDVbMD8,923
46
- otdf_python/version.py,sha256=-MUAI4rKLCv3eGkVtEhBzqpyZOT7hZDWdzqJhfnS_BQ,1906
47
- otdf_python/zip_reader.py,sha256=GuE4hMDJfeFx6UtCUeFLmsZCJiK4RFNyyzlERA8T6Uw,1470
48
- otdf_python/zip_writer.py,sha256=UizpXBvqnl7v1mQvIr-vBIF50NwGFU0YWI-I4Y1XNW0,2091
1
+ otdf_python/__init__.py,sha256=q93tKt2r5-_244iKPeJf4ja1ftlmOmdRQnXWAZsxISI,542
2
+ otdf_python/__main__.py,sha256=VuImcvrzCHTYOwQ-yS9HQwKmF2O6lORf1psmOkdZIh0,275
3
+ otdf_python/address_normalizer.py,sha256=7gigfxFIFnDILi8BGQipuLl-Cr71pwi5vE72hbpLdmI,2850
4
+ otdf_python/aesgcm.py,sha256=jQgVSEeKM6MJuH2tvlClXIzvg11a5O_GEY9Sh56CrxE,1947
5
+ otdf_python/assertion_config.py,sha256=rw0SIB3xG-nAeb5r_liuxLphU4tcj-zlq8rVvXncX-Y,2317
6
+ otdf_python/asym_crypto.py,sha256=EYkMNhZJP5khH0IvICTOG2bMg_TMvd6wXDu5zW0jpj4,7234
7
+ otdf_python/auth_headers.py,sha256=uOLflFunBCw59nwk23rdiFQWOFrS19HugQXuQPGv3xE,986
8
+ otdf_python/autoconfigure_utils.py,sha256=ShmqQrz_Fx8NrJwcSU1LhNOvIaYRlVo5F5jOikoGR98,3699
9
+ otdf_python/cli.py,sha256=HKIzuIXIW2sBwW3jy9sGq8WVFlxlKrdKac9MjJig88Y,19940
10
+ otdf_python/collection_store.py,sha256=elUkxIZ3SxR7Ny6pAoaYRYwkF0lzF_A21WKPpQCCGvE,1442
11
+ otdf_python/collection_store_impl.py,sha256=3RqO3rvDCosajKpuls5DiO2_SWYsNQul9_9L7n-lQ68,758
12
+ otdf_python/config.py,sha256=l1Ykg1gFUrFZTnd6bwMI6oi_clR5uCZ_Y1qH7QKtW90,2523
13
+ otdf_python/connect_client.py,sha256=TpHpcU2t19pSqWn30cqzfM48nDG590BfNTlDPgUu054,45
14
+ otdf_python/constants.py,sha256=ArVgY9OF2fkVM7dg0-9N3xs0xmKy0DWDUlVcO0_n9PQ,102
15
+ otdf_python/crypto_utils.py,sha256=x0cEltQDVW8bxJ9L555KQKJU4_dI5Uw2h7j9oQGNT38,2933
16
+ otdf_python/dpop.py,sha256=-76xjKz9Alf529StB_jQWhr-gCAOBkpssaSYQw2EH1A,2295
17
+ otdf_python/ecc_constants.py,sha256=rCVZCWZ9zhyq2sqnUGFadiZ1CwXXe5T9olDtFYCJCIs,5846
18
+ otdf_python/ecc_mode.py,sha256=aEAISAZpXcS72gXRUlYgH8n8EJP7zIpOeSVPxUJdAG8,3163
19
+ otdf_python/ecdh.py,sha256=ut_WC2DMSOqlzyoIq8nWD8L51BGLiqzQPZB7FnrN2h8,10231
20
+ otdf_python/eckeypair.py,sha256=qcPKv0OS1lYxRICj9dhAW_eMz32anFBtpI8EJfXxpX0,2470
21
+ otdf_python/header.py,sha256=peG14kE_KAUCW4fY82sqcWF5zTAVAnJfFXCHtC8Z0iQ,7189
22
+ otdf_python/invalid_zip_exception.py,sha256=M_bAiXEjJdxPfA178YH-uHGRwMrNBKzjQzlQ54aDP2w,292
23
+ otdf_python/kas_client.py,sha256=dC0A23-dWU0S7vy2-VVp55RYFX9xdX0Seerd3M-CBek,25961
24
+ otdf_python/kas_connect_rpc_client.py,sha256=2orgU6HPqAykELc0YR7K8XkCEBZ9japZm4W-Eb8_jCg,7817
25
+ otdf_python/kas_info.py,sha256=V-5om8k4RKbhE0h1CS1Rxb18TYcHKvq_hEPP6ah8K_o,738
26
+ otdf_python/kas_key_cache.py,sha256=6hfzRAg9o_IfRErWSe-_gGTG9kRyYENMizMY1Shkmfk,1548
27
+ otdf_python/key_type.py,sha256=2gQlXOj35J3ISCcWjU3sGYUxmlZR47BMq6Xr2yoKA8k,928
28
+ otdf_python/key_type_constants.py,sha256=MV2Dsea3A6nnnYztoD0N1QxhrbQXZfaXaqCr2rI6sqo,954
29
+ otdf_python/manifest.py,sha256=aglGw9EdtZZIxmwqy82sV5wum_mKkjzew4brSgxmJjc,7047
30
+ otdf_python/nanotdf.py,sha256=-tgt-78V7XOm8pPGgBIf1kHRn_Ctm9dudf3UZsT1AsU,34073
31
+ otdf_python/nanotdf_ecdsa_struct.py,sha256=HI7Ca15opfRvQkk7Ja-Xw5Jkrs8Ml5OJsw4zsh2T5fc,4076
32
+ otdf_python/nanotdf_type.py,sha256=pJXcDTc0nqOYAcFU06iy2w_rCbRKmSdsrbOaBbS6C_Q,1112
33
+ otdf_python/policy_binding_serializer.py,sha256=oOcGBYOISPTzHRtk8JszwLTraY_F2OoevOf0a53jGHA,1271
34
+ otdf_python/policy_info.py,sha256=aq74dZg9PhTZ6cMkZyFsu3D754C5YijFMiuoYEL-1bY,2076
35
+ otdf_python/policy_object.py,sha256=LikIsahPkKr-iYA0lhgQitCbh8CsmxUBYyBs6VYfmxY,512
36
+ otdf_python/policy_stub.py,sha256=RfU_fICqsAOnTXOHpKhtKC0RJ3KoWhDxO0XecZWM548,159
37
+ otdf_python/resource_locator.py,sha256=bjK935XcfNq-PyqidHNq8eIiPeZEStYdQvmQ9B9GY20,6290
38
+ otdf_python/sdk.py,sha256=bo6ACCds5ELppIcnKOvasP8Swl1Y7hiLNVuIEu9S7Eg,14074
39
+ otdf_python/sdk_builder.py,sha256=cmeBcgE76jCG7aN4qbn3dYuVdNF6kbJi9xY7jnuD26k,14581
40
+ otdf_python/sdk_exceptions.py,sha256=2GElGyM5LKN8Uh_lAiT6Ho4oNRWYRQsMNOK5s2jiv28,687
41
+ otdf_python/symmetric_and_payload_config.py,sha256=iPHeZSeY9BjsQ-wkvdm6-FIR7773EgGiaIvSG-ICOHw,1158
42
+ otdf_python/tdf.py,sha256=PtVBY_vAPIGz1I4gUlHPLPxa1gCCsd2nlRm0SrbaoJA,20840
43
+ otdf_python/tdf_reader.py,sha256=WMetzX4CIKJ15f4J_zyFGtObQO6bQ33KC_ykIonH9ik,5228
44
+ otdf_python/tdf_writer.py,sha256=FLm1P26J4p6WPyKsjOb7QLYJqDIMDsBONqBW_JuFxyw,798
45
+ otdf_python/token_source.py,sha256=YHbP7deSSXo1CvzVGJX7DkOuBgqwfP_Ockm8CE-MN0o,1011
46
+ otdf_python/version.py,sha256=uDKJKsSQoaEH-JlqAwiXDxceLRX9hkG4I3NVLEfDCHA,2025
47
+ otdf_python/zip_reader.py,sha256=qrHv-ecs09tz99ZKdOMiWaciYf2XsQOUTiXy1JHjuEY,1705
48
+ otdf_python/zip_writer.py,sha256=5-KChgEXCf4TKAAML-R8cqpAiap85ur1l2lJCCac6BE,2405
49
49
  otdf_python_proto/__init__.py,sha256=2MVQMcsELGYF8NyXU8OFFQdXM1_WTKpdA9MUqiMazE8,931
50
50
  otdf_python_proto/authorization/__init__.py,sha256=hDpCNPxPswsfkcrCiv3Y78nqAQ_FxE9uDrYqeIqKipg,42
51
51
  otdf_python_proto/authorization/authorization_pb2.py,sha256=VxRCF1popd01Po0uC-H3Uz85Z6y39ICuzwjFuRWkDoE,9085
@@ -131,7 +131,7 @@ otdf_python_proto/wellknownconfiguration/__init__.py,sha256=X3GeZJ1mG_N1MViryjkq
131
131
  otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py,sha256=g9xSm9TxX0IPMqiFCaridJvI2TrL8PrXVFPgu8tX9VM,3863
132
132
  otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi,sha256=Zw4vROvTgomnFqsalJrYda632ojXH0FVXSzTXxerybw,1490
133
133
  otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py,sha256=i9rGG2mgQZfk6xGCp1ywu4QqKWSiwpuLoNKGUwl43t8,5346
134
- otdf_python-0.3.5.dist-info/METADATA,sha256=i1HQiMcbs71lXuIu0HCWxMo7EYlN130f95Mv0JulNsM,4225
135
- otdf_python-0.3.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
136
- otdf_python-0.3.5.dist-info/licenses/LICENSE,sha256=DPrPHdI6tfZcqk9kzQ37vh1Ftk7LJYdMrUtwKl7L3Pw,1074
137
- otdf_python-0.3.5.dist-info/RECORD,,
134
+ otdf_python-0.4.1.dist-info/METADATA,sha256=uYTDX1sh7JDcDDoO0iwjs7srIxPVmOTTUyjSSP5UDcc,5132
135
+ otdf_python-0.4.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
136
+ otdf_python-0.4.1.dist-info/licenses/LICENSE,sha256=DPrPHdI6tfZcqk9kzQ37vh1Ftk7LJYdMrUtwKl7L3Pw,1074
137
+ otdf_python-0.4.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any