openlinktoken 2.0.0__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 (72) hide show
  1. openlinktoken/__init__.py +15 -0
  2. openlinktoken/attributes/__init__.py +17 -0
  3. openlinktoken/attributes/attribute.py +26 -0
  4. openlinktoken/attributes/attribute_expression.py +232 -0
  5. openlinktoken/attributes/attribute_loader.py +48 -0
  6. openlinktoken/attributes/base_attribute.py +31 -0
  7. openlinktoken/attributes/combined_attribute.py +69 -0
  8. openlinktoken/attributes/general/__init__.py +17 -0
  9. openlinktoken/attributes/general/date_attribute.py +117 -0
  10. openlinktoken/attributes/general/decimal_attribute.py +86 -0
  11. openlinktoken/attributes/general/integer_attribute.py +78 -0
  12. openlinktoken/attributes/general/record_id_attribute.py +41 -0
  13. openlinktoken/attributes/general/string_attribute.py +55 -0
  14. openlinktoken/attributes/general/year_attribute.py +78 -0
  15. openlinktoken/attributes/person/__init__.py +25 -0
  16. openlinktoken/attributes/person/age_attribute.py +41 -0
  17. openlinktoken/attributes/person/birth_date_attribute.py +40 -0
  18. openlinktoken/attributes/person/birth_year_attribute.py +39 -0
  19. openlinktoken/attributes/person/canadian_postal_code_attribute.py +165 -0
  20. openlinktoken/attributes/person/first_name_attribute.py +112 -0
  21. openlinktoken/attributes/person/last_name_attribute.py +146 -0
  22. openlinktoken/attributes/person/postal_code_attribute.py +42 -0
  23. openlinktoken/attributes/person/sex_attribute.py +48 -0
  24. openlinktoken/attributes/person/social_security_number_attribute.py +119 -0
  25. openlinktoken/attributes/person/us_postal_code_attribute.py +104 -0
  26. openlinktoken/attributes/serializable_attribute.py +7 -0
  27. openlinktoken/attributes/utilities/__init__.py +7 -0
  28. openlinktoken/attributes/utilities/attribute_utilities.py +224 -0
  29. openlinktoken/attributes/validation/__init__.py +23 -0
  30. openlinktoken/attributes/validation/age_range_validator.py +41 -0
  31. openlinktoken/attributes/validation/attribute_validator.py +22 -0
  32. openlinktoken/attributes/validation/date_range_validator.py +111 -0
  33. openlinktoken/attributes/validation/not_in_validator.py +48 -0
  34. openlinktoken/attributes/validation/not_null_or_empty_validator.py +21 -0
  35. openlinktoken/attributes/validation/not_starts_with_validator.py +48 -0
  36. openlinktoken/attributes/validation/regex_validator.py +44 -0
  37. openlinktoken/attributes/validation/serializable_attribute_validator.py +26 -0
  38. openlinktoken/attributes/validation/year_range_validator.py +48 -0
  39. openlinktoken/ec_key_utils.py +207 -0
  40. openlinktoken/exchange_config.py +305 -0
  41. openlinktoken/exchange_jwe.py +107 -0
  42. openlinktoken/metadata.py +104 -0
  43. openlinktoken/tokens/__init__.py +19 -0
  44. openlinktoken/tokens/base_token_definition.py +48 -0
  45. openlinktoken/tokens/definitions/t1_token.py +39 -0
  46. openlinktoken/tokens/definitions/t2_token.py +39 -0
  47. openlinktoken/tokens/definitions/t3_token.py +39 -0
  48. openlinktoken/tokens/definitions/t4_token.py +37 -0
  49. openlinktoken/tokens/definitions/t5_token.py +37 -0
  50. openlinktoken/tokens/token.py +38 -0
  51. openlinktoken/tokens/token_definition.py +46 -0
  52. openlinktoken/tokens/token_generation_exception.py +16 -0
  53. openlinktoken/tokens/token_generator.py +201 -0
  54. openlinktoken/tokens/token_generator_result.py +33 -0
  55. openlinktoken/tokens/token_registry.py +46 -0
  56. openlinktoken/tokens/tokenizer/__init__.py +11 -0
  57. openlinktoken/tokens/tokenizer/passthrough_tokenizer.py +66 -0
  58. openlinktoken/tokens/tokenizer/sha256_tokenizer.py +72 -0
  59. openlinktoken/tokens/tokenizer/tokenizer.py +31 -0
  60. openlinktoken/tokentransformer/__init__.py +43 -0
  61. openlinktoken/tokentransformer/decrypt_token_transformer.py +83 -0
  62. openlinktoken/tokentransformer/encrypt_token_transformer.py +85 -0
  63. openlinktoken/tokentransformer/encryption_constants.py +23 -0
  64. openlinktoken/tokentransformer/hash_token_transformer.py +88 -0
  65. openlinktoken/tokentransformer/jwe_match_token_formatter.py +128 -0
  66. openlinktoken/tokentransformer/match_token_constants.py +57 -0
  67. openlinktoken/tokentransformer/no_operation_token_transformer.py +24 -0
  68. openlinktoken/tokentransformer/token_transformer.py +22 -0
  69. openlinktoken-2.0.0.dist-info/METADATA +21 -0
  70. openlinktoken-2.0.0.dist-info/RECORD +72 -0
  71. openlinktoken-2.0.0.dist-info/WHEEL +5 -0
  72. openlinktoken-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,128 @@
1
+ # SPDX-License-Identifier: MIT
2
+ """
3
+ JWE Match Token Formatter for Open Link Token V1 format.
4
+ """
5
+
6
+ import base64
7
+ import json
8
+ import time
9
+ from typing import Optional, Union
10
+
11
+ from jwcrypto import jwe, jwk
12
+
13
+ from openlinktoken.tokentransformer.match_token_constants import (
14
+ HEADER_KEY_ALGORITHM,
15
+ HEADER_KEY_ENCRYPTION,
16
+ HEADER_KEY_KEY_ID,
17
+ HEADER_KEY_TYPE,
18
+ PAYLOAD_KEY_HASH_ALGORITHM,
19
+ PAYLOAD_KEY_ISSUED_AT,
20
+ PAYLOAD_KEY_ISSUER,
21
+ PAYLOAD_KEY_MAC_ALGORITHM,
22
+ PAYLOAD_KEY_PPID,
23
+ PAYLOAD_KEY_RING_ID,
24
+ PAYLOAD_KEY_RULE_ID,
25
+ TOKEN_TYPE,
26
+ V1_TOKEN_PREFIX,
27
+ )
28
+ from openlinktoken.tokentransformer.token_transformer import TokenTransformer
29
+
30
+
31
+ class JweMatchTokenFormatter(TokenTransformer):
32
+ """
33
+ Formats tokens in the JWE-based match token format (olt.V1.<JWE>).
34
+
35
+ This formatter wraps the privacy-protected identifier (PPID) in a
36
+ self-contained JWE structure with all necessary metadata for versioning
37
+ and cryptographic agility.
38
+
39
+ See RFC 7516 - JSON Web Encryption (JWE)
40
+ """
41
+
42
+ def __init__(self, encryption_key: Union[str, bytes], ring_id: str, rule_id: str, issuer: Optional[str] = None):
43
+ """
44
+ Initialize the JWE match token formatter.
45
+
46
+ Accepts either a ``str`` (UTF-8 encoded; must encode to exactly 32 bytes) or
47
+ raw ``bytes`` (must be exactly 32 bytes) for the encryption key.
48
+
49
+ Args:
50
+ encryption_key: The encryption key (must be exactly 32 bytes for AES-256).
51
+ ring_id: The ring identifier for key management.
52
+ rule_id: The token rule identifier (e.g., "T1", "T2", etc.).
53
+ issuer: The issuer identifier (optional, defaults to "org.openlinktoken").
54
+
55
+ Raises:
56
+ ValueError: If encryption_key, ring_id, or rule_id are invalid.
57
+ """
58
+ if isinstance(encryption_key, bytes):
59
+ key_bytes = encryption_key
60
+ else:
61
+ key_bytes = encryption_key.encode("utf-8") if encryption_key else b""
62
+
63
+ if not key_bytes or len(key_bytes) != 32:
64
+ raise ValueError("Encryption key must be exactly 32 bytes (256 bits)")
65
+ if not ring_id:
66
+ raise ValueError("Ring ID must not be None or empty")
67
+ if not rule_id:
68
+ raise ValueError("Rule ID must not be None or empty")
69
+
70
+ self.ring_id = ring_id
71
+ self.rule_id = rule_id
72
+ self.issuer = issuer if issuer else "org.openlinktoken"
73
+
74
+ # Create JWK from the encryption key - needs to be base64url-encoded
75
+ key_b64 = base64.urlsafe_b64encode(key_bytes).decode("utf-8").rstrip("=")
76
+ self.jwk_key = jwk.JWK(kty="oct", k=key_b64)
77
+
78
+ def transform(self, token: str) -> str:
79
+ """
80
+ Transform a token (PPID) into the JWE match token format.
81
+
82
+ The input token should be the base64-encoded HMAC output from previous transformers.
83
+ This method wraps it in a JWE structure with metadata and prepends the "olt.V1." prefix.
84
+
85
+ Args:
86
+ token: The privacy-protected identifier (PPID) to wrap in JWE format
87
+
88
+ Returns:
89
+ The formatted match token: olt.V1.<JWE compact serialization>
90
+
91
+ Raises:
92
+ Exception: If JWE encryption or serialization fails
93
+ """
94
+ if not token:
95
+ # Return as-is for blank tokens
96
+ return token
97
+
98
+ try:
99
+ # Build the JWE payload with metadata
100
+ payload = {
101
+ PAYLOAD_KEY_RULE_ID: self.rule_id,
102
+ PAYLOAD_KEY_HASH_ALGORITHM: "SHA-256",
103
+ PAYLOAD_KEY_MAC_ALGORITHM: "HS256",
104
+ PAYLOAD_KEY_PPID: [token], # PPID as an array (single element for hash-based tokens)
105
+ PAYLOAD_KEY_RING_ID: self.ring_id,
106
+ PAYLOAD_KEY_ISSUER: self.issuer,
107
+ PAYLOAD_KEY_ISSUED_AT: int(time.time()),
108
+ }
109
+
110
+ # Create JWE header with algorithm and encryption method
111
+ protected_header = {
112
+ HEADER_KEY_ALGORITHM: "dir", # Direct encryption (key used directly)
113
+ HEADER_KEY_ENCRYPTION: "A256GCM", # AES-256-GCM encryption
114
+ HEADER_KEY_TYPE: TOKEN_TYPE,
115
+ HEADER_KEY_KEY_ID: self.ring_id,
116
+ }
117
+
118
+ # Create JWE object
119
+ jwe_token = jwe.JWE(
120
+ plaintext=json.dumps(payload).encode("utf-8"), recipient=self.jwk_key, protected=protected_header
121
+ )
122
+
123
+ # Serialize to compact form and prepend the olt.V1. prefix
124
+ jwe_compact = jwe_token.serialize(compact=True)
125
+ return V1_TOKEN_PREFIX + jwe_compact
126
+
127
+ except Exception as e:
128
+ raise Exception(f"JWE token generation failed for rule {self.rule_id}: {str(e)}")
@@ -0,0 +1,57 @@
1
+ """Shared constants for match token formatting and parsing."""
2
+
3
+ # Canonical prefix for version 1 match tokens.
4
+ V1_TOKEN_PREFIX = "olt.V1."
5
+
6
+ # Prefixes accepted by readers that consume JWE-wrapped V1 tokens.
7
+ SUPPORTED_V1_TOKEN_PREFIXES = (V1_TOKEN_PREFIX,)
8
+
9
+ # Token type value used in the protected JWE header.
10
+ TOKEN_TYPE = "match-token"
11
+
12
+ # Payload key for token rule identifier.
13
+ PAYLOAD_KEY_RULE_ID = "rlid"
14
+
15
+ # Payload key for hash algorithm metadata.
16
+ PAYLOAD_KEY_HASH_ALGORITHM = "hash_alg"
17
+
18
+ # Payload key for MAC algorithm metadata.
19
+ PAYLOAD_KEY_MAC_ALGORITHM = "mac_alg"
20
+
21
+ # Payload key for PPID values.
22
+ PAYLOAD_KEY_PPID = "ppid"
23
+
24
+ # Payload key for ring identifier.
25
+ PAYLOAD_KEY_RING_ID = "rid"
26
+
27
+ # Payload key for issuer identifier.
28
+ PAYLOAD_KEY_ISSUER = "iss"
29
+
30
+ # Payload key for issued-at UNIX timestamp.
31
+ PAYLOAD_KEY_ISSUED_AT = "iat"
32
+
33
+ # Protected header key for JOSE algorithm.
34
+ HEADER_KEY_ALGORITHM = "alg"
35
+
36
+ # Protected header key for content encryption algorithm.
37
+ HEADER_KEY_ENCRYPTION = "enc"
38
+
39
+ # Protected header key for token type.
40
+ HEADER_KEY_TYPE = "typ"
41
+
42
+ # Protected header key for key identifier.
43
+ HEADER_KEY_KEY_ID = "kid"
44
+
45
+
46
+ def is_supported_v1_token(token: str) -> bool:
47
+ """Return True when the token starts with a recognized V1 JWE prefix."""
48
+ return any(token.startswith(prefix) for prefix in SUPPORTED_V1_TOKEN_PREFIXES)
49
+
50
+
51
+ def strip_supported_v1_token_prefix(token: str) -> str:
52
+ """Strip the recognized V1 JWE prefix from a token and return the JWE body."""
53
+ for prefix in SUPPORTED_V1_TOKEN_PREFIXES:
54
+ if token.startswith(prefix):
55
+ return token[len(prefix) :]
56
+
57
+ raise ValueError("Token does not start with a supported V1 prefix")
@@ -0,0 +1,24 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ from openlinktoken.tokentransformer.token_transformer import TokenTransformer
4
+
5
+
6
+ class NoOperationTokenTransformer(TokenTransformer):
7
+ """
8
+ A No Operation token transformer. No transformation is
9
+ applied whatsoever.
10
+ """
11
+
12
+ def transform(self, token: str) -> str:
13
+ """
14
+ No operation token transformer.
15
+
16
+ Does not transform the token in any ways.
17
+
18
+ Args:
19
+ token: The token to be transformed.
20
+
21
+ Returns:
22
+ The unchanged token.
23
+ """
24
+ return token
@@ -0,0 +1,22 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ from abc import ABC, abstractmethod
4
+
5
+
6
+ class TokenTransformer(ABC):
7
+ """A generic interface for the token transformer."""
8
+
9
+ @abstractmethod
10
+ def transform(self, token: str) -> str:
11
+ """
12
+ Transforms the token using a token transformation rule/strategy.
13
+
14
+ Args:
15
+ token: The token to be transformed.
16
+
17
+ Returns:
18
+ The transformed token.
19
+
20
+ Raises:
21
+ Exception: Error encountered while transforming the token.
22
+ """
@@ -0,0 +1,21 @@
1
+ Metadata-Version: 2.4
2
+ Name: openlinktoken
3
+ Version: 2.0.0
4
+ Summary: Open Link Token Python core library for record linkage
5
+ Home-page: https://github.com/TruvetaPublic/OpenLinkToken
6
+ Author: Open Link Token Contributors
7
+ Project-URL: Source, https://github.com/TruvetaPublic/OpenLinkToken
8
+ Project-URL: Documentation, https://github.com/TruvetaPublic/OpenLinkToken/blob/main/README.md
9
+ Requires-Python: >=3.10
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: cryptography==48.0.1
12
+ Requires-Dist: jwcrypto==1.5.7
13
+ Dynamic: author
14
+ Dynamic: description
15
+ Dynamic: description-content-type
16
+ Dynamic: home-page
17
+ Dynamic: project-url
18
+ Dynamic: requires-python
19
+ Dynamic: summary
20
+
21
+ Open Link Token Python implementation for record linkage.
@@ -0,0 +1,72 @@
1
+ openlinktoken/__init__.py,sha256=srpf_Qj0yHW0mwqElujCL6GO0L79xedSRVYDLEkyNBc,285
2
+ openlinktoken/ec_key_utils.py,sha256=773XoCyL2JNP2MDjpT4RCPG97KxwgVWrb7viNcKwAcw,6951
3
+ openlinktoken/exchange_config.py,sha256=pSOGUeLrqp8GuwEl8zb4aZ-HaXTsWH0aqXSIK1C9I5I,12671
4
+ openlinktoken/exchange_jwe.py,sha256=FMjqDMOIk9dhA6WOXuoEikZS4nIe0Uqk296jmQP79Dc,3984
5
+ openlinktoken/metadata.py,sha256=ZY0bodkz3r87XNxyq_AP3yey1swFh5KV7p9LGyPi4bY,3457
6
+ openlinktoken/attributes/__init__.py,sha256=d4YS_FuWyjpWKyLSd4BkoBVyikO7nUKX4uZFBx9aITI,490
7
+ openlinktoken/attributes/attribute.py,sha256=fvQo6qY4iZqShQd4vxZAxzmuYop7KIP1VwXqWt-9Njk,683
8
+ openlinktoken/attributes/attribute_expression.py,sha256=kj_fAN2iAYrS9zLkRRm_gITEKrNx907Iy9DrAH1WKNY,7645
9
+ openlinktoken/attributes/attribute_loader.py,sha256=eCZg0hIvy6qSRSNoytgryJNe3sWb9Q1VU4WPW4rJ9gQ,2029
10
+ openlinktoken/attributes/base_attribute.py,sha256=PsImVO9JfjHxp9-vPq3rvU78_pm8xyZ6uK-g5MG6om0,1192
11
+ openlinktoken/attributes/combined_attribute.py,sha256=UJgWdQJvKhWZmgc_xvASYnK9wjVPAegAK2Ku_1JnqW4,2372
12
+ openlinktoken/attributes/serializable_attribute.py,sha256=e7Bg0VQPHV3x3LMVJcXSUpVeh-mWsubq-ggujhjK5H4,173
13
+ openlinktoken/attributes/general/__init__.py,sha256=HfaNUQeD-lo3TDl3Fxq6-6k5Lv3UCKQLzUas3uf6JdU,480
14
+ openlinktoken/attributes/general/date_attribute.py,sha256=JdpEkmRZn3hudgSFPpZjIWwsBUaVWvs7j3VVxr6zbKU,3729
15
+ openlinktoken/attributes/general/decimal_attribute.py,sha256=IbdVV8vx0HqYkk-1ZhlINL3IHKaQqACle9kdGQ6a9HE,2970
16
+ openlinktoken/attributes/general/integer_attribute.py,sha256=XQV3tdS760W-a0IKDJ3lgbCgczTLBaGbipLv3H7Ot44,2586
17
+ openlinktoken/attributes/general/record_id_attribute.py,sha256=uUjspCI5odsptjh_YclDFuK2NBoNfLtLC_OoshTFDf0,1158
18
+ openlinktoken/attributes/general/string_attribute.py,sha256=YrofYIREzNWZboyTHTKVipQw2siovfEhDl0DKTmHX8M,1466
19
+ openlinktoken/attributes/general/year_attribute.py,sha256=8BDojLLDuSFpUjwoTzJZ_E7i2WRu21Noya4oL2da5xc,2604
20
+ openlinktoken/attributes/person/__init__.py,sha256=RRHUGb7t5y8GNmtOEbRCwXWPcDjh-h68Dr91k7dOIXk,880
21
+ openlinktoken/attributes/person/age_attribute.py,sha256=iJFdeEW-FKPXAaKOCMrLaHeX4-znbQvYMg4y-yLkIL8,1247
22
+ openlinktoken/attributes/person/birth_date_attribute.py,sha256=33GZJXJkHsW7d1_jQtFHupohvZ108bZCUdMXnGhqdfY,1211
23
+ openlinktoken/attributes/person/birth_year_attribute.py,sha256=CQmexwGmf_gnmZrtzlXyccSd2fVY3CtJxLHTNCNKLHI,1206
24
+ openlinktoken/attributes/person/canadian_postal_code_attribute.py,sha256=VlfeDL0vehbGZXU0N8PmLF2hBpyfGqb5yBl2iD3t3Yk,6721
25
+ openlinktoken/attributes/person/first_name_attribute.py,sha256=M1fo8dtJzJ44pFO2_WTzVoJzuu3kOhM5DQGdlCluJM0,3835
26
+ openlinktoken/attributes/person/last_name_attribute.py,sha256=rb4cRFJIhZ_BiLuQNYir6lcABeqJWF0df-2L4DuaPhI,5753
27
+ openlinktoken/attributes/person/postal_code_attribute.py,sha256=VN7ygip3tcSr_t_r43rrECY9YAPPbZjoFZ6VIEkGXLA,1731
28
+ openlinktoken/attributes/person/sex_attribute.py,sha256=tgWWK4kAfLI4CZbj2t9Q78Oey2Qt8FQqV4KBo409ClY,1426
29
+ openlinktoken/attributes/person/social_security_number_attribute.py,sha256=BkG8oZ-qvshHIDVs1pRyTR4_id_g-r6ODn9dSrCzQo8,4134
30
+ openlinktoken/attributes/person/us_postal_code_attribute.py,sha256=TvJUp3JJUtzmvz_rADdRlO25GqhChYSlxp9VVjlSmKE,3821
31
+ openlinktoken/attributes/utilities/__init__.py,sha256=tBT47qbeiD1jub0RBwiNxjqZvQYZ-9tOpdeekMlbjFo,142
32
+ openlinktoken/attributes/utilities/attribute_utilities.py,sha256=Yl7E6xfMB2wFxHV4G6_NbXwfluTBk2rLwQBzvAc8urk,7392
33
+ openlinktoken/attributes/validation/__init__.py,sha256=moJKBJF89c9U3Gtq-WoAssVXhC-Vz6Yh7_h9RsHQKgM,807
34
+ openlinktoken/attributes/validation/age_range_validator.py,sha256=rWnZgvqoXSaXgLzjvHp-4XFIUlOc6Q2SImyM1qa5-1I,1115
35
+ openlinktoken/attributes/validation/attribute_validator.py,sha256=qxKGRabyj77tSmM-uGseepD5NYpLcbraxi4wmXFQNdg,434
36
+ openlinktoken/attributes/validation/date_range_validator.py,sha256=7hg3nfDSHhUXDK0ZXBNY0SeK-oMfD9EUcFj89_ralsA,3438
37
+ openlinktoken/attributes/validation/not_in_validator.py,sha256=rvrMfyLzI-ueYyj4vyVs1QlmSQrRywp_tnipQ8BCEvA,1485
38
+ openlinktoken/attributes/validation/not_null_or_empty_validator.py,sha256=no2xr_AH-lklB9xEisFFLsJ_on27KpM__9FZU_4X-6Q,630
39
+ openlinktoken/attributes/validation/not_starts_with_validator.py,sha256=vPllw0ElioQ55hAo9tSMsYSI62q3DOtfD9zuvxaYYis,1484
40
+ openlinktoken/attributes/validation/regex_validator.py,sha256=iBgPvIMX1Bmmn6SLyUydEHVzKneN6DdqU7azAsIIhmE,1261
41
+ openlinktoken/attributes/validation/serializable_attribute_validator.py,sha256=4-IdX7qAcUpUypmTHzozjKc4glkb5GqGWiygLsXbTqM,959
42
+ openlinktoken/attributes/validation/year_range_validator.py,sha256=jRjzmydSYrRBB0D205vkDr2YD8ay5heB_Je9ibzUtPY,1311
43
+ openlinktoken/tokens/__init__.py,sha256=29B6pjlkSpwo1pnvGFtodWRMum7UPfFGc7CxD8ASvrg,586
44
+ openlinktoken/tokens/base_token_definition.py,sha256=vnpeVpxvnK4eq1V1Rvw42RgvMf9RpLEYKxppEPp5ZYQ,1235
45
+ openlinktoken/tokens/token.py,sha256=rQ0Vp_OTAp6U3Wn8zbl1qtZfQUBPtJiV3Pxd5s7gJn8,1102
46
+ openlinktoken/tokens/token_definition.py,sha256=gJIFSlM9vS-DE9zkQB6hIhKw7J7IJNqo8SpWtaE91P0,1480
47
+ openlinktoken/tokens/token_generation_exception.py,sha256=OtDPyq59PqF_VjQNJKiAe4tIZmCcY1bZW7X8pukQ8BY,428
48
+ openlinktoken/tokens/token_generator.py,sha256=tfGfcyNXEFH49Cc31-fuoXoRvCW-vdnAreOWHZulMbg,7442
49
+ openlinktoken/tokens/token_generator_result.py,sha256=0P3XYmF1ruV7flMGx1TmTtVFTCUOaLc4hI0PFwpCn0U,944
50
+ openlinktoken/tokens/token_registry.py,sha256=5eDfQbNsGgMEWKRFj_zl0g8lEXi3NRLk0a4WT-JMhsw,1659
51
+ openlinktoken/tokens/definitions/t1_token.py,sha256=IRCDKLTICAk7AybicFBXkeU7tpZptJ3oO-EU8V_KJFM,1444
52
+ openlinktoken/tokens/definitions/t2_token.py,sha256=OVKb24ZauHKudFlg10TWbsO4wmHlPCkY8S0SjMs5u5Q,1468
53
+ openlinktoken/tokens/definitions/t3_token.py,sha256=heOwzGbx1JcBQviR3ib3JzlX0OBkivWSv0ghX6uoAsg,1435
54
+ openlinktoken/tokens/definitions/t4_token.py,sha256=bVHyk853q3j1EKLWc1XFSQFATGnbPlyfD5-4pQBVm3Y,1330
55
+ openlinktoken/tokens/definitions/t5_token.py,sha256=l3gMQfimLEhY7X_0AIroS39hGNSej4T8pY4F-d0mDIY,1289
56
+ openlinktoken/tokens/tokenizer/__init__.py,sha256=4_6iDHljxDNAb5Hjwcyhmemmak_eHGUMxoxAfS_A9TA,273
57
+ openlinktoken/tokens/tokenizer/passthrough_tokenizer.py,sha256=828CmdXEM55oBP4HkBlwNR0M5LhaASaef31z9USds88,1990
58
+ openlinktoken/tokens/tokenizer/sha256_tokenizer.py,sha256=PmdTLYCimj2-tvd47ueMJV_xMF8ZrXdqM4tQoVw1-GE,2045
59
+ openlinktoken/tokens/tokenizer/tokenizer.py,sha256=ScSlP5GdESQlN6wcrFVPJbHWXclTj_j-5CnbMQrUwhM,850
60
+ openlinktoken/tokentransformer/__init__.py,sha256=_BvICwuwJQF2Mo6-BUhaBRrz9VfzYfCO3_Hd3N7ke0Q,1234
61
+ openlinktoken/tokentransformer/decrypt_token_transformer.py,sha256=u3nlGEryTBW7Qtq_CfarFPbuzPgR1TW3dvrfMnvvMQY,3489
62
+ openlinktoken/tokentransformer/encrypt_token_transformer.py,sha256=f2iXfUQrEePS3z_KONp5w7jSephWtIOCuhekxSbVXcY,3177
63
+ openlinktoken/tokentransformer/encryption_constants.py,sha256=3FWc4h2oD_6kw8vItnggcceJ8z_EdW1v8j505xoPvB0,562
64
+ openlinktoken/tokentransformer/hash_token_transformer.py,sha256=4fs8ZrF8qAywX_5GZeZTcDOlWIXWexn1-SUsGYSw6UA,2795
65
+ openlinktoken/tokentransformer/jwe_match_token_formatter.py,sha256=W6jOieN4PNZnC2Gw7wtXsroJQYtnXVFLIIg2u_rrBNE,4711
66
+ openlinktoken/tokentransformer/match_token_constants.py,sha256=YU78uiL4gC1-Nzs50yUALraCJOeJ_OgxnDAOKzyrmVk,1677
67
+ openlinktoken/tokentransformer/no_operation_token_transformer.py,sha256=pbAAafrr3R0A0XMdvmakWNFyIbNLV2AvXWldkrSyCHM,559
68
+ openlinktoken/tokentransformer/token_transformer.py,sha256=i9V0yMay87tXUmvKDE8FdE3sLdTqJD2bUrkpKNB8wrU,522
69
+ openlinktoken-2.0.0.dist-info/METADATA,sha256=fE5ktzFWey6y9bQQfRYD-HIKXKpcOhaK5sn2jstrOYM,722
70
+ openlinktoken-2.0.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
71
+ openlinktoken-2.0.0.dist-info/top_level.txt,sha256=3J1WoaQlJrajzOwqIpHIUPAohdiE74wH_UIkPWMrYoQ,14
72
+ openlinktoken-2.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ openlinktoken