function KDF() { $debug = $this->debug; if ($this->decryptorTest) { $debug = false; } // KDF constants $hmacKey = unhexlify("3b27bdc9e00fd5995d60a1ee0aa057a9f1416ed085b21762110f1c2204ddf80ec8caab003070fd43baafdde27aeb3194ece5c1adff406a51185eb5dd7300c058"); $hmacData1 = unhexlify("d1ba6371c56ce6b498f1718228b0aa112f24a47bcad757a1d0b3f4c2b8bd637cb8080d9c8e7855b36a85722a60552a6c00"); $hmacData2 = unhexlify("d1ba6371c56ce6b498f1718228b0aa112f24a47bcad757a1d0b3f4c2b8bd637cb8080d9c8e7855b36a85722a60552a6c01"); // Decrypt packet salt if ($this->ecmID !== $this->prevEcmID) { $saltHmacKey = hash_hmac("sha1", $this->sessionKey . $this->packetIV, $hmacKey, true); LogDebug("SaltHmacKey : " . hexlify($saltHmacKey), $debug); $this->saltAesKey = substr(hash_hmac("sha1", $hmacData1, $saltHmacKey, true), 0, 16); LogDebug("SaltAesKey : " . hexlify($this->saltAesKey), $debug); $this->prevEcmID = $this->ecmID; } mcrypt_generic_init($this->aes_cbc, $this->saltAesKey, $this->packetIV); LogDebug("EncryptedSalt: " . hexlify($this->packetSalt), $debug); $decryptedSalt = mdecrypt_generic($this->aes_cbc, $this->packetSalt); LogDebug("DecryptedSalt: " . hexlify($decryptedSalt), $debug); mcrypt_generic_deinit($this->aes_cbc); $this->decryptBytes = ReadInt32($decryptedSalt, 0); LogDebug("DecryptBytes : " . $this->decryptBytes, $debug); $decryptedSalt = substr($decryptedSalt, 4, 16); LogDebug("DecryptedSalt: " . hexlify($decryptedSalt), $debug); // Generate final packet decryption key $finalHmacKey = hash_hmac("sha1", $decryptedSalt, $hmacKey, true); LogDebug("FinalHmacKey : " . hexlify($finalHmacKey), $debug); $this->packetKey = substr(hash_hmac("sha1", $hmacData2, $finalHmacKey, true), 0, 16); LogDebug("PacketKey : " . hexlify($this->packetKey), $debug); }
public static function generateToken($url) { $url = str_replace('http://redir.atmcdn.pl/http/', '', $url); $SecretKey = 'AB9843DSAIUDHW87Y3874Q903409QEWA'; $iv = 'ab5ef983454a21bd'; $KeyStr = '0f12f35aa0c542e45926c43a39ee2a7b38ec2f26975c00a30e1292f7e137e120e5ae9d1cfe10dd682834e3754efc1733'; $salt = ''; for ($i = 0; $i < 16; $i++) { $salt .= chr(mt_rand(ord('a'), ord('z'))); } $salt = hexlify($salt); $expire = 3600000 + time() * 1000 - 946684800000; $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); mcrypt_generic_init($td, $SecretKey, $iv); $decrypted = mdecrypt_generic($td, unhexlify($KeyStr)); mcrypt_generic_deinit($td); mcrypt_module_close($td); $key = utf8_encode(trim($decrypted)); $unencryptedToken = "name=" . $url . "&expire=" . $expire . ""; $pad = ''; $xx = 16 - strlen($unencryptedToken) % 16; for ($a = 1; $a <= $xx; $a++) { $pad .= chr(16 - strlen($unencryptedToken) % 16); } $unencryptedToken = $unencryptedToken . $pad; $td = mcrypt_module_open('rijndael-128', '', 'cbc', unhexlify($salt)); mcrypt_generic_init($td, unhexlify($key), unhexlify($salt)); $encrypted = mcrypt_generic($td, $unencryptedToken); mcrypt_generic_deinit($td); mcrypt_module_close($td); $token = strtoupper(hexlify($encrypted)); return "http://redir.atmcdn.pl/http/{$url}?salt={$salt}&token={$token}"; }