131 lines
3.2 KiB
Bash
131 lines
3.2 KiB
Bash
#! /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
|