Security
Telling a real chip from a software fake.
Attackers try to fake a hardware security chip with software. If it worked, one attacker could look like thousands of real devices. That's the classic sock-puppet problem, where one person quietly runs many fake accounts to look like a crowd. A software fake can call itself anything it likes, but it cannot forge the chip manufacturer's cryptographic signature. That's the line we enforce: no genuine manufacturer signature, no pass.
The bottom line
One check does the real work
A software emulator can wear any label. It still can't produce a certificate that traces back to a real chip maker we trust, so it's rejected before its label ever matters.
Some customers legitimately run in the cloud and want their own cloud devices to count. So we also labelwhat kind of chip we're looking at: a genuine hardware chip, a firmware chip built into the CPU, or a software emulator. Your policy can decide what to accept. But labeling is a convenience, not the defense. The defense is the manufacturer signature: a rogue emulator can name any vendor it wants, yet it can't forge a chain back to a pinned chip-manufacturer root, and that check runs no matter what the chip claims to be. Everything below is how the labeling works, for readers who want the mechanics.
For engineers · signal 1 + 2
TCG manufacturer code, then issuer DN
Every EK certificate the platform produces can carry two pieces of evidence the classifier reads. It does not AND them. It takes the first that yields a class, checking the manufacturer code first and the issuer DN as the fallback:
- TCG manufacturer code (SAN attribute
2.23.133.2.1): a 4-byte ASCII vendor code the TPM asserts about itself. Examples:IFX(Infineon),INTC(Intel PTT),STM(STMicro),MSFT(Microsoft, Pluton or Hyper-V), and so on. Read first. - Issuer DN: what CA signed this cert. Used as the fallback when the manufacturer code is absent or unrecognized: a substring match against known vendor and cloud names (
Infineon,Nuvoton,Pluton,Azure,swtpm, …).
The classifier (TpmClassClassifier.cs) reads the manufacturer code first; if it maps to a known class it returns it, otherwise it falls back to the issuer-DN substring match. So IFX → HardwareDiscreteInfineon and INTC → FirmwareTpmIntelPtt without ever consulting the issuer, while a cert with no recognized manufacturer code is classified purely from who signed it. A couple of codes (MSFT, IBM) are shared across a hardware and a virtual use, so those (and only those) are disambiguated by an additional issuer substring check, described below.
For engineers · taxonomy
The full TpmClass enum
Each class slots into a group. Customer policies pick groups (e.g. ["hardware", "firmware-tpm"]) and the classifier expands them to the specific classes.
hardware
groupDiscrete TPM chips soldered to motherboards. Highest assurance.
HardwareDiscreteInfineon
Infineon OPTIGA RSA / ECC, IFX TPM EK Root CA
HardwareDiscreteStMicro
STMicro ST TPM, GlobalSign Trusted Computing CA
HardwareDiscreteNuvoton
NTC TPM EK Root CA, Nuvoton TPM Root CA 1xxx/2xxx
HardwareDiscreteOther
Vendor unknown but chain validates against a pinned vendor root.
firmware-tpm
groupIn-CPU TPMs. Cannot be swapped without replacing the CPU.
FirmwareTpmIntelPtt
Intel Platform Trust Technology, ODCA-backed.
FirmwareTpmAmdFtpm
AMD fTPM. Voltage-glitch risk on Zen 2/3 (faulTPM).
FirmwareTpmPluton
Microsoft Pluton, post-2022 OEMs.
cloud-vtpm
groupVirtual TPMs running inside cloud hypervisors. Rejected by strict policy; cross-validated under cloud-permissive.
CloudVtpmAwsNitro
AWS NitroTPM. Cross-validate via Nitro doc + EC2 IID.
CloudVtpmAzure
Azure vTPM. Cross-validate via IMDS attested data + DigiCert G2.
CloudVtpmGcp
GCP Shielded VM. Cross-validate via instance-identity JWT.
CloudVtpmHyperV
Generic Hyper-V vTPM (non-Pluton 2014).
emulated
groupSoftware emulators. Always rejected outside dev policy.
EmulatedSwtpm
Userspace swtpm. IBM manufacturer 0x49424D00. Chains to swtpm-localca.
mobile-hardware
groupMobile devices with hardware-backed key attestation.
MobileAndroidStrongbox
StrongBox secure element. attestationSecurityLevel = StrongBox.
MobileAndroidTee
Android TEE-backed attestation.
MobileAppleSecureEnclave
Apple Secure Enclave key attestation.
MobileAppleAppAttest
DCAppAttestService. iOS App Attest.
mobile-software
groupMobile attestation that didn't reach hardware-backing. Reduced assurance.
MobileAndroidSoftware
Android attestationSecurityLevel = Software.
For engineers · the Microsoft ambiguity
Why MSFT can mean Pluton or Hyper-V
Both Pluton firmware TPMs and the Hyper-V vTPM assert the same MSFT manufacturer code, so the code alone can't separate them. The classifier disambiguates with a plain string.Containson the EK cert's issuer DN: if it contains Pluton the device is classified FirmwareTpmPluton; if it contains Host Guardian or vTPM it's CloudVtpmHyperV. An ambiguous Microsoft issuer that matches neither marker defaults to Pluton. This is a substring heuristic, not a chain-depth analysis. The real gate on a Hyper-V vTPM is that the cloud-permissive path demands provider-signed instance-identity cross-validation before it is accepted.
For engineers · swtpm and the IBM code
How the software emulator is actually caught
The swtpm software emulator ships asserting the TCG-allocated IBM manufacturer code (0x49424D00) out of the box, documented in SUSE's virt guide and upstream swtpm sources. Two things follow, and it matters to state them precisely:
- The IBM manufacturer code alone does notmean "virtual." A cert carrying the IBM code whose issuer is not an swtpm CA classifies as
HardwareDiscreteOther, a hardware class. There is no "IBM-is-virtual-by-default" rule and no per-class allow-list override. swtpmis caught by its issuer DN, not its manufacturer code: the classifier matches the issuer substringsswtpm,SW TPM, orSoftware TPMand returnsEmulatedSwtpm. When the IBM manufacturer code is present it is only mapped toEmulatedSwtpmif the issuer also containsswtpm; otherwise it staysHardwareDiscreteOther.
Either way, classification is not the load-bearing defense against a rogue emulator. An swtpm instance can name any issuer it likes, but it cannot forge a chain to a pinned TPM-manufacturer root: EK-certificate chain validation rejects it before its class ever matters. Detecting the swtpm issuer is a fast, honest label layered on top of that cryptographic gate. Never a substitute for it.
For engineers · cloud cross-validation
The honest case for accepting cloud
Some customers legitimately operate in AWS / Azure / GCP and want device identity for their own infrastructure (containers in their own ECS, EKS, AKS, GKE). Strict rejection isn't the right policy for them. Instead, our cloud-permissive policy accepts cloud vTPMs only when they ship a fresh provider-signed instance-identity document binding the attestation to a specific cloud instance.
- AWS Nitro:
NitroAttestationVerifiervalidates the COSE_Sign1/ES384 signature against the pinned AWS Nitro Enclaves Root G1, thenEc2InstanceIdentityVerifierbinds the attestation to a specific EC2 instance via 16 per-region signing certs. - Azure:
AzureAttestedDataVerifiervalidates the PKCS#7 envelope against the pinned DigiCert Global Root G2, then binds via the IMDS attested-data instance identity. - GCP:
GcpInstanceIdentityJwtVerifiervalidates the JWT against Google's live JWKS with audience-as-nonce binding.
A relayed attestation from instance A cannot also produce an IID naming instance B. The relay case closes cryptographically.