• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
78