Re: [Suit] Some proposals for updates to the SUIT manifest specification

Brendan Moran <Brendan.Moran@arm.com> Tue, 30 June 2020 13:57 UTC

Return-Path: <Brendan.Moran@arm.com>
X-Original-To: suit@ietfa.amsl.com
Delivered-To: suit@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 4B3DA3A0895 for <suit@ietfa.amsl.com>; Tue, 30 Jun 2020 06:57:18 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.899
X-Spam-Level:
X-Spam-Status: No, score=-1.899 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, 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=TaZBcXdG; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.b=TaZBcXdG
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 8liHA2mKKdl0 for <suit@ietfa.amsl.com>; Tue, 30 Jun 2020 06:57:15 -0700 (PDT)
Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-eopbgr140055.outbound.protection.outlook.com [40.107.14.55]) (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 7CDA63A0880 for <suit@ietf.org>; Tue, 30 Jun 2020 06:57:13 -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=jzkcSUxX3qmoUNgXpQ8PMPkshbBnrG/Tp2uEYOmAQtY=; b=TaZBcXdGEvyGZ3ZhsIEJ7EykuGwo4vEQm8iPgc6OP9+n1ub8FtmSVpUFRTuLQTl/NlDs8B9k9cXIkdwXcu7mz27qqupdNE6VFp3+LinLG4rlrgQHT3TBWtdqQZadpGuhHAq/90fwEfiNw2v3jO/Edxqh3v3VIhO8QB4UBGOhvvY=
Received: from DB6PR07CA0080.eurprd07.prod.outlook.com (2603:10a6:6:2b::18) by DB8PR08MB5052.eurprd08.prod.outlook.com (2603:10a6:10:e8::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.21; Tue, 30 Jun 2020 13:57:11 +0000
Received: from DB5EUR03FT025.eop-EUR03.prod.protection.outlook.com (2603:10a6:6:2b:cafe::8) by DB6PR07CA0080.outlook.office365.com (2603:10a6:6:2b::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3153.12 via Frontend Transport; Tue, 30 Jun 2020 13:57:11 +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 DB5EUR03FT025.mail.protection.outlook.com (10.152.20.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.20 via Frontend Transport; Tue, 30 Jun 2020 13:57:11 +0000
Received: ("Tessian outbound fcfbba629a49:v60"); Tue, 30 Jun 2020 13:57:11 +0000
X-CheckRecipientChecked: true
X-CR-MTA-CID: cc1c4a7815d6f71b
X-CR-MTA-TID: 64aa7808
Received: from b190475a2d3c.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id F16BB4A2-B558-41A0-874D-5835791ABEB0.1; Tue, 30 Jun 2020 13:57:04 +0000
Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id b190475a2d3c.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 30 Jun 2020 13:57:04 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Sgl99cbGuAJd/JSJmNXB2sPs7fdIGE+/gjU7UObQXOdqWrMrpLzpnGG493s7FSBD/a68VOqA1w9BF1ojXWtDAenftlaefhhbrKOIdloowGAZ6Gym8zIx4w6j/igTKEyZ7SifbtXrj+lIPe/jKNnp4ek1oCYgehGGGf/v4mjjMf6CH/T/eLw2x7CekJupTjGgwZYDBX8wVDQgTCswACyp9zcEtGH7c7vHGrG0aYhg+8iVS1kxyvpQyCArLmcQmZiHzFw+uAtiWawQ4AWMw9eJnlqK37u/1teUpXQpVj0iBu1Y1AoTTlwqcV/9OTU/RVabYAcPWlOAwjyiltGb3oPU4g==
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=jzkcSUxX3qmoUNgXpQ8PMPkshbBnrG/Tp2uEYOmAQtY=; b=ArEZLUdPlrRaVK9VlDodfgmck9Uk0Tn0kO9+JPM+35/KZXi9VhUJQhmhTzjMvIGoqagwHq998ZVsMWj3AgUZhcxt64Q3Qg/xXJsar7MNzHeh6WU8uFxmEx36HmD6knyEnnsigAI0YF66+YF3FQoyV3uBumdnfubtW9v7du9yDUmWWRfHLjPXQEl8VHZIloPlDStfUYUtj2RFbRWZRax6uTezLgGIMhqOdaWbLkS0v3FyyG7pokI+UyziBCortkTb1g1T1Y1SZI+PYNUI3WKlEKURjG/Z4mmzdC3H2OB2gw4keQuRZZBhlDKEgkolbJf5HtSWuMuE9wn3UUA/3MufsA==
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=jzkcSUxX3qmoUNgXpQ8PMPkshbBnrG/Tp2uEYOmAQtY=; b=TaZBcXdGEvyGZ3ZhsIEJ7EykuGwo4vEQm8iPgc6OP9+n1ub8FtmSVpUFRTuLQTl/NlDs8B9k9cXIkdwXcu7mz27qqupdNE6VFp3+LinLG4rlrgQHT3TBWtdqQZadpGuhHAq/90fwEfiNw2v3jO/Edxqh3v3VIhO8QB4UBGOhvvY=
Received: from AM6PR08MB4738.eurprd08.prod.outlook.com (2603:10a6:20b:cf::10) by AM6PR08MB4657.eurprd08.prod.outlook.com (2603:10a6:20b:cf::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.23; Tue, 30 Jun 2020 13:57:02 +0000
Received: from AM6PR08MB4738.eurprd08.prod.outlook.com ([fe80::208a:431d:b171:9615]) by AM6PR08MB4738.eurprd08.prod.outlook.com ([fe80::208a:431d:b171:9615%3]) with mapi id 15.20.3131.028; Tue, 30 Jun 2020 13:57:02 +0000
From: Brendan Moran <Brendan.Moran@arm.com>
To: Koen Zandberg <koen.zandberg@inria.fr>
CC: "henk.birkholz@sit.fraunhofer.de" <henk.birkholz@sit.fraunhofer.de>, Hannes Tschofenig <Hannes.Tschofenig@arm.com>, suit <suit@ietf.org>
Thread-Topic: [Suit] Some proposals for updates to the SUIT manifest specification
Thread-Index: AQHWShqbAcCcNEpV4UuJm1DyidrIlKjxAf6AgAAbb4CAABsFgA==
Date: Tue, 30 Jun 2020 13:57:02 +0000
Message-ID: <EBCD4730-4113-4F45-B498-3232165125E3@arm.com>
References: <AB1A6457-665A-44CE-8A62-AFB8100A1B36@arm.com> <E425F5F5-3FCF-4ACF-AA57-A4DDAD7C4261@arm.com> <a9d655c8-8119-772d-5eec-9a25984b1520@inria.fr>
In-Reply-To: <a9d655c8-8119-772d-5eec-9a25984b1520@inria.fr>
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: inria.fr; dkim=none (message not signed) header.d=none;inria.fr; 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: e5915e85-3882-460d-7c12-08d81cfd7c74
x-ms-traffictypediagnostic: AM6PR08MB4657:|DB8PR08MB5052:
x-ms-exchange-transport-forked: True
X-Microsoft-Antispam-PRVS: <DB8PR08MB5052D0E980782EE7B77730C1EA6F0@DB8PR08MB5052.eurprd08.prod.outlook.com>
x-checkrecipientrouted: true
nodisclaimer: true
x-ms-oob-tlc-oobclassifiers: OLM:10000;OLM:10000;
x-forefront-prvs: 0450A714CB
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam-Untrusted: BCL:0;
X-Microsoft-Antispam-Message-Info-Original: Ooc/xuXN3gDYgSC71/RAtZMuCfgwAB1vPIJ/4kRniwIbNUWGvGSTJ+dyhMLfQSKlVcHfqZhFS4yQLIolAwtIGMu10effchMojrHXnzfPJAVvGbleICG/IeSco56TqjU2oJgwn8xnYs+CSp34I7L5ulPpPARZgwzXGaCT2Ws4vjOHb4qWh16Gwq71U0dEa6SZDP+PmwGCI3WUkQ+UZbS90hSy5lXvq8o5ZrX8IKQ3A12bIlbm1I0eRakG56zjCsqoj1rhk1hhS5OgqwOWBUf6W5Sb9v9FC8GtjkOYizCxGwdGJip8DP0kW7qxJX2QRxbZ6zY6KrRAALz3hWou8ehhyQ==
X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM6PR08MB4738.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(366004)(498600001)(2616005)(5660300002)(6486002)(8936002)(8676002)(53546011)(26005)(83380400001)(186003)(4326008)(6506007)(76116006)(54906003)(2906002)(15650500001)(36756003)(86362001)(91956017)(66446008)(64756008)(66556008)(71200400001)(66946007)(66476007)(6916009)(6512007)(33656002); DIR:OUT; SFP:1101;
x-ms-exchange-antispam-messagedata: 8GUvQMYyqnvoBA13EOEWxfmWddN7QAyEP4u5Wxvwq2XGIs+XiWhHKqz477qLq0IFsRh9hlsNLzD0LIJiK1LiuiYchfnnDlIQjt13CsKACWyBX0kKQ2KOcd/c7cPYjdpdn0+R3xGZzWQ8rNlLXaBtPgzbtxd644PLnBZD8WMp5lPQh1gLunV5n/VxzDzmAn1LdHjGNuAS3KuiTofQlA7tNZKbqZB43VMjll11/2nY92lg7UexWIHSBaBJNkbOv8e9Skymb0HXG8bHmJ/64QMMAOyuOmpcobtxdt8tnm2STyOWoP6KMwZqKYW84AOg1FGdBh5WquMJ+S1sSykQiONPFWRQWuTDAJNBQoBSJMzFODF4YQLXsX97QsOlZEDyeXa6+apKZAcFL4Ki4PptoADKqYxxvCIXrX32pv/ZP7HJmpM6noqyINOor0lU6sS6CIIEXCW+RLStVqDVYQZNOApe0udRatPk1eow/V9JpzagZNQ=
Content-Type: multipart/alternative; boundary="_000_EBCD473041134F45B4983232165125E3armcom_"
MIME-Version: 1.0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB4657
Original-Authentication-Results: inria.fr; dkim=none (message not signed) header.d=none;inria.fr; dmarc=none action=none header.from=arm.com;
X-EOPAttributedMessage: 0
X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT025.eop-EUR03.prod.protection.outlook.com
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)(46966005)(498600001)(70206006)(70586007)(6512007)(2616005)(82310400002)(5660300002)(53546011)(47076004)(26005)(6506007)(45080400002)(81166007)(6486002)(15650500001)(356005)(336012)(186003)(33964004)(4326008)(54906003)(33656002)(8936002)(83380400001)(30864003)(6862004)(36756003)(86362001)(8676002)(2906002); DIR:OUT; SFP:1101;
X-MS-Office365-Filtering-Correlation-Id-Prvs: 775e871c-7b8d-43d4-afdd-08d81cfd7751
X-Forefront-PRVS: 0450A714CB
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: vCbuHGpY5JXKLDNHC6se3Y+6icVP/UWzT+B5km1Es/79BuOhpr4EsHCVwM5NTwASYGwfb313fdCKJ51Zo6PIpb+eRQPlCPfnYPXEQVTLlnBYhAUrunHnn1BH5YtSiJT/8aMHOZnEUJK6BXHZ+tG9+z9RxPor/PpF/D6U09jaMHIA6iZ9LoncssXcWmSCG/HQ4QW5Ena2ytlsnCNovVnEXze+rWhFI9sBWGz5ZvPFnEss9UPzAeivDKgD2QTcr08GSQ1bI+QwsVBh5EQVwhcNi76ps/Jndf4BwaD0O2JQkB7vgEbn6l9cUWXVAlUCgI5+aUyC6Db3LwkTvV1hinAwdAIkElnP9Dk1ypNZvM3ucql0BQtp35qYUT30TBg2Z+qSCdA3YZKL8gIQWPD0pG1Qhg==
X-OriginatorOrg: arm.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2020 13:57:11.3157 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: e5915e85-3882-460d-7c12-08d81cfd7c74
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: DB5EUR03FT025.eop-EUR03.prod.protection.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR08MB5052
Archived-At: <https://mailarchive.ietf.org/arch/msg/suit/MVM6aYPdWdDOtZ6pRRJUQ5hjqLI>
Subject: Re: [Suit] Some proposals for updates to the SUIT manifest specification
X-BeenThere: suit@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Software Updates for Internet of Things <suit.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/suit>, <mailto:suit-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/suit/>
List-Post: <mailto:suit@ietf.org>
List-Help: <mailto:suit-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/suit>, <mailto:suit-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 30 Jun 2020 13:57:18 -0000

Hi Koen,

Thanks for taking time to assess the impact of these proposals. I haven’t dealt with the text section yet either!

More comments inline...

Best Regards,
Brendan

On 30 Jun 2020, at 13:20, Koen Zandberg <koen.zandberg@inria.fr<mailto:koen.zandberg@inria.fr>> wrote:

On 24 Jun 2020, at 12:28, Brendan Moran <Brendan.Moran@arm.com<mailto:Brendan.Moran@arm.com>> wrote:


Here is our proposal to correct the mismatch between the manifest and the text section:

SUIT_Text_Map = {
* SUIT_Component_Identifier => { SUIT_Text_Component_Keys },
SUIT_Text_Keys,
}
This will allow any set of components to be described.

If I understand correctly, this creates a map with mixed bstr/integer
keys. I agree with what you already mentioned, it's not intended for
constrained nodes, this should be fine.

Yes, the idea here was that it’s problematic to rely on the order being the same between the components listed in common and components listed in Text. Because of this, we can list them by component identifier. We could also use an array and have a key for the component ID, but this breaks the semantic of (int => text) pairs. Henk suggested that we could just use the component ID itself to act as the key for the map. This means that we don’t have to add additional hierarchy for, e.g. a list of components.

The other option would be a map of components with component index as key. This would produce less duplication of component IDs (though I don’t think we care about that) and fit the semantics used elsewhere.

I’m ambivalent about which of these to use, but I think we need one of the two. For clarity, I think we should choose one of the two following structures:

Option 1:
SUIT_Text_Map = {
* SUIT_Component_Identifier => { SUIT_Text_Component_Keys },
SUIT_Text_Keys,
}

Option 2:
SUIT_Text_Map = {
  ? suit-text-components => { * (uint => { SUIT_Text_Component_Keys } ) },
  SUIT_Text_Keys,
}

The tree traversals for extracting a list of components are much simpler in Option 2, but it introduces a non-text value for a numeric key, which I don’t like. I’m split. Maybe there’s a way to make one of these two cleaner.

To explain what I don’t like about Option 1, imagine that you extract the text section into a hash map. If you want to render a list of affected components, you have to find them all in the map first. That means you need to get a list of all keys and test the type of each one to see if it’s numeric (text) or an array of bstr (Component ID). This means that even finding out how many components there are is O(n). With the Option 2, finding all the components is O(1).

To be clear, I’m not saying that the processing complexity is a big concern to me, I’m just saying it’s a good illustration of what I dislike about Option 1. I’m not saying that me mildly disliking this is a deal-breaker. I’m just wondering if we can come up with something better.

Input welcome!

Remaining question from my
side, is `suit-text-version-dependencies` the human readable form of
`suit-parameter-version`? Noticing that the description of
`suit-text-version-dependencies` mentions that it is a list, does it
require a similar treatment as the component text?

Yes, I believe that’s correct. It should also be a list. Actually, I think that might be easier to solve. I would move the suit-text-version-dependencies key out of the manifest text, into component text. Now, components version dependencies can just be present in the component list, and the suit-text-version-dependencies does not need to be a list.


The second point is Dependency Components. This information element was introduced to help distinguish between components that are defined in the current manifest and those that are defined by its dependencies. This is a loose definition, however, and I don’t believe that it fits the current definition of the manifest. I believe we should remove Dependency Components. There are two consequences of this action:
...
No real opinion on this yet. What you say makes sense. Is there an
implementation around supporting multiple components? The parser in RIOT
supports only a single component. If there is no guarantee that the
dependency component information is correct then in my opinion it can be
removed from the spec.

I haven’t seen a multi-component implementation yet. It sounds like we’re all on the same page. I’ll remove the dependency components section.

Finally, I have a question regarding the fields wrapped in byte strings. Are the byte strings necessary? I’d like to hear from those who have implemented the specification. Are the byte strings helpful? Or are they pain points?

...
My opinion on each of the bstrs is:

1) We must keep the bstr wrappers around all envelope elements.
Yes please, this is one of the few places where they really help.
2) I think we should keep the bstr around structured parameters (Arrays/Maps). This is very useful for late parsing of parameters because they do not always live within the extent of the current manifest.
I also strongly agree here. Exactly what you say, allows for
significantly easier iterating over parameters with late parsing.

Sounds like we’re aligned here.

3) I’m not entirely sure we should keep the bstr wrapper around the common block, but I think it’s useful. It always lives within the extent of the current manifest, so overruns will be detected on the first pass by the parser, and the extent of the common block can be recorded prior to the execution of any command sequences.
4) I would not argue against removing the bstr wrappers around command sequences, provided that we register a tag for either the command sequence or the SUIT Digest.

I think the other option is that we could use separate keys for digest and for command sequence. What I don’t like about that option is that it’s not clear what a device should do if both are present and one of the goals of this specification is to eliminate that kind of uncertainty. That being the case, I think I would want a SUIT_Digest tag or a SUIT_Command_Sequence tag. Probably a Command Sequence tag, since that would make the manifest smaller when including digests.

5) I think we could safely remove the bstr wrappers around the elements inside of the common block, including the command sequence. This incurs a negligible execution time overhead when accessing some common elements, but produces manifests that are a few bytes smaller.
I think these last three can also be removed, but I'm not completely
confident yet on this. I think we've discussed this before, any CBOR
structure that is optional to parse by the parser must allow for
skipping it, and skipping a complex structured parameter is relative
costly in CBOR parsers. I think (for now) that anything that must be
parsed doesn't need to be bstring wrapped. This aligns with keeping the
bstr wrappers on the envelope elements, the authentication is handled by
a separate COSE library and can be skipped by the SUIT parser. With late
parameter parsing it is also essential that all parameter values are
simple CBOR structures, which is the case when maps/lists are bstr wrapped.
We would very much appreciate input on each of these three topics. Unless there are strong objections, we will modify the text section as described and remove the Dependency Components list. The status of the bstr wrappers is less clear, so we will wait for feedback.

I'll get back to you on this as soon as I have numbers for the last 3
bstr options.

I look forward to your feedback!


Koen
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.