summaryrefslogtreecommitdiff
path: root/python/vyos/snmpv3_hashgen.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/vyos/snmpv3_hashgen.py')
-rw-r--r--python/vyos/snmpv3_hashgen.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/python/vyos/snmpv3_hashgen.py b/python/vyos/snmpv3_hashgen.py
new file mode 100644
index 000000000..38eca5314
--- /dev/null
+++ b/python/vyos/snmpv3_hashgen.py
@@ -0,0 +1,51 @@
+# Imported from https://github.com/TheMysteriousX/SNMPv3-Hash-Generator
+
+import hashlib
+import string
+import secrets
+
+from itertools import repeat
+
+P_LEN = 32
+E_LEN = 16
+
+class Hashgen(object):
+ @staticmethod
+ def md5(bytes):
+ return hashlib.md5(bytes).digest().hex()
+
+ @staticmethod
+ def sha1(bytes):
+ return hashlib.sha1(bytes).digest().hex()
+
+ @staticmethod
+ def expand(s, l):
+ reps = l // len(s) + 1 # approximation; worst case: overrun = l + len(s)
+ return ''.join(list(repeat(s, reps)))[:l]
+
+ @classmethod
+ def kdf(cls, password):
+ data = cls.expand(password, 1048576).encode('utf-8')
+ return hashlib.sha1(data).digest()
+
+ @staticmethod
+ def random_string(len=P_LEN, alphabet=(string.ascii_letters + string.digits)):
+ return ''.join(secrets.choice(alphabet) for _ in range(len))
+
+ @staticmethod
+ def random_engine(len=E_LEN):
+ return secrets.token_hex(len)
+
+ @classmethod
+ def derive_msg(cls, passphrase, engine):
+ # Parameter derivation รก la rfc3414
+ Ku = cls.kdf(passphrase)
+ E = bytearray.fromhex(engine)
+
+ return b''.join([Ku, E, Ku])
+
+ # Define available hash algorithms
+ algs = {
+ 'sha1': sha1,
+ 'md5': md5,
+ }