| #! /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 |