├── 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('#(?