Esempio n. 1
0
        public NewDeviceLinkResult FinishNewDeviceRegistration(IdentityKeyPair tempIdentity, string signalingKey, string password, bool sms, bool fetches, int regid, string name)
        {
            ProvisionMessage pm = ProvisioningSocket.GetProvisioningMessage(tempIdentity);
            string           provisioningCode = pm.ProvisioningCode;

            byte[] publicKeyBytes = pm.IdentityKeyPublic.ToByteArray();
            if (publicKeyBytes.Length == 32)
            {
                byte[] type = { Curve.DJB_TYPE };
                publicKeyBytes = ByteUtil.combine(type, publicKeyBytes);
            }
            ECPublicKey publicKey = Curve.decodePoint(publicKeyBytes, 0);

            byte[]          privateKeyBytes = pm.IdentityKeyPrivate.ToByteArray();
            ECPrivateKey    privateKey      = Curve.decodePrivatePoint(privateKeyBytes);
            IdentityKeyPair identity        = new IdentityKeyPair(new IdentityKey(publicKey), privateKey);

            pushServiceSocket = new PushServiceSocket(Urls, new StaticCredentialsProvider(pm.Number, password, null, -1), userAgent);
            int deviceId = pushServiceSocket.finishNewDeviceRegistration(provisioningCode, signalingKey, sms, fetches, regid, name);

            return(new NewDeviceLinkResult()
            {
                DeviceId = deviceId,
                Identity = identity,
                Number = pm.Number
            });
        }
Esempio n. 2
0
        /// <summary>
        /// Fetch a ProvisionMessage from the server.
        /// </summary>
        /// <param name="token"></param>
        /// <param name="tempIdentity"></param>
        /// <returns></returns>
        public async Task <SignalServiceProvisionMessage> GetProvisioningMessage(CancellationToken token, IdentityKeyPair tempIdentity)
        {
            ProvisionMessage protoPm = await ProvisioningSocket.GetProvisioningMessage(token, tempIdentity);

            string provisioningCode = protoPm.ProvisioningCode;

            byte[] publicKeyBytes = protoPm.IdentityKeyPublic.ToByteArray();
            if (publicKeyBytes.Length == 32)
            {
                byte[] type = { Curve.DJB_TYPE };
                publicKeyBytes = ByteUtil.combine(type, publicKeyBytes);
            }
            ECPublicKey publicKey = Curve.decodePoint(publicKeyBytes, 0);

            byte[]          privateKeyBytes = protoPm.IdentityKeyPrivate.ToByteArray();
            ECPrivateKey    privateKey      = Curve.decodePrivatePoint(privateKeyBytes);
            IdentityKeyPair identity        = new IdentityKeyPair(new IdentityKey(publicKey), privateKey);

            return(new SignalServiceProvisionMessage()
            {
                Number = protoPm.Number,
                Identity = identity,
                Code = protoPm.ProvisioningCode
            });
        }
Esempio n. 3
0
        /// <summary>
        /// TODO
        /// </summary>
        /// <param name="deviceIdentifier"></param>
        /// <param name="deviceKey"></param>
        /// <param name="identityKeyPair"></param>
        /// <param name="profileKey"></param>
        /// <param name="code"></param>
        /// <param name="token"></param>
        /// <exception cref="InvalidKeyException"><</exception>
        /// <exception cref="IOException"></exception>
        public async Task AddDeviceAsync(string deviceIdentifier,
                                         ECPublicKey deviceKey,
                                         IdentityKeyPair identityKeyPair,
                                         byte[] profileKey,
                                         string code,
                                         CancellationToken?token = null)
        {
            if (token == null)
            {
                token = CancellationToken.None;
            }

            ProvisioningCipher cipher  = new ProvisioningCipher(deviceKey);
            ProvisionMessage   message = new ProvisionMessage
            {
                IdentityKeyPublic  = ByteString.CopyFrom(identityKeyPair.getPublicKey().serialize()),
                IdentityKeyPrivate = ByteString.CopyFrom(identityKeyPair.getPrivateKey().serialize()),
                Number             = credentials.E164,
                ProvisioningCode   = code
            };

            if (profileKey != null)
            {
                message.ProfileKey = ByteString.CopyFrom(profileKey);
            }

            byte[] ciphertext = cipher.Encrypt(message);
            await pushServiceSocket.SendProvisioningMessageAsync(deviceIdentifier, ciphertext, token);
        }
Esempio n. 4
0
        /// <summary>
        /// Fetch a ProvisionMessage from the server.
        /// </summary>
        /// <param name="tempIdentity"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <SignalServiceProvisionMessage> GetProvisioningMessageAsync(IdentityKeyPair tempIdentity, CancellationToken?token = null)
        {
            if (token == null)
            {
                token = CancellationToken.None;
            }

            if (provisioningSocket == null)
            {
                throw new NullReferenceException($"{nameof(provisioningSocket)} is null. Maybe you forgot to call GetNewDeviceUuid?");
            }
            ProvisionMessage protoPm = await provisioningSocket.GetProvisioningMessageAsync(tempIdentity, token);

            string provisioningCode = protoPm.ProvisioningCode;

            byte[] publicKeyBytes = protoPm.IdentityKeyPublic.ToByteArray();
            if (publicKeyBytes.Length == 32)
            {
                byte[] type = { Curve.DJB_TYPE };
                publicKeyBytes = ByteUtil.combine(type, publicKeyBytes);
            }
            ECPublicKey publicKey = Curve.decodePoint(publicKeyBytes, 0);

            byte[]          privateKeyBytes = protoPm.IdentityKeyPrivate.ToByteArray();
            ECPrivateKey    privateKey      = Curve.decodePrivatePoint(privateKeyBytes);
            IdentityKeyPair identity        = new IdentityKeyPair(new IdentityKey(publicKey), privateKey);

            return(new SignalServiceProvisionMessage()
            {
                Number = protoPm.Number,
                Identity = identity,
                Code = protoPm.ProvisioningCode
            });
        }
        public async void addDevice(string deviceIdentifier,
                                    ECPublicKey deviceKey,
                                    IdentityKeyPair identityKeyPair,
                                    string code)//throws InvalidKeyException, IOException
        {
            ProvisioningCipher cipher  = new ProvisioningCipher(deviceKey);
            ProvisionMessage   message = ProvisionMessage.CreateBuilder()
                                         .SetIdentityKeyPublic(ByteString.CopyFrom(identityKeyPair.getPublicKey().serialize()))
                                         .SetIdentityKeyPrivate(ByteString.CopyFrom(identityKeyPair.getPrivateKey().serialize()))
                                         .SetNumber(user)
                                         .SetProvisioningCode(code)
                                         .Build();

            byte[] ciphertext = cipher.encrypt(message);
            await this.pushServiceSocket.sendProvisioningMessage(deviceIdentifier, ciphertext);
        }
Esempio n. 6
0
        public void addDevice(string deviceIdentifier,
                              ECPublicKey deviceKey,
                              IdentityKeyPair identityKeyPair,
                              string code)//throws InvalidKeyException, IOException
        {
            ProvisioningCipher cipher  = new ProvisioningCipher(deviceKey);
            ProvisionMessage   message = new ProvisionMessage
            {
                IdentityKeyPublic  = ByteString.CopyFrom(identityKeyPair.getPublicKey().serialize()),
                IdentityKeyPrivate = ByteString.CopyFrom(identityKeyPair.getPrivateKey().serialize()),
                Number             = user,
                ProvisioningCode   = code
            };

            byte[] ciphertext = cipher.encrypt(message);
            this.pushServiceSocket.sendProvisioningMessage(deviceIdentifier, ciphertext);
        }
        public byte[] encrypt(ProvisionMessage message)// throws InvalidKeyException
        {
            ECKeyPair ourKeyPair = Curve.generateKeyPair();
            byte[] sharedSecret = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey());
            byte[] derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, Encoding.UTF8.GetBytes("TextSecure Provisioning Message"), 64);
            byte[][] parts = Util.split(derivedSecret, 32, 32);

            byte[] version = { 0x01 };
            byte[] ciphertext = getCiphertext(parts[0], message.ToByteArray());
            byte[] mac = getMac(parts[1], Util.join(version, ciphertext));
            byte[] body = Util.join(version, ciphertext, mac);

            return ProvisionEnvelope.CreateBuilder()
                                    .SetPublicKey(ByteString.CopyFrom(ourKeyPair.getPublicKey().serialize()))
                                    .SetBody(ByteString.CopyFrom(body))
                                    .Build()
                                    .ToByteArray();
        }
        public byte[] encrypt(ProvisionMessage message)// throws InvalidKeyException
        {
            ECKeyPair ourKeyPair = Curve.generateKeyPair();

            byte[]   sharedSecret  = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey());
            byte[]   derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, Encoding.UTF8.GetBytes("TextSecure Provisioning Message"), 64);
            byte[][] parts         = Util.split(derivedSecret, 32, 32);

            byte[] version    = { 0x01 };
            byte[] ciphertext = getCiphertext(parts[0], message.ToByteArray());
            byte[] mac        = getMac(parts[1], Util.join(version, ciphertext));
            byte[] body       = Util.join(version, ciphertext, mac);

            return(ProvisionEnvelope.CreateBuilder()
                   .SetPublicKey(ByteString.CopyFrom(ourKeyPair.getPublicKey().serialize()))
                   .SetBody(ByteString.CopyFrom(body))
                   .Build()
                   .ToByteArray());
        }
Esempio n. 9
0
        /// <summary>
        /// TODO
        /// </summary>
        /// <param name="token"></param>
        /// <param name="deviceIdentifier"></param>
        /// <param name="deviceKey"></param>
        /// <param name="identityKeyPair"></param>
        /// <param name="profileKey"></param>
        /// <param name="code"></param>
        public async Task AddDevice(CancellationToken token,
                                    string deviceIdentifier,
                                    ECPublicKey deviceKey,
                                    IdentityKeyPair identityKeyPair,
                                    byte[] profileKey,
                                    string code)//throws InvalidKeyException, IOException
        {
            ProvisioningCipher cipher  = new ProvisioningCipher(deviceKey);
            ProvisionMessage   message = new ProvisionMessage
            {
                IdentityKeyPublic  = ByteString.CopyFrom(identityKeyPair.getPublicKey().serialize()),
                IdentityKeyPrivate = ByteString.CopyFrom(identityKeyPair.getPrivateKey().serialize()),
                Number             = User,
                ProvisioningCode   = code
            };

            if (profileKey != null)
            {
                message.ProfileKey = ByteString.CopyFrom(profileKey);
            }

            byte[] ciphertext = cipher.encrypt(message);
            await PushServiceSocket.SendProvisioningMessage(token, deviceIdentifier, ciphertext);
        }