From nobody Wed Sep 23 09:40:47 2026 Delivered-To: importer@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+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass(p=quarantine dis=none) header.from=aspeedtech.com ARC-Seal: i=2; a=rsa-sha256; t=1784086676; cv=pass; d=zohomail.com; s=zohoarc; b=C7NiyEGdV+mERgp1leGx/nFpODIOqIQ0qIxUDCPkUOh6oXSB/i5Tn7WIxg58romdnGIvgl8v8Rqy3ylgFX+OKL2tIApijmetagjZhjJb2iXH39nS0IN70B5V7PmgqwCclhFC1jaZ+gT5xYi1qVldYZMAZD6B0zNTKzSFVDudBGQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784086676; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lEYwu2gJ/fyU8QsoRe5NSTkyYklVb9LQ9lBHS4RtXw4=; b=dHHRHGzWoIIOMNi3dll7WVLDt7UExYPZBgGs1v25IxSmOh6QP/yckrMqZAK5zWmJlMtr6Zc4FsCu5aRkenfjYhTIRraLnFpcrXKJgzaOlHhfFD675dGr8gx7W5XRSk39pmCYC/0bu+e5D9uRrjUzzoRxoPWq65wUErF+WYTH6ts= 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+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=aspeedtech.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1784086676485532.6241007990621; Tue, 14 Jul 2026 20:37:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wjqNj-0003E5-MP; Tue, 14 Jul 2026 23:33:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wjqNQ-000382-EA; Tue, 14 Jul 2026 23:33:41 -0400 Received: from mail-japaneastazlp170120005.outbound.protection.outlook.com ([2a01:111:f403:c405::5] helo=TYPPR03CU001.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 1wjqNO-0000oW-2K; Tue, 14 Jul 2026 23:33:40 -0400 Received: from TYZPR06MB4980.apcprd06.prod.outlook.com (2603:1096:400:1cc::10) by TY0PR06MB5258.apcprd06.prod.outlook.com (2603:1096:400:205::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.223.11; Wed, 15 Jul 2026 03:33:30 +0000 Received: from TYZPR06MB4980.apcprd06.prod.outlook.com ([fe80::ea8a:7cb7:4822:2fb3]) by TYZPR06MB4980.apcprd06.prod.outlook.com ([fe80::ea8a:7cb7:4822:2fb3%6]) with mapi id 15.21.0223.008; Wed, 15 Jul 2026 03:33:30 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aOA39q+pxLLRu49e7Twy36OEiYT9VPhllqzl48BshdA/fjTUokgYLzA+Zv0EV6SKtotjmu9ULstYBS4a0XyTz0DSMnTXwQ/CzQX/tFXnZ6p54ncWu6roIMFSAE+bN4obYMPqzPaQ4DUuIaaVCK3+GOpItND/Sm6Q+lfdDj+AM4UNkNGrQWkNxMFjIpjRl4gywFuLXhoQwT9hHRMhZvsIVRfQ8XmHI7qrU19bTrU9vYycrl8S26DETYGs1/onpz+RJMB4zD9fwmvywe7ej76tDHJgfFs4cKxaL0zrHIo0JpCHhByEeG1UL1o33BLXYZA+U5jOsfwzNg/knWwBJdLA4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=lEYwu2gJ/fyU8QsoRe5NSTkyYklVb9LQ9lBHS4RtXw4=; b=lklnv2zmKdF448Apvm4jDL8CugqSh+zX3HgR5dzqrtuX6xxL+SY6DCIFIHOGxxyPXv7EY0CUEy9xgOr4z51wzaZ4fESbJUgNRJgFQKPaqp9tZFdnxKX4ECeukRTPbqpZuiuO0o8/5iF+1P0dl+8xaL6a9bopkstrJRQOEiug0Kp8TIaxggVLnaPJFnN8j56GpxxhL19iA0F7GQnSe8kpdv8vaGYAuSjYe+tIj5IKYdFN4CPloM8JuC+CPLVY7EVydv1JGjzUaXOfs90JBng+Wd6znZjuqac+c0B3buzUVP+Oeza/R/wt9+0zStm4lbBPiD1FlyF+9dIhsxt6lRKefw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lEYwu2gJ/fyU8QsoRe5NSTkyYklVb9LQ9lBHS4RtXw4=; b=SXySmVabosDlaQhYMJWazaqvwQzTvdCe3KG8eEbef5ma+g2nGABRskLcYNezWWcGo7xGxCau6deCSZvpvo2Ab2UlK/AnH2dU08djJ1KPny2vl6Tr1gLJdfKQk2HHl30S5l/T/BwVOHS0oEz8ZknegbeZGTEJMr+qSwFKL8pIBbcYM+m369pknpbyQtmR+EnocvN8XyJ9GKbOD5iVIiX3ZcTsNYOSWAsHvfSeZkDWmlBWH15/P/ULZnT7dyQh7+04Npf1COfalFPLAzvj5B48hUbs0OzvJs+l6mzOCXzlAbJZ4u//an7WQgtC95kGqi20NC/s1w5hPoLwmMNQBflb5Q== From: Jamin Lin To: =?iso-8859-1?Q?Daniel_P=2E_Berrang=E9?= , =?iso-8859-1?Q?C=E9dric_Le_Goater?= , Peter Maydell , Steven Lee , Troy Lee , Kane Chen , Andrew Jeffery , Joel Stanley , Eric Blake , Markus Armbruster , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , "open list:All patches CC here" , "open list:ASPEED BMCs" CC: Jamin Lin , Troy Lee Subject: [PATCH v2 10/17] crypto/cipher-nettle: Implement AES-GCM Thread-Topic: [PATCH v2 10/17] crypto/cipher-nettle: Implement AES-GCM Thread-Index: AQHdFAq0Ca6722eZ5EKRna+Cx0yEsw== Date: Wed, 15 Jul 2026 03:33:29 +0000 Message-ID: <20260715033311.1648424-11-jamin_lin@aspeedtech.com> References: <20260715033311.1648424-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260715033311.1648424-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: TYZPR06MB4980:EE_|TY0PR06MB5258:EE_ x-ms-office365-filtering-correlation-id: b59982c7-bee1-4cfa-60e1-08dee221d6d5 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|366016|7416014|376014|23010399003|56012099006|22082099003|18002099003|38070700021|921020; x-microsoft-antispam-message-info: EDVq9hukrgtCef/HPa9eYRWnr40KA07yamP6e0RmnA5+xX20X0wSxuiHSjhCUgMt48B9vbKHPJNbg1P0Z7EYyRl8eQk8tZ3CiBmKFGZgcsz5Qded4Rafs1hPx1x4i+z5PnFCKGahqGCnkES5wNuvtpfobHavaTTscPrpne+aCqvI7Je/lkCAf3v/J1QsZr63b+zxRfRbF3IH6LbPl3Vvm4QquR09uNfCTLD99KYGW4VcHNvqRz9QKbB+c/V1qpYXX+o8hv1l94HA8mTDS1Z3akt0hPrkhyvICDDGeix1gQsDsmR+VErftUC8eFnj0wcUho9Qi6em5toqVwbnG79a6SaxjAlX+sjBCu19NJZhoRZBQuynGuT1dnUAjxXLiFVYPqYX/MtoHZLgRFdieW7LBDS+cXcH8cWzzbi4MlZJyLXbCw1kd3uA/JRKXwfIaPVw5if88sAkfA4NfZMdI0OD/lYf3sYmjR2TFXZN+WtIws7LZV7THVitV5y7dPFUg0oIid0LNClo78kRpKArk+O1TS0aoKGEaGuzoTSAvZfGvZ/VGJJJQHVJAlxjIGi7owXzcpoeq5u8gjP6SbTYArymtO4oBnL8HpFnE8t5xbA5Gx8DaApTZ5QEaotOGWq96DLn9D74dDKw4P2VhjvFLvo/EFXHVcGB+xVE/cz1gQPr240i14kiMGZWYeJXblXqPQwTXHVvsoFPbU7zCkQyBzJP10Y2qCiXDSa+k0/1Syn/Quqs4E9FhBsvswk/sx8upf4W x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TYZPR06MB4980.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(366016)(7416014)(376014)(23010399003)(56012099006)(22082099003)(18002099003)(38070700021)(921020); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?1ia/7dFCvB5ztSgvEI+fv+kOmowG1+EfMkc5Lw5ZRRcja25Eop9Siqt7bH?= =?iso-8859-1?Q?axopelwUZFxZeSmilu3mOuVVlf2tBnTMKgixKRVKXBf0TQdlsbYvfqaF3q?= =?iso-8859-1?Q?B4SuEXDs0N/XNut17U34woKVxdBlwUnCK6oLl8r5tXGd/C3VjtZIRu5/lQ?= =?iso-8859-1?Q?4aCB6tCEA7rVyIxptkYrUtJbnQQwhyx4xLwYaUkppOiyxuPFv5vd1+sjHM?= =?iso-8859-1?Q?Z0IGgsOAEmsaxU6Jc65k7l7bpObqk3eL2RhidL60l6I7YaCvl9hrqt/yrQ?= =?iso-8859-1?Q?Oc6SGPhabc9kOfEHniqbxar6xuGNlG8Hrr+r856BBTibggiOYdsjuTYdEC?= =?iso-8859-1?Q?kSQfkYBdHAbVLuOgf8zwYFTQUiIMnd3R7FVLCF4sbDQRdJIYgPnPY2ZY/t?= =?iso-8859-1?Q?7u0gZ+5G7NsItg6bIQgvqHvoNMleKX+RSnss+l15HFggluM40lFmkQ/fPm?= =?iso-8859-1?Q?mVQNLnrN0Syk1tWcZyVNv4gScHw7+kCqeeD53Jg0FJigPuQwl/8bs4l/jN?= =?iso-8859-1?Q?I8M5ycCTD0LS1Jx8zvzZYWzIRTlaJZeeaX1XE3/7qLOoERM0ZebT0KC/7p?= =?iso-8859-1?Q?dSJak5kxYBRUa35RDGdgKMU3OG149TurVdYLxYc0NjLr2Is2s8PFKG4xRN?= =?iso-8859-1?Q?bcIr9/Gs2rL/0F3McwZLO6TMz9/fPYa5NkFbOZMzeor4xZ71/DwcN5eIhU?= =?iso-8859-1?Q?9PBiwT3ttaYgZLF6aMivhRqHYAr8Y7Z1aH32A+AQlYWZDxRp/i8fCwrQ13?= =?iso-8859-1?Q?4lWUnlm6hG7+FztqHEXGr+Lnxde4i5GE0rnKO7R6YIATLaJKqcWiphfJtW?= =?iso-8859-1?Q?DNi0xTxMDSOZlHDAV5FJdURPXaoI0q2dI8NwO8lKBiKatia7lGHfHbTfBf?= =?iso-8859-1?Q?bMThF0Al4GwWdQELwSdVIDECtfGovT6MOVQfpZQyrwbnDFFyWhc/NwnDDk?= =?iso-8859-1?Q?qNAjfzHunLK0zRo8Dv3+NcXOydbe1ADH5sdresBmxwx9fO6/tIO+70Xd7e?= =?iso-8859-1?Q?gg16SBMfTgfrqShZZw9QWm+I9ky3lOtgUmHE2eHAXv671l8FoXjyqa2MUV?= =?iso-8859-1?Q?jyjTKxe5AnHss2JtWec/eEucOYKzK8Xg6cE67uNtjJwEFeXHQK6Mo0B0Sz?= =?iso-8859-1?Q?RiDFH8kmytucWVElQjOA0hzVaxmpQf34usx/joaiwwIt0d4a5mVKJaSDsg?= =?iso-8859-1?Q?FWU+bZOIvioABP7VhJctDX0PPWqyvnapotlTJz1kAo5Xhyh+6EZSMDzGbU?= =?iso-8859-1?Q?0Uu4aVw6yV4NmTm3lkUyV9F/B6LWwmg6ag92s8ogYJJUgAb/rhxUMRuMLH?= =?iso-8859-1?Q?gyo4oZuaxDWLsoZvP6mtWqhu36XyqlNTvoqbwMptIAcD5AN2dmB2ANyZA+?= =?iso-8859-1?Q?HN0VkAJHfaVllDI3yQxxllrOWNPvEzgMlrxP6A4O1Fh4iWeFbEVT0YJJ/p?= =?iso-8859-1?Q?szqSY7bxUzN0fk6HlhW7sqMVmTvu+Bi6FxEFg51ibMxveefT+oFbhyhTh5?= =?iso-8859-1?Q?8WI6sRSFP13Tbi5GQEWYzddsfIKWgH4w7sH5nqNJime+earXjPF9PLjoqj?= =?iso-8859-1?Q?hWApO4bOrzi7QU768uBu4s1mNoz8qKw4+uETILdZiaZDVBPKdTsfQGbQTu?= =?iso-8859-1?Q?8Ovxr6S9w0YonP25BSKHx2U6E1GoAJ6uFn4DNeZBPZE/jvxtZZI3m+vtP+?= =?iso-8859-1?Q?tFfCwuKzO9rg4UoMIQIfCZq8bmiUaEn8vCcSodpsTejR5dDO7YKdBlFuXh?= =?iso-8859-1?Q?zkwEirIw+UwJsVBoZOVdUFltSEzI7OEM3+6BVtUVAZ8CZk/aPCpFjc93fi?= =?iso-8859-1?Q?zPkTYP/ARA=3D=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: Cop0QyxmU1gab2+xFuCH9L4fy75H3ifSbWgx4GTSNtUxSb+5f3KUXbIJvT6S9pkhmiyZnP4DYJqzlIcIS4eh9bIQteMnGtf0EBZhZcrLIRQAm15aYo7YkpnqaJ8UINUSWl7MbDT2TZKwmq//QUA43bK3aZA6dd2n6ftSgJLXlS1K++0BvIxbPEtDzQ+W+7xDUFairEk0opO6RvOTXCdk3V+L8QJWLJFB34WB0Nm/3GyLn+asD38O2wd0La5Fqb7/AWQ80/flsxFXFVDWtlfgjAltlk1Sspl7D43ly28+ZNV6Ic9bBsokQ2v6dnCHIVSQqRe8WPRGQCSeVAiKIZ/IYA== X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: TYZPR06MB4980.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b59982c7-bee1-4cfa-60e1-08dee221d6d5 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jul 2026 03:33:29.8009 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: jgiV6LbLOM6QaVBxSZhVf8uDXEUjxB0gzm2vB5rX4bhI4EXA5H/u/Cze1JZ5rqQlSa0WJdzdrwJwsJ4KxWir6Z9hvz8dsRxMNQ+450OmUjA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR06MB5258 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+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c405::5; envelope-from=jamin_lin@aspeedtech.com; helo=TYPPR03CU001.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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @aspeedtech.com) X-ZM-MESSAGEID: 1784086676784158500 Content-Type: text/plain; charset="utf-8" Add the AES-GCM AEAD mode to the nettle backend so it is available when QEMU is built with nettle instead of gcrypt. GCM is driven through nettle's generic gcm_* interface, using the AES encrypt function for both directions: gcm_set_iv() sets the (typically 96-bit) nonce, gcm_update() feeds the associated data, gcm_encrypt()/gcm_decrypt() need not be block aligned, and gcm_digest() produces the authentication tag. Signed-off-by: Jamin Lin Reviewed-by: Daniel P. Berrang=C3=A9 --- crypto/cipher-nettle.c.inc | 128 +++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/crypto/cipher-nettle.c.inc b/crypto/cipher-nettle.c.inc index 1afdc391b4..d4847f0efe 100644 --- a/crypto/cipher-nettle.c.inc +++ b/crypto/cipher-nettle.c.inc @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef CONFIG_CRYPTO_SM4 #include #endif @@ -410,6 +411,125 @@ DEFINE_ECB(qcrypto_nettle_sm4, sm4_encrypt_native, sm4_decrypt_native) #endif =20 +/* + * GCM is an AEAD mode built on AES (128-bit block only). Drive it through= the + * generic gcm_* interface, using the block cipher's encrypt function for = both + * directions; associated data is fed with gcm_update() and the authentica= tion + * tag is produced by gcm_digest(). + */ +typedef struct QCryptoNettleAESGCM { + QCryptoCipher base; + struct gcm_key gcm_key; + struct gcm_ctx gcm_ctx; + union { + struct aes128_ctx aes128; + struct aes192_ctx aes192; + struct aes256_ctx aes256; + } cipher; + nettle_cipher_func *encrypt; +} QCryptoNettleAESGCM; + +static int qcrypto_nettle_aes_gcm_setiv(QCryptoCipher *cipher, + const uint8_t *iv, size_t niv, + Error **errp) +{ + QCryptoNettleAESGCM *ctx =3D container_of(cipher, QCryptoNettleAESGCM,= base); + + gcm_set_iv(&ctx->gcm_ctx, &ctx->gcm_key, niv, iv); + return 0; +} + +static int qcrypto_nettle_aes_gcm_setaad(QCryptoCipher *cipher, + const uint8_t *aad, size_t len, + Error **errp) +{ + QCryptoNettleAESGCM *ctx =3D container_of(cipher, QCryptoNettleAESGCM,= base); + + gcm_update(&ctx->gcm_ctx, &ctx->gcm_key, len, aad); + return 0; +} + +static int qcrypto_nettle_aes_gcm_encrypt(QCryptoCipher *cipher, + const void *in, void *out, + size_t len, Error **errp) +{ + QCryptoNettleAESGCM *ctx =3D container_of(cipher, QCryptoNettleAESGCM,= base); + + gcm_encrypt(&ctx->gcm_ctx, &ctx->gcm_key, &ctx->cipher, ctx->encrypt, + len, out, in); + return 0; +} + +static int qcrypto_nettle_aes_gcm_decrypt(QCryptoCipher *cipher, + const void *in, void *out, + size_t len, Error **errp) +{ + QCryptoNettleAESGCM *ctx =3D container_of(cipher, QCryptoNettleAESGCM,= base); + + gcm_decrypt(&ctx->gcm_ctx, &ctx->gcm_key, &ctx->cipher, ctx->encrypt, + len, out, in); + return 0; +} + +static int qcrypto_nettle_aes_gcm_gettag(QCryptoCipher *cipher, + uint8_t *tag, size_t len, + Error **errp) +{ + QCryptoNettleAESGCM *ctx =3D container_of(cipher, QCryptoNettleAESGCM,= base); + + gcm_digest(&ctx->gcm_ctx, &ctx->gcm_key, &ctx->cipher, ctx->encrypt, + len, tag); + return 0; +} + +static const struct QCryptoCipherDriver qcrypto_nettle_aes_gcm_driver =3D { + .cipher_encrypt =3D qcrypto_nettle_aes_gcm_encrypt, + .cipher_decrypt =3D qcrypto_nettle_aes_gcm_decrypt, + .cipher_setiv =3D qcrypto_nettle_aes_gcm_setiv, + .cipher_setaad =3D qcrypto_nettle_aes_gcm_setaad, + .cipher_gettag =3D qcrypto_nettle_aes_gcm_gettag, + .cipher_free =3D qcrypto_cipher_ctx_free, +}; + +static QCryptoCipher *qcrypto_nettle_aes_gcm_ctx_new(QCryptoCipherAlgo alg, + const uint8_t *key, + size_t nkey, + Error **errp) +{ + QCryptoNettleAESGCM *ctx; + + if (!qcrypto_cipher_validate_key_length(alg, QCRYPTO_CIPHER_MODE_GCM, + nkey, errp)) { + return NULL; + } + + ctx =3D g_new0(QCryptoNettleAESGCM, 1); + ctx->base.driver =3D &qcrypto_nettle_aes_gcm_driver; + + switch (alg) { + case QCRYPTO_CIPHER_ALGO_AES_128: + aes128_set_encrypt_key(&ctx->cipher.aes128, key); + ctx->encrypt =3D aes128_encrypt_native; + break; + case QCRYPTO_CIPHER_ALGO_AES_192: + aes192_set_encrypt_key(&ctx->cipher.aes192, key); + ctx->encrypt =3D aes192_encrypt_native; + break; + case QCRYPTO_CIPHER_ALGO_AES_256: + aes256_set_encrypt_key(&ctx->cipher.aes256, key); + ctx->encrypt =3D aes256_encrypt_native; + break; + default: + error_setg(errp, "Unsupported cipher algorithm %s with GCM mode", + QCryptoCipherAlgo_str(alg)); + g_free(ctx); + return NULL; + } + + gcm_set_key(&ctx->gcm_key, &ctx->cipher, ctx->encrypt); + return &ctx->base; +} + bool qcrypto_cipher_supports(QCryptoCipherAlgo alg, QCryptoCipherMode mode) { @@ -440,6 +560,10 @@ bool qcrypto_cipher_supports(QCryptoCipherAlgo alg, case QCRYPTO_CIPHER_MODE_XTS: case QCRYPTO_CIPHER_MODE_CTR: return true; + case QCRYPTO_CIPHER_MODE_GCM: + return alg =3D=3D QCRYPTO_CIPHER_ALGO_AES_128 || + alg =3D=3D QCRYPTO_CIPHER_ALGO_AES_192 || + alg =3D=3D QCRYPTO_CIPHER_ALGO_AES_256; default: return false; } @@ -451,6 +575,10 @@ static QCryptoCipher *qcrypto_cipher_ctx_new(QCryptoCi= pherAlgo alg, size_t nkey, Error **errp) { + if (mode =3D=3D QCRYPTO_CIPHER_MODE_GCM) { + return qcrypto_nettle_aes_gcm_ctx_new(alg, key, nkey, errp); + } + switch (mode) { case QCRYPTO_CIPHER_MODE_ECB: case QCRYPTO_CIPHER_MODE_CBC: --=20 2.43.0