/usr/lib/python3/dist-packages/tlslite/handshakehashes.py is in python3-tlslite-ng 0.5.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | # Copyright (c) 2015, Hubert Kario
#
# See the LICENSE file for legal information regarding use of this file.
"""Handling cryptographic hashes for handshake protocol"""
from .utils.compat import compat26Str, compatHMAC
from .utils.cryptomath import MD5, SHA1
import hashlib
class HandshakeHashes(object):
"""
Store and calculate necessary hashes for handshake protocol
Calculates message digests of messages exchanged in handshake protocol
of SSLv3 and TLS.
"""
def __init__(self):
"""Create instance"""
self._handshakeMD5 = hashlib.md5()
self._handshakeSHA = hashlib.sha1()
self._handshakeSHA256 = hashlib.sha256()
self._handshakeSHA384 = hashlib.sha384()
def update(self, data):
"""
Add L{data} to hash input.
@type data: bytearray
@param data: serialized TLS handshake message
"""
text = compat26Str(data)
self._handshakeMD5.update(text)
self._handshakeSHA.update(text)
self._handshakeSHA256.update(text)
self._handshakeSHA384.update(text)
def digest(self, digest=None):
"""
Calculate and return digest for the already consumed data.
Used for Finished and CertificateVerify messages.
@type digest: str
@param digest: name of digest to return
"""
if digest is None:
return self._handshakeMD5.digest() + self._handshakeSHA.digest()
elif digest == 'md5':
return self._handshakeMD5.digest()
elif digest == 'sha1':
return self._handshakeSHA.digest()
elif digest == 'sha256':
return self._handshakeSHA256.digest()
elif digest == 'sha384':
return self._handshakeSHA384.digest()
else:
raise ValueError("Unknown digest name")
def digestSSL(self, masterSecret, label):
"""
Calculate and return digest for already consumed data (SSLv3 version)
Used for Finished and CertificateVerify messages.
@type masterSecret: bytearray
@param masterSecret: value of the master secret
@type label: bytearray
@param label: label to include in the calculation
"""
#pylint: disable=maybe-no-member
imacMD5 = self._handshakeMD5.copy()
imacSHA = self._handshakeSHA.copy()
#pylint: enable=maybe-no-member
# the below difference in input for MD5 and SHA-1 is why we can't reuse
# digest() method
imacMD5.update(compatHMAC(label + masterSecret + bytearray([0x36]*48)))
imacSHA.update(compatHMAC(label + masterSecret + bytearray([0x36]*40)))
md5Bytes = MD5(masterSecret + bytearray([0x5c]*48) + \
bytearray(imacMD5.digest()))
shaBytes = SHA1(masterSecret + bytearray([0x5c]*40) + \
bytearray(imacSHA.digest()))
return md5Bytes + shaBytes
#pylint: disable=protected-access, maybe-no-member
def copy(self):
"""
Copy object
Return a copy of the object with all the hashes in the same state
as the source object.
@rtype: HandshakeHashes
"""
other = HandshakeHashes()
other._handshakeMD5 = self._handshakeMD5.copy()
other._handshakeSHA = self._handshakeSHA.copy()
other._handshakeSHA256 = self._handshakeSHA256.copy()
other._handshakeSHA384 = self._handshakeSHA384.copy()
return other
|