public function decode() { $core = $this->core; list($vMajor, $vMinor) = $core->getVersion(); // Client $connOut = $core->getOutDuplex(); // Server $connIn = $core->getInDuplex(); // ECDHE if ($core->cipherSuite->isECDHEEnabled()) { $extensions = $core->extensions; $data = $extensions->call('Curve', 'decodeClientKeyExchange', ''); $preMaster = $extensions->call('Curve', 'getPremaster', null); } else { $preMaster = Core::_pack('C', $vMajor) . Core::_pack('C', $vMinor) . Core::getRandom(46); $crtDers = $core->getCrtDers(); $publicKey = X509::getPublicKey($crtDers); openssl_public_encrypt($preMaster, $encPreMaster, $publicKey); $data = Core::_pack('n', strlen($encPreMaster)) . $encPreMaster; } // Set Master Secret, IV and MAC $this->setKeys($preMaster, $connIn, $connOut); $this->msgType = HandshakeType::CLIENT_KEY_EXCHANGE; $this->length = strlen($data); return $this->getBinHeader() . $data; }
public function decode() { $core = $this->core; $extensions = $core->extensions; $connOut = $core->getOutDuplex(); $sessionID = $core->getSessionID(); list($vMajor, $vMinor) = $core->getVersion(); // Set server random $connOut->random = Core::getRandom(32); $sessionLength = strlen($sessionID); $data = Core::_pack('C', $vMajor) . Core::_pack('C', $vMinor) . $connOut->random . Core::_pack('C', $sessionLength); if ($sessionLength > 0) { $data .= $sessionID; } $cipherSuite = $core->cipherSuite; list($cipher1, $cipher2) = $cipherSuite->getID(); $data .= Core::_pack('C', $cipher1) . Core::_pack('C', $cipher2); // Compression method length $data .= Core::_pack('C', 0x0); $extData = $extensions->onDecodeServerHello(); if (strlen($extData) > 0) { $data .= Core::_pack('n', strlen($extData)) . $extData; } $this->msgType = 2; $this->length = strlen($data); return $this->getBinHeader() . $data; }
public function decode() { $core = $this->core; $connOut = $core->getOutDuplex(); list($vMajor, $vMinor) = $core->getVersion(); // Set client random $connOut->random = Core::getRandom(32); // Set TLS Version $data = Core::_pack('C', $vMajor) . Core::_pack('C', $vMinor); // Client Random $data .= $connOut->random; // Session ID - no session $data .= Core::_pack('C', 0x0); // Cipher Suite $cipherSuiteList = CipherSuites::decodeCipherList(); $data .= Core::_pack('n', strlen($cipherSuiteList)) . $cipherSuiteList; // Compression method $data .= Core::_pack('C', 0x1) . Core::_pack('C', $core->getCompressionMethod()); // Extension Length //$data .= Core::_pack('n', 0x00); $extensionData = $core->extensions->onDecodeClientHello(); $data .= Core::_pack('n', strlen($extensionData)) . $extensionData; $this->msgType = HandshakeType::CLIENT_HELLO; $this->length = strlen($data); return $this->getBinHeader() . $data; }
/** * @Override */ public function decode() { $conn = $this->conn; $core = $conn->getCore(); $cipherSuite = $core->cipherSuite; $sharedKey = $conn->Key; $ivLen = $cipherSuite->getIVLen(); $macLen = $cipherSuite->getMACLen(); $MAC = $this->calculateMAC(); $IV = Core::getRandom($ivLen); $data = $this->payload . $MAC; // Calculate and append padding $fpd = function ($l, $bz) { return $l + $bz - $l % $bz - $l; }; $paddingLength = $fpd(strlen($this->payload . $MAC) + 1, $ivLen); $data .= Core::_pack('C', $paddingLength); $encData = $cipherSuite->blockEncrypt($data, $sharedKey, $IV); if (false === $encData) { throw new TLSAlertException(Alert::create(Alert::BAD_RECORD_MAC), "Cipher block encryption failed"); } $encData = $IV . $encData; $this->incrementSeq(); if ($this->contentType == ContentType::HANDSHAKE) { $core->countHandshakeMessages($this->payload); } $this->set('payload', $encData); return parent::decode(); }