Skip to content

Commit ab50096

Browse files
committed
fix: more efficient kid derivation
Signed-off-by: Daniel Bluhm <[email protected]>
1 parent f731fa0 commit ab50096

File tree

5 files changed

+36
-17
lines changed

5 files changed

+36
-17
lines changed

didcomm_messaging/crypto/backend/askar.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ def multikey(self) -> str:
116116
"""Get the key in multibase format."""
117117
return self._multikey
118118

119+
@property
120+
def key_bytes(self) -> bytes:
121+
"""Get the bytes of the key."""
122+
return self.key.get_public_bytes()
123+
119124

120125
class AskarSecretKey(SecretKey):
121126
"""Secret key implementation for Askar."""

didcomm_messaging/crypto/backend/authlib.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,18 @@ def multikey(self) -> str:
5656
"""Return the key in multikey format."""
5757
return self._multikey
5858

59+
@property
60+
def key_bytes(self) -> bytes:
61+
"""Get the bytes of the key."""
62+
jwk = self.key.as_dict(is_private=False)
63+
codec = self.kty_crv_to_codec.get((jwk["kty"], jwk.get("crv")))
64+
65+
if not codec:
66+
raise ValueError("Unsupported key type")
67+
68+
key_bytes = b64url.decode(jwk["x"])
69+
return key_bytes
70+
5971
@classmethod
6072
def key_to_multikey(cls, key: AsymmetricKey) -> str:
6173
"""Convert an Authlib key to a multikey."""

didcomm_messaging/crypto/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ def kid(self) -> str:
6969
def multikey(self) -> str:
7070
"""Get the key in multikey format."""
7171

72+
@property
73+
@abstractmethod
74+
def key_bytes(self) -> bytes:
75+
"""Get the bytes of the key."""
76+
7277

7378
class SecretKey(ABC):
7479
"""Secret Key Type."""

didcomm_messaging/legacy/messaging.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from didcomm_messaging.crypto import P, S, SecretsManager
1313
from didcomm_messaging.legacy.base import LegacyCryptoService
1414
from didcomm_messaging.legacy.packaging import LegacyPackagingService
15-
from didcomm_messaging.multiformats import multibase, multicodec
1615
from didcomm_messaging.resolver import DIDResolver
1716

1817

@@ -59,13 +58,6 @@ class Target:
5958
class LegacyDIDCommMessagingService(Generic[P, S]):
6059
"""Main entrypoint for DIDComm Messaging."""
6160

62-
def multikey_to_kid(self, multikey: str) -> str:
63-
"""Return a kid from a multikey."""
64-
codec, data = multicodec.unwrap(multibase.decode(multikey))
65-
if codec != multicodec.multicodec("ed25519-pub"):
66-
raise LegacyDIDCommMessagingError("DIDComm v1 requires ed25519 keys")
67-
return base58.b58encode(data).decode()
68-
6961
async def did_to_target(
7062
self, crypto: LegacyCryptoService[P, S], resolver: DIDResolver, did: str
7163
) -> Target:
@@ -81,19 +73,19 @@ async def did_to_target(
8173
target = services[0]
8274

8375
recipient_keys = [
84-
self.multikey_to_kid(
76+
base58.b58encode(
8577
crypto.verification_method_to_public_key(
8678
doc.dereference_as(VerificationMethod, recip)
87-
).multikey
88-
)
79+
).key_bytes
80+
).decode()
8981
for recip in target.recipient_keys
9082
]
9183
routing_keys = [
92-
self.multikey_to_kid(
84+
base58.b58encode(
9385
crypto.verification_method_to_public_key(
9486
doc.dereference_as(VerificationMethod, routing_key)
95-
).multikey
96-
)
87+
).key_bytes
88+
).decode()
9789
for routing_key in target.routing_keys
9890
]
9991
endpoint = target.service_endpoint
@@ -121,11 +113,11 @@ async def from_did_to_kid(
121113
target = services[0]
122114

123115
recipient_keys = [
124-
self.multikey_to_kid(
116+
base58.b58encode(
125117
crypto.verification_method_to_public_key(
126118
doc.dereference_as(VerificationMethod, recip)
127-
).multikey
128-
)
119+
).key_bytes
120+
).decode()
129121
for recip in target.recipient_keys
130122
]
131123
return recipient_keys[0]

didcomm_messaging/legacy/nacl.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ def multikey(self) -> str:
6969
multicodec.wrap("ed25519-pub", base58.b58decode(self.key)), "base58btc"
7070
)
7171

72+
@property
73+
def key_bytes(self) -> bytes:
74+
"""Get the bytes of the key."""
75+
return self.value
76+
7277

7378
class NaclLegacyCryptoService(LegacyCryptoService[EdPublicKey, KeyPair]):
7479
"""Legacy crypto service using pynacl."""

0 commit comments

Comments
 (0)