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