]>
git.scottworley.com Git - overonion/blob - overonion
50d1958e5f2c03a85185222d201a53e9bee046f9
13 die
"usage: overonion e|d keyfile"
16 if [[ "$mode" != e
&& "$mode" != d
]];then
17 die
"Use 'e' for encrypt or 'd' for decrypt"
20 if [[ ! -e "$keyfile" ]];then
21 die
"Keyfile not found"
23 if [[ ! -r "$keyfile" ]];then
24 die
"Cannot read keyfile"
27 num_layers
=$(wc -l < "$keyfile")
28 if (( num_layers
< 20 ));then
29 die
"Keyfile doesn't have enough layers to be an onion"
32 hash_fields
=$(awk '/^openssl-dgst / { print NF }' "$keyfile" | uniq )
34 if [[ "$mode" == e
]];then
35 first_layer
=$num_layers
38 if [[ "$hash_fields" != 4 ]];then
39 die
"Refusing to encrypt with already-used key"
45 if [[ "$hash_fields" != 5 ]];then
46 die
"Key does not appear to have been used for encryption (it has no embedded hashes). Refusing to decrypt."
51 awk -vline="$1" 'NR == line' "$keyfile"
55 awk -vline="$1" -vfield="$2" 'NR == line { print $field }' "$keyfile"
60 if (( layer
== 0 || layer
> num_layers
));then
63 operation
=$(keyfield "$layer" 1)
64 if [[ "$operation" == openssl
-enc ]];then
65 openssl enc
$openssl_decrypt "-$(keyfield "$layer" 2)" \
66 -nosalt -pass fd
:37 37< <(keyfield
"$layer" 3)
67 elif [[ "$operation" == reverse
]];then
68 "$(dirname "$0")/reverse"
69 elif [[ "$operation" == openssl
-dgst ]];then
70 tee >(echo "$(keyline "$layer") $(
72 keyfield "$layer" 3 | base64 -d
74 keyfield "$layer" 4 | base64 -d
76 openssl dgst -binary "-$(keyfield "$layer" 2)" |
77 base64 --wrap=0)" > "$hash_dir/$layer")
79 die
"Unknown operation"
81 go
$(( layer + next_layer ))
87 for hash_result
in "$hash_dir"/*;do
88 layer
=$(basename "$hash_result")
89 if [[ "$mode" == e
]];then
90 # Add the hashes to keyfile
91 key_aside_dir
=$(mktemp -d "$keyfile.XXXXXXXXXX")
92 key_aside
="$key_aside_dir/key.orig"
93 mv "$keyfile" "$key_aside"
94 sed "${layer}s,.*,$(< "$hash_result")," "$key_aside" > "$keyfile"
96 rmdir "$key_aside_dir"
99 if [[ "$(awk '{ print $5 == $6 ? "hash ok" : "mismatch" }' "$hash_result")" != "hash ok" ]];then
100 die
"Hash check $layer failed"