Two extensions change how a package is organised rather than what shapes it holds: the Production extension, which slicers such as PrusaSlicer and Bambu Studio use to split objects into separate model files and identify them, and the Secure Content extension, which encrypts parts.
Production extension
Version 1.2. Namespace
http://schemas.microsoft.com/3dmanufacturing/production/2015/06
(prefix p); alternatives use
http://schemas.microsoft.com/3dmanufacturing/production/alternatives/2021/04
(prefix pa). A package that refers to objects in other model files must
list the extension in requiredextensions. UUIDs are any of the RFC 4122
variants, written in the usual 8-4-4-4-12 hexadecimal form.
Objects in other model files
| On | Attribute | Type | Use | Meaning |
|---|---|---|---|---|
item | p:path | ST_Path | optional | Absolute part name of the model file holding the object; objectid then refers to an object in that file |
component | p:path | ST_Path | optional | The same, for a component; allowed only in the root model file |
- Only the root model file has a build section, so there is at most one level of referenced files and no cycles.
- A referenced object takes all its resources (materials, textures, thumbnails) from its own file.
- Model-level metadata is read only from the root model file.
- The root model is referenced from
/_rels/.rels. The other model files are referenced from the root model’s own relationships part (for/3D/3dmodel.model,/3D/_rels/3dmodel.model.rels) with the 3D model relationship type, never from the package relationships. - A consumer must report an error if a non-root model file has a component with a path.
Identifiers
| On | Attribute | Type | Use | Meaning |
|---|---|---|---|---|
build | p:UUID | ST_UUID | required | Identifies the build over time and across clients and printers |
item | p:UUID | ST_UUID | required | Identifies this part instance across packages |
object | p:UUID | ST_UUID | required | Identifies the object; for an object of components it stands for the assembly |
component | p:UUID | ST_UUID | required | Identifies the component instance |
object | pa:modelresolution | ST_ModelResolution | optional | Intended use of this representation: fullres (default), lowres or obfuscated |
The UUIDs are required when the extension is used.
Alternative representations
An object may hold a pa:alternatives element listing other
representations of itself, for example a low-resolution preview or an encrypted
full model. The consumer picks one it has rights to and whose required extensions
it supports; with ties, the first in document order wins. A printer may refuse a
lowres model.
| pa:alternative attribute | Type | Use | Default | Meaning |
|---|---|---|---|---|
objectid | ST_ResourceID | required | The alternative object | |
UUID | ST_UUID | required | Identifies the alternative | |
path | ST_Path | optional | Model file holding it | |
modelresolution | ST_ModelResolution | optional | fullres | fullres, lowres or obfuscated |
<build p:UUID="e9ad5ea8-7e8b-4a5a-9e1b-4f1d2c7a3b10">
<item objectid="1" p:path="/3D/Objects/part.model"
p:UUID="0b5c3c34-1f2a-4d65-8a6e-3e3f0a9c4d21"
transform="1 0 0 0 1 0 0 0 1 20 20 0"/>
</build>
Secure Content extension
Version 1.0.3. Namespace
http://schemas.microsoft.com/3dmanufacturing/securecontent/2019/04.
Parts are encrypted with a content encryption key (CEK), and each CEK may be
wrapped with one or more key encryption keys (KEK), one per authorised consumer.
Encrypted parts keep their names and relationships, and are marked with an
Encrypted File relationship from the part that refers to them (otherwise from the
package). The keys and parameters sit in a key store part, usually
/Secure/keystore.xml, referenced from the package relationships with
the key store type and, so that editors keep it, a MustPreserve relationship.
| Element | Attribute or content | Use | Meaning |
|---|---|---|---|
keystore | UUID | required | Identifies the key store; holds consumer and resourcedatagroup elements |
consumer | consumerid | required | Identifier of a target consumer |
keyid | optional | Identifier of the consumer’s key | |
keyvalue | text | optional | The consumer’s public key in PEM form (RFC 7468) |
resourcedatagroup | keyuuid | required | UUID of the CEK shared by the resources in the group |
accessright | consumerindex | required | Index of the consumer whose key unwraps the CEK |
kekparams | wrappingalgorithm | required | Key wrapping algorithm URI |
mgfalgorithm | optional | Mask generation function URI | |
digestmethod | optional | Message digest URI (default SHA-1) | |
cipherdata | xenc:CipherValue | required | Base64 of the wrapped CEK |
resourcedata | path | required | Part name of an encrypted part |
cekparams | encryptionalgorithm | required | Content encryption algorithm URI |
compression | optional | none (default) or deflate: raw Deflate (RFC 1951) applied before encryption | |
iv, tag, aad | by algorithm | Base64 initialisation vector, authentication tag and additional authenticated data |
| Algorithm | URI |
|---|---|
| AES-256-GCM content encryption (must be supported) | http://www.w3.org/2009/xmlenc11#aes256-gcm |
| RSA-OAEP with MGF1 and SHA-1 (key wrapping) | http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p |
| RSA-OAEP with a chosen MGF (key wrapping) | http://www.w3.org/2009/xmlenc11#rsa-oaep |
| MGF1 with SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 | http://www.w3.org/2009/xmlenc11#mgf1sha1, …#mgf1sha224, …#mgf1sha256, …#mgf1sha384, …#mgf1sha512 |
| SHA-256 digest | http://www.w3.org/2001/04/xmlenc#sha256 |
Consumers must support RSA-2048 OAEP with MGF1 and SHA-1 or SHA-256. With
rsa-oaep-mgf1p the mgfalgorithm must be absent. The key
store content type and relationship types are listed on
Package and parts.