Skip to content

Commit c6461ba

Browse files
committed
add deregister_identity, add last signature delete, update tests
1 parent 8f280cf commit c6461ba

5 files changed

Lines changed: 71 additions & 11 deletions

File tree

tests/test_ubirch_api.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,17 @@ def test_register_identity_msgpack(self, mock):
110110
mock.register_uri(requests_mock.ANY, requests_mock.ANY, text='{"result":"OK"}')
111111
self.assertTrue(ubirch.API().register_identity(msgpack.packb([1, 2, 3])))
112112

113+
@requests_mock.mock()
114+
def test_deregister_identity_json(self, mock):
115+
mock.register_uri(requests_mock.ANY, requests_mock.ANY, text='{"result":"OK"}')
116+
self.assertTrue(ubirch.API().deregister_identity(str.encode(json.dumps({}))))
117+
118+
@unittest.expectedFailure
119+
@requests_mock.mock()
120+
def test_deregister_identity_msgpack(self, mock):
121+
mock.register_uri(requests_mock.ANY, requests_mock.ANY, text='{"result":"OK"}')
122+
self.assertTrue(ubirch.API().deregister_identity(msgpack.packb([1, 2, 3])))
123+
113124
@requests_mock.mock()
114125
def test_device_exists(self, mock):
115126
mock.register_uri(requests_mock.ANY, requests_mock.ANY, text='{"result":"OK"}')

tests/test_ubirch_protocol.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,5 +148,24 @@ def test_set_saved_signatures_changed(self):
148148
self.assertEqual({TEST_UUID: "1234567890"}, p.get_saved_signatures())
149149

150150
# sign a message and expect the last signature for this UUID to change
151-
p.message_signed(TEST_UUID, 0xEF, 1)
151+
p.message_signed(TEST_UUID, 0xEF, 1, True)
152152
self.assertEqual({TEST_UUID: EXPECTED_SIGNED[-64:]}, p.get_saved_signatures())
153+
154+
def test_set_saved_signatures_unchanged(self):
155+
p = TestProtocol()
156+
p.set_saved_signatures({TEST_UUID: "1234567890"})
157+
self.assertEqual({TEST_UUID: "1234567890"}, p.get_saved_signatures())
158+
159+
# sign a message and do not save the last signature
160+
p.message_signed(TEST_UUID, 0xEF, 1, False)
161+
self.assertEqual({TEST_UUID: "1234567890"}, p.get_saved_signatures())
162+
163+
def test_reset_saved_signatures(self):
164+
p = TestProtocol()
165+
p.set_saved_signatures({TEST_UUID: "1234567890"})
166+
self.assertEqual({TEST_UUID: "1234567890"}, p.get_saved_signatures())
167+
168+
# sign a message and expect the last signature for this UUID to change
169+
p.message_signed(TEST_UUID, 0xEF, 1, True)
170+
p.reset_signature(TEST_UUID)
171+
self.assertEqual({}, p.get_saved_signatures())

ubirch/ubirch_api.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def is_identity_registered(self, uuid: UUID) -> bool:
7676
:param uuid: the UUID of the identity to check
7777
:return: true if the identity exists
7878
"""
79-
logger.info("is identity registered?: {}".format(uuid))
79+
logger.debug("is identity registered?: {}".format(uuid))
8080
r = requests.get(self.get_url(KEY_SERVICE) + "/pubkey/current/hardwareId/" + str(uuid),
8181
headers=self._auth)
8282
logger.debug("{}: {}".format(r.status_code, r.content))
@@ -89,32 +89,53 @@ def register_identity(self, key_registration: bytes) -> Response:
8989
:return: the response from the server
9090
"""
9191
if key_registration.startswith(b'{'):
92-
logger.debug(key_registration)
9392
return self._register_identity_json(json.loads(bytes.decode(key_registration)))
9493
else:
9594
return self._register_identity_mpack(key_registration)
9695

96+
def deregister_identity(self, key_deregistration: bytes) -> Response:
97+
"""
98+
De-register an identity at the backend. Deletes the public key.
99+
:param key_deregistration: the public key signed
100+
:return: the response from the server
101+
"""
102+
if key_deregistration.startswith(b'{'):
103+
return self._deregister_identity_json(json.loads(bytes.decode(key_deregistration)))
104+
else:
105+
return self._deregister_identity_mpack(key_deregistration)
106+
97107
def _register_identity_json(self, key_registration: dict) -> Response:
98-
logger.info("register device identity [json]: {}".format(key_registration))
108+
logger.debug("register device identity [json]: {}".format(key_registration))
99109
r = requests.post(self.get_url(KEY_SERVICE) + '/pubkey', json=key_registration,
100110
headers=self._auth)
101111
logger.debug("{}: {}".format(r.status_code, r.content))
102112
return r
103113

104114
def _register_identity_mpack(self, key_registration: bytes) -> Response:
105-
logger.info("register device identity [msgpack]: {}".format(binascii.hexlify(key_registration)))
115+
logger.debug("register device identity [msgpack]: {}".format(binascii.hexlify(key_registration)))
106116
r = requests.post(self.get_url(KEY_SERVICE) + '/pubkey/mpack', data=key_registration,
107117
headers={'Content-Type': 'application/octet-stream', **self._auth})
108118
logger.debug("{}: {}".format(r.status_code, r.content))
109119
return r
110120

121+
def _deregister_identity_json(self, key_deregistration: dict) -> Response:
122+
logger.debug("de-register device identity [json]: {}".format(key_deregistration))
123+
r = requests.delete(self.get_url(KEY_SERVICE) + '/pubkey', json=key_deregistration,
124+
headers=self._auth)
125+
logger.debug("{}: {}".format(r.status_code, r.content))
126+
return r
127+
pass
128+
129+
def _deregister_identity_mpack(self, key_deregistration: bytes) -> Response:
130+
raise NotImplementedError("msgpack identity deregistration not supported yet")
131+
111132
def device_exists(self, uuid: UUID) -> bool:
112133
"""
113134
Check if a device exists.
114135
:param uuid: the UUID of the device
115136
:return: true of it exists
116137
"""
117-
logger.info("device exists?: {}".format(uuid))
138+
logger.debug("device exists?: {}".format(uuid))
118139
r = requests.get(self.get_url(AVATAR_SERVICE) + '/device/' + str(uuid),
119140
headers=self._auth)
120141
logger.debug("{}: {}".format(r.status_code, r.content))
@@ -126,7 +147,7 @@ def device_delete(self, uuid: UUID) -> bool:
126147
:param uuid: the UUID of the device
127148
:return: true of the deletion succeeded
128149
"""
129-
logger.info("delete device: {}".format(uuid))
150+
logger.debug("delete device: {}".format(uuid))
130151
r = requests.delete(self.get_url(AVATAR_SERVICE) + '/device/' + str(uuid), headers=self._auth)
131152
logger.debug("{}: {}".format(r.status_code, r.content))
132153
return r.status_code == 200
@@ -137,7 +158,7 @@ def device_create(self, device_info: dict) -> Response:
137158
:param device_info: a device descriptor
138159
:return: the response from the server
139160
"""
140-
logger.info("create device: {}".format(device_info))
161+
logger.debug("create device: {}".format(device_info))
141162
r = requests.post(self.get_url(AVATAR_SERVICE) + '/device',
142163
json=device_info,
143164
headers=self._auth)

ubirch/ubirch_ks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def insert_ed25519_keypair(self, uuid: UUID, vk: VerifyingKey, sk: SigningKey) -
8585
self.insert_ed25519_verifying_key(uuid, vk)
8686
self.insert_ed25519_signing_key(uuid, sk)
8787
self._ks.save(self._ks_file, self._ks_password)
88-
logger.info("created new key pair for {}: {}".format(uuid.hex, bytes.decode(vk.to_ascii(encoding='hex'))))
88+
logger.info("inserted new key pair for {}: {}".format(uuid.hex, bytes.decode(vk.to_ascii(encoding='hex'))))
8989
return (vk, sk)
9090

9191
def create_ed25519_keypair(self, uuid: UUID) -> (VerifyingKey, SigningKey):

ubirch/ubirch_protocol.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ def get_saved_signatures(self) -> dict:
6161
"""
6262
return self._signatures
6363

64+
def reset_signature(self, uuid: UUID) -> None:
65+
"""
66+
Reset the last saved signature for this UUID.
67+
:param uuid: the UUID to reset
68+
"""
69+
if uuid in self._signatures:
70+
del self._signatures[uuid]
71+
6472
@abstractmethod
6573
def _sign(self, uuid: UUID, message: bytes) -> bytes:
6674
"""
@@ -94,7 +102,7 @@ def __sign(self, uuid: UUID, msg: any) -> (bytes, bytes):
94102
msg[-1] = signature
95103
return (signature, self.__serialize(msg))
96104

97-
def message_signed(self, uuid: UUID, type: int, payload: any) -> bytes:
105+
def message_signed(self, uuid: UUID, type: int, payload: any, save_signature: bool = False) -> bytes:
98106
"""
99107
Create a new signed ubirch-protocol message.
100108
:param uuid: the uuid of the device that sends the message, part of the envelope
@@ -113,7 +121,8 @@ def message_signed(self, uuid: UUID, type: int, payload: any) -> bytes:
113121
]
114122

115123
(signature, serialized) = self.__sign(uuid, msg)
116-
self._signatures[uuid] = signature
124+
if save_signature:
125+
self._signatures[uuid] = signature
117126

118127
# serialize result and return the message
119128
return serialized

0 commit comments

Comments
 (0)