Skip to content

Commit

Permalink
added option kid field to KeyInfo
Browse files Browse the repository at this point in the history
Signed-off-by: PatStLouis <patrick.st-louis@opsecid.ca>
  • Loading branch information
PatStLouis committed Sep 20, 2024
1 parent fdd82ff commit 04e7830
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 105 deletions.
6 changes: 3 additions & 3 deletions aries_cloudagent/wallet/askar.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ async def create_key(
) from None
raise WalletError("Error creating signing key") from err

return KeyInfo(verkey=verkey, metadata=metadata, key_type=key_type)
return KeyInfo(verkey=verkey, metadata=metadata, key_type=key_type, kid=kid)

async def assign_kid_to_key(self, verkey: str, kid: str) -> KeyInfo:
"""Assign a KID to a key.
Expand Down Expand Up @@ -143,7 +143,7 @@ async def assign_kid_to_key(self, verkey: str, kid: str) -> KeyInfo:
raise WalletError(f"Unknown key type {key.algorithm.value}")

await self._session.handle.update_key(name=verkey, tags={"kid": kid})
return KeyInfo(verkey=verkey, metadata=metadata, key_type=key_type)
return KeyInfo(verkey=verkey, metadata=metadata, key_type=key_type, kid=kid)

async def get_key_by_kid(self, kid: str) -> KeyInfo:
"""Fetch a key by looking up its kid.
Expand Down Expand Up @@ -194,7 +194,7 @@ async def get_signing_key(self, verkey: str) -> KeyInfo:
raise WalletNotFoundError("Unknown key: {}".format(verkey))
metadata = json.loads(key.metadata or "{}")
# FIXME implement key types
return KeyInfo(verkey=verkey, metadata=metadata, key_type=ED25519)
return KeyInfo(verkey=verkey, metadata=metadata, key_type=ED25519, kid=key.kid)

async def replace_signing_key_metadata(self, verkey: str, metadata: dict):
"""Replace the metadata associated with a signing keypair.
Expand Down
11 changes: 8 additions & 3 deletions aries_cloudagent/wallet/did_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@

INVITATION_REUSE_KEY = "invitation_reuse"

KeyInfo = NamedTuple(
"KeyInfo", [("verkey", str), ("metadata", dict), ("key_type", KeyType)]
)

class KeyInfo(NamedTuple):
verkey: str
metadata: dict
key_type: KeyType
kid: str = None


DIDInfo = NamedTuple(
"DIDInfo",
[
Expand Down
4 changes: 4 additions & 0 deletions aries_cloudagent/wallet/in_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ async def create_key(
verkey=verkey_enc,
metadata=self.profile.keys[verkey_enc]["metadata"].copy(),
key_type=key_type,
kid=kid,
)

async def assign_kid_to_key(self, verkey: str, kid: str) -> KeyInfo:
Expand All @@ -120,6 +121,7 @@ async def assign_kid_to_key(self, verkey: str, kid: str) -> KeyInfo:
verkey=key["verkey"],
metadata=key["metadata"].copy(),
key_type=key["key_type"],
kid=kid,
)

async def get_key_by_kid(self, kid: str) -> KeyInfo:
Expand All @@ -138,6 +140,7 @@ async def get_key_by_kid(self, kid: str) -> KeyInfo:
verkey=key["verkey"],
metadata=key["metadata"].copy(),
key_type=key["key_type"],
kid=key["kid"],
)

raise WalletNotFoundError(f"Key not found with kid {kid}")
Expand All @@ -162,6 +165,7 @@ async def get_signing_key(self, verkey: str) -> KeyInfo:
verkey=key["verkey"],
metadata=key["metadata"].copy(),
key_type=key["key_type"],
kid=key["kid"],
)

async def replace_signing_key_metadata(self, verkey: str, metadata: dict):
Expand Down
38 changes: 0 additions & 38 deletions aries_cloudagent/wallet/keys/askar.py

This file was deleted.

40 changes: 20 additions & 20 deletions aries_cloudagent/wallet/keys/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,10 @@
from ...utils.multiformats import multibase

ALG_MAPPINGS = {
"ed25519": {
'key_type': ED25519,
'prefix_hex': 'ed01',
'prefix_lenght': 2
}
"ed25519": {"key_type": ED25519, "prefix_hex": "ed01", "prefix_lenght": 2}
}


class MultikeyManagerError(Exception):
"""Generic MultikeyManager Error."""

Expand All @@ -26,12 +23,12 @@ def __init__(self, profile=Profile):
self.profile = profile

def _multikey_to_verkey(self, multikey, alg="ed25519"):
prefix_lenght = ALG_MAPPINGS[alg]['prefix_lenght']
prefix_lenght = ALG_MAPPINGS[alg]["prefix_lenght"]
public_bytes = bytes(bytearray(multibase.decode(multikey))[prefix_lenght:])
return bytes_to_b58(public_bytes)

def _verkey_to_multikey(self, verkey, alg="ed25519"):
prefix_hex = ALG_MAPPINGS[alg]['prefix_hex']
prefix_hex = ALG_MAPPINGS[alg]["prefix_hex"]
prefixed_key_hex = f"{prefix_hex}{b58_to_bytes(verkey).hex()}"
return multibase.encode(bytes.fromhex(prefixed_key_hex), "base58btc")

Expand All @@ -48,7 +45,10 @@ async def from_multikey(self, multikey: str):
wallet = session.inject(BaseWallet)
verkey = self._multikey_to_verkey(multikey)
key_info = await wallet.get_signing_key(verkey=verkey)
return self._verkey_to_multikey(key_info.verkey)
return {
"kid": key_info.kid,
"multikey": self._verkey_to_multikey(key_info.verkey),
}

async def create(self, seed=None, kid=None, alg="ed25519"):
"""Create a new key pair."""
Expand All @@ -62,11 +62,12 @@ async def create(self, seed=None, kid=None, alg="ed25519"):
except:
pass

key_type = ALG_MAPPINGS[alg]['key_type']
key_info = await wallet.create_key(
key_type=key_type, seed=seed, kid=kid
)
return self._verkey_to_multikey(key_info.verkey)
key_type = ALG_MAPPINGS[alg]["key_type"]
key_info = await wallet.create_key(key_type=key_type, seed=seed, kid=kid)
return {
"kid": key_info.kid,
"multikey": self._verkey_to_multikey(key_info.verkey),
}

async def update(self, multikey: str, kid: str):
"""Assign a new kid to a key pair."""
Expand All @@ -82,10 +83,9 @@ async def update(self, multikey: str, kid: str):
try:
verkey = self._multikey_to_verkey(multikey)
except:
raise MultikeyManagerError(
f"Invalid multikey value {multikey}."
)
key_info = await wallet.assign_kid_to_key(
verkey=verkey, kid=kid
)
return self._verkey_to_multikey(key_info.verkey)
raise MultikeyManagerError(f"Invalid multikey value {multikey}.")
key_info = await wallet.assign_kid_to_key(verkey=verkey, kid=kid)
return {
"kid": key_info.kid,
"multikey": self._verkey_to_multikey(key_info.verkey),
}
69 changes: 40 additions & 29 deletions aries_cloudagent/wallet/keys/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import logging

from aiohttp import web
from aiohttp_apispec import docs, querystring_schema, request_schema, response_schema
from marshmallow import fields, validate
from aiohttp_apispec import docs, request_schema, response_schema
from marshmallow import fields

from ...admin.decorators.auth import tenant_authentication
from ...admin.request_context import AdminRequestContext
Expand Down Expand Up @@ -42,7 +42,14 @@ class CreateKeyResponseSchema(OpenAPISchema):
multikey = fields.Str(
metadata={
"description": "The Public Key Multibase format (multikey)",
"example": "",
"example": "z6MkgKA7yrw5kYSiDuQFcye4bMaJpcfHFry3Bx45pdWh3s8i",
},
)

kid = fields.Str(
metadata={
"description": "The associated kid",
"example": "did:web:example.com#key-01",
},
)

Expand All @@ -54,7 +61,7 @@ class UpdateKeyRequestSchema(OpenAPISchema):
required=True,
metadata={
"description": "Multikey of the key pair to update",
"example": "",
"example": "z6MkgKA7yrw5kYSiDuQFcye4bMaJpcfHFry3Bx45pdWh3s8i",
},
)

Expand All @@ -74,7 +81,14 @@ class UpdateKeyResponseSchema(OpenAPISchema):
multikey = fields.Str(
metadata={
"description": "The Public Key Multibase format (multikey)",
"example": "",
"example": "z6MkgKA7yrw5kYSiDuQFcye4bMaJpcfHFry3Bx45pdWh3s8i",
},
)

kid = fields.Str(
metadata={
"description": "The associated kid",
"example": "did:web:example.com#key-01",
},
)

Expand All @@ -85,7 +99,14 @@ class FetchKeyResponseSchema(OpenAPISchema):
multikey = fields.Str(
metadata={
"description": "The Public Key Multibase format (multikey)",
"example": "",
"example": "z6MkgKA7yrw5kYSiDuQFcye4bMaJpcfHFry3Bx45pdWh3s8i",
},
)

kid = fields.Str(
metadata={
"description": "The associated kid",
"example": "did:web:example.com#key-01",
},
)

Expand All @@ -103,14 +124,10 @@ async def fetch_key(request: web.BaseRequest):
context: AdminRequestContext = request["context"]
multikey = request.match_info["multikey"]
try:
key_info = await MultikeyManager(context.profile).fetch(
key_info = await MultikeyManager(context.profile).from_multikey(
multikey=multikey,
)
print(key_info)
return web.json_response(
{},
status=200,
)
return web.json_response(key_info, status=200)
except (MultikeyManagerError, WalletDuplicateError, WalletNotFoundError) as err:
return web.json_response({"message": str(err)}, status=400)

Expand All @@ -131,22 +148,19 @@ async def create_key(request: web.BaseRequest):
"""
context: AdminRequestContext = request["context"]
body = await request.json()

seed = body.get("seed") or None
if seed and not context.settings.get("wallet.allow_insecure_seed"):
raise web.HTTPBadRequest(reason="Seed support is not enabled.")
kid = body.get("verification_method") or None

kid = body.get("verificationMethod") or None

try:
multikey = await MultikeyManager(context.profile).create(
key_info = await MultikeyManager(context.profile).create(
seed=seed,
kid=kid,
)
return web.json_response(
{"multikey": multikey},
status=201,
)
return web.json_response(key_info, status=201)
except (MultikeyManagerError, WalletDuplicateError, WalletNotFoundError) as err:
return web.json_response({"message": str(err)}, status=400)

Expand All @@ -167,19 +181,16 @@ async def update_key(request: web.BaseRequest):
"""
context: AdminRequestContext = request["context"]
body = await request.json()

multikey = body.get("multikey")
kid = body.get("verification_method")
kid = body.get("verificationMethod")

try:
multikey = await MultikeyManager(context.profile).update(
key_info = await MultikeyManager(context.profile).update(
multikey=multikey,
kid=kid,
)
return web.json_response(
{"multikey": multikey},
status=200,
)
return web.json_response(key_info, status=200)
except (MultikeyManagerError, WalletDuplicateError, WalletNotFoundError) as err:
return web.json_response({"message": str(err)}, status=400)

Expand Down
16 changes: 4 additions & 12 deletions aries_cloudagent/wallet/keys/tests/test_key_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,11 @@ async def test_key_creation(self):
assert multikey == self.multikey

async def test_key_binding(self):
multikey = await self.manager.create(
seed=self.seed, kid=self.kid
)
multikey = await self.manager.create(seed=self.seed, kid=self.kid)
assert multikey == self.multikey
multikey = await self.manager.from_kid(
kid=self.kid
)
multikey = await self.manager.from_kid(kid=self.kid)
assert multikey == self.multikey
multikey = await self.manager.update(
multikey=multikey, kid=self.new_kid
)
multikey = await self.manager.update(multikey=multikey, kid=self.new_kid)
assert multikey == self.multikey
multikey = await self.manager.from_kid(
kid=self.new_kid
)
multikey = await self.manager.from_kid(kid=self.new_kid)
assert multikey == self.multikey

0 comments on commit 04e7830

Please sign in to comment.