]> git.proxmox.com Git - mirror_frr.git/blob - python/clippy/uidhash.py
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / python / clippy / uidhash.py
1 # SPDX-License-Identifier: GPL-2.0-or-later
2 # xref unique ID hash calculation
3 #
4 # Copyright (C) 2020 David Lamparter for NetDEF, Inc.
5
6 import struct
7 from hashlib import sha256
8
9
10 def bititer(data, bits, startbit=True):
11 """
12 just iterate the individual bits out from a bytes object
13
14 if startbit is True, an '1' bit is inserted at the very beginning
15 goes <bits> at a time, starts at LSB.
16 """
17 bitavail, v = 0, 0
18 if startbit and len(data) > 0:
19 v = data.pop(0)
20 yield (v & ((1 << bits) - 1)) | (1 << (bits - 1))
21 bitavail = 9 - bits
22 v >>= bits - 1
23
24 while len(data) > 0:
25 while bitavail < bits:
26 v |= data.pop(0) << bitavail
27 bitavail += 8
28 yield v & ((1 << bits) - 1)
29 bitavail -= bits
30 v >>= bits
31
32
33 def base32c(data):
34 """
35 Crockford base32 with extra dashes
36 """
37 chs = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
38 o = ""
39 if type(data) == str:
40 data = [ord(v) for v in data]
41 else:
42 data = list(data)
43 for i, bits in enumerate(bititer(data, 5)):
44 if i == 5:
45 o = o + "-"
46 elif i == 10:
47 break
48 o = o + chs[bits]
49 return o
50
51
52 def uidhash(filename, hashstr, hashu32a, hashu32b):
53 """
54 xref Unique ID hash used in FRRouting
55 """
56 filename = "/".join(filename.rsplit("/")[-2:])
57
58 hdata = filename.encode("UTF-8") + hashstr.encode("UTF-8")
59 hdata += struct.pack(">II", hashu32a, hashu32b)
60 i = sha256(hdata).digest()
61 return base32c(i)