PDXpert PLM Software
Application Note
PDXpert/PDXplorer IPC-2570 extensions
PDXpert and PDXplorer offer optional security improvements to the original IPC-2570 specifications.
Last update 2021-12-13
This describes a PDX package that's signed and optionally encrypted. These features were introduced in PDXpert 15.0 and PDXplorer 6.0 releases.
Text styles: IPC element name, IPC attribute name, IPC attribute value, processing and non-IPC code.
Package cryptographic signing§
Feature summary§
PDXpert applies a cryptographic signature to the PDX package content. This signature proves that
- The pdx.xml content has not been changed (data integrity). Because each file attachment name and its digest is included in the pdx.xml file, hashing just the pdx.xml allows detecting a change to an attachment digest.
- The package has been sent by the licensed organization (sender authentication).
- The package has been generated by a licensed PDXpert application (tool authentication).
Package signing is not specified by the IPC-2570 standards. The signed pdx.xml file is fully compliant with IPC-2570, with the cryptographic information contained in a separate signature file.
PDXplorer is designed to verify and authenticate the PDX package. Other PDX package readers will see the expected pdx.xml file and its file attachments, but may not be capable of verifying or authenticating the package contents.
Technical description§
Creating the license§
The software publisher (SP) of PDXpert obtains a cryptographic certificate from a trusted public certificate authority (CA). The CA issues the certificate with (a) a private key (SP-P) to sign the license file; and (b) a public certificate (SP-C) for validating the license signature. SP issues a software license file to the application's Licensed Entity (LE). The SP-C and other cryptograhic elements are used to validate and encrypt PDX packages.
-
SP creates a certificate with the LE's identification (for example, Subject contains organization name, state, country).
-
The generator certificate private key (GC-P) is an encrypted XML string.
-
The generator certificate (GC-C), an XML string equivalent to a .pem file, contains the public key and LE identification.
-
The generator certificate signature (GC-S) is the Base64-encoded SHA-256 digest of the GC-C, encrypted by the SP-P.
-
-
License is issued as .pdxl file.
-
A unique hash function uses the license properties to create the alphanumeric license key.
-
The properties, with the license key, are added to a new XML file.
-
Crypto objects are added to the XML license file.
-
GC-P encrypted private key, used by PDXpert to sign a PDX package.
-
GC-C certificate (public key), used by a PDX package reader to confirm PDX package integrity and authenticate the sending organization.
-
GC-S encrypted digest of the GC-C, for confirming the certificate integrity using the SP-C.
-
-
The entire XML license file is signed using the SP-P, and exported as the final license .pdxl file. The SP-C is enclosed within the Signature (as <KeyInfo><X509Data><X509Certificate>), and used by PDXpert (and later by a PDX package reader) to authenticate the SP.
-
-
LE imports the license .pdxl file into PDXpert, which confirms the license contents using the SP-C.
Creating a PDX package§
PDXpert can use the license's crypto objects to export a PDX package that's signed and optionally encrypted.
-
Design package construction: The pdx.xml file contains the product data and file attachment metadata.
-
The <?generated_by {publisher}/...> is the same SP as contained in from the SP-C Subject.
-
The <Contact isTopLevel="Yes" {attributes}> is the same LE as contained in the GC-C Subject.
-
-
Signature additions: The PDXXML-{docID}.sig file contains four elements.
-
The PDXXMLSignature verifies the pdx.xml file content. It's the digest of the pdx.xml file, encrypted using the package generator's private key (GC-P), and saved as a Base64 string.
-
The AppPublicKey contains the package generator's public key (GC-C) for verifying the PDXXMLSignature value, and authenticating the isTopLevel contact as the package generator licensee.
-
The AppKeySignature verifies the AppPublicKey. It's the digest of the generator's public key (GC-S), encrypted using the software publisher's private key (SP-P), and saved as a Base64 string.
-
The RootPublicKey contains the software publisher's public key (SP-C) for verifying the AppKeySignature value, and authenticating the <?generated_by as the software publisher.
-
-
Signed package compression: The compressed .pdx package contains the pdx.xml file, design file attachments, and the PDXXML-{docID}.sig file.
-
Package file system transfer: The PDXpert client saves the package.
Reading a PDX package§
PDXplorer or other validating PDX reader opens the PDX package.
-
If the package is encrypted, it's decrypted using the AES-256 symmetric key, and the internal PDX package is extracted.
-
The package is identified, verified and authenticated.
-
Identification: The PDX package's thisDocumentIdentifier is used to find the PDXXML-{docId}*.sig signature file.
-
Verification: The PDXXMLSignature is decrypted with GC-C, and matched to the pdx.xml file hash. The AppKeySignature is decrypted with SP-C, and matched to the AppPublicKey GC-S file hash.
-
Authentication: The package <Contact isTopLevel="Yes" {attributes}> is matched to the GC-C Subject. The RootPublicKey is signed by a third-party Certificate Authority, and the package <?generated_by {publisher}/...> processing instruction is matched to the SP-C Subject.
-
Signature file name format§
To avoid filename collisions with other files, the cryptographic file is named PDXXML-{docID}[-{crc32}].sig, where:
-
{docID} thisDocumentIdentifier, with all non-alphanumeric characters removed, confirms that the file contains the package digest
-
{crc32} optional CRC-32 prevents a collision with a similarly-named .sig attachment in the package (not needed by PDXpert)
PDXplorer (or another package validator) matches the alphanumeric {docID} to the thisDocumentIdentifier and can compare the file contents to {crc32}.
Examples:
-
Without optional sequence:
PDXXML-145ccb79c45949c8826c6a3092f1e50.sig
-
With optional CRC-32 value, where the file name conflicts with another package attachment name:
PDXXML-20494-82F63B78.sig
To minimize confusion with design file attachments, PDX package readers should not show or export the signature file.
Package encryption§
PDXplorer can be used to encrypt and decrypt PDXpert's cryptographically signed PDX packages using the strong AES-256 cipher. This note describes the internal structure that allows other PDX package readers to read and extract the encrypted PDX package.
How to use a password-protected PDX package§
There are two options:
-
Open with PDXplorer 6.0 or later using the password provided to you. See the PDXplorer user guide. You can also save the encrypted file as a decrypted PDX package.
-
Open with any PDXplorer release (or another PDX package reader) and a file decrypting tool.
-
Open the PDX package, and copy the thisDocumentIdentifier attribute value. In PDXplorer, this is shown as the Package number, and looks something like 67a4e12334934dae9d74a1a832739de9. This value is called the password salt.
-
Close the PDX package file.
-
Open the PDX package file using WinZip®, 7-Zip or similar encrypting compressed file reader.
-
Select and save (export) the encrypted.pdx file. When prompted, enter the password and the salt. Do not add a space or other extra character. For example, if the provided password is myPassw0rd and the password salt is 67a4e12334934dae9d74a1a832739de9, then use myPassw0rd67a4e12334934dae9d74a1a832739de9 to export the file.
-
After the encrypted.pdx file is saved, it can be opened with a PDX package reader, including any PDXplorer release.
-
Technical goals§
-
Unencrypted outer PDX package:
-
Is fully compatible with the IPC-2570 Supply Chain Communication (PDX) standard.
-
Can be opened by an industry-standard archive file reader for extracting the inner PDX package.
-
Uses an outer unencrypted pdx.xml file to describe the inner encrypted PDX package.
-
Contains a unique package identifier that's used as the passphrase salt.
-
-
Inner encrypted PDX attachment:
-
Uses strong ISO/IEC 18033-3 AES-256 encryption.
-
Ensures each package digest is unique, even when user's passphrase is not unique.
-
Is decrypted and viewed using a decrypting PDX reader.
-
Is not extracted into an unencrypted copy of the package.
-
Can be extracted using WinZip® or compatible tool, and then viewed using an older PDX reader.
-
More information about PDXpert software's IPC-2570 implementation.
Definitions§
- Inner PDX package
-
A PDX package that conforms to the IPC-2570 standards, and is not encrypted. The inner PDX package always contains one pdx.xml file (the inner XML file), and may contain file attachments.
It's recommended that the inner XML file is signed using an externally detached XML signature file. The signature XML file:
-
Is named using the PDX package's thisDocumentIdentifier, for example PDXXML-cc74e9fc8f7e49e0b126868b1cc658e7.sig
-
Is included in the compressed PDX package
-
Is not shown as an attachment in the PDX package's pdx.xml entry
To allow validating the package's file attachments, the signed pdx.xml file should include each file's Attachment checkSum (MD5) or an AdditionalAttribute with other file signature, such as a SHA-1 digest. The digest doesn't have to be cryptographically strong, but must be sufficient to prevent hash collisions.
-
- Inner XML file
-
The pdx.xml file that is contained within the inner PDX package.
- Encrypted PDX package
-
An inner PDX package that is encrypted using a specified cipher; renamed as encrypted.pdx; and saved in an outer PDX package.
- Outer XML file
-
An unencrypted pdx.xml file that conforms to the IPC-2570 standards, and is saved in a outer PDX package. It describes the encrypted PDX package and selected elements of the inner PDX package. The outer XML file must include a unique thisDocumentIdentifier value. Other elements may be included in the outer XML file, provided they do not conflict with the specifications of this document.
- Outer PDX package
-
A PDX package that contains:
-
one outer XML file; and
-
one encrypted PDX package.
Other file attachments may be defined and saved in the outer PDX package, provided they do not conflict with the specifications of this document.
-
IPC-2571 Generic Requirements§
Content topic numbers – such as (3) – refer to the corresponding section in the IPC-2571 standard.
- Product Data eXchange Package DTD (3)
- ProductDataeXchangePackage (6)
- AdditionalAttributes (10) / AdditionalAttribute (10.1)
- Attachments (8) / Attachment (8.1)
- Contacts (9) / Contact (9.1)
Specifications§
The minimal outer PDX package pdx.xml with only required entities:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ProductDataeXchangePackage [ ... standard IPC2570.DTD ... ]>
<?pdx_version 1.0?>
<?generated_by HX3 Solutions Inc/PDXplorer/5.3/0.1?>
<ProductDataeXchangePackage
thisDocumentIdentifier="cc74e9fc8f7e49e0b126868b1cc658e7"
thisDocumentGenerationDateTime="2021-07-05T00:00:00Z"
thisDocumentModificationDateTime="2021-07-05T00:00:00Z" >
<AdditionalAttributes groupLabel="Encryption">
<AdditionalAttribute name="Cipher" value="AES" dimension="256" dataType="Binary" />
</AdditionalAttributes>
<Attachments>
<Attachment isFileIn="Yes" universalResourceIdentifier="file://encrypted.pdx" />
</Attachments>
</ProductDataeXchangePackage>
A more complete outer pdx.xml file:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ProductDataeXchangePackage [ ... standard IPC2570.DTD ... ]>
<?pdx_version 1.0?>
<?generated_by HX3 Solutions Inc/PDXplorer/5.3/0.1?>
<ProductDataeXchangePackage
thisDocumentIdentifier="2e6f758aa1564161819cc7f86b9c4261"
thisDocumentGenerationDateTime="2021-07-05T19:18:12Z"
thisDocumentModificationDateTime="2021-07-05T19:18:12Z"
originatedByContactName="Granville Woods"
originatedByContactUniqueIdentifier="IDc8b7f1ad56a143239d65aec8f2473c5a"
>
<AdditionalAttributes groupLabel="Encryption">
name="Cipher"
value="AES"
dimension="256"
dataType="Binary"
/>
</AdditionalAttributes>
optional <ProductDataeXchangePackage><AdditionalAttributes groupLabel="…"> elements
isFileIn="Yes"
universalResourceIdentifier="file://encrypted.pdx"
fileIdentifier="encrypted.pdx"
referenceName="encrypted.pdx"
globalMimeTypeQualifierCode="application/octet-stream"
fileSize="6270912"
attachmentModificationDate="2021-07-05T19:18:12Z"
checksum="b9046077b7cb69fd0a0bab9cedb8ae92"
/>
optional <ProductDataeXchangePackage><Attachments><Attachment> elements
</Attachments>
<Contacts>
contactIdentifier="IDc8b7f1ad-56a1-4323-9d65-aec8f2473c5a"
contactUniqueIdentifier="IDc8b7f1ad-56a1-4323-9d65-aec8f2473c5a"
contactName="Granville Woods"
/>
optional <ProductDataeXchangePackage><Contacts><Contact> elements
</Contacts>
</ProductDataeXchangePackage>
Product Data eXchange Package DTD (2571:3)§
The outer PDX package conforms to the IPC-2571 standard version 1.0 DTD. All process instructions are required.
Process instruction | Description |
---|---|
<?xml version = "1.0" encoding="UTF-8"?> | Mandatory XML process instruction. |
<?pdx_version = "1.0"?> | The outer PDX package conforms to the IPC-2571 standard version 1.0, and can be read by compatible software applications. |
<?generated_by SoftwareVendor/SoftwareName/Version/BuildNumber?> | This identifies the encrypting software application and its version. This may or may not match the encrypted.pdx attachment's inner XML file's package generator, which may be shown in the ProductDataeXchangePackage element's dataSource attribute. |
ProductDataeXchangePackage (2571:6)§
This is the root node for the outer XML file.
Parent elements
(none)
Element detail & attributes
Attribute name | Required | Data type | Value |
---|---|---|---|
thisDocumentIdentifier | required | String |
Unique value assigned as the outer PDX package ID by the encrypting application. Example: 2e6f758aa1564161819cc7f86b9c4261 This value is used as the passphrase salt. It ensures a unique encryption digest for each package, even when the same passphrase is used for different PDX packages. The exact case-sensitive string value of the user-provided passord is followed without delimiter by the exact case-sensitive string value of the thisDocumentIdentifier value. Example: If the user's passphrase is pdxPass! and thisDocumentIdentifier is 2e6f758aa1564161819cc7f86b9c4261, then the combined value pdxPass!2e6f758aa1564161819cc7f86b9c4261 is used to encrypt and decrypt the inner PDX package. As noted, do not add, remove, or change the case of any character. The encrypting application should assign thisDocumentIdentifier a value between 8 and 32 characters, and help users create a strong passphrase. A passphrase salt increases the value of a strong passphrase, but can't add security to an empty or weak passphrase. |
thisDocumentGenerationDateTime | required | DateTime | UTC date and time of outer PDX package's generation. Example: 2021-12-01T19:56:03Z |
thisDocumentModificationDateTime | required | DateTime | UTC date and time of outer PDX package's last update, usually the same as thisDocumentGenerationDateTime. |
originatedByContactName | optional | String | The contactName value, as specified in the Contact element. Optionally, this may be copied from the inner PDX package. |
originatedByContactUniqueIdentifier | optional | IDREF | The contactUniqueIdentifier value, as specified in the Contact element. |
packageType | optional | String |
Copied from the inner PDX package. |
dataSource | optional | String | The content of the inner PDX package <?generated_by [generator]?> processing instruction. Example: HX3 Solutions Inc/PDXpert/15.0/3000.5 |
thisDocumentCopyright | optional | String | Copied from the inner PDX package. |
description | optional | String | Information about the outer PDX package. May suggest compatible tools that can decrypt the encrypted.pdx package. Example: Encrypted Product Data eXchange (PDX) file. View with PDXplorer 6.0 or later. Or, export 'encrypted.pdx' using WinZip(R)-compatible AES-256 software tool: Enter the assigned password, then add 'thisDocumentIdentifier' value. Do not add a space or extra character. |
Child elements
AdditionalAttributes (2571:10)§
The AdditionalAttributes element with the group label Encryption contains one AdditionalAttribute element that descibes the cipher.
To ensure the package is recognized as encrypted, this AdditionalAttributes element must have a groupLabel with Encryption value. The specified attribute name and value are case-sensitive.
Parent element
Element detail & attributes
Attribute name | Required | Data type | Value |
---|---|---|---|
groupLabel | required | String | Encryption |
Child element
AdditionalAttribute (1, 1)
AdditionalAttribute (2571:10.1)§
There must be exactly one AdditionalAttribute within the AdditionalAttributes parent Encryption group. It describes the encrypted PDX package cipher.
Parent element
Element detail & attributes
The PDX package's AdditionalAttribute element Cipher confirms that the PDX package is encrypted. Where this element doesn't exist, a file named encrypted.pdx is treated as an normal attachment.
To ensure the package is recognized as encrypted, this AdditionalAttribute element must:
-
be the only element in the AdditionalAttributes parent Encryption group; and
-
have the specified case-sensitive attribute names and values.
PDXplorer looks only for this AdditionalAttribute element (and its parents) and an encrypted.pdx physical file. If one of these doesn't exist, then the package content is treated as unencrypted. PDXplorer doesn't require the Attachment and Contact elements.
Attribute name | Required | Data type | Value |
---|---|---|---|
name | required | String | Cipher |
value | required | String | AES Note 1 |
dimension | required | String | One of [ 128 | 192 | 256 ] Notes 2, 3 |
dataType | required | Enumeration | Binary |
dataTypeOther | optional | String | Omitted attribute or empty value. |
description | optional | String | Omitted attribute or any value. |
Notes
- Future versions may support other ISO/IEC 18033 block ciphers.
- Enumeration of options for specified cipher value. The specified dimension must be compatible with the specified value.
- PDXplorer uses only AES-256 to generate an encrypted package.
Child elements
(none)
Attachments (2571:8)
This element is a collection of one or more files attached to another object in the outer PDX package. The outer XML file contains at least one Attachment element, which is required to describe the encrypted.pdx attachment.
Other attachments may be included in the outer PDX package, but no other universalResourceIdentifier can have the exact value of file://encrypted.pdx
Parent element
Element detail & attributes
(none)
Child elements
Attachment (1, unbounded)
Attachment (2571:8.1)
This element describes the encrypted.pdx file.
Parent element
Element detail & attributes
Attribute name | Required | Data type | Value |
---|---|---|---|
isFileIn | required | Enumeration | Yes |
universalResourceIdentifier | required | UriReference | file://encrypted.pdx |
fileIdentifier | optional | String | encrypted.pdx |
referenceName | optional | String | encrypted.pdx |
globalMimeTypeQualifierCode | optional | String | application/octet-stream |
fileSize | optional | String | Integer byte count of encrypted.pdx before encryption. The value is not formatted and does not have units. Example: 248216 |
attachmentModificationDate | optional | DateTime | Copied from the inner PDX package ProductDataeXchangePackage thisDocumentGenerationDateTime value. Example: 2021-02-21T14:17:11Z |
versionIdentifer | optional | String | Omitted attribute or any value. DTD spelling error retained. |
checkSum | optional | String | MD5 digest of encrypted.pdx before encryption. Unless otherwise required by a target system, encode as 32 lowercase hexadecimal digits. Example: 3ac570a8cd347f75d1643db46c1a9ea8 |
description | optional | String | Encrypted Product Data eXchange (PDX) file. View with PDXplorer 6.0 or later. Or, export 'encrypted.pdx' using WinZip(R)-compatible AES-256 software tool: Enter the assigned password, then add 'thisDocumentIdentifier' value. Do not add a space or extra character. |
Child element
(none)
Contacts (2571:9)
This element contains all person & organization contacts within the PDX package. The Contact element is optional; if not specified, then Contacts is also excluded.
Parent element
Element detail & attributes
(none)
Child element
Contact (1, unbounded)
Contact (2571:9.1)
This element describes one contact within a collection of Contacts. It identifies the originator of the encrypted or unencrypted package. This element is optional, and can be used to identify the package owner, author, or rights holder.
It can be added as
-
the outer package's originator-provided contact information, setting isTopLevel=Yes; if none, then
-
the orignal package's first-listed isTopLevel=Yes contact; if none, then
-
the orignal package's first-listed contact.
Parent element
Element detail & attributes (Person)
Attribute name | Required | Data type | PDXpert attribute |
---|---|---|---|
contactName | required | String | Copied from inner PDX package, or originator-provided Person name. |
contactUniqueIdentifier | required | ID | Copied from inner PDX package, or generated value. Example: ID901c8de3-3ea3-4878-82ab-90355d64dce3 |
contactIdentifier | required | String | Copied from inner PDX package, or copied from contactUniqueIdentifier |
contactStatus | optional | Enumeration | Active |
emailAddress | optional | String | Copied from inner PDX package, or originator-provided value. |
telephoneNumber | optional | String | Copied from inner PDX package, or originator-provided value. |
facsimileNumber | optional | String | Copied from inner PDX package, or originator-provided value. |
businessName | optional | String | Copied from inner PDX package, or originator-provided Organization name. |
universalResourceIdentifier | optional | UriReference | Copied from inner PDX package, or originator-provided value. |
department | optional | String | Copied from inner PDX package, or originator-provided value. |
globalBusinessIdentifier | optional | String | Copied from inner PDX package, or originator-provided value. |
globalLocationIdentifier | optional | String | Copied from inner PDX package, or originator-provided value. |
postOfficeBoxIdentifier | optional | String | Copied from inner PDX package, or originator-provided value. |
addressLine1 | optional | String | Copied from inner PDX package, or originator-provided value. |
addressLine2 | optional | String | Copied from inner PDX package, or originator-provided value. |
addressLine3 | optional | String | Copied from inner PDX package, or originator-provided value. |
cityName | optional | String | Copied from inner PDX package, or originator-provided value. |
regionName | optional | String | Copied from inner PDX package, or originator-provided value. |
nationalPostalCode | optional | String | Copied from inner PDX package, or originator-provided value. |
globalCountryCode | optional | String | Copied from inner PDX package, or originator-provided value. |
isTopLevel | optional | Enumeration | Copied from inner PDX package, or Yes when contact is specified by outer originator |
globalPartnerClassificationCode | optional | Enumeration | Copied from inner PDX package, or originator-provided value. |
globalPartnerClassificationCodeOther | optional | String | Copied from inner PDX package, or originator-provided value. |
globalPartnerSubClassificationCode | optional | String | Copied from inner PDX package, or originator-provided value. |
Child elements
(none)
WinZip® is a registered trademark of Corel Corporation.
This application note was relevant to the PDXpert software release that was current at time of publication. Product changes since that time may affect its utility. We'd be happy to assist you in assessing the applicability of this note to your situation.
Working within PDXpert
- Designing an engineering change process and workflow
- Server: Fast file content searches using IFilters
- Server: Scheduled backup for the database and library
- Server: Running several PDXpert Application Servers on the same network
- Batch Import: Preparing file attachments for import
- Batch Import: Converting a PDX package for PDXpert
- Batch Import: Keep settings, remove test item records
- Batch Import: Creating release sets for imported data
- Batch Import: Bulk replacing item attributes
- PDX package: Compare all product data, not just the BOM
- PDX package: IPC-2570 package implementation
- PDX package: IPC-2570 security signing and password extensions
- Adding a custom SQL Server report to PDXpert
- Adding a custom SQL Server report to PDXpert 8.0 to 11.2
- Designing email notice templates
- Including labor time and cost in assemblies
- Materials management for regulatory compliance
- Switching an existing item to a different type
- What's the difference between Item Revision State and Item Lifecycle Phase?
- Copying an assembly BOM to another assembly
- PDXpert permissions: User access design
Working with other software applications
- Using Altium Designer EDA software with the PDXpert client
- Using Altium Designer EDA software with the PDXpert server
- Using Cadence OrCAD Capture CIS with the PDXpert client
- Using Cadence OrCAD Capture CIS with the PDXpert server
- Using Pulsonix EDA software with the PDXpert server
- Importing a CAD bill of materials into PDXpert PLM software
- MRP/ERP data transfer options with PDXpert PLM software
- Exporting PDXpert PLM parts, BOM & sources to MRP/ERP
- Importing Trilogy Design Parts&Vendors data into PDXpert
- Exporting a bill of materials from PDXpert to Visio