Swiftpack.co - Package - OperatorFoundation/Flower

The Operator Foundation

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


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.


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.

  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.

  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.


Stars: 0
Help us keep the lights on



0.0.7 - Mar 27, 2019

Now compiles with Swift 5

0.0.6 - Jan 31, 2019

Added additional IP tunneling messages

0.0.5 - Jan 29, 2019

Added tunneling of raw IP packets

0.0.4 - Nov 2, 2018

Moved message stream functions to an extension on Connection

0.0.3 - Nov 1, 2018

Allowed endpoint initialization with direct values