Documentation
How it works

Flow

This page is a work in progress. It is a place to collect ideas and thoughts about a new way to visualize protocols.

Ideas

  • Get inspired by Debuggers where you can jump in and out of the code.
  • Allow to move forward to the next step (comment for each step)
  • Allow to jump out of a function (function is just giving context - is it needed? procedural might be better)
  • Protocol visualizer? (inspiration https://noiseexplorer.com/ (opens in a new tab))

Protocol Registration

// blind: the random blinding inverter(blinded_message, blind) = OPRF_blind(password)
blinded_message
evaluated_message = CreateRegistrationResponse(blinded_message, server_public_key, username, oprf_seed)
evaluated_message, server_public_key
(record, export_key) = FinalizeRegistrationRequest(password, blind, response, server_identity, client_identity)
record
// store the record associated with the username

Protocol Login

ke1 = GenerateKE1(password)
ke1
ke2 = GenerateKE2(server_identity, server_private_key, server_public_key, record, credential_identifier, oprf_seed, ke1)
ke2
(ke3, session_key, export_key) = GenerateKE3(client_identity, server_identity, ke2)
ke3
session_key = ServerFinish(ke3)

Password based authentication

Registration & Login

The issues with this approach is that the server receives the password in clear text.

OPAQUE

Registration

Login

Building Blocks

  • OPRF
  • Key Derivation Function (KDF)
  • Message Authentication Code (MAC)
  • Hash
  • Key Stretching Function (KSF)

Server Setup

A server generates a private/public key pair and a OPRF seed.

Registration

// Client

(request, blind) = CreateRegistrationRequest(password)

// Registration request (Client -> Server)

request

// Server

response = CreateRegistrationResponse(request,
                                       server_public_key,
                                       credential_identifier,
                                       oprf_seed)

// Registration response (Server -> Client)

response

// Client

(record, export_key) = FinalizeRegistrationRequest(response,
                                                    server_identity,
                                                    client_identity)

// Record (Server -> Client)

// Server

Store the record
// Client

ke1 = GenerateKE1(password)

// Registration request (Client -> Server)

// Server

ke2 = GenerateKE2(server_identity, server_private_key,
                    server_public_key, record,
                    credential_identifier, oprf_seed, ke1)

// Registration response (Server -> Client)

// Client

(ke3,session_key,export_key) = GenerateKE3(client_identity,
                               server_identity, ke2)

// Record (Server -> Client)

// Server

session_key = ServerFinish(ke3)

Authentication