Marco Ricci commited on 2025-01-15 21:07:32
Zeige 8 geänderte Dateien mit 116 Einfügungen und 118 Löschungen.
Move `exporter.storeroom.KeyPair` and `exporter.storeroom.MasterKeys` into the `_types` module, as `StoreroomKeyPair` and `StoreroomMasterKeys`, respectively. Also convert them from `TypedDict` to `NamedTuple`. Also rename `_types.KeyCommentPair` to `_types.SSHKeyCommentPair` for consistency.
... | ... |
@@ -34,7 +34,7 @@ if TYPE_CHECKING: |
34 | 34 |
__all__ = ( |
35 | 35 |
'SSH_AGENT', |
36 | 36 |
'SSH_AGENTC', |
37 |
- 'KeyCommentPair', |
|
37 |
+ 'SSHKeyCommentPair', |
|
38 | 38 |
'VaultConfig', |
39 | 39 |
'is_vault_config', |
40 | 40 |
) |
... | ... |
@@ -577,7 +577,7 @@ def clean_up_falsy_vault_config_values( # noqa: C901,PLR0912 |
577 | 577 |
return cleanup_completed |
578 | 578 |
|
579 | 579 |
|
580 |
-class KeyCommentPair(NamedTuple): |
|
580 |
+class SSHKeyCommentPair(NamedTuple): |
|
581 | 581 |
"""SSH key plus comment pair. For typing purposes. |
582 | 582 |
|
583 | 583 |
Attributes: |
... | ... |
@@ -660,3 +660,44 @@ class SSH_AGENT(enum.Enum): # noqa: N801 |
660 | 660 |
"""""" |
661 | 661 |
EXTENSION_RESPONSE: int = 29 |
662 | 662 |
"""""" |
663 |
+ |
|
664 |
+ |
|
665 |
+class StoreroomKeyPair(NamedTuple): |
|
666 |
+ """A pair of AES256 keys, one for encryption and one for signing. |
|
667 |
+ |
|
668 |
+ Attributes: |
|
669 |
+ encryption_key: |
|
670 |
+ AES256 key, used for encryption with AES256-CBC (with PKCS#7 |
|
671 |
+ padding). |
|
672 |
+ signing_key: |
|
673 |
+ AES256 key, used for signing with HMAC-SHA256. |
|
674 |
+ |
|
675 |
+ """ |
|
676 |
+ |
|
677 |
+ encryption_key: bytes |
|
678 |
+ """""" |
|
679 |
+ signing_key: bytes |
|
680 |
+ """""" |
|
681 |
+ |
|
682 |
+ |
|
683 |
+class StoreroomMasterKeys(NamedTuple): |
|
684 |
+ """A triple of AES256 keys, for encryption, signing and hashing. |
|
685 |
+ |
|
686 |
+ Attributes: |
|
687 |
+ hashing_key: |
|
688 |
+ AES256 key, used for hashing with HMAC-SHA256 to derive |
|
689 |
+ a hash table slot for an item. |
|
690 |
+ encryption_key: |
|
691 |
+ AES256 key, used for encryption with AES256-CBC (with PKCS#7 |
|
692 |
+ padding). |
|
693 |
+ signing_key: |
|
694 |
+ AES256 key, used for signing with HMAC-SHA256. |
|
695 |
+ |
|
696 |
+ """ |
|
697 |
+ |
|
698 |
+ hashing_key: bytes |
|
699 |
+ """""" |
|
700 |
+ encryption_key: bytes |
|
701 |
+ """""" |
|
702 |
+ signing_key: bytes |
|
703 |
+ """""" |
... | ... |
@@ -1794,7 +1794,7 @@ def _load_user_config() -> dict[str, Any]: |
1794 | 1794 |
|
1795 | 1795 |
def _get_suitable_ssh_keys( |
1796 | 1796 |
conn: ssh_agent.SSHAgentClient | socket.socket | None = None, / |
1797 |
-) -> Iterator[_types.KeyCommentPair]: |
|
1797 |
+) -> Iterator[_types.SSHKeyCommentPair]: |
|
1798 | 1798 |
"""Yield all SSH keys suitable for passphrase derivation. |
1799 | 1799 |
|
1800 | 1800 |
Suitable SSH keys are queried from the running SSH agent (see |
... | ... |
@@ -32,10 +32,10 @@ import logging |
32 | 32 |
import os |
33 | 33 |
import os.path |
34 | 34 |
import struct |
35 |
-from typing import TYPE_CHECKING, Any, TypedDict |
|
35 |
+from typing import TYPE_CHECKING, Any |
|
36 | 36 |
|
37 | 37 |
from derivepassphrase import _cli_msg as _msg |
38 |
-from derivepassphrase import exporter |
|
38 |
+from derivepassphrase import _types, exporter |
|
39 | 39 |
|
40 | 40 |
if TYPE_CHECKING: |
41 | 41 |
from collections.abc import Iterator |
... | ... |
@@ -90,51 +90,10 @@ def _h(bs: Buffer) -> str: |
90 | 90 |
return '<{}>'.format(memoryview(bs).hex(' ')) |
91 | 91 |
|
92 | 92 |
|
93 |
-class KeyPair(TypedDict): |
|
94 |
- """A pair of AES256 keys, one for encryption and one for signing. |
|
95 |
- |
|
96 |
- Attributes: |
|
97 |
- encryption_key: |
|
98 |
- AES256 key, used for encryption with AES256-CBC (with PKCS#7 |
|
99 |
- padding). |
|
100 |
- signing_key: |
|
101 |
- AES256 key, used for signing with HMAC-SHA256. |
|
102 |
- |
|
103 |
- """ |
|
104 |
- |
|
105 |
- encryption_key: bytes |
|
106 |
- """""" |
|
107 |
- signing_key: bytes |
|
108 |
- """""" |
|
109 |
- |
|
110 |
- |
|
111 |
-class MasterKeys(TypedDict): |
|
112 |
- """A triple of AES256 keys, for encryption, signing and hashing. |
|
113 |
- |
|
114 |
- Attributes: |
|
115 |
- hashing_key: |
|
116 |
- AES256 key, used for hashing with HMAC-SHA256 to derive |
|
117 |
- a hash table slot for an item. |
|
118 |
- encryption_key: |
|
119 |
- AES256 key, used for encryption with AES256-CBC (with PKCS#7 |
|
120 |
- padding). |
|
121 |
- signing_key: |
|
122 |
- AES256 key, used for signing with HMAC-SHA256. |
|
123 |
- |
|
124 |
- """ |
|
125 |
- |
|
126 |
- hashing_key: bytes |
|
127 |
- """""" |
|
128 |
- encryption_key: bytes |
|
129 |
- """""" |
|
130 |
- signing_key: bytes |
|
131 |
- """""" |
|
132 |
- |
|
133 |
- |
|
134 | 93 |
def derive_master_keys_keys( |
135 | 94 |
password: str | Buffer, |
136 | 95 |
iterations: int, |
137 |
-) -> KeyPair: |
|
96 |
+) -> _types.StoreroomKeyPair: |
|
138 | 97 |
"""Derive encryption and signing keys for the master keys data. |
139 | 98 |
|
140 | 99 |
The master password is run through a key derivation function to |
... | ... |
@@ -185,16 +144,16 @@ def derive_master_keys_keys( |
185 | 144 |
iterations=iterations, |
186 | 145 |
), |
187 | 146 |
) |
188 |
- return { |
|
189 |
- 'encryption_key': encryption_key, |
|
190 |
- 'signing_key': signing_key, |
|
191 |
- } |
|
147 |
+ return _types.StoreroomKeyPair( |
|
148 |
+ encryption_key=encryption_key, |
|
149 |
+ signing_key=signing_key, |
|
150 |
+ ) |
|
192 | 151 |
|
193 | 152 |
|
194 | 153 |
def decrypt_master_keys_data( |
195 | 154 |
data: Buffer, |
196 |
- keys: KeyPair, |
|
197 |
-) -> MasterKeys: |
|
155 |
+ keys: _types.StoreroomKeyPair, |
|
156 |
+) -> _types.StoreroomMasterKeys: |
|
198 | 157 |
r"""Decrypt the master keys data. |
199 | 158 |
|
200 | 159 |
The master keys data contains: |
... | ... |
@@ -245,12 +204,12 @@ def decrypt_master_keys_data( |
245 | 204 |
ciphertext, claimed_mac = struct.unpack( |
246 | 205 |
f'{len(data) - MAC_SIZE}s {MAC_SIZE}s', data |
247 | 206 |
) |
248 |
- actual_mac = hmac.HMAC(keys['signing_key'], hashes.SHA256()) |
|
207 |
+ actual_mac = hmac.HMAC(keys.signing_key, hashes.SHA256()) |
|
249 | 208 |
actual_mac.update(ciphertext) |
250 | 209 |
logger.debug( |
251 | 210 |
_msg.TranslatedString( |
252 | 211 |
_msg.DebugMsgTemplate.MASTER_KEYS_DATA_MAC_INFO, |
253 |
- sign_key=_h(keys['signing_key']), |
|
212 |
+ sign_key=_h(keys.signing_key), |
|
254 | 213 |
ciphertext=_h(ciphertext), |
255 | 214 |
claimed_mac=_h(claimed_mac), |
256 | 215 |
actual_mac=_h(actual_mac.copy().finalize()), |
... | ... |
@@ -263,7 +222,7 @@ def decrypt_master_keys_data( |
263 | 222 |
f'{IV_SIZE}s {len(ciphertext) - IV_SIZE}s', ciphertext |
264 | 223 |
) |
265 | 224 |
decryptor = ciphers.Cipher( |
266 |
- algorithms.AES256(keys['encryption_key']), modes.CBC(iv) |
|
225 |
+ algorithms.AES256(keys.encryption_key), modes.CBC(iv) |
|
267 | 226 |
).decryptor() |
268 | 227 |
padded_plaintext = bytearray() |
269 | 228 |
padded_plaintext.extend(decryptor.update(payload)) |
... | ... |
@@ -278,17 +237,17 @@ def decrypt_master_keys_data( |
278 | 237 |
except (ValueError, struct.error) as exc: |
279 | 238 |
msg = 'Invalid encrypted master keys payload' |
280 | 239 |
raise ValueError(msg) from exc |
281 |
- return { |
|
282 |
- 'hashing_key': hashing_key, |
|
283 |
- 'encryption_key': encryption_key, |
|
284 |
- 'signing_key': signing_key, |
|
285 |
- } |
|
240 |
+ return _types.StoreroomMasterKeys( |
|
241 |
+ hashing_key=hashing_key, |
|
242 |
+ encryption_key=encryption_key, |
|
243 |
+ signing_key=signing_key, |
|
244 |
+ ) |
|
286 | 245 |
|
287 | 246 |
|
288 | 247 |
def decrypt_session_keys( |
289 | 248 |
data: Buffer, |
290 |
- master_keys: MasterKeys, |
|
291 |
-) -> KeyPair: |
|
249 |
+ master_keys: _types.StoreroomMasterKeys, |
|
250 |
+) -> _types.StoreroomKeyPair: |
|
292 | 251 |
r"""Decrypt the bucket item's session keys. |
293 | 252 |
|
294 | 253 |
The bucket item's session keys are single-use keys for encrypting |
... | ... |
@@ -337,12 +296,12 @@ def decrypt_session_keys( |
337 | 296 |
ciphertext, claimed_mac = struct.unpack( |
338 | 297 |
f'{len(data) - MAC_SIZE}s {MAC_SIZE}s', data |
339 | 298 |
) |
340 |
- actual_mac = hmac.HMAC(master_keys['signing_key'], hashes.SHA256()) |
|
299 |
+ actual_mac = hmac.HMAC(master_keys.signing_key, hashes.SHA256()) |
|
341 | 300 |
actual_mac.update(ciphertext) |
342 | 301 |
logger.debug( |
343 | 302 |
_msg.TranslatedString( |
344 | 303 |
_msg.DebugMsgTemplate.DECRYPT_BUCKET_ITEM_SESSION_KEYS_MAC_INFO, |
345 |
- sign_key=_h(master_keys['signing_key']), |
|
304 |
+ sign_key=_h(master_keys.signing_key), |
|
346 | 305 |
ciphertext=_h(ciphertext), |
347 | 306 |
claimed_mac=_h(claimed_mac), |
348 | 307 |
actual_mac=_h(actual_mac.copy().finalize()), |
... | ... |
@@ -355,7 +314,7 @@ def decrypt_session_keys( |
355 | 314 |
f'{IV_SIZE}s {len(ciphertext) - IV_SIZE}s', ciphertext |
356 | 315 |
) |
357 | 316 |
decryptor = ciphers.Cipher( |
358 |
- algorithms.AES256(master_keys['encryption_key']), modes.CBC(iv) |
|
317 |
+ algorithms.AES256(master_keys.encryption_key), modes.CBC(iv) |
|
359 | 318 |
).decryptor() |
360 | 319 |
padded_plaintext = bytearray() |
361 | 320 |
padded_plaintext.extend(decryptor.update(payload)) |
... | ... |
@@ -371,23 +330,23 @@ def decrypt_session_keys( |
371 | 330 |
msg = 'Invalid encrypted session keys payload' |
372 | 331 |
raise ValueError(msg) from exc |
373 | 332 |
|
374 |
- session_keys: KeyPair = { |
|
375 |
- 'encryption_key': session_encryption_key, |
|
376 |
- 'signing_key': session_signing_key, |
|
377 |
- } |
|
333 |
+ session_keys = _types.StoreroomKeyPair( |
|
334 |
+ encryption_key=session_encryption_key, |
|
335 |
+ signing_key=session_signing_key, |
|
336 |
+ ) |
|
378 | 337 |
|
379 | 338 |
logger.debug( |
380 | 339 |
_msg.TranslatedString( |
381 | 340 |
_msg.DebugMsgTemplate.DECRYPT_BUCKET_ITEM_SESSION_KEYS_INFO, |
382 |
- enc_key=_h(master_keys['encryption_key']), |
|
341 |
+ enc_key=_h(master_keys.encryption_key), |
|
383 | 342 |
iv=_h(iv), |
384 | 343 |
ciphertext=_h(payload), |
385 | 344 |
plaintext=_h(plaintext), |
386 | 345 |
code=_msg.TranslatedString( |
387 |
- '{{"encryption_key": bytes.fromhex({enc_key!r}), ' |
|
388 |
- '"signing_key": bytes.fromhex({sign_key!r})}}', |
|
389 |
- enc_key=session_keys['encryption_key'].hex(' '), |
|
390 |
- sign_key=session_keys['signing_key'].hex(' '), |
|
346 |
+ 'StoreroomKeyPair(encryption_key=bytes.fromhex({enc_key!r}), ' |
|
347 |
+ 'signing_key=bytes.fromhex({sign_key!r}))', |
|
348 |
+ enc_key=session_keys.encryption_key.hex(' '), |
|
349 |
+ sign_key=session_keys.signing_key.hex(' '), |
|
391 | 350 |
), |
392 | 351 |
), |
393 | 352 |
) |
... | ... |
@@ -397,7 +356,7 @@ def decrypt_session_keys( |
397 | 356 |
|
398 | 357 |
def decrypt_contents( |
399 | 358 |
data: Buffer, |
400 |
- session_keys: KeyPair, |
|
359 |
+ session_keys: _types.StoreroomKeyPair, |
|
401 | 360 |
) -> Buffer: |
402 | 361 |
"""Decrypt the bucket item's contents. |
403 | 362 |
|
... | ... |
@@ -443,12 +402,12 @@ def decrypt_contents( |
443 | 402 |
ciphertext, claimed_mac = struct.unpack( |
444 | 403 |
f'{len(data) - MAC_SIZE}s {MAC_SIZE}s', data |
445 | 404 |
) |
446 |
- actual_mac = hmac.HMAC(session_keys['signing_key'], hashes.SHA256()) |
|
405 |
+ actual_mac = hmac.HMAC(session_keys.signing_key, hashes.SHA256()) |
|
447 | 406 |
actual_mac.update(ciphertext) |
448 | 407 |
logger.debug( |
449 | 408 |
_msg.TranslatedString( |
450 | 409 |
_msg.DebugMsgTemplate.DECRYPT_BUCKET_ITEM_MAC_INFO, |
451 |
- sign_key=_h(session_keys['signing_key']), |
|
410 |
+ sign_key=_h(session_keys.signing_key), |
|
452 | 411 |
ciphertext=_h(ciphertext), |
453 | 412 |
claimed_mac=_h(claimed_mac), |
454 | 413 |
actual_mac=_h(actual_mac.copy().finalize()), |
... | ... |
@@ -460,7 +419,7 @@ def decrypt_contents( |
460 | 419 |
f'{IV_SIZE}s {len(ciphertext) - IV_SIZE}s', ciphertext |
461 | 420 |
) |
462 | 421 |
decryptor = ciphers.Cipher( |
463 |
- algorithms.AES256(session_keys['encryption_key']), modes.CBC(iv) |
|
422 |
+ algorithms.AES256(session_keys.encryption_key), modes.CBC(iv) |
|
464 | 423 |
).decryptor() |
465 | 424 |
padded_plaintext = bytearray() |
466 | 425 |
padded_plaintext.extend(decryptor.update(payload)) |
... | ... |
@@ -473,7 +432,7 @@ def decrypt_contents( |
473 | 432 |
logger.debug( |
474 | 433 |
_msg.TranslatedString( |
475 | 434 |
_msg.DebugMsgTemplate.DECRYPT_BUCKET_ITEM_INFO, |
476 |
- enc_key=_h(session_keys['encryption_key']), |
|
435 |
+ enc_key=_h(session_keys.encryption_key), |
|
477 | 436 |
iv=_h(iv), |
478 | 437 |
ciphertext=_h(payload), |
479 | 438 |
plaintext=_h(plaintext), |
... | ... |
@@ -485,7 +444,7 @@ def decrypt_contents( |
485 | 444 |
|
486 | 445 |
def decrypt_bucket_item( |
487 | 446 |
bucket_item: Buffer, |
488 |
- master_keys: MasterKeys, |
|
447 |
+ master_keys: _types.StoreroomMasterKeys, |
|
489 | 448 |
) -> Buffer: |
490 | 449 |
"""Decrypt a bucket item. |
491 | 450 |
|
... | ... |
@@ -519,8 +478,8 @@ def decrypt_bucket_item( |
519 | 478 |
_msg.TranslatedString( |
520 | 479 |
_msg.DebugMsgTemplate.DECRYPT_BUCKET_ITEM_KEY_INFO, |
521 | 480 |
plaintext=_h(bucket_item), |
522 |
- enc_key=_h(master_keys['encryption_key']), |
|
523 |
- sign_key=_h(master_keys['signing_key']), |
|
481 |
+ enc_key=_h(master_keys.encryption_key), |
|
482 |
+ sign_key=_h(master_keys.signing_key), |
|
524 | 483 |
), |
525 | 484 |
) |
526 | 485 |
data_version, encrypted_session_keys, data_contents = struct.unpack( |
... | ... |
@@ -539,7 +498,7 @@ def decrypt_bucket_item( |
539 | 498 |
|
540 | 499 |
def decrypt_bucket_file( |
541 | 500 |
filename: str, |
542 |
- master_keys: MasterKeys, |
|
501 |
+ master_keys: _types.StoreroomMasterKeys, |
|
543 | 502 |
*, |
544 | 503 |
root_dir: str | bytes | os.PathLike = '.', |
545 | 504 |
) -> Iterator[Buffer]: |
... | ... |
@@ -484,7 +484,7 @@ class SSHAgentClient: |
484 | 484 |
raise SSHAgentFailedError(response[0], response[1:]) |
485 | 485 |
return response[1:] |
486 | 486 |
|
487 |
- def list_keys(self) -> Sequence[_types.KeyCommentPair]: |
|
487 |
+ def list_keys(self) -> Sequence[_types.SSHKeyCommentPair]: |
|
488 | 488 |
"""Request a list of keys known to the SSH agent. |
489 | 489 |
|
490 | 490 |
Returns: |
... | ... |
@@ -521,7 +521,7 @@ class SSHAgentClient: |
521 | 521 |
return bytes(buf) |
522 | 522 |
|
523 | 523 |
key_count = int.from_bytes(shift(4), 'big') |
524 |
- keys: collections.deque[_types.KeyCommentPair] |
|
524 |
+ keys: collections.deque[_types.SSHKeyCommentPair] |
|
525 | 525 |
keys = collections.deque() |
526 | 526 |
for _ in range(key_count): |
527 | 527 |
key_size = int.from_bytes(shift(4), 'big') |
... | ... |
@@ -529,7 +529,7 @@ class SSHAgentClient: |
529 | 529 |
comment_size = int.from_bytes(shift(4), 'big') |
530 | 530 |
comment = shift(comment_size) |
531 | 531 |
# Both `key` and `comment` are not wrapped as SSH strings. |
532 |
- keys.append(_types.KeyCommentPair(key, comment)) |
|
532 |
+ keys.append(_types.SSHKeyCommentPair(key, comment)) |
|
533 | 533 |
if response_stream: |
534 | 534 |
raise TrailingDataError |
535 | 535 |
return keys |
... | ... |
@@ -1364,9 +1364,9 @@ def hypothesis_settings_coverage_compatible_with_caplog( |
1364 | 1364 |
return settings if f is None else settings(f) |
1365 | 1365 |
|
1366 | 1366 |
|
1367 |
-def list_keys(self: Any = None) -> list[_types.KeyCommentPair]: |
|
1367 |
+def list_keys(self: Any = None) -> list[_types.SSHKeyCommentPair]: |
|
1368 | 1368 |
del self # Unused. |
1369 |
- Pair = _types.KeyCommentPair # noqa: N806 |
|
1369 |
+ Pair = _types.SSHKeyCommentPair # noqa: N806 |
|
1370 | 1370 |
list1 = [ |
1371 | 1371 |
Pair(value['public_key_data'], f'{key} test key'.encode('ASCII')) |
1372 | 1372 |
for key, value in SUPPORTED_KEYS.items() |
... | ... |
@@ -1390,9 +1390,9 @@ def sign( |
1390 | 1390 |
raise AssertionError |
1391 | 1391 |
|
1392 | 1392 |
|
1393 |
-def list_keys_singleton(self: Any = None) -> list[_types.KeyCommentPair]: |
|
1393 |
+def list_keys_singleton(self: Any = None) -> list[_types.SSHKeyCommentPair]: |
|
1394 | 1394 |
del self # Unused. |
1395 |
- Pair = _types.KeyCommentPair # noqa: N806 |
|
1395 |
+ Pair = _types.SSHKeyCommentPair # noqa: N806 |
|
1396 | 1396 |
list1 = [ |
1397 | 1397 |
Pair(value['public_key_data'], f'{key} test key'.encode('ASCII')) |
1398 | 1398 |
for key, value in SUPPORTED_KEYS.items() |
... | ... |
@@ -1400,9 +1400,9 @@ def list_keys_singleton(self: Any = None) -> list[_types.KeyCommentPair]: |
1400 | 1400 |
return list1[:1] |
1401 | 1401 |
|
1402 | 1402 |
|
1403 |
-def suitable_ssh_keys(conn: Any) -> Iterator[_types.KeyCommentPair]: |
|
1403 |
+def suitable_ssh_keys(conn: Any) -> Iterator[_types.SSHKeyCommentPair]: |
|
1404 | 1404 |
del conn # Unused. |
1405 |
- Pair = _types.KeyCommentPair # noqa: N806 |
|
1405 |
+ Pair = _types.SSHKeyCommentPair # noqa: N806 |
|
1406 | 1406 |
yield from [ |
1407 | 1407 |
Pair(DUMMY_KEY1, b'no comment'), |
1408 | 1408 |
Pair(DUMMY_KEY2, b'a comment'), |
... | ... |
@@ -1563,7 +1563,7 @@ contents go here |
1563 | 1563 |
def func( |
1564 | 1564 |
*_args: Any, |
1565 | 1565 |
**_kwargs: Any, |
1566 |
- ) -> list[_types.KeyCommentPair]: |
|
1566 |
+ ) -> list[_types.SSHKeyCommentPair]: |
|
1567 | 1567 |
return [] |
1568 | 1568 |
|
1569 | 1569 |
monkeypatch.setattr(ssh_agent.SSHAgentClient, 'list_keys', func) |
... | ... |
@@ -297,11 +297,11 @@ class TestStoreroom: |
297 | 297 |
bucket_item = ( |
298 | 298 |
b'\xff' + bytes(storeroom.ENCRYPTED_KEYPAIR_SIZE) + bytes(3) |
299 | 299 |
) |
300 |
- master_keys: storeroom.MasterKeys = { |
|
301 |
- 'encryption_key': bytes(storeroom.KEY_SIZE), |
|
302 |
- 'signing_key': bytes(storeroom.KEY_SIZE), |
|
303 |
- 'hashing_key': bytes(storeroom.KEY_SIZE), |
|
304 |
- } |
|
300 |
+ master_keys = _types.StoreroomMasterKeys( |
|
301 |
+ encryption_key=bytes(storeroom.KEY_SIZE), |
|
302 |
+ signing_key=bytes(storeroom.KEY_SIZE), |
|
303 |
+ hashing_key=bytes(storeroom.KEY_SIZE), |
|
304 |
+ ) |
|
305 | 305 |
with pytest.raises(ValueError, match='Cannot handle version 255'): |
306 | 306 |
storeroom.decrypt_bucket_item(bucket_item, master_keys) |
307 | 307 |
|
... | ... |
@@ -312,11 +312,11 @@ class TestStoreroom: |
312 | 312 |
config: str, |
313 | 313 |
) -> None: |
314 | 314 |
runner = click.testing.CliRunner(mix_stderr=False) |
315 |
- master_keys: storeroom.MasterKeys = { |
|
316 |
- 'encryption_key': bytes(storeroom.KEY_SIZE), |
|
317 |
- 'signing_key': bytes(storeroom.KEY_SIZE), |
|
318 |
- 'hashing_key': bytes(storeroom.KEY_SIZE), |
|
319 |
- } |
|
315 |
+ master_keys = _types.StoreroomMasterKeys( |
|
316 |
+ encryption_key=bytes(storeroom.KEY_SIZE), |
|
317 |
+ signing_key=bytes(storeroom.KEY_SIZE), |
|
318 |
+ hashing_key=bytes(storeroom.KEY_SIZE), |
|
319 |
+ ) |
|
320 | 320 |
with tests.isolated_vault_exporter_config( |
321 | 321 |
monkeypatch=monkeypatch, |
322 | 322 |
runner=runner, |
... | ... |
@@ -443,7 +443,8 @@ class TestStoreroom: |
443 | 443 |
match=r'Invalid encrypted master keys payload', |
444 | 444 |
): |
445 | 445 |
storeroom.decrypt_master_keys_data( |
446 |
- data, {'encryption_key': key, 'signing_key': key} |
|
446 |
+ data, |
|
447 |
+ _types.StoreroomKeyPair(encryption_key=key, signing_key=key), |
|
447 | 448 |
) |
448 | 449 |
with pytest.raises( |
449 | 450 |
ValueError, |
... | ... |
@@ -451,11 +452,9 @@ class TestStoreroom: |
451 | 452 |
): |
452 | 453 |
storeroom.decrypt_session_keys( |
453 | 454 |
data, |
454 |
- { |
|
455 |
- 'hashing_key': key, |
|
456 |
- 'encryption_key': key, |
|
457 |
- 'signing_key': key, |
|
458 |
- }, |
|
455 |
+ _types.StoreroomMasterKeys( |
|
456 |
+ hashing_key=key, encryption_key=key, signing_key=key |
|
457 |
+ ), |
|
459 | 458 |
) |
460 | 459 |
|
461 | 460 |
@tests.hypothesis_settings_coverage_compatible |
... | ... |
@@ -472,16 +471,15 @@ class TestStoreroom: |
472 | 471 |
# such random sampling is astronomically tiny. |
473 | 472 |
with pytest.raises(cryptography.exceptions.InvalidSignature): |
474 | 473 |
storeroom.decrypt_master_keys_data( |
475 |
- data, {'encryption_key': key, 'signing_key': key} |
|
474 |
+ data, |
|
475 |
+ _types.StoreroomKeyPair(encryption_key=key, signing_key=key), |
|
476 | 476 |
) |
477 | 477 |
with pytest.raises(cryptography.exceptions.InvalidSignature): |
478 | 478 |
storeroom.decrypt_session_keys( |
479 | 479 |
data, |
480 |
- { |
|
481 |
- 'hashing_key': key, |
|
482 |
- 'encryption_key': key, |
|
483 |
- 'signing_key': key, |
|
484 |
- }, |
|
480 |
+ _types.StoreroomMasterKeys( |
|
481 |
+ hashing_key=key, encryption_key=key, signing_key=key |
|
482 |
+ ), |
|
485 | 483 |
) |
486 | 484 |
|
487 | 485 |
|
... | ... |
@@ -560,9 +560,9 @@ class TestAgentInteraction: |
560 | 560 |
with monkeypatch.context() as monkeypatch2: |
561 | 561 |
client = ssh_agent.SSHAgentClient() |
562 | 562 |
monkeypatch2.setattr(client, 'request', request) |
563 |
- KeyCommentPair = _types.KeyCommentPair # noqa: N806 |
|
563 |
+ SSHKeyCommentPair = _types.SSHKeyCommentPair # noqa: N806 |
|
564 | 564 |
loaded_keys = [ |
565 |
- KeyCommentPair(v['public_key_data'], b'no comment') |
|
565 |
+ SSHKeyCommentPair(v['public_key_data'], b'no comment') |
|
566 | 566 |
for v in tests.SUPPORTED_KEYS.values() |
567 | 567 |
] |
568 | 568 |
monkeypatch2.setattr(client, 'list_keys', lambda: loaded_keys) |
569 | 569 |