Skip to content

Commit f495358

Browse files
feat: add support for custom kms hosts (#5)
* feat: add support for custom kms hosts * chore: update tests * chore: bump version
1 parent 28bb498 commit f495358

File tree

5 files changed

+12
-11
lines changed

5 files changed

+12
-11
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "phase_dev"
7-
version = "1.0.0"
7+
version = "1.1.0"
88
description = "Python SDK for Phase"
99
readme = "README.md"
1010
requires-python = ">=3.10"

src/phase/phase.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from .utils.crypto import decrypt_b64, encrypt_b64, fetch_app_key, random_key_pair, reconstruct_secret
55
from .version import __version__, __ph_version__
66

7+
DEFAULT_KMS_HOST = "https://kms.phase.dev"
8+
79

810
@dataclass
911
class AppSecret:
@@ -18,8 +20,9 @@ class Phase:
1820
_app_id = ''
1921
_app_pub_key = ''
2022
_app_secret = None
23+
_kms_host = ''
2124

22-
def __init__(self, app_id, app_secret):
25+
def __init__(self, app_id, app_secret, custom_kms_host=None):
2326
app_id_pattern = re.compile(r"^phApp:v(\d+):([a-fA-F0-9]{64})$")
2427
app_secret_pattern = re.compile(
2528
r"^pss:v(\d+):([a-fA-F0-9]{64}):([a-fA-F0-9]{64,128}):([a-fA-F0-9]{64})$")
@@ -32,9 +35,10 @@ def __init__(self, app_id, app_secret):
3235

3336
self._app_id = app_id
3437
self._app_pub_key = app_id.split(':')[2]
35-
app_secret_segments = app_secret.split(':')
3638

39+
app_secret_segments = app_secret.split(':')
3740
self._app_secret = AppSecret(*app_secret_segments)
41+
self._kms_host = f"{custom_kms_host}/kms" if custom_kms_host else DEFAULT_KMS_HOST
3842

3943
def encrypt(self, plaintext, tag="") -> str | None:
4044
"""
@@ -81,7 +85,7 @@ def decrypt(self, phase_ciphertext) -> str | None:
8185
client_pub_key = bytes.fromhex(client_pub_key_hex)
8286

8387
keyshare1 = fetch_app_key(
84-
self._app_secret.app_token, self._app_secret.keyshare1_unwrap_key, self._app_id, len(ct)/2)
88+
self._app_secret.app_token, self._app_secret.keyshare1_unwrap_key, self._app_id, len(ct)/2, self._kms_host)
8589

8690
app_priv_key = reconstruct_secret(
8791
[self._app_secret.keyshare0, keyshare1])

src/phase/utils/crypto.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
from ..version import __version__
77

88

9-
PHASE_KMS_URI = "https://kms.phase.dev/"
10-
11-
129
def xor_bytes(a, b) -> bytes:
1310
"""
1411
Computes the XOR of two byte arrays byte by byte.
@@ -129,7 +126,7 @@ def decrypt_b64(ct, key) -> bytes:
129126
return plaintext_bytes.decode('utf-8')
130127

131128

132-
def fetch_app_key(appToken, wrapKey, appId, dataSize) -> str:
129+
def fetch_app_key(appToken, wrapKey, appId, dataSize, host) -> str:
133130
"""
134131
Fetches the application key share from Phase KMS.
135132
@@ -152,7 +149,7 @@ def fetch_app_key(appToken, wrapKey, appId, dataSize) -> str:
152149
"PhSize": f"{dataSize}"
153150
}
154151

155-
response = requests.get(f"{PHASE_KMS_URI}{appId}", headers=headers)
152+
response = requests.get(f"{host}/{appId}", headers=headers)
156153

157154
if response.status_code == 404:
158155
raise Exception("Invalid app token")

src/phase/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__version__ = "1.0.0"
1+
__version__ = "1.1.0"
22
__ph_version__ = "v1"

tests/test_decrypt.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def phase_instance():
1111
return Phase(APP_ID, APP_SECRET)
1212

1313

14-
def mock_fetch_app_key(appToken, wrapKey, appId, dataSize):
14+
def mock_fetch_app_key(appToken, wrapKey, appId, dataSize, custom_kms_host=None):
1515
return "e35ae9560207c90fa3dd68a8715e13a1ef988bffa284db73f04328df17f37cfe"
1616

1717

0 commit comments

Comments
 (0)