From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964422; cv=pass; d=zohomail.com; s=zohoarc; b=jUUgDRsXTI0pzfz21HaSEGw1pDcuwQIUHrO0lcOaNdm+GylNYcuDn7fIpkN9x1qC8aFq020YYHHY1iN3CMy8RvJEcqFP5ygCGHOHBbiOjM2dN2o312J0u6Zci8F129wOsOEO7Q+gL4eEkqCkPelIPlK25FQ2tqpyyIgz3CO9v9E= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964422; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=j/nYA9TCGBF3bCrJvOG/Xxrf72cbKZDGM39yAMvR4bE=; b=cR/CkMp/RUh+EJ8fNU90Xo4hIhHgXXn8f0rwKZHKgHvze4VilHotEFhlSDivHRU+kO7vrwNt0ra+DzLOODpNWMWSHyymzqdyxl3V0vycqimz0mCfAZefSi6RxZy00o6uI5zzybbgJxt7MsW681CfgPrk4/ZU9I09Ibszvcl7gb4= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964422710547.7754304428692; Thu, 19 May 2022 05:47:02 -0700 (PDT) Received: from localhost ([::1]:50112 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfYT-0006Ln-Dn for importer2@patchew.org; Thu, 19 May 2022 08:47:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53336) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfQC-00063x-L1 for qemu-devel@nongnu.org; Thu, 19 May 2022 08:38:32 -0400 Received: from mail-os0jpn01on20706.outbound.protection.outlook.com ([2a01:111:f403:700c::706]:11246 helo=JPN01-OS0-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 1nrfQ9-00054N-4H for qemu-devel@nongnu.org; Thu, 19 May 2022 08:38:27 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:38:17 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:38:17 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dC5MXJ7DB8btZ1Vc7Il7nTXJycODhKIZOT/57J4q7A8n7RMj0Mwz37O1bBEAzOpzpZvPu5VCP3QHfFVR91ZBLG/8yhRBg7eyNBpJh5pKoJf80CQuIPUC19TFMhGQrNFsLOzc/JAu2yU15BwlU5uY3wLBfOEhqIqEtedRNGaFiKVSBVhLQGCUpxn+PGKe/tzwG4q1Fs687wr/pZqIcjaeOlupwQtrtmnjzyykTXGV+6No0lYkgZ6pskUEv028nRApoNmkfdpvOjMu/cBZzRS9lXNJcwbFNhS/achVcvtJGdIiKiD+IVcNCDA12CbUyFLaNJq+aDMnf/fV4quQzvoq8g== 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=j/nYA9TCGBF3bCrJvOG/Xxrf72cbKZDGM39yAMvR4bE=; b=lZ7OTIGMD5dIJQjIjk1QFzg6FIQ9bkpoOZXXxYojb1Ujx+b+lgGyMXfsl/FQ0IruinCC0X9WNPeZUTugjK5lzn5FCVW6gpjvnkmCFI+cdAvcZKDAqdsAA5IcKqkEsXeznOXmZ4PZy58DKBXbCwroBUXLWOxkynTiGzcSCKuCyAcvakd/7Z/3N89tB6JWGyBFiqf1hPt8WNgLZ7yZVjICGfoj/Qmm5kEb8m7woa57DKXRhVNN7czi+Hq9e/OATkiHdU8XZ/LdQ8M3MA+nWS14yluw0yGGZ1zZ8zybK7jeTdeSb/IWTlUkY517PgZQz+Ycyx563xrU/sNfKuWtu744TQ== 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=j/nYA9TCGBF3bCrJvOG/Xxrf72cbKZDGM39yAMvR4bE=; b=iSCakH3PcmWOX9yblXEU3A7TM+D9HXuaK6qcFFvPBTZ4xqA9YIWbqJQbMAOeeoaBCn4b47N3pfXv991sBXsrYRDFXrngE2MyWVNFksI5mRc3xueSnYvQICfMbspnfnUnipcS0WtH/k6RDqCq/SwOzQ8IRdJrfwLjNsm+I4ON49o= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:38:10 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 1/6] hw/usb: Add CanoKey Implementation Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0038.namprd02.prod.outlook.com (2603:10b6:a03:54::15) 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: 4990aa1c-7e47-42c3-3cd1-08da399472d6 X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bhH8vh9i3IiyEozyARaEOdfxK2GA5P/67qfvj8c3NEWLCZkwQKQxaU3w7XcHMcjC3MtGKiAaMdTY2Orw5lp7gn7HST5QVvkZLrestq1dQnkeXXKaKe6dbO9r8pzXUUCGVfKvQIKSZ3P+yhCekAJEUpwBx0BDSFx+Ubu3mNtAbMAk9JB/CVxtBIdGGuF56cFIMKvAuSSArv4OkHWOlOvfafHmKponEZJeGGulgWkAkCGGY8TaeRGX6qP5XybYoA/VDg7uNpdk2SMz5sCW52W2sz+M5zCkk45dzzmBicDvAkbz2Sf3NS6DOgcokvXUIfUDY1ONXz6+Yt+Uc8YStQYbicxaU+GMRSX9t+73MnzpqbQX8mneUB/u+scSzrSOy76y2vLaKp6OPt7krFpuIYXPK5swPH9MhNMRbITjkz0bX4CTpRcCMPutWEDeC7+nvbTYYRv8VlH5obFMX0RoeDmwC5i4gzDPATLfWYi/eVN1YIusvh+/kKzHS3mubLYbqtoEDApB6z1WYSaZl6jin4ZZLMsA1lJX/z3xbkql5G2DE2ZUTGYnJbSEXaYFZT60+n3MygTUbwFYabEoiBGiTeyz8OxfzDqpAUQ/eHSPECHilZJ+7Lbd2oEua3HawxcCMqIDnKzG7mgDWw1rFAcme6/mZJr2uYj9XyY9oamd6ZPdmwGFrJEbJtrrdMCOaJCnRldQUVVKyIk0ckko/anhXWRJJHmK2b3CRId0M1l8d1DQ1yWC6sbrXPlm2QOXPD36D1FFZNZe9g/XD5KPoCMY+D9BYbg13U30h1wdLhGvlmVHrGY= 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(966005)(316002)(786003)(6666004)(83380400001)(52116002)(9686003)(6512007)(6506007)(5660300002)(30864003)(66476007)(66946007)(66556008)(8936002)(86362001)(186003)(3714002)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KqCyDEdEIjyataOFnoId6ohiB2wpkXdPdDHVhowBf/tpX9+slgGIlMOtKehb?= =?us-ascii?Q?o5o34oH3VM8Ry1mP1dnk0BBdhP1CT/aaUAJi7/l2TMJpjEj4mrcUh3t3B8YE?= =?us-ascii?Q?XpTNY4DwhyJw/Qjp/zGtzhxauHReWwzuaIdWIsy/59VLciCkX7HwYObHCRu7?= =?us-ascii?Q?w27608c6wv7X83pCcyDesa6JRhA4x36aMGA9j4IcAuAvsKGMRl4EsTvX1WUd?= =?us-ascii?Q?FHc8dAmPvFvQR6RKG9M/u0PtCf3yhkuJtEboZoroGdpMK78VuX3IyM3EhtFX?= =?us-ascii?Q?O5qR0KsRXrkAvGm0t86Li39OZpkxJrH/bSKR0ICNumdGDHPklVrBvt93za27?= =?us-ascii?Q?P3UaDiLwqB/Jp8hmOml9Wd6r7f/iChrsGfEus6wYl/Mrrl2/GtkpyZwJUuw3?= =?us-ascii?Q?w92O3x8S9e+W0qe67HoqlRpGphjGDkGAM2mE6F/G1WJkO5Ciw6AYDQnNwXNk?= =?us-ascii?Q?kDD2UtiAn64QsV2/Qaityuh1NDbgBmEWvJt2QIEcFDrSJyAZE4JWtPBoJ+91?= =?us-ascii?Q?DIWXpW8/xAIs3hK6PBis5OEFYHZhmTK5mC9VW8QgL6JOsD+w91eNYEy2wq+0?= =?us-ascii?Q?O7L84EBhq5EibRkYLv5S4hXARLqAr60oCibfwz17IrZlUuPlBQITf13mx0zr?= =?us-ascii?Q?1mSqqJXBCGp2XVP2yCnPZ3ykTk6aPO/yifzQ2p8edA+wCsERuSFxkvU35+BT?= =?us-ascii?Q?iinQ/g12VugQvnouaBPdrzMJzCmWHxNR7Ac50sZ6LCiwn34jdiejh43b7YkW?= =?us-ascii?Q?zS6787XEE+8/i/pXDO8NYHUBCDpWTQK9FTUsropXY+kK0V8W8ei9ayBiJeah?= =?us-ascii?Q?/oBx4PC5fT6/SiPLrl8g63UCH8XnMRbOzWtMzoi53bPk+ZdEisobeSHcY5r7?= =?us-ascii?Q?vXdBX4vD7SeQy+UOmg6QRGvpHHzVzFQNHCVd25wdrE+B/44mSDsz2ti9X5cL?= =?us-ascii?Q?hYZ5IZXSgB+7vxskdxXEgSdfPuj8G619uQ1TcPMhDjtr5m2yk6O5pbi0fbza?= =?us-ascii?Q?fmXa7MMG+cyZcw72vED7eeBW2whcztm4nBWMRCTtIkpT7+NcbAZRQD0ekHZQ?= =?us-ascii?Q?eKs8AepK7IEXQ+81YwPvG4aS2cYwrFTE/nqfS9D5qmmFJEPpgWBd/Qig1sz6?= =?us-ascii?Q?MZWQdWd8hVn7as9ywsEyGAdsphicmicu/Y5Co6lNHaOzS1a45gnVnSQ1+uC8?= =?us-ascii?Q?n45dxqcf8VRiyU0XkLIWEPCHfydx4kbtFccEq8ZV8XHh7baye3UWrrGkKkYF?= =?us-ascii?Q?QhYrUYodXXuhavVBvan+lptIeuetPzPiDr6V9igNWqRcSf9BSSQoIfVTiBui?= =?us-ascii?Q?xPWhBWdfMEfFQNEZzfvNTYVReV9wGUJGIz/uYqLFQQMTAOGxtkF/W63ywJEs?= =?us-ascii?Q?2+MtZuT+1ul9dgC/i5CeWAPDpwW/XGNqSXO7OZ5ovAbvlxqJPp2SUcCSKxra?= =?us-ascii?Q?rY3Y2etq5pbcjnZotMs8TmIp5Tx+Eu7MXVajRbrAIcpqpYK9ZGUoPqVrRaFE?= =?us-ascii?Q?xyGyyVwTHkwAN6mUAbu20DLESHNF2aB1Kg+QjYQazVYN+s1UTvYi9nQK3HjW?= =?us-ascii?Q?OMce4zDaOiAsVbrB8lO/rn+QJmFjwND2ErLtTRipYXABuWrU9UMKGyZ8sexN?= =?us-ascii?Q?1TZDqo6O2zW2jB0mn3dpe/xDM1zv5/auOjC8HGp0IsPZDsDbltKeIUIjEHoJ?= =?us-ascii?Q?Z5c2y8EKl6SpgTGvP1bTgMmC3nAyMz5dGcmLN89lPhLigJwgx0ZXAwFbqDN4?= =?us-ascii?Q?qt0MdKXAFQ=3D=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 4990aa1c-7e47-42c3-3cd1-08da399472d6 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:38:17.4212 (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: 0Gdvt0w6BuI/JHbSjU0IQu9gZHaL2dQySmuEhkt43BjksGXcdEkul10GUufdrCFG X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:700c::706; envelope-from=i@zenithal.me; helo=JPN01-OS0-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964424145100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 | 300 +++++++++++++++++++++++++++++++++++++++++++++++ hw/usb/canokey.h | 69 +++++++++++ 2 files changed, 369 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..6cb8b7cdb0 --- /dev/null +++ b/hw/usb/canokey.c @@ -0,0 +1,300 @@ +/* + * CanoKey QEMU device implementation. + * + * Copyright (c) 2021-2022 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 "qapi/error.h" +#include "hw/usb.h" +#include "hw/qdev-properties.h" +#include "desc.h" +#include "canokey.h" + +#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 =3D 1, + STR_PRODUCT, + STR_SERIALNUMBER +}; + +static const USBDescStrings desc_strings =3D { + [STR_MANUFACTURER] =3D "canokeys.org", + [STR_PRODUCT] =3D "CanoKey QEMU", + [STR_SERIALNUMBER] =3D "0" +}; + +static const USBDescDevice desc_device_canokey =3D { + .bcdUSB =3D 0x0, + .bMaxPacketSize0 =3D 16, + .bNumConfigurations =3D 0, + .confs =3D NULL, +}; + +static const USBDesc desc_canokey =3D { + .id =3D { + .idVendor =3D CANOKEY_VENDOR_NUM, + .idProduct =3D CANOKEY_PRODUCT_NUM, + .bcdDevice =3D 0x0100, + .iManufacturer =3D STR_MANUFACTURER, + .iProduct =3D STR_PRODUCT, + .iSerialNumber =3D STR_SERIALNUMBER, + }, + .full =3D &desc_device_canokey, + .high =3D &desc_device_canokey, + .str =3D desc_strings, +}; + + +/* + * libcanokey-qemu.so side functions + * All functions are called from canokey_emu_device_loop + */ +int canokey_emu_stall_ep(void *base, uint8_t ep) +{ + CanoKeyState *key =3D base; + uint8_t ep_in =3D CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ + key->ep_in_size[ep_in] =3D 0; + key->ep_in_state[ep_in] =3D CANOKEY_EP_IN_STALL; + return 0; +} + +int canokey_emu_set_address(void *base, uint8_t addr) +{ + CanoKeyState *key =3D base; + key->dev.addr =3D addr; + return 0; +} + +int canokey_emu_prepare_receive( + void *base, uint8_t ep, uint8_t *pbuf, uint16_t size) +{ + CanoKeyState *key =3D base; + key->ep_out[ep] =3D pbuf; + key->ep_out_size[ep] =3D size; + return 0; +} + +int canokey_emu_transmit( + void *base, uint8_t ep, const uint8_t *pbuf, uint16_t size) +{ + CanoKeyState *key =3D base; + uint8_t ep_in =3D CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ + memcpy(key->ep_in[ep_in] + key->ep_in_size[ep_in], + pbuf, size); + key->ep_in_size[ep_in] +=3D size; + key->ep_in_state[ep_in] =3D CANOKEY_EP_IN_READY; + /* + * ready for more data in device loop + * + * Note: this is a quirk for CanoKey CTAPHID + * because it calls multiple emu_transmit in one device_loop + * but w/o data_in it would stuck in device_loop + * This has no side effect for CCID as it is strictly + * OUT then IN transfer + * However it has side effect for Control transfer + */ + if (ep_in !=3D 0) { + canokey_emu_data_in(ep_in); + } + return 0; +} + +uint32_t canokey_emu_get_rx_data_size(void *base, uint8_t ep) +{ + CanoKeyState *key =3D base; + return key->ep_out_size[ep]; +} + +/* + * QEMU side functions + */ +static void canokey_handle_reset(USBDevice *dev) +{ + CanoKeyState *key =3D CANOKEY(dev); + for (int i =3D 0; i !=3D CANOKEY_EP_NUM; ++i) { + key->ep_in_state[i] =3D CANOKEY_EP_IN_WAIT; + key->ep_in_pos[i] =3D 0; + key->ep_in_size[i] =3D 0; + } + canokey_emu_reset(); +} + +static void canokey_handle_control(USBDevice *dev, USBPacket *p, + int request, int value, int index, int length, uint8_t *dat= a) +{ + CanoKeyState *key =3D CANOKEY(dev); + + canokey_emu_setup(request, value, index, length); + + uint32_t dir_in =3D request & DeviceRequest; + if (!dir_in) { + /* OUT */ + if (key->ep_out[0] !=3D NULL) { + memcpy(key->ep_out[0], data, length); + } + canokey_emu_data_out(p->ep->nr, data); + } + + canokey_emu_device_loop(); + + /* IN */ + switch (key->ep_in_state[0]) { + case CANOKEY_EP_IN_WAIT: + p->status =3D USB_RET_NAK; + break; + case CANOKEY_EP_IN_STALL: + p->status =3D USB_RET_STALL; + break; + case CANOKEY_EP_IN_READY: + memcpy(data, key->ep_in[0], key->ep_in_size[0]); + p->actual_length =3D key->ep_in_size[0]; + /* reset state */ + key->ep_in_state[0] =3D CANOKEY_EP_IN_WAIT; + key->ep_in_size[0] =3D 0; + key->ep_in_pos[0] =3D 0; + break; + } +} + +static void canokey_handle_data(USBDevice *dev, USBPacket *p) +{ + CanoKeyState *key =3D CANOKEY(dev); + + uint8_t ep_in =3D CANOKEY_EP_IN(p->ep->nr); + uint8_t ep_out =3D p->ep->nr; + uint32_t in_len; + uint32_t out_pos; + uint32_t out_len; + switch (p->pid) { + case USB_TOKEN_OUT: + usb_packet_copy(p, key->ep_out_buffer[ep_out], p->iov.size); + out_pos =3D 0; + while (out_pos !=3D p->iov.size) { + /* + * key->ep_out[ep_out] set by prepare_receive + * to be a buffer inside libcanokey-qemu.so + * key->ep_out_size[ep_out] set by prepare_receive + * to be the buffer length + */ + out_len =3D MIN(p->iov.size - out_pos, key->ep_out_size[ep_out= ]); + memcpy(key->ep_out[ep_out], + key->ep_out_buffer[ep_out] + out_pos, out_len); + out_pos +=3D out_len; + /* update ep_out_size to actual len */ + key->ep_out_size[ep_out] =3D out_len; + canokey_emu_data_out(ep_out, NULL); + } + break; + case USB_TOKEN_IN: + if (key->ep_in_pos[ep_in] =3D=3D 0) { /* first time IN */ + canokey_emu_data_in(ep_in); + canokey_emu_device_loop(); /* may call transmit multiple times= */ + } + switch (key->ep_in_state[ep_in]) { + case CANOKEY_EP_IN_WAIT: + /* NAK for early INTR IN */ + p->status =3D USB_RET_NAK; + break; + case CANOKEY_EP_IN_STALL: + p->status =3D USB_RET_STALL; + break; + case CANOKEY_EP_IN_READY: + /* submit part of ep_in buffer to USBPacket */ + in_len =3D 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] +=3D in_len; + /* reset state if all data submitted */ + if (key->ep_in_pos[ep_in] =3D=3D key->ep_in_size[ep_in]) { + key->ep_in_state[ep_in] =3D CANOKEY_EP_IN_WAIT; + key->ep_in_size[ep_in] =3D 0; + key->ep_in_pos[ep_in] =3D 0; + } + break; + } + break; + default: + p->status =3D USB_RET_STALL; + break; + } +} + +static void canokey_realize(USBDevice *base, Error **errp) +{ + CanoKeyState *key =3D CANOKEY(base); + + if (key->file =3D=3D NULL) { + error_setg(errp, "You must provide file=3D/path/to/canokey-file"); + return; + } + + usb_desc_init(base); + + for (int i =3D 0; i !=3D CANOKEY_EP_NUM; ++i) { + key->ep_in_state[i] =3D CANOKEY_EP_IN_WAIT; + key->ep_in_size[i] =3D 0; + key->ep_in_pos[i] =3D 0; + } + + if (canokey_emu_init(key, key->file)) { + error_setg(errp, "canokey can not create or read %s", key->file); + return; + } +} + +static void canokey_unrealize(USBDevice *base) +{ +} + +static Property canokey_properties[] =3D { + DEFINE_PROP_STRING("file", CanoKeyState, file), + DEFINE_PROP_END_OF_LIST(), +}; + +static void canokey_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + USBDeviceClass *uc =3D USB_DEVICE_CLASS(klass); + + uc->product_desc =3D "CanoKey QEMU"; + uc->usb_desc =3D &desc_canokey; + uc->handle_reset =3D canokey_handle_reset; + uc->handle_control =3D canokey_handle_control; + uc->handle_data =3D canokey_handle_data; + uc->handle_attach =3D usb_desc_attach; + uc->realize =3D canokey_realize; + uc->unrealize =3D canokey_unrealize; + dc->desc =3D "CanoKey QEMU"; + device_class_set_props(dc, canokey_properties); + set_bit(DEVICE_CATEGORY_MISC, dc->categories); +} + +static const TypeInfo canokey_info =3D { + .name =3D TYPE_CANOKEY, + .parent =3D TYPE_USB_DEVICE, + .instance_size =3D sizeof(CanoKeyState), + .class_init =3D 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..24cf304203 --- /dev/null +++ b/hw/usb/canokey.h @@ -0,0 +1,69 @@ +/* + * CanoKey QEMU device header. + * + * Copyright (c) 2021-2022 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 Canokey (i.e. hw/canokey.c) + */ + +/* CTRL INTR BULK */ +#define CANOKEY_EP_NUM 3 +/* BULK/INTR IN can be up to 1352 bytes, e.g. get key info */ +#define CANOKEY_EP_IN_BUFFER_SIZE 2048 +/* BULK OUT can be up to 270 bytes, e.g. PIV import cert */ +#define CANOKEY_EP_OUT_BUFFER_SIZE 512 + +typedef enum { + CANOKEY_EP_IN_WAIT, + CANOKEY_EP_IN_READY, + CANOKEY_EP_IN_STALL +} CanoKeyEPState; + +typedef struct CanoKeyState { + USBDevice dev; + + /* IN packets from canokey device loop */ + uint8_t ep_in[CANOKEY_EP_NUM][CANOKEY_EP_IN_BUFFER_SIZE]; + /* + * See canokey_emu_transmit + * + * For large INTR IN, receive multiple data from canokey device loop + * in this case ep_in_size would increase with every call + */ + uint32_t ep_in_size[CANOKEY_EP_NUM]; + /* + * Used in canokey_handle_data + * for IN larger than p->iov.size, we would do multiple handle_data() + * + * The difference between ep_in_pos and ep_in_size: + * We first increase ep_in_size to fill ep_in buffer in device_loop, + * then use ep_in_pos to submit data from ep_in buffer in handle_data + */ + uint32_t ep_in_pos[CANOKEY_EP_NUM]; + CanoKeyEPState ep_in_state[CANOKEY_EP_NUM]; + + /* OUT pointer to canokey recv buffer */ + uint8_t *ep_out[CANOKEY_EP_NUM]; + uint32_t ep_out_size[CANOKEY_EP_NUM]; + /* For large BULK OUT, multiple write to ep_out is needed */ + uint8_t ep_out_buffer[CANOKEY_EP_NUM][CANOKEY_EP_OUT_BUFFER_SIZE]; + + /* Properties */ + char *file; /* canokey-file */ +} CanoKeyState; + +#endif /* CANOKEY_H */ --=20 2.35.1 From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964697; cv=pass; d=zohomail.com; s=zohoarc; b=JGz9zBNWZZIpBJXOYNCz2bBa+KZivuR7Z5UXCvapVtJJANKkxMNexKdnDBqgKllFIC7W2vPfbOdBENIParRiAMw3Xhs7+sb5K30mJdmT78qdEmMchcn0JgcJ3GTEB1z9jV2mZre7YtBgOzMkioqJKUmBKSJAOGwDg9/lmr9fQ/g= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964697; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IIUCUuY2Lh3MTCQEfkNzPB9zDFOZpY6Y7IexX1kQCY8=; b=DX47MM8S/EQptC73QyoNnh/1UfL5H25JM9jFVeJYhxLbSwnGi1ccg9VQWc7ClPVbfhjgd5XdMh3qSN7XQOrw446kY8hCXJPGiEkjGKdcw9E6P/ls+wbB5GP79V78P4Nfp9dxR0qvQbVCayxJAd4VDW5VMyg9ulXuW++glZxnV38= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964697165394.5984666716448; Thu, 19 May 2022 05:51:37 -0700 (PDT) Received: from localhost ([::1]:57730 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfcp-0003HO-Le for importer2@patchew.org; Thu, 19 May 2022 08:51:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53450) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfQT-0006Aw-FF for qemu-devel@nongnu.org; Thu, 19 May 2022 08:38:45 -0400 Received: from mail-tycjpn01on20708.outbound.protection.outlook.com ([2a01:111:f403:7010::708]:60716 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 1nrfQQ-00058Y-Aw for qemu-devel@nongnu.org; Thu, 19 May 2022 08:38:44 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:38:38 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:38:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=V8+oYkqQ1jIjKcQKCBDdTYGCwWYmcQ4G6c49Q4UcKrMANanjynhevqVKNiaIfh7K1jmES4wNCDWpMFMa8ZXT7ryzO2KMuwNtZGq3Ri27B3SKP9rNqQjSBuixKY9766T006+5YcecDyqJOvZ1eGJX6bATTj5L5waAM8oTrHktqEYPXZ/jwJEpXt+gEmh6XR79n8Rl9M2tcqmYqzQcV2iW8W6yp0rtgosKIKqzfzGp/kQe9AvRXdh68NHUAM+SQJx+moCt2LdA6hzRYHXBYarK1pJA5D60HzKYRmSbbHqun55SI2F+Pc0C6smCYv4OcEk8UL6daP1fL/17zgmobwdxOA== 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=IIUCUuY2Lh3MTCQEfkNzPB9zDFOZpY6Y7IexX1kQCY8=; b=fLOYyix9mzxZxPY0rgooSSXRMmNdyqFZK04wuXvz7ZmeogLwNVaPJcP9yUp68hVH2j7J3GC+LeYdcfMNZDH6yG9AUljhDeS4jYWn7UEMATNTv2KsUbyXyeeHDT8iF+9tzHwJljtBPfIF5q3bUT46JVEvUG1A+zGpsnHiU47H/R5draILL1akppW27TH4piPHxd47SvWzsJZYzdAX4QIkvp6csbr14Bvy+mPwhoxnLAf50oQzi9z9KsI6zzJVrff1mwhXsjV65Pw8URbB+lo7OAMJkbyQPT8GCsPWaQQAQmSzdF/WQTyA2V6gibXWADyuCtMPos511ekCjSOFmtwdJA== 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=IIUCUuY2Lh3MTCQEfkNzPB9zDFOZpY6Y7IexX1kQCY8=; b=SvqIvg9m45fdihRMohVGMjbiCPBM6RC8QQ6BpSz4Zs4o2Ql4aIOJmUeTI7IosAV3cJmRX1e/RxgDphsho5xa2TVjrmstVY0hileHhRzOYa/x9QNVsAAd3ulfYArDCV1k5AjmP2V/acdHrd/nU7fbrpKLXIIpg/X73e5eLF5vmlU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:38:30 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 2/6] hw/usb/canokey: Add trace events Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0037.namprd02.prod.outlook.com (2603:10b6:a03:54::14) 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: 2f8c9c44-34c7-4e0a-c3dc-08da39947f24 X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 12ZCZI4WXSTEnC5WlIhC/pjNbiW4zHLYpDLOCk6zfnsDKwRLYjZtaZjPrAApQ+0rKmA3azHSjS/89yno6OyExR+kd3ev872hxmQ4tzH3CodjeQQvjIMFrfcmetdmKq95LLK6M5mE7kAdVYC2QJ95XDmA1e+YdIC9h2wZyqHqTMN1ZJQg7EKyi0/j8v6yTP/Q9ZRQdnS6yVZba8Lss1N9WCPifjvQ/BwupXRh7YsQTOjbTyXPFvBrDcDEuC9ssckeQcioH3Py5pKaVsr/3oJ1hEiyg7WBMzsdMxxDDf67XOi/wyd7nUSRqM7M+uHN5wtG0fiuUff0EbhsvwZcPqWamoXQLiE3hVz35gE8RZOIB2fXe118pNaRx9CZcoMfoo9OJad8CHAYIa4jSdPGFdRcjHXWKraYT0wvsDTMsA9w1rbn7TAc6NyMjNDBbotkbcxMfVc8CRGC1es0ffCvHNTsyv7zTJ/YyOb//So7d6a8qizS69F2uPM4yeVZ3ei+rGPPsD0oPdOMONYyc7mFcidgKOknSmwrTOG5wBBP4Zt6srmNfHTZgCdff4FYKV4lN2ICA9pgyL70y009y4W0wx+p8uR8AjoiY6HYyCQYx6vw6hcsm1RrQ8+H886fy+ywSy+FudiTUEYB5okKxk/BvGjpQ/LxebSI4ws1D7i8xdzNR+YNWk+h6QeA4SYDCp/1hS8KE3RDf43KV6YVdOmCnjCNkQ== 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(316002)(786003)(6666004)(83380400001)(52116002)(9686003)(6512007)(6506007)(5660300002)(66476007)(66946007)(66556008)(8936002)(86362001)(186003)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6aN9PNs/NfOPv7U+XIOqv4UT7fRx+IiyROY/SFgpYt1842kmQvPbHz5sdZeU?= =?us-ascii?Q?OaYIrmdQIF2y1U+fYA2CBI8Iztg4c/yKM7+IXOK0mrGvfE1bOO9rjAVOqL6u?= =?us-ascii?Q?j5M8E5vHlTvPmqmjwCPR3J8K0KAVjnc3C1Y9MmXkJF1zr9Xg82R9Aki0Nr8z?= =?us-ascii?Q?kd7/igFtX33MX1T/GBt9H5danKNe/kI3ZfO2bPxyxEmFPf6ZwNU/lLSdwoeI?= =?us-ascii?Q?X0yOys3T9luVhw9jJHiWzyX+18rNOOeNhGOBHA6FkuHHksbFHkAtqVOvIqzO?= =?us-ascii?Q?eMFNR9N3NvhWVGv5tSVzQu46CtacW1X5IblvwyGoHZc7KIJ1KD2kPDQNfKxq?= =?us-ascii?Q?vAcyT/L42XQsRluFu0g4mRYVJdSmTLUgwcJUt00A9YTRV9Ki0Sjf10IufbAL?= =?us-ascii?Q?78cG+MlR04e9PjpKy3wJoYIiAN1bMDqZkSeMQVxJz8gDD7wFqdY0SP4eQ+xY?= =?us-ascii?Q?6NsXTS2MZL4+Zt6fPlgEsQMPQH5ZZx7ci7GCk+i9o0tCfMqBQg9TeHL7qffp?= =?us-ascii?Q?pMYC5Azvtor35cGihW86sP9BhQB9C5XkdZHxcLKgKzRtjKXw0QUZEjOb0Uwf?= =?us-ascii?Q?r0Lf+aqciBLxhbpP1tFYnYkstk2pxxqMJf+kPhdVZR8JpiwyDdoIy+/AjCwL?= =?us-ascii?Q?dxAO6Mpc1AFc3mY+kuGuV+Pwu3tVlvDy7xw0t6zlupRWVjshBBcsAvZtN3Ef?= =?us-ascii?Q?i9hoiiY0fLJJlJnVEVWcxvmTAq/5nxVh8A0OsJaTT7Zg/M+BlI7ArRXuc7uD?= =?us-ascii?Q?roTzvjb8ziF+U1mIhacVFKHsl/D1fRoUWfoKduhvbsfAXuF0n9oeBq1ioBcP?= =?us-ascii?Q?qnLWQp37610GxekrM2+DBh3yAj/Dm4dArpRkTAsHAIGwJtG+Xk0Ob8Hj0sF7?= =?us-ascii?Q?Y89QVyDS+UouTi7d6NbWzWQx/h0qg7uxA1UHLdSWqkfMc6ZxxeRdYPz3daXg?= =?us-ascii?Q?oP0OGxFdkUrPsJDgNwUOEyM1zLRDMlj3gewwloIervvkDOaUv4MWbiVjJGDJ?= =?us-ascii?Q?HlBt7ijPDq9ORhdBhzAlKy/wy59WlRh6SxERnt+AaeJhi6i3T6O9VfYaX2tr?= =?us-ascii?Q?XSdfwa/z1h3qA09WtUD7y5nk1GQE6iCxoIsByg5fI1ac/ggxLy+L/pM46lhz?= =?us-ascii?Q?JIR9XUlPYlu5e9mL0oXFlI6rNS3/YjSqsbmo7ni007TcHV9VhqPx8RPPH1e3?= =?us-ascii?Q?k/OeyttF9vEgCgZ4MiQe7Zy1YodviO6ggYrrm/bXZ8xGT5mFgNJW8825VDKb?= =?us-ascii?Q?JYJ9D+krh3hxFYGqCaYYgfpx1V/wKQPU7QTNMNXeCXXYC3kOJcVHSSTA9X2n?= =?us-ascii?Q?liXcOVC/D7+MRlcpOijqyxrbSAY3f3uJrFKoWceyWs8n1Ff12hQELs3OyELE?= =?us-ascii?Q?vfYG0g/IaPufvnZcjD4ZOfR/0JFmgGq53rLBvdr8KtUFPxKtKKvVr/dTMjBQ?= =?us-ascii?Q?A34HYS1yonF3q0068vzjGNJz09GyxdUL4kSHjy1+E8dp8yio81G5zazphnj1?= =?us-ascii?Q?BsQO58SuDcDt85UleYjXnMJXwsZx26q8IwKmBboNEy21P1k3ZnYrt68piXJQ?= =?us-ascii?Q?v/zf8OLhiKzi/Nda8ne/IzgMdBG+NJ4xQxMq5wAdbmyC4sXy6MkFwgxfaI7X?= =?us-ascii?Q?NXIlpFLjTYuGUwUV6x0Mkz+HESdAT2ew4HQAkH/VyiIfB0dpE+7JkfY0RH44?= =?us-ascii?Q?gf0L1cawWLHfIAbVOHX3udKMUOFYCEqyJ+LQODoiB18PG4z+ErXAl/qWj4W4?= =?us-ascii?Q?XHzOhyBnfw=3D=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 2f8c9c44-34c7-4e0a-c3dc-08da39947f24 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:38:38.0529 (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: cHq/7QVyYBYlK6v4uSXqCL0OPLGS+15OFpErzMqocz8aD2hSoX1lSn2XEcVfkubA X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:7010::708; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964697970100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Hongren (Zenithal) Zheng --- hw/usb/canokey.c | 13 +++++++++++++ hw/usb/trace-events | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/hw/usb/canokey.c b/hw/usb/canokey.c index 6cb8b7cdb0..4a08b1cbd7 100644 --- a/hw/usb/canokey.c +++ b/hw/usb/canokey.c @@ -14,6 +14,7 @@ #include "qapi/error.h" #include "hw/usb.h" #include "hw/qdev-properties.h" +#include "trace.h" #include "desc.h" #include "canokey.h" =20 @@ -66,6 +67,7 @@ static const USBDesc desc_canokey =3D { */ int canokey_emu_stall_ep(void *base, uint8_t ep) { + trace_canokey_emu_stall_ep(ep); CanoKeyState *key =3D base; uint8_t ep_in =3D CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ key->ep_in_size[ep_in] =3D 0; @@ -75,6 +77,7 @@ int canokey_emu_stall_ep(void *base, uint8_t ep) =20 int canokey_emu_set_address(void *base, uint8_t addr) { + trace_canokey_emu_set_address(addr); CanoKeyState *key =3D base; key->dev.addr =3D addr; return 0; @@ -83,6 +86,7 @@ int canokey_emu_set_address(void *base, uint8_t addr) int canokey_emu_prepare_receive( void *base, uint8_t ep, uint8_t *pbuf, uint16_t size) { + trace_canokey_emu_prepare_receive(ep, size); CanoKeyState *key =3D base; key->ep_out[ep] =3D pbuf; key->ep_out_size[ep] =3D size; @@ -92,6 +96,7 @@ int canokey_emu_prepare_receive( int canokey_emu_transmit( void *base, uint8_t ep, const uint8_t *pbuf, uint16_t size) { + trace_canokey_emu_transmit(ep, size); CanoKeyState *key =3D base; uint8_t ep_in =3D CANOKEY_EP_IN(ep); /* INTR IN has ep 129 */ memcpy(key->ep_in[ep_in] + key->ep_in_size[ep_in], @@ -125,6 +130,7 @@ uint32_t canokey_emu_get_rx_data_size(void *base, uint8= _t ep) */ static void canokey_handle_reset(USBDevice *dev) { + trace_canokey_handle_reset(); CanoKeyState *key =3D CANOKEY(dev); for (int i =3D 0; i !=3D CANOKEY_EP_NUM; ++i) { key->ep_in_state[i] =3D CANOKEY_EP_IN_WAIT; @@ -137,6 +143,7 @@ static void canokey_handle_reset(USBDevice *dev) static void canokey_handle_control(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *dat= a) { + trace_canokey_handle_control_setup(request, value, index, length); CanoKeyState *key =3D CANOKEY(dev); =20 canokey_emu_setup(request, value, index, length); @@ -144,6 +151,7 @@ static void canokey_handle_control(USBDevice *dev, USBP= acket *p, uint32_t dir_in =3D request & DeviceRequest; if (!dir_in) { /* OUT */ + trace_canokey_handle_control_out(); if (key->ep_out[0] !=3D NULL) { memcpy(key->ep_out[0], data, length); } @@ -163,6 +171,7 @@ static void canokey_handle_control(USBDevice *dev, USBP= acket *p, case CANOKEY_EP_IN_READY: memcpy(data, key->ep_in[0], key->ep_in_size[0]); p->actual_length =3D key->ep_in_size[0]; + trace_canokey_handle_control_in(p->actual_length); /* reset state */ key->ep_in_state[0] =3D CANOKEY_EP_IN_WAIT; key->ep_in_size[0] =3D 0; @@ -182,6 +191,7 @@ static void canokey_handle_data(USBDevice *dev, USBPack= et *p) uint32_t out_len; switch (p->pid) { case USB_TOKEN_OUT: + trace_canokey_handle_data_out(ep_out, p->iov.size); usb_packet_copy(p, key->ep_out_buffer[ep_out], p->iov.size); out_pos =3D 0; while (out_pos !=3D p->iov.size) { @@ -226,6 +236,7 @@ static void canokey_handle_data(USBDevice *dev, USBPack= et *p) key->ep_in_size[ep_in] =3D 0; key->ep_in_pos[ep_in] =3D 0; } + trace_canokey_handle_data_in(ep_in, in_len); break; } break; @@ -237,6 +248,7 @@ static void canokey_handle_data(USBDevice *dev, USBPack= et *p) =20 static void canokey_realize(USBDevice *base, Error **errp) { + trace_canokey_realize(); CanoKeyState *key =3D CANOKEY(base); =20 if (key->file =3D=3D NULL) { @@ -260,6 +272,7 @@ static void canokey_realize(USBDevice *base, Error **er= rp) =20 static void canokey_unrealize(USBDevice *base) { + trace_canokey_unrealize(); } =20 static Property canokey_properties[] =3D { diff --git a/hw/usb/trace-events b/hw/usb/trace-events index 9773cb5330..914ca71668 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -345,3 +345,19 @@ usb_serial_set_baud(int bus, int addr, int baud) "dev = %d:%u baud rate %d" usb_serial_set_data(int bus, int addr, int parity, int data, int stop) "de= v %d:%u parity %c, data bits %d, stop bits %d" usb_serial_set_flow_control(int bus, int addr, int index) "dev %d:%u flow = control %d" usb_serial_set_xonxoff(int bus, int addr, uint8_t xon, uint8_t xoff) "dev = %d:%u xon 0x%x xoff 0x%x" + +# canokey.c +canokey_emu_stall_ep(uint8_t ep) "ep %d" +canokey_emu_set_address(uint8_t addr) "addr %d" +canokey_emu_prepare_receive(uint8_t ep, uint16_t size) "ep %d size %d" +canokey_emu_transmit(uint8_t ep, uint16_t size) "ep %d size %d" +canokey_thread_start(void) +canokey_thread_stop(void) +canokey_handle_reset(void) +canokey_handle_control_setup(int request, int value, int index, int length= ) "request 0x%04X value 0x%04X index 0x%04X length 0x%04X" +canokey_handle_control_out(void) +canokey_handle_control_in(int actual_len) "len %d" +canokey_handle_data_out(uint8_t ep_out, uint32_t out_len) "ep %d len %d" +canokey_handle_data_in(uint8_t ep_in, uint32_t in_len) "ep %d len %d" +canokey_realize(void) +canokey_unrealize(void) --=20 2.35.1 From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964433; cv=pass; d=zohomail.com; s=zohoarc; b=jsY+PaDM3HpYyqUftcrSTo9p0OY+MAZlX/6bd4VbbsdnAPcOjpWIbaY+gI8lYXc0EwNo4Doi5EAJRQ6r0Sgx7Ent0rLX1uvTA9FxRkoQEgyPawZPQzy6bztKUrx+Zk3aHnjy6sCR+XE7T5hSwlCeRNNSTW68YYWTt7RKlkNZ8ng= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964433; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=3XJwRT4PNG8Cu8Nf2KXsBunXVRA+RntPXOfgxq49WPA=; b=jYLT5sDgAbyfXvERuJ8CCh3f/ppiJ7vix7dzQv3ZISmOpwMPCSVqSeAFtqtT84J4v66v+o4Ol6exYDmUdHPDWo2rA/f4YwRpHBHBm+MBPiyoFu/WmkIniIzJ+vLiecbJlwsV8/TpRVSP8k5QV6TyUcDI+aqhbW0IWkr6D0/N4Ds= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964433612722.9534336229909; Thu, 19 May 2022 05:47:13 -0700 (PDT) Received: from localhost ([::1]:50694 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfYe-0006kh-Gk for importer2@patchew.org; Thu, 19 May 2022 08:47:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53518) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfQs-0006UB-Jq for qemu-devel@nongnu.org; Thu, 19 May 2022 08:39:13 -0400 Received: from mail-os0jpn01on20725.outbound.protection.outlook.com ([2a01:111:f403:700c::725]:22702 helo=JPN01-OS0-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 1nrfQq-0005D8-F5 for qemu-devel@nongnu.org; Thu, 19 May 2022 08:39:09 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:39:04 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:39:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LRht5Que12jyo9JGHY6g2BPEfoi9i4ogFZp8yL5ps1lJv8mWvgsc5BZqJGU0irJTwIw1HX6PnKDcpIS/AJYGN7zpXia8sLFZfUMloXBesou3wjLdbwZSECZeYGw9wOy/NeVuBlo3fVcsABeGDLP414pgLVhQJrGXdHGk09GFFgoyKPNs6p+Xs3v2oENdh2ZveDkeBk3og6odC+nVOsJgmfkRWA7snglIQiQAkuaoSXlb5JzUADvkx63nQhgpTtWqYMeGZz6P+zZxbhmB9vfp92IohMhlNs7uEgaZQ99K78cIOgTIT27ogtZWaTFvAnVf0x0CdfW1MT2EpuZLdTHeAQ== 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=3XJwRT4PNG8Cu8Nf2KXsBunXVRA+RntPXOfgxq49WPA=; b=V8KFJYV0GH1AHrRhW8Dju2zGufMhNvXVMHifuf8M3yf7pntRSNaiW99T2YpPuVznQ0y3ThBbWfuMFOFPmxsUYyBTWYL3EuaAkqOsYvOJP3Ws4rXKbQgH5yoxeflNI8gapIExJb24Jyz5TQhWh1ccMUyhG+w3mHJbaOGIjdjbl3HmqLWXmBtghB61MmWyZ82rN6V0wn4IG9lI9j9HT8/zG2mkKPWkwnKXom0Aa9F2dbJI6+EWGMwsR3IZK4UrrqLbj36Q0cngvPTDTKYXU3RvuDs8IHhSV/cL3Ig8n/V/pcw8rv2ATicmavP1EuR16WCxprVmbQyQqjQrLzXagIHAbg== 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=3XJwRT4PNG8Cu8Nf2KXsBunXVRA+RntPXOfgxq49WPA=; b=qxH0w+9JV0x6UPvepNiegc1Tgb9mkl0y3+fCGoTiMtlmPDhDEGwbWDCNoe7tQH5lYkW3PYkYDZf+CtmmLrdsRaTvxXwD7+HAHKant9vp58l8eLS7pDbBZ69Z0gkuMpT5rZwxCJgDC9YkV0EVMdYMEc2uo8oPvOG0ExPcIV+11vs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:38:57 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 3/6] meson: Add CanoKey Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0072.namprd02.prod.outlook.com (2603:10b6:a03:54::49) 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: aadc2b32-dabe-48b3-975b-08da39948f10 X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x20xwOGCb1aq0RN5NQ8iiVAE2qnnfyIpranAMuKY28Z56AlTqrJssbIU+HwtC19PCrH3euwI5VZQbifB16EoSxelcTGDI0NlrihxoZpMxH3TwkcwHRgJ6yRW79h4Z91pUJBuDByntulPLAWAcx7Jf4/VpjN+VyBj2RXGmn1PNvk7kF0ltAaR1qx1YEgtKXvUg4xirqgKGKubGAi5KSiIVVaBz3fB1XzMWGoHd2iV9plXqL9ciqmNLu9kXMztcJs3HStpUST502YdR3PhSzcR4Qclkx1JIpRASJGG/vB5kU49mA3l5KpGTwjJrR05o0yR7m2xm/DWKQPu1EoIAtV2Se37J1RXxI1VCIKlsOHTM7jcEx/JnBei300RWCHeTtE/CpIalENRO3Mz7+APvjI+1t7BfklFog9tMS2eOEoO+3KHluQ8mmfBrzex80uwO/x6K3rf+4eHhVyoffDmEGx8Gglxp2+ahmFS/Qh2lsTqNwlWr5JJhM82dIGFuHgFGvqvVL8HCm9xD6wV2nRjBaOJ+ouRDUrnuIViIJA8PJGtxkGZ09jBCNQKSRRk44cz+InfFSCovnz1D8lQPPhpnaUf1e4MYIufa+CFz5jmMczQY9xw2UAQmpvbC7MpGbuaSVOylLt45kGfalzV8zwl+JqYsAE23q2gQhtsbbrNNCV7rtlT7lqLIBTAheLSC7HPoMriZl6mKVillvRWjK9CjNUpAg== 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(316002)(786003)(6666004)(83380400001)(52116002)(9686003)(6512007)(6506007)(5660300002)(66476007)(66946007)(66556008)(8936002)(86362001)(186003)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?LHRwR6N7blaFHMo4MkZlT2g25rV3WbOS2SdyVaZBwqv77ib1QwjLNy6Y3peq?= =?us-ascii?Q?VnDWhUR9RArwxMONGtIPdhDppMgXPmAthcdzwcbpUsF6ddoCkBLqOnjXO8ZG?= =?us-ascii?Q?NoonDDCHiHedibYdHntQdvy2lfldbjJ665YdcG3/30z+p6hFrgyjr14Fcb5v?= =?us-ascii?Q?OR4fc6nKuwRjLeyFT6dkgLaTHxuAAjKccvvaNXJC+NM4PQPinfz0ANEjI7nM?= =?us-ascii?Q?Yoty5cmWHeJBzanpid1OftdKoaR97xCdswzuRBigi9hDKvmA6opNqcxcqzNE?= =?us-ascii?Q?QTnIYXlFjwuSkDNyyCoegizGOWfNhlag5xaLr0tK669hrV01JIYcpj1voYmk?= =?us-ascii?Q?JhEQl/0pbs4pafqKMtegItuZinpTAnKotaY10fHw8rrvNfAtWZ/uQDT5Oe+t?= =?us-ascii?Q?OCuQgdMAv2taL55HwHsrwyoFv1mMynpmKMrtPGyRgV4c6MKtmwH0PlSjCgBm?= =?us-ascii?Q?SolbLxfiBWC05fJ0sg9iK2JKtcrtPDEcLhJjI1nhzgRhjGkxQO6Pd5JzfGoo?= =?us-ascii?Q?ZQ+BwklS2E+RIZWDFbBPTpVx46K901LmqU0bFdQwIwCRXe+sFgH3CPhZp0BH?= =?us-ascii?Q?KqM7QVX7Irg7IEUaEPKQnvwJzmVCtRIMi/bMOIuEiihymPJvweIXcV4U7iAU?= =?us-ascii?Q?5MmhIeYdraJ6m+7uLK2n3U8bgLKyYzu9KFXwHZOB+MAXLKUA74BrnzYa4kzo?= =?us-ascii?Q?+hEpSSock9xfztiX0LlvFcYrrZNpP4k2z2/dWP8+/Cpj/BBmGKo4oux0kRlw?= =?us-ascii?Q?Ed+G1bgbBVxYO6IQPlCxEreoqGcbh5MLXNe1zm3yhIO2fKbX3LGCuF9L+O3i?= =?us-ascii?Q?Mfl8ZfjTCXr2AeoZ/u6Q41k/h3tcpJ9UUASGWY8Gb+umKp94TsDsO4e0c+v5?= =?us-ascii?Q?Er3meyNpY6vgzlg/YttrhFmjtGkIDM+oG+9NF/K9rC7nvDaKBSGXHjsEhRzq?= =?us-ascii?Q?xdB0SJr2uCWxQTeWJI+pvmwdgiSlZKUcUML9jjKE7Ak3pBk+nJTzQU4ju0lR?= =?us-ascii?Q?XSaqR3ve4nRZHdlAqPJOhGvzyiMrB7aerm9g6Yd8QBCDXlEtD+c9c6K2aWzZ?= =?us-ascii?Q?ixchmChsg+NeXNEwZr/oV70eZpydc+CDvU6lqqOKXpiUSVOb/mEbU8cqY6ZE?= =?us-ascii?Q?LEjzMbm/UP14XeRpaBEA3riD9uCbg/EjG4HMSbUPPs/4GvrRbAGoetUM+d6N?= =?us-ascii?Q?Crzsrwp92PvAMG3/HHngAlt0ayHouvscxkr7iTaNTqD1t/oxWu/cRsmPH1Lh?= =?us-ascii?Q?nsb2rmXrgYVTv20RSL3EkQOjXnaOBDPbVQdVVHLkQfs9qF01iTDuLFvBSCpn?= =?us-ascii?Q?DTZ+opIsPG09Pc/9DFxnnUynjPudbExsAub2QmA9dp3nIig9ybvV+djRIFaQ?= =?us-ascii?Q?oRdv4HvwbFLmrhXQSWjSfGXz6ffLHewUG3aQwHXmN210k1LC1ehEj6pZt+W2?= =?us-ascii?Q?znYeqOcrMcc/GRASM3hvRoK8uylU2Wy6gTF485vYA0bFOC4XNhhB4/BDZE2b?= =?us-ascii?Q?klgAXyLbImG3QUPN03iS8SH8LlO3s5Zq36qn8erL6Rj7fGOCN4AxhMBB6Cof?= =?us-ascii?Q?GVAUOHyE5NguRRRYDl6cs8j3iFKZwam+7nTfIJPb8fWQ1qxqooH43V/DZzse?= =?us-ascii?Q?dwy3UkwArsyfV3TM10ztpwnW94Uxw2ImRME+kczjKQnkGgZPvjoBe7pmlCBe?= =?us-ascii?Q?OS+dw8TtwcC50qj8pupADr6haokYVmM26hc48M0NbdrNUsyVIpKuMeLYhLrM?= =?us-ascii?Q?mIQRqw5ztA=3D=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: aadc2b32-dabe-48b3-975b-08da39948f10 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:39:04.7798 (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: ToBiFQhdnxNeCi7hzGC4kONTaPnu5eMzMInTrs4C33IyedaGDs7PTIOq4Gxf1skc X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:700c::725; envelope-from=i@zenithal.me; helo=JPN01-OS0-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964434083100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Hongren (Zenithal) Zheng --- hw/usb/Kconfig | 5 +++++ hw/usb/meson.build | 5 +++++ meson.build | 6 ++++++ meson_options.txt | 2 ++ scripts/meson-buildoptions.sh | 3 +++ 5 files changed, 21 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 =20 +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..793df42e21 100644 --- a/hw/usb/meson.build +++ b/hw/usb/meson.build @@ -63,6 +63,11 @@ if u2f.found() softmmu_ss.add(when: 'CONFIG_USB_U2F', if_true: [u2f, files('u2f-emulate= d.c')]) endif =20 +# CanoKey +if canokey.found() + softmmu_ss.add(when: 'CONFIG_USB_CANOKEY', if_true: [canokey, files('can= okey.c')]) +endif + # usb redirect if usbredir.found() usbredir_ss =3D ss.source_set() diff --git a/meson.build b/meson.build index 53a4728250..7f90e49ee6 100644 --- a/meson.build +++ b/meson.build @@ -1383,6 +1383,12 @@ if have_system method: 'pkg-config', kwargs: static_kwargs) endif +canokey =3D not_found +if have_system + canokey =3D dependency('canokey-qemu', required: get_option('canokey'), + method: 'pkg-config', + kwargs: static_kwargs) +endif usbredir =3D not_found if not get_option('usb_redir').auto() or have_system usbredir =3D dependency('libusbredirparser-0.5', required: get_option('u= sb_redir'), diff --git a/meson_options.txt b/meson_options.txt index 29c6b90cec..b41066aa11 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -189,6 +189,8 @@ option('spice_protocol', type : 'feature', value : 'aut= o', 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 5d2172bfb4..af2e7bc8e5 100644 --- a/scripts/meson-buildoptions.sh +++ b/scripts/meson-buildoptions.sh @@ -76,6 +76,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" ' cloop cloop image format support' printf "%s\n" ' cocoa Cocoa user interface (macOS only)' @@ -205,6 +206,8 @@ _meson_option_parse() { --disable-brlapi) printf "%s" -Dbrlapi=3Ddisabled ;; --enable-bzip2) printf "%s" -Dbzip2=3Denabled ;; --disable-bzip2) printf "%s" -Dbzip2=3Ddisabled ;; + --enable-canokey) printf "%s" -Dcanokey=3Denabled ;; + --disable-canokey) printf "%s" -Dcanokey=3Ddisabled ;; --enable-cap-ng) printf "%s" -Dcap_ng=3Denabled ;; --disable-cap-ng) printf "%s" -Dcap_ng=3Ddisabled ;; --enable-capstone) printf "%s" -Dcapstone=3Denabled ;; --=20 2.35.1 From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964261; cv=pass; d=zohomail.com; s=zohoarc; b=H11lXvnm0ykutL6Bnk6UEgq9phQKAqJmAq7lBwT+N0V/yO0XuK582Pmt8zlyGdAEa+CbPeChX/Ix/KOzJ9S3eGxoP6yvr83okp8I7KU/weFljfUyp4IfRKW63nBD3awM1yHTYNHmbnCovl7KoOEI8U1hCJfY0Imx7B+D4dIB/JY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964261; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=bJm0wwotQL94hKe1osYOGi8+1nATB70YGkLh/Pbh0ns=; b=guEi+FBveVM+j2lfOEEkW7GpAcyxfoZ1nAJw5aIO3xBRDw1MnfNpE5sbkvn2M06LmyfHe+Nt9LBJx+6soEv/QAwG6hcjU47uBMTrNxld8GoV/bFLLbfeSU7w/jB4tRoa9RLqnuaHFR9uhniRuyd8BYjjKYTAzFTG9zJd9apTSco= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964261331315.67078786760237; Thu, 19 May 2022 05:44:21 -0700 (PDT) Received: from localhost ([::1]:43570 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfVr-0001mO-Nb for importer2@patchew.org; Thu, 19 May 2022 08:44:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53646) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfRk-0006nW-T2 for qemu-devel@nongnu.org; Thu, 19 May 2022 08:40:05 -0400 Received: from mail-os0jpn01on20723.outbound.protection.outlook.com ([2a01:111:f403:700c::723]:43512 helo=JPN01-OS0-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 1nrfRU-0005N5-EF for qemu-devel@nongnu.org; Thu, 19 May 2022 08:39:50 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:39:45 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:39:45 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cOlpo64gFvpC5twBVki3Z03z/tFKQRqhOgnL6KMkgKXO9f2H40rX0c6L44+O8Ltu73Ul7h+If7Q2dMGORyGZHRACkB8XyyUc+yi0tsxwgYjd6iDv5WpJygZrR+zGK1BfAqLgipGVRyS7+m/ROmEdU67V6z9yCCC7mM2OBPFlPAVqSldkFtV/kAKHYrEUR/C4dXiHawYQSHEjtAoHghfbXDmf2b6EQWEKbwx1nAE66WgsyAlzRVDcZGtE+JAx6MXFBn0BxNv6SB/kiASKkrXkZOrAeamTC69QXMFuXjUQ0NZYbrQm/7/Gb8jXUJhMAdU6ZywCZZYc2lD/sJXRfyexpA== 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=bJm0wwotQL94hKe1osYOGi8+1nATB70YGkLh/Pbh0ns=; b=geJXJ51ydK3bWNL9SF7rv/eQ9U1Mto9uiPX4NjjNM7xNpJWk63N2ryTixI4GeCMNr5ND6aVNXnM9bAmkLdQi1JKE+eNRBvDCmBKTql3/gQIHCz6diBO9wpkJHsKNEsc95gKr8uOPZPdIvZCjT3WYzlXyXdOckAajzSCt514dw3zqAHV+SzOBKnXp6fRnczwmnpuJ1GUvs43S0KvNN/i1V2CdYlaHhIxE65Km6+pTMAuicSmssBqRP2sao4Qt7tFmToObBbcDZwC+b0PkguKD8l2zgHaevcfnhCasCDoW2PQnqU/osPhbtUlKbOyFsEG92s92ofeChlU0Ck2IYGMnxg== 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=bJm0wwotQL94hKe1osYOGi8+1nATB70YGkLh/Pbh0ns=; b=fK1u0FXetHSpt2wqurdl2NPQa7vLB4s54Q2giJJ/gRJfP59CdV4tEu5XU/ySIt89KWAO/pJcoeitLTcdmhyuogdBygGkGN0LNqKjgZMP7NBa62vlRB4lFJ7I34n8hSoFbVJGPEf9ST5c6qM3ZPLRBpHVRanILYhj/p1Fh3Io14U= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:39:38 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 4/6] docs: Add CanoKey documentation Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0070.namprd02.prod.outlook.com (2603:10b6:a03:54::47) 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: 61fe58b8-47e1-46cc-65e2-08da3994a730 X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: R9e3P92UFT0aKebkwjy1sTBKBWqnLhCPFMdjy8crzl7OKpcLJAoUkHgsDxeH0Cp99FFS83G+IdcQD+jZJPyBU2On7+jhqnW6of3HM9yxv6T9z8lGLcDk+N3fKxBP9+wepR6BTbTwWvA9uJ/SiD3BKEA2N0Eg2z6AdWsESyQrzAt09zIxeOF2vJkcXXKUu4ZBUdHxSk0b6QBCGEtkgFyXz+AIrHzWMo1HFgURu9mUNwBKCD0VZovgiV3VjO8gN/grhg7a9QtsIWForkLj/oOMSd/nThSvuetfzDf6W0qCKZyMvn0CoZ8iJqwRXYbmeWmxcK7JgqnZ5+ilpvjxHLiJm9XlkYpxmTAYS9mGZciDKQPk9JMjSZCXXfduVEESVUhycsaoQ3jsFB+13R9xXPbK3X2Dv4UjsClvwvU4RHvMOA/GLuMCLNkpe83zUa+3Z2ZbiPhgvrt7lwwYbMGpjnXp2R+ytXlvpqnIa3djloDm16ya2Mv4yPKwLWlFk5qChhrN73xjO/xkQxJ1j49xERZEE+ksF+d+Tv1S1YdGdUeR3pDc6LUBH4vOxjAWeR6LD2SajREFpojbaPoR39QyQXp1z51k3Olf07L3agw448TdsO/X7zFLgqNOPhvPgX2qPZFVYhGWbjsO1Px2u+PabceL358oIX0Gu95Be85LCs6W+nq2xbYKye6XJ3MrFKyhlk0JcTpz9/wpQCfih9GkV3dmc+HcdbmLIxjN9GHk7LRNzPnDV3ar5J2zzfGdYGV65zYkMvuLpgDTBnD7HVjBg4NtWHFlGv58mqz4L72qQIr3XRc= 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(966005)(316002)(786003)(6666004)(83380400001)(52116002)(9686003)(6512007)(6506007)(5660300002)(66476007)(66946007)(66556008)(8936002)(86362001)(186003)(49092004)(67856001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ydtGwFzwM0+XNQsQgYlPFwogTvxU4+qjVPg2pMkHLtchKAw7xCgfqysl84s6?= =?us-ascii?Q?yNGhbpe6CQZaA3J8WEPt42H8rM6Ea6+xtIN1Ajh0a2A77FP8gM1NZdMgeBWc?= =?us-ascii?Q?Oz3p+R1B778cAIWcjvmEQ1U4DWNTvtTjcri2EmLFO0gX1UoYtVEMlQ27BT15?= =?us-ascii?Q?e1VV2oVevJjJjVVTANJmpuK3yVOsvmTPKECaX9nGWAZZd5//HfkifOtGAcVH?= =?us-ascii?Q?ngIkckR75BYmiVCapS/tC0BRWE/H2ntnKHdzCyAA9DJzXwtvQs7y+A7AO98I?= =?us-ascii?Q?Ce8mlCbBLqs04nbmxghW8P30Kqfua5KYoHcYUdSICEavcJXajrXlVIbi+b3n?= =?us-ascii?Q?Sy3SRQBD4o7dm43ftAda6n3JvLNGCLK8QGPGUkAwc8Cvnsfp1FSxl8oqONCj?= =?us-ascii?Q?2wygXbBDK8u7quy8TIjnufVU0HUKGiN1/oOp4PriB/M6HgL9RLwRUnH5QicH?= =?us-ascii?Q?hKdeRNrl+ke3HyFo81H6vq99sKqCYGYaHzZIVL/R/iSfZHhvH2CLKki7oeso?= =?us-ascii?Q?D4cE+Z3qDV7BZOG+N3cLON1EjNNQ2DKZxggdkb6A7mMRmvlBJZSywg8kRxhs?= =?us-ascii?Q?6YDVn+dScagbFziT6ChLSTCdAGIl66Mw8wjs2MdcxYD06zbNStl1lUtT8bEt?= =?us-ascii?Q?54WGNdZpRLbqUZ+2Q9sVP/hYAg4B0uEmv0u2BD3WT4D0jcD/HtOGQ58r2lTM?= =?us-ascii?Q?ID3O65rykf+LWfa7ASzOroZaRzA06rE/OHFYEaVLuhYvVIsgpBF3vDN4OMsS?= =?us-ascii?Q?OG8EJz679Dym9L6Qen0MLxEkNuOQIv8sGVHu6ozEm0lYU01td6Lw1ECes19f?= =?us-ascii?Q?5ly+fKOQQetdJR31kArFTJUo9eZlYN8DYhyEidji/+FmQxLAjRkgsSMzVHhz?= =?us-ascii?Q?l1bgbFND2XFsMCRB8qzdcY8f9/YYx0L3nTQRWRX1pPTR/383D61hsExUM2Ft?= =?us-ascii?Q?xmu/085QiBmGmmYRg4fxet2o+BlTjZYfI3dV8PUC9ig71X78QzMVH6H6L56y?= =?us-ascii?Q?Bbkpfv/vymH34StcMZButl6kLKYFrs94yQ0wIT7yKBWh78dGFzfK/RXJNMeH?= =?us-ascii?Q?CIXPgdx+YKFXtPV36NncjybG2PhS7ZOW3iVnPqoc/GcagbPIvtcoLi/WQl6D?= =?us-ascii?Q?h9vjRS6C9veOgWs6cdaijUQuUu0bZDnQb1RatwIirSoLiIh51cuQN+RqNV6/?= =?us-ascii?Q?OqYK8SE3y/m0r6xIQfvIgK2XdK2+6wHZT8v9T3mqFeU7xh1I6O4f0ONAitFg?= =?us-ascii?Q?3B+N6r01X9WdMZcBBd3YKCtHaf7jki/gN3Blzuh/0TkLIASo95PT6RmiQdPR?= =?us-ascii?Q?n77K9dY3JpfErfPDO024e+tKH7eyaI/crfpdeUdnyC3yepvqpEZPNb+Wpu7e?= =?us-ascii?Q?NENm06CPI2lRDIc7wAgUBnaZn0pgLwcrCpYx1Cw4mi5x6EetPATV1NE5i4/I?= =?us-ascii?Q?jHmHYW6t03QlYIvUppWkclpSK0iyDlg3PcHt8fYekscuW3GhJ4gxi7H14R65?= =?us-ascii?Q?Pn10NtC/62eFUj7BgX9ozV39X4nwurv8o9Ckw3SX96uUkdw2GQEsFHHasUXK?= =?us-ascii?Q?aDzqtvaef81SsPAZ6y4P5+4VbAvJ+AjDo7yOeLnyqx1i4eN0oV8jVs86Eznk?= =?us-ascii?Q?rxtQEsXL3RjB+8UJHe/TPYSqE92//iorTrI8r+odugHH/3NJfgeWJT0ZLJp5?= =?us-ascii?Q?WPDIqNwO3ZqT4BI9og2sPr7Vd/fHz9N2psMJwkwO5PFRi2pv0YvrpBer+5T5?= =?us-ascii?Q?u/3T/rPeeg=3D=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 61fe58b8-47e1-46cc-65e2-08da3994a730 X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:39:45.2727 (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: 0wDQgHB+iqa3ky837ekgOhZ2MSaX+dxbHjuzOiYv3KRL4Qnj9faJRFTw29u8sex8 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:700c::723; envelope-from=i@zenithal.me; helo=JPN01-OS0-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964262964100002 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Hongren (Zenithal) Zheng --- docs/system/device-emulation.rst | 1 + docs/system/devices/canokey.rst | 168 +++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 docs/system/devices/canokey.rst Note on the qemu-xhci issue: For FIDO2 packets, they follow the pattern below Interrupt IN (size 64) Interrupt OUT (size 128 with payload) Interrupt OUT ACK (size 64) Interrupt IN ACK (size 128 with payload) This can be captured by `fido2-token -I /dev/hidraw0` or `systemd-cryptenroll --fido2-device=3Dauto`. I doubt this is a feature of libfido2 that it sends IN before OUT. I've been coping with this pattern for a long miserable time, you can see the url below for a example https://github.com/canokeys/canokey-usbip/blob/e9db44f1aa7f46c7dd7266a682d7= 78921edbeb49/Src/usbip.c#L33-L36 In qemu-xhci, it assumes a pattern like this Interrupt IN (size 64) -> usb_handle_packet Interrupt IN ACK (size 128 with payload (not possible)) <- usb_handle_packet returns Interrupt OUT (size 128 with payload) -> the next usb_handle_packet Interrupt OUT ACK (size 64) <- the next usb_handle_packet returns However, for device, it can not ack the IN token if the payload in OUT token has not been passed. Also, we can not have a trace like this because we are single threaded (not async) and the next usb_handle_packet must be called after the return of the first usb-handle_packet (emulating async interrupt ep with sync thread is painful) Interrupt IN (size 64) -> usb_handle_packet Interrupt OUT (size 128 with payload) -> the next usb_handle_packet (not possible) Interrupt OUT ACK (size 64) <- the next usb_handle_packet returns Interrupt IN ACK (size 128 with payload) <- the first usb_handle_packet returns The code works for uhci/ehci in the following way Interrupt IN (size 64) -> usb_handle_packet Interrupt IN NAK (size 64) <- usb_handle_packet returns ... there are many IN NAK here ... uhci/ehci reschedule OUT before IN now Interrupt OUT (size 128 with payload) -> the next usb_handle_packet Interrupt OUT ACK (size 64) <- the next usb_handle_packet returns Interrupt IN (size 64) -> last usb_handle_packet Interrupt IN ACK (size 128 with payload) <- last usb_handle_packet returns I think qemu-xhci should retry/schedule the failed IN token after receiving NAK instead of failing immediately, because interrupt endpoint is async. However, I'm not so familiar with qemu-xhci and I tried to debug it but in vain. The debug trace only showed that after the first IN NAK it retried and then use `xhci_ep_nuke_xfers` to cancel the IN packet. After handling the OUT packet, the IN packet is not retried and the whole QEMU stuck there. Interrupt IN (size 64) -> usb_handle_packet Interrupt IN NAK (size 64) <- usb_handle_packet returns ... nuke_xfers Interrupt IN (size 64) -> usb_handle_packet Interrupt IN NAK (size 64) <- usb_handle_packet returns Interrupt OUT (size 128 with payload) -> the next usb_handle_packet Interrupt OUT ACK (size 64) <- the next usb_handle_packet returns ... xhci_try_complete_packet ... the whole QEMU stuck here as there is no more IN token scheduled You can see that in canokey_handle_data of hw/usb/canokey.c I NAKed for early INTR IN, this is what u2f_key_handle_data also does so I think the bug is not in canokey.c Also, canokey.c works with uhci/ehci controllers diff --git a/docs/system/device-emulation.rst b/docs/system/device-emulatio= n.rst index 3b729b920d..0506006056 100644 --- a/docs/system/device-emulation.rst +++ b/docs/system/device-emulation.rst @@ -92,3 +92,4 @@ Emulated Devices devices/vhost-user.rst devices/virtio-pmem.rst devices/vhost-user-rng.rst + devices/canokey.rst diff --git a/docs/system/devices/canokey.rst b/docs/system/devices/canokey.= rst new file mode 100644 index 0000000000..169f99b8eb --- /dev/null +++ b/docs/system/devices/canokey.rst @@ -0,0 +1,168 @@ +.. _canokey: + +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 features 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 +* (virt-card) CanoKey FunctionFS + +In QEMU, yet another CanoKey virt-card is implemented. +CanoKey QEMU exposes itself as a USB device to the guest OS. + +With the same software configuration as 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 + inspect what happens inside a secure key +* CanoKey QEMU supports trace event thus event +* QEMU USB stack supports pcap thus USB packet between the guest + and key can be captured and analysed + +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 since this is a virtual card, it can be easily used in CI for testing +on code coping with secure key. + +Building +=3D=3D=3D=3D=3D=3D=3D=3D + +libcanokey-qemu is required to use CanoKey QEMU. + +.. code-block:: shell + + git clone https://github.com/canokeys/canokey-qemu + mkdir canokey-qemu/build + pushd canokey-qemu/build + +If you want to install libcanokey-qemu in a different place, +add ``-DCMAKE_INSTALL_PREFIX=3D/path/to/your/place`` to cmake below. + +.. code-block:: shell + + cmake .. + make + make install # may need sudo + popd + +Then configuring and building: + +.. code-block:: shell + + # depending on your env, lib/pkgconfig can be lib64/pkgconfig + export PKG_CONFIG_PATH=3D/path/to/your/place/lib/pkgconfig:$PKG_CONFIG= _PATH + ./configure --enable-canokey && make + +Using CanoKey QEMU +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +CanoKey QEMU stores all its data on a file of the host specified by the ar= gument +when invoking qemu. + +.. parsed-literal:: + + |qemu_system| -usb -device canokey,file=3D$HOME/.canokey-file + +Note: you should keep this file carefully as it may contain your private k= ey! + +The first time when the file is used, it is created and initialized by Can= oKey, +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: + +.. code-block:: shell + + $ lsusb + Bus 001 Device 002: ID 20a0:42d4 Clay Logic CanoKey QEMU + +You may setup the key as guided in [6]_. The console for the key is at [7]= _. + +Debuging +=3D=3D=3D=3D=3D=3D=3D=3D + +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 ``-DQEMU_DEBUG_OUTPUT=3DON`` in cmake comm= and +line: + +.. code-block:: shell + + cmake .. -DQEMU_DEBUG_OUTPUT=3DON + +If you want to trace events happened in canokey.c, use + +.. parsed-literal:: + + |qemu_system| --trace "canokey_*" \\ + -usb -device canokey,file=3D$HOME/.canokey-file + +If you want to capture USB packets between the guest and the host, you can: + +.. parsed-literal:: + + |qemu_system| -usb -device canokey,file=3D$HOME/.canokey-file,pcap=3Dk= ey.pcap + +Limitations +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Currently libcanokey-qemu.so has dozens of global variables as it was orig= inally +designed for embedded systems. Thus one qemu instance can not have +multiple CanoKey QEMU running, namely you can not + +.. parsed-literal:: + + |qemu_system| -usb -device canokey,file=3D$HOME/.canokey-file \\ + -device canokey,file=3D$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. + +Another limitation is that this device is not compatible with ``qemu-xhci`= `, +in that this device would hang when there are FIDO2 packets (traffic on +interrupt endpoints). If you do not use FIDO2 then it works as intended, +but for full functionality you should use old uhci/ehci bus and attach can= okey +to it, for example + +.. parsed-literal:: + + |qemu_system| -device piix3-usb-uhci,id=3Duhci -device canokey,bus=3Duh= ci.0 + +References +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +.. [1] ``_ +.. [2] `= `_ +.. [3] ``_ +.. [4] ``_ +.. [5] ``_ +.. [6] ``_ +.. [7] ``_ --=20 2.35.1 From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964262; cv=pass; d=zohomail.com; s=zohoarc; b=BFj7XIAPRcZeevYJC6kv5Pvdl94rpUexgSUzZVq9aR1DI0lfvbRIQNXjuaBmoYDAQnPKoGxB95tgQ18uZBNudFQ0XachmXntggGQpQYkiuR9v0tsODDdIX8pABQ9PXWvIQslf0SpwUg9uBEISnjxdfuaFtM9YJTvT2PqfTql1V4= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964262; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YdCC+gP1XGz7HTI3Eu/AG4LoNCOCg5qyKDk7DRjqKQQ=; b=aboYaX18YUjDu/6fDL+gTYTIeJgXbjfDgigwYj3o8pqEQA0ud/ukxqxAcG/K5nEAq09B1KmR9o2n+F5c8VvUfQfyinxePQMg+ZajnGbjSBUdlU33Wd9cN42AaJlGwEy5g02AHYvcKO5UvAM9ZBQ3EyYCgGTqSfEE4KAZRZkezm0= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964262420855.0438924496112; Thu, 19 May 2022 05:44:22 -0700 (PDT) Received: from localhost ([::1]:43732 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfVt-0001sm-Ch for importer2@patchew.org; Thu, 19 May 2022 08:44:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53820) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfS4-0006yh-LB for qemu-devel@nongnu.org; Thu, 19 May 2022 08:40:26 -0400 Received: from mail-tycjpn01on20705.outbound.protection.outlook.com ([2a01:111:f403:7010::705]:8514 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 1nrfS0-0005g3-T6 for qemu-devel@nongnu.org; Thu, 19 May 2022 08:40:23 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:40:10 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:40:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oEq5nVr3WpNUxhB+X+rwjhFueHrdfSSY2WH1QkbnVlmQR3mjCMlVSqMszz7r2FEpr/49o1v/bXRF0Fot1Iw86F4Cnn//1HSxDH9TxJG4crp0ZND7FeBc5Kt1whldQh3p1q1usoFGpqF+OzCA/kSL235DdGczoc82TgiVOuaerWEnSiJlqcwiCxoOzKuYnCaBQ1tK9RiHLFKbkprOSClzIBgibhTkPFa/2y15Kqz4Bg0FMjrofDLYLNcJofWpouWLMXsjTNxhZEr9DjAnYaibJuiyNlrrm0SiRf5d2tWlwy2BHcmWJfMmfwfc6Mf3eJuAlI7Q8EsVhg56chVBTfUu0w== 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=YdCC+gP1XGz7HTI3Eu/AG4LoNCOCg5qyKDk7DRjqKQQ=; b=aTT1LGlRZ2RqVbtjFqebHVsHBK5wXl/ceHEBgUCLFcH//uVOaVqYKOJLOeXuKeRrj/J5oUdgNhipdRJzcGASEmOK/rxw+NJfWaHRAmGA4W0LyPT42QVtP3eneO1xNWCJjwbUjvwSdKk3JmFJ7jlgNVkkS+TgGgt4fTnCN+AkvSnsaJ2T/zuSmkP1ynR1UPBQK0Dbe8e7eAViB1KNp4py1cla0ioJ50BQ+ipkOAQQatUhwzkSxsFX58jU5Adq2n4UR3M/zzoEt4wHs1My7wEd6G1eTl582fE8eCewafpT3YC0wAoCRZwLs8GBHsJHSk/Ai29BTyphuPDl2sYdr4gHIw== 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=YdCC+gP1XGz7HTI3Eu/AG4LoNCOCg5qyKDk7DRjqKQQ=; b=g/Kumqg2BUCKQfBa5ZlXUMZ0Y+rdfHIj3zPMywqiKnJvc0GR8gCgXSaDSvg/aZ3F+FrDJmz6BpsslFC+Fv29Lb8ZA1zuub2uvUhDxivPBROHFOMBliRn6mvEc7dSKCiCl/FaQqCLuGNtkcIWCCEkYCoGmhUPS8O4XW+QLcwkijU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:40:03 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 5/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.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0049.namprd02.prod.outlook.com (2603:10b6:a03:54::26) 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: 27ffac06-9a3b-48a2-d9f6-08da3994b66d X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: SQVzoidqwyd0/AeyzC7USDnt+jkgkdSn5F5GoG3YlosxG0W8LJJn02H+lyUzfMYrn1ikfhVnYUSnN+p5az8Ho6cLay+wwW7U+ywGR7LBhbbu5gRHa02KTNbrnlt2YAaLmB5AyDopCBKTT7PETOyfocVl2aIieHKGJ6IQ9k8ytHSG2mCuMFzt1fZC+7evbJAeij22wTqCpznLZ0lXuBLaTv+Y+U8R9Eeo1ZLF7SyZ/fbnvyf5alLbGfCxViSy3MXaHOgBIrTbspgB3d+zuDyv01KVYyC899EydOMygYiF68uPojt8azhsdSCB4ImXx6hKFRd78U1aDu/DMiPlPrcTrfpc3N56GU9ND2SqzCVYQ+U58oXEMgfMtdtIM5QOXeqnH0XQ6Ka040t+gr5W3mLeCQx7uTb9AUXZtejeiADLmWrXkuiZmW4obZbVLktzFk6GHztr3J0P3UxK29QOzO5O5QOrN9hNKPAlKxlKW5u1tZY3h3j+nJlWLHyLCn4nN3G0dOJwOR93KwxzwDA4Oz9q3q4OjHH9mAB8raJrMk0v1qr+t5Zd1YRdjpk/AWFIHXn4vxYcRYbqD5FRh3UppWUo8RZGGVAd1ZcAq0Jv82kLYdM1Szwt89P+TRJyu5lW1kaSFPi4CTbCEguOmCDgX1XvNwTheXWhcMhWlrYZegCZkWozef/gXzPEllhjxdGPYT+Yh9fV240DvkECrAdiVCv9rfEXL5lPJXHl85L8uTLe+qI= 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(316002)(786003)(6666004)(52116002)(9686003)(6512007)(6506007)(5660300002)(66476007)(66946007)(66556008)(8936002)(4744005)(86362001)(186003)(49092004)(67856001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?TtJR0k5OlN1gffZ6T6BTPixY94b9Oh131YkljZZGmSxdkNQJ/sX8anvxjG4X?= =?us-ascii?Q?tjVqevffQktsWDycQv43FwwhywivqvktvK2KjvtK1jKWNhpLituGaTBgNIOr?= =?us-ascii?Q?cDjdHeqZhVNK3kiJFtpxIN38gmMsDKSwhYgYlVVuUfLF5JXvjzTb2jsr2TR5?= =?us-ascii?Q?oUbPaqwp2NWfOaPsCIfdXrZU2SDPpmSn8rsR4czBM3tfTGwKg1/dYY0IEklq?= =?us-ascii?Q?wP5oxl9wIVGkMM4Jjk2fUtkPLkIIvaHfYTvHF2gd2KzFFtE5n1WUE1x2rvMI?= =?us-ascii?Q?NsmdYYUwM2PKa7G/0XhcsiAmNQTxeWjlfE1wRRGEF84ahEaZNNAJxM3yUAxt?= =?us-ascii?Q?Wo+ClqBff+Y0T5X9qYkHCmOJ/FzP7Z9MPLVquW5Wp6/TV4YueVT2aX6iPOWF?= =?us-ascii?Q?xvDxYu5q7e8L0LahJE2yn4RSQxqGGYJHmI/+xWCOTaABuWT3uDnKjdYKxk8m?= =?us-ascii?Q?4S4+qP0WKiECmDBhrxRko6wicRfLdBNS++VeU0E0eAQE95jdqUTIm5Jv8MhY?= =?us-ascii?Q?5IsMyxY00LxZeiZWjQS09XTKCkbTb+jY/Rp5nGp5//L9h75eWAeLTScH15dY?= =?us-ascii?Q?8BfhKM8AUlDLJsDrx1/aMO9WrV9V/ZoZ0TySKPtUgoIHrER9LtRuegjvHCIZ?= =?us-ascii?Q?WTruG8In/Zbij6+hawmbwHT6afx+5To8mbj6p0Eaee6Z4ukHWHK4v+sc2Tq/?= =?us-ascii?Q?tqWA5hr51pv40y4rnoyTPWupr6eqGqeaKHGDQ+I42/2ospUeU07/FnAdlbI2?= =?us-ascii?Q?K11L7iwvYuIzUUG7lMZRkQhqy6j+PC3xx4ZKAlK/5O6V3P8DRr3pLHyPsWNH?= =?us-ascii?Q?UbZRi/yJBPh8ObAooHtmNGqNKci/oedeyP+1zB6cGTPfmO2wC2jBLkFBp4v3?= =?us-ascii?Q?0S5Z5sdCN0r2wzlyilSPLrb12I6DuwltoCCdy7oUpGBoZEAY3QEeQVa2a319?= =?us-ascii?Q?QBKb2dJkCOhbdQzVhm9788CLfOuutm23b23dJFfqHbBPl6rFq1KxXOkX6h0Z?= =?us-ascii?Q?eUboKKho0YGEe0uJn9xVekN8lMFnwwaqJ4qio2Z2xnXMoi+BUaylEbXl9QIs?= =?us-ascii?Q?pYdFUy0qghbOrJvt+9hP7bU2E7uo9BiYYEpZ8tFfJcTWX9HiZkgSMGRPQoxu?= =?us-ascii?Q?6is5BXLptbTWcMW3d3gwW6c1WYE6pYa5y0azy7KCjUTlr5Y+k+nPG9mVQnyj?= =?us-ascii?Q?qWhSu8WK8WK8yb47cWDo7wofwI0wreyOZffwx6X95o39hgC3SeZGgCivxp4U?= =?us-ascii?Q?e5QpzluQ2grCLbpvAcqJSWCwVyMqJ8IqO0lyHgrV0+uYlqsTZ/bqGAFj0NIs?= =?us-ascii?Q?uZvAPSZUateL+jVppYvEexh4gcKjOvU76sjR6pSkj8z1CZuM6x6JS0zqsstU?= =?us-ascii?Q?ksNbIV24VgpQiwxPjYPbnnkty0gxjNBGHaLjGEdMjDRmry8RXZbKPtEmUM8S?= =?us-ascii?Q?tP3R6rix1Z/oHPVVCfqes1oigKlgbr7Prk8JcO7Zbvv/lS8kR/+tJJaOCzKC?= =?us-ascii?Q?FF3cv82Zw+Gyo+ZQD2s2baTaHv5KPfgdeeWGw11uIupVMDWn5MVUjCVv71IU?= =?us-ascii?Q?ds/3P/iGOTq5iFUvqQowmbpDIoQE/huwIWKGx+ztNsJdVihZJCqadiboe3uT?= =?us-ascii?Q?St/IvgBOVqkXLCeXWHNgbFpLnfvwwhUQAUhj3YWLhnJSkVnLD9afKtT2qMWH?= =?us-ascii?Q?NTlmu4UIAthVcFk35w+ZEHi3naVfNhqvlI703QporZgNF4ZAzPyBKbanPxFI?= =?us-ascii?Q?Qx3Jo2Nagc/LcMgQOlePGnIu2jqva+g=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 27ffac06-9a3b-48a2-d9f6-08da3994b66d X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:40:10.8078 (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: N/tyr2aBVGTS5G/kugEKoyA5TunvPEMGCeizb0Ik+CTXVJlZKkRi9nfOQMkye9er X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:7010::705; envelope-from=i@zenithal.me; helo=JPN01-TYC-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964262922100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Hongren (Zenithal) Zheng --- docs/system/devices/usb.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/system/devices/usb.rst b/docs/system/devices/usb.rst index afb7d6c226..872d916758 100644 --- a/docs/system/devices/usb.rst +++ b/docs/system/devices/usb.rst @@ -199,6 +199,10 @@ option or the ``device_add`` monitor command. Availabl= e devices are: ``u2f-{emulated,passthru}`` Universal Second Factor device =20 +``canokey`` + An Open-source Secure Key implementing FIDO2, OpenPGP, PIV and more. + For more information, see :ref:`canokey`. + Physical port addressing ^^^^^^^^^^^^^^^^^^^^^^^^ =20 --=20 2.35.1 From nobody Fri May 3 05:19:36 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass(p=none dis=none) header.from=zenithal.me ARC-Seal: i=2; a=rsa-sha256; t=1652964555; cv=pass; d=zohomail.com; s=zohoarc; b=GDwTH1p8k9qjRxdUiVOiXqb58L234ErAAqTciJfWI+Hp7PbY4xJBe3ReEmafL4ZXvUrTwmgSU+Ffs5XYJnvxBEZW+hAp7aizpruSSOkQ0bqycSi+WPs1YI6uqC6Yin41DDBqFpMUnaqcvX1D+/dQrnUcW2W1HoWcx+v4UZOMY+s= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652964555; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8IQE1soOTIizTTC6+UVyyiO5n4GeQIZ7tCp0tozzoWQ=; b=a7ml172+TMGhwRxvPmGD4/BasqgLXaOLK+LzxGl9sEDa50q6qgBe6qWxGeyfdLBJn319ikygw7stqEp0/7mogozNV6T6EA2t0YhBKR+Z+HMhEKaww8edxUfcKNKV2B8y6MV482AlKUyllQpSwNfH+Eo/lQX7llIEkw9o52gRcg8= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=zenithal.me); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652964555685381.86305233378823; Thu, 19 May 2022 05:49:15 -0700 (PDT) Received: from localhost ([::1]:54842 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nrfac-0001Gi-6Q for importer2@patchew.org; Thu, 19 May 2022 08:49:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53928) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nrfSp-0007PJ-6J for qemu-devel@nongnu.org; Thu, 19 May 2022 08:41:11 -0400 Received: from mail-os0jpn01on20730.outbound.protection.outlook.com ([2a01:111:f403:700c::730]:5753 helo=JPN01-OS0-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 1nrfSm-00065S-4m for qemu-devel@nongnu.org; Thu, 19 May 2022 08:41:10 -0400 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:c0::6) by TYCP286MB0941.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:9e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Thu, 19 May 2022 12:41:03 +0000 Received: from TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7]) by TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM ([fe80::bd99:5c83:e2dc:a8f7%7]) with mapi id 15.20.5273.015; Thu, 19 May 2022 12:41:03 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BVOvSTKex9U6dQ4i0UG3pvL9E1HSzhOXkoiZ7qE2ikY082AxWx7e5HyCMe2JGaegbN/pboVb0Tirg9J1p5uR2Tv4TpQN0QZAgfsgPK1Jwf8MKio6mmf7mydTHP+oqreE7krSW3mSOi5nB28galaImXuOD5MJdFIHFAgq7Ux/r8D+Ei5qKm32bN/AfJYfxf8BXRKAhbhKNvz5dMOylAFkCAuwCBnzuSG9Yi3TpA73dP2RBtlDIfhIBrNyXUMdv+7P0e4s6rC6SRdIXGtBL5tTkNzToY9qbYrlj9VF1cCPSDNO9Bym3DGjWrBnKbibAPlSnbjPkXFh8o1gPA1boMEiVA== 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=8IQE1soOTIizTTC6+UVyyiO5n4GeQIZ7tCp0tozzoWQ=; b=n0SUnsoone2GoT8Os3o/ANceonzcJ7TUdbNflJgxoBbYO981ae65nxdqsnkt5jPiy2o60OI+HkLtkIzXT0p8Y9CINn2vXILakXQlSZshiTN7tiLK5bDPYf4wEk+xX+uGp6AzW+NUPAA+yeBHv7FkqYKZasclFb9KWODOX7eVCb+wsIoMJ8bGvYdGfvC2tJP8JIPbKWmSKUxwbLhwLIXC7uFvuYtChpb9/3bzPGzU8pQxZYhseQZJDqlqDcZKeX/T1g8oE0Rsn9Z35lqkerdeMurWsBCmILSRD1XUoNj1a0aFzuVk2rkeJf0K5DLdokoWJIDVRxwTK9gHdhUdBNZMkQ== 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=8IQE1soOTIizTTC6+UVyyiO5n4GeQIZ7tCp0tozzoWQ=; b=TY4kT3Li2R0155Eg/af8FSGP6nSV0f8fR0sfGcnjc8J5s7ZaeelOxvMXYY7mjqFjjq0wflkPMb4N4intEd7wlYLdGmS9man+p5Pi4A3XKKJn1oBPDZ8A5gcLgad0QSDTNgCubEx/GXeenaP575hjOJ4L8+3JK7ah11KAC3TFzkA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=zenithal.me; Date: Thu, 19 May 2022 20:40:55 +0800 From: "Hongren (Zenithal) Zheng" To: Gerd Hoffmann , Thomas Huth Cc: qemu-devel@nongnu.org, contact@canokeys.org Subject: [PATCH v5 6/6] MAINTAINERS: add myself as CanoKey maintainer Message-ID: References: Content-Disposition: inline In-Reply-To: X-Operating-System: Linux Sun 5.15.26 X-Mailer: Mutt 2.2.1 (2022-02-19) X-ClientProxiedBy: BYAPR02CA0041.namprd02.prod.outlook.com (2603:10b6:a03:54::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: 1529b2f6-2cc1-40c0-5324-08da3994d5bc X-MS-TrafficTypeDiagnostic: TYCP286MB0941:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: rq/0sx01uGGWxjSI4lqFcNYhKgprl3RC1OYjdnKFWWc29N4IX9Vc243aWjO8k8RsxBg8pkTb6eJQNThRrGpfsQ5F0ISgYb1WrZc8oaDIMeEAxjmSIkWsCAPbiOUWsM0PzoxIVXgEWrI9MSRROd2+v3Pp24VTbFDIRi+RMrAznka3dWqEzhzKsPV6XdErsruMH91QgIa2uPg7lH2P+7kU9VKPR/WqrzaSMx7YrYNsTAVE8q3RxrhlxTOZcgaAHJAA4NlKHxj6kkzDSG/MpCjypJ9QF0IEysVlXviyTeb74JFCD6fDuJeX+szSqAliLgliGGwk3gqWtG2bYn3gcxUVM3SMa28HJPl49TPF3MOZPqdE9qVEn87iK3oQc/01oIsSZRytNvEdIOU2Xl0azce24hUEDnYG8pgohcEky73/yMOp4yDPYC52UFuY82ssBP/jtd38Mv4ECmU6kXq8dE5khGQpSsFYBVHaT2WA7koGXHDXY+SrzSDK+zdf6yNO1ecnJSTNomIgopD/Dlz99Bz5em+9cVT4M5HKZWTzl90ISLMQir25n/Nije2ywzWboHwK35mSzegTWbdgIaw8U8yfxVrMPD2ik7X4V8CsezRTO7OD5ulTnMxzeMh5cXFc8KYdRyucN/3NGelXLB8LYrqbiyp4F/JN/DyGC+UzzSrB4Yx1bMi12V5UQpDPHNyyFdFpksF2XkcdX1+Wke0JlDyvDg== 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:(13230001)(7916004)(366004)(136003)(396003)(39830400003)(346002)(376002)(33716001)(2906002)(41300700001)(8676002)(508600001)(38100700002)(110136005)(4326008)(41320700001)(6486002)(316002)(786003)(6666004)(52116002)(9686003)(6512007)(6506007)(5660300002)(66476007)(66946007)(66556008)(8936002)(4744005)(86362001)(186003)(49092004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?/dFPBMy0VqGgiYaF/vNr3I3tW8bk+YNzwCKDlN+DpAXPRRkizhgTgKi3Hkzp?= =?us-ascii?Q?rnK5rWZWz1u4klvcW4bxKiGUvyAYemm0BWmBtr068AUlGbMfI+gDl7Fmoepg?= =?us-ascii?Q?/W9G9PKlf1uQWfdx8F6q+LqMWxP86iEuelKybbHtGpFd7CKBTrx9cNFhFOpg?= =?us-ascii?Q?JlpUCkwmUBTXnqRRGLdeqvfhT7w7HlWCjdQWMPvkpv4Y0kWm1KSbVMFR3elz?= =?us-ascii?Q?KMWLUPvuvpAcfsZLUqTtPQKUs1np38HucZDUaH0gMtxxamT8XBI41D0uu5yu?= =?us-ascii?Q?A/vGJG/gRSMs6b3Rxlsr3LZA7L+gyI1A3G0Bmd6U0swi6JuobIEUZ+Kpn++Z?= =?us-ascii?Q?af+/y8bflU7sVGmTbMspBwyR5bJMpTUZw/4EQbNDm65HFySaEWyx2lJWrP0p?= =?us-ascii?Q?jn9WLLUeiSHfHYnEEro9Y9vILbzyJXHMgkzEEcsKTo7nRVwxcB/60uVjup1R?= =?us-ascii?Q?j6yYEMDCidnCfxXN8CinaZ0NMgy8ihhQF1WyToDpr/82RdoaogpG6Y/O1SKu?= =?us-ascii?Q?H0wn45JzUvJgNa/+b4Emf5CQT1DyPJF3dWCZLREvav/1sFXvvKLnTsYSClV5?= =?us-ascii?Q?U6QcBBqwXs9rIBBrHvS7zgE6lLVuxKUlJ04Ww7GXbTpRaGqQ/GwOJx8748nA?= =?us-ascii?Q?m4p1XlOlUc7wVyt8c2+BelMAkHcBh+ZKXrUqgSe5bL0rkm/IwgkT2d0GEnaI?= =?us-ascii?Q?7oXMpWj5O6onfFYPWqfMY9fOMtZrrzFP8AZkUIf6UVNWtvrRIYy0c/jCvIev?= =?us-ascii?Q?ffwvjuusdvbJyLu3nANaOsEXXmgXTeSyGvgfFVaXZ/y8H3k7OpqQ6tiTWQP/?= =?us-ascii?Q?EGZO91qZTH/QlxVvls/A7wQNz7DjCa06kuEh98IA4Fd+YeOwrcXuRUSqNJOa?= =?us-ascii?Q?v/2VCk371n/GqC5iA/ZvyYOSAe28yz0P1Jnvyel/d5/gGDqrS/17GQRbj1P+?= =?us-ascii?Q?k4G1mrXeTe07h+MH5QsBniyxrRqruprqHVJ2Vx21EYiMxamxnGbyODnofBmW?= =?us-ascii?Q?ltpqw4Kpws/Cd/fV2q9qKUE18oRc7hkHlVPL8IMNw2ZmQ07yrVU96mhNA/VQ?= =?us-ascii?Q?agHb7zlFy96NqLGIN+VA/tDQMIDwLokFnmwxFUjhU9kBbayu45o0k9tcCJsN?= =?us-ascii?Q?G5FZwhzMTX2swvjf/BcEzzs583azjF57I9YU0I6JVeGIAsuYO60IETJ5dMlh?= =?us-ascii?Q?pZzctLNXKdFgUMHF0ZouOEWMEqMjmSzk2d1ewWEEVfOpu1FsXCzxpEqHh9gn?= =?us-ascii?Q?NfdZag9k4yvKIDzCJ2NPMQEmDMW4sZ3V5gyghNpLbG1Pk/1P/q/7E7FKZr+K?= =?us-ascii?Q?JXnLcpXj6IPw3KvEKruby6Ho3zo0QNbqQCSKXtxbqCUf8nTDezckLZqgfXsl?= =?us-ascii?Q?fdceYTWWX1I+2I2SSSjNUbuFQkxHZWoHlLgt1htkuusXvkfttPHgZTf1QXVf?= =?us-ascii?Q?Y6ydD7/ogJIllbVSUtmB/L7Q1u0vO0Fe8NW2hAq/AWsABW2pUOpLSQbtc2HV?= =?us-ascii?Q?tU2drVO1fbUjoLbe+ajtQsoy4AhNvazJy9O/3rAfVYT7zNP8fIBGKqwIl6s3?= =?us-ascii?Q?1mTgidFW0JteCSw5bq6GoyuKm0ZxGtn3b3uEVbepSPiJ5WHVZEPV8Pc9cKxj?= =?us-ascii?Q?IgxzS5Qfaw38ZIfBfM7/nIGWol7FTefETCXDnr1KlOUg4RkHRVN5ESbc7apy?= =?us-ascii?Q?Cbok0OCdRnBkI+vjNp7st/rbB6kU8DFDsLooBkh3hhSk0U3/eHI9CTPCXueJ?= =?us-ascii?Q?05qJTPZjpJXWdf7+Hzmgxq3XtuO4vQ8=3D?= X-OriginatorOrg: zenithal.me X-MS-Exchange-CrossTenant-Network-Message-Id: 1529b2f6-2cc1-40c0-5324-08da3994d5bc X-MS-Exchange-CrossTenant-AuthSource: TYCP286MB1393.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 12:41:03.1584 (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: G/55urVP6INuyHmvh50+eUVF4Irpa2zdFBElT+8uC5J7wUDgnoFvp4dpxwu5Fmt9 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB0941 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:700c::730; envelope-from=i@zenithal.me; helo=JPN01-OS0-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @zenithal.me) X-ZM-MESSAGEID: 1652964556969100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Hongren (Zenithal) Zheng --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index dff0200f70..03856c558f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2397,6 +2397,14 @@ F: hw/intc/s390_flic*.c F: include/hw/s390x/s390_flic.h L: qemu-s390x@nongnu.org =20 +CanoKey +M: Hongren (Zenithal) Zheng +S: Maintained +R: Canokeys.org +F: hw/usb/canokey.c +F: hw/usb/canokey.h +F: docs/system/devices/canokey.rst + Subsystems ---------- Overall Audio backends --=20 2.35.1