Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp3448033rdh; Thu, 28 Sep 2023 11:55:25 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHCMfXnhBF+WLgDxe6LsSnYleYExIwonJ6TwIPNEACc+8YokyCiJh4pM0mXZFkNeVjVnozg X-Received: by 2002:a17:902:d502:b0:1bd:fa80:103d with SMTP id b2-20020a170902d50200b001bdfa80103dmr2143651plg.25.1695927324964; Thu, 28 Sep 2023 11:55:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695927324; cv=none; d=google.com; s=arc-20160816; b=s3IRupeTSWSDhgUb3Yst/LZGUOKRggfvJDzofnXIypt+wSZ0hOMQPGXzgZUdAtbClB gHOZaXqNSw26WN1otkMxW5odl3eDfUf50pTY1ZkBoOd4VEM1fEtWHms6mvSZeGOd3gjN v1FUnpTEXftS0/9jaf+RD6c/OAaihF4wu5jPS0d6OJ69B8BTXg2dY7QZ9ct/AwMgdnnk QaMJ3Cvgr+Zpp3xgzX49TQCVIs7pEjpNwC8sAhWFZ/1nzZHcY/k4vyUPgqw0aGc1Ltbt 62ukk1GtjtwO5RsMVsDZxMgP4JFtrU054BBb7xPHLmmHp+q+U7d/Coq03mtvgg+c2q75 XUPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:date:from:references:in-reply-to :message-id; bh=aJrFuLu4+vdF9JsYNub2TxhCqTotc0SeadvqfbQDMWc=; fh=j94gzfSAT+8kF46ZvOkY3DNYs/HkghetT1vgREBUW1M=; b=YSClviLoORSy5KLfmHBEddm6f6NtcT6BeKFcXLcgsf/KMOg+Mf/WwWOXRwG0LyxqN+ 6oAWGdOVcc9/MrenrMfHXstOaBGkoqSXheYnzi1ahksOsZBwFhE6YljLMoXQ2A8lt21v FEFfWzpim+ZrlAdOioKGm++ZZ/Aj1ZvnAsJkAp51CaExk5fiGOexibFMi06Gfn6kLe55 YdyT7HHq7IKRcLD0suCqA8MFgzPpDeDqrecbMLDt7q5nzdZiKRaprRfa2jX0hJpBlHwl Xmkf70tLM38RzL/UF6Y/Nsl51aA9RUrN0Q9w/lz2nACfZ+MeIZPjoC1QoRHpnjxGjIEc 1w3A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id m7-20020a170902db0700b001beef8ccd05si20695364plx.489.2023.09.28.11.55.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Sep 2023 11:55:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 482AE821FD1D; Thu, 28 Sep 2023 10:46:18 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231322AbjI1RqR (ORCPT + 99 others); Thu, 28 Sep 2023 13:46:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229478AbjI1RqQ (ORCPT ); Thu, 28 Sep 2023 13:46:16 -0400 X-Greylist: delayed 721 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Thu, 28 Sep 2023 10:46:13 PDT Received: from mailout3.hostsharing.net (mailout3.hostsharing.net [176.9.242.54]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1B5319D; Thu, 28 Sep 2023 10:46:13 -0700 (PDT) Received: from h08.hostsharing.net (h08.hostsharing.net [IPv6:2a01:37:1000::53df:5f1c:0]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "*.hostsharing.net", Issuer "RapidSSL Global TLS RSA4096 SHA256 2022 CA1" (verified OK)) by mailout3.hostsharing.net (Postfix) with ESMTPS id 7914310029AE0; Thu, 28 Sep 2023 19:46:11 +0200 (CEST) Received: from localhost (unknown [89.246.108.87]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by h08.hostsharing.net (Postfix) with ESMTPSA id EFDC160E0037; Thu, 28 Sep 2023 19:46:10 +0200 (CEST) X-Mailbox-Line: From 16c06528d13b2c0081229a45cacd4b1b9cdff738 Mon Sep 17 00:00:00 2001 Message-Id: <16c06528d13b2c0081229a45cacd4b1b9cdff738.1695921657.git.lukas@wunner.de> In-Reply-To: References: From: Lukas Wunner Date: Thu, 28 Sep 2023 19:32:32 +0200 Subject: [PATCH 03/12] X.509: Move certificate length retrieval into new helper To: Bjorn Helgaas , David Howells , David Woodhouse , Herbert Xu , "David S. Miller" , Alex Williamson , , , , , , Cc: Jonathan Cameron , , David Box , Dan Williams , Dave Jiang , "Li, Ming" , Zhi Wang , Alistair Francis , Wilfred Mallawa , Alexey Kardashevskiy , Tom Lendacky , Sean Christopherson , Alexander Graf X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Thu, 28 Sep 2023 10:46:18 -0700 (PDT) The upcoming in-kernel SPDM library (Security Protocol and Data Model, https://www.dmtf.org/dsp/DSP0274) needs to retrieve the length from ASN.1 DER-encoded X.509 certificates. Such code already exists in x509_load_certificate_list(), so move it into a new helper for reuse by SPDM. No functional change intended. Signed-off-by: Lukas Wunner --- crypto/asymmetric_keys/x509_loader.c | 38 +++++++++++++++++++--------- include/keys/asymmetric-type.h | 2 ++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/crypto/asymmetric_keys/x509_loader.c b/crypto/asymmetric_keys/x509_loader.c index a41741326998..121460a0de46 100644 --- a/crypto/asymmetric_keys/x509_loader.c +++ b/crypto/asymmetric_keys/x509_loader.c @@ -4,28 +4,42 @@ #include #include +int x509_get_certificate_length(const u8 *p, unsigned long buflen) +{ + int plen; + + /* Each cert begins with an ASN.1 SEQUENCE tag and must be more + * than 256 bytes in size. + */ + if (buflen < 4) + return -EINVAL; + + if (p[0] != 0x30 && + p[1] != 0x82) + return -EINVAL; + + plen = (p[2] << 8) | p[3]; + plen += 4; + if (plen > buflen) + return -EINVAL; + + return plen; +} +EXPORT_SYMBOL_GPL(x509_get_certificate_length); + int x509_load_certificate_list(const u8 cert_list[], const unsigned long list_size, const struct key *keyring) { key_ref_t key; const u8 *p, *end; - size_t plen; + int plen; p = cert_list; end = p + list_size; while (p < end) { - /* Each cert begins with an ASN.1 SEQUENCE tag and must be more - * than 256 bytes in size. - */ - if (end - p < 4) - goto dodgy_cert; - if (p[0] != 0x30 && - p[1] != 0x82) - goto dodgy_cert; - plen = (p[2] << 8) | p[3]; - plen += 4; - if (plen > end - p) + plen = x509_get_certificate_length(p, end - p); + if (plen < 0) goto dodgy_cert; key = key_create_or_update(make_key_ref(keyring, 1), diff --git a/include/keys/asymmetric-type.h b/include/keys/asymmetric-type.h index 69a13e1e5b2e..6705cfde25b9 100644 --- a/include/keys/asymmetric-type.h +++ b/include/keys/asymmetric-type.h @@ -84,6 +84,8 @@ extern struct key *find_asymmetric_key(struct key *keyring, const struct asymmetric_key_id *id_2, bool partial); +int x509_get_certificate_length(const u8 *p, unsigned long buflen); + int x509_load_certificate_list(const u8 cert_list[], const unsigned long list_size, const struct key *keyring); -- 2.40.1