Ejemplo n.º 1
0
        // Digital-sign the data on the memory
        public static byte[] SignMemory(byte[] srcData, string comment, bool kernelModeDriver, int cert_id, int sha_mode)
        {
#if     !BU_OSS
            int    i;
            string out_filename = null;
            byte[] ret          = null;

            string in_tmp_filename = Path.Combine(in_dir,
                                                  Str.DateTimeToStrShortWithMilliSecs(DateTime.Now) + "_" +
                                                  Env.MachineName + "_" +
                                                  Secure.Rand63i().ToString() + ".dat");

            IO.SaveFile(in_tmp_filename, srcData);

            for (i = 0; i < NumRetries; i++)
            {
                Sign sign = new Sign();
                sign.Proxy = new WebProxy();

                try
                {
                    out_filename = sign.ExecSignEx(Path.GetFileName(in_tmp_filename),
                                                   kernelModeDriver,
                                                   comment,
                                                   cert_id,
                                                   sha_mode);
                    break;
                }
                catch (Exception ex)
                {
                    if (i != (NumRetries - 1))
                    {
                        Kernel.SleepThread(RetryIntervals);
                    }
                    else
                    {
                        throw ex;
                    }
                }
            }

            for (i = 0; i < NumRetriesForCopy; i++)
            {
                try
                {
                    ret = IO.ReadFile(Path.Combine(out_dir, out_filename));
                }
                catch (Exception ex)
                {
                    if (i != (NumRetriesForCopy - 1))
                    {
                        Kernel.SleepThread(RetryIntervalsForCopy);
                    }
                    else
                    {
                        throw ex;
                    }
                }
            }

            string tmpFileName = IO.CreateTempFileNameByExt(".exe");
            try
            {
                File.Delete(tmpFileName);
            }
            catch
            {
            }
            File.WriteAllBytes(tmpFileName, ret);

            lock (lockObj)
            {
                if (ExeSignChecker.CheckFileDigitalSignature(tmpFileName) == false)
                {
                    throw new ApplicationException("CheckFileDigitalSignature failed.");
                }

                if (kernelModeDriver)
                {
                    if (ExeSignChecker.IsKernelModeSignedFile(tmpFileName) == false)
                    {
                        throw new ApplicationException("IsKernelModeSignedFile failed.");
                    }
                }
            }

            try
            {
            }
            catch
            {
                File.Delete(tmpFileName);
            }

            return(ret);
#else   // BU_OSS
            return(srcData);
#endif  // BU_OSS
        }