示例#1
0
 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;
 }
示例#2
0
 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;
 }
示例#3
0
 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;
 }
示例#4
0
 /**
  * @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();
 }