#!/bin/bash function die() { echo "$*" >&2 exit 1 } if (( $# != 2));then die "usage: overonion e|d keyfile" fi mode=$1 if [[ "$mode" != e && "$mode" != d ]];then die "Use 'e' for encrypt or 'd' for decrypt" fi keyfile=$2 if [[ ! -e "$keyfile" ]];then die "Keyfile not found" fi if [[ ! -r "$keyfile" ]];then die "Cannot read keyfile" fi num_layers=$(wc -l < "$keyfile") if (( num_layers < 20 ));then die "Keyfile doesn't have enough layers to be an onion" fi if [[ "$mode" == e ]];then first_layer=$num_layers next_layer=-1 openssl_decrypt="" else first_layer=1 next_layer=1 openssl_decrypt="-d" fi function go() { layer=$1 if (( layer == 0 || layer > num_layers ));then cat else openssl enc $openssl_decrypt "-$(sed -n "${layer}s/ .*//p" "$keyfile")" \ -pass fd:37 37< <(sed -n "${layer}s/^[^ ]* //p" "$keyfile") | go $(( layer + next_layer )) fi } go "$first_layer"