├── README.md ├── activator.php ├── raptor └── RaptorActivation.pem └── var └── www └── crypt ├── BigInteger.php ├── Hash.php ├── RSA.php └── Random.php /README.md: -------------------------------------------------------------------------------- 1 | # MiUnlockCode iCloud Bypass Signal OpenSourceCode! 2 | # ...........::::::Open Source By MiUnlock.Net::::::................ 3 | 4 | Supported devices : iPhone/iPad/iPod All iOS & All iDevices Till iPhone X. 5 | 6 | ==== instructions ==== 7 | 8 | Raptor Path: 'System/Library/PrivateFrameworks/MobileActivation.framework/Support/Certificates/RaptorActivation.pem' 9 | 10 | 11 | ideviceactivation activate -s http://example.com/activator.php 12 | 13 | 14 | Credits: https://miunlock.net/ 15 | 16 | Telegram: @MiUnlockCode 17 | 18 | Donate : 19 | 20 | 21 | # USDT ERC20: 0x93a4ad733bef765110b242906ed6e314cffe851a 22 | -------------------------------------------------------------------------------- /activator.php: -------------------------------------------------------------------------------- 1 | $activationinfo )); } 31 | }*/ 32 | $activationinfo = http_build_query(array('activation-info' => $activationinfo )); 33 | if (isset($_GET['saveRequestTicket']) && !isset($_GET['update'])) { 34 | if (is_file('./var/www/requests/'.$_GET['saveRequestTicket'].'.html')) { 35 | if (is_file('./var/www/requests/'.$_GET['saveRequestTicket'].'-ARS.txt')) { header("ARS: ".file_get_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'-ARS.txt')); } 36 | exit(file_get_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'.html')); 37 | } 38 | } 39 | $ch = curl_init(); 40 | curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: text/xml")); 41 | curl_setopt($ch, CURLOPT_URL, "https://albert.apple.com/deviceservices/deviceActivation"); 42 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 43 | curl_setopt($ch, CURLOPT_POST, 1); 44 | curl_setopt($ch, CURLOPT_POSTFIELDS, $activationinfo); 45 | curl_setopt($ch, CURLOPT_VERBOSE, 1); 46 | curl_setopt($ch, CURLOPT_HEADER, 1); 47 | $albert = curl_exec($ch); 48 | $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 49 | $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 50 | $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 51 | $header = substr($albert, 0, $header_size); 52 | $body = substr($albert, $header_size); 53 | curl_close ($ch); 54 | 55 | $albertHeaderSize = $header_size; 56 | $albertBodySize = strlen($body); 57 | http_response_code($httpcode); 58 | if (strpos($header, 'ARS') !== false) { 59 | $ARS = explode("\r\nARS: ", $header); 60 | $ARS = explode("\r\n", $ARS[1]); 61 | $ARS = $ARS[0]; 62 | header("ARS: " . $ARS); 63 | } else { $ARS = ''; } 64 | foreach (getallheaders() as $name => $value) { $headers[$name] = $value; } 65 | $logfile = "logfilename.log"; 66 | $rawpost = json_encode($_POST, true); 67 | $rawget = json_encode($_GET, true); 68 | $rawdata = file_get_contents('php://input'); 69 | $boundary = boundary(); 70 | 71 | if(strpos($body, 'clientInfo ack-received="true') !== false) { 72 | header("Content-Type: application/x-buddyml"); 73 | echo $body; 74 | exit; 75 | } elseif(strpos($body, 'AccountToken---Certificate') !== false) { 76 | $data = ActivationRecordXML($body); 77 | $dir = './var/www/requests'; 78 | $requestfile = ''; 79 | if(isset($_GET['saveRequestTicket'])) { $requestfile .= $_GET['saveRequestTicket']; } 80 | file_put_contents('./var/www/requests/'.$requestfile.'-AccTokenCert.txt' ,$data['AccountTokenCertificate']."\n".urldecode($activationinfo)."\n".$body); 81 | // openssl_sign(base64_decode($data['AccountToken']), $signature, openssl_pkey_get_private(PrivateKeyRaptor()), OPENSSL_ALGO_SHA1); 82 | // $body = str_replace($data['AccountTokenSignature'], '', $body); 83 | // $body = str_replace($data['AccountTokenCertificate'], AccountTokenCertificateTest(), $body); 84 | // $body = str_replace($data['UniqueDeviceCertificate'], '', $body); 85 | // file_put_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'-Body.txt', "\nOur sign:\n".$signature."\nAlb sign:\n".$data['AccountTokenSignature']."\nCert:\n".AccountTokenCertificateTest()); 86 | // if (!is_dir('./var/www/requests')) mkdir('./var/www/requests'); 87 | $data = call_user_func_array('array_merge', [ActivationRecordXML($body), ActivationRequestInfoXML($rawactpost, 1)]); 88 | $FairPlayKeyData = $data['FairPlayKeyData']; 89 | if(isset($data['SerialNumber'])) { 90 | $data['ARS'] = $ARS; 91 | $data['albertHeaderSize'] = $albertHeaderSize; 92 | $data['albertBodySize'] = $albertBodySize; 93 | $data['outputBodySize'] = strlen($body); 94 | $data['outputHeaders'] = headers_list(); 95 | $fileDeviceCertRequest = $dir.'/'.$data['SerialNumber'].'-DeviceCert.pem'; 96 | file_put_contents($fileDeviceCertRequest, base64_decode($data['DeviceCertRequest'])); 97 | $CSRout = base64_encode(shell_exec("(openssl x509 -req -days 1096 -CA $dir/CAcrt.pem -CAkey $dir/privkey.pem -set_serial 0x$(openssl rand -hex 9) -outform PEM -sha1 -extensions v3_ca -extfile $dir/CSR.cnf -in $fileDeviceCertRequest)")); 98 | // // Replace DeviceCertificate // 99 | // $body = str_replace($data['DeviceCertificate'], $CSRout, $body); 100 | // $body = str_replace($data['ActivationInfoXML'], str_repeat("1", strlen($data['ActivationInfoXML'])), $body); 101 | file_put_contents($fileDeviceCertRequest.".csr", base64_decode($data['DeviceCertRequest'])."\n\n".base64_decode($CSRout)); 102 | $file = './var/www/requests/'.$data['SerialNumber'].'-'.$data['DeviceClass'].'-'.$data['RegionCode'].'-'.$data['ProductVersion'].'-'.$data['RegulatoryModelNumber']; 103 | if (is_file($file.'-all.txt')) { file_put_contents($file.'-all.txt', json_encode($data)."\r\n".file_get_contents($file.'-all.txt')); } 104 | else { file_put_contents($file.'-all.txt', json_encode($data)); } 105 | file_put_contents($file.'-raw.txt', $data); 106 | } 107 | } else { 108 | $serverKP = substr(chunk_split(base64_encode(current(explode('', next(explode('serverKP', drmHandshake()))))), 68, "\n\t"), 0, -2); 109 | $data = ActivationRequestInfoXML($rawactpost, 1); 110 | $ActivationInfoXML = base64_decode($data['ActivationInfoXML']); 111 | $dataSet = ActivationRequestInfoXMLNew(reqTicket($ActivationInfoXML, $serverKP)); 112 | 113 | $reqTicketOut = reqTicket(makeTickets($ActivationInfoXML, $dataSet['InternationalMobileEquipmentIdentity'], $dataSet['SerialNumber'], $dataSet['UniqueDeviceID']), $serverKP); 114 | $final = actAlbertTicket($reqTicketOut); 115 | 116 | $dataGet = ActivationRecordXML($final); 117 | 118 | if ($AccountToken = base64_decode($dataGet['AccountToken'])) { 119 | file_put_contents('./var/www/requests/'.$data['SerialNumber'].'-'.$data['DeviceClass'].'-'.$data['RegionCode'].'-'.$data['ProductVersion'].'-Token.txt', "Before: ".$AccountToken."\n"); 120 | if(strpos($AccountToken, 'MobileEquipmentIdentifier') !== false) { 121 | $AccountToken = str_replace($dataGet['InternationalMobileEquipmentIdentity'] , $dataSet['InternationalMobileEquipmentIdentity'], $AccountToken); 122 | $AccountToken = str_replace($dataGet['MobileEquipmentIdentifier'] , $dataSet['MobileEquipmentIdentifier'], $AccountToken); 123 | $AccountToken = str_replace($dataGet['SerialNumber'] , $dataSet['SerialNumber'], $AccountToken); 124 | $AccountToken = str_replace($dataGet['UniqueDeviceID'] , $dataSet['UniqueDeviceID'], $AccountToken); 125 | if (isset($dataGet['ActivationTicket'])) { 126 | $AccountToken = str_replace($dataGet['ActivationTicket'], base64_encode(hex2bin(str_replace(array('35567207227802', '35495707243538'), array(substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14), substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14)), bin2hex(base64_decode($dataGet['ActivationTicket']))))), $AccountToken); 127 | } elseif (isset($dataGet['WildcardTicket'])) { 128 | $AccountToken = str_replace($dataGet['WildcardTicket'], base64_encode(hex2bin(str_replace(array('35567207227802', '35495707243538'), array(substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14), substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14)), bin2hex(base64_decode($dataGet['WildcardTicket']))))), $AccountToken); 129 | } 130 | } 131 | elseif(strpos($AccountToken, 'InternationalMobileEquipmentIdentity') !== false) { 132 | $AccountToken = str_replace($dataGet['InternationalMobileEquipmentIdentity'] , $dataSet['InternationalMobileEquipmentIdentity'], $AccountToken); 133 | $AccountToken = str_replace($dataGet['SerialNumber'] , $dataSet['SerialNumber'], $AccountToken); 134 | if (isset($dataGet['ActivationTicket'])) { 135 | $AccountToken = str_replace($dataGet['ActivationTicket'], base64_encode(hex2bin(str_replace(array('35567207227802', '35495707243538'), array(substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14), substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14)), bin2hex(base64_decode($dataGet['ActivationTicket']))))), $AccountToken); 136 | } elseif (isset($dataGet['WildcardTicket'])) { 137 | $AccountToken = str_replace($dataGet['WildcardTicket'], base64_encode(hex2bin(str_replace(array('35567207227802', '35495707243538'), array(substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14), substr($dataSet['InternationalMobileEquipmentIdentity'], 0, 14)), bin2hex(base64_decode($dataGet['WildcardTicket']))))), $AccountToken); 138 | } 139 | } 140 | elseif(strpos($AccountToken, 'SerialNumber') !== false) { 141 | $AccountToken = str_replace($dataGet['SerialNumber'] , $dataSet['SerialNumber'], $AccountToken); 142 | } else { 143 | die('Error: 772'); 144 | } 145 | // $AccountToken = str_replace('WildcardTicket', 'ActivationTicket', $AccountToken); 146 | $AccountToken = str_replace('ActivationTicket', 'WildcardTicket', $AccountToken); 147 | 148 | openssl_sign($AccountToken, $AccountTokenSignature, openssl_pkey_get_private(PrivateKeyRaptor()), OPENSSL_ALGO_SHA1); 149 | $body = str_replace($dataGet['AccountTokenSignature'], base64_encode($AccountTokenSignature), str_replace($dataGet['AccountToken'], base64_encode($AccountToken), $final)); 150 | $body = str_replace('DeviceCertificate', 'DeviceConfigurationFlags0DeviceCertificate', $body); 151 | /* 152 | $body = str_replace('FairPlayKeyData', '', $body); 153 | $body = str_replace($dataGet['FairPlayKeyData'], '', $body); 154 | $body = str_replace('', '', $body); 155 | */ 156 | } 157 | else { 158 | $ActivationInfoXML = $data['ActivationInfoXML']; 159 | if(isset($data['MobileEquipmentIdentifier']) && isset($data['ActivationRandomness'])) { 160 | $AccountToken = '{ 161 | "InternationalMobileEquipmentIdentity" = "'.$data['InternationalMobileEquipmentIdentity'].'"; 162 | "MobileEquipmentIdentifier" = "'.$data['MobileEquipmentIdentifier'].'"; 163 | "SerialNumber" = "'.$data['SerialNumber'].'"; 164 | "ProductType" = "'.$data['ProductType'].'"; 165 | "UniqueDeviceID" = "'.$data['UniqueDeviceID'].'"; 166 | "ActivationRandomness" = "'.$data['ActivationRandomness'].'"; 167 | "ActivityURL" = "https://albert.apple.com/deviceservices/activity"; 168 | "PhoneNumberNotificationURL" = "https://albert.apple.com/deviceservices/phoneHome"; 169 | "ActivationTicket" = "MIIBlQIBATALBgkqhkiG9w0BAQUxYJ8/BC56C7CfQAThIG8An0sUiTgt/7kRqltcW9/wE3cVASX7moifh20HATiRACURN5+XPQwAAAAA7u7u7u7u7u+flz4EAAAAAJ+XPwQBAAAAn5dABAEAAACfl0wEAAAAAASBgKGhiSVSKmUcLcWBY4/i4hwTL8N9b6d7lEmyZ8fYnFL2+kmrSAFGAS6GILW97/2OEUFD3sMyXKEvQsjHXdMosBIUH33CaMuLi2rgEEvLGFSEYnGo5Bx9E1mtScikaAgPlxtToLyuLdz89+M9UN5xBSqTqF9RG55J5WQUd0nZhlRjo4GdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEA7To/ZNHoIJzBUgY0734vsgl+ACxDQ+f4quvmSrPAtgDENSZwaVrHXpF+cRKBABqkDa00YcENx2dtS1tuHLKDNn1zMZLaZRpiK9UeiMPNZL6mlg12BWLwVjlFOGED8U6pfXwOw6D/FCDRgvyGBn7wsw8sEa7AdlYmMHGmkvwgOP0CAwEAAQ=="; 170 | }'; } 171 | elseif(isset($data['MobileEquipmentIdentifier'])) { 172 | $AccountToken = '{ 173 | "InternationalMobileEquipmentIdentity" = "'.$data['InternationalMobileEquipmentIdentity'].'"; 174 | "MobileEquipmentIdentifier" = "'.$data['MobileEquipmentIdentifier'].'"; 175 | "SerialNumber" = "'.$data['SerialNumber'].'"; 176 | "ProductType" = "'.$data['ProductType'].'"; 177 | "UniqueDeviceID" = "'.$data['UniqueDeviceID'].'"; 178 | "ActivityURL" = "https://albert.apple.com/deviceservices/activity"; 179 | "PhoneNumberNotificationURL" = "https://albert.apple.com/deviceservices/phoneHome"; 180 | "ActivationTicket" = "MIIBlQIBATALBgkqhkiG9w0BAQUxYJ8/BC56C7CfQAThIG8An0sUiTgt/7kRqltcW9/wE3cVASX7moifh20HATiRACURN5+XPQwAAAAA7u7u7u7u7u+flz4EAAAAAJ+XPwQBAAAAn5dABAEAAACfl0wEAAAAAASBgKGhiSVSKmUcLcWBY4/i4hwTL8N9b6d7lEmyZ8fYnFL2+kmrSAFGAS6GILW97/2OEUFD3sMyXKEvQsjHXdMosBIUH33CaMuLi2rgEEvLGFSEYnGo5Bx9E1mtScikaAgPlxtToLyuLdz89+M9UN5xBSqTqF9RG55J5WQUd0nZhlRjo4GdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEA7To/ZNHoIJzBUgY0734vsgl+ACxDQ+f4quvmSrPAtgDENSZwaVrHXpF+cRKBABqkDa00YcENx2dtS1tuHLKDNn1zMZLaZRpiK9UeiMPNZL6mlg12BWLwVjlFOGED8U6pfXwOw6D/FCDRgvyGBn7wsw8sEa7AdlYmMHGmkvwgOP0CAwEAAQ=="; 181 | }'; } 182 | elseif(isset($data['ActivationRandomness'])) { 183 | $AccountToken = '{ 184 | "InternationalMobileEquipmentIdentity" = "'.$data['InternationalMobileEquipmentIdentity'].'"; 185 | "SerialNumber" = "'.$data['SerialNumber'].'"; 186 | "ProductType" = "'.$data['ProductType'].'"; 187 | "UniqueDeviceID" = "'.$data['UniqueDeviceID'].'"; 188 | "ActivationRandomness" = "'.$data['ActivationRandomness'].'"; 189 | "ActivityURL" = "https://albert.apple.com/deviceservices/activity"; 190 | "PhoneNumberNotificationURL" = "https://albert.apple.com/deviceservices/phoneHome"; 191 | "ActivationTicket" = "MIIBlQIBATALBgkqhkiG9w0BAQUxYJ8/BC56C7CfQAThIG8An0sUiTgt/7kRqltcW9/wE3cVASX7moifh20HATiRACURN5+XPQwAAAAA7u7u7u7u7u+flz4EAAAAAJ+XPwQBAAAAn5dABAEAAACfl0wEAAAAAASBgKGhiSVSKmUcLcWBY4/i4hwTL8N9b6d7lEmyZ8fYnFL2+kmrSAFGAS6GILW97/2OEUFD3sMyXKEvQsjHXdMosBIUH33CaMuLi2rgEEvLGFSEYnGo5Bx9E1mtScikaAgPlxtToLyuLdz89+M9UN5xBSqTqF9RG55J5WQUd0nZhlRjo4GdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEA7To/ZNHoIJzBUgY0734vsgl+ACxDQ+f4quvmSrPAtgDENSZwaVrHXpF+cRKBABqkDa00YcENx2dtS1tuHLKDNn1zMZLaZRpiK9UeiMPNZL6mlg12BWLwVjlFOGED8U6pfXwOw6D/FCDRgvyGBn7wsw8sEa7AdlYmMHGmkvwgOP0CAwEAAQ=="; 192 | }'; } 193 | else { $AccountToken = '{ 194 | "InternationalMobileEquipmentIdentity" = "'.$data['InternationalMobileEquipmentIdentity'].'"; 195 | "SerialNumber" = "'.$data['SerialNumber'].'"; 196 | "ProductType" = "'.$data['ProductType'].'"; 197 | "UniqueDeviceID" = "'.$data['UniqueDeviceID'].'"; 198 | "ActivityURL" = "https://albert.apple.com/deviceservices/activity"; 199 | "PhoneNumberNotificationURL" = "https://albert.apple.com/deviceservices/phoneHome"; 200 | "ActivationTicket" = "MIIBlQIBATALBgkqhkiG9w0BAQUxYJ8/BC56C7CfQAThIG8An0sUiTgt/7kRqltcW9/wE3cVASX7moifh20HATiRACURN5+XPQwAAAAA7u7u7u7u7u+flz4EAAAAAJ+XPwQBAAAAn5dABAEAAACfl0wEAAAAAASBgKGhiSVSKmUcLcWBY4/i4hwTL8N9b6d7lEmyZ8fYnFL2+kmrSAFGAS6GILW97/2OEUFD3sMyXKEvQsjHXdMosBIUH33CaMuLi2rgEEvLGFSEYnGo5Bx9E1mtScikaAgPlxtToLyuLdz89+M9UN5xBSqTqF9RG55J5WQUd0nZhlRjo4GdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEA7To/ZNHoIJzBUgY0734vsgl+ACxDQ+f4quvmSrPAtgDENSZwaVrHXpF+cRKBABqkDa00YcENx2dtS1tuHLKDNn1zMZLaZRpiK9UeiMPNZL6mlg12BWLwVjlFOGED8U6pfXwOw6D/FCDRgvyGBn7wsw8sEa7AdlYmMHGmkvwgOP0CAwEAAQ=="; 201 | }'; } 202 | 203 | $AccountToken = base64_encode($AccountToken); 204 | // iPhone 5S - FPDATA 205 | if (empty($FairPlayKeyData)) { 206 | $FairPlayKeyData = 'LS0tLS1CRUdJTiBDT05UQUlORVItLS0tLQpBQUVBQWNvQkpGVDdsbGVLL01aMUpZZDY0RmhqN2tPV1ZyMDcycXdIYURqZFFsdCtNZUNDUVNKeWVwWktyZGhGCmdXNWJMUStvUjZXamk4VUc5c1JvZUZTOHJsRGRLeVNzOVZkc1BYRUlQdHVLOWJQenZuWEtCTXBLSC9LNXFNSXYKVFN6WEJweTRGY2R6dDVUMGNKRzQ3d0liNlZSYjNLT2dEQmpRR0VGM3luMDdvUmVQc2pGN0twNzh0c0wrcjRsRwo0eTBHSkVBSlY5cGh1R1g1WGpkYml3dmZ5WUcyc1o1Z3FTMlpPYlZIVnEydlo0czdzcExtREE5MDVuRis2ZXFOCkN2RlUrUmhaQlBqb1prVkNLSG9qUE44L3hyaVMwQnpDOUJiakRHcnN3dkJJcE9ndWhNT28xeThsQWpqelZJTEcKaWdMVi9oMUlyaXYzYXBmN2hVVVRURUtPeUxiVkVlYjFIM0s0b0d2WXN1ZHRBei8yTTc4dnVmTHFINlh1ODl1eApwZGgrdmtWejk2NjkxaFJJTjlCdnBiQklYT3Q5enMyckk1TjJiMENoQzkwZ2d2dDJMRlFUOXRVQm13dGhLakdGCitNSHBCaFBFSVFlOGJ0bGxUcEFnNTBraWo0alBwdW5KN0pKTmVQWE1HcnZMOVI3SlEyZEgvTDBpR3gxdG96U2IKVTJmTGdJcFJQeDBnZEtKRmVlaFQwMy8zSWh5aXRIZXcvWExxSTBxRnU1bDBwaEZ5L2ZqWEVLQkQvaG5kUGgvZgozMjZ6bWg1WVVqL2o1MnFZMWpiM3cxOUw3ZzNYMjdHTGNBNGx5U0tPTmFQUnBwbVVMbVpzV1IzN1ovb0dnL20vCmNmMGlEb3AxR0VHYjRnUVNEUXRLR3pLL2FaZmZSTFd0b0ZMWlp3RngvOWdYNnc1eFRwL1Y4YUtvK2RQTDh1a3EKOWRHanJJOTVOM1VGbG1qOUw5VEo1TFZOUWZQR0dhaUtVNi9MWEN0SktyNjJNdkhISm0vTTFpV01HVzdCalAyWAo2eTU5RFpnMUxCM05hY2tFNHJsQi9icmVneURrcXgxZjhUUURPaVBZTE9ldjcvaXdoaEJkYjdBZjA2VGhhTm50CnRuZFYydEdSTnJ4a1ZZd2NkTngwL0dSN1ZjMmUrdytRTHRsZHJmdzA0bW1QejRjRTROek5SNkdVV0VuL1dja0cKUjc1U1RYVE9LOUJaVmM3TytBTTdNUXIwTytDQnFyVVNkNnVUdzVBVTJ3c1duL3V1N2JPUUE3L0NZaXN1N1p3SAppS0RoNVVSSFU2Tmc0WlY2YWR1cjEzSDR5RUxWU2hkcUR5emplNjhrSkdWTzZBbWoxckV6alNTRTJEVjVnTWcrCmJCWTVSWVpxNHU1NG11TjdrUTZLU2sxS04yN3F0bHAvNHVsYlg5VVFzVHhtN21WU0RqellvVmlGTG1COGU5L1QKN3N1RXVjM3RySWJsTTNjdzFkMFBhS1RlYUlVcGRkTFhoZkpXVnhxTDhXU2hsTi9yVW1ibFQ5ZXlTeC9uYmYzUgppZWE5cVIxYyttV0c1ZzFrd3A5N0p5aTBWZHJUdi9QQ2p6Z01xUkNEd1RPc051elArZWk3dGxpNEVmSHJtdWx0CnRUeDZkb1FOelBnbkVWL284TUxPVTBwc0pKeU83VU9QM2RvUXh5czJQNG53V0JaS0Joc3dmbjBXanU1T2pWSU4KRyt2U2hUTy9jYktpWm1ManVGOGFRMVpyNC80WHIzZTAwNFF1Y1F3NnVaRHRhUDRNZlVSREJSMnVaOWdTZy9mTgpNVVFpcGdUeGZCUEt4K0o2eVFHcDVmQ1VEc3RCMDlSNUtDK1Z0cGxucm5pYTY1TVd2NHRQM1UrNDh0NENCSE0wClNnSkR3NWRtTHBsVjJHVFUyQ1psazJBTGlobXhONUdleE1nVVNrcjQ2dFNkWmVzbENaNUVGa3JXOTJlV3NZbmsKK1NmWkxPMEpiYnJic3FQSFVubUZuQVhHM1o3VmhvYi9WTHNkZGRCei9EQjhySmFLCi0tLS0tRU5EIENPTlRBSU5FUi0tLS0tCg=='; 207 | } 208 | // iPhone 7 - FPDATA 209 | $FairPlayKeyData = 'LS0tLS1CRUdJTiBDT05UQUlORVItLS0tLQpBQUVBQVNyTkhHMW5jc1N5NU5HVGpNcUpYZndTcnRSeklqZklQa1E4NnY4TldJTTZ3L1J6L1RhblFEKzNtOERwCnFkNmhVZy9BUHVOK2orYmJybGlDSEt5SWtMYTZKL0ZtNFVaYlZZZjhVQ2dGWFltMDJEZ1JqQ1FGUHBoUjJ6eVMKd2V4a0dKaVFNNE1pQUdPY2ZvZjBETG5ldXpUODlqRnM3eExUWjEzbXRFT2txd3BVMU81elp0UGtYK2VSUUJjdgp0RjgrYXNDZGQrVDlYQ29OSXhadGE4NnlVeFRLSWdGMk5nL3R4VnNyUkcwV29MdmcxL2d4amlhaElMODBFTjJwCjRJUnlvTUJjV3AyK00rd2FiY3dVZWNEVmVyK1dNSURIeDlkRGdGaWxLQm5Vd1RJVUZoaktwSGQwTHRXRHpzVWUKM1FyKzVvRnkwN21jM1FUc1BFdkx1dzhBbThWMHNCSTVUVXVxaTEycllmQVJmVk9vZ1l4M2FNN0lsMEphZzV2WAo5dWJEUDRrVEVYc1QrQXNjU1UwOHpRVVFDeXpyMUlGZFBJOTBqbFkvMVB0ekJLZHpaL1JZMUtSY2NLQ1VJZW8zCmNsdnRxUVNKWnNhelJmRmg1cmdkNnQ4NWZXeTIzMXZ5bGsyWVlmYjdIeTVhdzBBSzk3OHFKQWg0WDAyZUsyWG8KeXAreVZlVlE2akhGdnZ6am9oUWtMaGQrT2QzZlQ4TVZlNFJiakdTSC9GejZTWTNVSHJ3RTJWcmRGVms3QTJ5awpBdHhhU1dFNHBFQWVlQWRoVEVaTWdaM3ZLRFJDVTBOay85OFlXSThZMlJwVDd2QXRubVZXVC92TU1ZVDdFekxFCnVzNHJiMWczNGdSQnZ1dXR0K3R2ZlZZakcxRHc5WXNwWW9BY1BhZ2Zucmt4V0h2eTAvT1ZaNjdtbkE0UG9hWmgKeEFjQzF0M3BmdElMazFmM3ZTSUZTTHNqSGlYTGd6aTRXL09VNUNsaWJ4amd6Zkt6QWdwNEtZZkRzSHRydHMvagpVOU5zWmhpaFNCSFJPS3RJSVZKZWRJdnBwdW1SSmMrTUFlK09iajNWMFJjUXAyVXQzM2JwNnhBMlZ2VUhEWm9TClM4cUhvZTZmUW85MW1YVEYwSk1NUUZVWlBOYnJLOGlFblNwaDhta3dYVWtzTXJxSHEvSnBpL2RmbmE2WTBXL1oKR1lLelR3WmNJSUpNNWxJRDY5UnZCUURTRmhqVVBPTHJkYUNxdmdhUEVYSEZHakg1MWJ0ZWFCbC9YSGRId1gwYwp0K3NPUmdiT3hrRSs1WFYybjE2aWt1TkpMK0xLMUNDUGgrYVpUUmFmNzFQSWwrVXpaNzgvdUF3UUFTR1gzT25pCnUrU045bnNpNGhLUDMrT3BwcVJWM1NtekxEalhqV0czb3dlNXJNSXgzM3ZJQmhzNDYvdHE2a05WSlNHWWFNUTQKTEllS1lLS2dJbThqRldkVFM1WFRQdFYwZjl4R0V6aDNPT05XRjQ1eS93L1d2V0VwaGJJWCtra1QrT0Z5bDFRdgpYbnZuYjkrT2FTUTJSa3VGTGdjczl1MHBENXdxSnZDVHFia0hOeXJHTGdNSXlBcWszeWsxOHgxcGVYbHE3bjY2CkdubkNPRUJUbE5WNlZCMnlvRzBOQWJXMUFiZzhnYUw4TXVhV1NHeU05b3cvVW9KSkoyRTFIR0ptNGF5UEc4aUYKZ1NxZndQLy9KY09SVks2WEgwNFlnaTJ3SzAvQjR3emdtVDM0RHh5bFpwYlBoLzY2R3BxOFVOWVBJWk5RUWVrWgpXUWlOZXhFMytjSXUwblVjU2xBU2hTdmx6bXJ3enRUZndaL1lHUEZkbkhhaG5yUjRkNEI2Mlg0bWR0Tm1lQWg4ClF4Uk5sdVNqN2p4UzZoMWpBelVnRTlFUXFaTGJ3NHpLMWRGaVhqaml5MEJLV29jTVNxRHBaa2R5ZForUE1zakgKSE92SEZnOS9ZMXVSOFVqMjdmNmlWZUZlcC9OU0N5M1FRZVFRbkdxMWovdTJhVHVuCi0tLS0tRU5EIENPTlRBSU5FUi0tLS0tCg=='; 210 | openssl_sign(base64_decode($AccountToken), $AccountTokenSignature, openssl_pkey_get_private(PrivateKeyRaptor()), OPENSSL_ALGO_SHA1); 211 | $body = ' 212 | 213 | iphone-activation 214 | 215 | activation-record 216 | 217 | AccountTokenCertificate 218 | 219 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lCQWpB 220 | TkJna3Foa2lHOXcwQkFRVUZBREI1TVFzd0NRWURWUVFHRXdKVlV6RVQKTUJFR0ExVUVD 221 | aE1LUVhCd2JHVWdTVzVqTGpFbU1DUUdBMVVFQ3hNZFFYQndiR1VnUTJWeWRHbG1hV05o 222 | ZEdsdgpiaUJCZFhSb2IzSnBkSGt4TFRBckJnTlZCQU1USkVGd2NHeGxJR2xRYUc5dVpT 223 | QkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3TnpBME1UWXlNalUx 224 | TURKYUZ3MHhOREEwTVRZeU1qVTFNREphTUZzeEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VR 225 | WURWUVFLRXdwQmNIQnNaU0JKYm1NdU1SVXdFd1lEVlFRTEV3eEJjSEJzWlNCcApVR2h2 226 | Ym1VeElEQWVCZ05WQkFNVEYwRndjR3hsSUdsUWFHOXVaU0JCWTNScGRtRjBhVzl1TUlH 227 | Zk1BMEdDU3FHClNJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREZBWHpSSW1Bcm1vaUhm 228 | YlMyb1BjcUFmYkV2MGQxams3R2JuWDcKKzRZVWx5SWZwcnpCVmRsbXoySkhZdjErMDRJ 229 | ekp0TDdjTDk3VUk3ZmswaTBPTVkwYWw4YStKUFFhNFVnNjExVApicUV0K25qQW1Ba2dl 230 | M0hYV0RCZEFYRDlNaGtDN1QvOW83N3pPUTFvbGk0Y1VkemxuWVdmem1XMFBkdU94dXZl 231 | CkFlWVk0d0lEQVFBQm80R2JNSUdZTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhS 232 | TUJBZjhFQWpBQU1CMEcKQTFVZERnUVdCQlNob05MK3Q3UnovcHNVYXEvTlBYTlBIKy9X 233 | bERBZkJnTlZIU01FR0RBV2dCVG5OQ291SXQ0NQpZR3UwbE01M2cyRXZNYUI4TlRBNEJn 234 | TlZIUjhFTVRBdk1DMmdLNkFwaGlkb2RIUndPaTh2ZDNkM0xtRndjR3hsCkxtTnZiUzlo 235 | Y0hCc1pXTmhMMmx3YUc5dVpTNWpjbXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY5 236 | cW1yVU4KZEErRlJPWUdQN3BXY1lUQUsrcEx5T2Y5ek9hRTdhZVZJODg1VjhZL0JLSGhs 237 | d0FvK3pFa2lPVTNGYkVQQ1M5Vgp0UzE4WkJjd0QvK2Q1WlFUTUZrbmhjVUp3ZFBxcWpu 238 | bTlMcVRmSC94NHB3OE9OSFJEenhIZHA5NmdPVjNBNCs4CmFia29BU2ZjWXF2SVJ5cFhu 239 | YnVyM2JSUmhUekFzNFZJTFM2alR5Rll5bVplU2V3dEJ1Ym1taWdvMWtDUWlaR2MKNzZj 240 | NWZlREF5SGIyYnpFcXR2eDNXcHJsanRTNDZRVDVDUjZZZWxpblpuaW8zMmpBelJZVHh0 241 | UzZyM0pzdlpEaQpKMDcrRUhjbWZHZHB4d2dPKzdidFcxcEZhcjBaakY5L2pZS0tuT1lO 242 | eXZDcndzemhhZmJTWXd6QUc1RUpvWEZCCjRkK3BpV0hVRGNQeHRjYz0KLS0tLS1FTkQg 243 | Q0VSVElGSUNBVEUtLS0tLQo= 244 | 245 | DeviceConfigurationFlags 246 | 0 247 | DeviceCertificate 248 | 249 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWx5Z0F3SUJBZ0lLQXZr 250 | dCt0SWNwUFJTUXpBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWUQKVlFRR0V3SlZV 251 | ekVUTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFVk1CTUdBMVVFQ3hNTVFYQndiR1Vn 252 | YVZCbwpiMjVsTVI4d0hRWURWUVFERXhaQmNIQnNaU0JwVUdodmJtVWdSR1YyYVdObElF 253 | TkJNQjRYRFRJd01EVXhNakl5Ck1UTXhNMW9YRFRJek1EVXhNakl5TVRNeE0xb3dnWU14 254 | TFRBckJnTlZCQU1XSkRsQk9Ua3dSVU14TFRRNU5ETXQKTkRRM09TMDVSalJETFRBMVFU 255 | QXhPVVEwT0RnNU5URUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgpNUkl3 256 | RUFZRFZRUUhFd2xEZFhCbGNuUnBibTh4RXpBUkJnTlZCQW9UQ2tGd2NHeGxJRWx1WXk0 257 | eER6QU5CZ05WCkJBc1RCbWxRYUc5dVpUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0Jq 258 | UUF3Z1lrQ2dZRUF0dDhXRldUWm96SlEKYXRQcDNoRmZnT09GSi9NMTVqSjJkWGdyYkp5 259 | ZUwwbGRYa2VmT2NSVTZoVlE3KzhpR0tUVDY4aGQ2dUdwalJVaApxd3hxWUhuREZ0WHp6 260 | cjlFYTRXSEdlQ0hJME1jV2V5WGRWNHVJd1IxS3R4TTViblptKzZqTkdGMjgwdW8weHky 261 | ClRuT3pwMFNTM1YzWmU5dlVxTXcyN0l0MDhaZVE1MDBDQXdFQUFhT0JsVENCa2pBZkJn 262 | TlZIU01FR0RBV2dCU3kKL2lFalJJYVZhbm5WZ1NhT2N4RFlwMHlPZERBZEJnTlZIUTRF 263 | RmdRVWpSUkxnd2ppU0FUVS9ZSS9vUkFWRWs2TgpVWWt3REFZRFZSMFRBUUgvQkFJd0FE 264 | QU9CZ05WSFE4QkFmOEVCQU1DQmFBd0lBWURWUjBsQVFIL0JCWXdGQVlJCkt3WUJCUVVI 265 | QXdFR0NDc0dBUVVGQndNQ01CQUdDaXFHU0liM1kyUUdDZ0lFQWdVQU1BMEdDU3FHU0li 266 | M0RRRUIKQlFVQUE0R0JBT2FKVVN2WVhRb0JaeXFnSE9EeE5zSnlFWXNpc3h0QngzS2Jr 267 | d2FydDRPTjV5cTBuUERIdk5naAo0WDlCc3d6M2ZmMURBS3diYU9EdGlWaDErVlJyUi9u 268 | amJKdVNaMFFSN2xDdmVkS214MHlqWFV2aXIvdlIzQ1doCmhHUXVaMkZqb0xJQXhYV05T 269 | Q1N2RWZzS0VYVlRKUm4vZUNYelpIaFJmZUpqaDRMdkZNSVEKLS0tLS1FTkQgQ0VSVElG 270 | SUNBVEUtLS0tLQo= 271 | 272 | AccountToken 273 | 274 | '.substr(chunk_split($AccountToken, 68, "\n\t"), 0, -2).' 275 | 276 | AccountTokenSignature 277 | 278 | '.substr(chunk_split(base64_encode($AccountTokenSignature), 68, "\n\t"), 0, -2).' 279 | 280 | 281 | unbrick 282 | 283 | show-settings 284 | 285 | 286 | 287 | 288 | '; 289 | $body1 = ' 290 | 291 | iphone-activation 292 | 293 | unbrick 294 | 295 | LDActivationVersion 296 | 2 297 | activation-record 298 | 299 | AccountTokenCertificate 300 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREI1TVFzd0NRWURWUVFHRXdKVlV6RVQKTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFbU1DUUdBMVVFQ3hNZFFYQndiR1VnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4TFRBckJnTlZCQU1USkVGd2NHeGxJR2xRYUc5dVpTQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3TnpBME1UWXlNalUxTURKYUZ3MHhOREEwTVRZeU1qVTFNREphTUZzeEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLRXdwQmNIQnNaU0JKYm1NdU1SVXdFd1lEVlFRTEV3eEJjSEJzWlNCcApVR2h2Ym1VeElEQWVCZ05WQkFNVEYwRndjR3hsSUdsUWFHOXVaU0JCWTNScGRtRjBhVzl1TUlHZk1BMEdDU3FHClNJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREZBWHpSSW1Bcm1vaUhmYlMyb1BjcUFmYkV2MGQxams3R2JuWDcKKzRZVWx5SWZwcnpCVmRsbXoySkhZdjErMDRJekp0TDdjTDk3VUk3ZmswaTBPTVkwYWw4YStKUFFhNFVnNjExVApicUV0K25qQW1Ba2dlM0hYV0RCZEFYRDlNaGtDN1QvOW83N3pPUTFvbGk0Y1VkemxuWVdmem1XMFBkdU94dXZlCkFlWVk0d0lEQVFBQm80R2JNSUdZTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1CMEcKQTFVZERnUVdCQlNob05MK3Q3UnovcHNVYXEvTlBYTlBIKy9XbERBZkJnTlZIU01FR0RBV2dCVG5OQ291SXQ0NQpZR3UwbE01M2cyRXZNYUI4TlRBNEJnTlZIUjhFTVRBdk1DMmdLNkFwaGlkb2RIUndPaTh2ZDNkM0xtRndjR3hsCkxtTnZiUzloY0hCc1pXTmhMMmx3YUc5dVpTNWpjbXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY5cW1yVU4KZEErRlJPWUdQN3BXY1lUQUsrcEx5T2Y5ek9hRTdhZVZJODg1VjhZL0JLSGhsd0FvK3pFa2lPVTNGYkVQQ1M5Vgp0UzE4WkJjd0QvK2Q1WlFUTUZrbmhjVUp3ZFBxcWpubTlMcVRmSC94NHB3OE9OSFJEenhIZHA5NmdPVjNBNCs4CmFia29BU2ZjWXF2SVJ5cFhuYnVyM2JSUmhUekFzNFZJTFM2alR5Rll5bVplU2V3dEJ1Ym1taWdvMWtDUWlaR2MKNzZjNWZlREF5SGIyYnpFcXR2eDNXcHJsanRTNDZRVDVDUjZZZWxpblpuaW8zMmpBelJZVHh0UzZyM0pzdlpEaQpKMDcrRUhjbWZHZHB4d2dPKzdidFcxcEZhcjBaakY5L2pZS0tuT1lOeXZDcndzemhhZmJTWXd6QUc1RUpvWEZCCjRkK3BpV0hVRGNQeHRjYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= 301 | DeviceCertificate 302 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWx5Z0F3SUJBZ0lLQkFNaFRlL1lscmdIekRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWUQKVlFRR0V3SlZVekVUTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFVk1CTUdBMVVFQ3hNTVFYQndiR1VnYVZCbwpiMjVsTVI4d0hRWURWUVFERXhaQmNIQnNaU0JwVUdodmJtVWdSR1YyYVdObElFTkJNQjRYRFRJd01EVXhOekEwCk1EYzBPVm9YRFRJek1EVXhOekEwTURjME9Wb3dnWU14TFRBckJnTlZCQU1XSkRFMU1UVXlRVFl4TFVFek4wSXQKTkRsRFFTMDRNekF5TFRrek1UWkRSVFUwTURsQ016RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgpNUkl3RUFZRFZRUUhFd2xEZFhCbGNuUnBibTh4RXpBUkJnTlZCQW9UQ2tGd2NHeGxJRWx1WXk0eER6QU5CZ05WCkJBc1RCbWxRYUc5dVpUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF1RXFIOFR4OEJjMGkKQzhKaVl4cWZ3Z0w0RnZUL3VkSXljMmMxTmpYOXQ3Rm43QUYvVktoVkVMd1o3NU9QTWZDbG9TYkxzZGJoWWo1bAp6Z1o0eWY3KytMa3cwb2tMUG91dFpXVjlyV3NZekFKS3R6bUlNbmpiVEt1RlZNQ01PZlU1THFKUXZveGZLTjgzCldWREhSencxeVZPZk5TSDVCb0NWbkNFWXRwMFV2MkVDQXdFQUFhT0JsVENCa2pBZkJnTlZIU01FR0RBV2dCU3kKL2lFalJJYVZhbm5WZ1NhT2N4RFlwMHlPZERBZEJnTlZIUTRFRmdRVWZYKzhnRmZDUXV0R0ZWWkpYUXk5dmZtSgpsd0V3REFZRFZSMFRBUUgvQkFJd0FEQU9CZ05WSFE4QkFmOEVCQU1DQmFBd0lBWURWUjBsQVFIL0JCWXdGQVlJCkt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01CQUdDaXFHU0liM1kyUUdDZ0lFQWdVQU1BMEdDU3FHU0liM0RRRUIKQlFVQUE0R0JBRnNyTGxIQ00rK2p2OE0xQm9EVk13ZEVRdGZjaklLV0NmQXpiTzd5em9SSFNwL3duNGZrWmRaVgpsT2VIcWZ3aEZ2ZE5FK2FFNm1nS1dFaEhQa2R5MW0yWGY4WUplTjJGSUhhSDlYVTdjQ0lxVUY2K3k2VTFJcG9zCnpvYmVLY1poZzJVQlBpd1RENENMWHlGZ2NGZFZjbDhNdkV0bEdqb05iV3VVbEJFRzBnRkIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= 303 | FairPlayKeyData 304 | LS0tLS1CRUdJTiBDT05UQUlORVItLS0tLQpBQUVBQVFzb3l5THJnUFNiUGprdGVkSWMxQ0JTNnRiN1ZFN2lCaHdsWHVCVEtCamNpKzM3TmMzZXdWUmt4aGJZCmUySTBWSjZoZEJpZWNmUHNNRHA3K0FzMTB5dXV0ZnBoOHlTbjZvWldoVDF6ZEVjRDFvQy93SC95cHVON2FIdzIKaFJ4QWNjbDVaN2Z0QXBtOFdUUktwR3JNeldIRzVZcGhpZGh2MUNYSE4wVkM1SE5JQzBVUE1aMytadFBRaHNpTApFUjF4NThpYW10YnpmT3AxcExISTNBQXBaMURKaHdyVTYzWmh5d0xHQmYrSTdCN0VhUVJWNjBVWm0vamlUL0pwCmRJT00rY1RLSzdoTFhiNWNrU2RFelRLOW5CaW5UVHlnMVBMcGdUa3paZXAzODZRRzN4NWhUTk1PcmJMOGhQOS8KZk5Ddk1qYW5SUmRVcjBiRlNYb2djNHk1Z3R0UXYzS2U1aFU0bnNUTUFLL0oyZWFFZ21WUUJjZmdLMm01em1QNQo2TCtjRmxRRU8rTm9yKzZmRWt2c3YvckxnTThWM2c5czRqMVRjK2FSMkVYdldPK3I5bW1neUplanBuZFVhNGppCkNCK3N6VEZaWDhuU29mWFVpbDhCK3Q3bklheU8rUHRYWklGQlVkWDR1ZnpyN1gzelZyRFlVMDJuT0Q3WFBGQnUKR0tTYmhBUmZyV2pzVDNKUEFFUUJGODFBYTNMVlI3Zlp0cjBWMWRjelp2aUtMSUV1Zy9RQXhKOUdzZ2s0Q1VRTQpmbDMrNExHTWM3TVZCdVlGd3lRWS83VytLVVJZUmxSL2tJS00xNGllamhQSmcxWlpZYW1qMG5iQ29EV3V6ZlVjCnV5WlFnRTNkUGdBT2hxQTROM3FTeDNTYzdrN3Zwam9PUFg2ekFka2dxaXVicWJGVWZCQlN6aHVZSmp5aFFyalIKWllZUHRYWmRtbjl4dlRseVF0a1ZqWVRwMjVGa3M4RWdZOW13Smdrem9HdnhndTNUWC9xVS9pUWRwU1NONms2dAo0L2cyV2hiZTFkRkdkVi9yWU9sTHRSaEIyYjlDZ1dvZThkT2VOb0FCcmRxcWloa1JZT2pEQlg3RnhCazF1dmZSCnRDbnVHeTFUeXljRllOWW0xZlVmWTV2SXAxa2J1YTF3M29md0l1OUxXNm5HRjVTRzZPQmVDVktaUGN6eGdPbVEKMGJYNmZoaU90ZmpRbzdhQkdhWmlxL1ZmbzFpNzlOWmRKNDBqdGRlQVB5S0tCemZ3OTNUczFvTVN4Qkh1clN3dgpiQnZnTkpuc2JEOG1DRGxWWmxKelVwczYxblY3SWI0U0pna29TcSswaUV0UWZvT3B4TnR5TlY2MlJDcHVNYU9nCldRQk1RWDlNY2NzK2RQWENvZUZSNVJ5SUJBa3EvT2lleUczUW9xT2NZYWY3ZnZHcy9pTjVaaVlMWmpWbmR0b2MKY1F3d29xaEZTVGREbUxPd1B5ZDNFYUkwUWw3V3NlM3BwemJsNXk1dmt3czJ4RnlHVEtkdzBmMHN0WW5RSzJxRgpFUW9ucUZzeFJkbC9HRjBoWHZYQVk4OGZ2enBwcGRyWERLU3NLN3VuUTJOWXZ2a0JNYmZncWh5TXNocThtQi8yCkVwSnVEcitwSU5VcG9rSjdlWFpVcjJIclE5SUVmZmlvalVHMVQrbS93UFpIbjNBN1p0UVpURjYzVkRqOFRzdVMKTG43YWw4ajhUeEk3K05TRzA0NzZUam02RzhCSys3b2N3SGJiTmsxSTI5RmxEcHljRmVqZ2ZneTR3VlNYUXdKZgo4cGtiSnpSa2tTRjZBSm9qSjZkSTd0RzhOd0lTNlQ5dVFTTkdQZzZ6OSt4VnY4RjhWRHNkVUxBMkRyc3h5cmsyClFBYjRTaU9sbDJHcENBWXgrOWpod1Rzd0RxV2lxbDE2OVZXYjllYVRRcEJnK2l4QVVKSlFkUU0vOTVsRUloNVkKQnl0TXk0VVV3Mjdic2FiYVZVNWxQdU40dGNzTHZRa21EMVBDREhYTDdzM3JlQjdPCi0tLS0tRU5EIENPTlRBSU5FUi0tLS0tCg== 305 | AccountToken 306 | '.$AccountToken.' 307 | AccountTokenSignature 308 | '.base64_encode($AccountTokenSignature).' 309 | 310 | 311 | 312 | 313 | '; 314 | 315 | 316 | $body2 = ' 317 | 318 | ActivationRecord 319 | 320 | unbrick 321 | 322 | AccountTokenCertificate 323 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREI1TVFzd0NRWURWUVFHRXdKVlV6RVQKTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFbU1DUUdBMVVFQ3hNZFFYQndiR1VnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4TFRBckJnTlZCQU1USkVGd2NHeGxJR2xRYUc5dVpTQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3TnpBME1UWXlNalUxTURKYUZ3MHhOREEwTVRZeU1qVTFNREphTUZzeEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLRXdwQmNIQnNaU0JKYm1NdU1SVXdFd1lEVlFRTEV3eEJjSEJzWlNCcApVR2h2Ym1VeElEQWVCZ05WQkFNVEYwRndjR3hsSUdsUWFHOXVaU0JCWTNScGRtRjBhVzl1TUlHZk1BMEdDU3FHClNJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREZBWHpSSW1Bcm1vaUhmYlMyb1BjcUFmYkV2MGQxams3R2JuWDcKKzRZVWx5SWZwcnpCVmRsbXoySkhZdjErMDRJekp0TDdjTDk3VUk3ZmswaTBPTVkwYWw4YStKUFFhNFVnNjExVApicUV0K25qQW1Ba2dlM0hYV0RCZEFYRDlNaGtDN1QvOW83N3pPUTFvbGk0Y1VkemxuWVdmem1XMFBkdU94dXZlCkFlWVk0d0lEQVFBQm80R2JNSUdZTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1CMEcKQTFVZERnUVdCQlNob05MK3Q3UnovcHNVYXEvTlBYTlBIKy9XbERBZkJnTlZIU01FR0RBV2dCVG5OQ291SXQ0NQpZR3UwbE01M2cyRXZNYUI4TlRBNEJnTlZIUjhFTVRBdk1DMmdLNkFwaGlkb2RIUndPaTh2ZDNkM0xtRndjR3hsCkxtTnZiUzloY0hCc1pXTmhMMmx3YUc5dVpTNWpjbXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY5cW1yVU4KZEErRlJPWUdQN3BXY1lUQUsrcEx5T2Y5ek9hRTdhZVZJODg1VjhZL0JLSGhsd0FvK3pFa2lPVTNGYkVQQ1M5Vgp0UzE4WkJjd0QvK2Q1WlFUTUZrbmhjVUp3ZFBxcWpubTlMcVRmSC94NHB3OE9OSFJEenhIZHA5NmdPVjNBNCs4CmFia29BU2ZjWXF2SVJ5cFhuYnVyM2JSUmhUekFzNFZJTFM2alR5Rll5bVplU2V3dEJ1Ym1taWdvMWtDUWlaR2MKNzZjNWZlREF5SGIyYnpFcXR2eDNXcHJsanRTNDZRVDVDUjZZZWxpblpuaW8zMmpBelJZVHh0UzZyM0pzdlpEaQpKMDcrRUhjbWZHZHB4d2dPKzdidFcxcEZhcjBaakY5L2pZS0tuT1lOeXZDcndzemhhZmJTWXd6QUc1RUpvWEZCCjRkK3BpV0hVRGNQeHRjYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= 324 | DeviceCertificate 325 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWx5Z0F3SUJBZ0lLQTgvblZRazE1YkJLSFRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWUQKVlFRR0V3SlZVekVUTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFVk1CTUdBMVVFQ3hNTVFYQndiR1VnYVZCbwpiMjVsTVI4d0hRWURWUVFERXhaQmNIQnNaU0JwVUdodmJtVWdSR1YyYVdObElFTkJNQjRYRFRJd01EVXhOekF6Ck1qY3hOMW9YRFRJek1EVXhOekF6TWpjeE4xb3dnWU14TFRBckJnTlZCQU1XSkVRd016UXlOVEExTFRReE5ETXQKTkRWRlJpMDVOamRGTFRFd05EUkRSREl6T0RBelJERUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgpNUkl3RUFZRFZRUUhFd2xEZFhCbGNuUnBibTh4RXpBUkJnTlZCQW9UQ2tGd2NHeGxJRWx1WXk0eER6QU5CZ05WCkJBc1RCbWxRYUc5dVpUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF5bSt5Mnd2MmtLaTMKc1RmMjRJbnloMDVYQ1pRNytwT0tycUNja3ZMSUlzNEozdy9ZN2liM2FIeUg3VTJhMnJzN0QySFhGa0NnMlhuVwp2c0JqdGpzN3AzQTJUK0tCZklwN3k2QlpRaEFQY0lYd1A3ZUtxcjlhcEtsajZIL1MxRW50ck5TTjZmL293QlpHCkZiMmRFTE8yc0Z5UzZPN2k4UFZvKzk3SmtlV2hYMGtDQXdFQUFhT0JsVENCa2pBZkJnTlZIU01FR0RBV2dCU3kKL2lFalJJYVZhbm5WZ1NhT2N4RFlwMHlPZERBZEJnTlZIUTRFRmdRVW5DWE1wSjhXNGRhdDZhakFnVitRL2N1awpVaTB3REFZRFZSMFRBUUgvQkFJd0FEQU9CZ05WSFE4QkFmOEVCQU1DQmFBd0lBWURWUjBsQVFIL0JCWXdGQVlJCkt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01CQUdDaXFHU0liM1kyUUdDZ0lFQWdVQU1BMEdDU3FHU0liM0RRRUIKQlFVQUE0R0JBTE0yYS8yQU1MUmdLVDd3VWlsVEpMdEJYOGk5aDZhVGN2NzJaZC95Ulp2SUlOOWEzVm5mVjc0bApDRXh4S1Btdi9SU3g3bkppYkYwYjFKTU1uc3ppN05Memp5SGtIeDQ0VWNyYVJabUZYVjJHWjBVWXorVzRMQ1hQCndDODlCK242N25ad291b2N5WHNlY3o3VmduelhaRjVFVTBhTHZRamM0Yyt1UEMyTERUZnkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= 326 | AccountToken 327 | '.$AccountToken.' 328 | AccountTokenSignature 329 | '.base64_encode($AccountTokenSignature).' 330 | UniqueDeviceCertificate 331 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQXFpZ0F3SUJBZ0lHQVc0Vk1VQjBNQW9HQ0NxR1NNNDlCQU1DTUVVeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4R1RBWEJnTlZCQU1NRUVaRVVrUkRMVlZEVWxRdFUxVkNRMEV3SGhjTk1qQXdOVEUzTURNeU56RTNXaGNOTWpFd05URTNNRE15TnpFM1dqQnZNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1SNHdIQVlEVlFRTERCVjFZM0owSUV4bFlXWWdRMlZ5ZEdsbWFXTmhkR1V4SXpBaEJnTlZCQU1NR2pBd01EQTRNREV3TFRBd01ERkZNVEV5UXpFNE5EWTRNekkyTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFR2Q0aEF3M2x1NHZPWUFkcy9NMjhnWjEwdTR6MWI5MVZPenJBT05hNGxreFEyVUlDOXZsUUV4azF4YWQ1NTZONjNkT2FCRmZrazRJVXFBcTRUci9mcmFPQ0FWZ3dnZ0ZVTUF3R0ExVWRFd0VCL3dRQ01BQXdEZ1lEVlIwUEFRSC9CQVFEQWdUd01JSDNCZ2txaGtpRzkyTmtDZ0VFZ2VreGdlYi9oSnFoa2xBTk1Bc1dCRU5JU1ZBQ0F3Q0FFUCtFcW8yU1JCRXdEeFlFUlVOSlJBSUhIaEVzR0VhREp2K0drN1hDWXhzd0dSWUVZbTFoWXdRUk9UZzZNVEE2WlRnNllUQTZOVE02T0dYL2hzdTF5bWtaTUJjV0JHbHRaV2tFRHpNMU5UZ3lOakE0TWpBNE9EVXlOditIbThuY2JSWXdGQllFYzNKdWJRUU1SamN4VkRrMlVsRklSelpYLzRlcmtkSmtNakF3RmdSMVpHbGtCQ2cxWVdReE5ERmxaREZoWVdGaFpEZzBZV0l3TVRBME56YzVZelV6WVdNMU9EYzNZVFJtWkdJMC80ZTd0Y0pqR3pBWkZnUjNiV0ZqQkJFNU9Eb3hNRHBsT0RwaE1EbzFNem8xTmpBU0Jna3Foa2lHOTJOa0NnSUVCVEFEQWdFQU1DWUdDU3FHU0liM1kyUUlCd1FaTUJlL2luZ0lCQVl4TXk0ekxqRy9pbnNIQkFVeE4wUTFNREFLQmdncWhrak9QUVFEQWdOR0FEQkZBaUVBbEpYRnJ2NnFrNWFWbGtvRENhS1BEK0Q4RTNRR3pFUURuUThQdld1Mm1VQUNJQXR2emZLZERZT29oRUFsZkpkbW1KQ0Jzd21td3YyRWRkeTc1ZEVrVXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tdWtNdEg5UmRTUXZIekJ4N0ZpQkdyNy9LY21seFgvWHdvV2VXbldiNklSTT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNGekNDQVp5Z0F3SUJBZ0lJT2NVcVE4SUMvaHN3Q2dZSUtvWkl6ajBFQXdJd1FERVVNQklHQTFVRUF3d0wKVTBWUUlGSnZiM1FnUTBFeEV6QVJCZ05WQkFvTUNrRndjR3hsSUVsdVl5NHhFekFSQmdOVkJBZ01Da05oYkdsbQpiM0p1YVdFd0hoY05NVFl3TkRJMU1qTTBOVFEzV2hjTk1qa3dOakkwTWpFME16STBXakJGTVJNd0VRWURWUVFJCkRBcERZV3hwWm05eWJtbGhNUk13RVFZRFZRUUtEQXBCY0hCc1pTQkpibU11TVJrd0Z3WURWUVFEREJCR1JGSkUKUXkxVlExSlVMVk5WUWtOQk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWFEYzJPL01ydVl2UApWUGFVYktSN1JSem42NkIxNC84S29VTXNFRGI3bkhrR0VNWDZlQyswZ1N0R0hlNEhZTXJMeVdjYXAxdERGWW1FCkR5a0dRM3VNMmFON01Ia3dIUVlEVlIwT0JCWUVGTFNxT2tPdEcrVit6Z29NT0JxMTBobkxsVFd6TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXTy9XdnNXQ3NGVE5HS2FFcmFMMmUzczZmODh3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUJZR0NTcUdTSWIzWTJRR0xBRUIvd1FHRmdSMVkzSjBNQW9HQ0NxR1NNNDlCQU1DCkEya0FNR1lDTVFEZjV6TmlpS04vSnFtczF3KzNDRFlrRVNPUGllSk1wRWtMZTlhMFVqV1hFQkRMMFZFc3EvQ2QKRTNhS1hrYzZSMTBDTVFEUzRNaVdpeW1ZK1J4a3Z5L2hpY0REUXFJL0JMK04zTEhxekpaVXV3MlN4MGFmRFg3Qgo2THlLaytzTHE0dXJrTVk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K 332 | show-settings 333 | 334 | 335 | 336 | 337 | '; 338 | 339 | } 340 | file_put_contents('./var/www/requests/'.$data['SerialNumber'].'-'.$data['DeviceClass'].'-'.$data['RegionCode'].'-'.$data['ProductVersion'].'-Token.txt', "After: ".$AccountToken."\n", FILE_APPEND); 341 | // $final = str_replace("FairPlayKeyData".$dataGet['FairPlayKeyData']."", '', $final); 342 | // var_dump(shell_exec("curl --data 'activation-info-base64=".urlencode(base64_encode($newReq))."' -kv https://albert.apple.com/deviceservices/deviceActivation")); 343 | // DeviceConfigurationFlags 344 | // 0 345 | } 346 | $data = ActivationRequestInfoXML($rawactpost, 1); 347 | file_put_contents('./var/www/requests/'.$data['SerialNumber'].'-'.$data['DeviceClass'].'-'.$data['RegionCode'].'-'.$data['ProductVersion'].'-'.$data['RegulatoryModelNumber'].'.txt', json_encode($data)); 348 | 349 | if (isset($_POST['saveRequestTicket'])) { 350 | file_put_contents('./var/www/requests/'.$_POST['saveRequestTicket'].'.html', $body); 351 | echo "Device Request Ticket Saved on server"; 352 | } elseif (isset($_POST['saveRequestTicketWindows'])) { 353 | file_put_contents('./var/www/requests/'.$_POST['saveRequestTicketWindows'].'.html', $body); 354 | echo "Device Request Ticket Saved on server"; 355 | } elseif (isset($_GET['saveRequestTicket'])) { 356 | file_put_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'.html', $body); 357 | file_put_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'-ARS.txt', $ARS); 358 | file_put_contents('./var/www/requests/'.$_GET['saveRequestTicket'].'-CSR.txt', $ARS."\n\nINN:\n".$data['AccountTokenCertificate']."\n\n".$data['AccountTokenSignature']."\n\nOUT:\n".AccountTokenCertificateTest()."\n\n".$AccountTokenSignature."\n\n".json_encode(getallheaders())); 359 | } 360 | if(strpos($_SERVER['HTTP_USER_AGENT'], 'iOS Device Activator') !== false) { 361 | if(strpos($body, 'Activation Lock') !== false) { 362 | // header("Content-Type: application/x-buddyml"); 363 | header("Content-Type: text/xml"); 364 | 365 | // $body = $rawactpost; // $_POST['activation-info']; 366 | } else { 367 | header("Content-Type: application/xml"); 368 | // header("Content-Type: text/xml"); 369 | } 370 | } 371 | 372 | // $body = str_replace(array("\n","\t"), array("",""), $body); 373 | // $body = 'iphone-activationactivation-recordFairPlayKeyDataLS0tLS1CRUdJTiBDT05UQUlORVItLS0tLQpBQUVBQWNvQkpGVDdsbGVLL01aMUpZZDY0RmhqN2tPV1ZyMDcycXdIYURqZFFsdCtNZUNDUVNKeWVwWktyZGhGCmdXNWJMUStvUjZXamk4VUc5c1JvZUZTOHJsRGRLeVNzOVZkc1BYRUlQdHVLOWJQenZuWEtCTXBLSC9LNXFNSXYKVFN6WEJweTRGY2R6dDVUMGNKRzQ3d0liNlZSYjNLT2dEQmpRR0VGM3luMDdvUmVQc2pGN0twNzh0c0wrcjRsRwo0eTBHSkVBSlY5cGh1R1g1WGpkYml3dmZ5WUcyc1o1Z3FTMlpPYlZIVnEydlo0czdzcExtREE5MDVuRis2ZXFOCkN2RlUrUmhaQlBqb1prVkNLSG9qUE44L3hyaVMwQnpDOUJiakRHcnN3dkJJcE9ndWhNT28xeThsQWpqelZJTEcKaWdMVi9oMUlyaXYzYXBmN2hVVVRURUtPeUxiVkVlYjFIM0s0b0d2WXN1ZHRBei8yTTc4dnVmTHFINlh1ODl1eApwZGgrdmtWejk2NjkxaFJJTjlCdnBiQklYT3Q5enMyckk1TjJiMENoQzkwZ2d2dDJMRlFUOXRVQm13dGhLakdGCitNSHBCaFBFSVFlOGJ0bGxUcEFnNTBraWo0alBwdW5KN0pKTmVQWE1HcnZMOVI3SlEyZEgvTDBpR3gxdG96U2IKVTJmTGdJcFJQeDBnZEtKRmVlaFQwMy8zSWh5aXRIZXcvWExxSTBxRnU1bDBwaEZ5L2ZqWEVLQkQvaG5kUGgvZgozMjZ6bWg1WVVqL2o1MnFZMWpiM3cxOUw3ZzNYMjdHTGNBNGx5U0tPTmFQUnBwbVVMbVpzV1IzN1ovb0dnL20vCmNmMGlEb3AxR0VHYjRnUVNEUXRLR3pLL2FaZmZSTFd0b0ZMWlp3RngvOWdYNnc1eFRwL1Y4YUtvK2RQTDh1a3EKOWRHanJJOTVOM1VGbG1qOUw5VEo1TFZOUWZQR0dhaUtVNi9MWEN0SktyNjJNdkhISm0vTTFpV01HVzdCalAyWAo2eTU5RFpnMUxCM05hY2tFNHJsQi9icmVneURrcXgxZjhUUURPaVBZTE9ldjcvaXdoaEJkYjdBZjA2VGhhTm50CnRuZFYydEdSTnJ4a1ZZd2NkTngwL0dSN1ZjMmUrdytRTHRsZHJmdzA0bW1QejRjRTROek5SNkdVV0VuL1dja0cKUjc1U1RYVE9LOUJaVmM3TytBTTdNUXIwTytDQnFyVVNkNnVUdzVBVTJ3c1duL3V1N2JPUUE3L0NZaXN1N1p3SAppS0RoNVVSSFU2Tmc0WlY2YWR1cjEzSDR5RUxWU2hkcUR5emplNjhrSkdWTzZBbWoxckV6alNTRTJEVjVnTWcrCmJCWTVSWVpxNHU1NG11TjdrUTZLU2sxS04yN3F0bHAvNHVsYlg5VVFzVHhtN21WU0RqellvVmlGTG1COGU5L1QKN3N1RXVjM3RySWJsTTNjdzFkMFBhS1RlYUlVcGRkTFhoZkpXVnhxTDhXU2hsTi9yVW1ibFQ5ZXlTeC9uYmYzUgppZWE5cVIxYyttV0c1ZzFrd3A5N0p5aTBWZHJUdi9QQ2p6Z01xUkNEd1RPc051elArZWk3dGxpNEVmSHJtdWx0CnRUeDZkb1FOelBnbkVWL284TUxPVTBwc0pKeU83VU9QM2RvUXh5czJQNG53V0JaS0Joc3dmbjBXanU1T2pWSU4KRyt2U2hUTy9jYktpWm1ManVGOGFRMVpyNC80WHIzZTAwNFF1Y1F3NnVaRHRhUDRNZlVSREJSMnVaOWdTZy9mTgpNVVFpcGdUeGZCUEt4K0o2eVFHcDVmQ1VEc3RCMDlSNUtDK1Z0cGxucm5pYTY1TVd2NHRQM1UrNDh0NENCSE0wClNnSkR3NWRtTHBsVjJHVFUyQ1psazJBTGlobXhONUdleE1nVVNrcjQ2dFNkWmVzbENaNUVGa3JXOTJlV3NZbmsKK1NmWkxPMEpiYnJic3FQSFVubUZuQVhHM1o3VmhvYi9WTHNkZGRCei9EQjhySmFLCi0tLS0tRU5EIENPTlRBSU5FUi0tLS0tCg==AccountTokenCertificateLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREI1TVFzd0NRWURWUVFHRXdKVlV6RVQKTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFbU1DUUdBMVVFQ3hNZFFYQndiR1VnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4TFRBckJnTlZCQU1USkVGd2NHeGxJR2xRYUc5dVpTQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3TnpBME1UWXlNalUxTURKYUZ3MHhOREEwTVRZeU1qVTFNREphTUZzeEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLRXdwQmNIQnNaU0JKYm1NdU1SVXdFd1lEVlFRTEV3eEJjSEJzWlNCcApVR2h2Ym1VeElEQWVCZ05WQkFNVEYwRndjR3hsSUdsUWFHOXVaU0JCWTNScGRtRjBhVzl1TUlHZk1BMEdDU3FHClNJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREZBWHpSSW1Bcm1vaUhmYlMyb1BjcUFmYkV2MGQxams3R2JuWDcKKzRZVWx5SWZwcnpCVmRsbXoySkhZdjErMDRJekp0TDdjTDk3VUk3ZmswaTBPTVkwYWw4YStKUFFhNFVnNjExVApicUV0K25qQW1Ba2dlM0hYV0RCZEFYRDlNaGtDN1QvOW83N3pPUTFvbGk0Y1VkemxuWVdmem1XMFBkdU94dXZlCkFlWVk0d0lEQVFBQm80R2JNSUdZTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1CMEcKQTFVZERnUVdCQlNob05MK3Q3UnovcHNVYXEvTlBYTlBIKy9XbERBZkJnTlZIU01FR0RBV2dCVG5OQ291SXQ0NQpZR3UwbE01M2cyRXZNYUI4TlRBNEJnTlZIUjhFTVRBdk1DMmdLNkFwaGlkb2RIUndPaTh2ZDNkM0xtRndjR3hsCkxtTnZiUzloY0hCc1pXTmhMMmx3YUc5dVpTNWpjbXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY5cW1yVU4KZEErRlJPWUdQN3BXY1lUQUsrcEx5T2Y5ek9hRTdhZVZJODg1VjhZL0JLSGhsd0FvK3pFa2lPVTNGYkVQQ1M5Vgp0UzE4WkJjd0QvK2Q1WlFUTUZrbmhjVUp3ZFBxcWpubTlMcVRmSC94NHB3OE9OSFJEenhIZHA5NmdPVjNBNCs4CmFia29BU2ZjWXF2SVJ5cFhuYnVyM2JSUmhUekFzNFZJTFM2alR5Rll5bVplU2V3dEJ1Ym1taWdvMWtDUWlaR2MKNzZjNWZlREF5SGIyYnpFcXR2eDNXcHJsanRTNDZRVDVDUjZZZWxpblpuaW8zMmpBelJZVHh0UzZyM0pzdlpEaQpKMDcrRUhjbWZHZHB4d2dPKzdidFcxcEZhcjBaakY5L2pZS0tuT1lOeXZDcndzemhhZmJTWXd6QUc1RUpvWEZCCjRkK3BpV0hVRGNQeHRjYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=DeviceConfigurationFlags0DeviceCertificateLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWx5Z0F3SUJBZ0lLQXZrdCt0SWNwUFJTUXpBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWUQKVlFRR0V3SlZVekVUTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFVk1CTUdBMVVFQ3hNTVFYQndiR1VnYVZCbwpiMjVsTVI4d0hRWURWUVFERXhaQmNIQnNaU0JwVUdodmJtVWdSR1YyYVdObElFTkJNQjRYRFRJd01EVXhNakl5Ck1UTXhNMW9YRFRJek1EVXhNakl5TVRNeE0xb3dnWU14TFRBckJnTlZCQU1XSkRsQk9Ua3dSVU14TFRRNU5ETXQKTkRRM09TMDVSalJETFRBMVFUQXhPVVEwT0RnNU5URUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgpNUkl3RUFZRFZRUUhFd2xEZFhCbGNuUnBibTh4RXpBUkJnTlZCQW9UQ2tGd2NHeGxJRWx1WXk0eER6QU5CZ05WCkJBc1RCbWxRYUc5dVpUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF0dDhXRldUWm96SlEKYXRQcDNoRmZnT09GSi9NMTVqSjJkWGdyYkp5ZUwwbGRYa2VmT2NSVTZoVlE3KzhpR0tUVDY4aGQ2dUdwalJVaApxd3hxWUhuREZ0WHp6cjlFYTRXSEdlQ0hJME1jV2V5WGRWNHVJd1IxS3R4TTViblptKzZqTkdGMjgwdW8weHkyClRuT3pwMFNTM1YzWmU5dlVxTXcyN0l0MDhaZVE1MDBDQXdFQUFhT0JsVENCa2pBZkJnTlZIU01FR0RBV2dCU3kKL2lFalJJYVZhbm5WZ1NhT2N4RFlwMHlPZERBZEJnTlZIUTRFRmdRVWpSUkxnd2ppU0FUVS9ZSS9vUkFWRWs2TgpVWWt3REFZRFZSMFRBUUgvQkFJd0FEQU9CZ05WSFE4QkFmOEVCQU1DQmFBd0lBWURWUjBsQVFIL0JCWXdGQVlJCkt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01CQUdDaXFHU0liM1kyUUdDZ0lFQWdVQU1BMEdDU3FHU0liM0RRRUIKQlFVQUE0R0JBT2FKVVN2WVhRb0JaeXFnSE9EeE5zSnlFWXNpc3h0QngzS2Jrd2FydDRPTjV5cTBuUERIdk5naAo0WDlCc3d6M2ZmMURBS3diYU9EdGlWaDErVlJyUi9uamJKdVNaMFFSN2xDdmVkS214MHlqWFV2aXIvdlIzQ1doCmhHUXVaMkZqb0xJQXhYV05TQ1N2RWZzS0VYVlRKUm4vZUNYelpIaFJmZUpqaDRMdkZNSVEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=AccountTokenewoJIkludGVybmF0aW9uYWxNb2JpbGVFcXVpcG1lbnRJZGVudGl0eSIgPSAiMzUxOTg2MDY2ODg4NjU3IjsKCSJTZXJpYWxOdW1iZXIiID0gIkROUE1RMFU5RkZHRCI7CgkiSW50ZXJuYXRpb25hbE1vYmlsZVN1YnNjcmliZXJJZGVudGl0eSIgPSAiMjQyMDEzNDQxOTc2MzQ2IjsKCSJQcm9kdWN0VHlwZSIgPSAiaVBob25lNiwyIjsKCSJVbmlxdWVEZXZpY2VJRCIgPSAiNWE0YTg4NTliMDRhOTgzZTljMWFhM2U1ZDE2ZjFmZjc2MjQ3YjdmMiI7CgkiQWN0aXZhdGlvblJhbmRvbW5lc3MiID0gIjAyQzE2Q0U4LTVFN0EtNDI3MS1CQkI1LUE5NDYyMkJFNDk2MyI7CgkiQWN0aXZpdHlVUkwiID0gImh0dHBzOi8vYWxiZXJ0LmFwcGxlLmNvbS9kZXZpY2VzZXJ2aWNlcy9hY3Rpdml0eSI7CgkiSW50ZWdyYXRlZENpcmN1aXRDYXJkSWRlbnRpdHkiID0gIjg5NDcwMDAyMTcwODI0MDI3OTk3IjsKCSJDZXJ0aWZpY2F0ZVVSTCIgPSAiaHR0cHM6Ly9hbGJlcnQuYXBwbGUuY29tL2RldmljZXNlcnZpY2VzL2NlcnRpZnlNZSI7CgkiUGhvbmVOdW1iZXJOb3RpZmljYXRpb25VUkwiID0gImh0dHBzOi8vYWxiZXJ0LmFwcGxlLmNvbS9kZXZpY2VzZXJ2aWNlcy9waG9uZUhvbWUiOwoJIkFjdGl2YXRpb25UaWNrZXQiID0gIk1JSUJsUUlCQVRBTEJna3Foa2lHOXcwQkFRVXhZSjgvQkM1NkM3Q2ZRQVRoSUc4QW4wc1VpVGd0LzdrUnFsdGNXOS93RTNjVkFTWDdtb2lmaDIwSEFUaVJBQ1VSTjUrWFBRd0FBQUFBN3U3dTd1N3U3dStmbHo0RUFBQUFBSitYUHdRQkFBQUFuNWRBQkFFQUFBQ2ZsMHdFQUFBQUFBU0JnS0doaVNWU0ttVWNMY1dCWTQvaTRod1RMOE45YjZkN2xFbXlaOGZZbkZMMitrbXJTQUZHQVM2R0lMVzk3LzJPRVVGRDNzTXlYS0V2UXNqSFhkTW9zQklVSDMzQ2FNdUxpMnJnRUV2TEdGU0VZbkdvNUJ4OUUxbXRTY2lrYUFnUGx4dFRvTHl1TGR6ODkrTTlVTjV4QlNxVHFGOVJHNTVKNVdRVWQwblpobFJqbzRHZE1Bc0dDU3FHU0liM0RRRUJBUU9CalFBd2dZa0NnWUVBN1RvL1pOSG9JSnpCVWdZMDczNHZzZ2wrQUN4RFErZjRxdXZtU3JQQXRnREVOU1p3YVZySFhwRitjUktCQUJxa0RhMDBZY0VOeDJkdFMxdHVITEtETm4xek1aTGFaUnBpSzlVZWlNUE5aTDZtbGcxMkJXTHdWamxGT0dFRDhVNnBmWHdPdzZEL0ZDRFJndnlHQm43d3N3OHNFYTdBZGxZbU1IR21rdndnT1AwQ0F3RUFBUT09IjsKfQ==AccountTokenSignatureok6Up7tVVkqiPjmN29MDqJuT9g31T0GNgRwBO8jvruFx9idYiECYkelM0g79K9Cc2WduOAtW01hbT+olMDpTbZ2fGO64QrW0Oukg79Dr9VecpgAYpBvGjeUYp4RZfePvsybMYmdk+YQomKznXN5BAMP44LTbUbgkqknMLOTyxvE=unbrickshow-settings'; 374 | // $body = str_replace('unbrick', 'unbrickLDActivationVersion2', $body); 375 | // $body = str_replace('', 'show-settings', $body); 376 | $body1 = str_replace('iphone-activationunbrickactivation-record', 'ActivationRecordunbrick', str_replace("", "UniqueDeviceCertificateLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQXFpZ0F3SUJBZ0lHQVc0Vk1VQjBNQW9HQ0NxR1NNNDlCQU1DTUVVeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4R1RBWEJnTlZCQU1NRUVaRVVrUkRMVlZEVWxRdFUxVkNRMEV3SGhjTk1qQXdOVEUzTURNeU56RTNXaGNOTWpFd05URTNNRE15TnpFM1dqQnZNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1SNHdIQVlEVlFRTERCVjFZM0owSUV4bFlXWWdRMlZ5ZEdsbWFXTmhkR1V4SXpBaEJnTlZCQU1NR2pBd01EQTRNREV3TFRBd01ERkZNVEV5UXpFNE5EWTRNekkyTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFR2Q0aEF3M2x1NHZPWUFkcy9NMjhnWjEwdTR6MWI5MVZPenJBT05hNGxreFEyVUlDOXZsUUV4azF4YWQ1NTZONjNkT2FCRmZrazRJVXFBcTRUci9mcmFPQ0FWZ3dnZ0ZVTUF3R0ExVWRFd0VCL3dRQ01BQXdEZ1lEVlIwUEFRSC9CQVFEQWdUd01JSDNCZ2txaGtpRzkyTmtDZ0VFZ2VreGdlYi9oSnFoa2xBTk1Bc1dCRU5JU1ZBQ0F3Q0FFUCtFcW8yU1JCRXdEeFlFUlVOSlJBSUhIaEVzR0VhREp2K0drN1hDWXhzd0dSWUVZbTFoWXdRUk9UZzZNVEE2WlRnNllUQTZOVE02T0dYL2hzdTF5bWtaTUJjV0JHbHRaV2tFRHpNMU5UZ3lOakE0TWpBNE9EVXlOditIbThuY2JSWXdGQllFYzNKdWJRUU1SamN4VkRrMlVsRklSelpYLzRlcmtkSmtNakF3RmdSMVpHbGtCQ2cxWVdReE5ERmxaREZoWVdGaFpEZzBZV0l3TVRBME56YzVZelV6WVdNMU9EYzNZVFJtWkdJMC80ZTd0Y0pqR3pBWkZnUjNiV0ZqQkJFNU9Eb3hNRHBsT0RwaE1EbzFNem8xTmpBU0Jna3Foa2lHOTJOa0NnSUVCVEFEQWdFQU1DWUdDU3FHU0liM1kyUUlCd1FaTUJlL2luZ0lCQVl4TXk0ekxqRy9pbnNIQkFVeE4wUTFNREFLQmdncWhrak9QUVFEQWdOR0FEQkZBaUVBbEpYRnJ2NnFrNWFWbGtvRENhS1BEK0Q4RTNRR3pFUURuUThQdld1Mm1VQUNJQXR2emZLZERZT29oRUFsZkpkbW1KQ0Jzd21td3YyRWRkeTc1ZEVrVXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tdWtNdEg5UmRTUXZIekJ4N0ZpQkdyNy9LY21seFgvWHdvV2VXbldiNklSTT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNGekNDQVp5Z0F3SUJBZ0lJT2NVcVE4SUMvaHN3Q2dZSUtvWkl6ajBFQXdJd1FERVVNQklHQTFVRUF3d0wKVTBWUUlGSnZiM1FnUTBFeEV6QVJCZ05WQkFvTUNrRndjR3hsSUVsdVl5NHhFekFSQmdOVkJBZ01Da05oYkdsbQpiM0p1YVdFd0hoY05NVFl3TkRJMU1qTTBOVFEzV2hjTk1qa3dOakkwTWpFME16STBXakJGTVJNd0VRWURWUVFJCkRBcERZV3hwWm05eWJtbGhNUk13RVFZRFZRUUtEQXBCY0hCc1pTQkpibU11TVJrd0Z3WURWUVFEREJCR1JGSkUKUXkxVlExSlVMVk5WUWtOQk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWFEYzJPL01ydVl2UApWUGFVYktSN1JSem42NkIxNC84S29VTXNFRGI3bkhrR0VNWDZlQyswZ1N0R0hlNEhZTXJMeVdjYXAxdERGWW1FCkR5a0dRM3VNMmFON01Ia3dIUVlEVlIwT0JCWUVGTFNxT2tPdEcrVit6Z29NT0JxMTBobkxsVFd6TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXTy9XdnNXQ3NGVE5HS2FFcmFMMmUzczZmODh3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUJZR0NTcUdTSWIzWTJRR0xBRUIvd1FHRmdSMVkzSjBNQW9HQ0NxR1NNNDlCQU1DCkEya0FNR1lDTVFEZjV6TmlpS04vSnFtczF3KzNDRFlrRVNPUGllSk1wRWtMZTlhMFVqV1hFQkRMMFZFc3EvQ2QKRTNhS1hrYzZSMTBDTVFEUzRNaVdpeW1ZK1J4a3Z5L2hpY0REUXFJL0JMK04zTEhxekpaVXV3MlN4MGFmRFg3Qgo2THlLaytzTHE0dXJrTVk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", $body)); 377 | $body2 = str_replace('unbrick', 'unbrickLDActivationVersion2', $body); 378 | $body2 = str_replace('ActivationRecord', 'iphone-activation', $body2); 379 | 380 | if(isset($_GET['v'])) { 381 | if($_GET['v'] == '1') { $body = $body1; } 382 | if($_GET['v'] == '2') { 383 | if (isset($dataGet['UniqueDeviceCertificate'])) { 384 | $body2 = str_replace($dataGet['UniqueDeviceCertificate'], '', $bady2); 385 | $body2 = str_replace('UniqueDeviceCertificate', '', $bady2); 386 | } 387 | $body = $body2; 388 | $body = str_replace('unbr', 'ack-receivedunbr', $body); 389 | } 390 | } else { 391 | $body = str_replace('unbrick','unbrickshow-settings', $body); 392 | } 393 | 394 | header("Content-Length: " . strlen($body)); 395 | echo $body; 396 | 397 | // Put Log to local files: 398 | $fh = fopen($logfile,'a') or die("can't open the file"); 399 | fwrite($fh, "DATE: ".date('l jS \of F Y h:i:s A'). 400 | " - IP Address: ".$ipaddress."\r\n 401 | RAWPOST: =\t".$rawactpost."\r\n 402 | POST: =\t".$rawpost."\r\n 403 | GET: =\t".$rawget."\r\n 404 | DATA: =\t".$rawdata."\r\n 405 | GLOBALS: =\t".json_encode($GLOBALS, true)."\r\n 406 | SERVER: =\t".json_encode($_SERVER, true)."\r\n 407 | REQUEST: =\t".json_encode($_REQUEST, true)."\r\n 408 | FILES: =\t".json_encode($_FILES, true)."\r\n 409 | ENV: =\t".json_encode($_ENV, true)."\r\n 410 | COOKIE: =\t".json_encode($_COOKIE, true)."\r\n 411 | HEADERS Device: =\t".json_encode($headers, true)."\r\n 412 | ----- ALBERT DUMP START -----\r\n".$albert."\r\n----- ALBERT DUMP DONE -----\r\n 413 | HEADERS Server: =\t".json_encode($header, true)."\r\n 414 | BODY Server: =\t".$body."\r\n 415 | CONTENT Type: =\t".$content_type."\r\n 416 | ARS Server: =\t".$ARS."\r\n 417 | HTTP CODE: =\t".$httpcode."\r\n 418 | VIA URL: =\t".$_SERVER['SCRIPT_FILENAME']."\r\n\r\n 419 | BOUNDARY: =\t".$boundary."\r\n\r\n 420 | ---------------------------------------------------\r\n---------------------------------------------------\r\n 421 | ---------------------------------------------------\r\n---------------------------------------------------\r\n 422 | \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"); 423 | fclose($fh); 424 | } 425 | function AccountTokenCertificateTest() { 426 | return base64_encode('-----BEGIN CERTIFICATE----- 427 | MIIDZzCCAk+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJVUzET 428 | MBEGA1UECgwKQXBwbGUgSW5jLjEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlv 429 | biBBdXRob3JpdHkxLTArBgNVBAMMJEFwcGxlIGlQaG9uZSBDZXJ0aWZpY2F0aW9u 430 | IEF1dGhvcml0eTAeFw0wNzA0MTYyMjU1MDJaFw0xNDA0MTYyMjU1MDJaMFsxCzAJ 431 | BgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMRUwEwYDVQQLDAxBcHBsZSBp 432 | UGhvbmUxIDAeBgNVBAMMF0FwcGxlIGlQaG9uZSBBY3RpdmF0aW9uMIGfMA0GCSqG 433 | SIb3DQEBAQUAA4GNADCBiQKBgQDGY0ZZUcRyJOiPv5e9Gv0FqYw0C7JsrHA31lUn 434 | Q8E75ZpJmaI/mNMxsVTFMaljESvUND0CLcd7oXUK7bTjLBZvPVQw1Ox/IhfbJr8i 435 | FVpHey+CKt0vlIlsCEgQC93S59uw2TSfaIgEoh+ujlqfEqpt5Gf9juHFeFvZhlRC 436 | QVV2swIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0G 437 | A1UdDgQWBBTzUmyzK86VRqWv8B8t+q8WN7JMWDAfBgNVHSMEGDAWgBQbPaxJRBFM 438 | 9Fci7LMBYuuGdQHEwTA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vMTI4LjE5OS4z 439 | Ny4xMTAvYXBwbGNhL2lwaG9uZS5jcmwwDQYJKoZIhvcNAQEFBQADggEBAGUzfif7 440 | ILqVsb9tvE3AAKVCn9Ra53UUB8S+zpGpIlQxU+nEXQDibnCLSsXnEh4YYdcFGGiu 441 | yrmQcMFj15O7lskAu9Qxua1GQl+LrwrKRbdxiU9gODPjVAY06IfolMvlmNlH9E+J 442 | O8RGpdT5t9h6LcRTVtR31bQWXkId5LMTDEZVb5ooeP8l1qtP0UMUMnEcS4NHdJaO 443 | V7T/luytaUxgLrAUp9z0u12Fi3aYf7iB7EzI05GqIVeIwzRwNq0G5ywtLMjFn5SC 444 | LY7UKoTIKW6lTq3qIODuXni5tU20byauhiWmkG3fIrUnugnTMYScGy/RZVRA8EUh 445 | MnMhAMuMgJPdff8= 446 | -----END CERTIFICATE-----'); 447 | } 448 | function PrivateKeyRaptor() { 449 | return '-----BEGIN PRIVATE KEY----- 450 | MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMZjRllRxHIk6I+/ 451 | l70a/QWpjDQLsmyscDfWVSdDwTvlmkmZoj+Y0zGxVMUxqWMRK9Q0PQItx3uhdQrt 452 | tOMsFm89VDDU7H8iF9smvyIVWkd7L4Iq3S+UiWwISBAL3dLn27DZNJ9oiASiH66O 453 | Wp8Sqm3kZ/2O4cV4W9mGVEJBVXazAgMBAAECgYA+QKaxnoPrYYOMoA1obNCa90Ik 454 | jssVaOLp0prz8EHxnrHUiJ4uILGc9U1pd5T0nk3HkADY7y6ar+Z/YGoToyECh6NI 455 | kT5KfQhb6cyZw0vad/BhzIi7JYAyiLx1v+/JdRADNfYuZ/I6W+aY2iiqjy3UueIo 456 | oHMsp2AFgjJIf1QeeQJBAOT2mgj1qUUJDgg9Vv21tvoO7wLAQjCpodO+lxTlkpX2 457 | QSe6+DhncHHtGwJ1xqluM+cAmWR2sa2SpWkFmUofpvcCQQDd0GXBlYSFpcNLo2WX 458 | BNrysfyx2OOA1lD1kspPRYNeVrZ2XZo3GlakYN/x5s2h+3vh6CzmY/4v+4VsnkIs 459 | EhMlAkACpe+GJwE8MSyeX8c/y/g/0Chnib26PlwGzO+GaFlXrq92PC1eyaN9TdbA 460 | IoiXsRScmV8s0EqhzU5odo4dU1xlAkEAu3wEJkYcx2I+2lX37lf6QJzUu/ZZBXMg 461 | 5xD1018sFLcyboXbbavjg/kmEK9HLB0GrwGxweLO3Pu54P87a0izyQJACCANBXOl 462 | H+YvwLrFXOY4JD05xB9nu8fdMKkfQ1Y/6oD1eKjSbancC7lOxDqeFMf2uHUSyikX 463 | DFe8zJ24EvRssw== 464 | -----END PRIVATE KEY----- 465 | '; 466 | } 467 | ////////////////////////////////////////////////////////////////////////////////////////// 468 | function ActivationRecordXML($xml){ 469 | if (strpos($xml, 'AccountTokenCertificate') == false) return 'Activation Error 512'; 470 | $xml = simplexml_load_string($xml); 471 | $keys = json_decode(json_encode($xml->dict->dict->dict->key),1); 472 | $data = json_decode(json_encode($xml->dict->dict->dict->data),1); 473 | if($keys[0] == 'unbrick' ) array_shift($keys); 474 | foreach ($keys as $keyident => $keystore) { $keydata[$keystore] = $data[$keyident]; } 475 | $AccountToken = str_replace( array('{','}','"',"\n","\t"), array('','','','',''), base64_decode($keydata['AccountToken']) ); 476 | array_walk(explode(';', $AccountToken), function (&$value,$key) use (&$keydata) { 477 | list($k, $v) = explode(' = ', $value); 478 | if ($v) $keydata[$k] = $v; 479 | }); 480 | if ($keydata) return $keydata; 481 | } 482 | function makeTickets($ActivationInfoXML, $IMEI, $SN, $UDID){ 483 | if(strpos($ActivationInfoXML, 'MobileEquipmentIdentifier') !== false) { 484 | $unlockIMEI = '354957072435384'; 485 | $unlockMEID = '35495707243538'; 486 | $unlockSNID = 'FFMS992JGRXQ'; 487 | $unlockUDID = '354b613bd50ba1a23b53930f61bad80a65e9c0e2'; 488 | 489 | /* $unlockIMEI = '355691077115357'; 490 | $unlockMEID = '35569107711535'; 491 | $unlockSNID = 'FK3R4UP2GRYF'; 492 | $unlockUDID = '12bba93fbffa91d31e7a022a9e5d70c8dcb457c7'; 493 | */ 494 | $ActivationInfoXML = str_replace(substr($IMEI, 0, 14), $unlockMEID, str_replace($SN, $unlockSNID, str_replace($IMEI, $unlockIMEI, str_replace($UDID, $unlockUDID, $ActivationInfoXML)))); 495 | } elseif(strpos($ActivationInfoXML, 'InternationalMobileEquipmentIdentity') !== false) { 496 | $unlockIMEI = '355672072278051'; 497 | $unlockSNID = 'DX4R9MJFFFG9'; 498 | $ActivationInfoXML = str_replace($SN, $unlockSNID, str_replace($IMEI, $unlockIMEI, $ActivationInfoXML)); 499 | } elseif(strpos($ActivationInfoXML, 'SerialNumber') !== false) { 500 | $unlockSNID = 'F4QKGCFSF193'; 501 | $ActivationInfoXML = str_replace($SN, $unlockSNID, $ActivationInfoXML); 502 | } else { 503 | return "Error: 641"; 504 | } 505 | return $ActivationInfoXML; 506 | } 507 | function ActivationRequestInfoXMLNew($xml, $full=0) { $i=0; 508 | $xml = simplexml_load_string(str_replace("","true",$xml)); 509 | $keys = json_decode(json_encode($xml->dict->key),1); 510 | if(empty($keys)) { $keys = json_decode(json_encode($xml->key),1); $data = json_decode(json_encode($xml->data),1); } 511 | else { $data = json_decode(json_encode($xml->dict->data),1); } 512 | if ($full) $narr[] = array_combine($keys , $data); 513 | foreach ($keys as $keyident => $keystore) { $keydata[$keystore] = $data[$keyident]; } 514 | $ActivationRequestInfoXML = base64_decode($keydata['ActivationInfoXML']); 515 | $DeviceCertRequest = json_decode(json_encode(simplexml_load_string($ActivationRequestInfoXML)->dict->data),1); 516 | $innXML = array("\t","\t","","","integer"); 517 | $outXML = array("\tfalse","\ttrue","","","string"); 518 | $ActivationRequestInfo = str_replace($innXML, $outXML, $ActivationRequestInfoXML); 519 | $xml = simplexml_load_string($ActivationRequestInfo); 520 | $tmpkey = json_decode(json_encode($xml->dict->dict[$i]->key),1); 521 | $tmpstr = json_decode(json_encode($xml->dict->dict[$i]->string),1); 522 | $narr[] = array_combine($tmpkey , $tmpstr); 523 | while ( $tmpkey ) { $i++; 524 | if(empty($xml->dict->dict[$i]->key)) { break; } 525 | if(!$tmpkey = json_decode(json_encode($xml->dict->dict[$i]->key),1)) { break; } 526 | $tmpstr = json_decode(json_encode($xml->dict->dict[$i]->string),1); 527 | $narr[] = array_combine($tmpkey , $tmpstr); 528 | } 529 | $narr[] = array('DeviceCertRequest' => $DeviceCertRequest[0]); 530 | $result = call_user_func_array('array_merge', $narr); 531 | return $result; 532 | } 533 | function drmHandshake() { 534 | $IngestBody = '{"serial-number":"C7JP52A5G5MW","productType":"iPhone7,2","imei":"358362069398446","os-version":"12.4","udid":"913ba72a0981d3352bf28ca98b3a4a856fe81959","meid":"35836206939844","scrt-part2":"MIIC+AIBAjCCAvEEIP4C3sqQtP1S2hwBZzCoHcsoH2xNu5c+a4Q45oJ1MKF3BEEE+E8J1160TWEw+lfR04Ep4n5V6qphBM7+C84Oq2EtbZ4f\/2ynq\/79kqJL9s+UfFf0xcRRBxh\/CsMO3not\/wt2KAQQD4ftZj1bi82CSQSJC2TW1QQQZr3iCHFkqBfBvzBJuUoXQQSCAmTHY10JozST1xlC8729SUd6BtPQdoVxWqn+VkRXimgLwI0oMHaE2XYy66zF+LpxNYspPwsTDwtirgK2+VKrTyq9sYRuz07FgWqPQ6QvsVPnWhWkEe4rQjoTxCySfkbJmLSyIsNZPY0KQdLJOWL76ybC3BFEU5YCQ0IeDDZZWlNNaINXwHpUKhg1lo+t1i888mBgIDqrmvJsdj+OyGOxEPdVetMuhV3x3nfaqqGbw\/xqhT3Pk206z11GcOCpkQv6WjRaxoHdZBOHUfDjPJeyalA0DHdGGlh+vu8vVmO5UxfxmjZ3bTTdIil0YjS+MeY\/6bBgp02LxgDByg3xoUPZ52ZAYi+un3zpn6zTBZBlVSkUP7ijqMtuUWbCKg5dwGJ\/b\/Mgnu9Tcn5XaUNWGilcgTE+p86OxzyMmOJYSP1LJM6beoZ9E3xIW6MQRcOvE6La3SaYdm7JcBcWmuvQT3opOf3\/wYOAPtTpMkzbL5WdXVdRU35tOF5OsSQZqcLDG\/novPZXqwL4ZYr1BA5CezxNAJYp6ti3N9hnwVxqVdOOlbbrrw+qHskntvgy3eSUph9oZua6721hxngFA+gEOVvHlSNV5cQ6i6vQ9BCb\/zRYYZVa9cZzx+3telmWWr6Y6DGqqPpP0Py1d2GY8dreh+HRRHAoq7oyYcCK82Jl4\/nktMcg4TyCRCdWFm5xzl0xKyD41a0gOfa3WK51py\/tIrZMkZvs5Xb29sdIr7E50Ow7B73tR5qXmCUuWXOloYlxmn3DitRNjLuLmesGYEl9m3MXgCkQhDP98asvIApiZAoDfKz+EAapWK8=","pcrt":"BAAAFNAm6jp\/RYdQSXbscM5nZ61j+TIJo13nlOpvSw\/KrQd4PnR87hzuLx63xMK5XykZZcmxLtD8iYHIpOg0X3ztfbKtWD5BDp5Sm6T2w7c7sdw4vXWfiASb\/WNhYyjAc6\/fAm4GUNQNMKFJYAfZr1v4+UphQ81vggC8cdiAwq30L8YrsTW6Ay\/HP\/45xjceRCTu1JNbnB8asWgfOZ953\/k0lXw9lYUg0KBInzIZAT0xqLMVt\/knHzECcuU\/l8oFM\/vX97QHUSiSh8P6o5n7SAqb7ZAhODCl+UROwsJS1uzR4Ir1SoUNUTA4L8c4LhBbMPd4bJHyUKLGt\/aW4qJMBJiYfSCW+kPqz62kWxN50yUsgWu9VENTPWAmh\/LxCP1SYIrvWbQ8ZIkAB5FrUMNb2jcp+t43zKYikSQ7k5uO\/IcDprcrwfF7M\/K07G0nCG0KNfv4+pbiaPG2bbVEV5rT70koiH2SCBuQlRtRXk1H+8Ej7\/MNxBwsPoCTQkyt5CVj4PISz3\/mxlSkSne6oY6QhXZMo09bkUdXnydUBZZnqkfGMDML1hLoco14RMUF43Kvl9QpgR5OVaUJGzT3q4mQtAO5Mx1a0L272vFxF6jUz6Y3b1o9Np1VBfK1ZnS1RdJcCC+vRW1q6qzp9CerIj8JvQrfzU3Pu\/JOvDvErs8DP29XTNKdO9VIhYPhRlVUjsQ99JRlOYTPiIXCzRxuIEzMrsKDoCA8khVGHOEYI\/rUCNHK9EE5pxUSct\/VizYxhZgJ6OWEDuRbOLqcsd4aPTxiIgJIbxpxwPBoIX30k7gj3PqcguUKsBNcZ5g5BBHJB69XkVDvQrojctwP41IkLE0NGXIx3er0le9yFcxRGqAHhelwlMMEGGAmmN9T764NEbloal9LcAGn\/bbDMP1r6RtAiM1lkTEF0nYOcxA61E5b7XJy+G0C2CtaB0rUvpIiczepddTux9uI67cF50CfOq4\/\/+I+iBo6yw9wvJNEKtN2vVGjNG7x51p+F4XTl2mzdjqwTkb+Swws6DQImAVUgFmB9kwoKrrlvaVxQUrJQk2S0Mai7xhs6rKjIgnHrDNGGcY9HYrNAgRBCkckRtdB6DumJqHVX1+uTSclIsfAmS9H06tIRkEHk75KxukMs1t\/iSyXfYAFe3rWf8121+ym4GFZZTvVSL8hYS1fK17bdBs8BS\/Ma4+KDdAP9O22tGXFZ9YdVi27LtihGMqRA6H8R\/M\/\/Owkm\/esJwHZnWdi0a\/FLGjGyKkZuGCjw92XRwav5Ufss9bG3UfZtTyyQ9bPO0PcjBt9LdXeh+LJaQ0lWiw7K\/UgYraEWyMRrrynquJi2NnY9PhZJl4ElfXjy\/dc5J2OuoWusxf\/3in2cKHKLfNPZN591Y7gWAXmpHAhjOWR9PSdtwltb9RDN8vLdtqV7dBk\/uksS2MeWuLOnG2ceMqjYSwa95YQQdus9KU3aYxEkx9z+jgiKYXjTtGQBWCHE3PyIHd93tCxILbW1pQVz5v8H78F2mtJS129Kd4ska3Q\/58tqtGmQBUiUzYVUT7nyvZtbK27ovFmU1XDw2Uk48dDh03so3ZpnXTLuqFEEVT69dmen2JzEFCI0jKUJsWsieq7KWmsMUFriO5PFnqsSxEpOGr2j9b66xFPxBXazezeDUSTeTCXgacBsSb9IMI1D0uW6rWfZzp5HC0axGt5OnrsQ7R\/CVVqTgcB4xSLwpXrzuQAEfiWt7+cuDmhxctBPlNRBMh05Ro6+aR36jyIqmw84IbYP1wABdI4ej0j9reLY0fV5Pv1KH05QvuwegajtAZwm0L2RBUXPi63vKyy5Dww0keSC1kPYCAXlcP7Fj2bkEykXYXKBgTj72kx2ybI44E336u4hQgF6tBurdAcqCYlh3tPMWQI54r+gu5X74hgigA+s5J5cObPgqi9KSKaaybRaot4VO56CGyQ2ZlYnRq21j+ZL8vMcJxcpTCwsYCmdwa0u27lEiz2nRFjz5YQfMOYeSz6WCJI95SiLbNOjz1FcwjgvYrXzPFBFCNEVlJ9y2DrBJSyPHyZFbTDDIm4ZyBIE\/y6895rkSpZpUTfjl3VEYeSKDDy9tZKVTzIRt3XgXVF6BtrYmBA7Iqvgb1ddJrcOMSp6HIcvJTHzLfvTWCGxkZYcd86A2aBSCnQYvFydOxXsSKt3cKP4MnQ7tga1kMNoN0bbewavoL3J49V4cDeeyVSEJ87eGU6m1bwCS3Cf3ld\/IfH+a8B0tzIiMpH9Ym+dBxSlFCuNc51+GExSBnD1xZR8JNX0pX7TKm03PC8edKRd5MunuvprQ1C9ocYpZZhNPIQNfE49IPgSvVSgLgHzPBey8BJjsBvYeYrH43pGOnUFbae66sI3UTmAVO1PW0KXTAN34bec2cbkb6SZPiC57\/oYDGw+7JYBL+shfp8MQDOQV3HCG69jY0NsZKcWe0XnFpNw4MLJeczYsmWgHvsQ1zvC3l1SvxjFoYBwsOMiG8VQC6bcCjJZJdTde\/Gh1b9mzzQuXkgGdICeopllBraP7Q8HJpwEmPhyKW7Y4AtXdDh310CU6uRmLnDAz\/PVboDONGfgYTBqbOUI9W1pmJpgn42dT0itGbJit9inLUGPmZ5KKuO2d8uNC5sdvPSbxtVFjIX9sMBYsz+jSs5v\/UYqSRnyoA5rbJxpSuBBxbXBAskJ48ltoNlno2V0OCExvYmTB7Vb5eZa6lIe0ERpkO9PTuc6fvw3g4UHxrWFYF5a3aL5OYFcrrLn7O56ulMWmWvT2pVSTK8ZkxNcl\/A+WYkZ6ZDLURtOQSFoaQCTWc2AkYRs9XZxxpyIjqZOln4R0isWjIcxv9TVleh0OxoRaj83IOc6tTOJ+Zvg6aD25ZWvCzz0OkVtSPWaQ\/WZVFeIJfmyG0FGcT20xn5tlF\/VgHJ4o1GteWnAuvCUEURfAEFn2rzlZ5CjbyarpqpnDq\/V4JAwY1owp7apE8qrMAyACXW4EoqIBNwgWzYol1buH+55S4xkrw9PSI2c6UC71Oe4zSWfy8x2ij\/EZjtP8SL9Mz\/6aZSIw27vUYy3n6utLcHkl7aQV3zefUmK8+\/55yYcM+8Vxbh\/XORGcLobFPZV3DX1jj+cmUXTOMMJmRbBhlp4PxJvUtfFB7VLZejT\/+NUp\/2ZAfcquttednGC2D4nXPjeSY5and5wnPNVCriPA40X8NTk3MZI\/xu8t\/ILP35MKh83SuoWeK+ljsvVCshrh2VhOrk4G5nuhg0ewnFjzyjtqfwLj5BsPcB4vXfEHvm7FP0K2TzWYKiqnNxxiDU7BStvQTF3sKKIxfS7GNgcCedS\/pNmsEdd0c0YQJrZrA10cSAyB8SlSeUu3M42E2W\/\/7WSv1V5+ugPfJhLnkyPCuT+v7n4argKxbH387KJMNsfn4Wn1b6cudv+DaFhW\/VVS1rF\/h+i0snv3jess5r2gyxWn4mI2lVfOsRq88kOBdPtkI1+Y866TwOcFq202aMYUs1vwu9Bcv\/MxQ1d\/KQD1tzz0ECW5+GFYaBV6MPPZPG1o1N+UmEUx35SQpMa624r+lxHQFfacBln8VqqFqHxEqfpIuNF\/QmjKi\/CulpWWfeFo6qT0xF55n6Zlgh5d8AcDsfsKcxdqDXkskEHQThIe8bN73m1gwe45b2gBl77fnIbz3Nd15dx3uECFuUqyBx3CJTR8yzne0YC6o\/pa1Itv8O2gxxr40IJPj2ar2WE2EyOgWwCUEClAY5DzbBQ80Shg6EHARJMjzkgaG3gcnZe8g9VsVJ7OL69ofAMwdqcglfBv3pLl14iqsfmix5r037T5syDqhW\/\/SZqQBP6PJS7FTwDs1JfI+FUT3EtG28cT8K2ztGXTvqV\/X82oG+Fd7YTJbnxExFhrVa+Lfzaf7HMQ+RACtqSm\/rzSKMaqfFkJ\/iNDPK9nscF+cOdZ\/PackeG4CpzAVIyDr5xHWA9qUdo8f43MIpc5pt94ZIZoYpGCeF53lmsYdyF\/2LqWwRLS41nRCyniDqfCiQAz0IWsOH96PM0WsTMz6dC3AvhQTsBGeeTNSqheGylBRskEAodDmC7HR+iOiFrjksfhI4DDHN2DaSVmNpTbbgp4szfy7ussre2\/WIoPuJLzy9PTRKE7Sh0NS3VxQ\/Ctla5bBWrGWzPQO8MqVxF0ggfFYjgRV4lhuIdofccgrwnIax1NqPTu95WoZERXy942UJFvMfuY9OgGbE1UEeIdEbsfRJIZ9zsjIYB5\/XWYwClJ27NGl3lHQYVFShIGyc0r5aYLIOU5wv88vWL7ed4uO1PXTfr+WYTK5RYODuTH4tz4fY1NzvsXKOBvvOdG8EG\/h7w08F71nq\/PAcNlUJKrmmGTrJvtJCCDmKrtv9VTORU+J7mMiFXpbDcH+AmDA\/63MWOIZvvLSHwkJT2DGYliHNcUZZ\/8a1S\/OpBSrgRy1olDqRJr06KL47iVTP45p\/1gIDg09j7HSe8XLWiQffhisPN7LvsgmKhHz0OUeOA9crQ8Ub7147ReiCxfJ8CJOt5MKrdzMspDvqwIgFf2Fbw2iSE98SG23e1ObUUHPQ36v3JnStCyqVwiaHd45lCga\/7ULkiBLkEd6rfarguCmnIcBVcdmWS6nlMBDWEZ1TvnseFjqt6Rw86sAUKGP2iuoEygcHknLmeWjkHUdMRNfWbdzKBXU9tV2Rr2yILy7ZY\/wfcIiDI0CuZO1\/qGpdYycrbi12EWJBmrfG9\/07RjLt+392c818bSKZmHEYFSsAcypK26LiRRf96RXEeyVhu\/GUGjZjMjCvdpvBpcNs+CO9VTzbfGOSOCrfvJ+G3HwLPSMQPuns+XR1cm6ql0LeJGgJl96IjwuJ8IAqtpWHKPTgMfo50i6BOW5cq7lo\/QER7lpadCDW67b35PxE++VghzyzZD71uoZ\/cqwe++bhKTC1dGxZvYLwPDR0BZiK6t0\/8jlLPmNoXa6Q9uhf2cr92AzpeJ+BposfuWv2nD+qJvhlUHYoR25tdqRJWQfixVpiaxXMEmc4OetTtQKahveifuH5J35TfQCq6IBDsREIYTX6jKB54OvlZCYKttZQrVNnV5Q8sBDMeWE4Dmtq4aCKp5Xl1kISbs2sAbWZearjd\/1f8p4Ux7AQKcXOJ52IzityWVZdyP31rNPn0gSpHmDmbqiTf+lfGPRQ\/Lugla1og8YR22wBNmJKSHjc5PgoI6AmskkZageTQcZFqqmOrus\/fm8sN4PjuypnEZfiyT8YN\/Ym6R2Jv8tS4AqUZz1TaNfnucpkxzG1yE66M9AdvsOtGanOmF0uxtsCN\/PPpSDHXRdyYqTsGqLMGtXw+frccl4dzQ0jnkWU+d7ERFJZ6GtTV7olGzXm\/lckfR3\/WZmcjkCthPtt7XKD3hlzmentZp4EN\/wSq4ZCkdSThI12A4ley5GZV9xRLuC5JPuIj4gHJRBTVef6fYTyu3VhwiJuPjKQMk9DArwPSDW0ITK4qRDURyO9Kp4cYAI7gzKSoFdIoSF6BDDT4MO6pzxB\/3h5txQPrXOJrRmW\/2JirXumGWTxp\/oyxbZ1P9R\/32HBQyr1xPSGAOPC8nJZQRpMU5tk+AG7r5QhOmFNcWpxXMqMgKSceGf81pNrRuWO5bKOxUmUkHVb4VAGhkkApgNu87qH2YPi3x7u4nLsIH39N95g0iLgepr\/zRcqitnznznZopy2c9BbhX5XpM8Dpwodt1etrmTBKDCG1z13KO5ufamn1GkrFi2PnLihT5Ui7wdADU4noPxRggAYSAouuh+asv8RA3Kiyuj590pZg0uveWSWXK9hn3aACfxrDtz5qPbfz1rUDgXPubSZ\/y\/xYI1OK7Y6cVVfX6OyQxlTOiHdJ1Qh8WPBuGtnVl64h0HMQHG6KDG8ophhtMPMvk3IyL+sD\/tLRTl1iNbz2vLzv+tJ3+nwc1DGM3HGgOCl1VxiBztCl11AioWTw6QVFhwtOVu7AlnAkWpBuz0sJ5Wo04OdsCekjxw53hjflZZNdNYlKSspuIZtaa7kj2VkE8UJnAJrVqpwurdSo6AxG00qlZ0PmPbkDnvMVbsa2Ur7EQy9CS415ZAQ+MgU+Bfm1OOiCuFiv9+jgX7r6LM6IA3NuXzsgkN\/cuYxWSAoFuZolaiS8mHHLCtBp6s8kOfVkBLRSJCfpQk4m\/s7OQRgHqWTlD0PmCKIsFOJ8kZIWYu7UWznuxFw3q7shH7DV+34CQKWhPeJVGxUkXH4Nk00n2n23s+EUDbhkBjxvHz76e8kvcTFtInVscWMo6\/Gs5+w9nQ0FWYP0ErUCd1WZyP\/wlBlnRo8slyUXS1dthlogog+nF1LIXxujE\/VaeE3xw7MXE\/d55lzK2HsBF6uKinKtyxD6tRpWFD3DfR6im0fsPmjyLZfXHI5fFZDiI70ndQsn8+XBbPKV\/dg4ayibJxrMyGCm3E4KfKHEJAZxLThUasmHXMWTy+ec6pBtRprie8pF9U+wNZT0Fdmuh88X+PFRm1AVAW8\/4izXESTFdMmcJYqbU0Z9\/r+12URLu+kJF0SVL0hSrGYAED5Qf2XMMrQxcA6MZLktJ268GzAYjh5oRKctIvwxaih7cYm6\/0mWyMk2KfjpSgrIPGRbbjQFlNpuuVLQCMFn2rr5yJuZ1W182irFGXv\/9UvEqXbVcgD9hSuFzEbNrTnU4UqiQA9In2AY\/rmYSN8tV6atM13qzjHcA+5v6fcuHe2uAXABFNc3wXZqkfQ67uoq1GkhMdyKE3VixLjGShuX5erErLaiIRne7pIMA0FjKg2mHyE7jvGNsDi2hsoDNhIZ+L1djnIts1416pWoVaOnsU5A2KgSSKz0tEoBq8WGtetE9SZLmgGQZHZaEAnStM5Z2NaTdi\/ZeepHbhwPtUKrV+vX6c1ie4AaPdK\/bZgfrlVdAKeXsQJWIpU\/QbB2L4EimLSE\/BS+O66DuMSnBq0+u5ih6oFvxMK4o8aaOw98Qbh7bTg84C9mz4u9X0i02KIngizIE9zKIK5zLquNmdMInZYQ5ziCD8guKHzijAeeCIxAyK08fUCpcFUJzVReOQmozpbJW3obKMdcxre4izJGUnb03UrDcmLITl1dVRgS2nzekNff4UNfeZ94kU=","scrt-part1":"MIIQigIBAjCCEIMEIP4C3sqQtP1S2hwBZzCoHcsoH2xNu5c+a4Q45oJ1MKF3BEEEyYGBwEdZ1FlUNP3W8hiN0MFhc\/RzAy\/J3m8d7gudcaWNlAOxJsTTBy3FAcaFNMxaInRUnna5QlBnr+W3QKba3wQQAEk2du7wBtgY3A3R39PeBAQQ20Vn0Orgd\/ht3UVuYajKPwSCD\/b7dsJlW7+mcSBD2kaQk\/EzsIgRlnYdxSAQkkxgqJlLNZpyT9HXaxEUXbhCbkXgh4ikojvrkkFcg0F6RJHH5csYdZ0H\/eoNqgwnpCgtuTWWDi9MER9i9hKaEewTpSqvxVrWJtVQ7uVlTvSbdMhX+CcL4HUk4veDeC5K4bTsEXs0lv9dsxkadWE0z4q4vLryzDPF89GCd7OaKKh\/f\/q0u+Ib2buotugbA5AeuYY6l9gixgGRy9GxAhSlXpxDrjfAWB2JalqKaCrAo5arkaNGXCXe+AZFEVUzTl\/\/9wbnFrS7RA2rDeN+fc\/88Zz57YP1Snb5ZTWRvnEgSBheDQouEL7dhB51TJ1MAdSu2pl9fYSqOtnjVr7Wvkxv3gdSx+rAYNuK\/KZngZ9T1WVpGUcQ2zFkQYbxuQqIq6GqMirqn7SAW7bDS2OKh1BC+KeGBSBSphWKpgRBB40o0iCJmE2XnEw8aJWvo\/eJIqXt5x1\/\/xdP2PXdZaUYHs7B3xU\/A2Euw66u8f9kZHscXaaK0sr87nqnIXoogsceBvuJqAeuxKuOLXB2NefR+c5ucETNMIALQr8FXkEYd7\/dC4JyarQWIIHDTrHY6wleKxk7v4HMGSyvPJorX3XP+IZT6y0j3O+yhB8qaxzw35qyyzwUV2UQu2HuDbXJlXpW2J06fjvFFVi2Hq\/2SAcP8r7aICHVzWX\/j2Z38Q\/qyT+nzrAf82O6WpbK9QgIjy6Y2I++bVYkYrRRQjWNBrfJzhiZJ13HbxRAVQjraAhlXxWzaYBtxlqd\/o1CKu+\/9knjEoyvRYyFAVZtBuWFtJ05JNBx3qmjFEQYSe96d63QKg3oAvKn4v4Vcm5w+xnM\/vUaxtveZV0EXZPJ5bgzlyrl9OZw2qvszv1qyOY2rG3H7e9h5EXTUGv8QDlr\/bb6GYEfwp2MDe4BzN4Oi5cOlzQWh9E8mmHvCuT2QFg2gdXR0eXFnVHsNCP6Qo9PpCJZmDRNZT+IjKLXUsb1Ova5kvk1HV3zy\/V4oDCWT2vxEZ5blTJNT8BmCfGYSQo2XTF0gL0jNP3kEzttkTPe50HupVZjt3ZRRITTbpxFYCNNidykr81nBRv12OWq2tX1eKSleTUlrVNoMiYTBVM9P6jNQ6\/jdrJLns07IfBg8ohCtOJ0tYN4OgC6Te3V9dT6LtLdfIAfqrRJOO5cRyMB7zUGCXMe0339KuksjJU\/\/1JAwzNPMFrlWJCV1enqMmuwJqlv8FsGkGaZdY6kpkWPIW56ldLtJtFs4vKKUP6BHql1OEHvgQBpa7Y0qRzI6r4SSWtkXxqHAKxqOGjYPF0rzVy4HxOVpy86ZOXPcwLd4\/5hFNLoJxQFzASb2ugfDmr7oZ03MMBWc2Vh4tJ5jTdZxTnZvivHuBe92H0fgR2aoMCEhCB9V6TJCslWenvfG6raZQrN6xJFu0ZNyYOCs80awB7K7dKJKHJIWepuAhcLDBxwzOli9ggwK5z46Pjsvpa0WlhyKtY1VMiADpGEvJU9Zp6\/iqzdlvlF+zP4CGNucb1B9yOlOOW+yWgwZnlaFe9aVkXz06lP0M0wWg\/Yg80z\/35JZXtya2zMg6uakjChgOCYLNfSJPKyUlNa1SUTt5zhSaOlBgVIsx61pQ1eVoSj++Kn0JnCaRPtboBeBQ44zHwzEdIi6QWuIeqiKxP9mw0srXfUs4FSzLddAaAWA8ec3A0\/VYTU5pllAl\/FjgdglzNO3AicXHcweZhyhP7fBvtQbMt45zCpRE3EcYelbrJ+pTLMDhObWel1XtpxdBEY\/4aq6f4UyGW898BOefthE1DpkrKs6DZj7nuY+Xp4P1boahp9fKk1hwyboCOc0Wnxha2wDsMigSYJrwyp31\/Jr249\/k5cZyybMzpPXdPKs99cSLfwDOIpv6iYdQHWJTxUxDSfVFnkrnZoho8P76vn4ouCniLRhkKwe10hfYXt8ZBDhydUtf097Rpx7MZKJ47nhKRPnvxQv\/IgEHSLODi5fOSYdD3GysbagiiCNLnG2N+NauqwMKFglgQZarC+bpBxp9NBXlOiPLOSkBSwexXmmn5XupIUN\/T72cZoFxZSpfD67QTw6iFkLyRzbK0vztsJHdIGp1Kv0y40Lb70\/8fE88Blg3PlMWVZoGJ0+P5JEzypontu5AC2itOtwkjTiaE7cYZxpxdL0DJkLoCScZ7+UM6zvp32vk173t10wvPKguZPNq7qAVoz1oLuqeTtpbvrX1LoXQwML6S+hmxiZaSSH35voIH0tsfSDga1GCNtFtF2I1xDKMb\/jwWDqlw7ue3WnTZl51p1MQz4+PVC69\/MbvbdT7y+DNmN4wybRC8sRmVzNnreVIa6y\/1y2dIbk3B\/datWnNEieRGDFF6rWyw\/6bPlgWNGwWGR+9xuXmI6nmZ+gVe9Q7Vx2Xvi5mrkX4BUpl8mvOjKN9TI\/UtlufIvWXgj9INmLyeC2H5775uIKpOE229QiaPpDhtlP\/hbxJakfZbIn9YS3v+29YaNGWebKQGADeXFtyVautFmvBhXrh8raQkbt0S09TXNr52BdqlpPhp7RgnTvXsB2yuU1kdsRxH2dDMkP8B2+Gxm7t7Cfq4W5xs4JJu5W814E5UdqbJApR7mZF1jQ9nETmyBmLMsycda81yxdSFMMiCkmtKdyCxkK0vP7+xbd5UmYodigsPxTIpP6Uixv3ep0rQ0clK3\/FYzZhKJm2aY+mxvkTBjONcE71YjdGnztEERhjFqTMOedtE4lPDf4L8pRoudDmb8K5SJtskT2yUGLYbnf0jvDlvnTD9AvmiIluVL2c9Oy6FiOqN8aBqxQxkMJfMA+7Jysp\/q6wG7SPWJhQp2CNgjFEnNVV3I1slylvlN0jdEeQOndisx7xXoxoVcvdxYSZScgQX2k5Ei13yqWI+p2yYLS9kj1vE7nioe+qo7OMFbkj8WwyDBgIiNyp\/aINA2j52XaasxNSQUy8UMDXU04UwVdvLJesJzrQ++bygy74ryPCJlk1xZ3yJ+yX5OhGHyEh0t0\/w1ZqJLb4ZcTXwlLFpXz\/cUVwoRHPXfM5bKUnva6lQlfNReo0wpCwMUlSk8pP4h5X1kOxaZu9qHwSVF7KiihBSF35Q3MDDsmHJH46Uhk4wZblwTikUB+uPvHBmxEsO3NTgID5XH9v19eCX01cWCXd2zXmxLxxGtDrLLJWdruXHaP\/qUX6vH+ewg7um\/dNzBzruHQsSO+7rIMYVnoYrPNEu\/5IZNcCFmcaUmjjP3RE\/mpt7rfgPnEN38Iw6qhQSnEizkh1EpAt4SEv6Irdk8x8lzIsfODmlU3ATnaTeLrYrW25SRwYcjQ1T67X3bWYB+mVNLU6LCiZ1wmi\/Q4x8xL\/qh7LAiI1Tn7AvYdMHO22zpKywwMUQSg4nX4zJtLagIh9hAhott1alOQJeXXV77iMRi7PorPjCixfqR8rPWx6nU9HUtDvqVUgg7a1L1iL0MG3G9ToTe7Fswb1M5rEE4AOZDmq+Lxic9Hfqag2zMZWgyfU6RA1ZQcIFwhFTN\/W\/maT\/PCo26X\/+XrSzBO8Zt0QW9y3I3y5PG9Eo2YxvnOByjtPjC1ng9KQyOICUUnG71MQF8ZGpPbSrRgSYrBeCr2rGkE+iCvOJNPGadl42PgSpTtZYeyiD\/9+OA9MXNMHylFR9S4t9RKOk9\/vUFC0jL0Q98QtDWWr6+a0i4h5Lt823luW+EVb5ieb0uuqn5A7B3ber3LWbXIWXowpDR++UEAXdk7vSKCw4lIq+ONBgepkQ6mpxWPMFobE3QYDEsH9C\/VDTR4cftQnjQ\/9f2A7fyipnG4f4DzYE98bStPckaXrsLjSa+QzXMA8WeQ++Sve0JnOxkkrWG0myqdwaQSc1gCdnqjB31Q3e6EKUn0SV9r+nkBj+vO8BCoGDjK1iI0hg19i3fvdPF8UakaaXXIwSYr\/nyFxIH\/Pced2\/sSc1gnn7VuVoMx9WmvR3HnZaX0XtEmSAUP\/rnKcoHHXjnKT+Dv0+zeg4N\/SHQdE4qCSC8C7kOhn3rL+mtxgRikmB1fUt1fdHP3+fGLpXO3X3UDS2Kqo9ktYJA0UfQZzR50wYQgoCPfRoV3pdfqSJEm9lrtmJSse0kRXqOGKUe9RN\/E133J3V0HbP1q\/MRtKPdBI5jdu86LGhw+TjkEDaWpZBPSSHLAKwF\/t8QxoUUcwN7gc+zhZ0z9q75P23yc41JpmJrpx1RRQnw2TKUuH7idxs7FbAxoa4n8qrNIL3JWBLt2aCDOUTUubJ3yARzWQPLoxiFs5GX1oVSYQSLhEAXUL3jOzUC79gCuV4W\/4L\/RMHpBHLye3qBLIxMombmMT9UYoc9jwmaDavoeyQ+tYegkA+crfwNS8AMMLjGGY\/wV7gtU4YZdSksajt\/QUrGlKIitRhXORPzF0icXovYbbgXwvVnt8GhMdbALgQoTbHBeaj848fpCSW6YFah6JUqLjEj\/E32QinXwQtwx+EYtglBiiFJwH74tM\/q74Wb1ezqB\/gpCRAZyaXuk8rgzTm+OB+PTI6ztXKaof0dNQwBhm1IzQJEI8iCCxQt\/NC42mG6vT+FVFSp4ROuTTV9GU7P5b6tWvH0hxQBcOF1p3rMUIDeNvoijLYBUV64ki\/uuDzic0a5G\/dlu5fYSVlADh1Ybc3c\/CU6CyMxJP1Nt03hE9Tw\/WVvgRfxYt6UZ5Q5XClgrOGgo7XD7VYWv\/DxiZUfsxEi2tKDIRLXuaxV+Kbb2DTWquSTh\/O55I0a8iCgNpviRyIUUZ8bUdwmGBHblHxw+FGhTxOsSlj7RqffzRH\/TatYgHTiaVQ2n0unb9wu0F2+NEgyJECAZegdPCPUT+85sPk7wSeUus\/hpWCkMmuEar5GwUAcOOD+EhmxS9xTgop4ZReHg8kaqp6OrxsrJHmaK0m1qg2fSUEW9Q\/qnmfbwaImDnkpLv45K8u78sV0vlObr7ArMVWSHtnYQ6YmkN3+nMwSh3LcpeiT1vIDUnDCyIYl6cxkQIUU9N8RcoaHz8GpGQhEOJOZ1U6Hjw4FSyxhOHCp5+Phpms7yTCjxzPw+gxwBOoU02\/C6fY9J2HKnYk2rYg3ugarI\/EcWC2E1H+XEt9xBSvL75fijhv7TP0PZ29ruU96SiP7a8QlHrg3Z\/zmsJZT8QrfWp2yyVj1LnPB3kXPgxOACjFDP5hyJopJNzjMnNV\/cyHcUrOhG66of4xEW8bq+EoH7RJKyCWxDf+65pPGQyYY09tIgF5j\/N5gWBbGQhVGBOWh1iymvBk9C0JqJ7NEC3pGgIh7J+qRXTyYdiZ7jhdCMvTZVvVJNi8D6Bt+g3f7TolBjPRt2VcFudBs47w5p8LMZ3EML7wDaQkgSDcS6u7SiPzn+85lqDoyomnec22K3RUxnEqzxMA6cT2pQIeUjhyVoRWE8TITFtCIIolpYOqxkkgduFyBM+GuBKY=","os-build":"16G77"}'; 535 | $CollectionBlob = ' 536 | 537 | 538 | 539 | IngestBody 540 | 541 | '.substr(chunk_split(base64_encode($IngestBody), 68, "\n\t"), 0, -2).' 542 | 543 | X-Apple-Sig-Key 544 | BFaG3r+lZOk8PEfw16SlZDzp1OtgmPGwzm6tR8G5zmyMdv7UPkpgTjPu4UfARvRgvLaN7q5qbmV3jXJ9kIOFf2c= 545 | X-Apple-Signature 546 | MEUCIBaEbDeFBzC6eLc8akNfXYhWHOlOal5J40M5idwlzomXAiEAyp9YUoksBFWMvWem23It+vIh8ITFxvtzCM+kJXMxDRQ= 547 | 548 | 549 | '; 550 | $request = ' 551 | 552 | 553 | 554 | CollectionBlob 555 | 556 | '.substr(chunk_split(base64_encode($CollectionBlob), 68, "\n\t"), 0, -2).' 557 | 558 | HandshakeRequestMessage 559 | 560 | gic4oJIA7ntjKzdw7P6f6fS7zPKw 561 | 562 | UniqueDeviceID 563 | 913ba72a0981d3352bf28ca98b3a4a856fe81959 564 | 565 | 566 | '; 567 | $ch = curl_init(); 568 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 569 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 570 | curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml")); 571 | curl_setopt($ch, CURLOPT_URL, "https://albert.apple.com/deviceservices/drmHandshake"); 572 | curl_setopt($ch, CURLOPT_POST, 1); 573 | curl_setopt($ch, CURLOPT_POSTFIELDS, $request); 574 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 575 | $result = curl_exec($ch); 576 | curl_close ($ch); 577 | if(empty($result)) die('Connection Error'); 578 | return $result; 579 | } 580 | function reqTicket($activationinfo, $serverKP) { 581 | $privatekey = "-----BEGIN RSA PRIVATE KEY----- 582 | MIICWwIBAAKBgQC/buX+a+Z/p7nW0fnFM9qLt4fK+9js1gH4SIXOgi9zjvq4krNm 583 | 5GaCZCeV+ieHbAgV21s2LD5L+OaiP0dTHa/pTdnOenaZb7J+k3ylI1DT5yRO/zpW 584 | MCSaO6eesY3dlpQD2+uitdkRNBL9JdRagBUR16AlWBym58iNSMRjohNjiQIDAQAB 585 | AoGAYO+lIxo8U/P41ODq24MQbaN37b9t7y/HO5RtvU6K/LcwGnqewcFybyCMMxPD 586 | JH398iNropjwysO09f+Y/GuSAW+Rw1P9okq53XgweA9ep55XsZw9lQ7Ppo/0NjFh 587 | KK6IIJ049g/sRvl+w22vE/Aq0X8e6nDECvF1H8n0RdMJwwkCQQDj2tSsEXBraMSh 588 | Bq/m6JOvSm/c38SaD8PIgLTuiuVxDtYV+xonuis11Iru8H+s9Y9xnqyAvL54V7ov 589 | LPjYQszbAkEA1xRaNBcjPmuTBXgCCuh3iTWPzY0d6wYIDfPYPQ246KZXL/8Km6YK 590 | 3kdbRO0BsbMk80tAxxgbfbYWa5eC7GCMawJAeL5Y3snrAfAl6pLpmfp7cHOIrcoi 591 | m+VowZJ6zsHp7iyHhGRpKs474a285fuqHNSP7AzCqwHaCVmrvx4czDUx6wJANMSi 592 | iOswU20zKgFShviX80r32BeKQpI9QacU443NUw8UjwsEwEFRo01ggB2h78YjB6nr 593 | 36zzeblF8OnATlw1twJAbAe85uwCWG1Kj6qWHpbH13d9suaNOZBNc3BtfJsKSJxm 594 | 2Z7lpkBUpp4Qxjs/tgu8ND3bS33PP1HVJtbEmJzZjA== 595 | -----END RSA PRIVATE KEY-----"; 596 | $FP = 'MIIC1DCCAj2gAwIBAgIJAL3uSRCIXVKsMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAwwmQXBwbGUgRmFpclBsYXkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTcxMDA0MDUyNDU2WhcNMzcwOTI5MDUyNDU2WjB7MQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMMJkFwcGxlIEZhaXJQbGF5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDuU4B1TOCH9GeMdVq9TJZpW+D/TXsNcnw+z0M+rsH0sfUAlz+0Q03AXhiud+xGy3JT8aONJmAT3nPsClU/0Tn6QdQE2Gz2tzGl5DAImOMJ67w4xpGHgtAQYWHOibProEHUJR464hjS1X8j6/9ODAM7ZkWb6GF0t6Fotpu5JbeNlwIDAQABo2AwXjAOBgNVHQ8BAf8EBAMCA7gwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU6oGwgS+YyHQ3J16d3HOeXA4MuRwwHwYDVR0jBBgwFoAU6oGwgS+YyHQ3J16d3HOeXA4MuRwwDQYJKoZIhvcNAQEFBQADgYEAoBWmsqlQWN764/jQanlcYfiL62qW8mnd78uXQv0kB+AH2tMfMKItOXVKEM8VCsZ0wOYsyl7V49BuXQ3YBoMRB1HjSUN+F3Mzpvy5ghdMm8RuYKxUIMQLjW0gKDeDnBENXDFFO6emTfAi046sixzXtzCoMt8dXyQowV6++pVSlAUwggLEMIICLaADAgECAg0zM68HBAKvAAKvAAAEMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAwwmQXBwbGUgRmFpclBsYXkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTcxMDA0MDYxMDI5WhcNMjcxMDAyMDYxMDI5WjBnMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEXMBUGA1UECwwOQXBwbGUgRmFpclBsYXkxKjAoBgNVBAMMIWlQaG9uZS4zMzMzQUYwNzA0MDJBRjAwMDJBRjAwMDAwNDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAv27l/mvmf6e51tH5xTPai7eHyvvY7NYB+EiFzoIvc476uJKzZuRmgmQnlfonh2wIFdtbNiw+S/jmoj9HUx2v6U3Zznp2mW+yfpN8pSNQ0+ckTv86VjAkmjunnrGN3ZaUA9vrorXZETQS/SXUWoAVEdegJVgcpufIjUjEY6ITY4kCAwEAAaNgMF4wDgYDVR0PAQH/BAQDAgO4MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFH0JxiAaiIyvXVxPkzG826EAcGIGMB8GA1UdIwQYMBaAFOqBsIEvmMh0NydendxznlwODLkcMA0GCSqGSIb3DQEBBQUAA4GBAJM89P8sUrLbASKzs0GPv0XP0JByauFdtxQU5O3AL+NUsdxTk5xbpkAtZAe9DAWiBO0gQQ6jAxvJ9kuXdiFaTetGdVVgqQZysVTiOEIj9kwo+t2NDTEcqN+CG749NBjbsbL1ObWXxufInasA8twwOb30zBkzQll0JpmtlDD9NgthDQEBBQUwYjELMCAGA1UEBhMCVVMxEzARBgNVBCATIEFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA3MDIxNDE5MjA0MVoXDTEyMDIxNDE5MjA0MVowezELMCAGA1UEBhMCVVMxEzARBgNVBCATIEFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS8wLQYDVQQDEyZBcHBsZSBGYWlyUGxheSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBiAqhkiG9w0BAQEFA4GNMIGJAoGBsmc8XSrnj/J3z+8xvNEE/eqf0IYpkCCj/2RK72n0ILnvxMRjyjotIT1SjCOJKarbF9zLKMRpzXIkwhDB9HgdMRbF5uoZHSozvoCr3BFIBiofDmGBzXmaXRL0hJDIfPZ4m1L4+vGIbhBy+F3LiOy2VRSXpE0LwU8nZ5mmpLPX2q0CAwEBo4GcMIGZMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBT6DdQRkRvmsk4eBkmUEd1jYgdZZDAfBgNVHSMEGDAWgBQr0GlHlHYg/vRrjS5ApvdHTX8IXjA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhL3Jvb3QuY3JsMA0GICqGSIb3DQEBBQUDggEBwKBz+B3qHNHNxYZ1pLvrQMVqLQz+W/xuwVvXSH1AqWEtSzdwOO8GkUuvEcIfle6IM29fcur21Xa1V1hx8D4Qw9Uuuy+mOnPCMmUgVgQWGZhNC3ht0KN0ZJhU9KfXHaL/KsN5spnn57vVBqLrSTNpZ0EBma1osNN69JXg/SSIKhDno2j/rXv62brxpX/Kk6LOAzcDZoWTBRsx9nWCky/T8No5Nz1f/rrNmnDABosi7qnOBG4kaTsWUqXA8sCuQ3CEuyGRQ8u7t+pbupPgt3eJ701WBDNdzlxZMafXO0VWEc2uy5sOoM/ck6jKxVh4BdmZq9Zeh+qSczRUo5MYpIMwggS7MIIDo6ADAgECAgECMA0GICqGSIb3DQEBBQUwYjELMCAGA1UEBhMCVVMxEzARBgNVBCATIEFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMCAGA1UEBhMCVVMxEzARBgNVBCATIEFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBiAqhkiG9w0BAQEFA4IBDzCCASACggEB5JGpIB+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQINN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw6SC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAaOCAXowggF2MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQr0GlHlHYg/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlHlHYg/vRrjS5ApvdHTX8IXjCCAREGA1UdIASCAQgwggEEMIIBBiAqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBiAqhkiG9w0BAQUFA4IBAVw2mUwteLftjJvc83eb8nbSdzBPwR+Fg4UbmT1HN/Kpm0COLNSxkBLYvvRzm+7SZA/LeU802KI++Xj/a8gH7H05g4tTINM4xLG/mk8ga/8r/FmnBSB8F0BWER5007eLIztHo9VvJOLr0bdw3w9F4SfK8W147ee1Fxeo3H4iNcol1dkP1mvUoiQjEfehrI9zgWDGG1sgL5Ky+ERI8GA4nhX1PSZnIIozavcNgs/e66Mv+VNqW2TAYzN39zoHLFbr2g8hDtq6cxlPtdk2f8GHVdmnmbkyQvvY1XGefqFStxu9k0IkEirHDx22TZxeY8hLgBdQqorV2uT80CAHN7B1dSEK'; 597 | $rsa = new Crypt_RSA(); 598 | $rsa->loadKey($privatekey); 599 | $ActivationInfoXML = substr(chunk_split(base64_encode($activationinfo), 68, "\n\t"), 0, -2); 600 | $fairPlayCertChain = substr(chunk_split($FP, 68, "\n\t"), 0, -2); 601 | $FairPlaySignature = substr(chunk_split(base64_encode($rsa->sign($activationinfo)), 68, "\n\t"), 0, -2); 602 | $RKCertification = 'MIIC+gIBAjCCAvMEIP4C3sqQtP1S2hwBZzCoHcsoH2xNu5c+a4Q45oJ1MKF3BEEE49p6 603 | qBYsPi6d/EaTMJ9h8CQtrKGdYCTMu/aUR0LnaiUdo0JkEar8+XXJ4vhsNHCiMuyU+h8t 604 | QXjXE/njGvNLIgQQPuttwEZCap/KMxbpVPsr4gQQQROJYfLECM2dX0TdAYY9kQSCAmaQ 605 | 0aymKAinfqfVLFHQnfOyNJQDCIWOnu0HWATd4l5xMqSEeFLtJg1fzTxCLUN0pft8fJ0+ 606 | VjGAhLrjZxjyn6eO5RftvRFXg/yFfl5f0k9N8so1Dnhb7xJ4D1oFZXM7cQNOnyfZ2xmn 607 | dI6GyZTr6Org9oxWhV5jNpNNaIGWT2BkgncL1Oby0XLCp7lBArJdyWIilA0XZpWOGV0B 608 | qES4mAuqzSRdm7okvKuNunuEuTYA9i4N3qO1DWmpwR7+0YDYJsJcEav517+y2kDqUlEI 609 | +UNKt3mMpaC3jrGQRZ8yuvk+TLDoGM5BRF098+C1LO/1gzZfPZHVWxEQlIga2q+H6QIC 610 | eOuX6xcwDvGGrgje2gA7WA/PAhQO8aaOozQLX4Wc7H6SaEbfwbikAUi76UBLnAwxkQRC 611 | C5w+dnt0cm9/Tiu73o7ERQBB0Dh5JsnKfmFXYWHgCLTF05g8YzsSw5OmVwBRISgUZxHF 612 | PTYVy6WpJHhfjxO9N9JLawns4I0B14SZQhAQZeNqA21kTXWEEeSqLEy235qTElG3wqgA 613 | Skm5N2d3ypUty5Eryqfb0tZJD6nJGivrWin+CNQc7hspRw47d+Q0rd3MEgMptfcdk7Um 614 | GwqeL0hivVLSa9x2KMBiwgXNzs2NsyzkTKM5YIOyoNhnShLygAgE2KZU+NauQ/QA4LP+ 615 | 1RrJfkGcFuBbrVlw/3Jt5Wqang9Sg2dyqzu8QkkOfuQPElQlXcHDVlwyNgeWnySfTEtu 616 | 0grCs4IwHBg3bFOpwNqHZNz1HWkqEen1Z9IyeyRPIgQkpxVbkV+XsDKC+ozc4X/GHiOj 617 | 8A== 618 | 619 | RKSignature 620 | 621 | MEYCIQCXYwN2l9ICBMHzclN0wUaV9pueUOrR/79HHn516vSz2gIhAKJ0VP4GwcOsMvXS 622 | FL0dJj2mogjTyqOKmSmu2BOWSt+X 623 | 624 | serverKP 625 | 626 | '.$serverKP.' 627 | 628 | signActRequest 629 | 630 | eRqtvDpaCM0XNR19k8QFTQ=='; 631 | 632 | $request_ticket=' 633 | 634 | 635 | 636 | ActivationInfoComplete 637 | 638 | ActivationInfoXML 639 | 640 | '.$ActivationInfoXML.' 641 | 642 | FairPlayCertChain 643 | 644 | '.$fairPlayCertChain.' 645 | 646 | FairPlaySignature 647 | 648 | '.$FairPlaySignature.' 649 | 650 | RKCertification 651 | 652 | '.$RKCertification.' 653 | 654 | 655 | 656 | '; 657 | return($request_ticket); 658 | } 659 | function actAlbertTicket($activate) { 660 | $ch = curl_init(); 661 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 662 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 663 | curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml")); 664 | curl_setopt($ch, CURLOPT_URL, "https://albert.apple.com/deviceservices/deviceActivation"); 665 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 666 | curl_setopt($ch, CURLOPT_POST, 1); 667 | curl_setopt($ch, CURLOPT_POSTFIELDS, array('activation-info'=>$activate)); 668 | $albert = curl_exec($ch); 669 | curl_close ($ch); 670 | return($albert); 671 | } 672 | 673 | function getHandShake() { 674 | $json = json_encode($_POST, 1); 675 | if (empty($_POST['blobXML'])) { 676 | echo "Please re-connect device to USB and retry."; 677 | exit(); 678 | } 679 | $out = $_POST['blobXML']; 680 | 681 | $ch = curl_init(); 682 | curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml")); 683 | curl_setopt($ch, CURLOPT_URL, "https://albert.apple.com/deviceservices/drmHandshake"); 684 | curl_setopt($ch, CURLOPT_POST, 1); 685 | curl_setopt($ch, CURLOPT_POSTFIELDS, $out); 686 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 687 | $result = curl_exec($ch); 688 | curl_close ($ch); 689 | 690 | $file = './var/www/requests/'.$_POST['SN'].'-drmHSK.txt'; 691 | file_put_contents($file, "Device Request: ".$json."\r\nAlbert Respond: ".$result."\r\n"); 692 | 693 | echo $result; 694 | 695 | if (empty($out)) { 696 | echo "Please re-connect device to USB and retry."; 697 | file_put_contents('tmp.txt', "Success:\n$json"); 698 | } else { 699 | $data = json_encode($_POST, true); 700 | file_put_contents('tmp.txt', "Success:\n$out". $data); 701 | } 702 | 703 | } 704 | 705 | function get_client_ip() { 706 | if (isset($_SERVER['HTTP_CLIENT_IP'])) $ipaddress = $_SERVER['HTTP_CLIENT_IP']; 707 | elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; 708 | elseif (isset($_SERVER['HTTP_X_FORWARDED'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED']; 709 | elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; 710 | elseif (isset($_SERVER['HTTP_FORWARDED'])) $ipaddress = $_SERVER['HTTP_FORWARDED']; 711 | elseif (isset($_SERVER['REMOTE_ADDR'])) $ipaddress = $_SERVER['REMOTE_ADDR']; 712 | else $ipaddress = 'UNKNOWN'; 713 | return $ipaddress; 714 | } 715 | 716 | function boundary() { 717 | if (! isset($_SERVER['CONTENT_TYPE'])) return null; 718 | preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches); 719 | if (empty($matches) || ! isset($matches[1])) return null; 720 | return $matches[1]; 721 | } 722 | 723 | function ActivationRequestInfoXML($xml, $full=0) { $i=0; 724 | $xml = simplexml_load_string($xml); 725 | $keys = json_decode(json_encode($xml->dict->key),1); 726 | if(empty($keys)) { $keys = json_decode(json_encode($xml->key),1); $data = json_decode(json_encode($xml->data),1); } 727 | else { $data = json_decode(json_encode($xml->dict->data),1); } 728 | if ($full) $narr[] = array_combine($keys , $data); 729 | foreach ($keys as $keyident => $keystore) { $keydata[$keystore] = $data[$keyident]; } 730 | $ActivationRequestInfoXML = base64_decode($keydata['ActivationInfoXML']); 731 | $DeviceCertRequest = json_decode(json_encode(simplexml_load_string($ActivationRequestInfoXML)->dict->data),1); 732 | $innXML = array("\t","\t","","","integer"); 733 | $outXML = array("\tfalse","\ttrue","","","string"); 734 | $ActivationRequestInfo = str_replace($innXML, $outXML, $ActivationRequestInfoXML); 735 | $xml = simplexml_load_string($ActivationRequestInfo); 736 | $tmpkey = json_decode(json_encode($xml->dict->dict[$i]->key),1); 737 | $tmpstr = json_decode(json_encode($xml->dict->dict[$i]->string),1); 738 | $narr[] = array_combine($tmpkey , $tmpstr); 739 | while ( $tmpkey ) { $i++; 740 | if(empty($xml->dict->dict[$i]->key)) { break; } 741 | if(!$tmpkey = json_decode(json_encode($xml->dict->dict[$i]->key),1)) { break; } 742 | $tmpstr = json_decode(json_encode($xml->dict->dict[$i]->string),1); 743 | $narr[] = array_combine($tmpkey , $tmpstr); 744 | } 745 | $narr[] = array('DeviceCertRequest' => $DeviceCertRequest[0]); 746 | $result = call_user_func_array('array_merge', $narr); 747 | return $result; 748 | } 749 | 750 | if (!function_exists('getallheaders')) { 751 | function getallheaders() { 752 | $headers = []; 753 | foreach ($_SERVER as $name => $value) { 754 | if (substr($name, 0, 5) == 'HTTP_') { 755 | $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 756 | } 757 | } 758 | return $headers; 759 | } 760 | } 761 | 762 | function AccountTokenCertificateApple() { 763 | return base64_encode('-----BEGIN CERTIFICATE----- 764 | MIIDZzCCAk+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJVUzET 765 | MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv 766 | biBBdXRob3JpdHkxLTArBgNVBAMTJEFwcGxlIGlQaG9uZSBDZXJ0aWZpY2F0aW9u 767 | IEF1dGhvcml0eTAeFw0wNzA0MTYyMjU1MDJaFw0xNDA0MTYyMjU1MDJaMFsxCzAJ 768 | BgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMRUwEwYDVQQLEwxBcHBsZSBp 769 | UGhvbmUxIDAeBgNVBAMTF0FwcGxlIGlQaG9uZSBBY3RpdmF0aW9uMIGfMA0GCSqG 770 | SIb3DQEBAQUAA4GNADCBiQKBgQDFAXzRImArmoiHfbS2oPcqAfbEv0d1jk7GbnX7 771 | +4YUlyIfprzBVdlmz2JHYv1+04IzJtL7cL97UI7fk0i0OMY0al8a+JPQa4Ug611T 772 | bqEt+njAmAkge3HXWDBdAXD9MhkC7T/9o77zOQ1oli4cUdzlnYWfzmW0PduOxuve 773 | AeYY4wIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0G 774 | A1UdDgQWBBShoNL+t7Rz/psUaq/NPXNPH+/WlDAfBgNVHSMEGDAWgBTnNCouIt45 775 | YGu0lM53g2EvMaB8NTA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vd3d3LmFwcGxl 776 | LmNvbS9hcHBsZWNhL2lwaG9uZS5jcmwwDQYJKoZIhvcNAQEFBQADggEBAF9qmrUN 777 | dA+FROYGP7pWcYTAK+pLyOf9zOaE7aeVI885V8Y/BKHhlwAo+zEkiOU3FbEPCS9V 778 | tS18ZBcwD/+d5ZQTMFknhcUJwdPqqjnm9LqTfH/x4pw8ONHRDzxHdp96gOV3A4+8 779 | abkoASfcYqvIRypXnbur3bRRhTzAs4VILS6jTyFYymZeSewtBubmmigo1kCQiZGc 780 | 76c5feDAyHb2bzEqtvx3WprljtS46QT5CR6YelinZnio32jAzRYTxtS6r3JsvZDi 781 | J07+EHcmfGdpxwgO+7btW1pFar0ZjF9/jYKKnOYNyvCrwszhafbSYwzAG5EJoXFB 782 | 4d+piWHUDcPxtcc= 783 | -----END CERTIFICATE----- 784 | '); 785 | } 786 | -------------------------------------------------------------------------------- /raptor/RaptorActivation.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDZzCCAk+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJVUzET 3 | MBEGA1UECgwKQXBwbGUgSW5jLjEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlv 4 | biBBdXRob3JpdHkxLTArBgNVBAMMJEFwcGxlIGlQaG9uZSBDZXJ0aWZpY2F0aW9u 5 | IEF1dGhvcml0eTAeFw0yMDAyMTcwNjUxNDJaFw0yNzAyMTYwNjUxNDJaMFsxCzAJ 6 | BgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMRUwEwYDVQQLDAxBcHBsZSBp 7 | UGhvbmUxIDAeBgNVBAMMF0FwcGxlIGlQaG9uZSBBY3RpdmF0aW9uMIGfMA0GCSqG 8 | SIb3DQEBAQUAA4GNADCBiQKBgQDGY0ZZUcRyJOiPv5e9Gv0FqYw0C7JsrHA31lUn 9 | Q8E75ZpJmaI/mNMxsVTFMaljESvUND0CLcd7oXUK7bTjLBZvPVQw1Ox/IhfbJr8i 10 | FVpHey+CKt0vlIlsCEgQC93S59uw2TSfaIgEoh+ujlqfEqpt5Gf9juHFeFvZhlRC 11 | QVV2swIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0G 12 | A1UdDgQWBBTzUmyzK86VRqWv8B8t+q8WN7JMWDAfBgNVHSMEGDAWgBQbPaxJRBFM 13 | 9Fci7LMBYuuGdQHEwTA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vd3d3LmFwcGxl 14 | LmNvbS9hcHBsZWNhL2lwaG9uZS5jcmwwDQYJKoZIhvcNAQEFBQADggEBALeDhz1s 15 | Rg/fDwpt2JT5gWC5SMzUOPV5SAOlb84qS9RT61yPUXFI6VY7PaK+cm5lv9bt+TPN 16 | BrMMYgMi+RWHdh1UPS4xwGrMSk1c9M2ul/4REPEp9Jap//1y8xKE17QUzW0ER8K8 17 | C9ptUUY5L18l52OqAEc4j6vW8H7O3rriECrmBupXb/RzwUPPrJeAfiqRS/5zanvK 18 | LNp+a+6zQQeMSs32fD/lUlk0ho6McDtjSGCukK3DyA7WeWwBMFfl2T6FXmGqGCvX 19 | 4LfVXUTkMbxEReeoFjJeeItv6BjPuL2mktAnwMmSKDELEbFoo0xZsLX9tpBaKsBQ 20 | bT+eEHBwuLdeiWw= 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /var/www/crypt/Hash.php: -------------------------------------------------------------------------------- 1 | 20 | * setKey('abcdefg'); 26 | * 27 | * echo base64_encode($hash->hash('abcdefg')); 28 | * ?> 29 | * 30 | * 31 | * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy 32 | * of this software and associated documentation files (the "Software"), to deal 33 | * in the Software without restriction, including without limitation the rights 34 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 35 | * copies of the Software, and to permit persons to whom the Software is 36 | * furnished to do so, subject to the following conditions: 37 | * 38 | * The above copyright notice and this permission notice shall be included in 39 | * all copies or substantial portions of the Software. 40 | * 41 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 42 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 43 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 44 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 45 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 46 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 47 | * THE SOFTWARE. 48 | * 49 | * @category Crypt 50 | * @package Crypt_Hash 51 | * @author Jim Wigginton 52 | * @copyright 2007 Jim Wigginton 53 | * @license http://www.opensource.org/licenses/mit-license.html MIT License 54 | * @link http://phpseclib.sourceforge.net 55 | */ 56 | 57 | /**#@+ 58 | * @access private 59 | * @see Crypt_Hash::Crypt_Hash() 60 | */ 61 | /** 62 | * Toggles the internal implementation 63 | */ 64 | define('CRYPT_HASH_MODE_INTERNAL', 1); 65 | /** 66 | * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. 67 | */ 68 | define('CRYPT_HASH_MODE_MHASH', 2); 69 | /** 70 | * Toggles the hash() implementation, which works on PHP 5.1.2+. 71 | */ 72 | define('CRYPT_HASH_MODE_HASH', 3); 73 | /**#@-*/ 74 | 75 | /** 76 | * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. 77 | * 78 | * @package Crypt_Hash 79 | * @author Jim Wigginton 80 | * @access public 81 | */ 82 | class Crypt_Hash 83 | { 84 | /** 85 | * Hash Parameter 86 | * 87 | * @see Crypt_Hash::setHash() 88 | * @var Integer 89 | * @access private 90 | */ 91 | var $hashParam; 92 | 93 | /** 94 | * Byte-length of compression blocks / key (Internal HMAC) 95 | * 96 | * @see Crypt_Hash::setAlgorithm() 97 | * @var Integer 98 | * @access private 99 | */ 100 | var $b; 101 | 102 | /** 103 | * Byte-length of hash output (Internal HMAC) 104 | * 105 | * @see Crypt_Hash::setHash() 106 | * @var Integer 107 | * @access private 108 | */ 109 | var $l = false; 110 | 111 | /** 112 | * Hash Algorithm 113 | * 114 | * @see Crypt_Hash::setHash() 115 | * @var String 116 | * @access private 117 | */ 118 | var $hash; 119 | 120 | /** 121 | * Key 122 | * 123 | * @see Crypt_Hash::setKey() 124 | * @var String 125 | * @access private 126 | */ 127 | var $key = false; 128 | 129 | /** 130 | * Outer XOR (Internal HMAC) 131 | * 132 | * @see Crypt_Hash::setKey() 133 | * @var String 134 | * @access private 135 | */ 136 | var $opad; 137 | 138 | /** 139 | * Inner XOR (Internal HMAC) 140 | * 141 | * @see Crypt_Hash::setKey() 142 | * @var String 143 | * @access private 144 | */ 145 | var $ipad; 146 | 147 | /** 148 | * Default Constructor. 149 | * 150 | * @param optional String $hash 151 | * @return Crypt_Hash 152 | * @access public 153 | */ 154 | function Crypt_Hash($hash = 'sha1') 155 | { 156 | if ( !defined('CRYPT_HASH_MODE') ) { 157 | switch (true) { 158 | case extension_loaded('hash'): 159 | define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); 160 | break; 161 | case extension_loaded('mhash'): 162 | define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); 163 | break; 164 | default: 165 | define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); 166 | } 167 | } 168 | 169 | $this->setHash($hash); 170 | } 171 | 172 | /** 173 | * Sets the key for HMACs 174 | * 175 | * Keys can be of any length. 176 | * 177 | * @access public 178 | * @param optional String $key 179 | */ 180 | function setKey($key = false) 181 | { 182 | $this->key = $key; 183 | } 184 | 185 | /** 186 | * Gets the hash function. 187 | * 188 | * As set by the constructor or by the setHash() method. 189 | * 190 | * @access public 191 | * @return String 192 | */ 193 | function getHash() 194 | { 195 | return $this->hashParam; 196 | } 197 | 198 | /** 199 | * Sets the hash function. 200 | * 201 | * @access public 202 | * @param String $hash 203 | */ 204 | function setHash($hash) 205 | { 206 | $this->hashParam = $hash = strtolower($hash); 207 | switch ($hash) { 208 | case 'md5-96': 209 | case 'sha1-96': 210 | case 'sha256-96': 211 | case 'sha512-96': 212 | $hash = substr($hash, 0, -3); 213 | $this->l = 12; // 96 / 8 = 12 214 | break; 215 | case 'md2': 216 | case 'md5': 217 | $this->l = 16; 218 | break; 219 | case 'sha1': 220 | $this->l = 20; 221 | break; 222 | case 'sha256': 223 | $this->l = 32; 224 | break; 225 | case 'sha384': 226 | $this->l = 48; 227 | break; 228 | case 'sha512': 229 | $this->l = 64; 230 | } 231 | 232 | switch ($hash) { 233 | case 'md2': 234 | $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? 235 | CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; 236 | break; 237 | case 'sha384': 238 | case 'sha512': 239 | $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; 240 | break; 241 | default: 242 | $mode = CRYPT_HASH_MODE; 243 | } 244 | 245 | switch ( $mode ) { 246 | case CRYPT_HASH_MODE_MHASH: 247 | switch ($hash) { 248 | case 'md5': 249 | $this->hash = MHASH_MD5; 250 | break; 251 | case 'sha256': 252 | $this->hash = MHASH_SHA256; 253 | break; 254 | case 'sha1': 255 | default: 256 | $this->hash = MHASH_SHA1; 257 | } 258 | return; 259 | case CRYPT_HASH_MODE_HASH: 260 | switch ($hash) { 261 | case 'md5': 262 | $this->hash = 'md5'; 263 | return; 264 | case 'md2': 265 | case 'sha256': 266 | case 'sha384': 267 | case 'sha512': 268 | $this->hash = $hash; 269 | return; 270 | case 'sha1': 271 | default: 272 | $this->hash = 'sha1'; 273 | } 274 | return; 275 | } 276 | 277 | switch ($hash) { 278 | case 'md2': 279 | $this->b = 16; 280 | $this->hash = array($this, '_md2'); 281 | break; 282 | case 'md5': 283 | $this->b = 64; 284 | $this->hash = array($this, '_md5'); 285 | break; 286 | case 'sha256': 287 | $this->b = 64; 288 | $this->hash = array($this, '_sha256'); 289 | break; 290 | case 'sha384': 291 | case 'sha512': 292 | $this->b = 128; 293 | $this->hash = array($this, '_sha512'); 294 | break; 295 | case 'sha1': 296 | default: 297 | $this->b = 64; 298 | $this->hash = array($this, '_sha1'); 299 | } 300 | 301 | $this->ipad = str_repeat(chr(0x36), $this->b); 302 | $this->opad = str_repeat(chr(0x5C), $this->b); 303 | } 304 | 305 | /** 306 | * Compute the HMAC. 307 | * 308 | * @access public 309 | * @param String $text 310 | * @return String 311 | */ 312 | function hash($text) 313 | { 314 | $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; 315 | 316 | if (!empty($this->key) || is_string($this->key)) { 317 | switch ( $mode ) { 318 | case CRYPT_HASH_MODE_MHASH: 319 | $output = mhash($this->hash, $text, $this->key); 320 | break; 321 | case CRYPT_HASH_MODE_HASH: 322 | $output = hash_hmac($this->hash, $text, $this->key, true); 323 | break; 324 | case CRYPT_HASH_MODE_INTERNAL: 325 | /* "Applications that use keys longer than B bytes will first hash the key using H and then use the 326 | resultant L byte string as the actual key to HMAC." 327 | 328 | -- http://tools.ietf.org/html/rfc2104#section-2 */ 329 | $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key; 330 | 331 | $key = str_pad($key, $this->b, chr(0)); // step 1 332 | $temp = $this->ipad ^ $key; // step 2 333 | $temp .= $text; // step 3 334 | $temp = call_user_func($this->hash, $temp); // step 4 335 | $output = $this->opad ^ $key; // step 5 336 | $output.= $temp; // step 6 337 | $output = call_user_func($this->hash, $output); // step 7 338 | } 339 | } else { 340 | switch ( $mode ) { 341 | case CRYPT_HASH_MODE_MHASH: 342 | $output = mhash($this->hash, $text); 343 | break; 344 | case CRYPT_HASH_MODE_HASH: 345 | $output = hash($this->hash, $text, true); 346 | break; 347 | case CRYPT_HASH_MODE_INTERNAL: 348 | $output = call_user_func($this->hash, $text); 349 | } 350 | } 351 | 352 | return substr($output, 0, $this->l); 353 | } 354 | 355 | /** 356 | * Returns the hash length (in bytes) 357 | * 358 | * @access public 359 | * @return Integer 360 | */ 361 | function getLength() 362 | { 363 | return $this->l; 364 | } 365 | 366 | /** 367 | * Wrapper for MD5 368 | * 369 | * @access private 370 | * @param String $m 371 | */ 372 | function _md5($m) 373 | { 374 | return pack('H*', md5($m)); 375 | } 376 | 377 | /** 378 | * Wrapper for SHA1 379 | * 380 | * @access private 381 | * @param String $m 382 | */ 383 | function _sha1($m) 384 | { 385 | return pack('H*', sha1($m)); 386 | } 387 | 388 | /** 389 | * Pure-PHP implementation of MD2 390 | * 391 | * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. 392 | * 393 | * @access private 394 | * @param String $m 395 | */ 396 | function _md2($m) 397 | { 398 | static $s = array( 399 | 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 400 | 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 401 | 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 402 | 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 403 | 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, 404 | 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, 405 | 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, 406 | 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, 407 | 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, 408 | 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, 409 | 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, 410 | 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 411 | 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 412 | 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 413 | 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, 414 | 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, 415 | 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, 416 | 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 417 | ); 418 | 419 | // Step 1. Append Padding Bytes 420 | $pad = 16 - (strlen($m) & 0xF); 421 | $m.= str_repeat(chr($pad), $pad); 422 | 423 | $length = strlen($m); 424 | 425 | // Step 2. Append Checksum 426 | $c = str_repeat(chr(0), 16); 427 | $l = chr(0); 428 | for ($i = 0; $i < $length; $i+= 16) { 429 | for ($j = 0; $j < 16; $j++) { 430 | // RFC1319 incorrectly states that C[j] should be set to S[c xor L] 431 | //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); 432 | // per , however, C[j] should be set to S[c xor L] xor C[j] 433 | $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); 434 | $l = $c[$j]; 435 | } 436 | } 437 | $m.= $c; 438 | 439 | $length+= 16; 440 | 441 | // Step 3. Initialize MD Buffer 442 | $x = str_repeat(chr(0), 48); 443 | 444 | // Step 4. Process Message in 16-Byte Blocks 445 | for ($i = 0; $i < $length; $i+= 16) { 446 | for ($j = 0; $j < 16; $j++) { 447 | $x[$j + 16] = $m[$i + $j]; 448 | $x[$j + 32] = $x[$j + 16] ^ $x[$j]; 449 | } 450 | $t = chr(0); 451 | for ($j = 0; $j < 18; $j++) { 452 | for ($k = 0; $k < 48; $k++) { 453 | $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); 454 | //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); 455 | } 456 | $t = chr(ord($t) + $j); 457 | } 458 | } 459 | 460 | // Step 5. Output 461 | return substr($x, 0, 16); 462 | } 463 | 464 | /** 465 | * Pure-PHP implementation of SHA256 466 | * 467 | * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. 468 | * 469 | * @access private 470 | * @param String $m 471 | */ 472 | function _sha256($m) 473 | { 474 | if (extension_loaded('suhosin')) { 475 | return pack('H*', sha256($m)); 476 | } 477 | 478 | // Initialize variables 479 | $hash = array( 480 | 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 481 | ); 482 | // Initialize table of round constants 483 | // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) 484 | static $k = array( 485 | 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 486 | 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 487 | 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 488 | 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 489 | 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 490 | 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 491 | 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 492 | 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 493 | ); 494 | 495 | // Pre-processing 496 | $length = strlen($m); 497 | // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 498 | $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); 499 | $m[$length] = chr(0x80); 500 | // we don't support hashing strings 512MB long 501 | $m.= pack('N2', 0, $length << 3); 502 | 503 | // Process the message in successive 512-bit chunks 504 | $chunks = str_split($m, 64); 505 | foreach ($chunks as $chunk) { 506 | $w = array(); 507 | for ($i = 0; $i < 16; $i++) { 508 | extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); 509 | $w[] = $temp; 510 | } 511 | 512 | // Extend the sixteen 32-bit words into sixty-four 32-bit words 513 | for ($i = 16; $i < 64; $i++) { 514 | $s0 = $this->_rightRotate($w[$i - 15], 7) ^ 515 | $this->_rightRotate($w[$i - 15], 18) ^ 516 | $this->_rightShift( $w[$i - 15], 3); 517 | $s1 = $this->_rightRotate($w[$i - 2], 17) ^ 518 | $this->_rightRotate($w[$i - 2], 19) ^ 519 | $this->_rightShift( $w[$i - 2], 10); 520 | $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); 521 | 522 | } 523 | 524 | // Initialize hash value for this chunk 525 | list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; 526 | 527 | // Main loop 528 | for ($i = 0; $i < 64; $i++) { 529 | $s0 = $this->_rightRotate($a, 2) ^ 530 | $this->_rightRotate($a, 13) ^ 531 | $this->_rightRotate($a, 22); 532 | $maj = ($a & $b) ^ 533 | ($a & $c) ^ 534 | ($b & $c); 535 | $t2 = $this->_add($s0, $maj); 536 | 537 | $s1 = $this->_rightRotate($e, 6) ^ 538 | $this->_rightRotate($e, 11) ^ 539 | $this->_rightRotate($e, 25); 540 | $ch = ($e & $f) ^ 541 | ($this->_not($e) & $g); 542 | $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); 543 | 544 | $h = $g; 545 | $g = $f; 546 | $f = $e; 547 | $e = $this->_add($d, $t1); 548 | $d = $c; 549 | $c = $b; 550 | $b = $a; 551 | $a = $this->_add($t1, $t2); 552 | } 553 | 554 | // Add this chunk's hash to result so far 555 | $hash = array( 556 | $this->_add($hash[0], $a), 557 | $this->_add($hash[1], $b), 558 | $this->_add($hash[2], $c), 559 | $this->_add($hash[3], $d), 560 | $this->_add($hash[4], $e), 561 | $this->_add($hash[5], $f), 562 | $this->_add($hash[6], $g), 563 | $this->_add($hash[7], $h) 564 | ); 565 | } 566 | 567 | // Produce the final hash value (big-endian) 568 | return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); 569 | } 570 | 571 | /** 572 | * Pure-PHP implementation of SHA384 and SHA512 573 | * 574 | * @access private 575 | * @param String $m 576 | */ 577 | function _sha512($m) 578 | { 579 | if (!class_exists('Math_BigInteger')) { 580 | include_once 'Math/BigInteger.php'; 581 | } 582 | 583 | static $init384, $init512, $k; 584 | 585 | if (!isset($k)) { 586 | // Initialize variables 587 | $init384 = array( // initial values for SHA384 588 | 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', 589 | '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' 590 | ); 591 | $init512 = array( // initial values for SHA512 592 | '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', 593 | '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' 594 | ); 595 | 596 | for ($i = 0; $i < 8; $i++) { 597 | $init384[$i] = new Math_BigInteger($init384[$i], 16); 598 | $init384[$i]->setPrecision(64); 599 | $init512[$i] = new Math_BigInteger($init512[$i], 16); 600 | $init512[$i]->setPrecision(64); 601 | } 602 | 603 | // Initialize table of round constants 604 | // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) 605 | $k = array( 606 | '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', 607 | '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', 608 | 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', 609 | '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', 610 | 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', 611 | '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', 612 | '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', 613 | 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', 614 | '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', 615 | '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', 616 | 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', 617 | 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', 618 | '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', 619 | '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', 620 | '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', 621 | '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', 622 | 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', 623 | '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', 624 | '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', 625 | '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' 626 | ); 627 | 628 | for ($i = 0; $i < 80; $i++) { 629 | $k[$i] = new Math_BigInteger($k[$i], 16); 630 | } 631 | } 632 | 633 | $hash = $this->l == 48 ? $init384 : $init512; 634 | 635 | // Pre-processing 636 | $length = strlen($m); 637 | // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 638 | $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); 639 | $m[$length] = chr(0x80); 640 | // we don't support hashing strings 512MB long 641 | $m.= pack('N4', 0, 0, 0, $length << 3); 642 | 643 | // Process the message in successive 1024-bit chunks 644 | $chunks = str_split($m, 128); 645 | foreach ($chunks as $chunk) { 646 | $w = array(); 647 | for ($i = 0; $i < 16; $i++) { 648 | $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); 649 | $temp->setPrecision(64); 650 | $w[] = $temp; 651 | } 652 | 653 | // Extend the sixteen 32-bit words into eighty 32-bit words 654 | for ($i = 16; $i < 80; $i++) { 655 | $temp = array( 656 | $w[$i - 15]->bitwise_rightRotate(1), 657 | $w[$i - 15]->bitwise_rightRotate(8), 658 | $w[$i - 15]->bitwise_rightShift(7) 659 | ); 660 | $s0 = $temp[0]->bitwise_xor($temp[1]); 661 | $s0 = $s0->bitwise_xor($temp[2]); 662 | $temp = array( 663 | $w[$i - 2]->bitwise_rightRotate(19), 664 | $w[$i - 2]->bitwise_rightRotate(61), 665 | $w[$i - 2]->bitwise_rightShift(6) 666 | ); 667 | $s1 = $temp[0]->bitwise_xor($temp[1]); 668 | $s1 = $s1->bitwise_xor($temp[2]); 669 | $w[$i] = $w[$i - 16]->copy(); 670 | $w[$i] = $w[$i]->add($s0); 671 | $w[$i] = $w[$i]->add($w[$i - 7]); 672 | $w[$i] = $w[$i]->add($s1); 673 | } 674 | 675 | // Initialize hash value for this chunk 676 | $a = $hash[0]->copy(); 677 | $b = $hash[1]->copy(); 678 | $c = $hash[2]->copy(); 679 | $d = $hash[3]->copy(); 680 | $e = $hash[4]->copy(); 681 | $f = $hash[5]->copy(); 682 | $g = $hash[6]->copy(); 683 | $h = $hash[7]->copy(); 684 | 685 | // Main loop 686 | for ($i = 0; $i < 80; $i++) { 687 | $temp = array( 688 | $a->bitwise_rightRotate(28), 689 | $a->bitwise_rightRotate(34), 690 | $a->bitwise_rightRotate(39) 691 | ); 692 | $s0 = $temp[0]->bitwise_xor($temp[1]); 693 | $s0 = $s0->bitwise_xor($temp[2]); 694 | $temp = array( 695 | $a->bitwise_and($b), 696 | $a->bitwise_and($c), 697 | $b->bitwise_and($c) 698 | ); 699 | $maj = $temp[0]->bitwise_xor($temp[1]); 700 | $maj = $maj->bitwise_xor($temp[2]); 701 | $t2 = $s0->add($maj); 702 | 703 | $temp = array( 704 | $e->bitwise_rightRotate(14), 705 | $e->bitwise_rightRotate(18), 706 | $e->bitwise_rightRotate(41) 707 | ); 708 | $s1 = $temp[0]->bitwise_xor($temp[1]); 709 | $s1 = $s1->bitwise_xor($temp[2]); 710 | $temp = array( 711 | $e->bitwise_and($f), 712 | $g->bitwise_and($e->bitwise_not()) 713 | ); 714 | $ch = $temp[0]->bitwise_xor($temp[1]); 715 | $t1 = $h->add($s1); 716 | $t1 = $t1->add($ch); 717 | $t1 = $t1->add($k[$i]); 718 | $t1 = $t1->add($w[$i]); 719 | 720 | $h = $g->copy(); 721 | $g = $f->copy(); 722 | $f = $e->copy(); 723 | $e = $d->add($t1); 724 | $d = $c->copy(); 725 | $c = $b->copy(); 726 | $b = $a->copy(); 727 | $a = $t1->add($t2); 728 | } 729 | 730 | // Add this chunk's hash to result so far 731 | $hash = array( 732 | $hash[0]->add($a), 733 | $hash[1]->add($b), 734 | $hash[2]->add($c), 735 | $hash[3]->add($d), 736 | $hash[4]->add($e), 737 | $hash[5]->add($f), 738 | $hash[6]->add($g), 739 | $hash[7]->add($h) 740 | ); 741 | } 742 | 743 | // Produce the final hash value (big-endian) 744 | // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) 745 | $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . 746 | $hash[4]->toBytes() . $hash[5]->toBytes(); 747 | if ($this->l != 48) { 748 | $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); 749 | } 750 | 751 | return $temp; 752 | } 753 | 754 | /** 755 | * Right Rotate 756 | * 757 | * @access private 758 | * @param Integer $int 759 | * @param Integer $amt 760 | * @see _sha256() 761 | * @return Integer 762 | */ 763 | function _rightRotate($int, $amt) 764 | { 765 | $invamt = 32 - $amt; 766 | $mask = (1 << $invamt) - 1; 767 | return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); 768 | } 769 | 770 | /** 771 | * Right Shift 772 | * 773 | * @access private 774 | * @param Integer $int 775 | * @param Integer $amt 776 | * @see _sha256() 777 | * @return Integer 778 | */ 779 | function _rightShift($int, $amt) 780 | { 781 | $mask = (1 << (32 - $amt)) - 1; 782 | return ($int >> $amt) & $mask; 783 | } 784 | 785 | /** 786 | * Not 787 | * 788 | * @access private 789 | * @param Integer $int 790 | * @see _sha256() 791 | * @return Integer 792 | */ 793 | function _not($int) 794 | { 795 | return ~$int & 0xFFFFFFFF; 796 | } 797 | 798 | /** 799 | * Add 800 | * 801 | * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the 802 | * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. 803 | * 804 | * @param Integer $... 805 | * @return Integer 806 | * @see _sha256() 807 | * @access private 808 | */ 809 | function _add() 810 | { 811 | static $mod; 812 | if (!isset($mod)) { 813 | $mod = pow(2, 32); 814 | } 815 | 816 | $result = 0; 817 | $arguments = func_get_args(); 818 | foreach ($arguments as $argument) { 819 | $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; 820 | } 821 | 822 | return fmod($result, $mod); 823 | } 824 | 825 | /** 826 | * String Shift 827 | * 828 | * Inspired by array_shift 829 | * 830 | * @param String $string 831 | * @param optional Integer $index 832 | * @return String 833 | * @access private 834 | */ 835 | function _string_shift(&$string, $index = 1) 836 | { 837 | $substr = substr($string, 0, $index); 838 | $string = substr($string, $index); 839 | return $substr; 840 | } 841 | } 842 | -------------------------------------------------------------------------------- /var/www/crypt/Random.php: -------------------------------------------------------------------------------- 1 | 13 | * 18 | * 19 | * 20 | * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy 21 | * of this software and associated documentation files (the "Software"), to deal 22 | * in the Software without restriction, including without limitation the rights 23 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 24 | * copies of the Software, and to permit persons to whom the Software is 25 | * furnished to do so, subject to the following conditions: 26 | * 27 | * The above copyright notice and this permission notice shall be included in 28 | * all copies or substantial portions of the Software. 29 | * 30 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 35 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 36 | * THE SOFTWARE. 37 | * 38 | * @category Crypt 39 | * @package Crypt_Random 40 | * @author Jim Wigginton 41 | * @copyright 2007 Jim Wigginton 42 | * @license http://www.opensource.org/licenses/mit-license.html MIT License 43 | * @link http://phpseclib.sourceforge.net 44 | */ 45 | 46 | // laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, 47 | // have phpseclib as a requirement as well. if you're developing such a program you may encounter 48 | // a "Cannot redeclare crypt_random_string()" error. 49 | if (!function_exists('crypt_random_string')) { 50 | /** 51 | * "Is Windows" test 52 | * 53 | * @access private 54 | */ 55 | define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); 56 | 57 | /** 58 | * Generate a random string. 59 | * 60 | * Although microoptimizations are generally discouraged as they impair readability this function is ripe with 61 | * microoptimizations because this function has the potential of being called a huge number of times. 62 | * eg. for RSA key generation. 63 | * 64 | * @param Integer $length 65 | * @return String 66 | * @access public 67 | */ 68 | function crypt_random_string($length) 69 | { 70 | if (CRYPT_RANDOM_IS_WINDOWS) { 71 | // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call. 72 | // ie. class_alias is a function that was introduced in PHP 5.3 73 | if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) { 74 | return mcrypt_create_iv($length); 75 | } 76 | // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, 77 | // to quote , "possible blocking behavior". as of 5.3.4 78 | // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both 79 | // call php_win32_get_random_bytes(): 80 | // 81 | // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 82 | // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 83 | // 84 | // php_win32_get_random_bytes() is defined thusly: 85 | // 86 | // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 87 | // 88 | // we're calling it, all the same, in the off chance that the mcrypt extension is not available 89 | if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) { 90 | return openssl_random_pseudo_bytes($length); 91 | } 92 | } else { 93 | // method 1. the fastest 94 | if (function_exists('openssl_random_pseudo_bytes')) { 95 | return openssl_random_pseudo_bytes($length); 96 | } 97 | // method 2 98 | static $fp = true; 99 | if ($fp === true) { 100 | // warning's will be output unles the error suppression operator is used. errors such as 101 | // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. 102 | $fp = @fopen('/dev/urandom', 'rb'); 103 | } 104 | if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() 105 | return fread($fp, $length); 106 | } 107 | // method 3. pretty much does the same thing as method 2 per the following url: 108 | // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 109 | // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're 110 | // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir 111 | // restrictions or some such 112 | if (function_exists('mcrypt_create_iv')) { 113 | return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); 114 | } 115 | } 116 | // at this point we have no choice but to use a pure-PHP CSPRNG 117 | 118 | // cascade entropy across multiple PHP instances by fixing the session and collecting all 119 | // environmental variables, including the previous session data and the current session 120 | // data. 121 | // 122 | // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) 123 | // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but 124 | // PHP isn't low level to be able to use those as sources and on a web server there's not likely 125 | // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use 126 | // however, a ton of people visiting the website. obviously you don't want to base your seeding 127 | // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled 128 | // by the user and (2) this isn't just looking at the data sent by the current user - it's based 129 | // on the data sent by all users. one user requests the page and a hash of their info is saved. 130 | // another user visits the page and the serialization of their data is utilized along with the 131 | // server envirnment stuff and a hash of the previous http request data (which itself utilizes 132 | // a hash of the session data before that). certainly an attacker should be assumed to have 133 | // full control over his own http requests. he, however, is not going to have control over 134 | // everyone's http requests. 135 | static $crypto = false, $v; 136 | if ($crypto === false) { 137 | // save old session data 138 | $old_session_id = session_id(); 139 | $old_use_cookies = ini_get('session.use_cookies'); 140 | $old_session_cache_limiter = session_cache_limiter(); 141 | $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; 142 | if ($old_session_id != '') { 143 | session_write_close(); 144 | } 145 | 146 | session_id(1); 147 | ini_set('session.use_cookies', 0); 148 | session_cache_limiter(''); 149 | session_start(); 150 | 151 | $v = $seed = $_SESSION['seed'] = pack('H*', sha1( 152 | serialize($_SERVER) . 153 | serialize($_POST) . 154 | serialize($_GET) . 155 | serialize($_COOKIE) . 156 | serialize($GLOBALS) . 157 | serialize($_SESSION) . 158 | serialize($_OLD_SESSION) 159 | )); 160 | if (!isset($_SESSION['count'])) { 161 | $_SESSION['count'] = 0; 162 | } 163 | $_SESSION['count']++; 164 | 165 | session_write_close(); 166 | 167 | // restore old session data 168 | if ($old_session_id != '') { 169 | session_id($old_session_id); 170 | session_start(); 171 | ini_set('session.use_cookies', $old_use_cookies); 172 | session_cache_limiter($old_session_cache_limiter); 173 | } else { 174 | if ($_OLD_SESSION !== false) { 175 | $_SESSION = $_OLD_SESSION; 176 | unset($_OLD_SESSION); 177 | } else { 178 | unset($_SESSION); 179 | } 180 | } 181 | 182 | // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. 183 | // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. 184 | // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the 185 | // original hash and the current hash. we'll be emulating that. for more info see the following URL: 186 | // 187 | // http://tools.ietf.org/html/rfc4253#section-7.2 188 | // 189 | // see the is_string($crypto) part for an example of how to expand the keys 190 | $key = pack('H*', sha1($seed . 'A')); 191 | $iv = pack('H*', sha1($seed . 'C')); 192 | 193 | // ciphers are used as per the nist.gov link below. also, see this link: 194 | // 195 | // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives 196 | switch (true) { 197 | case phpseclib_resolve_include_path('Crypt/AES.php'): 198 | if (!class_exists('Crypt_AES')) { 199 | include_once 'AES.php'; 200 | } 201 | $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); 202 | break; 203 | case phpseclib_resolve_include_path('Crypt/Twofish.php'): 204 | if (!class_exists('Crypt_Twofish')) { 205 | include_once 'Twofish.php'; 206 | } 207 | $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); 208 | break; 209 | case phpseclib_resolve_include_path('Crypt/Blowfish.php'): 210 | if (!class_exists('Crypt_Blowfish')) { 211 | include_once 'Blowfish.php'; 212 | } 213 | $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); 214 | break; 215 | case phpseclib_resolve_include_path('Crypt/TripleDES.php'): 216 | if (!class_exists('Crypt_TripleDES')) { 217 | include_once 'TripleDES.php'; 218 | } 219 | $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); 220 | break; 221 | case phpseclib_resolve_include_path('Crypt/DES.php'): 222 | if (!class_exists('Crypt_DES')) { 223 | include_once 'DES.php'; 224 | } 225 | $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); 226 | break; 227 | case phpseclib_resolve_include_path('Crypt/RC4.php'): 228 | if (!class_exists('Crypt_RC4')) { 229 | include_once 'RC4.php'; 230 | } 231 | $crypto = new Crypt_RC4(); 232 | break; 233 | default: 234 | user_error('crypt_random_string requires at least one symmetric cipher be loaded'); 235 | return false; 236 | } 237 | 238 | $crypto->setKey($key); 239 | $crypto->setIV($iv); 240 | $crypto->enableContinuousBuffer(); 241 | } 242 | 243 | //return $crypto->encrypt(str_repeat("\0", $length)); 244 | 245 | // the following is based off of ANSI X9.31: 246 | // 247 | // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf 248 | // 249 | // OpenSSL uses that same standard for it's random numbers: 250 | // 251 | // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c 252 | // (do a search for "ANS X9.31 A.2.4") 253 | $result = ''; 254 | while (strlen($result) < $length) { 255 | $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 256 | $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 257 | $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 258 | $result.= $r; 259 | } 260 | return substr($result, 0, $length); 261 | } 262 | } 263 | 264 | if (!function_exists('phpseclib_resolve_include_path')) { 265 | /** 266 | * Resolve filename against the include path. 267 | * 268 | * Wrapper around stream_resolve_include_path() (which was introduced in 269 | * PHP 5.3.2) with fallback implementation for earlier PHP versions. 270 | * 271 | * @param string $filename 272 | * @return mixed Filename (string) on success, false otherwise. 273 | * @access public 274 | */ 275 | function phpseclib_resolve_include_path($filename) 276 | { 277 | if (function_exists('stream_resolve_include_path')) { 278 | return stream_resolve_include_path($filename); 279 | } 280 | 281 | // handle non-relative paths 282 | if (file_exists($filename)) { 283 | return realpath($filename); 284 | } 285 | 286 | $paths = PATH_SEPARATOR == ':' ? 287 | preg_split('#(?