TLV8

A small library that decodes and encodes TLV8 according to Apple's specifications. It is intended to be compatible with TLV8 data structures used by HomeKit.

This TLV8 library is written by Charles Gutjahr, but was inspired by elixir_tlv. That library implements the ASN.1 BER-TLV format, a format that is somewhat similar to the Apple TLV8 format but is sufficiently different for that library to be unsuitable for working with Apple TLV8.

Licensed under the MIT license, see the LICENSE file for details.

Installation

Add tlv8 to your list of dependencies in mix.exs:

def deps do
  [{:tlv8, "~> 0.1.0"}]
end

Examples

Decoding TLVs

Use TLV8.decode to extract a list of TLV8 items from the given binary data.

# Decoding binary data containing a single TLV8
iex> TLV8.decode(<<0xFF, 0x02, 0x03, 0x04>>)
[%TLV8{type: 255, value: <<3, 4>>}]

# Decoding binary data containing multiple TLV8s
iex> TLV8.decode(<<0x06, 0x01, 0x03, 0x01, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f>>)
[%TLV8{type: 6, value: <<3>>}, %TLV8{type: 1, value: "hello"}]

# Invalid TLV8
iex> TLV8.decode(<<0x80, 0x02, 0x00>>)
[:invalid_tlv8]

Encoding TLVs

Use TLV8.encode to generate TLV8 binary data from either a single TLV8 item or a list of TLV8 items.

# Encoding a single TLV8
iex> TLV8.encode(%TLV8{type: 0xFF, value: <<0x03, 0x04>>})
<<0xFF, 0x02, 0x03, 0x04>>

# Encoding multiple TLV8s
iex> TLV8.encode([%TLV8{type: 0x06, value: <<0x03>>}, %TLV8{type: 1, value: "hello"}])
<<0x06, 0x01, 0x03, 0x01, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f>>

# Encoding an invalid TLV8 type
iex> TLV8.encode([%TLV8{type: 0x00, value: <<>>}, %TLV8{type: 0x100, value: <<0x00>>}])
:invalid_tlv8