Re: [Cbor] Review: draft-bormann-cbor-packed-00 & SUIT

Brendan Moran <Brendan.Moran@arm.com> Wed, 29 July 2020 22:46 UTC

Return-Path: <Brendan.Moran@arm.com>
X-Original-To: cbor@ietfa.amsl.com
Delivered-To: cbor@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id E1B153A08FA for <cbor@ietfa.amsl.com>; Wed, 29 Jul 2020 15:46:10 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.9
X-Spam-Level:
X-Spam-Status: No, score=-1.9 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_MSPIKE_H2=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.b=88Fuhq3D; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.b=88Fuhq3D
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KwBBKJqeQS9D for <cbor@ietfa.amsl.com>; Wed, 29 Jul 2020 15:45:57 -0700 (PDT)
Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2062.outbound.protection.outlook.com [40.107.20.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 164283A08E6 for <cbor@ietf.org>; Wed, 29 Jul 2020 15:45:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yKfFjmL1tRKNGJ/krV2btjSgOT4yaDBVnOfOcT5jFW0=; b=88Fuhq3DS0ULbBrH0uEvRmwAXISwY2IQqWG7tcd8lfcjH8xAMYt6ZgZwHJoyTiKEClWEyJMjqwWnKlX2O94fsuy3ooX16ENkQmKxNviftmvQ/c2PMN4/9lztLrnP/BDpgl1DP3OoUv/rreNkOYlShaBDJwwmypdclfouJqk/JX8=
Received: from AM5PR0201CA0012.eurprd02.prod.outlook.com (2603:10a6:203:3d::22) by DB7PR08MB3049.eurprd08.prod.outlook.com (2603:10a6:5:1d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.24; Wed, 29 Jul 2020 22:45:53 +0000
Received: from VE1EUR03FT010.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:3d:cafe::95) by AM5PR0201CA0012.outlook.office365.com (2603:10a6:203:3d::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16 via Frontend Transport; Wed, 29 Jul 2020 22:45:53 +0000
X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; ietf.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;ietf.org; dmarc=bestguesspass action=none header.from=arm.com;
Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com;
Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VE1EUR03FT010.mail.protection.outlook.com (10.152.18.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.10 via Frontend Transport; Wed, 29 Jul 2020 22:45:52 +0000
Received: ("Tessian outbound c4059ed8d7bf:v62"); Wed, 29 Jul 2020 22:45:52 +0000
X-CheckRecipientChecked: true
X-CR-MTA-CID: 4182083ce3df85da
X-CR-MTA-TID: 64aa7808
Received: from 91f5372b1b76.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 053BA45D-8C20-44F4-B132-708885204EA2.1; Wed, 29 Jul 2020 22:45:47 +0000
Received: from EUR01-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 91f5372b1b76.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 29 Jul 2020 22:45:47 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=e6K7XeiSgpq20JJ4Ht1IgSFAHZ9ViiSqVI2y5Dz0DTLponGOzTyJ9PgVK3XvigvQ6GUDLld09X8vR2KRWFRgpLKeoWvspKrBosVg3c1E1goB6gf0MRz0OgEHzo58GddAwiS+Rl52iW6fDg0jsE3+dX3RZgpYyJHHBTcOv9k/vBYfIP/K4E2/1hR/+M7bP+IuanJ2QJkOCzs+bh1M/TrP0BWD8x63CxtEZz8QU4/GC9qxE1spmcdYx5UyWdeZSJ9CqnEIFv5lV+XqqbiNygIZgim1uuw+Q15lW8ZZNOv3dNFfoxBf9uo1L7NxFVmZLDQGAmZOpAEMrh5MpS4dtlID/w==
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-SenderADCheck; bh=yKfFjmL1tRKNGJ/krV2btjSgOT4yaDBVnOfOcT5jFW0=; b=ICOprZEpferpTnhYuxyalFYy81uuDbQ8m9jt3j2QfbKkTY+IiETbAPOzabEuZl2WPA8YHfBAB4T2OEQMy3qy//PYA50lbXiRJip2Xp1xMhqdnsq+nzCy6kBzTUGJwjDlNtb07Gbi74n8m/yZk4r3npX5+W6yG1Myv1mqYawI7w3nucjAZiaZ4ZWFjTsDgFndbz9Oj3tPqJgahq+kFJpQv2axDNXPL5FKz/3BcXd5rcs86dL03kQlI9k3J5wIWxPKL/Yns1D1nwqS/R8VMkqxeu3Bv8aov/RpXE6ctCL2Q6E5sM11iA4cA0HIoxYa3GpHP8zx64sW7QGFIg++TG7qcQ==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yKfFjmL1tRKNGJ/krV2btjSgOT4yaDBVnOfOcT5jFW0=; b=88Fuhq3DS0ULbBrH0uEvRmwAXISwY2IQqWG7tcd8lfcjH8xAMYt6ZgZwHJoyTiKEClWEyJMjqwWnKlX2O94fsuy3ooX16ENkQmKxNviftmvQ/c2PMN4/9lztLrnP/BDpgl1DP3OoUv/rreNkOYlShaBDJwwmypdclfouJqk/JX8=
Received: from VE1PR08MB4749.eurprd08.prod.outlook.com (2603:10a6:802:b1::21) by VI1PR08MB3584.eurprd08.prod.outlook.com (2603:10a6:803:88::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.24; Wed, 29 Jul 2020 22:45:45 +0000
Received: from VE1PR08MB4749.eurprd08.prod.outlook.com ([fe80::f40a:a75b:87e1:f1c4]) by VE1PR08MB4749.eurprd08.prod.outlook.com ([fe80::f40a:a75b:87e1:f1c4%6]) with mapi id 15.20.3216.034; Wed, 29 Jul 2020 22:45:45 +0000
From: Brendan Moran <Brendan.Moran@arm.com>
To: Michael Richardson <mcr+ietf@sandelman.ca>
CC: "cbor@ietf.org" <cbor@ietf.org>, Jim Schaad <ietf@augustcellars.com>, Carsten Bormann <cabo@tzi.org>
Thread-Topic: [Cbor] Review: draft-bormann-cbor-packed-00 & SUIT
Thread-Index: AQHWZPM7PSkNaZ82xkeO03LjqC3Ah6kdPGyAgABBsICAACKngIAA30mAgABYagCAAFGhgA==
Date: Wed, 29 Jul 2020 22:45:45 +0000
Message-ID: <AEB72DC9-76BF-49CB-BE70-7ABE2E4D9C39@arm.com>
References: <5E28C6E2-DFEC-4AF5-96CE-75E8F0927818@arm.com> <01d901d66503$2bbd93c0$8338bb40$@augustcellars.com> <7216D806-3473-463E-B6F2-AD8724AC56C6@tzi.org> <021e01d66535$57827d90$068778b0$@augustcellars.com> <406B6702-3045-4490-8CD0-8E352F924714@arm.com> <24543.1596045216@localhost>
In-Reply-To: <24543.1596045216@localhost>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-mailer: Apple Mail (2.3608.80.23.2.2)
Authentication-Results-Original: sandelman.ca; dkim=none (message not signed) header.d=none; sandelman.ca; dmarc=none action=none header.from=arm.com;
x-originating-ip: [82.20.19.206]
x-ms-publictraffictype: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: de26b6ac-83eb-4e0c-0f13-08d834112618
x-ms-traffictypediagnostic: VI1PR08MB3584:|DB7PR08MB3049:
X-Microsoft-Antispam-PRVS: <DB7PR08MB3049D5B90371AA6763BC2601EA700@DB7PR08MB3049.eurprd08.prod.outlook.com>
x-checkrecipientrouted: true
nodisclaimer: true
x-ms-oob-tlc-oobclassifiers: OLM:10000;OLM:10000;
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam-Untrusted: BCL:0;
X-Microsoft-Antispam-Message-Info-Original: zKzPLoUj02xLD4A75DHI3ScIMJ9vNO8rS5RgRRLMvnTIZFhzO8RbSYKsRzLdZ0/TRp5iY+7fQw8/QhwlcZ6wTjhVJPKWeRNAbDF5m/TICO1csT+rN1LZCmJxnZO8iLUjI2ip34sb3ruj8LezUdcH9nlxJevwP4UzgHoxcPUak5Ln94x06IB3lzJTk6Gd0Dz75b095zl7Y6w+/ZphuB6Hq/8GzLazrIX03jSmcN5KCibuTHLeICN11gIgw+D3JT1UFtC/6jn/33oSXadx2ya1w8j90ggF1dxBbaa2eFEMDZB5PhZxCV2PY5b90Jk1F7MhZnewWWYn89kp1gzeMCoBUawBojgGKLtReJD1ytjFjx+mUZ+4aYzCtWqOH0ARSOj3e/vee6ay0tu7qUmDfq8YpA==
X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR08MB4749.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(396003)(136003)(376002)(346002)(366004)(39860400002)(478600001)(66556008)(66446008)(66476007)(186003)(8676002)(6486002)(66946007)(64756008)(8936002)(33656002)(4326008)(76116006)(91956017)(2906002)(26005)(5660300002)(6506007)(53546011)(36756003)(83380400001)(54906003)(6512007)(2616005)(71200400001)(966005)(86362001)(316002); DIR:OUT; SFP:1101;
x-ms-exchange-antispam-messagedata: 8MzoOaJLuWO9nRltW2O6LLvZoWhiEQ76tESUsHQ7Fd2hzT6Pug7SXuK8tUTy/nGXYgJ50t61Paa40LYvzCwcoeXlMm9+kOeGZnxbWfOAgFanCWgrKI/PPT6efuV9rvOPGB9r4ZDmjKqQ9p2OQngm4f+BjiOGVD3eIUJ7lAihutVRcpNWDzKswoPhtz3YAvbek4uJObjV728dksNGUkO9UHhT2dzIiC7zl7Ps7oMliRlSxOjPIBZDlbatar4bm2QBsGhqv1QAEsIg3RB3jA+Ob6f0FixdLzuyH043/IJ8rHDCydRxoDpB6xf/SMkfjepu+fWslGqbyflSFBPMF5ai1TPu8wKqJJOMesWS1XnidyyWHeixToYeWDxrU/gE8ytQvCHwLF9Np9GP5R8XcYtfd6LUqh8yLvbiRMnHfPBEsDpKDqvM2En+qtjzBQqLY2CKfQasY+0YLScXgEc7oBFol2F1VjWK5CAhUYG4DsuGN0U=
x-ms-exchange-transport-forked: True
Content-Type: text/plain; charset="utf-8"
Content-ID: <7701804DD5A742408AA3D811BF502A99@eurprd08.prod.outlook.com>
Content-Transfer-Encoding: base64
MIME-Version: 1.0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB3584
Original-Authentication-Results: sandelman.ca; dkim=none (message not signed) header.d=none; sandelman.ca; dmarc=none action=none header.from=arm.com;
X-EOPAttributedMessage: 0
X-MS-Exchange-Transport-CrossTenantHeadersStripped: VE1EUR03FT010.eop-EUR03.prod.protection.outlook.com
X-MS-Office365-Filtering-Correlation-Id-Prvs: d85103d1-3c08-4fff-5a92-08d8341121b5
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: IiTXBvIeei5b8UeYfZYTAJUr4uvS5H6d6k0WB5psH1te25YQoNVWFB76npdvf22CpF3z9SQ8XrynmP4RiavGqKO/lFfUyPN74IDAhGYpIuJ/WUjXMElWZR8DoNWnuPqBKLv6c/suXb4D+ZzTCuadyFH4ZE2aTDc6t/aTyF8NZDcGT+YNDskArM0xHwmaAcmDMLANHWdmAV51JrTt8CSLpRmOLEQYvfZZdWeSgDfGsOCxkPBudVEljOOmu986j6I8Bfb3q8SLLjsfY9A+omjPOtoJaD0dJcB1F3OuqxQqa+Q5XUw0sNswOKfodNeqY9G1VjSxSR67TjLALa0kWBdTkko87DPbhDTDjXyvBnDZj3474+0IHXLcVXvDXz+AfXyTICtaT3W8sxGFDWxFeRsy4Ct65zTc8zM8woca5oT07p9FV61yEcrj0XH7t8Ec84fAV37OVHi1djJ3kLHx/vaJlGWh+W+kxCvtBIrweMNvg2Q=
X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFTY:; SFS:(4636009)(39860400002)(346002)(376002)(136003)(396003)(46966005)(336012)(83380400001)(2616005)(36756003)(6486002)(4326008)(6512007)(53546011)(6506007)(26005)(186003)(54906003)(966005)(6862004)(2906002)(478600001)(36906005)(316002)(8936002)(81166007)(8676002)(70206006)(70586007)(356005)(86362001)(82310400002)(47076004)(82740400003)(33656002)(5660300002); DIR:OUT; SFP:1101;
X-OriginatorOrg: arm.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2020 22:45:52.9645 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: de26b6ac-83eb-4e0c-0f13-08d834112618
X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com]
X-MS-Exchange-CrossTenant-AuthSource: VE1EUR03FT010.eop-EUR03.prod.protection.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3049
Archived-At: <https://mailarchive.ietf.org/arch/msg/cbor/AyQposDRhAEXZQXf3g6f8WQy6GQ>
Subject: Re: [Cbor] Review: draft-bormann-cbor-packed-00 & SUIT
X-BeenThere: cbor@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: "Concise Binary Object Representation \(CBOR\)" <cbor.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/cbor>, <mailto:cbor-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/cbor/>
List-Post: <mailto:cbor@ietf.org>
List-Help: <mailto:cbor-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/cbor>, <mailto:cbor-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 29 Jul 2020 22:46:11 -0000


> On 29 Jul 2020, at 18:53, Michael Richardson <mcr+ietf@sandelman.ca> wrote:
>
>
> Brendan Moran <Brendan.Moran@arm.com> wrote:
>> My intent was to verify first, then unpack. This is because the
>> unpacked structure never exists, in its entirety, in memory. If you
>> have to unpack straight into the digest algorithm in order to verify,
>> you introduce a TOCTOU problem. If you verify first, you at least have
>> a static, verified object.
>
> I agree.  I would write the encoder "sign the packed structure"
> (so decoder we verify first, then unpack...)
>
> I like this because it means:
> a) a third party can verify the signature without having the dictionaries.
>  Clearly it can't audit the contents without the external dictionar(y/ies).
>
> b) at this point in the specification I'm unclear if multiple passes of the
>  unpacked content is required.  But, if we did want to permit such
>  self-referential things, the decoder could wind up decoding infinite
>  things.  Such a thing ight be a desireable feature!
>  We could accomodate such a thing if with sign the packed structure,
>  because the decoder would know it's authentic before it tried to
>  expand.

The original specification prohibits loops, but leaves the implementation up to the reader.

>> The problem with this approach is dictionary selection. We need some
>> way to hint a dictionary identifier if it’s not obvious. This could be
>> a tag, an element in the Tag 6 array, some kind of OOB signal, or
>> something else.
>
> I think it needs to be in the tag 6 array.

Possibly, but this opens the question of where it goes. Maybe it needs to be explicitly included. Suppose that we use a special case:

Tag 6([rump, Tag 6(dictionary-id)]).

The context of the second Tag 6 (normally, there would be an array there) makes it clear that this is an external reference dictionary. We could specify a reference digest in the tag as well:

Tag 6([rump, Tag 6([digest-alg, digest-bytes, dictionary-id])])

I’m not sure this is the right approach, but I like that it keeps Tag 6 information in Tag 6

>
>   cabo> There are two aspects here:
>   cabo> — how do we make sure the external dictionary cannot be surreptitiously
>   cabo> exchanged by an attacker
>
>> This requires some sort of security mechanism. Using a COSE feature
>> that includes additional data is not ideal in SUIT because we support
>> COSE_Sign, COSE_Sign1, COSE_MAC, or COSE_MAC0, or any combination
>> thereof. This would mean that a COSE feature that includes extra data
>> would be duplicated for as many COSE objects as are included. Of
>> course, that’s not particularly relevant if the list of COSE objects is
>> also using packed CBOR, so maybe it’s fine.
>
>> Including a dictionary reference as AAD seems fine to me. In the SUIT
>> case, I think I would make it more explicit because we need to identify
>> which external dictionary to digest.
>
>   cabo> — how do we make sure there is an unambiguous
>   cabo> way to integrate the external dictionary/-ies into the prefix and sharing tables?
>
>> We need to (logically) concatenate the dictionaries together. The question is: which order?
>
>> From a pull parser perspective, I think I would suggest a stack-based model:
>> - Each dictionary is an element in a singly linked list.
>> - When you encounter a new dictionary, you push it onto the head of the list
>> - When you finish a rump element, you pop the dictionary associated
>> with it from the head of the list.
>
>> - When you find a dictionary reference in the rump, you traverse the
>> dictionary list, starting at the most recent.
>
>> - When you find a dictionary reference in a dictionary element, you
>> traverse the dictionary list, starting at the current dictionary.
>
> Implying that dictionaries can be created that are self-referential, and can
> blow up to infinite data streams :-)

As above, the original specification prohibits loops, but leaves the implementation up to the reader.

>
> Unless you mean that dictionaries should be sorted so that they always (can only)
> reference forward, and you can start at the current location in the current
> dictionary.

Possibly, but I’m not sure that’s universally advantageous. Remember that we want high reference frequency items to be at the start. Suppose that I have the prefixes [“https://“, “www.”, “files.”, “domain.com”]. Clearly, I want to be able to compose these in one of two ways:

https://www.domain.com
https://files.domain.com

Only these two prefixes will appear in my object, the others will not, which renders their compression less important. I would expect something like:

[[Tag 225(simple(0)), Tag 226(simple(0), Tag 227(“www.”), Tag 227(“files”), “https://“], “domain.com"]

Note that the sorting is the opposite of what’s implied.

But what if “https://" is used extensively? Then we need to change our sort order so that it can be referenced with Tag 6().

I think we need to be very clear about what’s allowed because otherwise, there will be a lot of varied implementations with varied limitations.

>> It has several disadvantages:
>> - References have inconsistent meanings (Tag 6 (1) doesn’t mean the
>> same dictionary entry everywhere. It points to different dictionaries
>> in different places)
>
>> - The stack model requires some kind of allocation strategy to keep
>> track of the dictionaries.
>
> It's a stack of pointers.  It can point at the in-band dictionary which can
> be processed by a pull-parser.  Or at an out-of-band dictionary which is
> probably in "ROM" in some convenient format (probably CBOR map)

Indeed. Not too bad, I think.

>
>> - The compressor has to be aware of the dictionaries of packed CBOR
>> objects it traverses in order to pack anything that appears within an
>> already packed CBOR object.
>
> In the SUIT case, the compressor is "cloud" :-)

Yup. Let’s not make things hard for constrained nodes because it’s easier for unconstrained ones.

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.