From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 48019A0556; Mon, 17 Oct 2022 11:34:24 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2982D4021D; Mon, 17 Oct 2022 11:34:24 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id CF8E540143 for ; Mon, 17 Oct 2022 11:34:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1665999263; x=1697535263; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=VM5LRUrN89OnEEr502UNwhGZgkvGtHEfQAys1yjuouc=; b=Kf1/TGdsb08DuMmL5wJBiSLlVlUW6WgkLCvwGTbOJqyPwtNl6dxRUPzJ wGX2OapePto3JJe+Hwmhlen467LB9ZGwyip89j9W+LfJ2nqmjIjQstjYa XfjOcmojB6emSbnENTplPqWrE80rBr3y96Xv05/4qCkWTMHfIqsxViZcN u9J+6tToBEbaSAiORyF8Tqml0gj/ZBAXjhTBWggWkhh3z3zwr9+ixXrSR +woWIvbFAz6kX4hcv3EvREtldpq9OgWvbdBowjTOdmr2CE9rWKxe6pYH1 rwau3cYj6FYenyw1BkP4PCRenfQZI6/0zoOh5TE2dNS916uzNnsySvRFX w==; X-IronPort-AV: E=McAfee;i="6500,9779,10502"; a="332283808" X-IronPort-AV: E=Sophos;i="5.95,191,1661842800"; d="scan'208";a="332283808" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2022 02:34:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10502"; a="623166708" X-IronPort-AV: E=Sophos;i="5.95,191,1661842800"; d="scan'208";a="623166708" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by orsmga007.jf.intel.com with ESMTP; 17 Oct 2022 02:34:21 -0700 Received: from orsmsx612.amr.corp.intel.com (10.22.229.25) by ORSMSX601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Mon, 17 Oct 2022 02:34:21 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX612.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Mon, 17 Oct 2022 02:34:20 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31 via Frontend Transport; Mon, 17 Oct 2022 02:34:20 -0700 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (104.47.51.43) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.31; Mon, 17 Oct 2022 02:34:18 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=G/X8FltVKg3OvuBxwl6SPR9xFg/s3aHalY8zkBpsmNgSU6rlEPgkRnu82EF4TZjaYPMl5ieAGd+lsDIR/c+xouOJHtAFQMIblLVZl/w6wTtG5JXiFZRR1ewvS4xqumLhNawGOqWD5i52hyLTEApS85QUbmmZMSXizNKGz49beldL0I0ekZBFLswJyoZ7tn2hgShWfzTcPk26u5BeL4nKCNmJR5Kv8q5ha9QCihEaz5L7J9GVwetw1MpLPl1oDnLewc/y4V29m3UA1Qh2m8AfXAFh5ttfSkGdYPmxCW6hCTDdsmDROGDXWcR0SwwUkr2fVyYyLi/NO4JcBWZm5VdCMg== 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=cm9WVC2z2gd0ZVlCWkcg2DYdnCqLBRrMYyUWRN1nEOA=; b=K3mScnLAUvnu/7rNSppAwBDfNhBkVMAUk/54mjBURTAvfnPtb5hVXWP2RT9zlHEiiXQhLHAtTN2YTWK9toaoKWh1RkAE4TWOt5gcKFMlAdp9vSfle4SntumfSsCDnHNDNk0V2HhQ75pKQ2144kHghcLcceBx6FWknaS6PkrCjyh0+DhSE8Nr+oferv985bSFU4vjLArTVvlIaPMEyM5TiW3ayfq+QrBULOGFNzgia2TJ7u8XAHTOW/+XivXvjRAU0fnMlmAzfOYefgXPDp8TRu8iC18OXRLa3Di9fujqvECYsBoOwE0kvZRZPwT4CuHrKHMdWwKv30HGCVyry2Rs4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from CY4PR11MB1848.namprd11.prod.outlook.com (2603:10b6:903:123::22) by LV2PR11MB6046.namprd11.prod.outlook.com (2603:10b6:408:17a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.32; Mon, 17 Oct 2022 09:34:11 +0000 Received: from CY4PR11MB1848.namprd11.prod.outlook.com ([fe80::38c9:96ab:bbf6:1b30]) by CY4PR11MB1848.namprd11.prod.outlook.com ([fe80::38c9:96ab:bbf6:1b30%11]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 09:34:11 +0000 From: "Dooley, Brian" To: Gowrishankar Muthukrishnan , "dev@dpdk.org" CC: Anoob Joseph , "Zhang, Roy Fan" , Akhil Goyal , "jerinj@marvell.com" Subject: RE: [v1 2/2] examples/fips_validation: add ECDSA validation Thread-Topic: [v1 2/2] examples/fips_validation: add ECDSA validation Thread-Index: AQHY0kMfrTbZezXNPkmv8VY8RnMqSa4ScoMw Date: Mon, 17 Oct 2022 09:34:11 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.6.500.17 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: CY4PR11MB1848:EE_|LV2PR11MB6046:EE_ x-ms-office365-filtering-correlation-id: 73798bbe-ca95-40bb-c87e-08dab022bf53 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 0BMQlqBVFrk5UhHW0ehdp3pl6Ixik2OPgB2nzVokz+xcN32eiLi2SZzdaSJNL0PcEmhpOPSjjPrYhP3/NyV3kzx4Bwh7cqDfXgyewhaQAUEgvx43PzUfjHFew7rjp4yp1jofnPJ+1hRgm9SFWFQRNMZAs7HdvWM6gTilfSbnOqPpK7U/8PuHfd5tvxfE+oRkhTx506zyxiuE7eNttgdSBFLEDdRkqMoNDs5Sne31iS7hiZel11PPpl7KnBWGrj1LmmswSJ/Do8TAGuPkrSw0mfLocDiZpWXRdafFOuP7UuP6lMlFjQ5TvFrDcXd/P+wyzndrINLYKbk0fkjjFwtiY+7Nno6MLkVZFSGuy4Pmzd5H6m8fddQzVAlTCItjodTBGvOF18g2ngr0Rk6QxF0eij4Bg6BTITknRAToj9uT6SaMGPtGBvVWI3iYmGXIwJoeresghs6ryWHryIAa9lAqRwjuDms0ATBxaY0Opfbdqk8G2xSfz4LnGP1kBoABhK2C8AvaUF77XCydUiQaB6a7vXfo3eeKImUSF9EdOC77r/Avh3lYBjzfZBmJz/IOnlkBERErBAogRAYk046A9uor7Fl1Ma0TLmuSHV6Vrir8NxvoYkvcdKQGtBMjZWgzVovUmubpqoH996GjqQXokgO7dTuaYJGlFP2x08cz2DV+tOxt4JXe+HOEfWsW7KZ3M2ui0fokQR+EuhhBQXlkw94blFUuOEWeUBmBr/MIFmbNj8P8qRtlC6TsxUsA5lpTkiUBnXi85Kj2EONc06EpIKd2QQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CY4PR11MB1848.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(39860400002)(376002)(366004)(346002)(136003)(396003)(451199015)(8936002)(6506007)(7696005)(53546011)(5660300002)(52536014)(41300700001)(26005)(9686003)(122000001)(38070700005)(38100700002)(82960400001)(186003)(2906002)(30864003)(33656002)(83380400001)(86362001)(71200400001)(478600001)(66446008)(54906003)(316002)(110136005)(76116006)(8676002)(66946007)(66556008)(66476007)(64756008)(4326008)(55016003)(579004)(559001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?CBqPMdrJfSQ1WuTWdzc9/ULy4YILkZEoBTXrmyVXhQn85mNfLOQTLwLNxChz?= =?us-ascii?Q?3qZzbW3/8hYQXkpxV1lzFk6gaZfb6SPGtDookA5NyY/t4yGI5Mkp2K6XCCjD?= =?us-ascii?Q?jOwmXiL9vpkxNh8S2SWyykKdMahaR3oU0rmxwQO6DTj+wwArqyw75ip6YfNf?= =?us-ascii?Q?qiFC/k2qMknt2bgFAD83qQwllYixmdtmJFWy705Ugq2WhPO5W1n29fMZ0ujI?= =?us-ascii?Q?/pQzYmHg9fZi8QdrzKQmFKJEza9apYvMnI3F0s9KbH5dVBjZ7I11lkzC2d54?= =?us-ascii?Q?qKrLnVIrzHNyrZ4uiNPw7w2kPN0Xij06UjDwjrcxu8nxR3rsMdSDVigfkYFX?= =?us-ascii?Q?BT/XXDXwmDB3fNPgwpeDAPzXpmBUUknP5WfwIoGD/8CiaCmDcOy1dU428QYX?= =?us-ascii?Q?rPj17xL59HpvOaturnTrNSG/clOKHGbuMmAE9SH0MjtLZ7NIH4978bRaSrhF?= =?us-ascii?Q?UYS2c6j0Alv1jcVhQLsZN+MGQ6Yn3eJ2Qr25ODonAKzWW5TDXjc1jXMHV80y?= =?us-ascii?Q?Q5CjWHAkzSsxxqSfKyVXcdESvuJfLvh2XqrjuUpO3AoMuISnus8zxKjuEVw7?= =?us-ascii?Q?I5NaYqUjuXH3lBN5OkpSGKYLNpNkBPPOfcnrKcqqt3olD2MM8OrT65XlvLP1?= =?us-ascii?Q?v7RunKEVx7oPE912nKcvx0J30ovTsYYOSsrGhEDZgp1478O1jA141M8SjlXp?= =?us-ascii?Q?4dqlioe/dugZYCZN1ZWUQNdpEZ+OFOiy5Z2k5mKWmij+MIw31E8v72ZpfDRC?= =?us-ascii?Q?kOsgL4BcrxJGzrZNzu3UGrmElO16pVPAEKm/r8VgbUQmWkyUDDzNCWdHHRYw?= =?us-ascii?Q?vv50PDIfSqhDmeM15uHzctQn+5+PBuETKNWA41mYZn/C/RLIOZFlW5tRGLTW?= =?us-ascii?Q?3MJKgGXx5ujfZ/sWxjAz7PeYe1HEPX3kZkIzuYmfSZJr5WBbfXp2+D8KpG8P?= =?us-ascii?Q?aJEFaBDNaY1tHDOO520yQeUhT226VEkYwVhW+48EHArNzDyB7EwVKKAhVTed?= =?us-ascii?Q?2XqwoB5hL+pmNpH+JVm5eOmn4R1s5CyoEK89TTGENY5C5rPOERdsi6nQWElD?= =?us-ascii?Q?4NSNmU2a9uMeUiWQVdxKu3W88m2eI0sFesGiYJxOXbiC9n6L4D1/BttxsbMZ?= =?us-ascii?Q?zLcJCyLLBcC4AwqxfmTSBgWS561j3fTHL9/aP0fBsH+0c6i2CI31c0kSjtMl?= =?us-ascii?Q?deitI8SsPeSaEQKNBRJgcYo8zEnpVV7GJsgZp4YeyCzAD6yGWHf8klafZ+5k?= =?us-ascii?Q?iAiKUcvsHifg2C9Eei82TokTGJbRdFx4gtJfcNvMWC6ZWpE2ZXTo4lt+3jV/?= =?us-ascii?Q?JAweCu5NDPCd4l8AxS6BEgo5e6TkL/8donmNEhWbaKQq16s+zuhL6Lh68F+E?= =?us-ascii?Q?NbVI7YCCG9eSkP7oJrsAALuYSFnPLjW6jbJZ/NSzi2lvSi3vgdLQozLwD8Tt?= =?us-ascii?Q?WF30A7kMZ6YyDxXWvRtYc6DAxIcEq6yvziLa80tzr82bXPgeB9KuiuXOLAst?= =?us-ascii?Q?0Sp16DO2PzqSwQQX93r19AEaT4cpMgxm+FccXDc87C1QX1ATKVkzxzzatOmM?= =?us-ascii?Q?7Ci2eHznm+GiYfUhDD+98hOqlOILHBBBsa0fZZmQ?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CY4PR11MB1848.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 73798bbe-ca95-40bb-c87e-08dab022bf53 X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Oct 2022 09:34:11.1193 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: +96GZwrzojXZxpKtCf+NyX7INHZ7nxMjhcn1/Rc1Sd2gJ2+GUJ/cGQpSgJOc4j5D3YUAu9d3M0wjTb5dhSmgKw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR11MB6046 X-OriginatorOrg: intel.com X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org > -----Original Message----- > From: Gowrishankar Muthukrishnan > Sent: Tuesday, September 27, 2022 8:31 AM > To: dev@dpdk.org > Cc: Anoob Joseph ; Zhang, Roy Fan > ; Dooley, Brian ; Akhil > Goyal ; jerinj@marvell.com; Gowrishankar > Muthukrishnan > Subject: [v1 2/2] examples/fips_validation: add ECDSA validation >=20 > This patch adds support in fips_validation app to validate ECDSA. >=20 > Signed-off-by: Gowrishankar Muthukrishnan > --- > doc/guides/sample_app_ug/fips_validation.rst | 1 + > examples/fips_validation/fips_validation.c | 2 + > examples/fips_validation/fips_validation.h | 27 ++ > .../fips_validation/fips_validation_ecdsa.c | 431 ++++++++++++++++++ > examples/fips_validation/main.c | 210 ++++++++- > examples/fips_validation/meson.build | 1 + > 6 files changed, 669 insertions(+), 3 deletions(-) create mode 100644 > examples/fips_validation/fips_validation_ecdsa.c >=20 > diff --git a/doc/guides/sample_app_ug/fips_validation.rst > b/doc/guides/sample_app_ug/fips_validation.rst > index 5e9ad2d006..3a2357eaa9 100644 > --- a/doc/guides/sample_app_ug/fips_validation.rst > +++ b/doc/guides/sample_app_ug/fips_validation.rst > @@ -67,6 +67,7 @@ ACVP > * TDES-CBC - AFT, MCT > * TDES-ECB - AFT, MCT > * RSA > + * ECDSA >=20 >=20 > Application Information > diff --git a/examples/fips_validation/fips_validation.c > b/examples/fips_validation/fips_validation.c > index 5d485a2bd5..55f68a7ae0 100644 > --- a/examples/fips_validation/fips_validation.c > +++ b/examples/fips_validation/fips_validation.c > @@ -473,6 +473,8 @@ fips_test_parse_one_json_vector_set(void) > info.algo =3D FIPS_TEST_ALGO_TDES; > else if (strstr(algo_str, "RSA")) > info.algo =3D FIPS_TEST_ALGO_RSA; > + else if (strstr(algo_str, "ECDSA")) > + info.algo =3D FIPS_TEST_ALGO_ECDSA; > else > return -EINVAL; >=20 > diff --git a/examples/fips_validation/fips_validation.h > b/examples/fips_validation/fips_validation.h > index 7cbbc1f084..f9dfbecd5d 100644 > --- a/examples/fips_validation/fips_validation.h > +++ b/examples/fips_validation/fips_validation.h > @@ -43,6 +43,7 @@ enum fips_test_algorithms { > FIPS_TEST_ALGO_TDES, > FIPS_TEST_ALGO_SHA, > FIPS_TEST_ALGO_RSA, > + FIPS_TEST_ALGO_ECDSA, > FIPS_TEST_ALGO_MAX > }; >=20 > @@ -94,6 +95,15 @@ struct fips_test_vector { > struct fips_val dq; > struct fips_val qinv; > } rsa; > + struct { > + struct fips_val seed; > + struct fips_val pkey; > + struct fips_val qx; > + struct fips_val qy; > + struct fips_val r; > + struct fips_val s; > + struct fips_val k; > + } ecdsa; >=20 > struct fips_val pt; > struct fips_val ct; > @@ -159,6 +169,10 @@ enum fips_rsa_test_types { > RSA_KAT > }; >=20 > +enum fips_ecdsa_test_types { > + ECDSA_AFT =3D 0, > +}; > + > struct aesavs_interim_data { > enum fips_aesavs_test_types test_type; > uint32_t cipher_algo; > @@ -213,6 +227,14 @@ struct rsa_interim_data { > uint8_t random_msg; > }; >=20 > +struct ecdsa_interim_data { > + enum rte_crypto_auth_algorithm auth; > + enum rte_crypto_curve_id curve_id; > + u_int8_t curve_len; > + uint8_t random_msg; > + uint8_t pubkey_gen; > +}; > + > #ifdef USE_JANSSON > /* > * Maximum length of buffer to hold any json string. > @@ -259,6 +281,7 @@ struct fips_test_interim_info { > struct gcm_interim_data gcm_data; > struct xts_interim_data xts_data; > struct rsa_interim_data rsa_data; > + struct ecdsa_interim_data ecdsa_data; > } interim_info; >=20 > enum fips_test_op op; > @@ -268,6 +291,7 @@ struct fips_test_interim_info { > const struct fips_test_callback *writeback_callbacks; >=20 > post_prcess_t parse_interim_writeback; > + post_prcess_t post_interim_writeback; > post_prcess_t parse_writeback; > post_prcess_t kat_check; > }; > @@ -338,6 +362,9 @@ parse_test_tdes_json_init(void); int > parse_test_rsa_json_init(void); >=20 > +int > +parse_test_ecdsa_json_init(void); > + > int > fips_test_randomize_message(struct fips_val *msg, struct fips_val *rand)= ; > #endif /* USE_JANSSON */ diff --git > a/examples/fips_validation/fips_validation_ecdsa.c > b/examples/fips_validation/fips_validation_ecdsa.c > new file mode 100644 > index 0000000000..2bac348052 > --- /dev/null > +++ b/examples/fips_validation/fips_validation_ecdsa.c > @@ -0,0 +1,431 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(C) 2022 Marvell. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#ifdef USE_OPENSSL > +#include > +#include > +#endif /* USE_OPENSSL */ > + > +#include > +#include > + > +#include "fips_validation.h" > + > +#define CONFORMANCE_JSON_STR "conformance" > +#define TESTTYPE_JSON_STR "testType" > +#define CURVE_JSON_STR "curve" > +#define HASH_JSON_STR "hashAlg" > +#define RV_JSON_STR "randomValue" > + > +#define MSG_JSON_STR "message" > +#define QX_JSON_STR "qx" > +#define QY_JSON_STR "qy" > +#define R_JSON_STR "r" > +#define S_JSON_STR "s" > + > +#define RV_BUF_LEN (1024/8) > +#define RV_BIT_LEN (256) > + > +#ifdef USE_JANSSON > +struct { > + uint8_t type; > + const char *desc; > +} ecdsa_test_types[] =3D { > + {ECDSA_AFT, "AFT"} > +}; > + > +struct { > + enum rte_crypto_auth_algorithm auth; > + const char *desc; > +} ecdsa_auth_algs[] =3D { > + {RTE_CRYPTO_AUTH_SHA1, "SHA-1"}, > + {RTE_CRYPTO_AUTH_SHA224, "SHA2-224"}, > + {RTE_CRYPTO_AUTH_SHA256, "SHA2-256"}, > + {RTE_CRYPTO_AUTH_SHA384, "SHA2-384"}, > + {RTE_CRYPTO_AUTH_SHA512, "SHA2-512"}, }; > + > +struct { > + enum rte_crypto_curve_id curve_id; > + const char *desc; > +} ecdsa_curve_ids[] =3D { > + {RTE_CRYPTO_EC_GROUP_SECP192R1, "P-192"}, > + {RTE_CRYPTO_EC_GROUP_SECP224R1, "P-224"}, > + {RTE_CRYPTO_EC_GROUP_SECP256R1, "P-256"}, > + {RTE_CRYPTO_EC_GROUP_SECP384R1, "P-384"}, > + {RTE_CRYPTO_EC_GROUP_SECP521R1, "P-521"}, }; > + > +struct { > + uint8_t curve_len; > + const char *desc; > +} ecdsa_curve_len[] =3D { > + {24, "P-192"}, > + {28, "P-224"}, > + {32, "P-256"}, > + {48, "P-384"}, > + {66, "P-521"}, > +}; > + > +#ifdef USE_OPENSSL > +#define MAX_TRIES 10 > +static int > +prepare_vec_ecdsa(void) > +{ > + BIGNUM *pkey =3D NULL, *order =3D NULL, *r =3D NULL; > + int ret =3D -1, j; > + unsigned long pid; > + > + /* For ECDSA prime fields, order of base points. > + * Below string array is indexed by starting with first supported > + * curve (SECP-192R1). > + */ > + static const char * const orderstr[] =3D { > + > "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", > + "", > + > "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", > + "", > + > "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2F > C632551", > + > "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F43 > 72DDF581A0DB248B0A77AECEC196ACCC52973", > + > "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF > FFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E > 91386409" > + }; > + > + /* Seed PRNG */ > + if (vec.ecdsa.seed.val) { > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.seed); > + RAND_seed((char *)info.one_line_text, > strlen(info.one_line_text)); > + } else { > + pid =3D getpid(); > + RAND_seed(&pid, sizeof(pid)); > + } > + > + if (!RAND_status()) > + return -1; > + > + order =3D BN_new(); > + if (!order) > + goto err; > + > + j =3D info.interim_info.ecdsa_data.curve_id - > RTE_CRYPTO_EC_GROUP_SECP192R1; > + if (!BN_hex2bn(&order, orderstr[j])) > + goto err; > + > + pkey =3D BN_new(); > + if (!pkey) > + goto err; > + > + for (j =3D 0; j < MAX_TRIES; j++) { > + /* pkey should be in [1, order - 1] */ > + if (!BN_rand_range(pkey, order)) > + goto err; > + > + if (!BN_is_zero(pkey)) > + break; > + } > + > + if (j =3D=3D MAX_TRIES) > + goto err; > + > + parse_uint8_hex_str("", BN_bn2hex(pkey), &vec.ecdsa.pkey); > + > + r =3D BN_new(); > + if (!r) > + goto err; > + > + if (info.interim_info.ecdsa_data.random_msg) { > + if (!BN_rand(r, RV_BIT_LEN, 0, 0)) > + goto err; > + > + parse_uint8_hex_str("", BN_bn2hex(r), &vec.ecdsa.seed); > + } > + > + ret =3D 0; > +err: > + BN_free(order); > + BN_free(pkey); > + BN_free(r); > + return ret; > +} > + > +static int > +prepare_vec_ecdsa_k(void) > +{ > + BIGNUM *pkey =3D NULL, *k =3D NULL; > + int ret =3D -1; > + > + if (!vec.ecdsa.pkey.len) > + return -1; > + > + pkey =3D BN_new(); > + if (!pkey) > + goto err; > + > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.pkey); > + ret =3D BN_hex2bn(&pkey, info.one_line_text); > + if ((uint32_t)ret !=3D strlen(info.one_line_text)) > + goto err; > + > + k =3D BN_new(); > + if (!k) > + goto err; > + > + if (!BN_sub(k, pkey, BN_value_one())) > + goto err; > + > + if (BN_is_zero(pkey)) { > + if (!BN_add(k, pkey, BN_value_one())) > + goto err; > + } > + > + parse_uint8_hex_str("", BN_bn2hex(k), &vec.ecdsa.k); > + ret =3D 0; > +err: > + BN_free(pkey); > + BN_free(k); > + return ret; > +} > + > +#else > +static int > +prepare_vec_ecdsa(void) > +{ > + /* > + * Generate ECDSA values. > + */ > + return -ENOTSUP; > +} > + > +static int > +prepare_vec_ecdsa_k(void) > +{ > + /* > + * Generate ECDSA values. > + */ > + return -ENOTSUP; > +} > +#endif /* USE_OPENSSL */ > + > +static int > +parse_test_ecdsa_json_interim_writeback(struct fips_val *val) { > + RTE_SET_USED(val); > + > + if (info.interim_info.ecdsa_data.random_msg) { > + json_object_set_new(json_info.json_write_group, > "conformance", > + json_string("SP800- > 106")); > + } > + > + if (info.op =3D=3D FIPS_TEST_ASYM_SIGGEN) { > + /* For siggen tests, ECDSA values can be created soon after > + * the test group data are parsed. > + */ > + if (vec.ecdsa.pkey.val) { > + rte_free(vec.ecdsa.pkey.val); > + vec.ecdsa.pkey.val =3D NULL; > + } > + > + if (prepare_vec_ecdsa() < 0) > + return -1; > + > + info.interim_info.ecdsa_data.pubkey_gen =3D 1; > + } > + > + return 0; > +} > + > +static int > +post_test_ecdsa_json_interim_writeback(struct fips_val *val) { > + RTE_SET_USED(val); > + > + if (info.op =3D=3D FIPS_TEST_ASYM_KEYGEN) { > + json_t *obj; > + > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.qx); > + obj =3D json_string(info.one_line_text); > + json_object_set_new(json_info.json_write_group, "qx", > obj); > + > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.qy); > + obj =3D json_string(info.one_line_text); > + json_object_set_new(json_info.json_write_group, "qy", > obj); > + } > + > + return 0; > +} > + > +static int > +parse_test_ecdsa_json_writeback(struct fips_val *val) { > + json_t *tcId; > + > + RTE_SET_USED(val); > + > + tcId =3D json_object_get(json_info.json_test_case, "tcId"); > + > + json_info.json_write_case =3D json_object(); > + json_object_set(json_info.json_write_case, "tcId", tcId); > + > + if (info.op =3D=3D FIPS_TEST_ASYM_SIGGEN) { > + json_t *obj; > + > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.r); > + obj =3D json_string(info.one_line_text); > + json_object_set_new(json_info.json_write_case, "r", obj); > + > + writeback_hex_str("", info.one_line_text, &vec.ecdsa.s); > + obj =3D json_string(info.one_line_text); > + json_object_set_new(json_info.json_write_case, "s", obj); > + > + if (info.interim_info.ecdsa_data.random_msg) { > + writeback_hex_str("", info.one_line_text, > &vec.ecdsa.seed); > + obj =3D json_string(info.one_line_text); > + json_object_set_new(json_info.json_write_case, > "randomValue", obj); > + json_object_set_new(json_info.json_write_case, > "randomValueLen", > + json_integer(vec.ecdsa.seed.len * 8)); > + } > + } else if (info.op =3D=3D FIPS_TEST_ASYM_SIGVER) { > + if (vec.status =3D=3D RTE_CRYPTO_OP_STATUS_SUCCESS) > + json_object_set_new(json_info.json_write_case, > "testPassed", json_true()); > + else > + json_object_set_new(json_info.json_write_case, > "testPassed", json_false()); > + } > + > + return 0; > +} > + > +static int > +parse_interim_str(const char *key, char *src, struct fips_val *val) { > + uint32_t i; > + > + RTE_SET_USED(val); > + > + if (strcmp(key, TESTTYPE_JSON_STR) =3D=3D 0) { > + for (i =3D 0; i < RTE_DIM(ecdsa_test_types); i++) > + if (strstr(src, ecdsa_test_types[i].desc)) { > + info.parse_writeback =3D > parse_test_ecdsa_json_writeback; > + break; > + } > + > + if (!info.parse_writeback || i >=3D > RTE_DIM(ecdsa_test_types)) > + return -EINVAL; > + > + } else if (strcmp(key, CURVE_JSON_STR) =3D=3D 0) { > + for (i =3D 0; i < RTE_DIM(ecdsa_curve_ids); i++) > + if (strstr(src, ecdsa_curve_ids[i].desc)) { > + info.interim_info.ecdsa_data.curve_id =3D > ecdsa_curve_ids[i].curve_id; > + info.interim_info.ecdsa_data.curve_len =3D > + ecdsa_curve_len[i].curve_len; > + break; > + } > + > + if (i >=3D RTE_DIM(ecdsa_curve_ids)) > + return -EINVAL; > + } else if (strcmp(key, HASH_JSON_STR) =3D=3D 0) { > + for (i =3D 0; i < RTE_DIM(ecdsa_auth_algs); i++) > + if (strstr(src, ecdsa_auth_algs[i].desc)) { > + info.interim_info.ecdsa_data.auth =3D > ecdsa_auth_algs[i].auth; > + break; > + } > + > + if (i >=3D RTE_DIM(ecdsa_auth_algs)) > + return -EINVAL; > + } else if (strcmp(key, CONFORMANCE_JSON_STR) =3D=3D 0) { > + info.interim_info.ecdsa_data.random_msg =3D 1; > + } else { > + return -EINVAL; > + } > + > + return 0; > +} > + > +static int > +parse_siggen_message_str(const char *key, char *src, struct fips_val > +*val) { > + int ret =3D 0; > + > + parse_uint8_hex_str(key, src, val); > + if (info.interim_info.ecdsa_data.random_msg) { > + ret =3D fips_test_randomize_message(val, &vec.ecdsa.seed); > + if (ret < 0) > + return ret; > + } > + > + if (vec.ecdsa.k.val) { > + rte_free(vec.ecdsa.k.val); > + vec.ecdsa.k.val =3D NULL; > + } > + > + ret =3D prepare_vec_ecdsa_k(); > + return ret; > +} > + > +static int > +parse_sigver_randomvalue_str(const char *key, char *src, struct > +fips_val *val) { > + int ret =3D 0; > + > + parse_uint8_hex_str(key, src, val); > + if (info.interim_info.ecdsa_data.random_msg) > + ret =3D fips_test_randomize_message(&vec.pt, val); > + > + return ret; > +} > + > +struct fips_test_callback ecdsa_interim_json_vectors[] =3D { > + {TESTTYPE_JSON_STR, parse_interim_str, NULL}, > + {CURVE_JSON_STR, parse_interim_str, NULL}, > + {HASH_JSON_STR, parse_interim_str, NULL}, > + {CONFORMANCE_JSON_STR, parse_interim_str, NULL}, > + {NULL, NULL, NULL} /**< end pointer */ }; > + > +struct fips_test_callback ecdsa_siggen_json_vectors[] =3D { > + {MSG_JSON_STR, parse_siggen_message_str, &vec.pt}, > + {NULL, NULL, NULL} /**< end pointer */ }; > + > +struct fips_test_callback ecdsa_sigver_json_vectors[] =3D { > + {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, > + {QX_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qx}, > + {QY_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qy}, > + {R_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.r}, > + {S_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.s}, > + {RV_JSON_STR, parse_sigver_randomvalue_str, > &vec.ecdsa.seed}, > + {NULL, NULL, NULL} /**< end pointer */ }; > + > +int > +parse_test_ecdsa_json_init(void) > +{ > + json_t *mode_obj =3D json_object_get(json_info.json_vector_set, > "mode"); > + const char *mode_str =3D json_string_value(mode_obj); > + > + info.callbacks =3D NULL; > + info.parse_writeback =3D NULL; > + info.interim_info.ecdsa_data.random_msg =3D 0; > + > + info.interim_callbacks =3D ecdsa_interim_json_vectors; > + info.post_interim_writeback =3D > post_test_ecdsa_json_interim_writeback; > + info.parse_interim_writeback =3D > parse_test_ecdsa_json_interim_writeback; > + if (strcmp(mode_str, "sigGen") =3D=3D 0) { > + info.op =3D FIPS_TEST_ASYM_SIGGEN; > + info.callbacks =3D ecdsa_siggen_json_vectors; > + } else if (strcmp(mode_str, "sigVer") =3D=3D 0) { > + info.op =3D FIPS_TEST_ASYM_SIGVER; > + info.callbacks =3D ecdsa_sigver_json_vectors; > + } else { > + return -EINVAL; > + } > + > + return 0; > +} > +#endif /* USE_JANSSON */ > diff --git a/examples/fips_validation/main.c > b/examples/fips_validation/main.c index cfa01eae20..b4cb10a106 100644 > --- a/examples/fips_validation/main.c > +++ b/examples/fips_validation/main.c > @@ -977,6 +977,103 @@ prepare_rsa_op(void) > return 0; > } >=20 > +static int > +prepare_ecdsa_op(void) > +{ > + struct rte_crypto_asym_op *asym; > + struct fips_val msg; > + > + __rte_crypto_op_reset(env.op, > RTE_CRYPTO_OP_TYPE_ASYMMETRIC); > + > + asym =3D env.op->asym; > + if (env.digest) { > + msg.val =3D env.digest; > + msg.len =3D env.digest_len; > + } else { > + msg.val =3D vec.pt.val; > + msg.len =3D vec.pt.len; > + } > + > + if (info.op =3D=3D FIPS_TEST_ASYM_SIGGEN) { > + asym->ecdsa.op_type =3D RTE_CRYPTO_ASYM_OP_SIGN; > + asym->ecdsa.message.data =3D msg.val; > + asym->ecdsa.message.length =3D msg.len; > + asym->ecdsa.pkey.data =3D vec.ecdsa.pkey.val; > + asym->ecdsa.pkey.length =3D vec.ecdsa.pkey.len; > + asym->ecdsa.k.data =3D vec.ecdsa.k.val; > + asym->ecdsa.k.length =3D vec.ecdsa.k.len; > + > + if (vec.ecdsa.r.val) > + rte_free(vec.ecdsa.r.val); > + > + if (vec.ecdsa.s.val) > + rte_free(vec.ecdsa.s.val); > + > + vec.ecdsa.r.len =3D info.interim_info.ecdsa_data.curve_len; > + vec.ecdsa.r.val =3D rte_zmalloc(NULL, vec.ecdsa.r.len, 0); > + > + vec.ecdsa.s.len =3D vec.ecdsa.r.len; > + vec.ecdsa.s.val =3D rte_zmalloc(NULL, vec.ecdsa.s.len, 0); > + > + asym->ecdsa.r.data =3D vec.ecdsa.r.val; > + asym->ecdsa.r.length =3D 0; > + asym->ecdsa.s.data =3D vec.ecdsa.s.val; > + asym->ecdsa.s.length =3D 0; > + } else if (info.op =3D=3D FIPS_TEST_ASYM_SIGVER) { > + asym->ecdsa.op_type =3D RTE_CRYPTO_ASYM_OP_VERIFY; > + asym->ecdsa.message.data =3D msg.val; > + asym->ecdsa.message.length =3D msg.len; > + asym->ecdsa.q.x.data =3D vec.ecdsa.qx.val; > + asym->ecdsa.q.x.length =3D vec.ecdsa.qx.len; > + asym->ecdsa.q.y.data =3D vec.ecdsa.qy.val; > + asym->ecdsa.q.y.length =3D vec.ecdsa.qy.len; > + asym->ecdsa.r.data =3D vec.ecdsa.r.val; > + asym->ecdsa.r.length =3D vec.ecdsa.r.len; > + asym->ecdsa.s.data =3D vec.ecdsa.s.val; > + asym->ecdsa.s.length =3D vec.ecdsa.s.len; > + } else { > + RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op); > + return -EINVAL; > + } > + > + rte_crypto_op_attach_asym_session(env.op, env.asym.sess); > + > + return 0; > +} > + > +static int > +prepare_ecfpm_op(void) > +{ > + struct rte_crypto_asym_op *asym; > + > + __rte_crypto_op_reset(env.op, > RTE_CRYPTO_OP_TYPE_ASYMMETRIC); > + > + asym =3D env.op->asym; > + asym->ecpm.scalar.data =3D vec.ecdsa.pkey.val; > + asym->ecpm.scalar.length =3D vec.ecdsa.pkey.len; > + > + if (vec.ecdsa.qx.val) > + rte_free(vec.ecdsa.qx.val); > + > + if (vec.ecdsa.qy.val) > + rte_free(vec.ecdsa.qy.val); > + > + vec.ecdsa.qx.len =3D info.interim_info.ecdsa_data.curve_len; > + vec.ecdsa.qx.val =3D rte_zmalloc(NULL, vec.ecdsa.qx.len, 0); > + > + vec.ecdsa.qy.len =3D vec.ecdsa.qx.len; > + vec.ecdsa.qy.val =3D rte_zmalloc(NULL, vec.ecdsa.qy.len, 0); > + > + asym->ecpm.r.x.data =3D vec.ecdsa.qx.val; > + asym->ecpm.r.x.length =3D 0; > + asym->ecpm.r.y.data =3D vec.ecdsa.qy.val; > + asym->ecpm.r.y.length =3D 0; > + > + rte_crypto_op_attach_asym_session(env.op, env.asym.sess); > + > + return 0; > +} > + > static int > prepare_aes_xform(struct rte_crypto_sym_xform *xform) { @@ -1441,6 > +1538,69 @@ prepare_rsa_xform(struct rte_crypto_asym_xform *xform) > return 0; > } >=20 > +static int > +prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform) { > + const struct rte_cryptodev_asymmetric_xform_capability *cap; > + struct rte_cryptodev_asym_capability_idx cap_idx; > + > + xform->xform_type =3D RTE_CRYPTO_ASYM_XFORM_ECDSA; > + xform->next =3D NULL; > + > + cap_idx.type =3D xform->xform_type; > + cap =3D rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); > + if (!cap) { > + RTE_LOG(ERR, USER1, "Failed to get capability for cdev > %u\n", > + env.dev_id); > + return -EINVAL; > + } > + > + switch (info.op) { > + case FIPS_TEST_ASYM_SIGGEN: > + if > (!rte_cryptodev_asym_xform_capability_check_optype(cap, > + RTE_CRYPTO_ASYM_OP_SIGN)) { > + RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", > + info.device_name, > RTE_CRYPTO_ASYM_OP_SIGN); > + return -EPERM; > + } > + break; > + case FIPS_TEST_ASYM_SIGVER: > + if > (!rte_cryptodev_asym_xform_capability_check_optype(cap, > + RTE_CRYPTO_ASYM_OP_VERIFY)) { > + RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", > + info.device_name, > RTE_CRYPTO_ASYM_OP_VERIFY); > + return -EPERM; > + } > + break; > + default: > + break; > + } > + > + xform->ec.curve_id =3D info.interim_info.ecdsa_data.curve_id; > + return 0; > +} > + > +static int > +prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform) { > + const struct rte_cryptodev_asymmetric_xform_capability *cap; > + struct rte_cryptodev_asym_capability_idx cap_idx; > + > + xform->xform_type =3D RTE_CRYPTO_ASYM_XFORM_ECFPM; > + xform->next =3D NULL; > + > + cap_idx.type =3D xform->xform_type; > + cap =3D rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); > + if (!cap) { > + RTE_LOG(ERR, USER1, "Failed to get capability for cdev > %u\n", > + env.dev_id); > + return -EINVAL; > + } > + > + xform->ec.curve_id =3D info.interim_info.ecdsa_data.curve_id; > + return 0; > +} > + > static int > get_writeback_data(struct fips_val *val) { @@ -1546,7 +1706,7 @@ > fips_run_asym_test(void) > struct rte_crypto_op *deqd_op; > int ret; >=20 > - if (info.op =3D=3D FIPS_TEST_ASYM_KEYGEN) { > + if (info.op =3D=3D FIPS_TEST_ASYM_KEYGEN && info.algo !=3D > +FIPS_TEST_ALGO_ECDSA) { > RTE_SET_USED(asym); > ret =3D 0; > goto exit; > @@ -1606,7 +1766,33 @@ fips_run_test(void) > } >=20 > env.op =3D env.asym.op; > - return fips_run_asym_test(); > + if (info.op =3D=3D FIPS_TEST_ASYM_SIGGEN && > + info.algo =3D=3D FIPS_TEST_ALGO_ECDSA && > + info.interim_info.ecdsa_data.pubkey_gen =3D=3D 1) { > + fips_prepare_asym_xform_t ecdsa_xform; > + fips_prepare_op_t ecdsa_op; > + > + ecdsa_xform =3D test_ops.prepare_asym_xform; > + ecdsa_op =3D test_ops.prepare_asym_op; > + info.op =3D FIPS_TEST_ASYM_KEYGEN; > + test_ops.prepare_asym_xform =3D prepare_ecfpm_xform; > + test_ops.prepare_asym_op =3D prepare_ecfpm_op; > + ret =3D fips_run_asym_test(); > + if (ret < 0) > + return ret; > + > + info.post_interim_writeback(NULL); > + info.interim_info.ecdsa_data.pubkey_gen =3D 0; > + > + test_ops.prepare_asym_xform =3D ecdsa_xform; > + test_ops.prepare_asym_op =3D ecdsa_op; > + info.op =3D FIPS_TEST_ASYM_SIGGEN; > + ret =3D fips_run_asym_test(); > + } else { > + ret =3D fips_run_asym_test(); > + } > + > + return ret; > } >=20 > static int > @@ -2235,6 +2421,17 @@ init_test_ops(void) > test_ops.prepare_asym_xform =3D prepare_rsa_xform; > test_ops.test =3D fips_generic_test; > break; > + case FIPS_TEST_ALGO_ECDSA: > + if (info.op =3D=3D FIPS_TEST_ASYM_KEYGEN) { > + test_ops.prepare_asym_op =3D prepare_ecfpm_op; > + test_ops.prepare_asym_xform =3D > prepare_ecfpm_xform; > + test_ops.test =3D fips_generic_test; > + } else { > + test_ops.prepare_asym_op =3D prepare_ecdsa_op; > + test_ops.prepare_asym_xform =3D > prepare_ecdsa_xform; > + test_ops.test =3D fips_generic_test; > + } > + break; > default: > if (strstr(info.file_name, "TECB") || > strstr(info.file_name, "TCBC")) { > @@ -2409,6 +2606,9 @@ fips_test_one_test_group(void) > case FIPS_TEST_ALGO_RSA: > ret =3D parse_test_rsa_json_init(); > break; > + case FIPS_TEST_ALGO_ECDSA: > + ret =3D parse_test_ecdsa_json_init(); > + break; > default: > return -EINVAL; > } > @@ -2439,7 +2639,7 @@ static int > fips_test_one_vector_set(void) > { > int ret; > - json_t *test_groups, *write_groups, *write_version, *write_set; > + json_t *test_groups, *write_groups, *write_version, *write_set, > *mode; > size_t group_idx, num_groups; >=20 > test_groups =3D json_object_get(json_info.json_vector_set, > "testGroups"); @@ -2458,6 +2658,10 @@ fips_test_one_vector_set(void) > json_object_get(json_info.json_vector_set, "vsId")); > json_object_set(write_set, "algorithm", > json_object_get(json_info.json_vector_set, "algorithm")); > + mode =3D json_object_get(json_info.json_vector_set, "mode"); > + if (mode !=3D NULL) > + json_object_set_new(write_set, "mode", mode); > + > json_object_set(write_set, "revision", > json_object_get(json_info.json_vector_set, "revision")); > json_object_set_new(write_set, "isSample", diff --git > a/examples/fips_validation/meson.build > b/examples/fips_validation/meson.build > index d310093189..34d3c7c8ca 100644 > --- a/examples/fips_validation/meson.build > +++ b/examples/fips_validation/meson.build > @@ -19,6 +19,7 @@ sources =3D files( > 'fips_validation_sha.c', > 'fips_validation_xts.c', > 'fips_validation_rsa.c', > + 'fips_validation_ecdsa.c', > 'fips_dev_self_test.c', > 'main.c', > ) > -- > 2.25.1 Acked-by: Brian Dooley