Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1030424ybl; Fri, 30 Aug 2019 10:41:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqztXdQBsOr4LATLVeHIibW81FGQ3m8XN5nekzVYoYVxj+29GVHjVjJGo26b2IOsdz86LjEs X-Received: by 2002:a17:90a:e649:: with SMTP id ep9mr6121362pjb.38.1567186872057; Fri, 30 Aug 2019 10:41:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567186872; cv=none; d=google.com; s=arc-20160816; b=dn25yQIGUY8uBzy3QFLytS8dnwikOGQ0jiQReTsM3TQNUjYP/jaC6kuyzq1NnGoZvZ CJhdn7WzkqkRHf9k8NEYIN7HnMpnvkbC8WmwVnc13lopc245kkxHHEV7mzJKfZo0ZtUS mwfqMUjqtiVKHoJDTofsN5OmNk3rs3nlixgg/RUZT7fUN9fg1Vb4U8pt5qoGBmXzUq/N ggcHG+AfJ5ihXQz58Lmpgcc0qGjWPUUJKL3lAe719gqhjXMAwqgETtaglnk9EPfkq+wv rw3flaBUTM4KIy3RAe8XT//bBSvbyVQa7bbmJkiIQKV74L62CsSkSWL89GAnpmdacVAJ YpCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=701AFwbUi7CG62MZNmGD7Z8inXRILHxCZRu8QHQjjsg=; b=wytmtDtPxuVzxEAtVMLz7sT3BR0BdNUgxerFE1SJjbj37X2zHwlUTzXe7R5cBiyI05 eHlsW4DGJ1j3kisBQjC6YXq6WLhmRoTfAL9BngQTD5LkjmtXYcUmFimDcx+DyohlpZL3 q7mdwncB5jlX5CGc9P435lxOW4LcwDYGlVSrDP8XvMnlpVEK6TMEUDFEzI0QBESxkAjE 4JfrlM9B4usnmbzbcho5mWYaRQw3HtkZxRDyRni5D4Iq2BgjdUE/+y2bgG8w7V6VHS69 1YvmuvbdedVqeGSS7kM8e9vcCE4Thw6MJiWSK+LdBrioOTE7II6n2aNjN9zLNmNsPxfD 9Ubg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q11si5432803pjv.95.2019.08.30.10.40.41; Fri, 30 Aug 2019 10:41:12 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727304AbfH3RjL (ORCPT + 99 others); Fri, 30 Aug 2019 13:39:11 -0400 Received: from mga07.intel.com ([134.134.136.100]:12030 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727246AbfH3RjL (ORCPT ); Fri, 30 Aug 2019 13:39:11 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Aug 2019 10:39:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,447,1559545200"; d="scan'208";a="381192674" Received: from bgi1-mobl2.amr.corp.intel.com ([10.254.35.27]) by fmsmga005.fm.intel.com with ESMTP; 30 Aug 2019 10:39:10 -0700 From: Brian Gix To: linux-bluetooth@vger.kernel.org Cc: brian.gix@intel.com, inga.stotland@intel.com, marcel@holtmann.org Subject: [PATCH BlueZ] mesh: test AEAD at startup to check kernel support Date: Fri, 30 Aug 2019 10:39:02 -0700 Message-Id: <20190830173902.19953-1-brian.gix@intel.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org One time test at startup to ensure either kernel version v4.9 or later, *or* that required AES-CCM support has been back-ported. If support not there, daemon will run without providing D-Bus service or attaching to controllers (prevents systemd thrashing). --- mesh/crypto.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ mesh/crypto.h | 1 + mesh/main.c | 7 +++++++ 3 files changed, 59 insertions(+) diff --git a/mesh/crypto.c b/mesh/crypto.c index a6dc7ffe2..27d1a16cc 100644 --- a/mesh/crypto.c +++ b/mesh/crypto.c @@ -1130,3 +1130,54 @@ bool mesh_crypto_check_fcs(const uint8_t *packet, uint8_t packet_len, return fcs == 0xcf; } + +/* This function performs a quick-check of ELL and Kernel AEAD encryption. + * Some kernel versions before v4.9 have a known AEAD bug. If the system + * running this test is using a v4.8 or earlier kernel, a failure here is + * likely unless AEAD encryption has been backported. + */ +static const uint8_t crypto_test_result[] = { + 0x75, 0x03, 0x7e, 0xe2, 0x89, 0x81, 0xbe, 0x59, + 0xbc, 0xe6, 0xdd, 0x23, 0x63, 0x5b, 0x16, 0x61, + 0xb7, 0x23, 0x92, 0xd4, 0x86, 0xee, 0x84, 0x29, + 0x9a, 0x2a, 0xbf, 0x96 +}; +bool mesh_crypto_check_avail() +{ + void *cipher; + bool result; + uint8_t i; + union { + struct { + uint8_t key[16]; + uint8_t aad[16]; + uint8_t nonce[13]; + uint8_t data[20]; + uint8_t mic[8]; + } crypto; + uint8_t bytes[0]; + } u; + uint8_t out_msg[sizeof(u.crypto.data) + sizeof(u.crypto.mic)]; + + + l_debug("Testing Crypto"); + for (i = 0; i < sizeof(u); i++) { + u.bytes[i] = 0x60 + i; + } + + cipher = l_aead_cipher_new(L_AEAD_CIPHER_AES_CCM, u.crypto.key, + sizeof(u.crypto.key), sizeof(u.crypto.mic)); + + result = l_aead_cipher_encrypt(cipher, + u.crypto.data, sizeof(u.crypto.data), + u.crypto.aad, sizeof(u.crypto.aad), + u.crypto.nonce, sizeof(u.crypto.nonce), + out_msg, sizeof(out_msg)); + + if (result) + result = !memcmp(out_msg, crypto_test_result, sizeof(out_msg)); + + l_aead_cipher_free(cipher); + + return result; +} diff --git a/mesh/crypto.h b/mesh/crypto.h index 1a73bcaa3..e5ce840b4 100644 --- a/mesh/crypto.h +++ b/mesh/crypto.h @@ -161,3 +161,4 @@ bool mesh_crypto_check_fcs(const uint8_t *packet, uint8_t packet_len, uint8_t received_fcs); bool mesh_crypto_aes_cmac(const uint8_t key[16], const uint8_t *msg, size_t msg_len, uint8_t res[16]); +bool mesh_crypto_check_avail(void); diff --git a/mesh/main.c b/mesh/main.c index 262e3da48..273651f97 100644 --- a/mesh/main.c +++ b/mesh/main.c @@ -34,6 +34,7 @@ #include "lib/mgmt.h" #include "mesh/mesh.h" +#include "mesh/crypto.h" #include "mesh/dbus.h" #include "mesh/mesh-io.h" @@ -121,6 +122,12 @@ int main(int argc, char *argv[]) l_log_set_stderr(); + if (!mesh_crypto_check_avail()) { + l_error("Mesh Crypto functions unavailable"); + status = l_main_run_with_signal(signal_handler, NULL); + goto done; + } + for (;;) { int opt; const char *str; -- 2.21.0