/** * Construct a group session for sending messages. * * @param senderKeyName The (groupId, senderId, deviceId) tuple. In this case, 'senderId' should be the caller. * @return A SenderKeyDistributionMessage that is individually distributed to each member of the group. */ public SenderKeyDistributionMessage Create(SenderKeyName senderKeyName) { lock (GroupCipher.LOCK) { try { SenderKeyRecord senderKeyRecord = senderKeyStore.LoadSenderKey(senderKeyName); if (senderKeyRecord.IsEmpty()) { senderKeyRecord.SetSenderKeyState(KeyHelper.GenerateSenderKeyId(), 0, KeyHelper.GenerateSenderKey(), KeyHelper.GenerateSenderSigningKey()); senderKeyStore.StoreSenderKey(senderKeyName, senderKeyRecord); } SenderKeyState state = senderKeyRecord.GetSenderKeyState(); return(new SenderKeyDistributionMessage(state.GetKeyId(), state.GetSenderChainKey().GetIteration(), state.GetSenderChainKey().GetSeed(), state.GetSigningKeyPublic())); } catch (InvalidKeyIdException e) { throw new Exception(e.Message); } catch (InvalidKeyException e) { throw new Exception(e.Message); } } }
/** * Construct a group session for receiving messages from senderKeyName. * * @param senderKeyName The (groupId, senderId, deviceId) tuple associated with the SenderKeyDistributionMessage. * @param senderKeyDistributionMessage A received SenderKeyDistributionMessage. */ public void Process(SenderKeyName senderKeyName, SenderKeyDistributionMessage senderKeyDistributionMessage) { lock (GroupCipher.LOCK) { SenderKeyRecord senderKeyRecord = senderKeyStore.LoadSenderKey(senderKeyName); senderKeyRecord.AddSenderKeyState(senderKeyDistributionMessage.GetId(), senderKeyDistributionMessage.GetIteration(), senderKeyDistributionMessage.GetChainKey(), senderKeyDistributionMessage.GetSignatureKey()); senderKeyStore.StoreSenderKey(senderKeyName, senderKeyRecord); } }
public override bool Equals(Object other) { if (other == null) { return(false); } if (!(other is SenderKeyName)) { return(false); } SenderKeyName that = (SenderKeyName)other; return (this.groupId.Equals(that.groupId) && this.sender.Equals(that.sender)); }
public GroupCipher(SenderKeyStore senderKeyStore, SenderKeyName senderKeyId) { this.senderKeyStore = senderKeyStore; this.senderKeyId = senderKeyId; }