in TSS.CPP/Src/TpmTypes.cpp [597:721]
static void Create(shared_ptr<U>& u, S selector) // S = TPM_ALG_ID | TPM_CAP | TPM_ST
{
size_t unionType = typeid(U).hash_code();
if (unionType == typeid(TPMU_CAPABILITIES).hash_code())
switch (selector) {
case TPM_CAP::ALGS: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_ALG_PROPERTY()); return;
case TPM_CAP::HANDLES: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_HANDLE()); return;
case TPM_CAP::COMMANDS: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_CCA()); return;
case TPM_CAP::PP_COMMANDS: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_CC()); return;
case TPM_CAP::AUDIT_COMMANDS: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_CC()); return;
case TPM_CAP::PCRS: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_PCR_SELECTION()); return;
case TPM_CAP::TPM_PROPERTIES: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_TAGGED_TPM_PROPERTY()); return;
case TPM_CAP::PCR_PROPERTIES: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_TAGGED_PCR_PROPERTY()); return;
case TPM_CAP::ECC_CURVES: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_ECC_CURVE()); return;
case TPM_CAP::AUTH_POLICIES: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_TAGGED_POLICY()); return;
case TPM_CAP::ACT: new (&u) shared_ptr<TPMU_CAPABILITIES>(new TPML_ACT_DATA()); return;
}
else if (unionType == typeid(TPMU_ATTEST).hash_code())
switch (selector) {
case TPM_ST::ATTEST_CERTIFY: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_CERTIFY_INFO()); return;
case TPM_ST::ATTEST_CREATION: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_CREATION_INFO()); return;
case TPM_ST::ATTEST_QUOTE: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_QUOTE_INFO()); return;
case TPM_ST::ATTEST_COMMAND_AUDIT: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_COMMAND_AUDIT_INFO()); return;
case TPM_ST::ATTEST_SESSION_AUDIT: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_SESSION_AUDIT_INFO()); return;
case TPM_ST::ATTEST_TIME: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_TIME_ATTEST_INFO()); return;
case TPM_ST::ATTEST_NV: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_NV_CERTIFY_INFO()); return;
case TPM_ST::ATTEST_NV_DIGEST: new (&u) shared_ptr<TPMU_ATTEST>(new TPMS_NV_DIGEST_CERTIFY_INFO()); return;
}
else if (unionType == typeid(TPMU_SYM_DETAILS).hash_code())
switch (selector) {
case TPM_ALG_ID::TDES: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_TDES_SYM_DETAILS()); return;
case TPM_ALG_ID::AES: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_AES_SYM_DETAILS()); return;
case TPM_ALG_ID::SM4: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_SM4_SYM_DETAILS()); return;
case TPM_ALG_ID::CAMELLIA: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_CAMELLIA_SYM_DETAILS()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_ANY_SYM_DETAILS()); return;
case TPM_ALG_ID::XOR: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_XOR_SYM_DETAILS()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_SYM_DETAILS>(new TPMS_NULL_SYM_DETAILS()); return;
}
else if (unionType == typeid(TPMU_SENSITIVE_CREATE).hash_code())
switch (selector) {
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_SENSITIVE_CREATE>(nullptr); return;
case TPM_ALG_ID::ANY2: new (&u) shared_ptr<TPMU_SENSITIVE_CREATE>(new TPMS_DERIVE()); return;
}
else if (unionType == typeid(TPMU_SCHEME_KEYEDHASH).hash_code())
switch (selector) {
case TPM_ALG_ID::HMAC: new (&u) shared_ptr<TPMU_SCHEME_KEYEDHASH>(new TPMS_SCHEME_HMAC()); return;
case TPM_ALG_ID::XOR: new (&u) shared_ptr<TPMU_SCHEME_KEYEDHASH>(new TPMS_SCHEME_XOR()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_SCHEME_KEYEDHASH>(new TPMS_NULL_SCHEME_KEYEDHASH()); return;
}
else if (unionType == typeid(TPMU_SIG_SCHEME).hash_code())
switch (selector) {
case TPM_ALG_ID::RSASSA: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_RSASSA()); return;
case TPM_ALG_ID::RSAPSS: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_RSAPSS()); return;
case TPM_ALG_ID::ECDSA: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_ECDSA()); return;
case TPM_ALG_ID::ECDAA: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_ECDAA()); return;
case TPM_ALG_ID::SM2: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_SM2()); return;
case TPM_ALG_ID::ECSCHNORR: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SIG_SCHEME_ECSCHNORR()); return;
case TPM_ALG_ID::HMAC: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SCHEME_HMAC()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_SCHEME_HASH()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_SIG_SCHEME>(new TPMS_NULL_SIG_SCHEME()); return;
}
else if (unionType == typeid(TPMU_KDF_SCHEME).hash_code())
switch (selector) {
case TPM_ALG_ID::MGF1: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_KDF_SCHEME_MGF1()); return;
case TPM_ALG_ID::KDF1_SP800_56A: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_KDF_SCHEME_KDF1_SP800_56A()); return;
case TPM_ALG_ID::KDF2: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_KDF_SCHEME_KDF2()); return;
case TPM_ALG_ID::KDF1_SP800_108: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_KDF_SCHEME_KDF1_SP800_108()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_SCHEME_HASH()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_KDF_SCHEME>(new TPMS_NULL_KDF_SCHEME()); return;
}
else if (unionType == typeid(TPMU_ASYM_SCHEME).hash_code())
switch (selector) {
case TPM_ALG_ID::ECDH: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_KEY_SCHEME_ECDH()); return;
case TPM_ALG_ID::ECMQV: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_KEY_SCHEME_ECMQV()); return;
case TPM_ALG_ID::RSASSA: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_RSASSA()); return;
case TPM_ALG_ID::RSAPSS: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_RSAPSS()); return;
case TPM_ALG_ID::ECDSA: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_ECDSA()); return;
case TPM_ALG_ID::ECDAA: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_ECDAA()); return;
case TPM_ALG_ID::SM2: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_SM2()); return;
case TPM_ALG_ID::ECSCHNORR: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SIG_SCHEME_ECSCHNORR()); return;
case TPM_ALG_ID::RSAES: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_ENC_SCHEME_RSAES()); return;
case TPM_ALG_ID::OAEP: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_ENC_SCHEME_OAEP()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_SCHEME_HASH()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_ASYM_SCHEME>(new TPMS_NULL_ASYM_SCHEME()); return;
}
else if (unionType == typeid(TPMU_SIGNATURE).hash_code())
switch (selector) {
case TPM_ALG_ID::RSASSA: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_RSASSA()); return;
case TPM_ALG_ID::RSAPSS: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_RSAPSS()); return;
case TPM_ALG_ID::ECDSA: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_ECDSA()); return;
case TPM_ALG_ID::ECDAA: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_ECDAA()); return;
case TPM_ALG_ID::SM2: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_SM2()); return;
case TPM_ALG_ID::ECSCHNORR: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SIGNATURE_ECSCHNORR()); return;
case TPM_ALG_ID::HMAC: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMT_HA()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_SCHEME_HASH()); return;
case TPM_ALG_ID::_NULL: new (&u) shared_ptr<TPMU_SIGNATURE>(new TPMS_NULL_SIGNATURE()); return;
}
else if (unionType == typeid(TPMU_PUBLIC_ID).hash_code())
switch (selector) {
case TPM_ALG_ID::KEYEDHASH: new (&u) shared_ptr<TPMU_PUBLIC_ID>(new TPM2B_DIGEST_KEYEDHASH()); return;
case TPM_ALG_ID::SYMCIPHER: new (&u) shared_ptr<TPMU_PUBLIC_ID>(new TPM2B_DIGEST_SYMCIPHER()); return;
case TPM_ALG_ID::RSA: new (&u) shared_ptr<TPMU_PUBLIC_ID>(new TPM2B_PUBLIC_KEY_RSA()); return;
case TPM_ALG_ID::ECC: new (&u) shared_ptr<TPMU_PUBLIC_ID>(new TPMS_ECC_POINT()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_PUBLIC_ID>(new TPMS_DERIVE()); return;
}
else if (unionType == typeid(TPMU_PUBLIC_PARMS).hash_code())
switch (selector) {
case TPM_ALG_ID::KEYEDHASH: new (&u) shared_ptr<TPMU_PUBLIC_PARMS>(new TPMS_KEYEDHASH_PARMS()); return;
case TPM_ALG_ID::SYMCIPHER: new (&u) shared_ptr<TPMU_PUBLIC_PARMS>(new TPMS_SYMCIPHER_PARMS()); return;
case TPM_ALG_ID::RSA: new (&u) shared_ptr<TPMU_PUBLIC_PARMS>(new TPMS_RSA_PARMS()); return;
case TPM_ALG_ID::ECC: new (&u) shared_ptr<TPMU_PUBLIC_PARMS>(new TPMS_ECC_PARMS()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_PUBLIC_PARMS>(new TPMS_ASYM_PARMS()); return;
}
else if (unionType == typeid(TPMU_SENSITIVE_COMPOSITE).hash_code())
switch (selector) {
case TPM_ALG_ID::RSA: new (&u) shared_ptr<TPMU_SENSITIVE_COMPOSITE>(new TPM2B_PRIVATE_KEY_RSA()); return;
case TPM_ALG_ID::ECC: new (&u) shared_ptr<TPMU_SENSITIVE_COMPOSITE>(new TPM2B_ECC_PARAMETER()); return;
case TPM_ALG_ID::KEYEDHASH: new (&u) shared_ptr<TPMU_SENSITIVE_COMPOSITE>(new TPM2B_SENSITIVE_DATA()); return;
case TPM_ALG_ID::SYMCIPHER: new (&u) shared_ptr<TPMU_SENSITIVE_COMPOSITE>(new TPM2B_SYM_KEY()); return;
case TPM_ALG_ID::ANY: new (&u) shared_ptr<TPMU_SENSITIVE_COMPOSITE>(new TPM2B_PRIVATE_VENDOR_SPECIFIC()); return;
}
else
throw runtime_error("UnionFactory::Create(): Unknown union type " + string(typeid(U).name()));
throw runtime_error("Unknown selector value" + to_string(selector) + " for union " + string(typeid(U).name()));
} // Create()