diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..7287d18 Binary files /dev/null and b/.DS_Store differ diff --git a/registration/README.md b/registration/README.md new file mode 100644 index 0000000..3093bd5 --- /dev/null +++ b/registration/README.md @@ -0,0 +1,69 @@ +# Cache Registration + +Cache registration is the process that is typically necessary +for Apple devices to use the cache. + +Unfortunately, the request that registers the cache seems to be "signed". + +I did however figure out that the length of the signed payload is a Big Endian 32-bit integer before the payload. Still working out the signature format. + +```text +Registration URL: https://lcdn-registration.apple.com/lcdn/register +``` + +The un-signed request content looks like: + +```json +{ + "push-token": "fbFqxPukE8hfZD+Lbeo+E6390ih2lmY0I13apvLhZ6I=", + "ranked-peers": true, + "details": { + "capabilities": { + "ur": true, + "sc": true, + "pc": true, + "im": true, + "ns": true, + "query-parameters": true + }, + "cache-size": 230000000000, + "ac-power": true, + "is-portable": true, + "local-network": [ + { + "speed": 1300, + "wired": false + } + ] + }, + "local-ranges-only": true, + "local-ranges": [ + { + "first": "10.0.0.0", + "last": "10.0.255.255" + } + ], + "cache-software": [ + { + "type": "cache", + "name": "Caching Server", + "version": "233" + }, + { + "build": "19A583", + "type": "system", + "name": "Mac OS X", + "version": "10.15" + } + ], + "guid": "A14862D9-9643-4F18-B0BA-990BC2CAC0C2", + "local-addresses": [ + { + "address": "10.0.0.20", + "netmask": "255.255.0.0", + "port": "51391" + } + ], + "session-token": "1570938452471~46E0EE91164ABF1E4D42F7C3DC51B0747AD1BC3E7C9073CB6230D8F2191C40D9" +} +``` diff --git a/registration/cert.cer b/registration/cert.cer new file mode 100644 index 0000000..b1669e6 Binary files /dev/null and b/registration/cert.cer differ diff --git a/registration/decode-request.dart b/registration/decode-request.dart new file mode 100644 index 0000000..8fadfc5 --- /dev/null +++ b/registration/decode-request.dart @@ -0,0 +1,11 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +Future main(List args) async { + var signedRequestBase64 = (await new File("request.b64").readAsString()).trim(); + var signedJsonContent = base64.decode(signedRequestBase64); + var jsonContent = const Utf8Decoder(allowMalformed: true).convert(signedJsonContent); + jsonContent = jsonContent.substring(jsonContent.indexOf('{"'), jsonContent.lastIndexOf('"}') + 2); + print(jsonContent); +} diff --git a/registration/request.b64 b/registration/request.b64 new file mode 100644 index 0000000..58f758f --- /dev/null +++ b/registration/request.b64 @@ -0,0 +1 @@ +AgTJhMe66IUoYaGPdKG2o18Cjy0j3xUI1v6C9zzIwZJPAAAE0AUAAAABAAABgCFQkFHILJ4J+Im6F83b8717p8sZ2PHF8cEOPq1YyZ0roQ2oZyrSGkKRCBBbE7n2G0Ospt0FSXlUf/zq09g5wz+DdEkA6dZqOzU+w51C0L82YuzJfF3RgycUZo6SFrZdt4mrSKtXHPd/jMFU34QJq2Xm5jWWCUhikMvXq+uAfD8xzri1+IWmjfq1X/j+zdYcg5hxpvdeCcSBdJ7e/IWxpUhm61rdiumEHvJ77gR9jKamLhvSqatHw9m5lEG+4/hKp2WeR4C7NUeOAnkvY2LYU75sCIklOmTIRS1CKq0npI4KtIxD88j7TKKFLocTf5LjQy65THdiUOvmfAenz7XrDiJMNgm7k0w1DJhNIIdUZ5csd+igFev2CCkidPSnPtJuRBjWpYpjbrYo0TezgJuZNw0rNXPciqZMvmyX6cbmYdJw3qqRw/7GXyNZQ7hmr51GF2ozKg/VuFSDZ6my7tNSlmod0Fn2dQZow1jK74omAP71KM4ggUHvT7FLNu7wea1bDQAAAu57InB1c2gtdG9rZW4iOiJmYkZxeFB1a0U4aGZaRCtMYmVvK0U2MzkwaWgybG1ZMEkxM2FwdkxoWjZJPSIsInJhbmtlZC1wZWVycyI6dHJ1ZSwiZGV0YWlscyI6eyJjYXBhYmlsaXRpZXMiOnsidXIiOnRydWUsInNjIjp0cnVlLCJwYyI6dHJ1ZSwiaW0iOnRydWUsIm5zIjp0cnVlLCJxdWVyeS1wYXJhbWV0ZXJzIjp0cnVlfSwiY2FjaGUtc2l6ZSI6MjMwMDAwMDAwMDAwLCJhYy1wb3dlciI6dHJ1ZSwiaXMtcG9ydGFibGUiOnRydWUsImxvY2FsLW5ldHdvcmsiOlt7InNwZWVkIjoxMzAwLCJ3aXJlZCI6ZmFsc2V9XX0sImxvY2FsLXJhbmdlcy1vbmx5Ijp0cnVlLCJsb2NhbC1yYW5nZXMiOlt7ImZpcnN0IjoiMTAuMC4wLjAiLCJsYXN0IjoiMTAuMC4yNTUuMjU1In1dLCJjYWNoZS1zb2Z0d2FyZSI6W3sidHlwZSI6ImNhY2hlIiwibmFtZSI6IkNhY2hpbmcgU2VydmVyIiwidmVyc2lvbiI6IjIzMyJ9LHsiYnVpbGQiOiIxOUE1ODMiLCJ0eXBlIjoic3lzdGVtIiwibmFtZSI6Ik1hYyBPUyBYIiwidmVyc2lvbiI6IjEwLjE1In1dLCJndWlkIjoiQTE0ODYyRDktOTY0My00RjE4LUIwQkEtOTkwQkMyQ0FDMEMyIiwibG9jYWwtYWRkcmVzc2VzIjpbeyJhZGRyZXNzIjoiMTAuMC4wLjIwIiwibmV0bWFzayI6IjI1NS4yNTUuMC4wIiwicG9ydCI6IjUxMzkxIn1dLCJzZXNzaW9uLXRva2VuIjoiMTU3MDkzODQ1MjQ3MX40NkUwRUU5MTE2NEFCRjFFNEQ0MkY3QzNEQzUxQjA3NDdBRDFCQzNFN0M5MDczQ0I2MjMwRDhGMjE5MUM0MEQ5In0AAABPAb6eSqhKZey9w2klpinW1S6gg2WoAAAANgUFDc0xAHWFKY1zZq4D3DgIJF2injbZuT9oiFKp3k+RMYNXMnfTTcNZwW+Q+GGm0nDDzODN7wAA \ No newline at end of file diff --git a/registration/request.bin b/registration/request.bin new file mode 100644 index 0000000..c29d9bf Binary files /dev/null and b/registration/request.bin differ diff --git a/registration/session.b64 b/registration/session.b64 new file mode 100644 index 0000000..f78591a --- /dev/null +++ b/registration/session.b64 @@ -0,0 +1 @@ +AQhLLJFIHZt9oAcmx7kv90Q4KuOi7BdYPH0bANUqB0bIwG02tZSTwsV8lN3y9bIaGLJ0r9sewtGagjFdRUw1pDSOqcGxBJi9QGohoCBB1LAA5UBS/PXgJjaieRfiPEZL5JD3pK6PO7cGiPTbwAolPSaULPq/WbAorXRtO4W+1z6CZJ3cw/7MAjDT+Nb6+U5RhdQTXl3KRjyZxarwDfdFqT3PL6WRfk5NxeSUDmdh67W+D8QxXJM4jrPncdwrToC6RFyTm2FfAw059JOS1TB4zqo9ILUJCC4GdyGviCqCHOUF+ZiJrGi+oXp2FO05I7PY/EMlCjZvGydevxQCe/lh62bdRQz0UJRthVa8a7BCOCvG07WEezzDz01YAAAAIL1DLA+wcmVl/jeeNqW/+xXQwT2hCzc2WS6aodkxZTNPViDq38W2fZxEbrV4XMLFdYogbuI= \ No newline at end of file