in TPM Parser/Tpm2Lib/CryptoSymm.cs [59:114]
public static SymmCipher Create(SymDefObject symDef = null, byte[] keyData = null, byte[] iv = null)
{
if (symDef == null)
{
symDef = new SymDefObject(TpmAlgId.Aes, 128, TpmAlgId.Cfb);
}
string algName = "";
switch (symDef.Algorithm)
{
case TpmAlgId.Aes:
switch (symDef.Mode)
{
case TpmAlgId.Cbc:
algName = SymmetricAlgorithmNames.AesCbc;
break;
case TpmAlgId.Ecb:
algName = SymmetricAlgorithmNames.AesEcb;
break;
case TpmAlgId.Cfb:
algName = SymmetricAlgorithmNames.AesCbcPkcs7;
break;
default:
Globs.Throw<ArgumentException>("Unsupported mode (" + symDef.Mode + ") for algorithm " + symDef.Algorithm);
break;
}
break;
case TpmAlgId.Tdes:
switch (symDef.Mode)
{
case TpmAlgId.Cbc:
algName = SymmetricAlgorithmNames.TripleDesCbc;
break;
case TpmAlgId.Ecb:
algName = SymmetricAlgorithmNames.TripleDesEcb;
break;
default:
Globs.Throw<ArgumentException>("Unsupported mode (" + symDef.Mode + ") for algorithm " + symDef.Algorithm);
break;
}
break;
default:
Globs.Throw<ArgumentException>("Unsupported symmetric algorithm " + symDef.Algorithm);
break;
}
if (keyData == null)
{
keyData = Globs.GetRandomBytes(symDef.KeyBits / 8);
}
SymmetricKeyAlgorithmProvider algProvider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(algName);
var key = algProvider.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(keyData));
return key == null ? null : new SymmCipher(key, keyData, iv);
}