#!/bin/bash DURATION=${1:-3} THREADS=${2:-1} if ! [[ "$DURATION" =~ ^[0-9]+$ ]] || [ "$DURATION" -lt 1 ]; then echo "Usage: $0 [seconds] [threads]" >&2 echo "Example: $0 10 4" >&2 exit 1 fi if ! [[ "$THREADS" =~ ^[0-9]+$ ]] || [ "$THREADS" -lt 1 ]; then echo "Error: thread count must be an integer >= 1" >&2 exit 1 fi MULTI_FLAG=() [ "$THREADS" -gt 1 ] && MULTI_FLAG=(-multi "$THREADS") CIPHERS=("aes-128-gcm" "aes-256-gcm" "chacha20-poly1305") DEFAULT_SIZES=(16 64 256 1024 8192 16384) EXTRA_SIZES=(1440) SHOW_SIZES=(256 1024 1440 8192) declare -A VALS TOTAL=$(( ${#CIPHERS[@]} * 2 * DURATION )) echo "Running benchmarks (${DURATION}s per run, ${THREADS} thread(s), ~${TOTAL}s total)..." >&2 for cipher in "${CIPHERS[@]}"; do echo " → $cipher" >&2 # Standard run: produces results for 16/64/256/1024/8192/16384 B raw=$(openssl speed -seconds "$DURATION" "${MULTI_FLAG[@]}" -evp "$cipher" 2>&1) line=$(echo "$raw" | grep -i "^${cipher} ") i=0 while IFS= read -r val; do VALS["${cipher}_${DEFAULT_SIZES[$i]}"]="$val" i=$((i + 1)) done < <(echo "$line" | awk '{ for (j = 2; j <= NF; j++) { v = $j; gsub(/k/, "", v) printf "%.2f\n", v / 1000000 } }') # Separate run for 1440 B (WireGuard inner MTU) raw1440=$(openssl speed -seconds "$DURATION" "${MULTI_FLAG[@]}" -evp "$cipher" -bytes 1440 2>&1) line1440=$(echo "$raw1440" | grep -i "^${cipher} ") VALS["${cipher}_1440"]=$(echo "$line1440" | awk '{v=$2; gsub(/k/,"",v); printf "%.2f", v/1000000}') done C=11 W=$((24 + C * ${#SHOW_SIZES[@]})) SEP=$(printf '%.0s─' $(seq 1 $W)) echo "" echo " $(openssl version)" echo " CPU: $(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2 | xargs)" echo "" printf " %-24s" "Algorithm" for s in "${SHOW_SIZES[@]}"; do printf "%${C}s" "${s} B"; done echo "" printf " %-24s" "" for s in "${SHOW_SIZES[@]}"; do printf "%${C}s" "(GB/s)"; done echo "" echo " $SEP" for cipher in "${CIPHERS[@]}"; do printf " %-24s" "$cipher" for s in "${SHOW_SIZES[@]}"; do printf "%${C}s" "${VALS[${cipher}_${s}]:-—}" done echo "" done echo " $SEP" echo "" echo " * 1440 B — WireGuard inner MTU (separate run with -bytes 1440)." echo " * Duration: ${DURATION}s per run (-seconds ${DURATION})." echo " * Threads: ${THREADS} (-multi ${THREADS})." echo ""