Exemplo n.º 1
0
        /**
         * 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);
                }
            }
        }
Exemplo n.º 2
0
        /**
         * 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);
            }
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
 public GroupCipher(SenderKeyStore senderKeyStore, SenderKeyName senderKeyId)
 {
     this.senderKeyStore = senderKeyStore;
     this.senderKeyId    = senderKeyId;
 }