Skip to content

Commit

Permalink
usb: Upstream protected interface class tests
Browse files Browse the repository at this point in the history
The set of protected interface classes has been specified in
WICG/webusb#206.

Change-Id: Ie788fdb2dc4530d424d7a3c92850958cf477f20e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3203109
Reviewed-by: Chris Mumford <cmumford@google.com>
Commit-Queue: Reilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#928748}
  • Loading branch information
reillyeon authored and chromium-wpt-export-bot committed Oct 6, 2021
1 parent 163d457 commit 52c0293
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions webusb/protected-interface-classes.https.any.js
@@ -0,0 +1,89 @@
// META: script=/resources/test-only-api.js
// META: script=/webusb/resources/usb-helpers.js
'use strict';

async function runTestForInterfaceClass(interfaceClass) {
await navigator.usb.test.initialize();

const fakeDeviceTemplate = {
usbVersionMajor: 2,
usbVersionMinor: 0,
usbVersionSubminor: 0,
deviceClass: 7,
deviceSubclass: 1,
deviceProtocol: 2,
vendorId: 0x18d1,
productId: 0xf00d,
deviceVersionMajor: 1,
deviceVersionMinor: 2,
deviceVersionSubminor: 3,
manufacturerName: 'Google, Inc.',
productName: 'Test Device',
serialNumber: '4 (chosen randomly)',
activeConfigurationValue: 0,
configurations: [{
configurationValue: 1,
configurationName: 'Default configuration',
interfaces: [{
interfaceNumber: 0,
alternates: [{
alternateSetting: 0,
interfaceClass: interfaceClass,
interfaceSubclass: 0x01,
interfaceProtocol: 0x01,
interfaceName: 'Protected interface',
endpoints: []
}]
}, {
interfaceNumber: 1,
alternates: [{
alternateSetting: 0,
interfaceClass: 0xff,
interfaceSubclass: 0x01,
interfaceProtocol: 0x01,
interfaceName: 'Unprotected interface',
endpoints: []
}]
}]
}]
};

let fakeDevice;
let device = await new Promise((resolve) => {
navigator.usb.addEventListener('connect', (e) => {
resolve(e.device);
}, { once: true });
fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceTemplate);
});

await device.open();
await device.selectConfiguration(1);

try {
await device.claimInterface(0);
assert_unreached('Should not be able to claim a protected interface.');
} catch (e) {
assert_equals(e.name, 'SecurityError');
assert_equals(e.message,
'The requested interface implements a protected class.');
}

await device.claimInterface(1);
await device.close();
fakeDevice.disconnect();
}

usb_test(() => runTestForInterfaceClass(0x01),
'Protected audio interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0x03),
'Protected HID interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0x08),
'Protected mass storage interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0x0B),
'Protected smart card interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0x0E),
'Protected video interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0x10),
'Protected audio/video interface cannot be claimed');
usb_test(() => runTestForInterfaceClass(0xE0),
'Protected wireless controller interface cannot be claimed');

0 comments on commit 52c0293

Please sign in to comment.