Skip to content

Instantly share code, notes, and snippets.

@rastislavcore
Created January 16, 2024 18:25
Show Gist options
  • Save rastislavcore/301464e0a0b40b476ca2feaa82e86a3c to your computer and use it in GitHub Desktop.
Save rastislavcore/301464e0a0b40b476ca2feaa82e86a3c to your computer and use it in GitHub Desktop.
Executable to validate ICAN addresses for Linux & Mac
#!/bin/bash
read -p "Enter ICAN Address for validation: " ICAN_ADDRESS
CLEANED_ICAN=$(echo $ICAN_ADDRESS | tr '[:lower:]' '[:upper:]')
CLEANED_ICAN=${CLEANED_ICAN//[[:blank:]]/}
if ! [[ $CLEANED_ICAN =~ ^(CB|CE|AB)[0-9]{2}[A-F0-9]{40}$ ]]; then
echo "Invalid ICAN Address format!"
exit 1
fi
# Extract the country code, checksum, and main address part
COUNTRY_CODE=${CLEANED_ICAN:0:2}
CHECKSUM=${CLEANED_ICAN:2:2}
ADDRESS_PART=${CLEANED_ICAN:4}
# Reorder: put ADDRESS_PART first, then COUNTRY_CODE, then CHECKSUM
REORDERED_ICAN="${ADDRESS_PART}${COUNTRY_CODE}${CHECKSUM}"
# Convert each character to its numeric equivalent
SUM=""
for ((i=0; i<${#REORDERED_ICAN}; i++)); do
CHAR=${REORDERED_ICAN:$i:1}
# Convert hexadecimal to decimal
if [[ $CHAR =~ [0-9] ]]; then
SUM+=$CHAR
else
# Convert A-F to 10-15
DECIMAL_VALUE=$(( $(printf '%d' "'$CHAR") - 55 ))
SUM+=$DECIMAL_VALUE
fi
done
# Perform mod 97 check
OPERAND=${SUM}
if [[ $(echo "$OPERAND % 97" | bc) -eq 1 ]]; then
echo "Valid ICAN Address."
exit 0
else
echo "Invalid ICAN Address!"
exit 1
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment