1313from .constants import CipherSuite
1414from .utils import tlshashlib as hashlib
1515from .utils import tlshmac as hmac
16+ from .utils .deprecations import deprecated_method
1617
1718# 1024, 1536, 2048, 3072, 4096, 6144, and 8192 bit groups
1819# Formatted to match lines in RFC
@@ -509,6 +510,7 @@ def PRF_SSL(secret, seed, length):
509510 index += 1
510511 return bytes
511512
513+ @deprecated_method ("Please use calcKey method instead." )
512514def calcExtendedMasterSecret (version , cipherSuite , premasterSecret ,
513515 handshakeHashes ):
514516 """Derive Extended Master Secret from premaster and handshake msgs"""
@@ -532,6 +534,7 @@ def calcExtendedMasterSecret(version, cipherSuite, premasterSecret,
532534 return masterSecret
533535
534536
537+ @deprecated_method ("Please use calcKey method instead." )
535538def calcMasterSecret (version , cipherSuite , premasterSecret , clientRandom ,
536539 serverRandom ):
537540 """Derive Master Secret from premaster secret and random values"""
@@ -556,6 +559,7 @@ def calcMasterSecret(version, cipherSuite, premasterSecret, clientRandom,
556559 raise AssertionError ()
557560 return masterSecret
558561
562+ @deprecated_method ("Please use calcKey method instead." )
559563def calcFinished (version , masterSecret , cipherSuite , handshakeHashes ,
560564 isClient ):
561565 """Calculate the Handshake protocol Finished value
@@ -595,6 +599,89 @@ def calcFinished(version, masterSecret, cipherSuite, handshakeHashes,
595599
596600 return verifyData
597601
602+ def calc_key (version , secret , cipher_suite , label , handshake_hashes = None ,
603+ client_random = None , server_random = None , output_length = None ):
604+ """
605+ Method for calculating different keys depending on input.
606+ It can be used to calculate finished value, master secret,
607+ extended master secret or key expansion.
608+
609+ :param version: TLS protocol version
610+ :type version: tuple(int, int)
611+ :param bytearray secret: master secret or premasterSecret which will be
612+ used in the PRF.
613+ :param int cipher_suite: Negotiated cipher suite of the connection.
614+ :param bytes label: label for the key you want to calculate
615+ (ex. 'master secret', 'extended master secret', etc).
616+ :param handshake_hashes: running hash of the handshake messages
617+ needed for calculating extended master secret or finished value.
618+ :type handshake_hashes: ~tlslite.handshakehashes.HandshakeHashes
619+ :param bytearray client_random: client random needed for calculating
620+ master secret or key expansion.
621+ :param bytearray server_random: server random needed for calculating
622+ master secret or key expansion.
623+ :param int output_length: Number of bytes to output.
624+ """
625+
626+
627+ # SSL3 calculations.
628+ if version == (3 , 0 ):
629+ # Calculating Finished value, either for message sent
630+ # by server or by client
631+ if label == b"client finished" :
632+ senderStr = b"\x43 \x4C \x4E \x54 "
633+ return handshake_hashes .digestSSL (secret , senderStr )
634+ elif label == b"server finished" :
635+ senderStr = b"\x53 \x52 \x56 \x52 "
636+ return handshake_hashes .digestSSL (secret , senderStr )
637+ else :
638+ assert label in [b"key expansion" , b"master secret" ]
639+ func = PRF_SSL
640+
641+ # TLS1.0 or TLS1.1 calculations.
642+ elif version in ((3 , 1 ), (3 , 2 )):
643+ func = PRF
644+ # Seed needed for calculating extended master secret
645+ if label == b"extended master secret" :
646+ seed = handshake_hashes .digest ('md5' ) + \
647+ handshake_hashes .digest ('sha1' )
648+ # Seed needed for calculating Finished value
649+ elif label in [b"server finished" , b"client finished" ]:
650+ seed = handshake_hashes .digest ()
651+ else :
652+ assert label in [b"key expansion" , b"master secret" ]
653+
654+ # TLS1.2 calculations.
655+ else :
656+ assert version == (3 , 3 )
657+ if cipher_suite in CipherSuite .sha384PrfSuites :
658+ func = PRF_1_2_SHA384
659+ # Seed needed for calculating Finished value or extended master
660+ # secret
661+ if label in [b"extended master secret" , b"server finished" ,
662+ b"client finished" ]:
663+ seed = handshake_hashes .digest ('sha384' )
664+ else :
665+ assert label in [b"key expansion" , b"master secret" ]
666+ else :
667+ # Same as above, just using sha256
668+ func = PRF_1_2
669+ if label in [b"extended master secret" , b"server finished" ,
670+ b"client finished" ]:
671+ seed = handshake_hashes .digest ('sha256' )
672+ else :
673+ assert label in [b"key expansion" , b"master secret" ]
674+
675+ # Seed needed for calculating key expansion or master secret
676+ if label == b"key expansion" :
677+ seed = server_random + client_random
678+ if label == b"master secret" :
679+ seed = client_random + server_random
680+
681+ if func == PRF_SSL :
682+ return func (secret , seed , output_length )
683+ return func (secret , label , seed , output_length )
684+
598685def makeX (salt , username , password ):
599686 if len (username )>= 256 :
600687 raise ValueError ("username too long" )
0 commit comments