private Unknown6 GenerateSignature(IEnumerable <IMessage> requests) { var accelNextZ = RandomDevice.NextInRange(5.8125, 10.125); //9,80665 var accelNextX = RandomDevice.NextInRange(-0.513123, 0.61231567); //Considering we handle phone only in 2 directions var accelNextY = Math.Sqrt(96.16744225D - accelNextZ * accelNextZ) * ((accelNextZ > 9.8) ? -1 : 1); var sig = new Signature { TimestampSinceStart = (ulong)_internalWatch.ElapsedMilliseconds, Timestamp = (ulong)DateTime.UtcNow.ToUnixTime(), DeviceInfo = new Signature.Types.DeviceInfo() { DeviceId = _settings.DeviceId, AndroidBoardName = _settings.AndroidBoardName, AndroidBootloader = _settings.AndroidBootloader, DeviceBrand = _settings.DeviceBrand, DeviceModel = _settings.DeviceModel, DeviceModelIdentifier = _settings.DeviceModelIdentifier, DeviceModelBoot = _settings.DeviceModelBoot, HardwareManufacturer = _settings.HardwareManufacturer, HardwareModel = _settings.HardwareModel, FirmwareBrand = _settings.FirmwareBrand, FirmwareTags = _settings.FirmwareTags, FirmwareType = _settings.FirmwareType, FirmwareFingerprint = _settings.FirmwareFingerprint } }; sig.SensorInfo.Add(new Signature.Types.SensorInfo { GravityZ = accelNextZ, GravityX = accelNextX, GravityY = accelNextY, TimestampSnapshot = (ulong)_internalWatch.ElapsedMilliseconds - 230, MagneticFieldX = accelNextX * 10, MagneticFieldY = -20 + -20 * accelNextY / 9.8065, MagneticFieldZ = -40 * accelNextZ / 9.8065, AttitudePitch = Math.Acos(accelNextX / 9.8065), AttitudeRoll = Math.Acos(accelNextY / 9.8065), AttitudeYaw = Math.Acos(accelNextZ / 9.8065), LinearAccelerationX = RandomDevice.NextInRange(-0.005, 0.005), LinearAccelerationY = RandomDevice.NextInRange(0.5, 1), LinearAccelerationZ = RandomDevice.NextInRange(-0.05, 0.05), RotationRateX = RandomDevice.NextInRange(-0.0001, 0.0001), RotationRateY = RandomDevice.NextInRange(-0.0005, 0.0005), RotationRateZ = RandomDevice.NextInRange(-0.003, 0.003), MagneticFieldAccuracy = RandomDevice.Next(10), Status = 3 }); sig.LocationFix.Add(new Signature.Types.LocationFix() { Provider = "fused", //Unk4 = 120, Latitude = (float)_latitude, Longitude = (float)_longitude, Altitude = (float)_altitude, Speed = -1, Course = -1, //TimestampSinceStart = (ulong)InternalWatch.ElapsedMilliseconds - 200, TimestampSnapshot = (ulong)_internalWatch.ElapsedMilliseconds - 200, Floor = 3, HorizontalAccuracy = (float)Math.Round(RandomDevice.NextInRange(4, 10), 6), //10 VerticalAccuracy = RandomDevice.Next(3, 7), ProviderStatus = 3, LocationType = 1 }); //Compute 10 byte[] serializedTicket = _authTicket.ToByteArray(); uint firstHash = HashBuilder.Hash32(serializedTicket); var locationBytes = BitConverter.GetBytes(_latitude).Reverse() .Concat(BitConverter.GetBytes(_longitude).Reverse()) .Concat(BitConverter.GetBytes(_altitude).Reverse()).ToArray(); sig.LocationHash1 = HashBuilder.Hash32Salt(locationBytes, firstHash); //Compute 20 sig.LocationHash2 = HashBuilder.Hash32(locationBytes); //Compute 24 ulong seed = HashBuilder.Hash64(_authTicket.ToByteArray()); foreach (var req in requests) { sig.RequestHash.Add(HashBuilder.Hash64Salt64(req.ToByteArray(), seed)); } //static for now //sig.Unk22 = ByteString.CopyFrom(0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F); sig.SessionHash = SessionHash; sig.Unknown25 = 16892874496697272497; //16892874496697272497; //7363665268261373700; //-8537042734809897855; var val = new Unknown6 { RequestType = 6, Unknown2 = new Unknown6.Types.Unknown2 { Unknown1 = ByteString.CopyFrom(PCrypt.encrypt(sig.ToByteArray(), (uint)sig.TimestampSinceStart)) } }; return(val); }
public RequestEnvelope SetRequestEnvelopeUnknown6(RequestEnvelope requestEnvelope) { if (_sessionHash == null) { _sessionHash = new byte[32]; _random.NextBytes(_sessionHash); } byte[] authSeed = requestEnvelope.AuthTicket != null? requestEnvelope.AuthTicket.ToByteArray() : requestEnvelope.AuthInfo.ToByteArray(); var normAccel = new Vector(_deviceInfo.Sensors.AccelRawX, _deviceInfo.Sensors.AccelRawY, _deviceInfo.Sensors.AccelRawZ); normAccel.NormalizeVector(1.0f);//1.0f on iOS, 9.81 on Android? var sig = new Signature { LocationHash1 = Utils.GenerateLocation1(authSeed, requestEnvelope.Latitude, requestEnvelope.Longitude, requestEnvelope.Accuracy, _deviceInfo.VersionData.HashSeed1), LocationHash2 = Utils.GenerateLocation2(requestEnvelope.Latitude, requestEnvelope.Longitude, requestEnvelope.Accuracy, _deviceInfo.VersionData.HashSeed1), SessionHash = ByteString.CopyFrom(_sessionHash), Unknown25 = _deviceInfo.VersionData.VersionHash, Timestamp = (ulong)DateTime.UtcNow.ToUnixTime(), TimestampSinceStart = (ulong)_deviceInfo.TimeSnapshot, SensorInfo = new Signature.Types.SensorInfo { AccelNormalizedX = normAccel.X, AccelNormalizedY = normAccel.Y, AccelNormalizedZ = normAccel.Z, AccelRawX = -_deviceInfo.Sensors.AccelRawX, AccelRawY = -_deviceInfo.Sensors.AccelRawY, AccelRawZ = -_deviceInfo.Sensors.AccelRawZ, MagnetometerX = _deviceInfo.Sensors.MagnetometerX, MagnetometerY = _deviceInfo.Sensors.MagnetometerY, MagnetometerZ = _deviceInfo.Sensors.MagnetometerZ, GyroscopeRawX = _deviceInfo.Sensors.GyroscopeRawX, GyroscopeRawY = _deviceInfo.Sensors.GyroscopeRawY, GyroscopeRawZ = _deviceInfo.Sensors.GyroscopeRawZ, AngleNormalizedX = _deviceInfo.Sensors.AngleNormalizedX, AngleNormalizedY = _deviceInfo.Sensors.AngleNormalizedY, AngleNormalizedZ = _deviceInfo.Sensors.AngleNormalizedZ, AccelerometerAxes = _deviceInfo.Sensors.AccelerometerAxes, TimestampSnapshot = (ulong)(_deviceInfo.Sensors.TimeSnapshot - _random.Next(150, 260)) }, DeviceInfo = new Signature.Types.DeviceInfo { DeviceId = _deviceInfo.DeviceID, AndroidBoardName = _deviceInfo.AndroidBoardName, AndroidBootloader = _deviceInfo.AndroidBootloader, DeviceBrand = _deviceInfo.DeviceBrand, DeviceModel = _deviceInfo.DeviceModel, DeviceModelBoot = _deviceInfo.DeviceModelBoot, DeviceModelIdentifier = _deviceInfo.DeviceModelIdentifier, FirmwareFingerprint = _deviceInfo.FirmwareFingerprint, FirmwareTags = _deviceInfo.FirmwareTags, HardwareManufacturer = _deviceInfo.HardwareManufacturer, HardwareModel = _deviceInfo.HardwareModel, FirmwareBrand = _deviceInfo.FirmwareBrand, FirmwareType = _deviceInfo.FirmwareType }, ActivityStatus = _deviceInfo.ActivityStatus != null ? new Signature.Types.ActivityStatus() { Walking = _deviceInfo.ActivityStatus.Walking, Automotive = _deviceInfo.ActivityStatus.Automotive, Cycling = _deviceInfo.ActivityStatus.Cycling, Running = _deviceInfo.ActivityStatus.Running, Stationary = _deviceInfo.ActivityStatus.Stationary, Tilting = _deviceInfo.ActivityStatus.Tilting, } : null }; if (_deviceInfo.GpsSattelitesInfo.Length > 0) { sig.GpsInfo = new Signature.Types.AndroidGpsInfo(); //sig.GpsInfo.TimeToFix //currently not filled _deviceInfo.GpsSattelitesInfo.ToList().ForEach(sat => { sig.GpsInfo.Azimuth.Add(sat.Azimuth); sig.GpsInfo.Elevation.Add(sat.Elevation); sig.GpsInfo.HasAlmanac.Add(sat.Almanac); sig.GpsInfo.HasEphemeris.Add(sat.Emphasis); sig.GpsInfo.SatellitesPrn.Add(sat.SattelitesPrn); sig.GpsInfo.Snr.Add(sat.Snr); sig.GpsInfo.UsedInFix.Add(sat.UsedInFix); }); } _deviceInfo.LocationFixes.ToList().ForEach(loc => sig.LocationFix.Add(new Signature.Types.LocationFix { Floor = loc.Floor, Longitude = loc.Longitude, Latitude = loc.Latitude, Altitude = loc.Altitude, LocationType = loc.LocationType, Provider = loc.Provider, ProviderStatus = loc.ProviderStatus, HorizontalAccuracy = loc.HorizontalAccuracy, VerticalAccuracy = loc.VerticalAccuracy, Course = loc.Course, Speed = loc.Speed, TimestampSnapshot = loc.TimeSnapshot })); foreach (var request in requestEnvelope.Requests) { sig.RequestHash.Add( Utils.GenerateRequestHash(authSeed, request.ToByteArray(), _deviceInfo.VersionData.HashSeed1) ); } requestEnvelope.Unknown6 = new Unknown6 { RequestType = 6, Unknown2 = new Unknown6.Types.Unknown2 { EncryptedSignature = ByteString.CopyFrom(PCrypt.encrypt(sig.ToByteArray(), (uint)_deviceInfo.TimeSnapshot)) } }; return(requestEnvelope); }