Exemplo n.º 1
0
        /// <summary>
        /// The exchange key.
        /// </summary>
        /// <param name="requesterDetails">
        /// The requester details.
        /// </param>
        /// <param name="ntruKey">
        /// The contact information.
        /// </param>
        /// <param name="chatPasSalt">
        /// The chat Pas Salt.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// </returns>
        protected async Task ExchangeKey(Contact requesterDetails, IAsymmetricKey ntruKey, string chatPasSalt)
        {
            var encryptedChatPasSalt = new NtruKeyExchange(NTRUParamSets.NTRUParamNames.A2011743).Encrypt(ntruKey, Encoding.UTF8.GetBytes(chatPasSalt));

            await this.Messenger.SendMessageAsync(
                new Message(
                    MessageType.KeyExchange,
                    new TryteString(encryptedChatPasSalt.EncodeBytesAsString() + Constants.End),
                    new Address(requesterDetails.ChatKeyAddress)));
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public async Task <AddContactResponse> ExecuteAsync(AddContactRequest request)
        {
            try
            {
                var contactInformation = await this.Repository.LoadContactInformationByAddressAsync(request.ContactAddress);

                var requesterDetails = new Contact
                {
                    ChatAddress      = Seed.Random().ToString(),
                    ChatKeyAddress   = Seed.Random().ToString(),
                    Name             = request.Name,
                    ImageHash        = request.ImageHash,
                    ContactAddress   = request.RequestAddress.Value,
                    Request          = true,
                    Rejected         = false,
                    NtruKey          = null,
                    PublicKeyAddress = request.PublicKeyAddress.Value
                };

                await this.Messenger.SendMessageAsync(
                    new Message(MessageType.RequestContact, TryteString.FromUtf8String(JsonConvert.SerializeObject(requesterDetails)), contactInformation.ContactAddress));

                var encryptedChatPasSalt = new NtruKeyExchange(NTRUParamSets.NTRUParamNames.A2011743).Encrypt(
                    contactInformation.NtruKey,
                    Encoding.UTF8.GetBytes(Seed.Random() + Seed.Random().ToString().Substring(0, 20)));

                await this.Messenger.SendMessageAsync(
                    new Message(
                        MessageType.KeyExchange,
                        new TryteString(encryptedChatPasSalt.EncodeBytesAsString() + Constants.End),
                        new Address(requesterDetails.ChatKeyAddress)));

                await this.Repository.AddContactAsync(requesterDetails.ChatAddress, true, requesterDetails.PublicKeyAddress);

                return(new AddContactResponse {
                    Code = ResponseCode.Success
                });
            }
            catch (MessengerException exception)
            {
                return(new AddContactResponse {
                    Code = exception.Code
                });
            }
            catch (Exception)
            {
                return(new AddContactResponse {
                    Code = ResponseCode.UnkownException
                });
            }
        }
Exemplo n.º 3
0
        /// <inheritdoc />
        /// TODO: move the contact information uploading to contact repository
        public async Task <CreateUserResponse> ExecuteAsync(CreateUserRequest request)
        {
            try
            {
                var publicKeyAddress = this.AddressGenerator.GetAddress(request.Seed, SecurityLevel.Medium, 0);

                var requestAddress = publicKeyAddress.GetChunk(0, Address.Length - 12)
                                     .Concat(publicKeyAddress.GetChunk(Address.Length - 12, 12).TryteStringIncrement());

                var ntruKeyPair =
                    new NtruKeyExchange(NTRUParamSets.NTRUParamNames.A2011743).CreateAsymmetricKeyPair(request.Seed.Value.ToLower(), publicKeyAddress.Value);

                var publicKeyTrytes = ntruKeyPair.PublicKey.ToBytes().EncodeBytesAsString();

                var requestAddressPayload = new TryteString(publicKeyTrytes + Constants.LineBreak + requestAddress.Value + Constants.End);

                await this.Messenger.SendMessageAsync(new Message(MessageType.RequestContact, requestAddressPayload, publicKeyAddress));

                return(new CreateUserResponse
                {
                    Code = ResponseCode.Success,
                    NtruKeyPair = ntruKeyPair,
                    PublicKeyAddress = publicKeyAddress,
                    RequestAddress = new Address(requestAddress.Value)
                });
            }
            catch (MessengerException exception)
            {
                return(new CreateUserResponse {
                    Code = exception.Code
                });
            }
            catch (Exception)
            {
                return(new CreateUserResponse {
                    Code = ResponseCode.UnkownException
                });
            }
        }