File: ehpuzzle

package info (click to toggle)
libequihash 1.0.10-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 208 kB
  • sloc: cpp: 391; ansic: 235; sh: 75; makefile: 56; python: 44
file content (70 lines) | stat: -rwxr-xr-x 1,890 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/sh

set -e

usage() {
    echo "usage:"
    echo "$ cat secret_key | $0 challenge n k /path/to/data >challenge"
    echo "$ $0 solve challenge >solution"
    echo "$ cat secret_key | $0 verify /path/to/challenge /path/to/solution"
    exit 0
}

challenge() {
    [ "${#}" -ne 3 ] && usage

    secret_key="$(cat)"
    n=$1
    k=$2
    data="$(cat "$3")"
    ts="$(date +%s)"
    sig=$(printf "%s %s %s %s" "$n" "$k" "$ts" "$data" | openssl dgst -sha256 -binary -hmac "$secret_key")
    printf "%s%s %s %s %s" "$sig" "$n" "$k" "$ts" "$data"
}

solve() {
    [ "${#}" -ne 1 ] && usage
    puzzle="$1"
    tail -c +33 "$puzzle" | {
        read -r n k ts data || true
        ehwait equihash solve -n "$n" -k "$k" -f "$puzzle" -s /dev/stdout
    }
}

const_cmp() {
    res=0
    for i in $(seq 0 31); do
        res=$((res | ($(printf "%d" "'${1:i:1}") ^ $(printf "%d" "'${2:i:1}") ) ))
    done
    return $res
}
#const_cmp "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" && echo ok || echo meh
#const_cmp "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb" && echo ok || echo meh
#const_cmp "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" && echo ok || echo meh

verify() {
    [ "${#}" -ne 2 ] && usage
    secret_key="$(cat)"
    puzzle="$1"
    solution="$2"
    sig="$(head -c 32 "$puzzle")"
    msg="$(tail -c +33 "$puzzle")"
    echo "$msg" | {
        read -r n k ts data || true
        sig2=$(printf "%s" "$msg" | openssl dgst -sha256 -binary -hmac "$secret_key")
        const_cmp "$sig" "$sig2" || {
            echo "error: invalid challenge"
            exit 1
        }
        equihash verify -v -n "$n" -k "$k" -f "$puzzle" -s "$solution"
        exit $?
    }
}

case "$1" in
    challenge) shift; challenge "${@}";;
    solve) shift; solve "${@}";;
    verify) shift; verify "${@}";;
    *) usage;;
esac