public async Task <E2EUser> GetUserById(string userId) { Guid.Parse(userId); await SemaphoreSlim.WaitAsync(); try { var contact = await this.contacts.Get(userId); Debug.Assert(contact.Id == userId); E2EUser user = E2EUserSerializer.Deserialize(contact.CryptographicInformation); if (user == null) // for example, when the contact has just been added { user = new E2EUser { DynamicPrivateDecryptionKeys = new Dictionary <long, byte[]>() } } ; user.UserId = userId; user.StaticPublicKey = contact.StaticPublicKey; return(user); } finally { SemaphoreSlim.Release(); } }
public static byte[] Serialize(E2EUser u) { byte[] serialized = PocoSerializer.Begin() //.Append(m.UserId) // Ignore //.Append(m.StaticPublicKey) // Ignore .Append(u.LatestDynamicPublicKey) .Append(u.LatestDynamicPublicKeyId) .Append(u.AuthSecret) .Append(u.DynamicPrivateDecryptionKeys) .Finish(); return(serialized); }
public async Task UpdateUser(E2EUser user) { Guid.Parse(user.UserId); await SemaphoreSlim.WaitAsync(); try { Identity contact = await this.contacts.Get(user.UserId); var serialized = E2EUserSerializer.Serialize(user); contact.CryptographicInformation = serialized; await this.contacts.Update(contact); } finally { SemaphoreSlim.Release(); } }
public static E2EUser Deserialize(byte[] serializedE2EUser) { if (serializedE2EUser == null) { return(null); } try { var u = new E2EUser(); var ser = PocoSerializer.GetDeserializer(serializedE2EUser); // not setting UserId, StaticPublicKey here! u.LatestDynamicPublicKey = ser.MakeByteArray(0); u.LatestDynamicPublicKeyId = ser.MakeInt64(1); u.AuthSecret = ser.MakeByteArray(2); u.DynamicPrivateDecryptionKeys = ser.MakeDictLongByteArray(3); return(u); } catch (Exception) { return(null); } }