public async Task <ChadderError> Login(string username, string password) { if (await DeviceExists() == false) { var temp = await CreateDevice(); if (temp != ChadderError.OK) { return(temp); } } password = await SharedUtil.GetPasswordHash(password); var devicePair = await KeyFactory.RefreshBook(db.LocalDevice.PrivateKeyBook); var devicePublic = await devicePair.GetPublicBook(); var request = new LoginParameter() { Username = username, Password = password, DeviceId = db.LocalDevice.DeviceId, PublicKey = devicePublic.Serialize(), RefreshToken = await CryptoHelper.CreateRandomData(32) }; await request.Sign(db.LocalDevice.PrivateKeyBook.GetMaster()); var response = await Session.PostRequestAPI <BasicResponse <string> >(Urls.Login, request); if (response.Error == ChadderError.OK) { var key = await CryptoHelper.CreateRandomData(32); sqlDB = await ChadderSQLUserDB.GetNewUserDatabase(response.Extra, key, InstanceId); db.LocalUser = new ChadderLocalUserInfo() { UserId = response.Extra, Name = username, RefreshToken = request.RefreshToken }; await sqlDB.InsertAsync(db.LocalUser); var keyPackage = new PlainBinary(key); var record = new ChadderLocalUserRecord() { UserId = response.Extra, Name = username, DatabaseKey = keyPackage.Serialize() }; var mainDB = await ChadderSQLMainDB.GetDatabase(InstanceId); await mainDB.InsertAsync(record); IsOnline = true; await FinishLoading(); } return(response.Error); }