void TestRandom(Tpm2 tpm, TestContext testCtx) { // Check that the TPM returns the correct number of random bytes for various lengths testCtx.ReportParams("Test phase: GetRandom"); for (int j = 0; j < TestConfig.NumIters; j++) { int numBytes = Substrate.RandomInt(TpmCfg.MaxDigestSize); byte[] rx = tpm.GetRandom((ushort)numBytes); testCtx.AssertEqual("CorrectNumBytes", rx.Length, numBytes); } // Check that the TPM can accept stir data up to test-defined maximum testCtx.ReportParams("Test phase: StirRandom"); for (int j = 0; j < TestConfig.NumIters; j++) { byte[] toStir = Substrate.RandomBytes(Substrate.RandomInt(TpmCfg.MaxDigestSize)); tpm.StirRandom(toStir); int numBytes = Substrate.RandomInt(TpmCfg.MaxDigestSize); byte[] rx = tpm.GetRandom((ushort)numBytes); testCtx.AssertEqual("CorrectNumBytes.AfterStir", rx.Length, numBytes); } } // TestRandom
/// <summary> /// Executes the GetRandom functionality. After parsing arguments, the function /// connects to the selected TPM device and invokes the GetRandom command on /// that connection. If the command was successful, the random byte stream /// is displayed. /// </summary> /// <param name="args">Arguments to this program.</param> static void Main(string[] args) { // // Parse the program arguments. If the wrong arguments are given or // are malformed, then instructions for usage are displayed and // the program terminates. // string tpmDeviceName; ushort bytesRequested; if (!ParseArguments(args, out tpmDeviceName, out bytesRequested)) { WriteUsage(); return; } try { // // Create the device according to the selected connection. // Tpm2Device tpmDevice; switch (tpmDeviceName) { case DeviceSimulator: tpmDevice = new TcpTpmDevice(DefaultSimulatorName, DefaultSimulatorPort); break; case DeviceWinTbs: tpmDevice = new TbsDevice(); break; default: throw new Exception("Unknown device selected."); } // // Connect to the TPM device. This function actually establishes the // connection. // tpmDevice.Connect(); // // Pass the device object used for communication to the TPM 2.0 object // which provides the command interface. // var tpm = new Tpm2(tpmDevice); if (tpmDevice is TcpTpmDevice) { // // If we are using the simulator, we have to do a few things the // firmware would usually do. These actions have to occur after // the connection has been established. // tpmDevice.PowerCycle(); tpm.Startup(Su.Clear); } // // Execute the TPM2_GetRandom command. The function takes the requested // number of bytes as input and returns the random bytes generated by // the TPM. // byte[] randomBytes = tpm.GetRandom(bytesRequested); // // Output the generated random byte string to the console. // WriteBytes(randomBytes); // // Clean up. // tpm.Dispose(); } catch (Exception e) { Console.WriteLine("Exception occurred: {0}", e.Message); } Console.WriteLine("Press Any Key to continue."); Console.ReadLine(); }