-
Notifications
You must be signed in to change notification settings - Fork 266
Expand file tree
/
Copy pathtlv.py
More file actions
71 lines (61 loc) · 2.02 KB
/
Copy pathtlv.py
File metadata and controls
71 lines (61 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from typing import Union
from enum import IntEnum
class FieldTag(IntEnum):
STRUCT_TYPE = 0x01
STRUCT_VERSION = 0x02
CONTACT_NAME = 0xf0
SCOPE = 0xf1
PREVIOUS_CONTACT_NAME = 0xf3
ACCOUNT_IDENTIFIER = 0xf2
PREVIOUS_IDENTIFIER = 0xf4
PREVIOUS_SCOPE = 0xf5
GROUP_HANDLE = 0xf6
CHALLENGE = 0x12
DER_SIGNATURE = 0x15
DERIVATION_PATH = 0x21
ADDRESS = 0x22
CHAIN_ID = 0x23
TICKER = 0x24
TX_HASH = 0x27
DOMAIN_HASH = 0x28
SELECTOR = 0x40
BLOCKCHAIN_FAMILY = 0x51
NETWORK_NAME = 0x52
NETWORK_ICON_HASH = 0x53
HMAC_PROOF = 0x29
HMAC_REST = 0xf7
TX_CHECKS_NORMALIZED_RISK = 0x80
TX_CHECKS_NORMALIZED_CATEGORY = 0x81
MESSAGE = 0x82
TINY_URL = 0x83
TX_TYPE = 0x84
THRESHOLD = 0xa0,
SIGNERS_COUNT = 0xa1,
LESM_ROLE = 0xa2,
class TlvSerializable:
def serialize(self) -> bytes:
raise NotImplementedError
@staticmethod
def der_encode(value: int) -> bytes:
# max() to have minimum length of 1
value_bytes = value.to_bytes(max(1, (value.bit_length() + 7) // 8), 'big')
if value >= 0x80:
value_bytes = (0x80 | len(value_bytes)).to_bytes(1, 'big') + value_bytes
return value_bytes
@staticmethod
def serialize_field(tag: int, value: Union[int, str, bytes, bytearray]) -> bytes:
if isinstance(value, int):
# max() to have minimum length of 1
value = value.to_bytes(max(1, (value.bit_length() + 7) // 8), 'big')
elif isinstance(value, str):
value = value.encode()
elif isinstance(value, bytearray):
value = bytes(value)
assert isinstance(value, bytes), f"Unhandled TLV formatting for type : {type(value)}"
tlv = bytearray()
tlv += TlvSerializable.der_encode(tag)
tlv += TlvSerializable.der_encode(len(value))
tlv += value
return tlv
def format_tlv(tag: int, value: Union[int, str, bytes, bytearray]) -> bytes:
return TlvSerializable.serialize_field(tag, value)