| #! /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-CHDI 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="Linux-WUSB" |
| |
| devs="$(echo /sys/bus/usb/drivers/wusb-cbaf/[0-9]*)" |
| hdevs="$(find /sys -name wusb_chid -printf "%h\n")" |
| |
| result=0 |
| case $1 in |
| start) |
| for dev in ${2:-$hdevs} |
| do |
| uwb_rc=$(find $(dirname $(dirname $dev)) -iname uwb_rc:uwb*) |
| if cat $uwb_rc/uwb_rc/beacon | grep -q "channel: -1" |
| then |
| echo 13 0 | cat > $uwb_rc/uwb_rc/beacon |
| echo I: started beaconing on ch 13 in host $(basename $uwb_rc) |
| fi |
| echo $host_CHID | cat > $dev/wusb_chid |
| echo I: started host $(basename $dev) |
| done |
| ;; |
| set-chid) |
| shift |
| for dev in ${2:-$devs} |
| do |
| echo "${2:-$host_CHID}" "${3:-$host_band_group}" "${4:-$host_name}" \ |
| | cat > $dev/wusb_host_info |
| 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)" |
| cat > $dev/wusb_cc <<EOF |
| CDID:$CDID |
| CK:$CK |
| EOF |
| cat <<EOF |
| I: CC set |
| CHID: $host_CHID |
| CDID:$CDID |
| CK: $CK |
| EOF |
| done |
| ;; |
| help|h|--help|-h) |
| help |
| ;; |
| *) |
| echo "E: Unknown usage" 1>&2 |
| help 1>&2 |
| result=1 |
| esac |
| exit $result |