Created
January 16, 2024 18:25
-
-
Save rastislavcore/301464e0a0b40b476ca2feaa82e86a3c to your computer and use it in GitHub Desktop.
Executable to validate ICAN addresses for Linux & Mac
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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