From 960a64dd5d6bd5a2b23c7f7c12099f9d9e7f161b Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:20:08 +0530 Subject: [PATCH 01/10] Validate JWK for private key parameters Add validation for private key parameters in JWK. --- src/agentrust_trace/models.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index fe324ed..f58b39b 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -5,6 +5,7 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator _DIGEST_RE = r"^sha(256:[0-9a-f]{64}|384:[0-9a-f]{96})$" +_JWK_PRIVATE_PARAMS = frozenset({"d", "p", "q", "dp", "dq", "qi", "k"}) DigestStr = Annotated[str, Field(pattern=_DIGEST_RE)] @@ -97,7 +98,14 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) + extra = self.model_extra or {} + private = _JWK_PRIVATE_PARAMS & extra.keys() + if private: + raise ValueError( + f"cnf.jwk must not contain private key parameters: {sorted(private)}" + ) return self + class ConfirmationKey(BaseModel): From 670a2523842c226dfc839d0fa3d2d5d866caef59 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:22:30 +0530 Subject: [PATCH 02/10] Implement test for jwk private key rejection Add test to validate rejection of private key parameter 'd'. --- tests/test_models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_models.py b/tests/test_models.py index f1799f0..4798752 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -150,3 +150,10 @@ def test_okp_jwk_with_key_material_accepted() -> None: } record = TrustRecord.model_validate(data) assert record.cnf.jwk.x is not None + +def test_jwk_private_key_d_rejected() -> None: + """cnf.jwk must not contain private key parameter d (RFC 8747 ยง3).""" + data = _load("intel-tdx.json") + data["cnf"]["jwk"]["d"] = "PRIVATE_KEY_MATERIAL" + with pytest.raises(ValidationError): + TrustRecord.model_validate(data) From 23ad7a0f955ce5f6920f89d236f4b4b19c8aa338 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:31:53 +0530 Subject: [PATCH 03/10] Update models.py --- src/agentrust_trace/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index f58b39b..5ac19f9 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -104,8 +104,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"cnf.jwk must not contain private key parameters: {sorted(private)}" ) - return self - + return self class ConfirmationKey(BaseModel): From cf3ea00b92a00a03ba28ab459258e6afa1c0027d Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:33:05 +0530 Subject: [PATCH 04/10] Fix indentation in models.py return statement --- src/agentrust_trace/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index 5ac19f9..a7486bc 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -104,7 +104,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"cnf.jwk must not contain private key parameters: {sorted(private)}" ) - return self + return self class ConfirmationKey(BaseModel): From 265d022f6c0e6f9a4dac7d2ec6e747ba946de511 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:35:39 +0530 Subject: [PATCH 05/10] Type hint for model_extra variable in models.py --- src/agentrust_trace/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index a7486bc..5f66f77 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -98,7 +98,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) - extra = self.model_extra or {} + extra: dict[str, object] = self.model_extra or {} private = _JWK_PRIVATE_PARAMS & extra.keys() if private: raise ValueError( From 5ff0976630174904a62e8f508cb32486db1de51c Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:38:18 +0530 Subject: [PATCH 06/10] Add cast for model_extra type in models.py --- src/agentrust_trace/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index 5f66f77..e9c5c84 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import Annotated, Literal + +from typing import Annotated, Literal,cast from pydantic import BaseModel, ConfigDict, Field, model_validator @@ -98,7 +99,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) - extra: dict[str, object] = self.model_extra or {} + extra = cast(dict[str, object], self.model_extra or {}) private = _JWK_PRIVATE_PARAMS & extra.keys() if private: raise ValueError( From a9587bb6f06ca23830818d2aa4323ecb6930a6e1 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:39:56 +0530 Subject: [PATCH 07/10] Update models.py From 7f11b3e2d1942d9a6c748d02f8fd87f1e570ad12 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:44:59 +0530 Subject: [PATCH 08/10] Refactor model_extra assignment in models.py Removed unnecessary cast in model_extra assignment. --- src/agentrust_trace/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index e9c5c84..14bc76f 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Annotated, Literal,cast +from typing import Annotated, Literal from pydantic import BaseModel, ConfigDict, Field, model_validator @@ -99,7 +99,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) - extra = cast(dict[str, object], self.model_extra or {}) + extra = self.model_extra or {} # type: ignore[has-type] private = _JWK_PRIVATE_PARAMS & extra.keys() if private: raise ValueError( From 9d7fc241ce8b6ea10fa889e666c9d0f0e174357f Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:47:25 +0530 Subject: [PATCH 09/10] Fix handling of model_extra in models.py --- src/agentrust_trace/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index 14bc76f..631d4d7 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -99,7 +99,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) - extra = self.model_extra or {} # type: ignore[has-type] + extra = dict(self.model_extra) if self.model_extra else {} private = _JWK_PRIVATE_PARAMS & extra.keys() if private: raise ValueError( From 237cd096a85e8a47496ac846c291a552a9e87757 Mon Sep 17 00:00:00 2001 From: Harsh-Cyber Date: Sun, 28 Jun 2026 15:50:54 +0530 Subject: [PATCH 10/10] Fix indentation for extra variable assignment --- src/agentrust_trace/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agentrust_trace/models.py b/src/agentrust_trace/models.py index 631d4d7..ae75a8c 100644 --- a/src/agentrust_trace/models.py +++ b/src/agentrust_trace/models.py @@ -99,7 +99,7 @@ def _require_key_material(self) -> JWK: raise ValueError( f"jwk with kty={self.kty!r} must carry key material: missing {', '.join(missing)}" ) - extra = dict(self.model_extra) if self.model_extra else {} + extra = dict(self.model_extra) if self.model_extra else {} private = _JWK_PRIVATE_PARAMS & extra.keys() if private: raise ValueError(