From patchwork Thu Dec 23 17:15:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572861 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=hz+0SzAP; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKjv15Q0gz9tjv for ; Fri, 24 Dec 2021 08:26:53 +1100 (AEDT) Received: from localhost ([::1]:47830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0Vbv-0004xI-Ip for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:26:51 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35374) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RuW-0005LF-9T for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:29:48 -0500 Received: from [2a01:111:f403:7010::72a] (port=36112 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RuS-0007of-Ds for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:29:47 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mLOpoPzMhWzz9brJwntT/524E3LWiLEM4K4T2aXSSAz+YByhmFk++YRmvucmGaS3xeF3tJUW3FnA3nnP2Bvl/O3ZKqV8JfzrX0RIH0Qov5/c1AsbVxdYFyd2AbpRoa8/AQTGtB0+dBYJvwkUtUrD6TVsUjFjqCQYVnqhU8n3y9A8Tq9mld90iHl8jscCKNNNZiK9ZgK97/vy+0kcaPCiQkQ01UMPYjB7s7/dCNfqg11W2vmiu4yJv2zFtHM5ksWrR/z9rnHiTZGKMy0C+FAt0tfldtbbJ6hr/WPesnI9Z5VYWS4V/0BmImNEkJrZMWfj5MmGtzEDDTAhC03+GjUPPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=E0GjECwp11sMeEzPd2899czPODJclwvIqXPc7WvHciU=; b=GiSQlb+qTmVRbfP7o7jcrvvBamb7wmq7jTW13RFzAFruMavLwzjwHf/GkOFssfoRJ3rfv5TMFC+qyHUIbr675rF/AjJivpyC00pp5oqySVjWb1iR0u1w773HB3wxCKj6UuBP6A3XxXsos1J9+Hhx/c7HQZmkqn+7FiezvYXD4L1yDSUl3K5r+H5BTHw44K83pQ/WiNgm+1eBBuZkmK9/IhU3W2pC9JNAMe9K1XeKRUFkqi3Jvdi3CJm8Ca0Ljn85DBC7H2qAMivBmfu0t63FHlEjdj7hmQHnLOaMOpaVH9CMesBJ14x+fTvWr+/ShgQw4gIP9NDUmEg6QmR8XJK12w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=E0GjECwp11sMeEzPd2899czPODJclwvIqXPc7WvHciU=; b=hz+0SzAP8hmjGpi8sP+Eyh7pc9183wzNeAXXnWBBg5cybFZmO/X7veuN5bAZsTF3F+RNQvUNfA0QBqrieQwJGNzvKGvDC0KuAAZLp2SSTkPXPk2NtUNKCCSyfycefMOgeJ/nU1uXq4J8jdtW0j2KYjcRGjFV9UpeuqW+AB0pczo= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0160.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:8028::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.17; Thu, 23 Dec 2021 17:15:20 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:15:20 +0000 Date: Fri, 24 Dec 2021 01:15:17 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 1/6] hw/usb: Add CanoKey Implementation Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0064.apcprd03.prod.outlook.com (2603:1096:202:17::34) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: eb50023e-c6d2-4b3c-612f-08d9c637cc60 X-MS-TrafficTypeDiagnostic: TYBP286MB0160:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3513; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PvE1c4btOH1pjXKgbUUb7PZ0dbuxe7uDAsg82vOJBPIc3wvCuVf+0SbHaogPBNtfLyi4Dh1To19i5kut49EvtvKuZF4tqFDKyeF7D0RQXcx04eqljbHeytSMdwhL4qiaj2lFzMO06iG8WFCFT8oxzQ5hCf7q1Fu6746wDbKtr7JDO+GCHvtI+tgeooYEVj1SiTNScHK0+v9x5Em7Vd+rBRpXV7ssnYnxjXWdMJbMcIO/ITttWK9CKXQLddYIzlTJaVMzEeYOFz9uCyPAEtAA+Ox0MAwiFSM0IsD+YEFUPQnRPAmWW9ToQMtoM7ACHNt42howaBDzO+L9aLPoP0tVJhM764kXv5jd8nuciy6AzYOgGDs6Kg92wvZFeXxSlx//SO3ejRbnhOzJuCO84aA4FZnHJHT0xp+aTovkanXg0MKDE6vk5i9Fd+C/3ijCX5q6hWAvfoy0UMRnpjp7qKjg3fa8YhfgEPz9bKf8NOiZLU3+1wi04ttzxXyVMDKiYIXSg8wNErfYBTNNgicSEdiDn7HmTTHjr0M1p+4KDs6KJ9UHcY1iVbFkeH0YFV50Fz8hlgpxDf+p1wnUepVVWd1xHXws3loffrL7N1x2ZjC6B2cOocLuycl8pV/8WSA3hd1WQsRyq1jFQgd6/ZrKfYAAG89necr2H1Q5Ct0l2dT0LZ2d8FtrkQCjbaWEEkgu1GQRw1JHz5Yy/8sw2W3qwgXmGvMRn+C366Fogxi2gr/eiEs+/iJKKOzlROZDPE27CjVuktQJzwn9ki5WVauvKYJWfQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(376002)(396003)(136003)(366004)(39830400003)(346002)(4326008)(786003)(83380400001)(66946007)(316002)(6666004)(66556008)(66476007)(186003)(52116002)(6916009)(508600001)(6486002)(6506007)(30864003)(966005)(5660300002)(8676002)(33716001)(9686003)(86362001)(8936002)(38100700002)(6512007)(2906002)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: +a+z3WBtnROotfsmTIIE597r5b6bnbyu2A4bV4e6qaGzJbXs//vesAm5TbDM2TJNoBUP7fLwEord95qp/nFOIaf2RXYzLZ/F4i0OA7btpaVafQ9kDpwZvP8b4wXDOOuVKLAnc7CkKw3C8PbFCWNNzhImrn4UvIkM6fNPA6kGQDRoyC6oSprElGWxlGHwbXULGbgN+Gh02B+MG5lNKqE2BRf1AwKLK7g637fnk3LmgYPCO8+3GqB8Ct7iVP8CtZ4RsfjfBy5SH9BythwwJKRrrrRcpv8ZZTYZ2HKradhjNPl4zTylXrSGtbgBjEXc3fUxxSq9HV52ntekFemivmYIWixkMhHijebKdKyoNdCAltUOpi9LJ77KCQ3zhVQa/w8isbVJYRAdARNw21CxQ9xiBVsPfn4pWrDlOru03kGramVJj3Fx6YV+08ow+JSNOIsmHjctHLn/9VEcYoOZqQfIj9Y+Bar4RVUfET60KKb+3nAVF0rNCr2I3tWOVFu3yoChE9VNN8tuA8YEP4iSpfjaJGrwpOPlom0cJrEhsFQ+jv5SDxnXgnAZSehH0dfS/TDtvqDZPa9RyL/T/qd3kGlam2GwoYtSjFgF1NAEI51EqXtGfJC5Ukn8Zl6fccFOY3ID3l8D8oIx5ylFfPjpXXvnhzQfs4xwAoPh2oxs5K1l99B53KzONK+wT/Y8qhiBubZivHu6c4qVj+W5z/kKeHsYfgNraz4ewjYv2R98TcPcx7f9JUJzoJe//Xg2IXjV6bdG4ATwx+X93eeUgsMfcLmUzlD5LLW8Fc2l/WZPobkJv6VMD65kvCUtI2LrV1DDZ98zri2f0JbI5CtxGuQZ6ECf/dT5loocQiMCkySI+i+wzFmxLVaBRi2kdenY1UkFCNhK7/6kkGLMm2W6kKJDpCWFqvQU1JRtxYqD4TOgAAzxDYAiFqPo4PTZXg+6s1gHfk/4X5276dLfl997XA37aDTCkp6t9WZmlEWGtVQaevCJD0PbACoXm1LN6JCTUCgsJNtRK26mQ5r/YRN7/mFWT+NbwmiohEVEgiIL6D/xYE5sjMTIUCgZcfC7xXLZR8xPIg3NmbjzSV2VoVcicIxwe1N6L5zu1vXh+6r6GMYQ9deETjGhdVfVzwvrM0DN4iBhYZ7zSCjnaNrVKP1pBzg75pNsuwqAOBST+ALuqZBVuyaxsmfdLr+BZhv/v2JTwYvmCnlo4eAMcJpFabCgyEhLLkjzP/wLrFcd81TWMsNCykhqrFA9OBwhlOWaZ8nHVYigXC7yxjGyeV8NaMfk+CyC0JaBAvHfhkoetiorpc+UmrHFQLWlnbT+BTZgN8lBS/SGM0PERCYCIurRfwNG+BQipj4Q+ak85kNkoV+c/Q+9zvZ2eedwjv3L0UaGPmnZtDh/oxUvbsKtA0AbDq4opUb+KGy4VcaHkt4XegSXLK/cL2SJfz/RtOdnEurR3ZtxNXHpE088s3Cqty2uA1b56vC4AhBq3jgxJZnZ5kaT5Gqq4yO9rxtx/uecZHjB48bw4DTWgoDXbTMYgFezta0hW6IzKHzEvlkGNaJpNQPOy4gmdYE4fqXTA52t9V2qfKx5BdjMBL0L X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: eb50023e-c6d2-4b3c-612f-08d9c637cc60 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:15:20.5411 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GqvYJtoL9+37I8uHHK6Y+UsqIdzH4NOmqjKKt63Y1or61Vxx0IclXot37ehPAUzY X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0160 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::72a (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::72a; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This commit added a new emulated device called CanoKey to QEMU. CanoKey implements platform independent features in canokey-core https://github.com/canokeys/canokey-core, and leaves the USB implementation to the platform. In this commit the USB part was implemented in QEMU using QEMU's USB APIs, therefore the emulated CanoKey can communicate with the guest OS using USB. Signed-off-by: Hongren (Zenithal) Zheng --- hw/usb/canokey.c | 378 +++++++++++++++++++++++++++++++++++++++++++++++ hw/usb/canokey.h | 60 ++++++++ 2 files changed, 438 insertions(+) create mode 100644 hw/usb/canokey.c create mode 100644 hw/usb/canokey.h diff --git a/hw/usb/canokey.c b/hw/usb/canokey.c new file mode 100644 index 0000000000..f71e5f0438 --- /dev/null +++ b/hw/usb/canokey.c @@ -0,0 +1,378 @@ +/* + * CanoKey QEMU device implementation. + * + * Copyright (c) Canokeys.org + * Written by Hongren (Zenithal) Zheng + * + * This code is licensed under the Apache-2.0. + */ + +#include "qemu/osdep.h" +#include + +#include "qemu/module.h" +#include "qemu/thread.h" +#include "qemu/main-loop.h" +#include "qapi/error.h" +#include "hw/usb.h" +#include "hw/qdev-properties.h" +#include "desc.h" +#include "canokey.h" + +/* #define DEBUG_CANOKEY_DATA 1 */ +/* #define DEBUG_CANOKEY 1 */ + +#ifdef DEBUG_CANOKEY_DATA +#define DPRINTF_DATA(data, len, fmt, ...) \ +do { \ + printf("canokey: payload: " fmt " ", ## __VA_ARGS__); \ + for (int i = 0; i != (len); ++i) { \ + printf("%02X ", (data)[i]); \ + } \ + printf("\n"); \ +} while (0) +#else +#define DPRINTF_DATA(data, len, fmt, ...) do {} while (0) +#endif + +#ifdef DEBUG_CANOKEY +#define DPRINTF(fmt, ...) \ +do { printf("canokey: " fmt "\n", ## __VA_ARGS__); } while (0) +#define BADF(fmt, ...) \ +do { fprintf(stderr, "canokey: error: " fmt "\n", ## __VA_ARGS__); \ + exit(1); } while (0) +#else +#define DPRINTF(fmt, ...) do {} while (0) +#define BADF(fmt, ...) \ +do { fprintf(stderr, "canokey: error: " fmt "\n", ## __VA_ARGS__); } while (0) +#endif + +#define CANOKEY_EP_IN(ep) ((ep) & 0x7F) + +#define CANOKEY_VENDOR_NUM 0x20a0 +#define CANOKEY_PRODUCT_NUM 0x42d2 + +/* + * placeholder, canokey-qemu implements its own usb desc + * Namely we do not use usb_desc_handle_contorl + */ +enum { + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER +}; + +static const USBDescStrings desc_strings = { + [STR_MANUFACTURER] = "canokeys.org", + [STR_PRODUCT] = "CanoKey QEMU", + [STR_SERIALNUMBER] = "0" +}; + +static const USBDescDevice desc_device_canokey = { + .bcdUSB = 0x0, + .bMaxPacketSize0 = 16, + .bNumConfigurations = 0, + .confs = NULL, +}; + +static const USBDesc desc_canokey = { + .id = { + .idVendor = CANOKEY_VENDOR_NUM, + .idProduct = CANOKEY_PRODUCT_NUM, + .bcdDevice = 0x0100, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_canokey, + .str = desc_strings, +}; + + +/* Implement canokey-qemu functions */ +int canokey_emu_stall_ep(void *base, uint8_t ep) +{ + DPRINTF("stall ep %d", ep); + CanoKeyState *key = base; + uint8_t ep_in = CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ + qemu_mutex_lock(&key->ep_in_mutex[ep_in]); + key->ep_in_size[ep_in] = 0; + key->ep_in_status[ep_in] = CANOKEY_EP_IN_STALL; + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + return 0; +} + +int canokey_emu_set_address(void *base, uint8_t addr) +{ + DPRINTF("set addr %d", addr); + CanoKeyState *key = base; + key->dev.addr = addr; + return 0; +} + +int canokey_emu_prepare_receive( + void *base, uint8_t ep, uint8_t *pbuf, uint16_t size) +{ + DPRINTF("prepare receive on ep %d size %d", ep, size); + CanoKeyState *key = base; + /* + * No mutex here because it is usually called by + * canokey_emu_data_out (qemu thread), which already has mutex + */ + key->ep_out[ep] = pbuf; + key->ep_out_size[ep] = size; + return 0; +} + +int canokey_emu_transmit( + void *base, uint8_t ep, const uint8_t *pbuf, uint16_t size) +{ + DPRINTF("transmit ep %d size %d", ep, size); + DPRINTF_DATA(pbuf, size, "transmit"); + CanoKeyState *key = base; + uint8_t ep_in = CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ + qemu_mutex_lock(&key->ep_in_mutex[ep_in]); + memcpy(key->ep_in[ep_in], pbuf, size); + key->ep_in_size[ep_in] = size; + key->ep_in_status[ep_in] = CANOKEY_EP_IN_READY; + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + return 0; +} + +uint32_t canokey_emu_get_rx_data_size(void *base, uint8_t ep) +{ + CanoKeyState *key = base; + DPRINTF("get rx data size ep %d size %d", ep, key->ep_out_size[ep]); + return key->ep_out_size[ep]; +} + +static void *canokey_thread(void *arg) +{ + DPRINTF("thread"); + CanoKeyState *key = arg; + + while (true) { + /* Wait signal */ + qemu_mutex_lock(&key->key_mutex); + qemu_cond_wait(&key->key_cond, &key->key_mutex); + qemu_mutex_unlock(&key->key_mutex); + + /* Exit thread check */ + if (key->stop_thread) { + DPRINTF("stop thread"); + key->stop_thread = false; + break; + } + + canokey_emu_device_loop(); + } + return NULL; +} + +static void canokey_handle_reset(USBDevice *dev) +{ + DPRINTF("reset"); + CanoKeyState *key = CANOKEY(dev); + for (int i = 0; i != CANOKEY_EP_NUM; ++i) { + key->ep_in_status[i] = CANOKEY_EP_IN_WAIT; + key->ep_in_pos[i] = 0; + } + canokey_emu_reset(); +} + +static void canokey_handle_control(USBDevice *dev, USBPacket *p, + int request, int value, int index, int length, uint8_t *data) +{ + DPRINTF("contorl SETUP: %04X %04X %04X %04X", + request, value, index, length); + CanoKeyState *key = CANOKEY(dev); + + canokey_emu_setup(request, value, index, length); + qemu_cond_signal(&key->key_cond); + + uint8_t ep_in = CANOKEY_EP_IN(p->ep->nr); + uint32_t dir_in = request & DeviceRequest; + if (!dir_in) { + /* OUT */ + DPRINTF("control OUT size %d", length); + DPRINTF_DATA(data, length, "control OUT"); + qemu_mutex_lock(&key->key_mutex); + if (key->ep_out[0] != NULL) { + memcpy(key->ep_out[0], data, length); + } + canokey_emu_data_out(p->ep->nr, data); + qemu_cond_signal(&key->key_cond); + qemu_mutex_unlock(&key->key_mutex); + } + + /* IN */ + qemu_mutex_lock(&key->ep_in_mutex[ep_in]); + if (key->ep_in_status[ep_in] == CANOKEY_EP_IN_WAIT) { + p->status = USB_RET_NAK; + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + return; + } + if (key->ep_in_status[ep_in] == CANOKEY_EP_IN_STALL) { + p->status = USB_RET_STALL; + } + key->ep_in_status[ep_in] = CANOKEY_EP_IN_WAIT; + memcpy(data, key->ep_in[ep_in], key->ep_in_size[ep_in]); + p->actual_length = key->ep_in_size[ep_in]; + + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + + DPRINTF("control IN: %d", p->actual_length); + DPRINTF_DATA(data, p->actual_length, "control IN"); +} + +static void canokey_handle_data(USBDevice *dev, USBPacket *p) +{ + CanoKeyState *key = CANOKEY(dev); + + uint8_t ep_in = CANOKEY_EP_IN(p->ep->nr); + uint8_t ep_out = p->ep->nr; + uint32_t in_len; + switch (p->pid) { + case USB_TOKEN_OUT: + DPRINTF("data OUT, ep %d", ep_out); + qemu_mutex_lock(&key->key_mutex); + if (p->iov.size > key->ep_out_size[ep_out]) { + DPRINTF("data OUT, ep %d overflow! income %d, buffer size %d", + ep_out, p->iov.size, key->ep_out_size[ep_out]); + p->status = USB_RET_NAK; + qemu_mutex_unlock(&key->key_mutex); + break; + } + usb_packet_copy(p, key->ep_out[ep_out], p->iov.size); + key->ep_out_size[ep_out] = p->iov.size; + DPRINTF_DATA(key->ep_out[ep_out], p->iov.size, "data OUT payload"); + canokey_emu_data_out(ep_out, NULL); + qemu_cond_signal(&key->key_cond); + qemu_mutex_unlock(&key->key_mutex); + break; + case USB_TOKEN_IN: + qemu_mutex_lock(&key->ep_in_mutex[ep_in]); + if (key->ep_in_pos[ep_in] == 0) { + canokey_emu_data_in(ep_in); + qemu_cond_signal(&key->key_cond); + if (key->ep_in_status[ep_in] == CANOKEY_EP_IN_WAIT) { + p->status = USB_RET_NAK; + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + break; + } + DPRINTF("data IN, ep %d", ep_in); + DPRINTF_DATA(key->ep_in[ep_in], key->ep_in_size[ep_in], + "data IN payload"); + if (key->ep_in_status[ep_in] == CANOKEY_EP_IN_STALL) { + p->status = USB_RET_STALL; + } + key->ep_in_status[ep_in] = CANOKEY_EP_IN_WAIT; + + in_len = MIN(key->ep_in_size[ep_in], p->iov.size); + usb_packet_copy(p, key->ep_in[ep_in], in_len); + if (in_len < key->ep_in_size[ep_in]) { + key->ep_in_pos[ep_in] = in_len; + } + } else { + in_len = MIN(key->ep_in_size[ep_in] - key->ep_in_pos[ep_in], + p->iov.size); + usb_packet_copy(p, + key->ep_in[ep_in] + key->ep_in_pos[ep_in], in_len); + key->ep_in_pos[ep_in] += in_len; + if (key->ep_in_pos[ep_in] == key->ep_in_size[ep_in]) { + key->ep_in_pos[ep_in] = 0; + } + } + qemu_mutex_unlock(&key->ep_in_mutex[ep_in]); + break; + default: + p->status = USB_RET_STALL; + break; + } +} + +static void canokey_realize(USBDevice *base, Error **errp) +{ + DPRINTF("realize"); + CanoKeyState *key = CANOKEY(base); + + if (key->file == NULL) { + error_setg(errp, "You must provide file=/path/to/canokey-file"); + return; + } + + usb_desc_init(base); + + /* Synchronization */ + qemu_cond_init(&key->key_cond); + qemu_mutex_init(&key->key_mutex); + for (int i = 0; i != CANOKEY_EP_NUM; ++i) { + qemu_mutex_init(&key->ep_in_mutex[i]); + key->ep_in_status[i] = CANOKEY_EP_IN_WAIT; + key->ep_in_pos[i] = 0; + } + + if (canokey_emu_init(key, key->file)) { + error_setg(errp, "canokey can not create or read %s", key->file); + return; + } + + /* Thread */ + key->stop_thread = false; + qemu_thread_create(&key->key_thread, "canokey", canokey_thread, + key, QEMU_THREAD_JOINABLE); +} + +static void canokey_unrealize(USBDevice *base) +{ + DPRINTF("unrealize"); + CanoKeyState *key = CANOKEY(base); + + /* Thread */ + key->stop_thread = true; + qemu_cond_signal(&key->key_cond); + qemu_thread_join(&key->key_thread); + + /* Synchronization */ + qemu_cond_destroy(&key->key_cond); + qemu_mutex_destroy(&key->key_mutex); + for (int i = 0; i != CANOKEY_EP_NUM; ++i) { + qemu_mutex_destroy(&key->ep_in_mutex[i]); + } +} + +static Property canokey_properties[] = { + DEFINE_PROP_STRING("file", CanoKeyState, file), + DEFINE_PROP_END_OF_LIST(), +}; + +static void canokey_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->product_desc = "CanoKey QEMU"; + uc->usb_desc = &desc_canokey; + uc->handle_reset = canokey_handle_reset; + uc->handle_control = canokey_handle_control; + uc->handle_data = canokey_handle_data; + uc->handle_attach = usb_desc_attach; + uc->realize = canokey_realize; + uc->unrealize = canokey_unrealize; + dc->desc = "CanoKey QEMU"; + device_class_set_props(dc, canokey_properties); +} + +static const TypeInfo canokey_info = { + .name = TYPE_CANOKEY, + .parent = TYPE_USB_DEVICE, + .instance_size = sizeof(CanoKeyState), + .class_init = canokey_class_init +}; + +static void canokey_register_types(void) +{ + type_register_static(&canokey_info); +} + +type_init(canokey_register_types) diff --git a/hw/usb/canokey.h b/hw/usb/canokey.h new file mode 100644 index 0000000000..caa93a8f3a --- /dev/null +++ b/hw/usb/canokey.h @@ -0,0 +1,60 @@ +/* + * CanoKey QEMU device header. + * + * Copyright (c) Canokeys.org + * Written by Hongren (Zenithal) Zheng + * + * This code is licensed under the Apache-2.0. + */ + +#ifndef CANOKEY_H +#define CANOKEY_H + +#include "hw/qdev-core.h" + +#define TYPE_CANOKEY "canokey" +#define CANOKEY(obj) \ + OBJECT_CHECK(CanoKeyState, (obj), TYPE_CANOKEY) + +/* + * State of the Canokey (i.e. hw/canokey.c) + */ + +/* CTRL INTR BULK */ +#define CANOKEY_EP_NUM 3 +/* BULK IN CAN BE UP TO 500 bytes */ +#define CANOKEY_EP_IN_BUFFER_SIZE 1024 + +typedef enum { + CANOKEY_EP_IN_WAIT, + CANOKEY_EP_IN_READY, + CANOKEY_EP_IN_STALL +} CanoKeyEPStatus; + +typedef struct CanoKeyState { + USBDevice dev; + uint8_t idle; + + /* IN packets from canokey device loop */ + uint8_t ep_in[CANOKEY_EP_NUM][CANOKEY_EP_IN_BUFFER_SIZE]; + /* for IN larger than p->iov.size, we would do multiple handle_data() */ + uint32_t ep_in_pos[CANOKEY_EP_NUM]; + uint32_t ep_in_size[CANOKEY_EP_NUM]; + CanoKeyEPStatus ep_in_status[CANOKEY_EP_NUM]; + QemuMutex ep_in_mutex[CANOKEY_EP_NUM]; + + /* OUT pointer to canokey recv buffer */ + uint8_t *ep_out[CANOKEY_EP_NUM]; + uint32_t ep_out_size[CANOKEY_EP_NUM]; + + /* Properties */ + char *file; /* canokey-file */ + + /* Emulation thread and sync */ + QemuCond key_cond; + QemuMutex key_mutex; + QemuThread key_thread; + bool stop_thread; +} CanoKeyState; + +#endif /* CANOKEY_H */ From patchwork Thu Dec 23 17:16:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572859 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=UgM5E2Jd; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKjv03JY1z9tD5 for ; Fri, 24 Dec 2021 08:26:52 +1100 (AEDT) Received: from localhost ([::1]:47818 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0Vbs-0004wu-35 for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:26:48 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35872) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwN-0005ht-Qa for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:43 -0500 Received: from [2a01:111:f403:7010::703] (port=17069 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwK-0008C7-NN for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:42 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XAtwsLN1+/nzBrNBy1YwHU1q+koCp1B3UXY0UELVzEH9do7uxggGmVLGhCEkSJsudRSk8uaQig3MxDsqunTBCxj6XdTKDtUxD4uI8NU3mR1FF+hVLFJKbU06UKDyNFH4ARb/CM3pRQPtmk+ZKvqKWKHT9Anzydvd+3R+ddURsoCc1vD3ryQ0LVgZwgAyzsFYsbdZslhacHBbyJmYXvt+/eGYahuEAF6iWOQwTHE0NJov34eJ6s0fzgIpTvhdBaTGUDXP7psXXb8QZBeEdqDUN6tc8KbmZMr3Bl7kFNIgp8USH4nmeoYK+jMgKebd/BN/VUDDSLmFBbM9hceDPe8R/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AZ7miJnzwDkSCf1QIbuuS3GUu4ErmZtwNi/9K3/bX2g=; b=EAhx6L+oFpUb+xwenDnV6iYktwAogQQyOlSftRPjuusKhs9FPpTof/QPxPedOuiK7uA0rzEGD4qM0zrBPl5Ro4btR3/5agLOw4rq87FCZCUyBOfY7o+OHzDrdHWtwovQIYAWd97tBpNH/np1VIQSuQuw6ZVZaPChffEg4StKTXrkDqZaUW+5wpMcp7YUtx7i3lWsvIPpesaxVil0iLWqXChyvbB67g/J1f9vM15GFT83hxvQzGXXBGZwoDOvpxaI9R7xwmbNAzEWo9xDCNiS5llB0VQHVC6kOQ4XHA22lZHlDmzEG2eVErZywTHzyTdfqbbyXUH2EPUVeCMt9coofg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AZ7miJnzwDkSCf1QIbuuS3GUu4ErmZtwNi/9K3/bX2g=; b=UgM5E2JdAZIK7eCXJpDK7qMH9gsKjG7C5G9aP51LMkqUB+T6Nx+91vWXcuJOJgxC44iajNAukIVh4v6PgzFgpeP5PNMEZWuB2FSCjgm7qm0vFrLXMQMlD3imH1Tw8Srn/D5V9oVO4IZIUfo1RMUHrc1XL+MBFOot6djywSSbN1o= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0032.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:801c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.18; Thu, 23 Dec 2021 17:16:14 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:16:14 +0000 Date: Fri, 24 Dec 2021 01:16:12 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 2/6] meson: Add CanoKey Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0051.apcprd03.prod.outlook.com (2603:1096:202:17::21) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 75881dec-e165-4123-a0ac-08d9c637ec7d X-MS-TrafficTypeDiagnostic: TYBP286MB0032:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:238; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VPm7zMxAagCaNi9OEoQy1RVhSDBVX4EFIJvXqUbR4ikM1qkVJ251Tx2+bDtYpqG+zuWBrSif8+oDewd9spO5z7SPRU4Ish8Qz5WRO6eDfOYPMRfYTcxceUhwqT8bNbRmQ7nJKyQkNgGRkq6z+PmPm97U2J1kqUf1eDBozCWiLFyWcZSCP42T89YvC/2VDMxuY+UeHjpMBjylh4AhgAFNYkgKgWF9H2DvBuZhDdBwkV1LVX3fcCZrTLF2kLmeztLGmOY9kkFnudcdtbFJhOZ8GVMhjVpTGkpbe+VvyaGAJ6TMbHwcSVygP1vLflzAL9V0X9e9sNw5erj3s+ga4MmpKWDzkvEmXH3oP+/10C3i3X4t53byRp1OWnUzyUiw1y2lCEhWiKepSKJ5zAjRU+1qZ3a6YHMduZ07PQwFRwCkR+3T5zhraEhd+tagv4/Ih4JEwapwbnAwtjPo0fJIpnXly9vCeIFEA/wzl2SgnRXdiGnf1mlfQj09eKLVrrtgzgI7yD98vrDK76if+Y5F4pAELva7cwctBPMRQIVR6ANNJpSLmk4q6PVIdqG8NCH5hLdxiy4KbV6+M01obEFAcMDYulgT374kgUMlB+rOGcxEwpb5nn5r05pkuWDloCAILU9nYom53lCVDNFMWHo9/n3dr7sRHNQfbG6L59VvllXDM00bWwOWgtmCPrAQ5nXHoY3cyKhjft49IO6sJKlvNaunXA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(39830400003)(376002)(136003)(396003)(366004)(346002)(186003)(4326008)(6512007)(9686003)(6486002)(52116002)(38100700002)(508600001)(5660300002)(6506007)(6916009)(66476007)(786003)(8676002)(2906002)(8936002)(66946007)(66556008)(316002)(86362001)(83380400001)(33716001)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SBrKzUFFwZWRpfw6kIWDvIi+BUv43SJMChLXgvCqiNPj46TOqYXq7DT8hkb5ZhDI3qEGBH3oWvCj/iE/1md75s7jv8A9/Ads5w+AhJ9k82pBqMVkgAgGv0C1jwcX8lZoAxsUyD/DJ92cvh2wYYbc2ldi1L8dRV2dhIjZR1SvuVc2qG9KfA1qzn5tEwC0yvE4e3nAG625IsuvCJK+Q+5J0i77ZbkvGugqPR8/T/hCPpx7Ginc1u3klcX7t6Fts3dp+Ghx5d1yIbrv9jrYj84CCnJhlsKSprrWu1pq8FwxCkvI9pQxTDr4gTOzghgE7KqoVA+tPxEyvJW2CBh7eU84r90QKDRtwkUt3xpeiaFeDmDToCN7TA/kfjGMO5WTGj2xb0HpHhnpopOuoMPVT4r94dTuyWNIGptMm32ITEren0POqXCS4GN9A3mKlnAIe98DGDSK4ju3MtB/vEBCwh0KWACwzdJKWJVTcOpiAIrjYRaekX5j1Brvj2kA9QdRkqtjrJ+5puFhJy+3z5W/wYH5YLRupLTabIiWwUydHjseUYy2aW/6LcyZWFKZImX/KlDnDGFcUuA+dlZCll4jbApb/TRyffYflBG0hJiyam5IB7+Dm4G+q/tvX2pJ+nkbfhM0LtoH6e/RSSgJ86fXdneS+BPqmEtTz3M3Hcijv0OTGhIn4aK5KtCLJheiuKKNI6R3EkczFhK1bv0J/WvDnepxc+2J8DS6QM23DzXT8lhLrvg6OB/7iv9k4euVUC55jAxu4HRV9wqx0LFDg3yVFa9ClyRrwoGOTcVhoihqXGQLP+MxM53Ung58yWRc7Vmbs7b9jidwnnklHQE9eQTBgt17H0S+NfTNImSGFousBaUD6ibaJwUVLVb8CpJwgTc5GbAlSNZcrPEKWDx9QWP6FwAc3SzuHrwEz86F+dUuUw/zyoDoOBvtsjPasB6OSGcBJoJQOU/7RQYwttAIHpHvrdXYQpn3uLoWyu+YUXiaXhoKAJFY7P+cj+R1224jxkLxEnZ0Naf/Oq7pEd1ezwoE47vbF2kX2qnXvuIvA3pvNZLpPK1R9T40l1DQ9WFTzUwcB8vL8v3vLWnP7zdF2Ge26kK83B5PVBK8kzoRcgo3jkTNV+G98gPgmzbHZMRwIbhduIjU1gIvGwbMGqNkTnZUrGsQOU3TLA0K3MJCDApRZNayI0L6a8QHTY0XyrpdEkYZyY9oucd+kc/vAZWRax6FGkFK2A+JrTTbIGVUfxJSoJtx0aP1jCBMDT4150FxXVAmKKJJBfQqulgMQC+dX5rvR2qVLPXC0g8rA0DF51TviX4VFvowVoUtTP8GEa5VJxnk9SPd84mWGS7UEyaRKK5KFG/aJmfBNCWTzMKGKFD16zwWLVeWbYTph44Ukz5VKgF86gIY6ciAYB+RG+/bIUnMKVQ4wsq73llulh92t8g+plGAZOiTjY6BHUKMtH7eO/AjCfhFkt9jvgCbbar82RF8HgsYZ4CyiGjQPWNeIzdfjKRuXH9mlo+31Uq6TpcTkAZGxo6VBK866HgIda/4eE5t/9cFym+Jv/8feWwmWTE+Ac/dMc1gMU5wun/YTiqUvjwVRNgv X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 75881dec-e165-4123-a0ac-08d9c637ec7d X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:16:14.4211 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hE75fJ4zNjoUPzG623JrzTxaGDi3N5sBeFJqTC2AQdG2fHiW4+XB2UJtax1SJMkK X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0032 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::703 (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::703; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Hongren (Zenithal) Zheng --- hw/usb/Kconfig | 5 +++++ hw/usb/meson.build | 3 +++ meson.build | 6 ++++++ meson_options.txt | 2 ++ scripts/meson-buildoptions.sh | 3 +++ 5 files changed, 19 insertions(+) diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig index 53f8283ffd..ce4f433976 100644 --- a/hw/usb/Kconfig +++ b/hw/usb/Kconfig @@ -119,6 +119,11 @@ config USB_U2F default y depends on USB +config USB_CANOKEY + bool + default y + depends on USB + config IMX_USBPHY bool default y diff --git a/hw/usb/meson.build b/hw/usb/meson.build index de853d780d..8390a29f8c 100644 --- a/hw/usb/meson.build +++ b/hw/usb/meson.build @@ -63,6 +63,9 @@ if u2f.found() softmmu_ss.add(when: 'CONFIG_USB_U2F', if_true: [u2f, files('u2f-emulated.c')]) endif +# CanoKey +softmmu_ss.add(when: 'CONFIG_USB_CANOKEY', if_true: [canokey, files('canokey.c')]) + # usb redirect if usbredir.found() usbredir_ss = ss.source_set() diff --git a/meson.build b/meson.build index 17c7280f78..c3558d0de9 100644 --- a/meson.build +++ b/meson.build @@ -1181,6 +1181,12 @@ if have_system method: 'pkg-config', kwargs: static_kwargs) endif +canokey = not_found +if have_system + canokey = dependency('canokey-qemu', required: get_option('canokey'), + method: 'pkg-config', + kwargs: static_kwargs) +endif usbredir = not_found if not get_option('usb_redir').auto() or have_system usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), diff --git a/meson_options.txt b/meson_options.txt index 921967eddb..7f5ffba35c 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -143,6 +143,8 @@ option('spice_protocol', type : 'feature', value : 'auto', description: 'Spice protocol support') option('u2f', type : 'feature', value : 'auto', description: 'U2F emulation support') +option('canokey', type : 'feature', value : 'auto', + description: 'CanoKey support') option('usb_redir', type : 'feature', value : 'auto', description: 'libusbredir support') option('l2tpv3', type : 'feature', value : 'auto', diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh index 50bd7bed4d..56ae780d4f 100644 --- a/scripts/meson-buildoptions.sh +++ b/scripts/meson-buildoptions.sh @@ -28,6 +28,7 @@ meson_options_help() { printf "%s\n" ' bpf eBPF support' printf "%s\n" ' brlapi brlapi character device driver' printf "%s\n" ' bzip2 bzip2 support for DMG images' + printf "%s\n" ' canokey CanoKey support' printf "%s\n" ' cap-ng cap_ng support' printf "%s\n" ' cocoa Cocoa user interface (macOS only)' printf "%s\n" ' coreaudio CoreAudio sound support' @@ -115,6 +116,8 @@ _meson_option_parse() { --disable-brlapi) printf "%s" -Dbrlapi=disabled ;; --enable-bzip2) printf "%s" -Dbzip2=enabled ;; --disable-bzip2) printf "%s" -Dbzip2=disabled ;; + --enable-canokey) printf "%s" -Dcanokey=enabled ;; + --disable-canokey) printf "%s" -Dcanokey=disabled ;; --enable-cap-ng) printf "%s" -Dcap_ng=enabled ;; --disable-cap-ng) printf "%s" -Dcap_ng=disabled ;; --enable-capstone) printf "%s" -Dcapstone=enabled ;; From patchwork Thu Dec 23 17:16:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572860 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=cSmWOy5Z; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKjtz4HKyz9t5K for ; Fri, 24 Dec 2021 08:26:50 +1100 (AEDT) Received: from localhost ([::1]:47816 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0Vbp-0004wq-UI for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:26:45 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35908) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwT-0005lk-CW for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:49 -0500 Received: from [2a01:111:f403:7010::703] (port=17069 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwO-0008C7-AO for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:46 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JNiP4vEIIqdYnYGkWgSFlc8hrGGgL3miQUfOAJNCziW7XHPvinuKLxNERk99Q+8TePoQjAjl4ipDa4XkKdCbG3xgkgF+oH3AowwuL+xrFFkgzXT2gVTqfNa4FXSBH/skqeTDQjy3/lZ3pi5pppoF+Ku5arz0NDoBwVH+huExUeZ1gl5N90k/lulgJre7jT/lQFW01lncp8wm/9Mm7pGeUvOPbEeiCXkdcOMtlmYIZwbloieANzz3qjcnkUfHofwYb1NlT8gc+TPlBEyCnjKDRoc4o6cS8FeQqkN2z/+3zzlqkG5v2mLSIJS6O+XlA0j+oG8CqIwZSkYrs+FdPLZZsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=THHSKqlakTceXQfEqCnuqtCpDBuBcI2vHkZmTt7ouQw=; b=Go+qMjWIyYIXSKVhACA1d778qZswdQm3yOYpvGMOsPIDx7N21Y55OfiYRXLvQJBtNXDJLXKQpdZfoLY3MCkUMG+Klje866rU20GIRhrQFkHbatB7V31zxgBiNiW/HuV0IfIDbnZ+8K/vF85lzJLJ3nrnp1O2+LzuwsCDa+CAfT2IrQEXbaK/kXN4LPHwNzyuGNA9k5Gu23LQAuoIpCUUsXA7rEcDWTCHkHidWYMc5g5+ltr3PdRfgtgna6HC3EAxNAKZmAUrc0Qf+p6+ispO7UkxZ25NDGuo0f4lImzd47uvYIfq+wdJTdroeamYgleK2t00xzJd9vvIY3mOH0Pvyg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=THHSKqlakTceXQfEqCnuqtCpDBuBcI2vHkZmTt7ouQw=; b=cSmWOy5ZBfteadRH25Sx+ZAtf2HZLBnxJvbNHr1WKkz8k47gKs28ABvIGoOYvINUw7aV3cNYQK3WVLZzNMoItFDEHnMoprxTxHitMquHwGHdMA01MLHr0zZJfgL1RCwMRbgn+clEtX7g9liGbtAjKalHMAUsxZXdaB5jS2jx+z0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0032.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:801c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.18; Thu, 23 Dec 2021 17:16:41 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:16:41 +0000 Date: Fri, 24 Dec 2021 01:16:38 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 3/6] docs: Add CanoKey documentation Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0048.apcprd03.prod.outlook.com (2603:1096:202:17::18) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4381bc94-7e65-42b1-843b-08d9c637fc84 X-MS-TrafficTypeDiagnostic: TYBP286MB0032:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qfmP6qFM9sIC+z2IrTd9qqyoyxcxmnrw8f4kKF+PtjwI48mMgC3Cs8K66aWgzQQ1lf+PZGLIQXhPxW+9lgkzGcn61L/msvhi9dSW5fFcnpzONrAp1HDzzGTkiWsGQrNuaMOe4u031OO885m8OA1spnhfIwc7BPkDAClnE3b0kol6u6sEyyAzwC4BGs2H7SXMSlNHWiHmPuBllgRiPvVjUKec/b580nUGNlVPWbx3YurAI+dgLhcI0sFVB1tpP993y/BaX4NZaY0E14UNwxxd0Ci/p/jnDSQTj9Hks5QEe05voR5q8m5WVIQFq9zlyG1XSZ8G8zva9Wcp1RkuVbl8dl3EPp9fJn3Dw20VqDQg+90wxTMHTEhqcjEDgeypXGuW8VJU0FDsdIXhKjcw+BW5PU65EXKlsQIbBWuM5CmT0zEwuLU4pFhPIkPI2KFGNx9t9cPArmd1/fkh05iqgY5VD5L5ZIzUPAaVKYzR/3Ak9PXvdqCgNkg39aPG3uIHfvU9wEtYBpTu864xxSqyijO2S1IMlRR4nrAid32NnpqN8BWlFqg3SECK1Iz3Rw+WpZsj4bjj0QokTsX5gn7sfeyzv6S6tZJ3v2kv/+12jwK8vjjV8bt/ihftGwrPiqttZINablvHLVnFeVGbH23lrK1g1IqsKbB8WsWbeMmeWEQ3s0FRcV9pCZdaUPPq4SGG9mQNz/cc4tuyG6aZ2cQa5Wkvsa/zbM1Bhvz2H3dkI55RYovm3FhTIsC3nMpsJqRiPbTwnjKaOxn5Vht8nf2C5BxRsw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(39830400003)(376002)(136003)(396003)(366004)(346002)(186003)(4326008)(6512007)(9686003)(6486002)(52116002)(38100700002)(508600001)(5660300002)(6506007)(6916009)(66476007)(786003)(8676002)(2906002)(8936002)(66946007)(66556008)(316002)(86362001)(83380400001)(33716001)(966005)(6666004)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: PROQ2A6DwnRYlQ6S5OWJOlQFizBTPNQ85/bi/tAmplT2/DNzeMxzeZMRnG0cX6ExWmk6Cj+x7YVoVrJtYemA7LjFfiR5OOqf0u/eMNoXcYvY53gDbGefwtluxc4kG9L8uSHM/JJh//TYxXS53ZRd6pGV1gQYG59MT90vpOIO7H+TR9hZu7itQ5Qq/rhTivoOSm19VU2JC8uQVq/c53G64EemKjp0pYzWHXD6F7sfBsSLOiVf1ziEVsOnAtbYTgcNqB0c1xu4YF0aETcqfHlcVTtUNXyDpcP7NwvLczFN8+8D6KUq00z0ASoLh2BaSIk/hMusiuKcd0HMUNj6+wemsEnDx+db4rBDEPzhCgPfetYWOm7I+GNJB6q8y5/QEHCjPWnll8vsVc6XQvg4uScT+J6O4DXAt8Byfotz1nh6JVU4ZkQ3VdAUyapwguR/PeWssEeBsL0zlBHVvRbkkgBu0EYV1SDxvGinUmwD7tUuW7kEzW6ysEePv4YpTU7oRnSGkJmv/uWAAxQXCSTRVvsD8/1TXMJzCCLHJlQJapfMM4XPhEp1BDomjK4Ale0XFpuUY9jtqUK4/HKZvxJGhccX4Dv3Cb4J5bosUhx8efg0PSINc7Zr7vcUfeIaJBYjrVC/v0b0QnyOEcr60kNX8/IGG5cpkLiYJc/k6VCRj8LdjbrDKcJKdFr3lVkA6bKGO0MZbDK7tOTLKnV6xSgUV8YrDcDkNXTt6IBgbSxyRelk3lgu2vUHngBrFASbZ57KmuZCp004S0VTiMdoMN2bIcGSKhUxBpuH1JbXfYCsxi1Fw+0iXkoKC6tDmiAgSqnhkni29/JccQRQe6ptZHUzRyicUffKgrOBOcpagqAmyZBGdJZ+bzYs7swpCCeWMIpmyJSd8ST5H/apOTmJYjCaTj4OgfZsT5CETRZJoV6AJkPqJfisAEOU2Jc6uB0T1lNcRNlt5+FT7e0DTvdV8BmVggCkuRl7nM3D25rLqTYTQLnNU5yNARAOU4zL/geS2iZhyQe1AX8EaGMQHMclEHGddm26OHxtDrx6FtlbGT6zrSWzp1NTyof5+bZbfIhi/QAA1k5yhWD9bK9ep4u0Qq7+T7RxwfUBTLhsmVgO6gZkAScFmvrOXgQXmdCFm++fLLG4yPipKHQoBPoC5VjGpQHbR3s66W476R3oUSMTYW8E2iLIuZMAUT5xXJb1JfIWUEtZm6Fmi/zqIUZg5Xwi3sfLViCMAExwAEJnJvvd9vnorKwMn02YnVO3OjiRV0e8NzoliXfb3fywwdcmSUWjBXe0RTZA4To1cYNKMdX5Sraq3dvz8mzJgl+SzJruH2GxLr1dBi4+fg7m4/h0JmlV3d29V5VOw2+nSfAa+PjJCU6VfGOzD3zvYF4x/mVNrtfBdVrlB6pSEoJCgLomaO3Q6Q7ApYQniB0GxDzg7RRbN3e1mxO0e//o508n4L+bEEQqYfZZSaHdVgAvRi1opwz++vAbzx0e7zGVHd//aF4/DWfR0RG1+WbxmGj9ml3Zyf7TNDxgggf6sDZ5BI88DMLKwJTkfTOKqI/CpGvcxIQAnqSDNzkFGtUzMeDIEQT7mhAPPcq6WPiC X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 4381bc94-7e65-42b1-843b-08d9c637fc84 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:16:41.2929 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MP0eiaOI5lXdSwZp6lVDLAfkIWPIxhXekreBSdD5h6dItpg48yFyd+KA2dboNut9 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0032 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::703 (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::703; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) APP_DEVELOPMENT_NORDNS=1, BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Hongren (Zenithal) Zheng --- docs/canokey.txt | 133 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/canokey.txt diff --git a/docs/canokey.txt b/docs/canokey.txt new file mode 100644 index 0000000000..69262194c4 --- /dev/null +++ b/docs/canokey.txt @@ -0,0 +1,133 @@ +CanoKey QEMU Documentation. + +Contents +1. CanoKey QEMU +2. Building +3. Using CanoKey QEMU +4. Debuging +5. Limitations +6. References + +1. CanoKey QEMU + +CanoKey[1] is an open-source secure key with supports of + + * U2F / FIDO2 with Ed25519 and HMAC-secret + * OpenPGP Card V3.4 with RSA4096, Ed25519 and more[2] + * PIV (NIST SP 800-73-4) + * HOTP / TOTP + * NDEF + +All these platform-independent code are in canokey-core[3]. + +For different platforms, CanoKey has different implementations, +including both hardware implementions and virtual cards: + + * CanoKey STM32[4] + * CanoKey Pigeon[5] + * (virt-card) CanoKey USB/IP[6] + +In QEMU, yet another CanoKey virt-card is implemented. +CanoKey QEMU exposes itself as a USB device to the guest OS. + +With the same configuration as what would be done for a hardware key, +the guest OS can use all the functionalities of a secure key as if +there was actually an hardware key plugged in. + +CanoKey QEMU provides much convenience for debuging: + + * libcanokey-qemu supports debuging output thus developers can + trace what happens inside a secure key + * CanoKey QEMU supports debuging output, thus it can show USB packets. + +Then for developers: + + * For developers on software with secure key support (e.g. FIDO2, OpenPGP), + they can see what happens inside the secure key + * For secure key developers, USB packets between guest OS and CanoKey + can be easily captured and analysed + +Also as this is a virtual card, it can be easily used in CI for testing +on code coping with secure key. + +2. Building + +libcanokey-qemu is required to use CanoKey QEMU. + + git clone https://github.com/canokeys/canokey-core + mkdir canokey-core/build + pushd canokey-core/build + +If you want to install libcanokey-qemu in a different place, +add -DCMAKE_INSTALL_PREFIX=/path/to/your/place to cmake below. + + cmake .. -DQEMU=ON + make + make install # may need sudo + popd + +Then configuring and building: + + # depending on your env, lib/pkgconfig can be lib64/pkgconfig + export PKG_CONFIG_PATH=/path/to/your/place/lib/pkgconfig:$PKG_CONFIG_PATH + ./configure --enable-canokey && make + +3. Using CanoKey QEMU + +CanoKey QEMU stores all its data on a file of the host specified by the argument +when invoking qemu. + + qemu -usb -device canokey,file=$HOME/.canokey-file + +Note: you should keep this file carefully as it may contain your private key! + +The first time when the file is used, it is created and initialized by CanoKey, +afterwards CanoKey QEMU would just read this file. + +After the guest OS boots, you can check that there is a USB device. + +For example, If the guest OS is an Linux machine. You may invoke lsusb +and find CanoKey QEMU there: + + $ lsusb + Bus 001 Device 002: ID 20a0:42d4 Clay Logic CanoKey + +You may setup the key as guided in https://docs.canokeys.org/ + +The console for the key is at https://console.canokeys.org/ + +4. Debuging + +CanoKey QEMU consists of two parts, libcanokey-qemu.so and canokey.c, the latter +of which resides in QEMU. The former provides core functionality of a secure key +while the latter provides platform-dependent functions: USB packet handling. + +If you want to trace what happens inside the secure key, when compiling +libcanokey-qemu, you should add -DENABLE_DEBUG_OUTPUT=ON in cmake command line: + + cmake .. -DQEMU=ON -DENABLE_DEBUG_OUTPUT=ON + +And if you want to show the USB packet flow, you can uncomment DEBUG_CANOKEY +in hw/usb/canokey.c and compile qemu again. Or even further if you want to +show the USB packet payload, you can uncomment DEBUG_CANOKEY_DATA + +5. Limitations + +Currently libcanokey-qemu.so has dozens of global variables as it was originally +designed for embedded systems. Thus one qemu instance can not have +multiple CanoKey QEMU running, namely you can not + + qemu -usb -device canokey,file=$HOME/.canokey-file\ + -device canokey,file=$HOME/.canokey-file2 + +Also, there is no lock on canokey-file, thus two CanoKey QEMU instance +can not read one canokey-file at the same time. + +6. References + +[1] https://canokeys.org +[2] https://docs.canokeys.org/userguide/openpgp/#supported-algorithm +[3] https://github.com/canokeys/canokey-core +[4] https://github.com/canokeys/canokey-stm32 +[5] https://twitter.com/CanoKeys/status/1473647697744003072 +[6] https://github.com/canokeys/canokey-core#virt-card-usbip From patchwork Thu Dec 23 17:17:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572862 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=CiZKMM4M; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKjvc1h2Pz9t5K for ; Fri, 24 Dec 2021 08:27:24 +1100 (AEDT) Received: from localhost ([::1]:49012 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0VcQ-0005qj-2k for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:27:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35960) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwV-0005mV-OC for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:53 -0500 Received: from [2a01:111:f403:7010::703] (port=17069 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0RwT-0008C7-IX for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:31:51 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mqwc1HXGnme6H0cggwl5uuNubudsq++6mEhcPFtnbRMvRD0SLueUNEmVSwox8svyDRE7gT/bfMOn4/MA82I3c78fv1jS+fsq0tZqiqvWsM9oavlL0soSptrQ5EWw2KpGuzjVheCyoSd6rLOETLNoL7LxKmyf3oEPJlSeArDz9ElGJmp/1Ny5W+2zqD0VpXvSK6S92HWTXcuN2xorCF5/GLi4guR3IzUIYZRDtie43Rp35a4zixUfAWTaP6Me3+DPy0L0Ie3S8Lf0zlw1nGSvk07iraGUIV/ejrCu2V832Jc3jR6PO66Zj2dvqfXdWNdctlMWGSHTT4yjnRWzVeaneQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jvbNrQbtFhWjowKjEDRWD70rqlP5OdYtkExHJT+FJso=; b=fO7Jcn6U8fErLmrJJDu9dezQaLrBdFedagjk+qUtJgDerJTVoVYGEt0tzZONOHxir8jL+f8ItLSBNG26Ucg5FZT3/swV5pSHutR/bWiEVPHcfqfoJ+b82+/jK9ny3pMBCkYbCQsy4ph/lO6gj3ETkk1S9ThXKZjyPmf/U4vSc6NTYhOLUkmNx8Xm9CUGzyFan6W4MXlpK6OZW1KFcRPzJENe3hde+PSCTlz4M6FG9DU6LA0W1aF4DcN9TlHdreAP3X/EHJ/HLZX7QqBB/SszXnaNgmk6mwhGm+5RbLe2GSf7z184fMuHPy8ViEJLKJXZFR2gjYcnTcuFclWY1t/zsQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jvbNrQbtFhWjowKjEDRWD70rqlP5OdYtkExHJT+FJso=; b=CiZKMM4Mhb/qmk0LyKdtfkntrpUMThNhVQeFsajMZrYrx3IHBsAkKKfiEgboaGiqiy9APlmUZ01BjJpCMkRBWMmYj3Uk/33OMm+5PzS2Hs+Qmba727jK79FxBR19gvY7kfMo2HgStWRu4EYZtnV1PK/QllORdUINjgNPjCqyj+8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0032.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:801c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.18; Thu, 23 Dec 2021 17:17:13 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:17:13 +0000 Date: Fri, 24 Dec 2021 01:17:11 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 4/6] docs/system/devices/usb: Add CanoKey to USB devices examples Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0062.apcprd03.prod.outlook.com (2603:1096:202:17::32) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b1c76ce2-de0d-4d6a-5128-08d9c6380f9b X-MS-TrafficTypeDiagnostic: TYBP286MB0032:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:276; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NYGmzzMjBNKIEONl6oHZLFlwXLzUZuwtDOeAPC8i0Din6iaVjrFms7kY4GqAKMXq4lnWlVTZ6goBgWAJS09kuIi+TXMdHPjQPK2EmBukqE4hcXzw7rqYlo+OIvHx4xzgXL9UdHaiEQy5wfRsjUPWPyYp/kpeck9olIxVFYJ3yf4AounUhWj3YcHXECF1zh45MFR1JlTI6+boLpHUe5Q+WqjjtiAVM6zVoAo0Gqr6+ZhotnYCYwpkzKZrNeCgQDiRYJMcwQ6IcyHsN53L48ll7ZFOMkiy0/UT/NdRqKVkxY6cBPEficl+ioSJqinDntT2U/UIYyUm5eyomtful4CbAx/xOJ0WXmF0qbMOaKx5iUats7l/aAoiABfApg8ch36Pe/tkzUCP8sox0+dED1lIHwQU8Zofihra/gb1kcyFruBmsH8YFkXjt7c/Q3YWB/MPgMGgjOP8Cl1gkLW4S83boZzaXZHvcTGdaPwKDXTU0gksQHjR9TWgTRqW1XcLKOlwDNYM5hFT31cHTbUdMK2CQgLV57bbNh6PcwkbmQ+37iKIZa5hGRDjFma3ntOF03uk7AlHgaBWb4KJcJ01s9TBppV08Np0f+w0X2cI+PbUUDM/GrT8ON0coxlK1B5qUUeVYHjXXKwIR/QJgtswpW1Xt5htnaebs834ZFLRnqlBzBX1LSThidBZ+ddpWWzwU/eztk7a1EdPhNuogtJLV1VX/w== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(39830400003)(376002)(136003)(396003)(366004)(346002)(186003)(4744005)(4326008)(6512007)(9686003)(6486002)(52116002)(38100700002)(508600001)(5660300002)(6506007)(6916009)(66476007)(786003)(8676002)(2906002)(8936002)(66946007)(66556008)(316002)(86362001)(33716001)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Vg+HjzEWx+1xi8/4go0WqFB2fyMwYdZ+8Md7jaE30AdepQW0Phs7eW2oysoQMEFvkQUTbpGQygxD8CKZosETzKUpWc0hcbSWFYIdryj2kvE5LTRABD4jhGLC9KvEidXCOvs4hT+y+9HUhnYImEo1fOZqApPqQwNCR6hP76BDt8qnBQ/gcPGhtKyByOGUOnGCRCCf1D67mW/g3c/6nAbQHPc0/GVOcV2pY4Fl8b0ooxmUxKYaRJdixxOnIBwO5+zwY74JvqYRaxH2TPmvsLBfmLPx28G3MIyIIHMldrL8gVhyGCDD3kZV+j8wfl6CLDsj1e7Ry4QmN2sWJqClGk+SsZ+DpGodpMVkSvYb1KptfAyjiGRywIhETot+j6U0Yg5eNfntotboypdixvB2Lf9zLfXcfG6ecY1fnYqViu9pRx8H0qyuR/haAJv8n0DxR+2Z9vp9p7H0hZI0rshoaw4ZHg02lRjDsNcWNIOikwKeQSdPOtsdcMKueNnmZwFWfppTzjccRVyafaGD03pVFbxfQoxuE5cOzKPJAoW3Uj9wSRkz+QxnDtpGLdoKowgT+Jk7g7cpmF/udtaGLhT0liM/KVRpTFnM6nsl7yCtCGSliLrSqGVMQl1E/MS9zZQXkuWi71npSxUREZuQaypCocyYGyedbMxVHTr3ku+1++CXZ96WnMW0HtvprTGrA9szHJkAE77+BSLVBIMiECmVAUa46PP8tLXxgGTX+RPSSO4iVE6W/LuWj7B6OawxJu3uGpLJY/tlJL1TAaXUIDJ0EIWvIUVAxVKRhv/5SQDZvfZFIUJQ37UwgVxGPzUJfxwtJ4/e/QVDIiYiyHLU8GA8EWztWlY0oXCnHbBjj4TJBB8AYih/KrQQVox3C9xXQZluqjZBb2addH+OsUf7MaLElShoYdgJfMrU6RRRP03ux563wmuc77zP87C99kB9lrP8bn3QTrVKlFB5Mrdeo6QhIG/Hmmi2cGSF+s+/lJK2F9X1Ev4O+Mn8JY4ZGMMgOPxCvrMaOhioG/RWnEoluAv0G9E4NQDXPPVcNbtw29WlP/OE0o+04icSOpsTflJVCRtC5EkSMsc70PWMl4vTgA+2GDIK95Pl2uOMJDSHjufCIUtAiKEWJYtukHA6wWfly95h5T3pN97PN3EC+w0cH7McqPzd4Xj2+AJsj4z9FZnllzgPMVbWc3/TwD2SzWxzo9RtC9MFaA2mYKgp9ey+5tM1xaI4arEfHzquLmEccUCBdAAnzpOcncYyPp6GMbugBmFxGiDtyWaJ1Zy+PYFhA0wm2i0Dkf55eMH3mtxOaiqQ8OqKUrCQxPJG8uU5N+sOOiWIAUWsYY5x2nV3fnAz5r2W4f/0NuyTYOWnn58EYTnx4GqxrqKTGKXrpvh3PcssHo/rXcMSyXNxcZrXFfaazGMsUWSuztegpnbMrhSWUk7yRUdo1mXBrJYAoPp1feEmAfx255RpmxNQtQZHU+/YdXN1JDP5q2mznHxzAm0rb6DmjDi6rmxxrBxA+gyIg7kEIYN9lixrPZ5Y4ZaXCd7HuJCO3u/TinLnEohLuX/qM/T1inq0kao/GJzUzTxy1/k6s8Y7b9Ax X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: b1c76ce2-de0d-4d6a-5128-08d9c6380f9b X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:17:13.3347 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: T800GQ5xGHgoFwUQkYfcc1TLWNUzfWSugw266FsHdwTbJZ/uVnVQI5X6kRf4Sioo X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0032 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::703 (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::703; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Hongren (Zenithal) Zheng --- docs/system/devices/usb.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/system/devices/usb.rst b/docs/system/devices/usb.rst index afb7d6c226..341694403a 100644 --- a/docs/system/devices/usb.rst +++ b/docs/system/devices/usb.rst @@ -199,6 +199,9 @@ option or the ``device_add`` monitor command. Available devices are: ``u2f-{emulated,passthru}`` Universal Second Factor device +``canokey`` + An Open-source Secure Key implementing FIDO2, OpenPGP, PIV and more. + Physical port addressing ^^^^^^^^^^^^^^^^^^^^^^^^ From patchwork Thu Dec 23 17:17:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572864 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=QBRS8A3Z; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKjyK0NLhz9t5K for ; Fri, 24 Dec 2021 08:29:45 +1100 (AEDT) Received: from localhost ([::1]:57132 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0Veg-0002v5-SD for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:29:42 -0500 Received: from eggs.gnu.org ([209.51.188.92]:36826) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0Ryf-0008La-Mt for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:34:05 -0500 Received: from [2a01:111:f403:7010::712] (port=3645 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0Rye-00007D-3o for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:34:05 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oCrlboEX+Ujx2BMTvApxDsAifbQpxnQGD+qK4drYIXIb0fLTpslUS8eXmgo/e8tjlk0ixd63GVEJ3X6JBeY7evo+6ktLLIfD1p8Wxu7hw/epcfa4ia6BytWgrTw4Bb8m/RBq8xTYdZl36fD6ssBy7mczVAiwEKzKaAb7IkQvW8MXvQ+/6CqPdy6Mw1jtV6LbUOY+PeZ292+DF6jaPTqq5fYTgoa04PXnoXS60Pxh2S5cv9AMe1fRlPbnpG3mQj3dggQNzZVQnSzjJYn7KM6oBuwhye5Wrw8BH5Q27qZ8UpXnZ5byvSkqb2qeXKgtA0C/woVjbGxI8tUGazv0mVTVLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=DygfLQGbhJqR521wVBiYcebCE4eZlY6ki3r8O2Z2u1A=; b=Z1c4o9+XfaK+erJ+Vi5Iz3Q7nIGmOU6lTAY/PNPVAdj1ZOYdwqZ1AjaGu29uUl5RyVXglvIFuzDQfbw2zObMDfs4W34xK5KW+hA14NdVXM9kUg++6f+GeUyvnkEj7LecLaZrjh4wzpiidNprCtVOLSp00SWx2NRs8lyYSNoGXEtHFD+uAKvCc1YbKjKFMv9JZJQXeZXZTpi/1fTvMBCD1KnkSBh20My8Jw8djSphG0yXxxQFTwehAaNeKULhxin68yLlEkBnRkkE2/oto/jJuNEBGPEFE6RfqxeyYR8e05jdgmX5MG53fUGee0aOW5w8YQAnL/f7T/BA2FqmmJQDaQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DygfLQGbhJqR521wVBiYcebCE4eZlY6ki3r8O2Z2u1A=; b=QBRS8A3ZUwPSlvEbIUMFbszKkp/jyJRBQnEUQhQRh+scveSH12733s+r78ykhszU2JZ/fackY4JP6AjjjSA25NeqkaHuuEDO2GxyZjpJqyYMWJSdpQEthpUvPJrEnwpW1fGDqYi2ftbq47PDdTTcju6MlPOf/T94TslxNIiqWnQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0032.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:801c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.18; Thu, 23 Dec 2021 17:17:59 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:17:59 +0000 Date: Fri, 24 Dec 2021 01:17:57 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 5/6] docs/qdev-device-use: Add CanoKey to QDEV devices examples Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0065.apcprd03.prod.outlook.com (2603:1096:202:17::35) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3f1a2122-19d5-4d09-4c69-08d9c6382b49 X-MS-TrafficTypeDiagnostic: TYBP286MB0032:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:332; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CF1SBdDARZFL9ok1NsOE9s33J5AaLlyaxOqs7ldNdQastpJjPcHAqWDMS7Ym+WrBQ/YmBNwy3atdLxnMxAvHHz8DLcMlAuao0d2EBakqY8jfbj1Qt8Wuxx4AYy3sMK/75d1kRfWfQXZJyM3BrUVgeqmxxS40U/YnSU+vl10P7QT/ZD6u7RVSdQyxZ5w166R1K8gQH8zcU80PBpA8fZVuLqPYg1ireXQMzZUs742gu0Ssi2bV6Idy40xYNCHyfR+CoQijZG5iu2fDqAMoVLR+ka6+s7Vdz3AKSJV6ZvH7T+Cjm3uwkxr1mCnRGQVk/vmM5zM+xe01gCfzUQmsems9rrI3uKH7pVQzVae6NrSJvYmsSuCewBuoZW/6z4WkmWgrV7EtDA4l3Jn1Otequn0FtxsEEotLWeW8f7zfL3S/i/d9ngZlj2jTqMxNlCwTiFNqV224ik0sHhct9Jj9GImBFxEZnfuPZRddcUdxy7jk02m1ScD8R8re7Zt+9J8JL0pMTESJoqb23hPK7B55GEMsopfTSrQP3cXOP2FwkXXnDTtMLWgNwvkQWOkYIETJupSUY/s5W9DAfQTC6gIYw2nFL2KuM93RP1LOfzk+C0XD5UfZMvH3UEUQZV8XgcyDA8v8lhXfF9b9aYZG8xbZSUICYFvovox1XfZBNmmKpu1WychaXK9iomlDQawhVhQQOnHgy3muA7KDtpz+STEefh2Y6w== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(39830400003)(376002)(136003)(396003)(366004)(346002)(186003)(4744005)(4326008)(6512007)(9686003)(6486002)(52116002)(38100700002)(508600001)(5660300002)(6506007)(6916009)(66476007)(786003)(8676002)(2906002)(8936002)(66946007)(66556008)(316002)(86362001)(33716001)(49092004)(67856001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kMuoD+HTxfYIlWh3i+etgFn3FVuC2Fcls1eaSStoHK1Rh7OplJsygrKYwq/N1jHY6MNVrbntfHSyU5Kh3oTrvkexXg6dEvZKoELrvcoAGIXGEHX2Q7Q+lO5/I4uhT0MOjZdSOZttqO5QoHKKizjNypU0HBo2Lk4DC3Gy0IRyJ5kihEMrzGIDL+oCtZ+sNDND0zXuxfbBLcCBe/DnB9njaoJ/bclQ57pPEWmD1NA3tg4rVqIxg9UrYST887lFax+RXdbc2aNPzw62bjtz6Iu9QJ5Mb8E1dJAZtJ3Q7PCWL/rANJvn4UZs8Gvpk9gLXS6abHtYCgiAaL1c0srE1algQhhCBEuHb40ZkNXi3VjfMqNY9jXvl8R00WypeWUJtt1NFsYvFyXZbTzAE+QzcSlsV1U7YUKg3gPhX352S6Cfz6/6bNHGvbsAHAt4eK2s2gOhywLS85DD5OZuCleO36z1/jV+MroZVdW+hxLXgt+2qpRDKgWNWo1ELQ9qRhaKffQ8kX4VIyvaiJf5w/wIDqqW6ndy2jew2ZuNkXy/DoEn5s/ja54R1uGWk3hYtgWY50T0aExtwp9bbkm39XrhYHLK3lgdRg3zCcPvYXx3qWWvay0AW2JCMuwo3EeH8VrcSLVWsjgT0SspzpfwjNyp7vE7s5p1SIFETLS1S/xvKahQSqhG15tRHn6WrYzvekw7Q7Ipa43dUsLbwN0CVnI4uT4cscr5V/eEuon/LPbG1G1QvZDcNmjquwg5ihkGatyAL1mj3+UnEVyz+L2EulOUsDlnjE3hLW/lRS7tUJAz6ctkcdTjsJF+gdtKx3NZF2HuLHjkFsXm+WpBq4yksRdg3l1IPs+x1Cf6+XrL6TKJ2LqK49wWH4Jx5ye1da4ZggMdCfY0RQbkNlNybPquBVeioc1rhP4RBEz8AVZdvZvx3USuQC9EnI/eYCb8PBn8TB1vQ6ULXjdwtRUbZWeU0tk+IlB71EfQ+/cBEouttdY52HrnWs6Wzzf2L/IFA7eeNza+LOi9E1kKgaHz6DgRtLrjv8esTh1VValE7gyDgUlDnRT1G/xbD1xqqP/AYKV3B088IyqszQHqu3b/IeR/EUk1DRPRAu+Ej1gC61peAQCZ3d5kWLFxapyAvFOnTmhFY5RxXmmd0mAPpW9yZ2Ytv2MOBZUw7CYoRiObyDlR+gVrbQz1sOzwT9fWOAuup9B1c1XKEqZvD+kCMtku7GMV+Y7spz7Knf+7M9RBHBopSDGjkno7oi2rEci0lnHUbDJGbjBUsoV2AJBrKWFbs3X8BRpCD9RtCZ6wCfD5OWWVRFKLD2eAK0OJYU9PyvlfS9j7L5qO3+HnNG3G0FH4hKiwoGGVOI2Hyp6ibiiCim4rOJYu3Ts1mPRnbne+3krMAB50PS86a8lAg4+FdqnHim50e4yCmsARPypsh9eR+jvrDigZ6Fj+cmlQ5xHCpWfZGHlKUXLUlNq08AAV/NCOHjDLQswGUz0fDBA0ShEgIUcYjN9xoOfEYqFKOEYIosMBEQg2Rn31tK1IDB74rNeQf1ncGYxAqFZzdBsRE3+XfAfwx48MxzM6oyv5wMqoIhJESDbR5zKB0x15 X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 3f1a2122-19d5-4d09-4c69-08d9c6382b49 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:17:59.8046 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PR1ocZsI+1MzN2U/EE7BwPQ7E95bkwCgJhPBTEtcE8SRk6H5Cm8nqZQ+JWsXyEGp X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0032 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::712 (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::712; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Hongren (Zenithal) Zheng --- docs/qdev-device-use.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/qdev-device-use.txt b/docs/qdev-device-use.txt index 2408889334..278fb66c0a 100644 --- a/docs/qdev-device-use.txt +++ b/docs/qdev-device-use.txt @@ -342,6 +342,7 @@ The new way is -device DEVNAME,DEV-OPTS... Details depend on DRIVER: * tablet -device usb-tablet * wacom-tablet -device usb-wacom-tablet * u2f -device u2f-{emulated,passthru} +* canokey -device canokey * braille See "Character Devices" Until v2.12.0, we additionally had From patchwork Thu Dec 23 17:18:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongren Zheng X-Patchwork-Id: 1572866 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=zenithal.me header.i=@zenithal.me header.a=rsa-sha256 header.s=selector1 header.b=e5v9O0B0; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JKk0W67n8z9t5K for ; Fri, 24 Dec 2021 08:31:39 +1100 (AEDT) Received: from localhost ([::1]:33312 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0VgX-0006LX-Eh for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2021 16:31:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:36946) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0Rz3-0001LN-5D for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:34:29 -0500 Received: from [2a01:111:f403:7010::711] (port=15881 helo=JPN01-TYC-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0Rz1-0000CW-Lu for qemu-devel@nongnu.org; Thu, 23 Dec 2021 12:34:28 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VSap+fX2ifymkqOh3FDAVuqPyhlb8O0gMg3Mo18AMagummlw5/UEEK+LXjKWlku6vT4Wtcvhl/VtAn+0Uli3jgYIrJcD4kYIxA+zBonSDNmIWbWxwHS9PO4h8X9DyYcxL21yz4GMzWPAR6NylJ4dJbCLB/tIz2JGwHLM/viP4XMvYM3jfpCxYNoC9a/AEmLIc8cuH+jTl1BaH45nGo9MO2oaPCJlLeGY9wGAVaMCxotJ0zS7mSeaGhA/E+IRIWgA/8iEWxRORYYXyUfR6h08UnMMU5x0jbpVrnY0Bn+WHrLio8CJ5aCrE8VimubGm4yHiRmnvqeITR9QY27UGzbPgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=afbpNv9F6HJOACakV3xKdAuYZSJBe0xyDasQxOohdLs=; b=BuajMkSSbbasdc0t1Uf+YCa/rbrIjAgOZrrV2bKIOeICwRwKVYKsTtTySvRAGsaxjTbY66NCRxp2uynApU346TVmIqRU+fj81sunPym4t8/yeAktdxerplvZIXTT7XHoZdQWcEPQJi8TrE1j+4ipZ0lLyLlrLeBJTVrJCPl3gAbYC1ubh3DaO9tjnHyzu4ztUR1t9cjJ+2sIbAJHnBpU9pOftmwJJzlfV3EZSWZXjB2Yo2khQfrgcbwYE8vsbJzg0mwtZGc0wvozIUbU5mc+MqqCAvp2PUceMzLoDlxcs1MBjbd/mRBvj6C9RpRXq4kI/63B5pPht65GILVxP4BcCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=zenithal.me; dmarc=pass action=none header.from=zenithal.me; dkim=pass header.d=zenithal.me; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zenithal.me; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=afbpNv9F6HJOACakV3xKdAuYZSJBe0xyDasQxOohdLs=; b=e5v9O0B0sxSPazVouEFvHYKXLFkEEpDpoSmqln1ZAI2iqKake//wREyrDnRUdV6KKlK2eLqZYZxDNA3mEhnhQO3HC1M8YkzUFct2++Odw5mkoS9nHpc4gmPU1A5eaO9Z3H5jGFyGwXOCBRv3aNeVWbBpCd6RMobzXR5ffxQN5Wk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYBP286MB0032.JPNP286.PROD.OUTLOOK.COM (2603:1096:404:801c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4823.18; Thu, 23 Dec 2021 17:18:39 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::5cf9:8c86:9001:90d9%7]) with mapi id 15.20.4823.021; Thu, 23 Dec 2021 17:18:39 +0000 Date: Fri, 24 Dec 2021 01:18:37 +0800 From: "Hongren (Zenithal) Zheng" To: qemu-devel@nongnu.org Subject: [PATCH 6/6] MAINTAINERS: add myself as CanoKey maintainer Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.10.81 X-Mailer: Mutt 2.1.3 (2021-09-10) X-ClientProxiedBy: HK2PR03CA0047.apcprd03.prod.outlook.com (2603:1096:202:17::17) To TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 67f69d79-5e71-4718-a9e6-08d9c63842e9 X-MS-TrafficTypeDiagnostic: TYBP286MB0032:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:214; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: u6T3n2pUKTKf+0W99BvWdOphuilj6G1hjAfxyXwce8VDaHiyswimoiE2tJW8FUwdXr67saMFJdAGcjBVQ4TEsiHuPTKxEyApTqg8RDdToWuJIbb4TXvrCk2FiHTHDtBbpoyhoJWPbGYHJa/FbOvu6CDSxgk/p3XyFYDX0ET3lfHChXplHOA3moiwA+iNMw+tWRA1TRLwkDxcmlJmsOGj9HSmcymWfZ2DEDNcwp+N0dC4KxaDWk0H2PdolJeV2Zv0cMr7un08vAdG8aY8GviEqEnVqU/Okl2IJGb7OrGiLGioAT+iiBxWVqj+tErtyvIbOTR6EinfY4sDsM0ynfgdlJXU59e1uOv4wIfP5JszNpETY6VSjfZhDEvTWlokHCV7wAtgp2/H5BMcaSG1/Js17KRFJYr4bVBrrh9ZZ4zKeFxocI/dmn3yg0DiPcz3J8VVMGi32UtkYrqgmF+WchYthOqAbwIyMqpahv2XYZcMWEq280gsYhvwQWsmpFRfBRwBctCEM2tt4DgST4ssGilrSe2NLu2kNfgYtiUO9YakzPPDxFaXYqM2AqwUv047DUXBVtO3qTMhAMnSMZ9SZdwwQiwjZYBWNXMP9wwdB/ZmapZvoipiDpkKafIVAfmc1vdrUhGqzChw6ijN9A9FeERxccK5yaqeys0Ig+gSru+1DyeLdkuJ6rmvuQwLUjK7lam8 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(7916004)(39830400003)(376002)(136003)(396003)(366004)(346002)(186003)(4744005)(4326008)(6512007)(9686003)(6486002)(52116002)(38100700002)(508600001)(5660300002)(6506007)(6916009)(66476007)(786003)(8676002)(2906002)(8936002)(66946007)(66556008)(316002)(86362001)(33716001)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: oc0UMKjCVTgDhgVHW2AmSYuPuuuEPIz6i0Upinm9c1CyCLdHofmZbWtwfnhC2wg8rezz8ZuT3Pv/UC1sJrpMY8QGtmKtN0VsSw13kcTsoCnTBVikZVb+i9hwJNY1lGk4nN2DZOW/QYcsVnkMc0AenQluFvy9wJTbjQ3v2g571MIBMTSnR3k4sTYQ1Q6sIuxfVVkLMataUj6/aooPUwf6deWLlkCM1RK5VkTWgS8nC5Dhg9sCdFM/QdR/eneNmLFTx9Q8gk6960ytfFh9yhPhJgXxesmoDU/ZUJkHz47qtewvXq37aTKFzAy0aK5fhXTeCrMo08kCvctoizVk3wwZMPTFcer1Y12Dc+5a613i0+eo3Bj7rvRBlz6Aqq60ZAQIbzXvMMCUoPEygztIy3rh9ehb4xadg13IMvMXY6JRRIMt8DjyAZYT2T/XoCk1WdWWdfTbexKBLVJ9Oaaxd4k7HY6XWt/063d7w4pNbrDTMfFFVgVf+cRMYGizYGVgaz/6idZ/JLNp3tITj7h9m8CYORomZaBjUCtKcXxUb8wlxAvL3oWcReZNSA4uuQxTa6tBkMl4zOUC+mljWZ1D+JSvkeJhvPH2my2MkqPId0rUmg8D1lLA0XWZo9/9uepQ/SDNTQHGaCwuP0J0FFjIh04cuWlb6TExXn/cDKhQQ61pLLWVUjyegH2IdTl22Ozh8pgwozxXWPYHV7cPdtDU+bw2JMBeTyorH6sbhUYQSHJo9iFdngZRY6x3qARMPJsxOsmzHa/ewhbtAfe6hUDEJh4odVvsmMRWFsT4udw5lxNMiX9PWVpJW62QtgEZbw9JLtSMvaanPSfpIinT7QltUk7+oe6qWiEGewTtDmIWq8sizyu1vNFnLICmMGsHCMYWVL2yCCqNbSF+asicmNoU8FNZuv1dxCox1mR2lC3q2xvqcVCco2zp3iROFaEiwhzYn16nZQviaX2EpK/d+riiPq0jVWAXIieV9AHmFSBLt4ls0yU198kBXG4vnBcXEW1icAqVZ8PlWolCu6HPZdRTS3FrLc5jC3Lr31Ud8zvFEaa9aRM3jN7DB++hqOeN6LG6f00VCcSbCU3Pa61bOHeZ7jkHgRszIVRLQLHWi4/1cYT1AfS2ICeJzpfbHQp8YmfYBKXXbiUQ7/Pq55C79hl8UXAW9CbmyQVDhmZk6hiTkCi2ACN4fxF/Waz/UUiiJ043FTnoDFkdG9qOVMFMeO9Bx0Mqgw50W3zmn7x94fnXMWNMG4to8cfpM2nUrwR77ZfeyGQCckYo76enQ6uFayxFZyJ91haMCM91PoMsgg9H8adXIO9LDUqpfpP+R/myvmAi4Uan/iqAOQNYQEK6GYQJKh62yIV6UxiuUu2BiMfDzicaSCjVHytGAdydumoJGMhEduunHcBYixMw/5P7nWwgIhTeKh5HqXzUpe50ib9pPjFvelRH7GcNjRRhf/RhlgHIWC7Xy5n7jf97TEA3EshuENZICFh4pMTetUSgUnKCSIMnAR7LhDBF85F+4LWQR067GMIblgxqxeq2QRBExRLDRp60H0jck186OF90PkmZDqMxIdR3iFzG2//K1YiV62wj54nx X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 67f69d79-5e71-4718-a9e6-08d9c63842e9 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2021 17:18:39.4587 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 436d481c-43b1-4418-8d7f-84c1e4887cf0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: STzuHJioLQ5cIqRgKCZZHjc+UR/hFtjyObDNk8cS6RPcAR3nvoeR+pZWcDEyp8my X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYBP286MB0032 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f403:7010::711 (failed) Received-SPF: pass client-ip=2a01:111:f403:7010::711; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Thu, 23 Dec 2021 16:25:05 -0500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann , contact@canokeys.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Hongren (Zenithal) Zheng --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 5456536805..522b0e5687 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2295,6 +2295,14 @@ F: hw/timer/mips_gictimer.c F: include/hw/intc/mips_gic.h F: include/hw/timer/mips_gictimer.h +CanoKey +M: Hongren (Zenithal) Zheng +S: Maintained +R: Canokeys.org +F: hw/usb/canokey.c +F: hw/usb/canokey.h +F: docs/canokey.txt + Subsystems ---------- Overall Audio backends