typelogic / react-native-bluetooth-secure

A Secure Bluetooth React Native Library With Authenticated Encryption
MIT License
0 stars 0 forks source link

Description

A secure & pairless Bluetooth transport layer with Authenticated Encryption.

Notes

SecureSend is a test React Native application that uses this library.

Installation

npm install --save react-native-bluetooth-secure

In your main App.tsx file:

import BluetoothApi from "react-native-bluetooth-secure"

API Description

The app that displays the QR code shall generate the ephemeral connection parameters:

var params = BluetoothApi.getConnectionParameters()
console.log(params)

// Use any out-of-band mechanism to communicate the value of params to the other device.
// For example, you can use a QR code generator library to display params.
// Or the two communicating parties already have a pre-shared value of params.

The params looks like:

{
  "cid": "1ejpu",
  "pk": "819176777955C098B78BAF949084A4484AEC5A769CED2307D59E46DC85A0F758"
}

The app that scans the QR code shall set its connection parameters:

// Use any out-of-band mechanism to get the value of params of the other device.
// For example, you can use a QR code scanning library to scan the QR code if the receiver is using QR code to communicate this value.
// Or the two communicating parties already have a pre-shared value of params.

BluetoothApi.setConnectionParameters(params)

Both apps shall setup the connection:

BluetoothApi.createConnection("dual", () => {
  // A secure Bluetooth connection is created
  // Anytime, either app may call BluetoothApi.send()
})

Once the connection is created, either app can send a string message.

BluetoothApi.send(msg, () => {
  // message sent
})

The app can intentionally tear down the connection.

BluetoothApi.destroyConnection()

The app must handle Nearby events in order to receive messages, to monitor transfer status of incoming/outgoing messages, or to monitor connection related events:

BluetoothApi.handleNearbyEvents((event) => {
    console.log(event.type)
    switch (event.type) {
    case "msg":
    this.setState({
      msg: event.data,
    });
    break;

    case "onDisconnected":
    console.log("onDisconnected:" + event.data)
    this.setState({
      msg: "",
    });
    break;

    case "transferupdate":
    console.log("transferupdate:" + event.data)
    break;

    default:
    break;
  }

})

The app can print native debug logs by:

BluetoothApi.handleLogEvents((event) => {
  console.log(event.log)
})

This secure Bluetooth communication library needs to be used with another mechanism, for example a QR code, for the cryptographic public key exchange. The public key is used to secure the payload with Authenticated Encryption.