Skip to content

Instantly share code, notes, and snippets.

@rootmos
Created September 27, 2018 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rootmos/30fda04f0eba9d6a583bf21b9b18e965 to your computer and use it in GitHub Desktop.
Save rootmos/30fda04f0eba9d6a583bf21b9b18e965 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -o errexit
set -o pipefail
SCRIPT_DIR=$(readlink -f $0 | xargs dirname)
. $SCRIPT_DIR/lib.sh
owner "$1" | openssl dgst -binary -sha256 | bin_to_base64_url
#!/bin/bash
set -o errexit
SCRIPT_DIR=$(readlink -f $0 | xargs dirname)
. $SCRIPT_DIR/lib.sh
JSON=$1
OUT=$2
extract() {
jq -r .$1 $JSON | base64_url_to_bin | xxd -p -c 1000000000
}
openssl asn1parse -genconf - -noout -out $2.der <<EOF
asn1=SEQUENCE:private_key
[private_key]
version=INTEGER:0
modulus=INTEGER:0x$(extract n)
publicExponent=INTEGER:0x$(extract e)
privateExponent=INTEGER:0x$(extract d)
prime1=INTEGER:0x$(extract p)
prime2=INTEGER:0x$(extract q)
exponent1=INTEGER:0x$(extract dp)
exponent2=INTEGER:0x$(extract dq)
coefficient=INTEGER:0x$(extract qi)
EOF
openssl rsa -in $2.der -inform DER -outform PEM -out $2
rm $2.der
#!/bin/sh
bin_to_base64_url() {
openssl base64 -A | tr '+/' '-_' | tr -d '='
}
# https://raw.githubusercontent.com/Moodstocks/moodstocks-api-clients/master/bash/base64url.sh
decode() {
_l=$((${#1} % 4))
if [ $_l -eq 2 ]; then _s="$1"'=='
elif [ $_l -eq 3 ]; then _s="$1"'='
else _s="$1" ; fi
echo "$_s" | tr '_-' '/+' | openssl enc -d -a -A
}
base64_url_to_bin() {
decode $(tr -- '-_' '+/')
}
modulus() {
openssl rsa -in $1 -modulus -noout | cut -f2 -d=
}
owner() {
modulus "$1" | xxd -p -r
}
#!/bin/bash
set -o errexit
set -o pipefail
SCRIPT_DIR=$(readlink -f $0 | xargs dirname)
. $SCRIPT_DIR/lib.sh
KEY=$1
TARGET=$2
QUANTITY=$3
HOST=${HOST-arweave4.internal.nodes.upvest.co:1984}
WORKDIR=$(mktemp -d tx.XXXX)
SIGNING_DATA=$WORKDIR/signing_data
SIGNATURE=$WORKDIR/signature
REQUEST=$WORKDIR/request.json
trap "rm -r $WORKDIR" EXIT
calculate_reward() {
curl --silent --fail $HOST/price/0/$TARGET
}
last_tx() {
curl --silent --fail $HOST/wallet/$1/last_tx
}
sign() {
openssl pkeyutl -sign \
-inkey "$1" \
-in <(openssl dgst -binary -sha256 < "$2") \
-out "$3" \
-pkeyopt digest:sha256 \
-pkeyopt rsa_padding_mode:pss \
-pkeyopt rsa_pss_saltlen:20
}
LAST_TX=$(last_tx $($SCRIPT_DIR/address "$KEY"))
OWNER=$(owner "$KEY" | bin_to_base64_url)
REWARD=$(calculate_reward)
owner "$KEY" > $SIGNING_DATA
echo "$TARGET" | base64_url_to_bin >> $SIGNING_DATA
echo -n "$QUANTITY" >> $SIGNING_DATA
echo -n "$REWARD" >> $SIGNING_DATA
echo $LAST_TX | base64_url_to_bin >> $SIGNING_DATA
sign "$KEY" $SIGNING_DATA $SIGNATURE
ID=$(openssl dgst -binary -sha256 $SIGNATURE | bin_to_base64_url)
cat > $REQUEST <<EOF
{
"id": "$ID",
"last_tx": "$LAST_TX",
"data": "",
"owner": "$OWNER",
"target": "$TARGET",
"quantity": "$QUANTITY",
"reward": "$REWARD",
"signature": "$(bin_to_base64_url < $SIGNATURE)"
}
EOF
tr -d ' \t\n\r\f' < $REQUEST | curl --silent -X POST -H "content-type: application/json" -d@- $HOST/tx > /dev/null
echo $ID
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment