| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 1 | #! /bin/bash | 
|  | 2 | # | 
|  | 3 |  | 
|  | 4 | set -e | 
|  | 5 |  | 
|  | 6 | progname=$(basename $0) | 
|  | 7 | function help | 
|  | 8 | { | 
|  | 9 | cat <<EOF | 
|  | 10 | Usage: $progname COMMAND DEVICEs [ARGS] | 
|  | 11 |  | 
|  | 12 | Command for manipulating the pairing/authentication credentials of a | 
|  | 13 | Wireless USB device that supports wired-mode Cable-Based-Association. | 
|  | 14 |  | 
|  | 15 | Works in conjunction with the wusb-cba.ko driver from http://linuxuwb.org. | 
|  | 16 |  | 
|  | 17 |  | 
|  | 18 | DEVICE | 
|  | 19 |  | 
|  | 20 | sysfs path to the device to authenticate; for example, both this | 
|  | 21 | guys are the same: | 
|  | 22 |  | 
|  | 23 | /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.4/1-4.4:1.1 | 
|  | 24 | /sys/bus/usb/drivers/wusb-cbaf/1-4.4:1.1 | 
|  | 25 |  | 
|  | 26 | COMMAND/ARGS are | 
|  | 27 |  | 
|  | 28 | start | 
|  | 29 |  | 
|  | 30 | Start a WUSB host controller (by setting up a CHID) | 
|  | 31 |  | 
|  | 32 | set-chid DEVICE HOST-CHID HOST-BANDGROUP HOST-NAME | 
|  | 33 |  | 
|  | 34 | Sets host information in the device; after this you can call the | 
|  | 35 | get-cdid to see how does this device report itself to us. | 
|  | 36 |  | 
|  | 37 | get-cdid DEVICE | 
|  | 38 |  | 
|  | 39 | Get the device ID associated to the HOST-CHDI we sent with | 
|  | 40 | 'set-chid'. We might not know about it. | 
|  | 41 |  | 
|  | 42 | set-cc DEVICE | 
|  | 43 |  | 
|  | 44 | If we allow the device to connect, set a random new CDID and CK | 
|  | 45 | (connection key). Device saves them for the next time it wants to | 
|  | 46 | connect wireless. We save them for that next time also so we can | 
|  | 47 | authenticate the device (when we see the CDID he uses to id | 
|  | 48 | itself) and the CK to crypto talk to it. | 
|  | 49 |  | 
|  | 50 | CHID is always 16 hex bytes in 'XX YY ZZ...' form | 
|  | 51 | BANDGROUP is almost always 0001 | 
|  | 52 |  | 
|  | 53 | Examples: | 
|  | 54 |  | 
|  | 55 | You can default most arguments to '' to get a sane value: | 
|  | 56 |  | 
|  | 57 | $ $progname set-chid '' '' '' "My host name" | 
|  | 58 |  | 
|  | 59 | A full sequence: | 
|  | 60 |  | 
|  | 61 | $ $progname set-chid '' '' '' "My host name" | 
|  | 62 | $ $progname get-cdid '' | 
|  | 63 | $ $progname set-cc '' | 
|  | 64 |  | 
|  | 65 | EOF | 
|  | 66 | } | 
|  | 67 |  | 
|  | 68 |  | 
|  | 69 | # Defaults | 
|  | 70 | # FIXME: CHID should come from a database :), band group from the host | 
|  | 71 | host_CHID="00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff" | 
|  | 72 | host_band_group="0001" | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 73 | host_name=$(hostname) | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 74 |  | 
|  | 75 | devs="$(echo /sys/bus/usb/drivers/wusb-cbaf/[0-9]*)" | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 76 | hdevs="$(for h in /sys/class/uwb_rc/*/wusbhc; do readlink -f $h; done)" | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 77 |  | 
|  | 78 | result=0 | 
|  | 79 | case $1 in | 
|  | 80 | start) | 
|  | 81 | for dev in ${2:-$hdevs} | 
|  | 82 | do | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 83 | uwb_rc=$(readlink -f $dev/uwb_rc) | 
|  | 84 | if cat $uwb_rc/beacon | grep -q -- "-1" | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 85 | then | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 86 | echo 13 0 > $uwb_rc/beacon | 
|  | 87 | echo I: started beaconing on ch 13 on $(basename $uwb_rc) >&2 | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 88 | fi | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 89 | echo $host_CHID > $dev/wusb_chid | 
|  | 90 | echo I: started host $(basename $dev) >&2 | 
|  | 91 | done | 
|  | 92 | ;; | 
|  | 93 | stop) | 
|  | 94 | for dev in ${2:-$hdevs} | 
|  | 95 | do | 
|  | 96 | echo 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > $dev/wusb_chid | 
|  | 97 | echo I: stopped host $(basename $dev) >&2 | 
|  | 98 | uwb_rc=$(readlink -f $dev/uwb_rc) | 
|  | 99 | echo -1 | cat > $uwb_rc/beacon | 
|  | 100 | echo I: stopped beaconing on $(basename $uwb_rc) >&2 | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 101 | done | 
|  | 102 | ;; | 
|  | 103 | set-chid) | 
|  | 104 | shift | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 105 | for dev in ${2:-$devs}; do | 
|  | 106 | echo "${4:-$host_name}" > $dev/wusb_host_name | 
|  | 107 | echo "${3:-$host_band_group}" > $dev/wusb_host_band_groups | 
|  | 108 | echo ${2:-$host_CHID} > $dev/wusb_chid | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 109 | done | 
|  | 110 | ;; | 
|  | 111 | get-cdid) | 
|  | 112 | for dev in ${2:-$devs} | 
|  | 113 | do | 
|  | 114 | cat $dev/wusb_cdid | 
|  | 115 | done | 
|  | 116 | ;; | 
|  | 117 | set-cc) | 
| Felipe Zimmerle | f1fa035 | 2008-09-17 16:34:42 +0100 | [diff] [blame] | 118 | for dev in ${2:-$devs}; do | 
|  | 119 | shift | 
|  | 120 | CDID="$(head --bytes=16 /dev/urandom  | od -tx1 -An)" | 
|  | 121 | CK="$(head --bytes=16 /dev/urandom  | od -tx1 -An)" | 
|  | 122 | echo "$CDID" > $dev/wusb_cdid | 
|  | 123 | echo "$CK" > $dev/wusb_ck | 
|  | 124 |  | 
|  | 125 | echo I: CC set >&2 | 
|  | 126 | echo "CHID: $(cat $dev/wusb_chid)" | 
|  | 127 | echo "CDID:$CDID" | 
|  | 128 | echo "CK:  $CK" | 
| Inaky Perez-Gonzalez | 99d368b | 2008-09-17 16:34:04 +0100 | [diff] [blame] | 129 | done | 
|  | 130 | ;; | 
|  | 131 | help|h|--help|-h) | 
|  | 132 | help | 
|  | 133 | ;; | 
|  | 134 | *) | 
|  | 135 | echo "E: Unknown usage" 1>&2 | 
|  | 136 | help 1>&2 | 
|  | 137 | result=1 | 
|  | 138 | esac | 
|  | 139 | exit $result |