Swiftpack.co - Package - OperatorFoundation/Flower

The Operator Foundation

Operator makes useable tools to help people around the world with censorship, security, and privacy.

Flower

Flower is a simple protocol for packet encapsulation. The Flower library can be integrated into Swift applications running on iOS or macOS. The intended use case is for macOS and iOS Network Extensions. A Network Extension is the Apple-approved way to create custom VPN protocols.

Usage

Obtain a Connection

The Flower library does not provide connections. A Connection must be obtained elsewhere, either a NWConnection from the Network framework or any transport Connection type from the Shapeshifter library.

Example using an NWConnection
import Network

let conn = NWConnection(host: NWEndpoint.Host("localhost"), port: NWEndpoint.Port(integerLiteral: 5555), using: .tcp)
conn.start(queue: .global())
Example using Shapeshifter transport Connection
import Shapeshifter-Swift-Transports

// Only use Rot13 transport for examples, never for real deployments.
let factory = Rot13ConnectionFactory((host: NWEndpoint.Host("localhost"), port: NWEndpoint.Port(integerLiteral: 5555))
let conn = factory.connect(using: .tcp)

Create Message objects

Create Message objects for encapsulated packets.

Example using IPv4 packet
import Flower

let data = Data(repeating: 0x00, count: 80)
let message = Message.IPDataV4(data)
Example using IPv6 packet
import Flower

let data = Data(repeating: 0x00, count: 80)
let message = Message.IPDataV6(data)

Send Message objects over Connection

Flower extends the Connection protocol to include the sendMessage function. You can call sendMessage on any Connection.

conn.sendMessage(message)
{
  maybeError in
  
  // Handle errors while attempting to send message
}

Read Message objects from Connection

Flower extends the Connection protocol to include the readMessages function. You can call readMessages on any Connection.

conn.readMessages
{
  message in
  
  switch message
  {
    case .IPDataV4(let data):
      print("Received an IPv4 packet")
    case .IPDataV6(let data):
      print("Receieved an IPv6 packet")
  }
}

The readMessages function only needs to be called once. It will call the provided callback multiple times, once for each packet received.

Github

link
Stars: 0

Dependencies

Used By

Total: 0

Releases

Dual stack - 2020-09-14 17:21:41

Added IPv4/IPv6 dual stack address assignment support

Updated Datable - 2020-06-26 17:21:17

Updated Datable versions

Updated versions - 2020-06-26 17:18:17

Updated versions

Fixed Write Bug - 2020-05-19 20:57:11

Added Prints - 2020-05-13 21:37:03

DataUtils Bug Fix - 2020-05-12 18:09:17

MacOS 10.15 - 2020-04-07 00:41:52

swift-tools-version:5.1 - 2020-04-07 00:02:34

Require MacOS 10.14 or Later - 2020-04-06 23:55:28

Swift 5 compatiblity - 2019-03-27 18:54:29

Now compiles with Swift 5

More IP tunneling - 2019-01-31 18:47:54

Added additional IP tunneling messages

IP Tunneling - 2019-01-29 21:12:39

Added tunneling of raw IP packets

Connection extension - 2018-11-02 18:36:54

Moved message stream functions to an extension on Connection

Allowed endpoint initialization with direct values - 2018-11-01 22:36:48

Allowed endpoint initialization with direct values

Removed unnecessary src addresses - 2018-11-01 22:32:22

Removed unnecessary src addresses

Initial test release - 2018-11-01 21:43:08

Just for testing