Re: [Suit] Parameters and Commands

Brendan Moran <Brendan.Moran@arm.com> Mon, 02 March 2020 15:40 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 1832D3A093D for <suit@ietfa.amsl.com>; Mon, 2 Mar 2020 07:40:42 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.898
X-Spam-Level:
X-Spam-Status: No, score=-1.898 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=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=jro93IsG; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.b=jro93IsG
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 0tHmzLf85M2w for <suit@ietfa.amsl.com>; Mon, 2 Mar 2020 07:40:39 -0800 (PST)
Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80058.outbound.protection.outlook.com [40.107.8.58]) (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 9BFCF3A093A for <suit@ietf.org>; Mon, 2 Mar 2020 07:40:38 -0800 (PST)
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=xaXc0AejFba5ey59pIyB2bJ08GbarRlh/7ic6gfCduY=; b=jro93IsG3e96ehm5Tto5L+EiFljrNce3WjvCV3GbCF6AehDLvh1fZZgV1p75BudGqzeFrIxRIduuNN81JbeQmpMngoOL6ihfMpuZx8tWWezGkKTv7UP890Zj7RPJqExe+pb0Os8137PqCRfgqbNQfXK9NinmjRS/BwNOKBb7sd0=
Received: from VI1PR0802CA0022.eurprd08.prod.outlook.com (2603:10a6:800:aa::32) by DBBPR08MB4330.eurprd08.prod.outlook.com (2603:10a6:10:c3::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2772.18; Mon, 2 Mar 2020 15:40:34 +0000
Received: from AM5EUR03FT020.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e08::207) by VI1PR0802CA0022.outlook.office365.com (2603:10a6:800:aa::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2772.16 via Frontend Transport; Mon, 2 Mar 2020 15:40:34 +0000
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 AM5EUR03FT020.mail.protection.outlook.com (10.152.16.116) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2772.15 via Frontend Transport; Mon, 2 Mar 2020 15:40:34 +0000
Received: ("Tessian outbound 1f9bda537fdc:v42"); Mon, 02 Mar 2020 15:40:33 +0000
X-CheckRecipientChecked: true
X-CR-MTA-CID: 469e83908b1d5dee
X-CR-MTA-TID: 64aa7808
Received: from bfd1c6068604.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 30662B41-C91C-4ED9-A102-FFD625BC87D6.1; Mon, 02 Mar 2020 15:40:28 +0000
Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id bfd1c6068604.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 02 Mar 2020 15:40:28 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lcwKH+BSoCgvQkWr3os2Qc32Z42OTRwQKoHjNX/KIAP+dqJlUiW+9qTQpsl5iCXWOUK1XMqVopU91cgfSFuY04EHv18WGTF2AoQpgHInpCRGtaSc1j340gUPa1ACkvkYxmH+M8wy4EL4KghiG+XcoDqlLi8gPYgRNLgbiRE5wa9NG7mNgNfEHFKsdyJfvCo714Gv3cZlAFZSkvu6lGD4520rQMESZcuwOgj72BZbtNTsskP5zx+nHDMkZZMGxtbnnTBxbDBA2Mvb5XN1kJmcMjYhSPHuNItkbfzNxEKsVLG/UkZ41Mcuqwz6tcK5sXtqTFUgPNC2ZQgJXEGBAK5JTQ==
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=xaXc0AejFba5ey59pIyB2bJ08GbarRlh/7ic6gfCduY=; b=nXKbv318s85E18sTiqJ6Mu/n6ZzGZ91A0AfXs5b7PWXN0ezVz7R28RsqvE7cV/n30DJue69oC16olru7I46FTQphcs/CN+/4spGENEIRYgqSVcz1L8XDd9Klhq2/IFc5+Cxtqj5j8I7ELyVUQFVhbKg9X+duA4Fr7uJTSb/djyhglHLIoe7+VmNGKL2no+OTL9KFdRM2fMRKwkv6DRyvboIFvguEHMjtBjHWMkYaXFcaKKpTfJztHt/OI+nODd203/NX12xcr+wxSvcR4DOYyZIar9zBy3CQNpaofs7EvSUzJqk0Sfs0ZxqbsNiNV0xX3w8T82zVswBHG/IPkwXVig==
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=xaXc0AejFba5ey59pIyB2bJ08GbarRlh/7ic6gfCduY=; b=jro93IsG3e96ehm5Tto5L+EiFljrNce3WjvCV3GbCF6AehDLvh1fZZgV1p75BudGqzeFrIxRIduuNN81JbeQmpMngoOL6ihfMpuZx8tWWezGkKTv7UP890Zj7RPJqExe+pb0Os8137PqCRfgqbNQfXK9NinmjRS/BwNOKBb7sd0=
Received: from AM6PR08MB4738.eurprd08.prod.outlook.com (10.255.99.138) by AM6PR08MB3768.eurprd08.prod.outlook.com (20.178.91.221) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2772.14; Mon, 2 Mar 2020 15:40:26 +0000
Received: from AM6PR08MB4738.eurprd08.prod.outlook.com ([fe80::7960:8949:a754:4288]) by AM6PR08MB4738.eurprd08.prod.outlook.com ([fe80::7960:8949:a754:4288%7]) with mapi id 15.20.2772.019; Mon, 2 Mar 2020 15:40:25 +0000
From: Brendan Moran <Brendan.Moran@arm.com>
To: Koen Zandberg <koen.zandberg@inria.fr>
CC: "suit@ietf.org" <suit@ietf.org>
Thread-Topic: [Suit] Parameters and Commands
Thread-Index: AQHV7XQQ5gRwvIJ0lUyjBRqJJXWLg6gwsM2AgATGE4A=
Date: Mon, 02 Mar 2020 15:40:25 +0000
Message-ID: <70A85240-AF15-4F8C-AC18-F10AECCAC989@arm.com>
References: <27913A6B-F42C-4AA9-8A7A-64B1D546C13C@arm.com> <cd1d3e93-b094-e274-c07c-c400b9475b16@inria.fr>
In-Reply-To: <cd1d3e93-b094-e274-c07c-c400b9475b16@inria.fr>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-mailer: Apple Mail (2.3608.60.0.2.5)
Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Brendan.Moran@arm.com;
x-originating-ip: [217.140.106.49]
x-ms-publictraffictype: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: 941696c2-d953-4df3-5625-08d7bec00c46
X-MS-TrafficTypeDiagnostic: AM6PR08MB3768:|DBBPR08MB4330:
X-Microsoft-Antispam-PRVS: <DBBPR08MB43301545AC210F7B408E237DEAE70@DBBPR08MB4330.eurprd08.prod.outlook.com>
x-checkrecipientrouted: true
nodisclaimer: true
x-ms-oob-tlc-oobclassifiers: OLM:10000;OLM:10000;
x-forefront-prvs: 033054F29A
X-Forefront-Antispam-Report-Untrusted: SFV:NSPM; SFS:(10009020)(4636009)(39860400002)(346002)(376002)(366004)(136003)(396003)(199004)(189003)(66476007)(8676002)(33656002)(66446008)(64756008)(81156014)(66556008)(316002)(8936002)(966005)(91956017)(81166006)(66946007)(76116006)(26005)(186003)(6512007)(6916009)(53546011)(2616005)(4326008)(478600001)(36756003)(71200400001)(6486002)(86362001)(2906002)(6506007)(5660300002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM6PR08MB3768; H:AM6PR08MB4738.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1;
received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts)
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam-Untrusted: BCL:0;
X-Microsoft-Antispam-Message-Info-Original: yMTumUn02kVnwY12MXPy3WIUmxLfnDI/QrikjKsio8DuHbktE7ilW8lmYPe0B2YAzY9RYlrtUo7u4DfCo0Dx4p/1pJ6hoIA/iod38TNU5h21VjJhxadSs6APRWTTyR5ahC0xSvccnJhcHZo5tIx7Uv4zVF/xkxyiTEWJk4zCE6ysFfk3UX8uftV2aRbLg71mmkayIzZx3BqlqT/P4IwX7SnzkaPN3635Hgj2PuTScO1QYulDEKA//aCa17FWVYlRvPto3rztbtNcTN7tYKHf8CqDd+3p0qbh1TyRd9g43gE3qza3GhDtXSp68A9Bw5muDo8UB6vGu2hrnN74BYrB5Q+rw52ghJlOfTRmWF/T7Z/DNZay+tm0xqJ8nenRpPN60JR1CLiYta32/5y1xt0v+Hg1qvDFxnEvVYh8JT+5xiKJ2of4DfcI84sEriuw02gLRUPqy28Syko+BOKHriwqLWo1G6bu6/D8aGwexHk52rjki46YYmDJdUdBIVAcr/SdCciAxk//4pCsFKeMxnSsnQ==
x-ms-exchange-antispam-messagedata: 7fugivvQFwu8k6gWAaOVB2PiBrSdvhR1uMwpVfhvbKVbyZRRCrZ/N5qFZ+1jhA29sOMUDkR8WVrowqf0MIRnCcj8zU0lNsavxCWDfO3aSFTLeFXs8vgNuTC8VeQNtsP7VO25IS3nW5dC1kog+fd3ng==
x-ms-exchange-transport-forked: True
Content-Type: multipart/alternative; boundary="_000_70A85240AF154F8CAC18F10AECCAC989armcom_"
MIME-Version: 1.0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB3768
Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Brendan.Moran@arm.com;
X-EOPAttributedMessage: 0
X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT020.eop-EUR03.prod.protection.outlook.com
X-Forefront-Antispam-Report: CIP:63.35.35.123; IPV:CAL; SCL:-1; CTRY:IE; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(396003)(136003)(376002)(39860400002)(346002)(189003)(199004)(81166006)(81156014)(30864003)(8676002)(336012)(33964004)(4326008)(86362001)(186003)(36906005)(6486002)(356004)(45080400002)(316002)(36756003)(5660300002)(26005)(2906002)(478600001)(6862004)(53546011)(6506007)(33656002)(70206006)(6512007)(2616005)(70586007)(26826003)(8936002)(966005); DIR:OUT; SFP:1101; SCL:1; SRVR:DBBPR08MB4330; H:64aa7808-outbound-1.mta.getcheckrecipient.com; FPR:; SPF:Pass; LANG:en; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; MX:1; A:1;
X-MS-Office365-Filtering-Correlation-Id-Prvs: ea6ff766-45d4-4135-0a72-08d7bec00732
X-Forefront-PRVS: 033054F29A
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: jGk0EQiWgwPBpyThsGcqSiNmypZRm4QMaFYRvMNIljjVfhv3SFopoDSdtWN5dFFemqcDT2G53uL43mMOhE7oruMV2T2nION0qj10w2fGhDbvFy81xGFKAv0h52SmOLCOw5EdkJUBC6P6wwmStgxGdgBEvRMkHMqlWbCaPNNPaCa7c+1owdSnHSrUWvfX9KfC2ILhyQi1mxyvDvUELXqA22Pw9BFq39fjXScXyYRBiw1HqKAk7BaFHJwHUcMjgxGaPbwIGK0HcCpJUnBNj/croPZS8NOjwy69/92Jjr0W8XrU6zrwhToaX4YwT/Mq4pF3YTB1fedQlogntlDNm1O7EjlvETJqSfSFh09cHzU85nJvCdg1Fv2685SzIZc5GsS9e2rdKmqbFTdQ4Ml4Wk5agw9YnGHRt3+KJ0KpvTCRI38ekQpGJ6VZaFdRWTVj+kKxeJx2ARHgp+zPZIbc2Jc95pGgkip2WIPpy9n+/WRkv9KuFR5tYu/GgHgiFBg5CmbvvJx59Wp2USP9VMJyGqoSow==
X-OriginatorOrg: arm.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Mar 2020 15:40:34.4278 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 941696c2-d953-4df3-5625-08d7bec00c46
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-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB4330
Archived-At: <https://mailarchive.ietf.org/arch/msg/suit/q3AwifEXoIU1Q3awyv3iNA0_NZQ>
Subject: Re: [Suit] Parameters and Commands
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: Mon, 02 Mar 2020 15:40:42 -0000

Hi Koen,

I haven’t heard any complaints about harmonising condition handling to parameter-only, so I will take that as a consensus.

You’re absolutely right about my plan for measurement encoding. I anticipate that there are only 3 possible values for the measurement policy:

  1.  Do not record measurement (Leave as null)
  2.  Record measurement on success (typical)
  3.  Always record measurement (Full trace)

I’m open to suggestions for encoding of 2 and 3. I would ideally like to use simple values, rather than integers here, however that leaves only:

  *   False
  *   True
  *   Undefined

This doesn’t really seem to map into reporting policy well. The only semi-logical approach with simple values I can see is:
Should_report = report_arg || condition_result

This maps “record measurement on success” to “False" and "always record” to “True”

This seems quite opaque, so I think using integers would be a better choice. This has the advantage that we could cover more policies that we haven’t thought of yet without change to the encoding.


I see what you mean about trading one inconsistency for another. I’m not sure if it’s a blocker for this approach or not. If we decide to separate reporting policy from SUIT, then there are a few approaches we could use to prune the NULLs, but then I’m not sure how to tie RATS and SUIT together.

Effectively my idea is to enable reporting of any measurements that are done (conditions). That’s almost enough, however there’s one point that is missing from this: Run should be measurable since an argument could be passed to Run—c.f. Linux kernel command line, or argc/argv to main(). I’ve already floated the idea of making Run imply an image condition. This would justify the reporting of a measurement for Run. I could see an argument for making the same requirement for Fetch and Copy, since they should probably be followed immediately by an image condition anyway. All parameters are either invariant or set based on conditions, so with a copy of the manifest, you can determine what they were.


What would you think of:

  1.  All conditions take a measurement policy argument.
  2.  Run implies an image pre-condition before the activation
  3.  Fetch implies an image post-condition
  4.  Copy implies an image post-condition
  5.  Run, Fetch, Copy take a measurement policy argument.

That seems fairly consistent.

Brendan


On 28 Feb 2020, at 14:46, Koen Zandberg <koen.zandberg@inria.fr<mailto:koen.zandberg@inria.fr>> wrote:

Hi Brendan,

I also support the idea of aligning all conditionals to use parameters. From an implementation point of view I see a small downside in that the parameter location has to be stored to be retrieved later during the parsing of the conditional (this matches with your argument no. 2). For the low number of parameters used this increase is probably negligible and I don't expect any serious concerns here.

Concerning encoding the attestation policy within the unused arguments, I have slightly more doubts. I assume that this would replace all nil arguments in the commands with the attestation policy (a single cbor uint?). If this is the case I don't have any strong concerns, but it looks a bit like swapping one inconsistency for another, mixing arguments and policy specifications.

I will implement the changes you've proposed here in our current ietf-v3 implementation (https://github.com/RIOT-OS/RIOT/pull/13486<https://github.com/RIOT-OS/RIOT/pull/13486)>)<https://github.com/RIOT-OS/RIOT/pull/13486)> to get some hard numbers on the impact of this change, and get back to you on the list.

Cheers

On 27/02/2020 14.44, Brendan Moran wrote:
During the hackathon, I discovered that my examples and my manifest generator tool are generating incorrect sequences for testing vendor ID and class ID.

There are currently two ways to handle commands (conditions or directives):

  1.  The command consumes an argument (that is the value that follows the command's key)
  2.  The command consumes a parameter (that is a value set by the “set-parameters” or “override-parameters” commands)

This duality led to my error in setting up the Vendor and Class ID tests in the demo code.

The reasons for each mode are:

  1.  Command consumes an argument
     *   Encoding is more compact (encoding via parameters takes 2-3 more bytes, depending on the situation).
     *   Less storage needed (the argument is consumed immediately)
     *   Does not require matching parameter key
     *   More explicit association between command and argument
  2.  Command consumes a parameter
     *   More compact when the parameter is used more than once (e.g. image digest)
     *   Allows override by dependencies, when set-parameters is used


We’ve talked before about “only one way to do things” and I think I can see a path to making that the case here. Here is my proposal:

Commands consuming a parameter are absolutely necessary due to override and deduplication concerns. Conditions testing against an argument are convenient and more explicit. Therefore, harmonising around a single option probably means that we have to select parameters instead of arguments:


  1.  Eliminate arguments from most commands (see below)
  2.  Match most parameter keys with command keys to simplify the association, make “arguments” more explicit

Only these commands require arguments, since they either deal with setting parameters, setting parameter scope, or with flow control, which requires nested command sequences.


  *   Set Component Index
  *   Set Dependency Index
  *   Set Parameters
  *   Override Parameters
  *   Try-each
  *   Run Sequence
  *   For Each Component

This leaves the majority of commands with NUL arguments. This is actually quite useful for another feature.

We have also discussed the possibility of defining attestation policy within SUIT. This would mean that we need flags to indicate to the parser which measurements should be reported. For example, a Vendor ID, an image digest, or a component offset might need to be reported in the attestation report. Each of these is checked by a condition. Each of those conditions will consume a parameter under this model. Then, the argument can indicate: report a measurement, do not report a measurement, report a measurement only if comparison is successful, or perhaps other attestation-related policies. Bear in mind that attesting a failed condition may be helpful for attesting why a manifest has failed, as we discussed in the hackathon and virtual interim meeting.

If we are making the majority of commands are using parameters instead of arguments, this becomes trivial: the arguments are replaced with attestation policy arguments. This allows us to tell the attestation engine explicitly what to report from the manifest, which allows secure, dynamically updatable attestation policy.

This doesn’t introduce a substantial change to either the parser or the format. If there is some appetite for simplifying the correlation between commands and parameters, I think it might make sense to spend some effort aligning parameter keys with command keys. This could simplify the parser by allowing a generic parameter lookup to be done in one place, rather than by each handler.

Best Regards,
Brendan
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.


_______________________________________________
Suit mailing list
Suit@ietf.org<mailto:Suit@ietf.org>
https://www.ietf.org/mailman/listinfo/suit


_______________________________________________
Suit mailing list
Suit@ietf.org<mailto:Suit@ietf.org>
https://www.ietf.org/mailman/listinfo/suit

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.