Ejemplo n.º 1
0
    def _calcPendingStates(self, clientRandom, serverRandom, implementations):
        if self.session.cipherSuite in CipherSuite.aes128Suites:
            macLength = 20
            keyLength = 16
            ivLength = 16
            createCipherFunc = createAES
        elif self.session.cipherSuite in CipherSuite.aes256Suites:
            macLength = 20
            keyLength = 32
            ivLength = 16
            createCipherFunc = createAES
        elif self.session.cipherSuite in CipherSuite.rc4Suites:
            macLength = 20
            keyLength = 16
            ivLength = 0
            createCipherFunc = createRC4
        elif self.session.cipherSuite in CipherSuite.tripleDESSuites:
            macLength = 20
            keyLength = 24
            ivLength = 8
            createCipherFunc = createTripleDES
        else:
            raise AssertionError()

        if self.version == (3, 0):
            createMACFunc = MAC_SSL
        elif self.version in ((3, 1), (3, 2)):
            createMACFunc = hmac.HMAC

        outputLength = (macLength * 2) + (keyLength * 2) + (ivLength * 2)

        # Calculate Keying Material from Master Secret
        if self.version == (3, 0):
            keyBlock = PRF_SSL(self.session.masterSecret, concatArrays(serverRandom, clientRandom), outputLength)
        elif self.version in ((3, 1), (3, 2)):
            keyBlock = PRF(
                self.session.masterSecret, "key expansion", concatArrays(serverRandom, clientRandom), outputLength
            )
        else:
            raise AssertionError()

        # Slice up Keying Material
        clientPendingState = _ConnectionState()
        serverPendingState = _ConnectionState()
        p = Parser(keyBlock)
        clientMACBlock = bytesToString(p.getFixBytes(macLength))
        serverMACBlock = bytesToString(p.getFixBytes(macLength))
        clientKeyBlock = bytesToString(p.getFixBytes(keyLength))
        serverKeyBlock = bytesToString(p.getFixBytes(keyLength))
        clientIVBlock = bytesToString(p.getFixBytes(ivLength))
        serverIVBlock = bytesToString(p.getFixBytes(ivLength))
        clientPendingState.macContext = createMACFunc(clientMACBlock, digestmod=sha)
        serverPendingState.macContext = createMACFunc(serverMACBlock, digestmod=sha)
        clientPendingState.encContext = createCipherFunc(clientKeyBlock, clientIVBlock, implementations)
        serverPendingState.encContext = createCipherFunc(serverKeyBlock, serverIVBlock, implementations)

        # Assign new connection states to pending states
        if self._client:
            self._pendingWriteState = clientPendingState
            self._pendingReadState = serverPendingState
        else:
            self._pendingWriteState = serverPendingState
            self._pendingReadState = clientPendingState

        if self.version == (3, 2) and ivLength:
            # Choose fixedIVBlock for TLS 1.1 (this is encrypted with the CBC
            # residue to create the IV for each sent block)
            self.fixedIVBlock = getRandomBytes(ivLength)
Ejemplo n.º 2
0
    def _calcPendingStates(self, clientRandom, serverRandom, implementations):
        if self.session.cipherSuite in CipherSuite.aes128Suites:
            macLength = 20
            keyLength = 16
            ivLength = 16
            createCipherFunc = createAES
        elif self.session.cipherSuite in CipherSuite.aes256Suites:
            macLength = 20
            keyLength = 32
            ivLength = 16
            createCipherFunc = createAES
        elif self.session.cipherSuite in CipherSuite.rc4Suites:
            macLength = 20
            keyLength = 16
            ivLength = 0
            createCipherFunc = createRC4
        elif self.session.cipherSuite in CipherSuite.tripleDESSuites:
            macLength = 20
            keyLength = 24
            ivLength = 8
            createCipherFunc = createTripleDES
        else:
            raise AssertionError()

        if self.version == (3, 0):
            createMACFunc = MAC_SSL
        elif self.version in ((3, 1), (3, 2)):
            createMACFunc = hmac.HMAC

        outputLength = (macLength * 2) + (keyLength * 2) + (ivLength * 2)

        #Calculate Keying Material from Master Secret
        if self.version == (3, 0):
            keyBlock = PRF_SSL(self.session.masterSecret,
                               concatArrays(serverRandom, clientRandom),
                               outputLength)
        elif self.version in ((3, 1), (3, 2)):
            keyBlock = PRF(self.session.masterSecret, "key expansion",
                           concatArrays(serverRandom, clientRandom),
                           outputLength)
        else:
            raise AssertionError()

        #Slice up Keying Material
        clientPendingState = _ConnectionState()
        serverPendingState = _ConnectionState()
        p = Parser(keyBlock)
        clientMACBlock = bytesToString(p.getFixBytes(macLength))
        serverMACBlock = bytesToString(p.getFixBytes(macLength))
        clientKeyBlock = bytesToString(p.getFixBytes(keyLength))
        serverKeyBlock = bytesToString(p.getFixBytes(keyLength))
        clientIVBlock = bytesToString(p.getFixBytes(ivLength))
        serverIVBlock = bytesToString(p.getFixBytes(ivLength))
        clientPendingState.macContext = createMACFunc(clientMACBlock,
                                                      digestmod=sha)
        serverPendingState.macContext = createMACFunc(serverMACBlock,
                                                      digestmod=sha)
        clientPendingState.encContext = createCipherFunc(
            clientKeyBlock, clientIVBlock, implementations)
        serverPendingState.encContext = createCipherFunc(
            serverKeyBlock, serverIVBlock, implementations)

        #Assign new connection states to pending states
        if self._client:
            self._pendingWriteState = clientPendingState
            self._pendingReadState = serverPendingState
        else:
            self._pendingWriteState = serverPendingState
            self._pendingReadState = clientPendingState

        if self.version == (3, 2) and ivLength:
            #Choose fixedIVBlock for TLS 1.1 (this is encrypted with the CBC
            #residue to create the IV for each sent block)
            self.fixedIVBlock = getRandomBytes(ivLength)