]> asedeno.scripts.mit.edu Git - wg_llv6.git/blob - wg_pubkey_to_llv6.py
initial commit
[wg_llv6.git] / wg_pubkey_to_llv6.py
1 #!/usr/bin/env python
2
3 import base64
4 import ipaddress
5 import sys
6
7 try:
8     from hashlib import blake2s
9 except ImportError:
10     try:
11         from pyblake2 import blake2s
12     except ImportError:
13         print('No native BLAKE2 support; please pip install pyblake2')
14         raise
15
16 LL_NET_PART = int(ipaddress.IPv6Address('fe80::'))
17         
18 def pubkey_to_lladdr(pubkey):
19     # Check / normalize public key to raw bytes.
20     if isinstance(pubkey, str):
21         pubkey = base64.b64decode(pubkey)
22     elif isinstance(pubkey, bytes):
23         if len(pubkey) != 32:
24             pubkey = base64.b64decode(pubkey)
25     else:
26         raise TypeError()
27     assert len(pubkey) == 32
28
29     # Hash and generate interface part
30     pk_hash = blake2s(pubkey, digest_size=8)
31     node = int.from_bytes(pk_hash.digest(), 'big')
32
33     # Combine with link-local net part.
34     addr = ipaddress.IPv6Address(LL_NET_PART + node)
35     return addr
36
37 def main():
38     pubkey = sys.argv[1]
39     addr = pubkey_to_lladdr(pubkey)
40     print(str(addr))
41
42 if __name__ == '__main__':
43     main()