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 }); }
/// <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 }); }
/// <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); }
/// <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); }
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()); }
/// <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); }