#!/usr/bin/env bash # # SPDX-License-Identifier: GPL-2.0-or-later # # Parametrisation to this script is as follows: # * none yet ### # Preamble ### readonly my_path="$(dirname $(readlink -f $0))" readonly csv_path="$my_path/data" readonly log_path="$csv_path/logs" readonly img_path="$csv_path/images" readonly gnuplot_terminal="svg enhanced background rgb 'white' size 800 600" mkdir -p "$log_path" mkdir -p "$img_path" function cleanup() { echo OK } trap cleanup EXIT function error_out() { exit 1 } trap error_out INT TERM ### # Functions ### function cg() { csvgrep -c $1 -r $2 $3 } ### # Implementation ### readonly desc_block_ciphers="Benchmarks were done with growing sample size and averaging over\nprocessing of 128 samples of said sample size" readonly desc_asymmetric="Benchmarks were done with averaging over\nas many repetitions possible of the benchmarked operation in 1s" readonly desc_others="Benchmarks were done with 1MiB block size and averaging over\nas many repetitions possible of processing 5MiB data in 1s" readonly configs=$(find $csv_path -type d -name '*results*' | sed 's@.*results_@@g') ### # Symmetric crypto readonly sym="cbc ccm gcm" declare -A directions directions["dec"]="decryption" directions["enc"]="encryption" declare -A aad_sizes aad_sizes["no_AAD"]="0 Bytes" aad_sizes["custom"]="13 Bytes" aad_sizes["default"]="16 Bytes" # not pretty but works for me :) # CBC&GCM encryption is in software a lot faster than decryption, # therefor use the same Range on the Y-Axis to also have a visual indication. # This will break if something changes, so let the user override the value cbc_yrange="${cbc_yrange:=1400}" gcm_yrange="${gcm_yrange:=500}" for mode in $sym do infile="$csv_path/combined_${mode}.csv" for dir in ${!directions[@]} do plotstring= more_style= for cfg in $configs do for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u) do if [ "$mode" == "cbc" ]; then outfile=$log_path/${mode}${bsize}_${cfg}_${dir}.log val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')" if [ "$val" != "" ]; then echo "$val" > $outfile [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring}," plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize\"" fi [ "$mode" == "cbc" -a "$cbc_yrange" != "" ] && more_style="set yrange [ 0 : $cbc_yrange ]" else for aad in ${!aad_sizes[@]} do outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')" if [ "$val" != "" ]; then echo "$val" > $outfile [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring}," plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\"" fi done [ "$mode" == "gcm" -a "$gcm_yrange" != "" ] && more_style="set yrange [ 0 : $gcm_yrange ]" fi done done modep=${mode^^} gnuplot << EOF set terminal $gnuplot_terminal set title "${modep} ${directions[${dir}]} on Xilinx Versal" set x2label "${desc_block_ciphers}" set xlabel "Sample size" set ylabel "MiB/s" set style data lines $more_style set output "${img_path}/${mode}_${dir}.${gnuplot_terminal%% *}" $plotstring EOF done done ### # Also create separate graphs for AES-GCM-128 and -256 since that's too many lines in one image for mode in gcm do infile="$csv_path/combined_${mode}.csv" for dir in ${!directions[@]} do for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u) do plotstring= more_style="set yrange [ 0 : $gcm_yrange ]" for cfg in $configs do for aad in ${!aad_sizes[@]} do outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')" if [ "$val" != "" ]; then echo "$val" > $outfile [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring}," plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\"" fi done done modep=${mode^^} gnuplot << EOF set terminal $gnuplot_terminal set title "${modep}-${bsize} ${directions[${dir}]} on Xilinx Versal" set x2label "${desc_block_ciphers}" set xlabel "Sample size" set ylabel "MiB/s" set style data lines $more_style set output "${img_path}/${mode}${bsize}_${dir}.${gnuplot_terminal%% *}" $plotstring EOF done done done ### # Asymmetric crypto declare -A asym_operations asym_operations["ecc"]="keygen agree sign verify" asym_operations["rsa"]="keygen public private" for algo in ${!asym_operations[@]} do infile="$csv_path/combined_${algo}.csv" for op in ${asym_operations[$algo]} do outfile=$log_path/${algo}_${op}.log echo -n "" > $outfile for ksize in $(csvcut -c keysize $infile | tail -n +2 | sort -u) do for cfg in $configs do h="${algo^^}-$ksize" v=$(cg config $cfg $infile | cg operation $op | cg keysize $ksize | csvcut -c "avg ms" | tail -n +2 | tr ',' ' ') [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile done done algop=${algo^^} gnuplot << EOF set terminal $gnuplot_terminal set title "${algop} ${op} on Xilinx Versal" set x2label "${desc_asymmetric}" set xlabel 'Configurations' offset 0,-1 set ylabel "ms per op" set style fill solid set style line 1 lc rgb "grey50" set boxwidth 0.5 unset key set output "${img_path}/${algo}_${op}.${gnuplot_terminal%% *}" plot "$outfile" using :2:xtic(1) with boxes ls 1, \ '' using :2:2 w labels offset 0,0.7 EOF done done ### # Hashes declare -A hash_sizes hash_sizes["sha2"]="224 256 384 512" hash_sizes["sha3"]="384" plotstring= outfile=$log_path/sha.log echo -n "" > $outfile for algo in ${!hash_sizes[@]} do infile="$csv_path/combined_${algo}.csv" for hsize in ${hash_sizes[$algo]} do for cfg in $configs do h="${algo^^}-$hsize" v=$(cg config $cfg $infile | cg algorithm $h | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@') [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile done echo >> $outfile done done gnuplot << EOF set terminal $gnuplot_terminal set title "SHA2/SHA3 on Xilinx Versal" set x2label "${desc_others}" set xlabel 'Configurations' offset 0,-1 set ylabel "MiB/s" set style fill solid set style line 1 lc rgb "grey50" set boxwidth 0.5 unset key set output "${img_path}/sha.${gnuplot_terminal%% *}" plot "$outfile" using :2:xtic(1) with boxes ls 1, \ '' using :2:2 w labels offset 0,0.7 EOF ### # MACs declare -A macs macs["cmac"]="128 256" plotstring= outfile=$log_path/mac.log echo -n "" > $outfile for algo in ${!macs[@]} do infile="$csv_path/combined_${algo}.csv" for hsize in ${macs[$algo]} do for cfg in $configs do h="${algo^^}-$hsize" v=$(cg config $cfg $infile | cg keysize $hsize | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@') [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile done echo >> $outfile done done gnuplot << EOF set terminal $gnuplot_terminal set title "MAC's on Xilinx Versal" set x2label "${desc_others}" set xlabel 'Configurations' offset 0,-1 set ylabel "MiB/s" set style fill solid set style line 1 lc rgb "grey50" set boxwidth 0.5 unset key set yrange [ 0 : 500 ] set output "${img_path}/mac.${gnuplot_terminal%% *}" plot "$outfile" using :2:xtic(1) with boxes ls 1, \ '' using :2:2 w labels offset 0,0.7 EOF ### # RNG plotstring= outfile=$log_path/rng.log echo -n "" > $outfile for algo in rng do infile="$csv_path/combined_${algo}.csv" for cfg in $configs do h="${algo^^}" v=$(cg config $cfg $infile | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@') [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile done echo >> $outfile done gnuplot << EOF set terminal $gnuplot_terminal set title "RNG on Xilinx Versal" set x2label "${desc_others}" set xlabel 'Configurations' offset 0,-1 set ylabel "MiB/s" set style fill solid set style line 1 lc rgb "grey50" set boxwidth 0.5 unset key set yrange [ 0 : 50 ] with_unit(Value,Unit) = sprintf("%d %s", Value, Unit) set output "${img_path}/rng.${gnuplot_terminal%% *}" plot "$outfile" using :2:xtic(1) with boxes ls 1, \ '' using :2:2 w labels offset 0,0.7 EOF #eof