1# SPDX-License-Identifier: GPL-2.0-only
2# This file is part of Scapy
3# See https://scapy.net/ for more information
4# Copyright (C) 2007, 2008, 2009 Arnaud Ebalard
5# 2015, 2016 Maxence Tury
6
7"""
8Hash classes.
9"""
10
11from hashlib import md5, sha1, sha224, sha256, sha384, sha512
12from scapy.layers.tls.crypto.md4 import MD4 as md4
13
14
15_tls_hash_algs = {}
16
17
18class _GenericHashMetaclass(type):
19 """
20 Hash classes are automatically registered through this metaclass.
21 Furthermore, their name attribute is extracted from their class name.
22 """
23 def __new__(cls, hash_name, bases, dct):
24 if hash_name != "_GenericHash":
25 dct["name"] = hash_name[5:] # remove leading "Hash_"
26 the_class = super(_GenericHashMetaclass, cls).__new__(cls, hash_name,
27 bases, dct)
28 if hash_name != "_GenericHash":
29 _tls_hash_algs[hash_name[5:]] = the_class
30 return the_class
31
32
33class _GenericHash(metaclass=_GenericHashMetaclass):
34 def digest(self, tbd):
35 return self.hash_cls(tbd).digest()
36
37
38class Hash_NULL(_GenericHash):
39 hash_len = 0
40
41 def digest(self, tbd):
42 return b""
43
44
45class Hash_MD4(_GenericHash):
46 hash_cls = md4
47 hash_len = 16
48
49
50class Hash_MD5(_GenericHash):
51 hash_cls = md5
52 hash_len = 16
53
54
55class Hash_SHA(_GenericHash):
56 hash_cls = sha1
57 hash_len = 20
58
59
60class Hash_SHA224(_GenericHash):
61 hash_cls = sha224
62 hash_len = 28
63
64
65class Hash_SHA256(_GenericHash):
66 hash_cls = sha256
67 hash_len = 32
68
69
70class Hash_SHA384(_GenericHash):
71 hash_cls = sha384
72 hash_len = 48
73
74
75class Hash_SHA512(_GenericHash):
76 hash_cls = sha512
77 hash_len = 64