Improve HTTP sig (for misskey)
2 files changed, 12 insertions(+), 3 deletions(-)

M little_boxes/activitypub.py
M little_boxes/httpsig.py
M little_boxes/activitypub.py +3 -0
@@ 127,6 127,9 @@ class ActivityType(Enum):
     # Used by Prismo
     PAGE = "Page"
 
+    # Misskey uses standalone Key object
+    KEY = "Key"
+
 
 ACTOR_TYPES = [
     ActivityType.PERSON,

          
M little_boxes/httpsig.py +9 -3
@@ 17,6 17,7 @@ from Crypto.Signature import PKCS1_v1_5
 from requests.auth import AuthBase
 
 from .activitypub import get_backend
+from .activitypub import _has_type
 from .errors import ActivityNotFoundError
 from .errors import ActivityGoneError
 from .key import Key

          
@@ 63,11 64,16 @@ def _body_digest(body: str) -> str:
 
 def _get_public_key(key_id: str) -> Key:
     actor = get_backend().fetch_iri(key_id)
-    k = Key(actor["id"], key_id)
-    k.load_pub(actor["publicKey"]["publicKeyPem"])
+    if _has_type(actor["type"], "Key"):
+        # The Key is not embedded in the Person
+        k = Key(actor["owner"], actor["id"])
+        k.load_pub(actor["publicKeyPem"])
+    else:
+        k = Key(actor["id"], actor["publicKey"]["id"])
+        k.load_pub(actor["publicKey"]["publicKeyPem"])
 
     # Ensure the right key was fetch
-    if key_id != actor["publicKey"]["id"]:
+    if key_id != k.key_id():
         raise ValueError(
             f"failed to fetch requested key {key_id}: got {actor['publicKey']['id']}"
         )