base-files: add mtd_get_mac_encrypted_arcadyan function
authorMikhail Zhilkin <csharper2005@gmail.com>
Tue, 12 Jul 2022 14:52:04 +0000 (14:52 +0000)
committerChristian Marangi <ansuelsmth@gmail.com>
Fri, 19 Aug 2022 12:41:14 +0000 (14:41 +0200)
Some Arcadyan devices (e.g. MTS WG430223) keep their config in encrypted
mtd. This adds mtd_get_mac_encrypted_arcadyan() function to get the MAC
address from the encrypted partition. Function uses uencrypt utility for
decryption (and openssl if the uencrypt wasn't found).

Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>
package/base-files/files/lib/functions/system.sh

index 0ac291201452a01ab1ba4d96188990387f83576e..c17354d9457920fe71dc6887d56fd07e8bd0214d 100644 (file)
@@ -79,6 +79,37 @@ mtd_get_mac_ascii() {
        [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
 }
 
+mtd_get_mac_encrypted_arcadyan() {
+       local iv="00000000000000000000000000000000"
+       local key="2A4B303D7644395C3B2B7053553C5200"
+       local mac_dirty
+       local mtdname="$1"
+       local part
+       local size
+
+       part=$(find_mtd_part "$mtdname")
+       if [ -z "$part" ]; then
+               echo "mtd_get_mac_encrypted_arcadyan: partition $mtdname not found!" >&2
+               return
+       fi
+
+       # Config decryption and getting mac. Trying uencrypt and openssl utils.
+       size=$((0x$(dd if=$part skip=9 bs=1 count=4 2>/dev/null | hexdump -v -e '1/4 "%08x"')))
+       if [[ -f  "/usr/bin/uencrypt" ]]; then
+               mac_dirty=$(dd if=$part bs=1 count=$size skip=$((0x100)) 2>/dev/null | \
+                       uencrypt -d -n -k $key -i $iv | grep mac | cut -c 5-)
+       elif [[ -f  "/usr/bin/openssl" ]]; then
+               mac_dirty=$(dd if=$part bs=1 count=$size skip=$((0x100)) 2>/dev/null | \
+                       openssl aes-128-cbc -d -nopad -K $key -iv $iv | grep mac | cut -c 5-)
+       else
+               echo "mtd_get_mac_encrypted_arcadyan: Neither uencrypt nor openssl was found!" >&2
+               return
+       fi
+
+       # "canonicalize" mac
+       [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
+}
+
 mtd_get_mac_text() {
        local mtdname=$1
        local offset=$(($2))