|
1 | 1 | """Test MultikeypManager.""" |
2 | 2 |
|
3 | | -from unittest import IsolatedAsyncioTestCase |
| 3 | +import json |
| 4 | +from unittest import IsolatedAsyncioTestCase, mock |
| 5 | + |
| 6 | +import base58 |
| 7 | +from aries_askar import Key, KeyAlg |
| 8 | +from pydid.verification_method import JsonWebKey2020, VerificationMethod |
4 | 9 |
|
5 | 10 | from acapy_agent.utils.testing import create_test_profile |
6 | 11 | from acapy_agent.wallet.key_type import KeyTypes |
7 | 12 | from acapy_agent.wallet.keys.manager import ( |
8 | 13 | MultikeyManager, |
| 14 | + MultikeyManagerError, |
| 15 | + jwk_to_multikey, |
| 16 | + multikey_from_verification_method, |
9 | 17 | multikey_to_verkey, |
10 | 18 | verkey_to_multikey, |
11 | 19 | ) |
@@ -89,3 +97,69 @@ async def test_key_transformations(self): |
89 | 97 | ]: |
90 | 98 | assert multikey_to_verkey(multikey) == verkey |
91 | 99 | assert verkey_to_multikey(verkey, alg=alg) == multikey |
| 100 | + |
| 101 | + async def test_jwk_to_multikey_ed25519_and_p256(self): |
| 102 | + for alg, key_alg, expected_multikey in [ |
| 103 | + (self.ed25519_alg, KeyAlg.ED25519, self.ed25519_multikey), |
| 104 | + (self.p256_alg, KeyAlg.P256, self.p256_multikey), |
| 105 | + ]: |
| 106 | + async with self.profile.session() as session: |
| 107 | + created = await MultikeyManager(session=session).create( |
| 108 | + seed=self.seed, alg=alg |
| 109 | + ) |
| 110 | + |
| 111 | + askar_key = Key.from_public_bytes( |
| 112 | + key_alg, base58.b58decode(multikey_to_verkey(created["multikey"])) |
| 113 | + ) |
| 114 | + jwk = json.loads(askar_key.get_jwk_public()) |
| 115 | + assert jwk_to_multikey(jwk) == expected_multikey |
| 116 | + |
| 117 | + # Private material must be ignored for public conversion. |
| 118 | + jwk_with_d = {**jwk, "d": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"} |
| 119 | + assert jwk_to_multikey(jwk_with_d) == expected_multikey |
| 120 | + |
| 121 | + async def test_jwk_to_multikey_unsupported(self): |
| 122 | + with self.assertRaises(MultikeyManagerError): |
| 123 | + jwk_to_multikey({"kty": "EC", "crv": "secp256k1", "x": "x", "y": "y"}) |
| 124 | + with self.assertRaises(MultikeyManagerError): |
| 125 | + jwk_to_multikey("not-a-jwk") |
| 126 | + |
| 127 | + async def test_multikey_from_json_web_key_verification_method(self): |
| 128 | + async with self.profile.session() as session: |
| 129 | + created = await MultikeyManager(session=session).create( |
| 130 | + seed=self.seed, alg=self.ed25519_alg |
| 131 | + ) |
| 132 | + |
| 133 | + askar_key = Key.from_public_bytes( |
| 134 | + KeyAlg.ED25519, |
| 135 | + base58.b58decode(multikey_to_verkey(created["multikey"])), |
| 136 | + ) |
| 137 | + jwk = json.loads(askar_key.get_jwk_public()) |
| 138 | + |
| 139 | + for vm_type in ("JsonWebKey2020", "JsonWebKey"): |
| 140 | + if vm_type == "JsonWebKey2020": |
| 141 | + vm = JsonWebKey2020.deserialize( |
| 142 | + { |
| 143 | + "id": "did:web:example.com#key-01-jwk", |
| 144 | + "type": vm_type, |
| 145 | + "controller": "did:web:example.com", |
| 146 | + "publicKeyJwk": jwk, |
| 147 | + } |
| 148 | + ) |
| 149 | + else: |
| 150 | + vm = VerificationMethod.deserialize( |
| 151 | + { |
| 152 | + "id": "did:web:example.com#key-01-jwk", |
| 153 | + "type": vm_type, |
| 154 | + "controller": "did:web:example.com", |
| 155 | + "publicKeyJwk": jwk, |
| 156 | + } |
| 157 | + ) |
| 158 | + assert multikey_from_verification_method(vm) == created["multikey"] |
| 159 | + |
| 160 | + async def test_multikey_from_json_web_key_missing_jwk(self): |
| 161 | + vm = mock.MagicMock(spec=VerificationMethod) |
| 162 | + vm.type = "JsonWebKey2020" |
| 163 | + vm.public_key_jwk = None |
| 164 | + with self.assertRaises(MultikeyManagerError): |
| 165 | + multikey_from_verification_method(vm) |
0 commit comments