#!/bin/bash
set -euo pipefail

######
## A simple test ensuring openssl can use libcrypo for compress/ decompress
## and the linked zstd and zlib libraries seem to work.
###

FILE="random.bin"

cd $(dirname $0)

# 1. Check created random can be compressed.
openssl rand -out random.bin 10M
zstd -f random.bin

size1="$(wc -c < "${FILE}")"
size2="$(wc -c < "${FILE}.zst")"

if [ "$size1" -ge 10485760 ] && [ "$size2" -gt "$size1" ]
then
	echo "OK: created random is at least 10 MiB and can not be compressed"
else
	echo "FAIL: Random tested failed: created ${size1} bytes, compressed to ${size2} bytes." >&2
	exit 1
fi

# 2. Encrypt it
openssl rand -out key 32
openssl rand -out iv  16

openssl enc -aes-256-cbc -e -in ${FILE} -out ${FILE}.aes	\
	-K  "$(od -An -vtx1 "key" | tr -d ' \n')" 		\
	-iv "$(od -An -vtx1 "iv"  | tr -d ' \n')"

openssl enc -aes-256-cbc -d -in ${FILE}.aes -out ${FILE}.aes.dec \
	-K  "$(od -An -vtx1 "key" | tr -d ' \n')"		 \
	-iv "$(od -An -vtx1 "iv"  | tr -d ' \n')"

if cmp -s ${FILE} ${FILE}.aes.dec
then
	echo "OK: AES decrypted file matches original"
else
	echo "FAIL: decrypted file differs from original" >&2
	exit 1
fi

#3. Compress zstd
head -c 4096 /dev/zero > zeros
openssl zstd -e -in zeros -out zeros.zst
openssl zstd -d -in zeros.zst -out zeros.zst.dec

if cmp -s zeros zeros.zst.dec
then
	echo "OK: zstd decompressed file matches original"
else
	echo "FAIL: zstd decompressed file differs from original" >&2
	exit 1
fi

#4. Compress zlib
openssl zlib -e -in zeros -out zeros.zlib
openssl zlib -d -in zeros.zlib -out zeros.zlib.dec

if cmp -s zeros zeros.zlib.dec
then
	echo "OK: zlib decompressed file matches original"
else
	echo "FAIL: zlib decompressed file differs from original" >&2
	exit 1
fi

#5 Make sure compression did reduce the file size
size_zst=$(wc -c < zeros.zst)
size_zlib=$(wc -c < zeros.zlib)

if (( size_zst  * 10 < 4096 ))
then
	echo "OK: Compressed zst is at least a tenth the size ($size_zst)"
else
	echo "FAIL: Compressed is too big, ${size_zst}" >&2
	exit 1
fi

if (( size_zlib  * 2 < 4096 ))
then
	echo "OK: Compressed zlib is at least a tenth the size ($size_zlib)"
else
	echo "FAIL: Compressed is too big, ${size_zlib}" >&2
	exit 1
fi
