README.md

# libsignal-protocol-elixir

Elixir wrapper for Signal Protocol NIF with OpenSSL 3.0+ compatibility.

## Installation

```elixir
def deps do
  [{:libsignal_protocol, "~> 0.1.0"}]
end
```

## Quick Start

```elixir
# Generate keys
{:ok, {public_key, signature}} = SignalProtocol.generate_identity_key_pair()
{:ok, {key_id, pre_key}} = SignalProtocol.generate_pre_key(1)

# Create session
{:ok, session} = SignalProtocol.create_session(local_key, remote_key)

# Encrypt/decrypt
{:ok, encrypted} = SignalProtocol.encrypt_message(session, "Hello")
{:ok, decrypted} = SignalProtocol.decrypt_message(session, encrypted)
```

## API

### SignalProtocol

- `generate_identity_key_pair()` → `{:ok, {public_key, signature}}`
- `generate_pre_key(id)` → `{:ok, {id, public_key}}`
- `generate_signed_pre_key(identity_key, id)` → `{:ok, {id, public_key, signature}}`
- `create_session(local, remote)` → `{:ok, session}`
- `encrypt_message(session, message)` → `{:ok, ciphertext}`
- `decrypt_message(session, ciphertext)` → `{:ok, plaintext}`

### SignalProtocol.Session

- `create(local, remote)` → `{:ok, session}`
- `send_message(session, message)` → `{:ok, ciphertext}`
- `receive_message(session, ciphertext)` → `{:ok, plaintext}`

### SignalProtocol.PreKeyBundle

- `create(reg_id, identity, pre_key, signed_pre_key, base_key)` → `{:ok, bundle}`
- `parse(bundle)` → `{:ok, bundle_data}`
- `verify_signature(bundle)` → `:ok`

## Build

```bash
cd wrappers/elixir
mix deps.get
mix compile
```

## Test

```bash
mix test
mix test --cover
```

## Requirements

- OpenSSL 3.0+
- Elixir 1.15+
- Erlang/OTP 25+

## License

MIT