#! /bin/bash
#

set -e

progname=$(basename $0)
function help
{
    cat <<EOF
Usage: $progname COMMAND DEVICEs [ARGS]

Command for manipulating the pairing/authentication credentials of a
Wireless USB device that supports wired-mode Cable-Based-Association.

Works in conjunction with the wusb-cba.ko driver from http://linuxuwb.org.


DEVICE

 sysfs path to the device to authenticate; for example, both this
 guys are the same:

 /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.4/1-4.4:1.1
 /sys/bus/usb/drivers/wusb-cbaf/1-4.4:1.1

COMMAND/ARGS are

 start

   Start a WUSB host controller (by setting up a CHID)

 set-chid DEVICE HOST-CHID HOST-BANDGROUP HOST-NAME

   Sets host information in the device; after this you can call the
   get-cdid to see how does this device report itself to us.

 get-cdid DEVICE

   Get the device ID associated to the HOST-CHID we sent with
   'set-chid'. We might not know about it.

 set-cc DEVICE

   If we allow the device to connect, set a random new CDID and CK
   (connection key). Device saves them for the next time it wants to
   connect wireless. We save them for that next time also so we can
   authenticate the device (when we see the CDID he uses to id
   itself) and the CK to crypto talk to it.

CHID is always 16 hex bytes in 'XX YY ZZ...' form
BANDGROUP is almost always 0001

Examples:

  You can default most arguments to '' to get a sane value:

  $ $progname set-chid '' '' '' "My host name"

  A full sequence:

  $ $progname set-chid '' '' '' "My host name"
  $ $progname get-cdid ''
  $ $progname set-cc ''

EOF
}


# Defaults
# FIXME: CHID should come from a database :), band group from the host
host_CHID="00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"
host_band_group="0001"
host_name=$(hostname)

devs="$(echo /sys/bus/usb/drivers/wusb-cbaf/[0-9]*)"
hdevs="$(for h in /sys/class/uwb_rc/*/wusbhc; do readlink -f $h; done)"

result=0
case $1 in
    start)
        for dev in ${2:-$hdevs}
          do
          echo $host_CHID > $dev/wusb_chid
          echo I: started host $(basename $dev) >&2
        done
        ;;
    stop)
        for dev in ${2:-$hdevs}
          do
          echo 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > $dev/wusb_chid
          echo I: stopped host $(basename $dev) >&2
        done
        ;;
    set-chid)
        shift
        for dev in ${2:-$devs}; do
            echo "${4:-$host_name}" > $dev/wusb_host_name
            echo "${3:-$host_band_group}" > $dev/wusb_host_band_groups
            echo ${2:-$host_CHID} > $dev/wusb_chid
        done
        ;;
    get-cdid)
        for dev in ${2:-$devs}
          do
          cat $dev/wusb_cdid
        done
        ;;
    set-cc)
        for dev in ${2:-$devs}; do
            shift
            CDID="$(head --bytes=16 /dev/urandom  | od -tx1 -An)"
            CK="$(head --bytes=16 /dev/urandom  | od -tx1 -An)"
            echo "$CDID" > $dev/wusb_cdid
            echo "$CK" > $dev/wusb_ck

            echo I: CC set >&2
            echo "CHID: $(cat $dev/wusb_chid)"
            echo "CDID:$CDID"
            echo "CK:  $CK"
        done
        ;;
    help|h|--help|-h)
        help
        ;;
    *)
        echo "E: Unknown usage" 1>&2
        help 1>&2
        result=1
esac
exit $result
