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.
- openlinktoken/__init__.py +15 -0
- openlinktoken/attributes/__init__.py +17 -0
- openlinktoken/attributes/attribute.py +26 -0
- openlinktoken/attributes/attribute_expression.py +232 -0
- openlinktoken/attributes/attribute_loader.py +48 -0
- openlinktoken/attributes/base_attribute.py +31 -0
- openlinktoken/attributes/combined_attribute.py +69 -0
- openlinktoken/attributes/general/__init__.py +17 -0
- openlinktoken/attributes/general/date_attribute.py +117 -0
- openlinktoken/attributes/general/decimal_attribute.py +86 -0
- openlinktoken/attributes/general/integer_attribute.py +78 -0
- openlinktoken/attributes/general/record_id_attribute.py +41 -0
- openlinktoken/attributes/general/string_attribute.py +55 -0
- openlinktoken/attributes/general/year_attribute.py +78 -0
- openlinktoken/attributes/person/__init__.py +25 -0
- openlinktoken/attributes/person/age_attribute.py +41 -0
- openlinktoken/attributes/person/birth_date_attribute.py +40 -0
- openlinktoken/attributes/person/birth_year_attribute.py +39 -0
- openlinktoken/attributes/person/canadian_postal_code_attribute.py +165 -0
- openlinktoken/attributes/person/first_name_attribute.py +112 -0
- openlinktoken/attributes/person/last_name_attribute.py +146 -0
- openlinktoken/attributes/person/postal_code_attribute.py +42 -0
- openlinktoken/attributes/person/sex_attribute.py +48 -0
- openlinktoken/attributes/person/social_security_number_attribute.py +119 -0
- openlinktoken/attributes/person/us_postal_code_attribute.py +104 -0
- openlinktoken/attributes/serializable_attribute.py +7 -0
- openlinktoken/attributes/utilities/__init__.py +7 -0
- openlinktoken/attributes/utilities/attribute_utilities.py +224 -0
- openlinktoken/attributes/validation/__init__.py +23 -0
- openlinktoken/attributes/validation/age_range_validator.py +41 -0
- openlinktoken/attributes/validation/attribute_validator.py +22 -0
- openlinktoken/attributes/validation/date_range_validator.py +111 -0
- openlinktoken/attributes/validation/not_in_validator.py +48 -0
- openlinktoken/attributes/validation/not_null_or_empty_validator.py +21 -0
- openlinktoken/attributes/validation/not_starts_with_validator.py +48 -0
- openlinktoken/attributes/validation/regex_validator.py +44 -0
- openlinktoken/attributes/validation/serializable_attribute_validator.py +26 -0
- openlinktoken/attributes/validation/year_range_validator.py +48 -0
- openlinktoken/ec_key_utils.py +207 -0
- openlinktoken/exchange_config.py +305 -0
- openlinktoken/exchange_jwe.py +107 -0
- openlinktoken/metadata.py +104 -0
- openlinktoken/tokens/__init__.py +19 -0
- openlinktoken/tokens/base_token_definition.py +48 -0
- openlinktoken/tokens/definitions/t1_token.py +39 -0
- openlinktoken/tokens/definitions/t2_token.py +39 -0
- openlinktoken/tokens/definitions/t3_token.py +39 -0
- openlinktoken/tokens/definitions/t4_token.py +37 -0
- openlinktoken/tokens/definitions/t5_token.py +37 -0
- openlinktoken/tokens/token.py +38 -0
- openlinktoken/tokens/token_definition.py +46 -0
- openlinktoken/tokens/token_generation_exception.py +16 -0
- openlinktoken/tokens/token_generator.py +201 -0
- openlinktoken/tokens/token_generator_result.py +33 -0
- openlinktoken/tokens/token_registry.py +46 -0
- openlinktoken/tokens/tokenizer/__init__.py +11 -0
- openlinktoken/tokens/tokenizer/passthrough_tokenizer.py +66 -0
- openlinktoken/tokens/tokenizer/sha256_tokenizer.py +72 -0
- openlinktoken/tokens/tokenizer/tokenizer.py +31 -0
- openlinktoken/tokentransformer/__init__.py +43 -0
- openlinktoken/tokentransformer/decrypt_token_transformer.py +83 -0
- openlinktoken/tokentransformer/encrypt_token_transformer.py +85 -0
- openlinktoken/tokentransformer/encryption_constants.py +23 -0
- openlinktoken/tokentransformer/hash_token_transformer.py +88 -0
- openlinktoken/tokentransformer/jwe_match_token_formatter.py +128 -0
- openlinktoken/tokentransformer/match_token_constants.py +57 -0
- openlinktoken/tokentransformer/no_operation_token_transformer.py +24 -0
- openlinktoken/tokentransformer/token_transformer.py +22 -0
- openlinktoken-2.0.0.dist-info/METADATA +21 -0
- openlinktoken-2.0.0.dist-info/RECORD +72 -0
- openlinktoken-2.0.0.dist-info/WHEEL +5 -0
- 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 @@
|
|
|
1
|
+
openlinktoken
|