Delightfully simple delay-tolerant networking

Overview

Blizzard: Delightfully simple delay-tolerant networking

NOTE: I am in the process of updating this implementation to match a new spec. If you found this after I sent you an RFC please don't go spelunking because this implementation has much weaker privacy properties than what I'm attempting to accomplish with the RFC.

Blizzard is a protocol for setting up authenticated and encrypted channels. It is designed to be used in peer-to-peer networks where peers are not necessarily online at the same time i.e. it is a delay-tolerant protocol. Unlike most other DTN protocols, it's designed to be used on a microcontroller. This crate is no_std-compatible, but does require an allocator.

Blizzard is built on top of a no_std-compatible fork of snow, a noise protocol implementation. Blizzard uses the noise protocol framework to handle encryption and authentication, meaning there are zero (or perhaps one) bespoke usages of cryptographic primitives in this crate. The closest thing is the use of a key deriviation function to turn a noise public key into a 64-bit fingerprint. This fingerprint is used to address messages to a specific peer.

Blizzard does not handle any transport layer concerns. It is up to the user to send and receive messages over a transport. Blizzard messages can be sent over any transport, including unreliable transports like UDP, but it is currently up to the user to handle message ordering and retransmission. Noise does have facilities for handling these concerns, but Blizzard does not currently use them. This may change in the future.

Blizzard is not tolerant of sybil attacks, black-holing, or other malicious denial-of-service type behavior. Network operation is predicated on the assumption that peers are honest and will not attempt to disrupt the network, however bad actors should not be capable of compromising the security or anonymity guarantees of the protocol.

Forwarding logic has not yet been defined, so at the moment Blizzard is is only suitable for direct peer-to-peer connections.

Features

To the best of my knowledge, blizzard offers initiator anonymity, forward secrecy (each session uses ephemeral keys), authenticated and encrypted channels via the noise protocol framework, and some amount of plausible deniability of network topology. Blizzard does not offer information-theoretic anonymity guarantees for the recipient of a message, meaning packets are addressed to a specific peer who may be forced to reveal an association with the destination address in order to trigger delivery. Announces are built in a way that intentionally obfuscates network topology, meaning it may be difficult for an attacker to determine whether a node is the recipient of a message or merely a relay. This is not a guarantee of anonymity.

The main feature of Blizzard, though, is that it's a DTN protocol built for humans to understand. The entire protocol as of this writing is less than 1000 lines of code, including tests and documentation. The implementation itself is closer to 500 lines, and doesn't do anything scary. Building on top of snow is what makes this possible.

Usage

Blizzard is not ready for general use. The API should not be considered stable. It has not been simulated. It has not been audited.

Licensing

Blizzard is dual-licensed under Apache 2.0 and MIT.

You might also like...
 Achieve it! How you ask? Well, it's pretty simple; just use greatness!
Achieve it! How you ask? Well, it's pretty simple; just use greatness!

Greatness! Achieve it! How you ask? Well, it's pretty simple; just use greatness! Disclaimer I do not believe that greatness is the best. It fits a me

Beanstalk is a simple, fast work queue.

beanstalkd Simple and fast general purpose work queue.

A simple entity-component-system crate for rust with serialization support

Gallium A simple entity-component-system crate for rust with serialization support Usage You can include the library using carge: [dependencies] galli

A simple, external MCPE client. For learning purposes...

sage A simple, external MCPE client. For learning purposes... Current Cheats a VERY simple speed, it just edits the speed pointer TODO Clean-up code A

A simple induction and BMC engine.

Mikino is a (relatively) simple induction and BMC engine. Its goal is to serve as a simple yet interesting tool for those interested in formal verification, especially SMT-based induction.

Simple MHV6 extension used to download custom songs efficiently and effectively.

nong-downloader-extension A simple MegaHack v6 extension that helps you download NONG songs directly to GD. Compiling. Why would you want to compile??

Modrinth API is a simple library for using, you guessed it, the Modrinth API in Rust projects

Modrinth API is a simple library for using, you guessed it, the Modrinth API in Rust projects. It uses reqwest as its HTTP(S) client and deserialises responses to typed structs using serde.

Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset.
Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset.

HyperX Cloud Flight Battery Monitoring Introduction Simple tray application which shows battery level for HyperX Cloud Flight Wireless Headset. Screen

kindly is a simple Rust implementation of a set-user-ID-root program, similar to sudo but in a much reduced way.

kindly is a simple Rust implementation of a set-user-ID-root program, similar to sudo but in a much reduced way.

Owner
Ellen Poe
Software engineer and map connoisseur, @headwaymaps creator and former maintainer. Currently at @ramatakinc. Previously at @mapbox, @google and GaiaGPS.
Ellen Poe
This is a simple Telegram bot with interface to Firefly III to process and store simple transactions.

Firefly Telegram Bot Fireflies are free, so beautiful. (Les lucioles sont libres, donc belles.) ― Charles de Leusse, Les Contes de la nuit This is a s

null 13 Dec 14, 2022
Cassette A simple, single-future, non-blocking executor intended for building state machines.

Cassette A simple, single-future, non-blocking executor intended for building state machines. Designed to be no-std and embedded friendly. This execut

James Munns 50 Jan 2, 2023
Simple library to host lv2 plugins. Is not meant to support any kind of GUI.

lv2-host-minimal Simple library to host lv2 plugins. Is not meant to support any kind of GUI. Host fx plugins (audio in, audio out) Set parameters Hos

Cody Bloemhard 11 Aug 31, 2022
A simple programming language for everyone.

Slang A simple programming language for everyone, made with Rust. State In very early stages. Plan is to create a byte-code compiler and make that exe

Slang, Inc. 11 Jul 1, 2022
A copypastable guide to implementing simple derive macros in Rust.

A copypastable guide to implementing simple derive macros in Rust. The goal Let's say we have a trait with a getter trait MyTrait {

Imbolc 131 Dec 27, 2022
A simple bot for discord.

Rusky Um simples bot para o discord! ?? Executando ⚠️ Antes de tudo você precisa do Rust Instalado você pode instalar clicando aqui Preparando Primeir

Rusky 3 Aug 12, 2022
Simple POC for the Micriμm STM32F107 Evaluation Board

My motivation for this project was very simple: I wanted to blink some LEDs at "some rate(tm)" using entirely rust. I also did not want to use any of the embedded-std libs that were available, because I wanted to really get a feel for bit-banging the registers (including documenting where I grabbed the info from).

Sam Voss 6 Jul 19, 2022
Small and simple stateful applications, designed to facilitate the monitoring of unwanted behaviors of the same.

Violet Violet é um pequeno e simples monitorador de aplicação, voltado para receber eventos de erro e estado. Instalação simples: Dependencias: Docker

Lucas Mendes Campos 3 Jun 4, 2022
A Simple, But amazing telegram bot, Made using the Rust language!

Telegram bot in Rust A fun Telegram bot made using Rust language.

Deep Alchemy 2 Dec 21, 2021
a simple compiled language i made in rust. it uses intermediate representation (IR) instead of an abstract syntax tree (AST).

a simple compiled language i made in rust. it uses intermediate representation (IR) instead of an abstract syntax tree (AST).

null 4 Oct 3, 2022