Пример #1
0
        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
Пример #2
0
        /// <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();
        }