Intel® Unique Platform ID Usage

ID 758284
Updated 6/16/2022
Version Latest
Public

author-image

By

Intel® Unique Platform ID Overview

The Intel® Unique Platform ID (Intel® UPID) is a globally unique and persistent identity that can be used to identify a platform throughout its lifecycle. The Intel UPID is equipped with an IDevID (Initial Device Identifier) private key that is protected by the Intel® CSME security engine and an IDevID certificate issued by the Intel certificate authority. The certificate adheres to the IEEE 802_1AR 2018 industry standard for IDevID certificates.

The Intel UPID can be used to challenge (and verify) a client endpoint’s identity for various purposes. The Intel UPID IDevID certificate is issued by the Intel® CSME On Die Certificate Authority (Intel® ODCA) infrastructure. The Intel CSME Firmware UPID application provides a host API that allows an application with admin level privileges in the OS or BIOS to challenge the Intel® CSME firmware to obtain a signed proof of the identity of the PC on which the application is executing.

This Intel UPID guide can assist application developers in incorporating use of the Intel UPID attestation in their applications.

Intel UPID Advantages

  • The Intel UPID does not change, and cannot be changed, throughout the device lifecycle.
  • The Intel UPID cannot be spoofed. Its integrity is protected, and it cannot be overwritten.
  • The Intel UPID can be updated when a platform is refurbished.
  • The Intel UPID is attestable by the Intel CSME.

Privacy Controls

The following features are included to satisfy privacy concerns:

  • The user application interface requires OS administrator privileges to access the Intel CSME API that returns the Intel UPID, its IDevID certificate, and the certificate chain, and to access the Intel UPID Attestation API.
  • An Intel CSME API is provided to allow the BIOS to control OS access to the Intel UPID APIs.
  • The Intel UPID feature state controls access to the Intel UPID APIs. When the Intel UPID feature state is disabled, access to Intel UPID APIs that read the UPID or attest the UPID is blocked.

Intel UPID Usage Examples

Following are some examples of uses for the Intel UPID IDevID:

  • Verifying a device’s identity when it is returned by the customer. The UPID_PLATFORM_ID_GET command can be used to read the device’s Intel UPID in the factory before the device is shipped. When a customer returns the device for servicing, or when a customer attempts to access a service specific to the device, the same APIs can be used to verify that the same device is being returned or is accessing the service.
  • Using the Intel UPID when onboarding a device. The OEM can deliver a list of the device Intel UPIDs to the purchaser of the devices (for example, to an IT department that has purchased many devices). The purchaser can then use this list when an end-user attempts to onboard the device, to ensure that the device being onboarded is indeed the same one that the customer ordered.
  • Disabling Intel UPID when it is not needed, to prevent unauthorized tracking of the device by OS-level applications. The OEM can implement a mechanism in the BIOS to prevent the OS from enabling the Intel UPID. The BIOS must enable reading Intel UPID to allow the OS to read it. If the BIOS has not disabled the Intel UPID, software with OS admin privileges can use the UPID_PLATFORM_ID_FEATURE_STATE_SET command to enable it and can read it. It is recommended for the OS to disable Intel UPID (by using the same command UPID_PLATFORM_ID_FEATURE_STATE_SET), so that if in the future the level of privilege needed to read Intel UPID differs from the level required to enable it, the customer has the option of disabling so that applications without Administrator privileges cannot access it.
  • Attesting the device’s Identity as an additional factor for zero-trust access to corporate services and resources. The enterprise can collect the Intel UPIDs of the devices that it owns and can map each Intel UPID to the employee using the device. When a user attempts to access a corporate service or resource, the policy can ensure that the user can access it only from their approved device. To attest the device’s identity, the UPID_OEM_PLATFORM_ID_SIGN command is invoked.

System Requirements

Intel UPID is supported on 11th Generation (Tiger Lake) Intel vPro® or Intel vPro® Essentials devices and later programs.

The availability of the Intel UPID feature depends on the OEM enabling the support in the platform hence it may not be available for all platforms of these generations.

(See Detecting Whether Intel UPID is Supported on the Platform.)

The following table lists the programs that support Intel UPID, and the Intel CSME versions that also support device attestation:

Platform InteI CSME Firmware Versions
Supporting Device Attestation
Tiger Lake 15.0.42.X and later
Eagle Stream 15.20.5.X and later
Alder Lake 16.1.25.X and later
Fish Hawk Falls 16.10.5.X and later
Raptor Lake and later All

 

Intel UPID Structure

Following is the structure of the Intel UPID:

 

Field
Description
Comments
OEM Platform ID 32 bytes. Can optionally be
set by the OEM BIOS before
End of Manufacturing
Stored in Non-Volatile Memory protected by Intel CSME
Truncated SHA256   Truncated SHA256 of Intel CSME ROM On-Die-CA
certificate provisioned to the Intel CSME fuses at Intel factory
RSVRD    
OEM Platform ID Refurbish Counter   Can be incremented by the OEM BIOS when the device
is refurbished. Stored in Intel CSME FPFs
HW Generation Initialized by the
Intel CSME firmware

Identifies the platform generation. Read from
the PCH / SOC. Cannot be changed.

PCH / SOC

Device ID

PCH_FAMILY_TGP_H

Tiger Lake-H PCH
Device ID 0x4380 - 0x43FF.

PCH_FAMILY_EBG

Emmetsburg WS/Server
PCH Device ID 0x4480 - 0x44FF.

PCH_FAMILY_ADP_P

Alder Lake-P PCH
Device ID 0x5180 - 0x51FF.

PCH_FAMILY_ADP_S

Alder Lake-S PCH
Device ID 0x7A80 - 0x7AFF.

PCH_FAMILY_ADP_N

Alder Lake-N PCH
Device ID 0x5480-0x54FF.

PCH_FAMILY_RPP_P

Raptor Lake-P PCH
Device ID Device ID
0x5180 - 0x51FF (same as ADP-P).

PCH_FAMILY_RPP_S

Raptor Lake-S PCH Device ID
0x7A00-0x7A7F.

PCH_FAMILY_MTL_M

Meteor Lake-M/P SOC PCH
Device ID 0x7E00 - 0x7E7F.

PCH_FAMILY_MTL_S

MTL-S PCH (pairs with MTL-S and ARL-S CPUs).
Device ID 0x7F00 - 0x7F7F

OEM ID

The vendor ID allocated by PCI-SIG

Set by the manufacturer in the Intel CSME
Firmware Programable Fuses (FPFs)
before end of manufacturing

Intel CSME On Die CA

During Intel manufacturing, the Intel chipset is provisioned with a Certificate Authority certificate issued by the Intel Key Generation Facility (iKGF). This enables an on-die CA (Intel® ODCA) on the Intel platform to issue certificates for individual Intel CSME applications. The Intel ODCA issues the Intel UPID certificate, enabling Intel UPID Attestation. The Intel UPID certificate is issued following IEEE 802.1AR for an IDevID (initial device identity) certificate.

The following diagrams describe the Intel ODCA infrastructure in the Intel CSME firmware on different platforms.

When Intel UPID is enabled, the certificate includes the Intel UPID in alignment with the 802.1AR defined IDevID Certificate.
The ODCA TLS-Server certificate is used for the provisioning flow.

Certificate Chain for Tiger Lake and Alder Lake Platforms:

Certificate Chain for Tiger Lake and Alder Lake Platforms

Certificate Chain for Raptor Lake and Later Platforms:

 

* Starting from Meteor Lake, the chain no longer includes the PAVP CA certificate. 

The Intel CSME application key generation includes the following:

  • the Intel CSME application’s Security Version Number (SVN)
  • the application’s module ID

The Intel CSME certificate is revoked by Intel iKGF when the application’s SVN is incremented. Intel iKGF publishes the revoked certificates in a CRL (Certificate Revocation List).

Intel UPID IDevID Certificate Attributes

The platform uses the IDevID certificate to attest Intel UPID.

For definitions of the UPID OEM_ID, OEM Platform ID and CSME HW ID, see the table in Intel® UPID Structure above.

The certificate complies with the IEEE 802.1AR IDevID 2018 certificate standard and includes the following attributes:

Field
Value

Subject

X520SerialNumber (OID = 2.5.4.5):

< OEM Platform ID > in Hex char string format. Stored in

protected Intel CSME non-volatile memory

X520OrganizationName (OID = 2.5.4.10)

<OEM_ID> OEM PCIe Vendor ID in Intel CSME fuses

CommonName

For Intel UPID Certificate: ” CSME IDevID OS /BIOS”

subjectAltName

(RFC4108)

(OID = 1.3.6.1.5.5.7.8.4)

HardwareModuleName ::= SEQUENCE {

hwType OBJECT IDENTIFIER

hwSerialNum OCTET STRING

}

hwType OBJECT IDENTIFIER: 2.16.840.1.113741.1.5.3.6.1

indicates that this is an Intel CSME UPID ODCA Hardware ID

hwSerialNum OCTET STRING = the “<CSME HW ID>”

Extended Key Usage

X.509 V3 Extension

2.16.840.1.113741.1.2.4.6 – for BIOS Intel UPID attestation

2.16.840.1.113741.1.2.4.7 – for OS Intel UPID attestation

Intel Brand Identity Extension X.509 V3 Extension

2.16.840.1.113741.1.2.5.1

Structure:

 

 

Qualified Brand and Entitlements: 4 bytes. Each bit represents a different entitlement.

A value of 1 indicates that the entitlement is included.

Field structure:

Bit 0: Intel® Connectivity Performance Suite

Bit 1: Intel vPro® Enterprise Brand

Bit 2: Intel vPro® Essentials Brand

Bit 3: Reserved

Bit 4: Intel® Based PC Brand / For workstation: Intel® Xeon® Based Workstation (when Brand Features Map Table Revision is 19.10.x.x)

Bits 5-30: Reserved

Bit 31: Intel® Connection Manager Entitlement

 

Intel CSME Brand Qualified Features: 4 bytes. Each bit represents a different Intel CSME feature. A value of 1 indicates that the feature is qualified. Note: Some features are mandatory - they must be enabled by the OEM. Other features are optional. Whether a feature is mandatory or optional depends on the platform. To discover which features are mandatory and which are optional for your platform, refer to the Intel® Unique Platform ID landing page.

Bit 0: Intel® AMT

Bit 1: Intel® Standard Manageability

Bit 2: Reserved

Bit 3: Intel® One-Click Recovery

Bit 4: Intel® Remote Platform Erase  

Bit 5: Intel® Platform Service Record

Bits 6-17: Reserved

Bit 18: Out of Band KVM Remote Control

Bits 19-26: Reserved

Bit 27: Out of Band Over ThunderboltTM Dock

Bit 28: Intel® Unique Platform ID                               

Bit 31: Reserved

 

Brand Features Map Table Revision: 8 bytes

Bytes 0-1: Major version of Intel CSME firmware

Bytes 2-3: Minor version of Intel CSME firmware

Bytes 4-5: Hot fix number of Intel CSME firmware

Bytes 6-7: Build number (version of the map table – across generations)

 

CPU Brand Qualified Features: 4 bytes. Each bit represents a different CPU feature. A value of 1 indicates that the feature is qualified.

Bit 0: Intel® System Security Report                       

Bit 1: Intel® Runtime BIOS Resilience L2

Bit 2: Intel® System Resources Defense                

Bit 3: NVMe Based Firmware Recovery

Bits 4-31: Reserved

 

Extension: = SEQUENCE  

{2 elm 

OBJECT IDENTIFIER   2.16.840.1.113741.1.2.5.1, 

OCTET STRING 

OCTET STRING 

 [Qualified Brand and Entitlements || CSME Brand QualifiedFeatures || Brand Features Map Table Revision || CPU Brand Qualified Features] 

where || stands for concatenation of the values above.

Intel UPID MEI Commands

Intel UPID MEI Client Definition

GUID = 92136C79-5FEA-4CFD-980E-23BE07FA5E9F

TxBufferSize = 1200 bytes

RxBufferSize = 3,500 bytes

MaxClients = 1

 

Detecting Whether Intel UPID is Supported on the Platform

A platform’s Intel UPID capability can be detected from the presence of the Intel UPID MEI client in the Intel CSME firmware. When the Intel UPID MEI client is present, it registers its GUID with the Intel MEI driver.

The Intel MEI driver provides an interface through which software can query the list of HECI Client GUIDs supported by the Intel CSME firmware and thereby discover whether the Intel UPID MEI Client GUID is on the list. Once the Intel UPID MEI Client GUID has been found, it is also possible to discover the version of the Intel UPID feature.

If Intel UPID is not supported on the platform, the OEM should be contacted to enable the feature.

To query the Intel MEI driver for the supported Intel MEI Client GUIDs and GUID versions:

  1. Use the GetDevicePath function to retrieve the Intel MEI driver filename via GUID.
  2. Open a handle to the Intel MEI driver (via CreateFile, using the filename discovered in Step ‎1).
  3. To discover the number of supported GUIDs:
    1. Send IOCTL - IOCTL_TEEDRIVER_GET_FW_CLIENT_COUNT (via DeviceIoControl())
      1. Input buffer    – None
      2. Output Buffer – FW_CLIENT_COUNT struct
  4. Send a query that will return a list of structures that describes each one of the supported Intel MEI GUIDs. The number of entries in the structure equals the FW_CLIENT_COUNT extracted in Step ‎3:
    1. Send IOCTL - IOCTL_TEEDRIVER_GET_FW_CLIENTS (via DeviceIoControl())
      1. Input Buffer    – None
    2. Output Buffer – Array of FW_CLIENT_EXPANDED structure. The number of entries is equal to FW_CLIENT_COUNT  (see the FW_CLIENT_EXPANDED definition).
  5. For each entry, compare FW_CLIENT_EXPANDED.ProtocolName with the Intel UPID MEI Client GUID (92136C79-5FEA-4CFD-980E-23BE07FA5E9F). If found, the Intel UPID feature is supported.
  6. In the Intel UPID FW_CLIENT_EXPANDED structure found in Step ‎5, check the FW_CLIENT_EXPANDED.ProtocolVersion to determine the version of the Intel UPID protocol that the firmware supports.

Definitions:

typedef struct _FW_CLIENT_EXPANDED
{
     UINT16                ClientID;                // FW Client Number
     GUID                    ProtocolName;            // FW Client GUID
     UINT8                   ProtocolVersion;         // FW Client Protocol Version
     UINT8                   MaxNumberOfConnections;  
     UINT8                   FixedAddress;
     UINT8                   SingleReceiveBuffer;
     UINT32                  MaxMessageLength;        // FW Max Buffer Size
} FW_CLIENT_EXPANDED;
typedef struct _FW_CLIENT_COUNT
{
     BYTE       count;
} FW_CLIENT_COUNT;
#define IOCTL_TEEDRIVER_GET_FW_CLIENT_COUNT \
     CTL_CODE(FILE_DEVICE_HECI, 0x806, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_TEEDRIVER_GET_FW_CLIENTS \
     CTL_CODE(FILE_DEVICE_HECI, 0x807, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

UPID MEI Command Structure

UPID_HECI_HEADER

Header for Intel UPID commands.

typedef struct
{
    UINT8                              Feature;
    UINT8                              Command;
    UINT16                             ByteCount;
}  UPID_HECI_HEADER;

 

Field Description

Field Name Field Type Description

Feature

UINT8

The command feature code. See UPID_COMMAND_FEATURE for feature codes.

Command

UINT8

The command code. See UPID_COMMAND for command codes.

ByteCount

UINT16

Total length, excluding the message header.

 

UPID_COMMAND_FEATURE

Command feature codes.

typedef enum
{
      UPID_COMMAND_FEATURE_PLATFORM_ID         = 0,
}   UPID_COMMAND_FEATURE;

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 

UPID_COMMAND

Command codes.

typedef enum
{
      UPID_PLATFORM_ID_FEATURE_SUPPORT_GET_CMD = 0,
      UPID_PLATFORM_ID_FEATURE_STATE_GET_CMD   = 1,
      UPID_PLATFORM_ID_FEATURE_STATE_SET_CMD   = 2,
      UPID_PLATFORM_ID_FEATURE_STATE_OS_CONTROL_GET_CMD = 3,
      UPID_PLATFORM_ID_FEATURE_STATE_OS_CONTROL_SET_CMD = 4,
      UPID_PLATFORM_ID_GET_CMD                 = 5,
      UPID_PLATFORM_ID_REFURBISH_COUNTER_GET_CMD = 6,
      UPID_OEM_PLATFORM_ID_UPDATE_CMD          = 7,
}   UPID_COMMAND;

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 

UPID_STATUS

Status codes.

typedef enum
{
      UPID_STATUS_SUCCESS                      = 0,
      UPID_STATUS_FEATURE_NOT_SUPPORTED        = 1,
      UPID_STATUS_INVALID_INPUT_PARAMETER      = 2,
      UPID_STATUS_STATUS_INTERNAL_ERROR        = 3,
      UPID_STATUS_NOT_ALLOWED_AFTER_EOP        = 4,
      UPID_STATUS_NOT_ALLOWED_AFTER_MANUF_LOCK = 5,
      UPID_STATUS_MAX_COUNTERS_EXCEEDED        = 6,
      UPID_STATUS_INVALID_STATE                = 7,
      UPID_STATUS_RESERVED2                    = 8,
      UPID_STATUS_NOT_ALLOWED_AFTER_CBD        = 9,
}   UPID_STATUS;

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 
Status Caused By (in Specific Command)
UPID_STATUS_FEATURE_NOT_SUPPORTED
(Invalid command code)
 
UPID_STATUS_INVALID_INPUT_PARAMETER
(Input size does not match the expected request
size for the specific command)

UPID_HECI_OEM_PLATFORM_ID_UPDATE

  • manuf_type is not UPID_MANUFACTURING_EVENT_REPAIR or UPID_MANUFACTURING_EVENT_REPURPOSE
  • platform_id_type is not UPID_OEM_PLATFORM_ID_TYPE_BINARY_STRING
    or UPID_OEM_PLATFORM_ID_TYPE_PRINTABLE_STRING
  • platform_id_type is UPID_OEM_PLATFORM_ID_TYPE_PRINTABLE_STRING
    but input ID is not printable

UPID_HECI_OEM_PLATFORM_ID_SIGN

  • key_idx is neither BIOS nor OS

UPID_HECI_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN:

  • cert_idx is neither BIOS nor OS
UPID_STATUS_INTERNAL_ERROR
(Examples: file system error, crypto error)
 
UPID_STATUS_NOT_ALLOWED_AFTER_EOP

UPID_HECI_PLATFORM_ID_FEATURE_STATE_SET

  • if called after EOP and OS control is disabled

UPID_HECI_PLATFORM_ID_FEATURE_STATE_OS_CONTROL_SET

  • called after EOP

UPID_HECI_OEM_PLATFORM_ID_UPDATE

  • if soc_config_lock, Core BIOS Done was not received and after EOP
    (see error UPID_STATUS_NOT_ALLOWED_AFTER_CBD below)

UPID_HECI_OEM_PLATFORM_ID_SIGN:

  • key_idx is BIOS and called after EOP
UPID_STATUS_INVALID_STATE

UPID_HECI_PLATFORM_ID_GET

  • called after EOP and after EOM, and Intel UPID feature state is disabled

UPID_STATUS_NOT_ALLOWED_AFTER_
MANUF_LOCK

UPID_HECI_OEM_PLATFORM_ID_UPDATE

  •  called after EOM (note that it will first  check the soc_config_lock so it
    might return UPID_STATUS_NOT_ALLOWED_AFTER_CBD or UPID_STATUS_NOT_ALLOWED_AFTER_EOP)
UPID_STATUS_MAX_COUNTER_EXCEEDED

UPID_HECI_OEM_PLATFORM_ID_UPDATE

  • manuf_type is UPID_MANUFACTURING_EVENT_REPURPOSE,
    soc config is locked and refurbish counter is already 5 (max value)
UPID_STATUS_INVALID_STATE

UPID_HECI_OEM_PLATFORM_ID_SIGN

  • called before EOM or called when Intel UPID is disabled

UPID_HECI_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN:

  • called before EOM or called when Intel UPID is disabled

UPID_HECI_PLATFORM_ID_GET

  • if called after EOP and after EOM, and Intel UPID feature state is disabled
UPID_STATUS_NOT_ALLOWED_AFTER_CBD

UPID_HECI_OEM_PLATFORM_ID_UPDATE

  • soc_config_lock, and Core BIOS Done was received

UPID_PLATFORM_ID_FEATURE_SUPPORT_GET

Returns the UPID feature support.

UPID_PLATFORM_ID_FEATURE_SUPPORT_GET Request

typedef struct
{
    UPID_HECI_HEADER                   Header;
}  UPID_PLATFORM_ID_FEATURE_SUPPORT_GET_Request;

 

Field Name Field Type Description
Header UPID_HECI_HEADER Request header

 

UPID_PLATFORM_ID_FEATURE_SUPPORT_GET Response

typedef struct
{
    UPID_HECI_HEADER                   Header;
    UPID_STATUS                        Status;
    PlatformIdSupported                   platformIdSupported;
}  UPID_PLATFORM_ID_FEATURE_SUPPORT_GET_Response;

 

Field Name
Field Type
Description

Header

UPID_HECI_HEADER

Response header

Status

UPID_STATUS

Status

platformIdSupported

UPID_SUPPORT

UPID and Attestation support state

 

PlatformIdSupported

typedef union _UPID_SUPPORT {
	UINT8 PlatformIdSupported;
	Struct {
		UINT8   Supported: 1; 
			//0: UPID not supported
                       //1: supported    
            	UINT8    Attestation: 1;
			//0: UPID Attestation not supported 
			//1: supported       		
           	UINT8     Reserved:6
        }
} UPID_SUPPORT;

Note: If a platform supports Intel UPID Attestation, the value of PlatformIdSupported is 3 (i.e., Intel UPID must also be supported on the platform).

UPID_PLATFORM_ID_FEATURE_STATE_GET

Returns the Platform ID feature state.

UPID_PLATFORM_ID_FEATURE_STATE_GET Request

typedef struct
{
    UPID_HECI_HEADER               Header;
}  UPID_PLATFORM_ID_FEATURE_STATE_GET_Request;

 

Field Name
Field Value
Description

Header

UPID_HECI_HEADER

Request header

 

UPID_PLATFORM_ID_FEATURE_STATE_GET Response

typedef struct
{
    UPID_HECI_HEADER                   Header;
    UPID_STATUS				   Status;
    UINT8                              FeatureEnabled;
}  UPID_PLATFORM_ID_FEATURE_STATE_GET_Response;

 

Field Name
Field Value
Description

Header

UPID_HECI_HEADER

Response header

Status UPID_STATUS Status
FeatureEnabled UINT8 Feature state (0/1)

 

UPID_PLATFORM_ID_FEATURE_STATE_SET

Sets the Platform ID feature state.

UPID_PLATFORM_ID_FEATURE_STATE_SET Request

typedef struct
{
    UPID_HECI_HEADER                   Header;
    UINT8                              FeatureEnabled;
}  UPID_PLATFORM_ID_FEATURE_STATE_SET_Request;

 

Field Name
Field Value
Description

Header

UPID_HECI_HEADER

Request header

FeatureEnabled

UINT8

Feature state (0/1)

 

UPID_PLATFORM_ID_FEATURE_STATE_SET Response

typedef struct
{
    UPID_HECI_HEADER                   Header;
    UPID_STATUS                        Status;
}  UPID_PLATFORM_ID_FEATURE_STATE_SET_Response;

 

Field Name
Field Value
Description

Header

UPID_HECI_HEADER

Response header

Status

UPID_STATUS

Status

UPID_PLATFORM_ID_GET

Returns the Unique Platform ID of the system.

UPID_PLATFORM_ID_GET Request

typedef struct
{
    UPID_HECI_HEADER                   Header;
}  UPID_PLATFORM_ID_GET_Request;

 

Field Name Value Description
Header UPID_HECI_HEADER Request header

 

UPID_PLATFORM_ID_GET Response

typedef struct
{
    UPID_HECI_HEADER                   Header;
    UPID_STATUS                        Status;
    UPID_OEM_PLATFORM_ID_TYPE          PlatformIdType;
    UINT8[32]                          OEMPlatformId;
    UINT8[32]                          CSMEPlatformId;
}  UPID_PLATFORM_ID_GET_Response;

 

Field Name Value Description

Header

UPID_HECI_HEADER

Response header

Status

UPID_STATUS

Status

PlatformIdType

UPID_OEM_PLATFORM_ID_TYPE

OEM Platform ID type

OEMPlatformId

UINT8[32]

OEM Platform ID

CSMEPlatformId

UINT8[32]

Intel CSME Platform ID

 

Note: After retrieving the UPID, it is recommended to disable the feature state using UPID_PLATFORM_ID_FEATURE_STATE_SET.

UPID_OEM_PLATFORM_ID_TYPE

UPID presentation type.

typedef enum
{
      UPID_OEM_PLATFORM_ID_TYPE_NOT_SET        = 0,
      UPID_OEM_PLATFORM_ID_TYPE_BINARY         = 1,
      UPID_OEM_PLATFORM_ID_TYPE_PRINTABLE_STRING = 2,
}   UPID_OEM_PLATFORM_ID_TYPE;

 

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 

Item Name Description
UPID_OEM_PLATFORM_ID_TYPE_NOT_SET OEM Platform ID is not set.
UPID_OEM_PLATFORM_ID_TYPE_BINARY OEM Platform ID includes binary values.
UPID_OEM_PLATFORM_ID_TYPE_PRINTABLE_STRING OEM Platform ID includes printable characters.

UPID_PLATFORM_ID_SIGN

Signs user data with device key.

UPID_OEM_PLATFORM_ID_SIGN Request

typedef struct
{
    UPID_HECI_HEADER	Header
    UPID_KEY_IDX	KeyIdx	
    UINT32		DataLen//actual length of data in the dataToSign buffer
    UINT8[DATA_TO_SIGN_MAX_SIZE] 		DataToSign;	
}  UPID_PLATFORM_ID_SIGN_Request;

 

UPID_KEY_IDX

Private key used for signing. Specifies the type of key requested from the firmware, depending on whether
the signing request is coming from an OS application (1) or from the BIOS (0).

typedef enum
{
      UPID_KEY_IDX_BIOS                        = 0,
      UPID_KEY_IDX_OS                          = 1,
}   UPID_KEY_IDX;

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 

Field Name Description
KeyIdx

User key type:

0: BIOS

1: OS

DataLen Actual length of data in the dataToSign buffer
DataToSign

The data that is signed by the Intel CSME key using the ECDSA384_WITH_SHA384 algorithm.

DATA_TO_SIGN_MAX_SIZE is 1024 bytes.

 

UPID_OEM_PLATFORM_ID_SIGN Response

typedef struct
{
    UPID_HECI_HEADER				Header
    STATUS                          	Status
    SIGNATURE_MECHANISM       	 SignatureMechanism
    UINT8[512]                         Signature
} ECDSADeviceSignChallenge_Response;

 

Field Name Description
SignatureMechanism

Signature mechanism used.

0 – ECDSA 384 SHA384

Signature

Signature over the input "dataToSign".

Note: Actual signature size may be smaller than the signature buffer and depends on the algorithm used in SignatureMechanism

 

UPID_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN

Get the On Die CA certificate chain used for signing user data.

UPID_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN Request

typedef struct
{
    UPID_HECI_HEADER                 Header;
    UINT32 			       CertIdx	
}  GetCertificateChain_Request;

 

Field name Description
CertIdx User certificate type. Specifies the type of certificate requested from the firmware, depending on
whether the signing request is coming from an OS application (1) or from the BIOS (0).

 

 

typedef enum
{
      UPID_CERT_IDX_BIOS        = 0,
      UPID_CERT_IDX_OS          = 1,
}   UPID_CERT_IDX;

Note: sizeof(enum) is sizeof(UINT32) = 4 bytes.

 

UPID_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN Response

typedef struct
{
    UPID_HECI_HEADER                    Header;
    STATUS                          	  Status 	
    UINT16[4]                           LengthsOfCertificates;
    UINT8[MAX_Certs_length]             CertificateChain; // 
} GetCertificateChain_Response;

 

Field name Description
LengthsOfCertificates This field corresponds to the length of each one of the certificates returned by Certificates field.
It returns 4 unit16, each one is the length of corresponding certificate in Certificates
CertificateChain

This is the certificate chain to return in the order from leaf to root. E.g., the first certificate is the
UPID leaf certificate and the fourth certificate is the ROM certificate.

MAX_Certs_length is 3200.

 

Use Cases

The following table describes main use cases for Intel UPID.

Use case To check whether supported, do the following:
Read the Intel UPID Query the Intel MEI driver for the supported Intel MEI Client GUIDs and verify that the UPID GUID is returned.
Attest the Intel UPID

Or

 

Use Case: Read the Intel UPID

To read the Intel UPID from the OS:

  1. Set the Intel UPID feature state to Enabled. This can be accomplished by one of the following methods:

        2. Read the Intel UPID using the UPID_PLATFORM_ID_GET command.

        3. Set the Intel UPID feature state to Disabled using one of the methods in Step 1.

Use Case: Attest the UPID

The following describes the high-level flow for Intel UPID attestation:

  1. Set the Intel UPID feature state to Enabled. This can be accomplished by one of the following methods:
  1. The attestor application sends a challenge request to the Intel CSME firmware via the Intel MEI UPID_OEM_PLATFORM_ID_SIGN command. The Intel CSME application uses its Intel UPID attestation key to sign the challenge and return a signed challenge response.
  2. The attestor application obtains the Intel UPID IDevID certificate chain via the UPID_OEM_PLATFORM_ID_GET_CERTIFICATE_CHAIN command.

  3. The attestor application retrieves the leaf certificate from the first entry in the certificate chain and verifies that this is an Intel UPID attestation certificate by checking that the Extended Key Usage (EKU) field includes the OID 2.16.840.1.113741.1.2.4.6 (for BIOS Intel UPID attestation) or 2.16.840.1.113741.1.2.4.7(for OS Intel UPID attestation).
  4. If valid, the attestor verifies that this is a Production system Intel CSME certificate chain (and not an Engineering Sample or Debug system or other Intel chipset IP certificate). This is verified by the Issuer Field in the ROM ODCA certificate:
  • Find the CSME ROM ODCA Certificate: This is the 4th certificate in the chain with the Subject Field Common Name attribute containing “ROM CA”.
  • In the Issuer field, the organizationalUnitName Attribute (OU) must have a prefix equal to either ODCA 2 CSME P or On Die CSME P, where P stands for Production.
  1. If valid, the attestor application retrieves the public key from the leaf certificate and verifies the challenge response signature. See Verifying the Challenge Response Signature.
  2. If the challenge response is valid, the attestor verifies the certificate chain up to the Intel iKGF Root CA installed in the service (https://tsci.intel.com/content/OnDieCA/certs/OnDie_CA_RootCA_Certificate.cer), and verifies that no certificate in this chain has been revoked by the iKGF CA CRL.
  3. If the certificate chain is valid, the attestor application verifies the Intel UPID against the IDevID certificate chain:
    • Retrieves the OEM Platform ID from the 520SerialNumber attribute in the Subject field of the IDevID certificate, and verifies it against the first 32 bytes of the Intel UPID.
    • Retrieves the hwSerialNum in the SubjectAltName field in the certificate and compares it with the second 32 bytes of the Intel UPID.
    • If valid, the attestor application verifies that the first 20 bytes of the hwSerialNum in the SubjectAltName field match the first 20 bytes of the SHA256 hash of the ROM ODCA Certificate (identified in Step 4).

 

high level UPID attestation flow

 

Verifying the Challenge Response Signature

  1. Decrypt the signature field returned in the challenge response with the public key that resides within the Intel UPID IDevID leaf certificate per the SignatureMechanism parameter in the response.
  2. Compute the hash of the challenge data in the dataToSign parameter that was sent to CSME FW in UPID_OEM_PLATFORM_ID_SIGN Intel MEI command, per the hash function in SignatureMechanism.
  3. Compare the decrypt signature field in Step 1 with the hash value in Step 2. Both values should be equal.

Verification Method

Any open-source crypto library that verifies ECDSA signatures can be used for verifying the challenge response signature returned from the Intel CSME firmware.

For example, the Open SSL ECDSA_verify function can be used with the following input parameters:

Method declaration:

int ECDSA_do_verify(const unsigned char *dgst, int dgst_len,
                        const ECDSA_SIG *sig, EC_KEY* eckey);

Method call:

ret = ECDSA_do_verify(digest, 48, sig, eckey);

Parameter

Meaning

Digest

Hash of the dataToSign

Sig

The returned signature field in the challenge response transformed to ECDSA_SIG encoding

eckey

The public key that resides in the IDevID (leaf) certificate returned within the challenge response. Intel® ME eckey curve type is nist p384

   

Verifying the OCDA Certificate Chain

To verify the ODCA certificate chain, the user application is required to check all signatures in the chain and check that the root certificate matches the iKGF root certificate. This can be accomplished by the standard PKI certificate chain verification method, taking the root CA from a trusted Intel site.

If attestation fails due to a signation certification verification error, the Intel UPID certificate should not be trusted.

Intel UPID WMI Provider Commands

WMI is a Windows management subsystem that allows an administrator to access Intel MEI APIs using a standard interface.

Notes:

1. Before you can use WMI commands, you need to ensure that WMI is supported on the system that you are querying.

To determine whether your computer has the Intel CSME WMI provider (which is usually pushed by Microsoft Windows Update), perform one of the following actions:

• Run a WMI command and check whether it succeeds.
• Open a Command window and run sc query. Check whether the Intel(R) Management Engine WMI Provider Registration service is listed.
• Open a PowerShell window and run the Get-Service command. Check whether the Intel(R) Management Engine WMI Provider Registration is listed. This can also be found in the device manager (Software components \ Intel(R) Management Engine WMI Provider).
If your computer is missing the Intel CSME WMI provider, you need to install the Intel CSME Software package, which includes the provider.
The Intel CSME Software package and installation instructions are available from your OEM.
Alternatively, you can download the Intel CSME Software from Intel’s Download Center. See the section Installing Intel® CSME Software Components in the
Intel® Converged Security and Management Engine Software Installation and Configuration Guide included with the software package.

2. The WMI commands must be executed with OS Admin control.

Set Intel UPID Feature State via WMI

To enable the feature state via WMI, open PowerShell and execute:

Invoke-CimMethod -Namespace "root\Intel_ME" -ClassName ME_System -MethodName setUniquePlatformIDFeatureState -Arguments @{ state = $True}

 

Get Intel UPID Feature State via WMI

To retrieve the feature state, open PowerShell and execute:

Invoke-CimMethod -Namespace "root\Intel_ME" -ClassName ME_System -MethodName getUniquePlatformIDFeatureState

Read Intel UPID via WMI

Note: This command is available only when the Intel UPID state has been set to Enabled via the BIOS, WMI or an Intel MEI command.

To read the Intel UPID, open PowerShell and execute:

Invoke-CimMethod -Namespace "root\Intel_ME" -ClassName ME_System -MethodName getUniquePlatformID

The system’s unique identity is displayed in two parts:

  1. Intel CSME Platform ID
  2. OEM platform ID. If the ID has not yet been set, this field will be filled with zeros.