From 55731922e84c46c610bb8417fcfc3a9daffe7ff4 Mon Sep 17 00:00:00 2001 From: Denis Kasak Date: Mon, 4 Oct 2021 12:49:16 +0200 Subject: [PATCH] Add decision tree model of the key sharing algorithm. And a tool to render it. Signed-off-by: Denis Kasak --- contrib/key-sharing-algorithm/Makefile | 15 +++++++ contrib/key-sharing-algorithm/README.md | 11 +++++ contrib/key-sharing-algorithm/model.dot | 45 +++++++++++++++++++ .../key-sharing-algorithm/setdotlabelwidth | 37 +++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 contrib/key-sharing-algorithm/Makefile create mode 100644 contrib/key-sharing-algorithm/README.md create mode 100644 contrib/key-sharing-algorithm/model.dot create mode 100755 contrib/key-sharing-algorithm/setdotlabelwidth diff --git a/contrib/key-sharing-algorithm/Makefile b/contrib/key-sharing-algorithm/Makefile new file mode 100644 index 000000000..d09ba88b3 --- /dev/null +++ b/contrib/key-sharing-algorithm/Makefile @@ -0,0 +1,15 @@ +.PHONY: default clean png pdf + +default: model.png model.pdf + +clean: + rm -f model.png model.pdf + +pdf: model.pdf +png: model.png + +model.pdf: model.dot + ./setdotlabelwidth 45 allow_verified [label="Yes"] + verified_device_check -> outbound_session_check [label="No"] + + /* Does the outbound session exist? */ + outbound_session_check -> outbound_exists [label="Yes"] + outbound_session_check -> own_device_check [label="No"] + + /* Previously shared? */ + outbound_exists -> previously_shared [label="Yes"] + outbound_exists -> refuse_not_shared [label="No"] + + /* Requesting device sender key matches key it was shared with? */ + previously_shared -> allow_limited [label="Yes"] + previously_shared -> refuse_device_key_changed [label="No"] + + /* Is this our own device? */ + own_device_check -> refuse_untrusted_own_device [label="Yes"] + own_device_check -> refuse_missing_outbound_session [label="No"] +} diff --git a/contrib/key-sharing-algorithm/setdotlabelwidth b/contrib/key-sharing-algorithm/setdotlabelwidth new file mode 100755 index 000000000..c4c18cc00 --- /dev/null +++ b/contrib/key-sharing-algorithm/setdotlabelwidth @@ -0,0 +1,37 @@ +#!/usr/bin/perl +# +# Adapted from https://stackoverflow.com/a/68057031 + +use strict; + +my $usage = "setdotlabelwidth [char-width] < [dotfile]"; +my $width = shift() or die("Usage: $usage $!"); + +while() +{ + if (m/label="(.*?)"/) + { + my $labeltext = $1; + my @words = split(/ +|(?=\\n)/, $labeltext); + my @newtext = (); + my $newline = ""; + foreach my $word(@words) + { + if (length($newline) > 0 and + length($newline) + length($word) > $width) + { + push(@newtext, $newline); + $newline = ""; + } + + $newline .= " " if (length($newline) > 0); + $newline .= $word; + } + + push(@newtext, $newline) if (length($newline) > 0); + my $newlabel = join("\\n", @newtext); + s/label=".*?"/label="$newlabel"/; + } + + print; +}